pupirka
/
main.go
169 строк · 4.6 Кб
1package main
2
3import (
4"fmt"
5"github.com/juju/fslock"
6"github.com/sirupsen/logrus"
7"github.com/spf13/viper"
8"gopkg.in/natefinch/lumberjack.v2"
9"log"
10"os"
11"os/exec"
12"runtime"
13"strings"
14"time"
15)
16
17var ConfigV = viper.New()
18var DeviceFiles []string
19var LogGlobal = logrus.New()
20var LogConsole = logrus.New()
21
22func init() {
23runtime.GOMAXPROCS(runtime.NumCPU())
24ConfigV.SetConfigType("json")
25ConfigV.SetConfigName("pupirka.config")
26ConfigV.AddConfigPath("./")
27ConfigV.SetDefault("path.backup", "./backup")
28ConfigV.SetDefault("path.key", "./keys")
29ConfigV.SetDefault("path.devices", "./device")
30ConfigV.SetDefault("path.log", "./log")
31ConfigV.SetDefault("devicedefault.portshh", 22) //todo need delete
32ConfigV.SetDefault("devicedefault.portssh", 22)
33ConfigV.SetDefault("devicedefault.timeout", 10)
34ConfigV.SetDefault("devicedefault.every", 3600)
35ConfigV.SetDefault("devicedefault.rotate", 730)
36ConfigV.SetDefault("devicedefault.key", "")
37ConfigV.SetDefault("devicedefault.command", "/export")
38ConfigV.SetDefault("devicedefault.timeformat", "20060102T1504")
39ConfigV.SetDefault("devicedefault.prefix", "")
40ConfigV.SetDefault("devicedefault.filenameformat", "%p%t.rcs")
41ConfigV.SetDefault("devicedefault.clearstring", "")
42ConfigV.SetDefault("devicedefault.hook.skip", "")
43ConfigV.SetDefault("devicedefault.hook.backup", "")
44ConfigV.SetDefault("devicedefault.hook.error", "")
45ConfigV.SetDefault("process.max", 10)
46ConfigV.SetDefault("log.maxday", 1)
47ConfigV.SetDefault("log.maxsize", 10)
48ConfigV.SetDefault("log.maxbackups", 10)
49ConfigV.SetDefault("log.format", "text")
50ConfigV.SetDefault("log.level", "info")
51ConfigV.SetDefault("global.onlyone", false)
52ConfigV.SetDefault("global.hook.pre", "")
53ConfigV.SetDefault("global.hook.post", "")
54ConfigV.SetDefault("git.email", "vk@mikrotik.me")
55ConfigV.SetDefault("git.user", "Pupirka")
56ConfigV.SetDefault("git.password", "")
57ConfigV.SetDefault("git.branch", "master")
58if err := ConfigV.ReadInConfig(); err != nil { // error read config
59log.Println(err)
60_ = ConfigV.SafeWriteConfig()
61//todo need try other exception
62}
63
64for _, path := range ConfigV.GetStringMapString("path") {
65if _, err := os.Stat(path); os.IsNotExist(err) {
66_ = os.Mkdir(path, os.ModePerm)
67log.Printf("Create Folder %s", path)
68}
69}
70LogConsole.SetOutput(os.Stdout)
71switch ConfigV.GetString("log.level") {
72case "info":
73LogConsole.SetLevel(logrus.InfoLevel)
74case "debug":
75LogConsole.SetLevel(logrus.DebugLevel)
76default:
77LogConsole.SetLevel(logrus.InfoLevel)
78}
79LogGlobal.SetOutput(&lumberjack.Logger{
80Filename: fmt.Sprintf("%s/%s", ConfigV.GetString("path.log"), "pupirka.log"),
81MaxSize: 0,
82MaxAge: ConfigV.GetInt("log.maxday"),
83MaxBackups: 0,
84LocalTime: true,
85Compress: false,
86})
87LogGlobal.SetLevel(LogConsole.GetLevel())
88if err := RunGlobalPreStart(); err != nil {
89log.Fatalln(err)
90}
91}
92
93func main() {
94filenameLock := "../pupirka.lock"
95if ConfigV.GetBool("global.onlyone") == true {
96lock := fslock.New(filenameLock)
97err := lock.TryLock()
98if err != nil {
99LogConsole.Info("Only One start Process Pupirka")
100return
101}
102defer lock.Unlock()
103}
104LogConsole.Info("Starting....")
105LogConsole.Info("Scan Devices....")
106
107RunnningGlobalHookPre()
108ScanDevice()
109var Dev DeviceList
110
111ReadDevice(&Dev)
112if len(Dev.Devices) == 0 {
113LogConsole.Info("Not Device for backup")
114os.Exit(0)
115}
116LogConsole.Info(fmt.Sprintf("Devices count %d", len(Dev.Devices)))
117RotateDevice(&Dev)
118
119if len(Dev.Devices) == 0 {
120LogConsole.Info("All Device backups actual")
121os.Exit(0)
122}
123time.Sleep(5 * time.Second)
124RunBackups(&Dev)
125err := gitClient.CheckPush()
126if err != nil {
127LogConsole.Errorln(err)
128}
129RunnningGlobalHookPost()
130}
131
132func RunnningGlobalHookPre() {
133LogConsole.Info("Running Hook....")
134command := ConfigV.GetString("global.hook.pre")
135if command == "" {
136LogConsole.Info("Running Not Hook")
137return
138}
139
140o, err := RunCommandInOS(command)
141if err != nil {
142LogConsole.Warn(fmt.Sprintf("Error HOOK %s", err.Error()))
143return
144}
145LogConsole.Info(fmt.Sprintf("Result HOOK %s", o))
146}
147func RunnningGlobalHookPost() {
148command := ConfigV.GetString("global.hook.post")
149LogConsole.Info("Running Hook....")
150if command == "" {
151LogConsole.Info("Running Not Hook")
152return
153}
154
155o, err := RunCommandInOS(command)
156if err != nil {
157LogConsole.Warn(fmt.Sprintf("Error HOOK %s", err.Error()))
158return
159}
160LogConsole.Info(fmt.Sprintf("Result HOOK %s", o))
161}
162func RunCommandInOS(command string) (string, error) {
163execComandi := strings.Fields(command)
164res, err := exec.Command(execComandi[0], execComandi[1:]...).Output()
165if err != nil {
166return "", err
167}
168return string(res), nil
169}
170