package server import ( "context" "errors" "sync" "github.com/Neur0toxine/sshpoke/internal/config" "github.com/Neur0toxine/sshpoke/internal/logger" "github.com/Neur0toxine/sshpoke/internal/model" "github.com/Neur0toxine/sshpoke/internal/server/driver" "github.com/Neur0toxine/sshpoke/internal/server/driver/iface" "github.com/Neur0toxine/sshpoke/internal/server/driver/plugin" ) type Manager struct { rw sync.RWMutex servers map[string]iface.Driver defaultServer string } var DefaultManager *Manager var ( ErrNoServer = errors.New("server is not specified") ErrNoSuchServer = errors.New("server does not exist") ) func NewManager(ctx context.Context, servers []config.Server, defaultServer string) *Manager { m := &Manager{ servers: make(map[string]iface.Driver), defaultServer: defaultServer, } for _, serverConfig := range servers { server, err := driver.New(ctx, serverConfig.Name, serverConfig.Driver, serverConfig.Params) if err != nil { logger.Sugar.Errorf("cannot initialize server '%s': %s", serverConfig.Name, err) continue } m.servers[serverConfig.Name] = server } return m } func (m *Manager) ProcessEvent(event model.Event) error { serverName := event.Container.Server if serverName == "" { serverName = m.defaultServer } if serverName == "" { return ErrNoServer } defer m.rw.RUnlock() m.rw.RLock() srv, ok := m.servers[event.Container.Server] if !ok { return ErrNoSuchServer } return srv.Handle(event) } func (m *Manager) PluginByToken(token string) *plugin.Plugin { defer m.rw.RUnlock() m.rw.RLock() for _, srv := range m.servers { if srv.Driver() != config.DriverPlugin { continue } pl := srv.(*plugin.Plugin) if pl.Token() != token { continue } return pl } return nil } func (m *Manager) WaitForShutdown() { defer m.rw.RUnlock() m.rw.RLock() for _, srv := range m.servers { srv.WaitForShutdown() } return }