main.go 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. package main
  2. import (
  3. "flag"
  4. "fmt"
  5. "log"
  6. "os"
  7. "os/signal"
  8. "runtime"
  9. "syscall"
  10. "ftp-server/config"
  11. ftpserver "ftp-server/ftp"
  12. httpfileserver "ftp-server/httpfile"
  13. webserver "ftp-server/web"
  14. )
  15. func main() {
  16. configPath := flag.String("config", "config.json", "配置文件路径")
  17. flag.Parse()
  18. // Load configuration
  19. cfg, err := config.Load(*configPath)
  20. if err != nil {
  21. log.Fatalf("Failed to load config: %v", err)
  22. }
  23. fmt.Println("======================================")
  24. fmt.Println(" FTP Server (Cross-Platform)")
  25. fmt.Println("======================================")
  26. fmt.Printf("OS/Arch: %s/%s\n", runtime.GOOS, runtime.GOARCH)
  27. fmt.Printf("FTP Port: %d\n", cfg.FTP.Port)
  28. fmt.Printf("Web Admin: http://127.0.0.1:%d\n", cfg.Web.Port)
  29. if cfg.HTTPFile.Enable {
  30. fmt.Printf("HTTP Files: http://127.0.0.1:%d\n", cfg.HTTPFile.Port)
  31. }
  32. fmt.Printf("Admin User: %s\n", cfg.Admin.Username)
  33. fmt.Printf("Root Dir: %s\n", cfg.FTP.RootDir)
  34. fmt.Println("======================================")
  35. // Ensure root directory exists
  36. if err := os.MkdirAll(cfg.FTP.RootDir, 0755); err != nil {
  37. log.Fatalf("Failed to create root directory: %v", err)
  38. }
  39. // Start FTP server
  40. ftpSrv := ftpserver.NewServer(cfg, *configPath)
  41. if err := ftpSrv.Start(); err != nil {
  42. log.Fatalf("Failed to start FTP server: %v", err)
  43. }
  44. // Start Web admin server
  45. webSrv := webserver.NewServer(cfg, *configPath)
  46. go func() {
  47. if err := webSrv.Start(); err != nil {
  48. log.Fatalf("Failed to start web server: %v", err)
  49. }
  50. }()
  51. // Start HTTP file server
  52. if cfg.HTTPFile.Enable {
  53. fileSrv := httpfileserver.NewServer(cfg)
  54. go func() {
  55. if err := fileSrv.Start(); err != nil {
  56. log.Fatalf("Failed to start HTTP file server: %v", err)
  57. }
  58. }()
  59. }
  60. // Wait for termination signal
  61. sigChan := make(chan os.Signal, 1)
  62. signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM)
  63. sig := <-sigChan
  64. fmt.Printf("\nReceived signal %v, shutting down...\n", sig)
  65. ftpSrv.Stop()
  66. fmt.Println("FTP Server stopped.")
  67. }