118 lines
2.7 KiB
Go
118 lines
2.7 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"log"
|
|
"os"
|
|
"strings"
|
|
|
|
"gopkg.in/yaml.v3"
|
|
)
|
|
|
|
// readConf парсит даденный конфиг в глобальную структуру, с которой работает программа.
|
|
func readConf(path string) (Config, error) {
|
|
var cfg Config
|
|
|
|
fileInfo, err := os.Stat(path)
|
|
|
|
// Предполагаем, что файла либо нет, либо мы не можем его прочитать, второе надо бы логгировать, но пока забьём.
|
|
if err != nil {
|
|
return Config{}, err
|
|
}
|
|
|
|
// Конфиг-файл длинноват для конфига, попробуем следующего кандидата.
|
|
if fileInfo.Size() > 65535 {
|
|
err := fmt.Errorf("Config file %s is too long for config, skipping", path)
|
|
|
|
return Config{}, err
|
|
}
|
|
|
|
buf, err := os.ReadFile(path)
|
|
|
|
// Не удалось прочитать.
|
|
if err != nil {
|
|
return Config{}, err
|
|
}
|
|
|
|
if err = yaml.Unmarshal(buf, &cfg); err != nil {
|
|
return Config{}, err
|
|
}
|
|
|
|
if cfg.CmdDelay == 0 {
|
|
log.Println("cmd_delay can not be 0, setting to 200 milliseconds")
|
|
|
|
cfg.CmdDelay = 200
|
|
}
|
|
|
|
if cfg.LoopDelay == 0 {
|
|
log.Println("loop_delay can not be 0, setting to 2000 milliseconds")
|
|
|
|
cfg.LoopDelay = 2000
|
|
}
|
|
|
|
if cfg.Debug {
|
|
log.Println("debug set to true")
|
|
} else {
|
|
log.Println("debug set to false")
|
|
}
|
|
|
|
newPrio := make(Prio, 0)
|
|
|
|
// Обычный юзер не может задрать nice больше 0, только руту такое можно.
|
|
var maxNice int32
|
|
|
|
if os.Getuid() == 0 {
|
|
maxNice = -20
|
|
}
|
|
|
|
for _, v := range cfg.Prio {
|
|
switch {
|
|
case len(v.Name) != 0 && (v.Nice < 20 && v.Nice > maxNice):
|
|
newPrio = append(newPrio, v)
|
|
|
|
if cfg.Debug {
|
|
for _, procName := range v.Name {
|
|
log.Printf("Add %s to list of nicelevel %d processes.", procName, v.Nice)
|
|
}
|
|
}
|
|
case len(v.Name) == 0:
|
|
log.Println("Skipping empty entry in prio config block")
|
|
case v.Nice > 20 || v.Nice < maxNice:
|
|
log.Printf("Niceness value out of range %d < nice < 20 in prio config block", maxNice)
|
|
}
|
|
}
|
|
|
|
cfg.Prio = newPrio
|
|
|
|
newKill := make(Kill, 0)
|
|
|
|
for _, v := range cfg.Kill {
|
|
if len(v.Name) != 0 {
|
|
switch v.Sig {
|
|
case "kill", "stop", "term", "int", "quit", "abrt", "hup", "usr1", "usr2":
|
|
newKill = append(newKill, v)
|
|
|
|
if cfg.Debug {
|
|
for _, procName := range v.Name {
|
|
log.Printf(
|
|
"Add %s to list of processes that should be killed with SIG%s signal.",
|
|
procName,
|
|
strings.ToUpper(v.Sig),
|
|
)
|
|
}
|
|
}
|
|
default:
|
|
log.Println("Skipping unsupported signal entry in kill config block")
|
|
}
|
|
} else {
|
|
log.Println("Skipping empty entry in kill config block")
|
|
}
|
|
}
|
|
|
|
cfg.Kill = newKill
|
|
|
|
return cfg, nil
|
|
}
|
|
|
|
/* vim: set ft=go noet ai ts=4 sw=4 sts=4: */
|