MCPcopy
hub / github.com/ContainerSSH/ContainerSSH / RunWithLifecycle

Method RunWithLifecycle

internal/sshserver/serverImpl.go:50–114  ·  view source on GitHub ↗
(lifecycle service.Lifecycle)

Source from the content-addressed store, hash-verified

48}
49
50func (s *serverImpl) RunWithLifecycle(lifecycle service.Lifecycle) error {
51 s.lock.Lock()
52 alreadyRunning := false
53 if s.listenSocket != nil {
54 alreadyRunning = true
55 } else {
56 s.clientSockets = make(map[*ssh.ServerConn]bool)
57 s.connMap = make(map[string]connection)
58 }
59 s.shuttingDown = false
60 if alreadyRunning {
61 s.lock.Unlock()
62 return messageCodes.NewMessage(messageCodes.ESSHAlreadyRunning, "SSH server is already running")
63 }
64
65 listenConfig := net.ListenConfig{
66 Control: s.socketControl,
67 }
68
69 netListener, err := listenConfig.Listen(lifecycle.Context(), "tcp", s.cfg.Listen)
70 if err != nil {
71 s.lock.Unlock()
72 return messageCodes.Wrap(err, messageCodes.ESSHStartFailed, "failed to start SSH server on %s", s.cfg.Listen)
73 }
74 s.listenSocket = netListener
75 s.lock.Unlock()
76 if err := s.handler.OnReady(); err != nil {
77 if err := netListener.Close(); err != nil {
78 s.logger.Warning(
79 messageCodes.Wrap(
80 err,
81 messageCodes.ESSHListenCloseFailed,
82 "failed to close listen socket after failed startup",
83 ),
84 )
85 }
86 return err
87 }
88 lifecycle.Running()
89 s.logger.Info(messageCodes.NewMessage(messageCodes.MSSHServiceAvailable, "SSH server running on %s", s.cfg.Listen))
90
91 go s.handleListenSocketOnShutdown(lifecycle)
92 for {
93 tcpConn, err := netListener.Accept()
94 if err != nil {
95 // Assume listen socket closed
96 break
97 }
98 s.wg.Add(1)
99 go s.handleConnection(tcpConn)
100 }
101 lifecycle.Stopping()
102 s.shuttingDown = true
103 allClientsExited := make(chan struct{})
104 shutdownHandlerExited := make(chan struct{}, 1)
105 go s.shutdownHandlers.Shutdown(lifecycle.ShutdownContext())
106 go s.disconnectClients(lifecycle, allClientsExited)
107 go s.shutdownHandler(lifecycle, shutdownHandlerExited)

Callers

nothing calls this directly

Calls 15

handleConnectionMethod · 0.95
disconnectClientsMethod · 0.95
shutdownHandlerMethod · 0.95
AcceptMethod · 0.80
ContextMethod · 0.65
OnReadyMethod · 0.65
CloseMethod · 0.65
WarningMethod · 0.65
RunningMethod · 0.65
InfoMethod · 0.65
AddMethod · 0.65

Tested by

no test coverage detected