-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathmain.go
More file actions
93 lines (82 loc) · 4.27 KB
/
Copy pathmain.go
File metadata and controls
93 lines (82 loc) · 4.27 KB
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
89
90
91
92
93
package main
import (
"flag"
"os"
"os/signal"
"syscall"
"github.com/Sirupsen/logrus"
"github.com/mdigger/mxsms2/sqlog"
"github.com/mdigger/mxsms2/zabbix"
"github.com/x-cray/logrus-prefixed-formatter"
)
var (
appName = "MXSMS" // название приложения
version = "0.7.1" // версия
date = "2016-02-01" // дата сборки
build = "" // номер сборки в git-репозитории
configFileName = "config.yaml" // имя конфигурационного файла
config *Config // загруженная и разобранная конфигурация
llog = logrus.StandardLogger() // инициализируем сбор логов
sglogDB *sqlog.DB // лог СМС
zabbixLog *zabbix.Log
)
const MaxErrors = 10 // максимально допустимое количество ошибок подключения
func main() {
var debugLevel = uint(logrus.InfoLevel)
flag.StringVar(&configFileName, "config", configFileName, "configuration `fileName`")
flag.UintVar(&debugLevel, "level", debugLevel, "log `level` [0-5]")
flag.Parse() // разбираем параметры запуска приложения
logrus.SetLevel(logrus.Level(debugLevel)) // уровень отладки
// logrus.SetFormatter(new(logrus.JSONFormatter))
logrus.SetFormatter(new(prefixed.TextFormatter))
// hook, err := logrus_syslog.NewSyslogHook("", "", syslog.LOG_INFO, "")
// if err == nil {
// logrus.AddHook(hook)
// }
// выводим в лог информацию о приложении и версии
logEntry := llog.WithField("version", version)
if build != "" { // добавляем билд к номеру версии
logEntry = logEntry.WithField("build", build)
}
if date != "" { // добавляем дату сборки к версии
logEntry = logEntry.WithField("buildDate", date)
}
logEntry.Info(appName)
// запускаем бесконечный цикл чтения конфигурации и установки соединения
for {
// загружаем и разбираем конфигурационный файл
logEntry := llog.WithField("filename", configFileName)
var err error
config, err = LoadConfig(configFileName) // загружаем конфигурационный файл
if err != nil {
logEntry.WithError(err).Fatal("Error loading config")
}
logEntry.WithField("mx", len(config.MX)).Info("Config loaded")
sglogDB, err = sqlog.Connect(config.SMSGate.MYSQL)
if err != nil {
logEntry.WithError(err).Fatal("Error connecting to MySQL")
}
// zabbixLog = zabbix.New(config.SMSGate.ZabbixHost)
config.SMSGate.SMPP.Zabbix = config.SMSGate.Zabbix
config.MXConnect() // запускаем асинхронно соединение с MX
config.SMSGate.Connect() // устанавливаем соединение с SMPP серверами
// инициализируем поддержку системных сигналов и ждем, когда он случится...
signal := monitorSignals(os.Interrupt, os.Kill, syscall.SIGUSR1)
config.SMSGate.Close() // останавливаем соединение с SMPP
config.MXClose() // останавливаем соединение с MX серверами
sglogDB.Close() // закрываем соединение с логом
// проверяем, что сигнал не является сигналом перечитать конфиг
if signal != syscall.SIGUSR1 {
llog.Info("The end")
return // заканчиваем нашу работу
}
llog.Info("Reload") // перечитываем конфиг и начинаем все с начала
}
}
// monitorSignals запускает мониторинг сигналов и возвращает значение, когда получает сигнал.
// В качестве параметров передается список сигналов, которые нужно отслеживать.
func monitorSignals(signals ...os.Signal) os.Signal {
signalChan := make(chan os.Signal, 1)
signal.Notify(signalChan, signals...)
return <-signalChan
}