pupirka

Форк
0
/
main.go 
169 строк · 4.6 Кб
1
package main
2

3
import (
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

17
var ConfigV = viper.New()
18
var DeviceFiles []string
19
var LogGlobal = logrus.New()
20
var LogConsole = logrus.New()
21

22
func init() {
23
	runtime.GOMAXPROCS(runtime.NumCPU())
24
	ConfigV.SetConfigType("json")
25
	ConfigV.SetConfigName("pupirka.config")
26
	ConfigV.AddConfigPath("./")
27
	ConfigV.SetDefault("path.backup", "./backup")
28
	ConfigV.SetDefault("path.key", "./keys")
29
	ConfigV.SetDefault("path.devices", "./device")
30
	ConfigV.SetDefault("path.log", "./log")
31
	ConfigV.SetDefault("devicedefault.portshh", 22) //todo need delete
32
	ConfigV.SetDefault("devicedefault.portssh", 22)
33
	ConfigV.SetDefault("devicedefault.timeout", 10)
34
	ConfigV.SetDefault("devicedefault.every", 3600)
35
	ConfigV.SetDefault("devicedefault.rotate", 730)
36
	ConfigV.SetDefault("devicedefault.key", "")
37
	ConfigV.SetDefault("devicedefault.command", "/export")
38
	ConfigV.SetDefault("devicedefault.timeformat", "20060102T1504")
39
	ConfigV.SetDefault("devicedefault.prefix", "")
40
	ConfigV.SetDefault("devicedefault.filenameformat", "%p%t.rcs")
41
	ConfigV.SetDefault("devicedefault.clearstring", "")
42
	ConfigV.SetDefault("devicedefault.hook.skip", "")
43
	ConfigV.SetDefault("devicedefault.hook.backup", "")
44
	ConfigV.SetDefault("devicedefault.hook.error", "")
45
	ConfigV.SetDefault("process.max", 10)
46
	ConfigV.SetDefault("log.maxday", 1)
47
	ConfigV.SetDefault("log.maxsize", 10)
48
	ConfigV.SetDefault("log.maxbackups", 10)
49
	ConfigV.SetDefault("log.format", "text")
50
	ConfigV.SetDefault("log.level", "info")
51
	ConfigV.SetDefault("global.onlyone", false)
52
	ConfigV.SetDefault("global.hook.pre", "")
53
	ConfigV.SetDefault("global.hook.post", "")
54
	ConfigV.SetDefault("git.email", "vk@mikrotik.me")
55
	ConfigV.SetDefault("git.user", "Pupirka")
56
	ConfigV.SetDefault("git.password", "")
57
	ConfigV.SetDefault("git.branch", "master")
58
	if err := ConfigV.ReadInConfig(); err != nil { // error read config
59
		log.Println(err)
60
		_ = ConfigV.SafeWriteConfig()
61
		//todo need try other exception
62
	}
63

64
	for _, path := range ConfigV.GetStringMapString("path") {
65
		if _, err := os.Stat(path); os.IsNotExist(err) {
66
			_ = os.Mkdir(path, os.ModePerm)
67
			log.Printf("Create Folder %s", path)
68
		}
69
	}
70
	LogConsole.SetOutput(os.Stdout)
71
	switch ConfigV.GetString("log.level") {
72
	case "info":
73
		LogConsole.SetLevel(logrus.InfoLevel)
74
	case "debug":
75
		LogConsole.SetLevel(logrus.DebugLevel)
76
	default:
77
		LogConsole.SetLevel(logrus.InfoLevel)
78
	}
79
	LogGlobal.SetOutput(&lumberjack.Logger{
80
		Filename:   fmt.Sprintf("%s/%s", ConfigV.GetString("path.log"), "pupirka.log"),
81
		MaxSize:    0,
82
		MaxAge:     ConfigV.GetInt("log.maxday"),
83
		MaxBackups: 0,
84
		LocalTime:  true,
85
		Compress:   false,
86
	})
87
	LogGlobal.SetLevel(LogConsole.GetLevel())
88
	if err := RunGlobalPreStart(); err != nil {
89
		log.Fatalln(err)
90
	}
91
}
92

93
func main() {
94
	filenameLock := "../pupirka.lock"
95
	if ConfigV.GetBool("global.onlyone") == true {
96
		lock := fslock.New(filenameLock)
97
		err := lock.TryLock()
98
		if err != nil {
99
			LogConsole.Info("Only One start Process Pupirka")
100
			return
101
		}
102
		defer lock.Unlock()
103
	}
104
	LogConsole.Info("Starting....")
105
	LogConsole.Info("Scan Devices....")
106

107
	RunnningGlobalHookPre()
108
	ScanDevice()
109
	var Dev DeviceList
110

111
	ReadDevice(&Dev)
112
	if len(Dev.Devices) == 0 {
113
		LogConsole.Info("Not Device for backup")
114
		os.Exit(0)
115
	}
116
	LogConsole.Info(fmt.Sprintf("Devices count %d", len(Dev.Devices)))
117
	RotateDevice(&Dev)
118

119
	if len(Dev.Devices) == 0 {
120
		LogConsole.Info("All Device backups actual")
121
		os.Exit(0)
122
	}
123
	time.Sleep(5 * time.Second)
124
	RunBackups(&Dev)
125
	err := gitClient.CheckPush()
126
	if err != nil {
127
		LogConsole.Errorln(err)
128
	}
129
	RunnningGlobalHookPost()
130
}
131

132
func RunnningGlobalHookPre() {
133
	LogConsole.Info("Running Hook....")
134
	command := ConfigV.GetString("global.hook.pre")
135
	if command == "" {
136
		LogConsole.Info("Running Not Hook")
137
		return
138
	}
139

140
	o, err := RunCommandInOS(command)
141
	if err != nil {
142
		LogConsole.Warn(fmt.Sprintf("Error HOOK %s", err.Error()))
143
		return
144
	}
145
	LogConsole.Info(fmt.Sprintf("Result HOOK %s", o))
146
}
147
func RunnningGlobalHookPost() {
148
	command := ConfigV.GetString("global.hook.post")
149
	LogConsole.Info("Running Hook....")
150
	if command == "" {
151
		LogConsole.Info("Running Not Hook")
152
		return
153
	}
154

155
	o, err := RunCommandInOS(command)
156
	if err != nil {
157
		LogConsole.Warn(fmt.Sprintf("Error HOOK %s", err.Error()))
158
		return
159
	}
160
	LogConsole.Info(fmt.Sprintf("Result HOOK %s", o))
161
}
162
func RunCommandInOS(command string) (string, error) {
163
	execComandi := strings.Fields(command)
164
	res, err := exec.Command(execComandi[0], execComandi[1:]...).Output()
165
	if err != nil {
166
		return "", err
167
	}
168
	return string(res), nil
169
}
170

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.