a recursive dns resolver
1package main 2 3import ( 4 "log" 5 "log/slog" 6 "os" 7 "flag" 8 9 "code.kiri.systems/kiri/alky/pkg/config" 10 "code.kiri.systems/kiri/alky/pkg/dns" 11 "code.kiri.systems/kiri/alky/pkg/rootservers" 12) 13 14var configFlag string 15 16func init() { 17 flag.StringVar(&configFlag, "config", "/etc/alky/alky.toml", "config file path for alky") 18 19 flag.Parse() 20} 21 22func main() { 23 cfg, err := config.LoadConfig(configFlag) 24 if err != nil { 25 log.Fatal(err) 26 } 27 28 rootServers, err := rootservers.DecodeRootHints(cfg.Server.RootHintsFile) 29 if err != nil { 30 log.Fatal(err) 31 } 32 33 var logger *slog.Logger 34 switch cfg.Logging.Output { 35 case "file": 36 f, err := os.OpenFile(cfg.Logging.FilePath, os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0o644) 37 if err != nil { 38 log.Fatal(err) 39 } 40 41 logger = slog.New(slog.NewJSONHandler(f, nil)) 42 case "stdout": 43 fallthrough 44 default: 45 logger = slog.New(slog.NewJSONHandler(os.Stdout, nil)) 46 } 47 48 s := dns.Server{ 49 Address: cfg.Server.Address, 50 Port: cfg.Server.Port, 51 Timeout: cfg.Advanced.QueryTimeout, 52 RootServers: rootServers, 53 54 Logger: logger, 55 } 56 57 go s.TCPListenAndServe() 58 go s.UDPListenAndServe() 59 60 for { 61 } 62}