sftpserv.go 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. package sftpserv
  2. import (
  3. "strconv"
  4. "imuslab.com/arozos/mod/database"
  5. "imuslab.com/arozos/mod/fileservers"
  6. "imuslab.com/arozos/mod/info/logger"
  7. "imuslab.com/arozos/mod/storage/sftpserver"
  8. user "imuslab.com/arozos/mod/user"
  9. )
  10. type ManagerOption struct {
  11. UserManager *user.UserHandler
  12. KeyFile string
  13. Logger *logger.Logger
  14. Sysdb *database.Database
  15. }
  16. type Manager struct {
  17. Enabled bool
  18. listeningPort int
  19. instance *sftpserver.Instance
  20. option *ManagerOption
  21. config *sftpserver.SFTPConfig
  22. }
  23. func NewSFTPServer(option *ManagerOption) *Manager {
  24. option.Sysdb.NewTable("sftp")
  25. i, lp, err := newSFTPServerInstance(option.KeyFile, option.Sysdb, option.UserManager)
  26. return &Manager{
  27. Enabled: err != nil,
  28. listeningPort: lp,
  29. instance: i,
  30. option: option,
  31. }
  32. }
  33. func newSFTPServerInstance(keyfile string, sysdb *database.Database, userManager *user.UserHandler) (*sftpserver.Instance, int, error) {
  34. //Load default port from database
  35. defaultListeningPort := 2022
  36. if sysdb.KeyExists("sftp", "port") {
  37. sysdb.Read("sftp", "port", &defaultListeningPort)
  38. }
  39. //Create an SFTP Server
  40. var currentConfig = sftpserver.SFTPConfig{
  41. ListeningIP: "0.0.0.0:" + strconv.Itoa(defaultListeningPort),
  42. KeyFile: keyfile,
  43. UserManager: userManager,
  44. }
  45. i, err := sftpserver.NewSFTPServer(&currentConfig)
  46. return i, defaultListeningPort, err
  47. }
  48. /*
  49. Handlers for handling config change
  50. */
  51. //Get or Set listening port for SFTP
  52. func (m *Manager) HandleListeningPort() {
  53. }
  54. /*
  55. Functions requested by the file server service router
  56. */
  57. func (m *Manager) ServerToggle(enabled bool) error {
  58. if m.instance != nil && !enabled {
  59. //Shutdown the running instances
  60. m.instance.Close()
  61. m.instance = nil
  62. } else if m.instance == nil && enabled {
  63. //Startup a new instance
  64. i, lp, err := newSFTPServerInstance(m.option.KeyFile, m.option.Sysdb, m.option.UserManager)
  65. if err != nil {
  66. return err
  67. }
  68. m.listeningPort = lp
  69. m.instance = i
  70. }
  71. return nil
  72. }
  73. func (m *Manager) IsEnabled() bool {
  74. return m.instance != nil && !m.instance.Closed
  75. }
  76. func (m *Manager) GetEndpoints(userinfo *user.User) []*fileservers.Endpoint {
  77. eps := []*fileservers.Endpoint{}
  78. eps = append(eps, &fileservers.Endpoint{
  79. ProtocolName: "sftp://",
  80. Port: m.listeningPort,
  81. Subpath: "",
  82. })
  83. return eps
  84. }