main.go 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. // Full featured and highly configurable SFTP server.
  2. // For more details about features, installation, configuration and usage please refer to the README inside the source tree:
  3. // https://github.com/drakkan/sftpgo/blob/master/README.md
  4. package main // import "github.com/drakkan/sftpgo"
  5. import (
  6. "flag"
  7. "fmt"
  8. "net/http"
  9. "os"
  10. "path/filepath"
  11. "time"
  12. _ "github.com/go-sql-driver/mysql"
  13. _ "github.com/lib/pq"
  14. _ "github.com/mattn/go-sqlite3"
  15. "github.com/drakkan/sftpgo/api"
  16. "github.com/drakkan/sftpgo/config"
  17. "github.com/drakkan/sftpgo/dataprovider"
  18. "github.com/drakkan/sftpgo/logger"
  19. "github.com/drakkan/sftpgo/sftpd"
  20. "github.com/rs/zerolog"
  21. )
  22. func main() {
  23. confName := "sftpgo.conf"
  24. logSender := "main"
  25. var (
  26. configDir string
  27. logFilePath string
  28. logMaxSize int
  29. logMaxBackups int
  30. logMaxAge int
  31. logCompress bool
  32. logVerbose bool
  33. )
  34. flag.StringVar(&configDir, "config-dir", ".", "Location for SFTPGo config dir. It must contain sftpgo.conf, "+
  35. "the private key for the SFTP server (id_rsa file) and the SQLite database if you use SQLite as data provider. "+
  36. "The server private key will be autogenerated if the user that executes SFTPGo has write access to the config-dir")
  37. flag.StringVar(&logFilePath, "log-file-path", "sftpgo.log", "Location for the log file")
  38. flag.IntVar(&logMaxSize, "log-max-size", 10, "Maximum size in megabytes of the log file before it gets rotated.")
  39. flag.IntVar(&logMaxBackups, "log-max-backups", 5, "Maximum number of old log files to retain")
  40. flag.IntVar(&logMaxAge, "log-max-age", 28, "Maximum number of days to retain old log files")
  41. flag.BoolVar(&logCompress, "log-compress", false, "Determine if the rotated log files should be compressed using gzip")
  42. flag.BoolVar(&logVerbose, "log-verbose", true, "Enable verbose logs")
  43. flag.Parse()
  44. configFilePath := filepath.Join(configDir, confName)
  45. logLevel := zerolog.DebugLevel
  46. if !logVerbose {
  47. logLevel = zerolog.InfoLevel
  48. }
  49. logger.InitLogger(logFilePath, logMaxSize, logMaxBackups, logMaxAge, logCompress, logLevel)
  50. logger.Info(logSender, "starting SFTPGo, config dir: %v", configDir)
  51. config.LoadConfig(configFilePath)
  52. providerConf := config.GetProviderConf()
  53. err := dataprovider.Initialize(providerConf, configDir)
  54. if err != nil {
  55. logger.Error(logSender, "error initializing data provider: %v", err)
  56. logger.ErrorToConsole("error initializing data provider: %v", err)
  57. os.Exit(1)
  58. }
  59. dataProvider := dataprovider.GetProvider()
  60. sftpdConf := config.GetSFTPDConfig()
  61. httpdConf := config.GetHTTPDConfig()
  62. sftpd.SetDataProvider(dataProvider)
  63. shutdown := make(chan bool)
  64. go func() {
  65. logger.Debug(logSender, "initializing SFTP server with config %+v", sftpdConf)
  66. if err := sftpdConf.Initialize(configDir); err != nil {
  67. logger.Error(logSender, "could not start SFTP server: %v", err)
  68. logger.ErrorToConsole("could not start SFTP server: %v", err)
  69. }
  70. shutdown <- true
  71. }()
  72. if httpdConf.BindPort > 0 {
  73. router := api.GetHTTPRouter()
  74. api.SetDataProvider(dataProvider)
  75. go func() {
  76. logger.Debug(logSender, "initializing HTTP server with config %+v", httpdConf)
  77. s := &http.Server{
  78. Addr: fmt.Sprintf("%s:%d", httpdConf.BindAddress, httpdConf.BindPort),
  79. Handler: router,
  80. ReadTimeout: 300 * time.Second,
  81. WriteTimeout: 300 * time.Second,
  82. MaxHeaderBytes: 1 << 20, // 1MB
  83. }
  84. if err := s.ListenAndServe(); err != nil {
  85. logger.Error(logSender, "could not start HTTP server: %v", err)
  86. logger.ErrorToConsole("could not start HTTP server: %v", err)
  87. }
  88. shutdown <- true
  89. }()
  90. } else {
  91. logger.Debug(logSender, "HTTP server not started, disabled in config file")
  92. logger.DebugToConsole("HTTP server not started, disabled in config file")
  93. }
  94. <-shutdown
  95. }