package main import ( "flag" "fmt" "log" "os" "os/signal" "syscall" "dns-server/config" "dns-server/dns" "dns-server/http" "dns-server/logger" "dns-server/shield" ) func main() { // 解析命令行参数 configPath := flag.String("config", "config.json", "配置文件路径") flag.Parse() // 初始化配置 cfg, err := config.LoadConfig(*configPath) if err != nil { log.Fatalf("加载配置失败: %v", err) } // 初始化日志系统 if err := logger.InitLogger(cfg.Log.File, cfg.Log.Level, 0, 0, 0); err != nil { log.Fatalf("初始化日志系统失败: %v", err) } defer logger.Close() // 初始化屏蔽管理系统 shieldManager := shield.NewShieldManager(&cfg.Shield) if err := shieldManager.LoadRules(); err != nil { logger.Error("加载屏蔽规则失败", "error", err) } // 启动DNS服务器 dnsServer := dns.NewServer(&cfg.DNS, &cfg.Shield, shieldManager) go func() { if err := dnsServer.Start(); err != nil { logger.Error("DNS服务器启动失败", "error", err) os.Exit(1) } }() // 启动HTTP控制台服务器 httpServer := http.NewServer(cfg, dnsServer, shieldManager) go func() { if err := httpServer.Start(); err != nil { logger.Error("HTTP控制台服务器启动失败", "error", err) } }() // 启动定时更新任务 go shieldManager.StartAutoUpdate() logger.Info(fmt.Sprintf("DNS服务器已启动,监听端口: %d", cfg.DNS.Port)) logger.Info(fmt.Sprintf("HTTP控制台已启动,监听端口: %d", cfg.HTTP.Port)) // 等待退出信号 sigChan := make(chan os.Signal, 1) signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM) <-sigChan logger.Info("正在关闭服务...") dnsServer.Stop() httpServer.Stop() shieldManager.StopAutoUpdate() logger.Info("所有服务已关闭") }