ファイル

79 行
2.0 KiB
Go

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.")
}