main.go (1514B)
1 package main 2 3 import ( 4 "flag" 5 "fmt" 6 "log" 7 "os" 8 "os/signal" 9 "strings" 10 "syscall" 11 12 "git.server.ky/slackcoder/mirror/internal/service" 13 ) 14 15 // Program version 16 var Version string 17 18 type Flags struct { 19 Config string 20 ConfigDir string 21 Version bool 22 } 23 24 func ParseFlags() *Flags { 25 var flags Flags 26 27 flag.StringVar(&flags.Config, "config", "/etc/mirror/conf.d,/etc/mirror/mirror.toml", "comma separated configuration files or directories") 28 flag.BoolVar(&flags.Version, "version", false, "print version") 29 30 flag.Parse() 31 return &flags 32 } 33 34 func exitOnError(err error) { 35 if err != nil { 36 log.Printf("%s", err) 37 os.Exit(-1) 38 } 39 } 40 41 func splitCommaString(str string) []string { 42 strs := strings.Split(str, ",") 43 44 for i := range strs { 45 strs[i] = strings.TrimSpace(strs[i]) 46 } 47 48 return strs 49 } 50 51 func handleSignal(c <-chan os.Signal, srv *service.Service, flags *Flags) { 52 for v := range c { 53 if v == syscall.SIGHUP { 54 configs := splitCommaString(flags.Config) 55 cfg, err := service.ReadConfig(configs...) 56 if err != nil { 57 srv.Log(err.Error()) 58 continue 59 } 60 61 srv.Reload(cfg) 62 } 63 } 64 } 65 66 func main() { 67 flags := ParseFlags() 68 69 if flags.Version { 70 fmt.Println(Version) 71 72 os.Exit(0) 73 } 74 75 configs := splitCommaString(flags.Config) 76 cfg, err := service.ReadConfig(configs...) 77 exitOnError(err) 78 79 srv, err := service.NewService(cfg) 80 exitOnError(err) 81 82 signalCh := make(chan os.Signal, 1) 83 signal.Notify(signalCh, syscall.SIGHUP) 84 go handleSignal(signalCh, srv, flags) 85 86 err = srv.Run() 87 exitOnError(err) 88 }