aboutsummaryrefslogtreecommitdiff
path: root/cmd/mirror/main.go
blob: 4c551f084d965695f3bc1b649b3b46d955cf00a0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
package main

import (
	"flag"
	"fmt"
	"log"
	"os"
	"os/signal"
	"strings"
	"syscall"

	"git.server.ky/slackcoder/mirror/internal/service"
)

// Program version
var Version string

type Flags struct {
	Config    string
	ConfigDir string
	Version   bool
}

func ParseFlags() *Flags {
	var flags Flags

	flag.StringVar(&flags.Config, "config", "/etc/mirror/conf.d,/etc/mirror/mirror.toml", "comma separated configuration files or directories")
	flag.BoolVar(&flags.Version, "version", false, "print version")

	flag.Parse()
	return &flags
}

func exitOnError(err error) {
	if err != nil {
		log.Printf("%s", err)
		os.Exit(-1)
	}
}

func splitCommaString(str string) []string {
	strs := strings.Split(str, ",")

	for i := range strs {
		strs[i] = strings.TrimSpace(strs[i])
	}

	return strs
}

func handleSignal(c <-chan os.Signal, srv *service.Service, flags *Flags) {
	for v := range c {
		if v == syscall.SIGHUP {
			configs := splitCommaString(flags.Config)
			cfg, err := service.ReadConfig(configs...)
			if err != nil {
				srv.Log(err.Error())
				continue
			}

			srv.Reload(cfg)
		}
	}
}

func main() {
	flags := ParseFlags()

	if flags.Version {
		fmt.Println(Version)

		os.Exit(0)
	}

	configs := splitCommaString(flags.Config)
	cfg, err := service.ReadConfig(configs...)
	exitOnError(err)

	srv, err := service.NewService(cfg)
	exitOnError(err)

	signalCh := make(chan os.Signal, 1)
	signal.Notify(signalCh, syscall.SIGHUP)
	go handleSignal(signalCh, srv, flags)

	err = srv.Run()
	exitOnError(err)
}