85 lines
1.9 KiB
Go
85 lines
1.9 KiB
Go
|
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
|
||
|
}
|