Files
go_process_manager/boot/boot.go
2025-12-20 17:29:54 +08:00

164 lines
3.3 KiB
Go

package boot
import (
"log"
"os"
"os/signal"
"reflect"
"strconv"
"syscall"
"time"
"github.com/lzh-1625/go_process_manager/config"
"github.com/lzh-1625/go_process_manager/internal/app/eum"
"github.com/lzh-1625/go_process_manager/internal/app/logic"
"github.com/lzh-1625/go_process_manager/internal/app/repository"
"github.com/lzh-1625/go_process_manager/internal/app/termui"
logger "github.com/lzh-1625/go_process_manager/log"
"github.com/lzh-1625/go_process_manager/utils"
"github.com/robfig/cron/v3"
)
func init() {
initDb()
initResetConfig()
initConfiguration()
initArgs()
initLogHandle()
initLog()
initLogHanler()
initWaitCond()
initProcess()
initJwtSecret()
initTui()
InitTask()
InitEventCleanCronJob()
initListenKillSignal()
}
func initDb() {
repository.InitDb()
}
func initConfiguration() {
defer func() {
if err := recover(); err != nil {
log.Panic("config init fail", err)
}
}()
configKvMap := map[string]string{}
data, err := repository.ConfigRepository.GetAllConfig()
if err != nil {
panic(err)
}
for _, v := range data {
configKvMap[v.Key] = *v.Value
}
typeElem := reflect.TypeOf(config.CF).Elem()
valueElem := reflect.ValueOf(config.CF).Elem()
for i := 0; i < typeElem.NumField(); i++ {
typeField := typeElem.Field(i)
valueField := valueElem.Field(i)
value, ok := configKvMap[typeField.Name]
if !ok {
value = typeField.Tag.Get("default")
}
if value == "-" {
continue
}
switch typeField.Type.Kind() {
case reflect.String:
valueField.SetString(value)
case reflect.Bool:
valueField.SetBool(utils.UnwarpIgnore(strconv.ParseBool(value)))
case reflect.Float64:
valueField.SetFloat(utils.UnwarpIgnore(strconv.ParseFloat(value, 64)))
case reflect.Int64, reflect.Int:
valueField.SetInt(utils.UnwarpIgnore(strconv.ParseInt(value, 10, 64)))
default:
continue
}
}
}
func initArgs() {
if len(os.Args) >= 2 && os.Args[1] == "tui" {
config.CF.Tui = true
}
}
func initLog() {
logger.InitLog()
}
func initProcess() {
logic.ProcessCtlLogic.ProcessInit()
}
func initJwtSecret() {
if secret, err := repository.ConfigRepository.GetConfigValue(eum.SecretKey); err == nil {
utils.SetSecret([]byte(secret))
return
}
secret := utils.RandString(32)
repository.ConfigRepository.SetConfigValue(eum.SecretKey, secret)
utils.SetSecret([]byte(secret))
}
func initLogHanler() {
logic.InitLog()
}
func initTui() {
go termui.Tui.TermuiInit()
}
func InitTask() {
logic.TaskLogic.InitTaskJob()
}
func initResetConfig() {
if len(os.Args) >= 2 && os.Args[1] == "reset" {
err := logic.ConfigLogic.ResetSystemConfiguration()
if err != nil {
log.Panic(err)
}
log.Print("reset system config to deafult success!")
os.Exit(0)
}
}
func initListenKillSignal() {
go func() {
sigs := make(chan os.Signal, 1)
signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)
<-sigs
logger.Logger.Info("进程正在退出,等待全部进程停止")
logic.ProcessCtlLogic.KillAllProcess()
log.Print("已停止所有进程")
os.Exit(0)
}()
}
func initLogHandle() {
logic.InitLogHandle()
}
func initWaitCond() {
logic.InitWaitCond()
}
func InitEventCleanCronJob() {
if config.CF.EventStorageTime <= 0 {
return
}
c := cron.New()
c.AddFunc("* * * * *", func() {
logger.Logger.Infow("事件清理执行")
logic.EventLogic.Clean(time.Duration(config.CF.EventStorageTime) * time.Hour * 24)
})
c.Start()
}