ftp.go 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. package ftp
  2. import (
  3. "errors"
  4. "log"
  5. "strconv"
  6. "strings"
  7. "sync"
  8. ftp "github.com/fclairamb/ftpserverlib"
  9. "imuslab.com/arozos/mod/database"
  10. "imuslab.com/arozos/mod/user"
  11. )
  12. //Handler is the handler for the FTP server defined in arozos
  13. type Handler struct {
  14. ServerName string
  15. Port int
  16. ServerRunning bool
  17. UPNPEnabled bool
  18. userHandler *user.UserHandler
  19. server *ftp.FtpServer
  20. }
  21. type mainDriver struct {
  22. setting ftp.Settings
  23. userHandler *user.UserHandler
  24. tmpFolder string
  25. connectedUserList *sync.Map
  26. }
  27. //NewFTPHandler creates a new handler for FTP Server as a wrapper to the ftpserverlib
  28. func NewFTPHandler(userHandler *user.UserHandler, ServerName string, Port int, tmpFolder string, PassiveModeIP string) (*Handler, error) {
  29. //Create table for ftp if it doesn't exists
  30. db := userHandler.GetDatabase()
  31. db.NewTable("ftp")
  32. //Create a new FTP Server instance
  33. server := ftp.NewFtpServer(&mainDriver{
  34. setting: ftp.Settings{
  35. ListenAddr: ":" + strconv.Itoa(Port),
  36. PublicHost: strings.TrimSpace(PassiveModeIP),
  37. PassiveTransferPortRange: &ftp.PortRange{
  38. Start: Port + 1,
  39. End: Port + 2,
  40. },
  41. },
  42. userHandler: userHandler,
  43. tmpFolder: tmpFolder,
  44. connectedUserList: &sync.Map{},
  45. })
  46. return &Handler{
  47. ServerName: ServerName,
  48. Port: Port,
  49. ServerRunning: false,
  50. userHandler: userHandler,
  51. UPNPEnabled: false,
  52. server: server,
  53. }, nil
  54. }
  55. //Update which usergroups can access the file system via ftp server
  56. func UpdateAccessableGroups(database *database.Database, groups []string) {
  57. database.Write("ftp", "groups", groups)
  58. if len(groups) == 0 {
  59. log.Println("Setting no group access to ftp server!")
  60. }
  61. }
  62. //ListenAndServe Start Listen and Serve
  63. func (f *Handler) Start() error {
  64. if f.server != nil {
  65. go func(f *Handler) {
  66. log.Println("FTP Server Started, listening at: " + strconv.Itoa(f.Port))
  67. f.server.ListenAndServe()
  68. }(f)
  69. f.ServerRunning = true
  70. return nil
  71. } else {
  72. return errors.New("FTP server not initiated")
  73. }
  74. }
  75. //Close the FTP Server
  76. func (f *Handler) Close() {
  77. if f.server != nil {
  78. f.server.Stop()
  79. f.ServerRunning = false
  80. }
  81. }