123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990 |
- package ftp
- import (
- "errors"
- "log"
- "strconv"
- "strings"
- "sync"
- ftp "github.com/fclairamb/ftpserverlib"
- "imuslab.com/arozos/mod/database"
- "imuslab.com/arozos/mod/user"
- )
- //Handler is the handler for the FTP server defined in arozos
- type Handler struct {
- ServerName string
- Port int
- ServerRunning bool
- UPNPEnabled bool
- userHandler *user.UserHandler
- server *ftp.FtpServer
- }
- type mainDriver struct {
- setting ftp.Settings
- userHandler *user.UserHandler
- tmpFolder string
- connectedUserList *sync.Map
- }
- //NewFTPHandler creates a new handler for FTP Server as a wrapper to the ftpserverlib
- func NewFTPHandler(userHandler *user.UserHandler, ServerName string, Port int, tmpFolder string, PassiveModeIP string) (*Handler, error) {
- //Create table for ftp if it doesn't exists
- db := userHandler.GetDatabase()
- db.NewTable("ftp")
- //Create a new FTP Server instance
- server := ftp.NewFtpServer(&mainDriver{
- setting: ftp.Settings{
- ListenAddr: ":" + strconv.Itoa(Port),
- PublicHost: strings.TrimSpace(PassiveModeIP),
- PassiveTransferPortRange: &ftp.PortRange{
- Start: Port + 1,
- End: Port + 2,
- },
- },
- userHandler: userHandler,
- tmpFolder: tmpFolder,
- connectedUserList: &sync.Map{},
- })
- return &Handler{
- ServerName: ServerName,
- Port: Port,
- ServerRunning: false,
- userHandler: userHandler,
- UPNPEnabled: false,
- server: server,
- }, nil
- }
- //Update which usergroups can access the file system via ftp server
- func UpdateAccessableGroups(database *database.Database, groups []string) {
- database.Write("ftp", "groups", groups)
- if len(groups) == 0 {
- log.Println("Setting no group access to ftp server!")
- }
- }
- //ListenAndServe Start Listen and Serve
- func (f *Handler) Start() error {
- if f.server != nil {
- go func(f *Handler) {
- log.Println("FTP Server Started, listening at: " + strconv.Itoa(f.Port))
- f.server.ListenAndServe()
- }(f)
- f.ServerRunning = true
- return nil
- } else {
- return errors.New("FTP server not initiated")
- }
- }
- //Close the FTP Server
- func (f *Handler) Close() {
- if f.server != nil {
- f.server.Stop()
- f.ServerRunning = false
- }
- }
|