package main import ( "flag" "fmt" "log" "os" "os/signal" "runtime" "syscall" "ftp-server/config" ftpserver "ftp-server/ftp" httpfileserver "ftp-server/httpfile" webserver "ftp-server/web" ) func main() { configPath := flag.String("config", "config.json", "配置文件路径") flag.Parse() // Load configuration cfg, err := config.Load(*configPath) if err != nil { log.Fatalf("Failed to load config: %v", err) } fmt.Println("======================================") fmt.Println(" FTP Server (Cross-Platform)") fmt.Println("======================================") fmt.Printf("OS/Arch: %s/%s\n", runtime.GOOS, runtime.GOARCH) fmt.Printf("FTP Port: %d\n", cfg.FTP.Port) fmt.Printf("Web Admin: http://127.0.0.1:%d\n", cfg.Web.Port) if cfg.HTTPFile.Enable { fmt.Printf("HTTP Files: http://127.0.0.1:%d\n", cfg.HTTPFile.Port) } fmt.Printf("Admin User: %s\n", cfg.Admin.Username) fmt.Printf("Root Dir: %s\n", cfg.FTP.RootDir) fmt.Println("======================================") // Ensure root directory exists if err := os.MkdirAll(cfg.FTP.RootDir, 0755); err != nil { log.Fatalf("Failed to create root directory: %v", err) } // Start FTP server ftpSrv := ftpserver.NewServer(cfg, *configPath) if err := ftpSrv.Start(); err != nil { log.Fatalf("Failed to start FTP server: %v", err) } // Start Web admin server webSrv := webserver.NewServer(cfg, *configPath) go func() { if err := webSrv.Start(); err != nil { log.Fatalf("Failed to start web server: %v", err) } }() // Start HTTP file server if cfg.HTTPFile.Enable { fileSrv := httpfileserver.NewServer(cfg) go func() { if err := fileSrv.Start(); err != nil { log.Fatalf("Failed to start HTTP file server: %v", err) } }() } // Wait for termination signal sigChan := make(chan os.Signal, 1) signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM) sig := <-sigChan fmt.Printf("\nReceived signal %v, shutting down...\n", sig) ftpSrv.Stop() fmt.Println("FTP Server stopped.") }