服务器启动自动创建默认配置文件等

This commit is contained in:
Alex Yang
2025-11-27 18:40:11 +08:00
parent 2541996b18
commit 65ff630868
3 changed files with 137 additions and 4 deletions

View File

@@ -44,7 +44,7 @@
"customBlockIP": "", "customBlockIP": "",
"statsFile": "./data/shield_stats.json", "statsFile": "./data/shield_stats.json",
"statsSaveInterval": 60, "statsSaveInterval": 60,
"remoteRulesCacheDir": "./data/remote_rules" "remoteRulesCacheDir": "data/remote_rules"
}, },
"log": { "log": {
"file": "logs/dns-server.log", "file": "logs/dns-server.log",

139
main.go
View File

@@ -6,6 +6,7 @@ import (
"log" "log"
"os" "os"
"os/signal" "os/signal"
"path/filepath"
"syscall" "syscall"
"dns-server/config" "dns-server/config"
@@ -15,6 +16,122 @@ import (
"dns-server/shield" "dns-server/shield"
) )
// createDefaultConfig 创建默认配置文件
func createDefaultConfig(configFile string) error {
// 默认配置内容
defaultConfig := `{
"dns": {
"port": 53,
"upstreamDNS": [
"223.5.5.5:53",
"223.6.6.6:53"
],
"timeout": 5000,
"statsFile": "./data/stats.json",
"saveInterval": 300
},
"http": {
"port": 8080,
"host": "0.0.0.0",
"enableAPI": true
},
"shield": {
"localRulesFile": "data/rules.txt",
"blacklists": [
{
"name": "AdGuard DNS filter",
"url": "https://gitea.amazehome.xyz/AMAZEHOME/hosts-and-filters/raw/branch/main/filter.txt",
"enabled": true
},
{
"name": "Adaway Default Blocklist",
"url": "https://gitea.amazehome.xyz/AMAZEHOME/hosts-and-Filters/raw/branch/main/hosts/adaway.txt",
"enabled": true
},
{
"name": "CHN-anti-AD",
"url": "https://gitea.amazehome.xyz/AMAZEHOME/hosts-and-Filters/raw/branch/main/list/easylist.txt",
"enabled": true
},
{
"name": "My GitHub Rules",
"url": "https://gitea.amazehome.xyz/AMAZEHOME/hosts-and-filters/raw/branch/main/rules/costomize.txt",
"enabled": true
}
],
"updateInterval": 3600,
"hostsFile": "data/hosts.txt",
"blockMethod": "NXDOMAIN",
"customBlockIP": "",
"statsFile": "./data/shield_stats.json",
"statsSaveInterval": 60,
"remoteRulesCacheDir": "./data/remote_rules"
},
"log": {
"file": "logs/dns-server.log",
"level": "debug",
"maxSize": 100,
"maxBackups": 10,
"maxAge": 30
}
}`
// 写入默认配置到文件
return os.WriteFile(configFile, []byte(defaultConfig), 0644)
}
// createRequiredFiles 创建所需的文件和文件夹
func createRequiredFiles(cfg *config.Config) error {
// 创建数据文件夹
dataDir := "./data"
if err := os.MkdirAll(dataDir, 0755); err != nil {
return fmt.Errorf("创建数据文件夹失败: %w", err)
}
// 创建远程规则缓存文件夹
if err := os.MkdirAll(cfg.Shield.RemoteRulesCacheDir, 0755); err != nil {
return fmt.Errorf("创建远程规则缓存文件夹失败: %w", err)
}
// 创建日志文件夹
logDir := filepath.Dir(cfg.Log.File)
if logDir != "." {
if err := os.MkdirAll(logDir, 0755); err != nil {
return fmt.Errorf("创建日志文件夹失败: %w", err)
}
}
// 创建本地规则文件
if _, err := os.Stat(cfg.Shield.LocalRulesFile); os.IsNotExist(err) {
if err := os.WriteFile(cfg.Shield.LocalRulesFile, []byte("# 本地规则文件\n# 格式:域名\n# 例如example.com\n"), 0644); err != nil {
return fmt.Errorf("创建本地规则文件失败: %w", err)
}
}
// 创建Hosts文件
if _, err := os.Stat(cfg.Shield.HostsFile); os.IsNotExist(err) {
if err := os.WriteFile(cfg.Shield.HostsFile, []byte("# Hosts文件\n# 格式IP 域名\n# 例如127.0.0.1 localhost\n"), 0644); err != nil {
return fmt.Errorf("创建Hosts文件失败: %w", err)
}
}
// 创建统计数据文件
if _, err := os.Stat(cfg.DNS.StatsFile); os.IsNotExist(err) {
if err := os.WriteFile(cfg.DNS.StatsFile, []byte("{}"), 0644); err != nil {
return fmt.Errorf("创建统计数据文件失败: %w", err)
}
}
// 创建Shield统计数据文件
if _, err := os.Stat(cfg.Shield.StatsFile); os.IsNotExist(err) {
if err := os.WriteFile(cfg.Shield.StatsFile, []byte("{}"), 0644); err != nil {
return fmt.Errorf("创建Shield统计数据文件失败: %w", err)
}
}
return nil
}
func main() { func main() {
// 命令行参数解析 // 命令行参数解析
var configFile string var configFile string
@@ -32,6 +149,15 @@ func main() {
os.Exit(0) os.Exit(0)
} }
// 检查配置文件是否存在,如果不存在则创建默认配置文件
if _, err := os.Stat(configFile); os.IsNotExist(err) {
log.Printf("配置文件 %s 不存在,正在创建默认配置文件...", configFile)
if err := createDefaultConfig(configFile); err != nil {
log.Fatalf("创建默认配置文件失败: %v", err)
}
log.Printf("默认配置文件 %s 创建成功", configFile)
}
// 初始化配置 // 初始化配置
var cfg *config.Config var cfg *config.Config
var err error var err error
@@ -40,6 +166,13 @@ func main() {
log.Fatalf("加载配置失败: %v", err) log.Fatalf("加载配置失败: %v", err)
} }
// 创建所需的文件和文件夹
log.Println("正在创建所需的文件和文件夹...")
if err := createRequiredFiles(cfg); err != nil {
log.Fatalf("创建所需文件和文件夹失败: %v", err)
}
log.Println("所需文件和文件夹创建成功")
// 初始化日志系统 // 初始化日志系统
if err := logger.InitLogger(cfg.Log.File, cfg.Log.Level, 0, 0, 0); err != nil { if err := logger.InitLogger(cfg.Log.File, cfg.Log.Level, 0, 0, 0); err != nil {
log.Fatalf("初始化日志系统失败: %v", err) log.Fatalf("初始化日志系统失败: %v", err)
@@ -99,7 +232,7 @@ func daemonize() error {
return fmt.Errorf("打开/dev/null失败: %w", err) return fmt.Errorf("打开/dev/null失败: %w", err)
} }
defer nullFile.Close() defer nullFile.Close()
// 重定向文件描述符 // 重定向文件描述符
err = syscall.Dup2(int(nullFile.Fd()), int(os.Stdin.Fd())) err = syscall.Dup2(int(nullFile.Fd()), int(os.Stdin.Fd()))
if err != nil { if err != nil {
@@ -113,13 +246,13 @@ func daemonize() error {
if err != nil { if err != nil {
return fmt.Errorf("重定向stderr失败: %w", err) return fmt.Errorf("重定向stderr失败: %w", err)
} }
// 2. 创建新的会话和进程组 // 2. 创建新的会话和进程组
_, err = syscall.Setsid() _, err = syscall.Setsid()
if err != nil { if err != nil {
return fmt.Errorf("创建新会话失败: %w", err) return fmt.Errorf("创建新会话失败: %w", err)
} }
fmt.Println("守护进程已启动") fmt.Println("守护进程已启动")
return nil return nil
} }

Binary file not shown.