mirror

Mirror free and open-source projects you like with minimal effort
git clone git://git.server.ky/slackcoder/mirror
Log | Files | Refs | README

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 }