package sftpserv import ( "strconv" "imuslab.com/arozos/mod/database" "imuslab.com/arozos/mod/fileservers" "imuslab.com/arozos/mod/info/logger" "imuslab.com/arozos/mod/storage/sftpserver" user "imuslab.com/arozos/mod/user" ) type ManagerOption struct { UserManager *user.UserHandler KeyFile string Logger *logger.Logger Sysdb *database.Database } type Manager struct { Enabled bool listeningPort int instance *sftpserver.Instance option *ManagerOption config *sftpserver.SFTPConfig } func NewSFTPServer(option *ManagerOption) *Manager { option.Sysdb.NewTable("sftp") i, lp, err := newSFTPServerInstance(option.KeyFile, option.Sysdb, option.UserManager) return &Manager{ Enabled: err != nil, listeningPort: lp, instance: i, option: option, } } func newSFTPServerInstance(keyfile string, sysdb *database.Database, userManager *user.UserHandler) (*sftpserver.Instance, int, error) { //Load default port from database defaultListeningPort := 2022 if sysdb.KeyExists("sftp", "port") { sysdb.Read("sftp", "port", &defaultListeningPort) } //Create an SFTP Server var currentConfig = sftpserver.SFTPConfig{ ListeningIP: "0.0.0.0:" + strconv.Itoa(defaultListeningPort), KeyFile: keyfile, UserManager: userManager, } i, err := sftpserver.NewSFTPServer(¤tConfig) return i, defaultListeningPort, err } /* Handlers for handling config change */ //Get or Set listening port for SFTP func (m *Manager) HandleListeningPort() { } /* Functions requested by the file server service router */ func (m *Manager) ServerToggle(enabled bool) error { if m.instance != nil && !enabled { //Shutdown the running instances m.instance.Close() m.instance = nil } else if m.instance == nil && enabled { //Startup a new instance i, lp, err := newSFTPServerInstance(m.option.KeyFile, m.option.Sysdb, m.option.UserManager) if err != nil { return err } m.listeningPort = lp m.instance = i } return nil } func (m *Manager) IsEnabled() bool { return m.instance != nil && !m.instance.Closed } func (m *Manager) GetEndpoints(userinfo *user.User) []*fileservers.Endpoint { eps := []*fileservers.Endpoint{} eps = append(eps, &fileservers.Endpoint{ ProtocolName: "sftp://", Port: m.listeningPort, Subpath: "", }) return eps }