Менеджер запускает сервер PZ как дочерний процесс и держит его stdin/stdout: отсюда живая консоль без RCON, стриминг логов через SSE и корректная остановка по цепочке quit -> SIGTERM -> SIGKILL для всей группы процессов. Сам менеджер работает под systemd. Что входит: - управление жизненным циклом сервера, автозапуск и автоподъём после падения; - метрики процесса из /proc и состояние хоста, список игроков онлайн; - редакторы servertest.ini и SandboxVars.lua, сохраняющие исходное форматирование файлов; - моды: списки Workshop ID и Mod ID с порядком загрузки, названия из Steam; - бэкапы мира по расписанию и вручную, с ротацией и восстановлением; - установка и обновление сервера через SteamCMD; - вход по логину и паролю, первичная настройка по одноразовому коду. Веб-интерфейс без сборщика, вшит в бинарник через embed. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
53 lines
1.5 KiB
Go
53 lines
1.5 KiB
Go
package pzconfig
|
|
|
|
import "strings"
|
|
|
|
// Ключи servertest.ini, в которых живут моды.
|
|
const (
|
|
KeyMods = "Mods"
|
|
KeyWorkshopItems = "WorkshopItems"
|
|
KeyMap = "Map"
|
|
)
|
|
|
|
// SplitList разбирает список PZ вида "a;b;c" в срез без пустых элементов.
|
|
func SplitList(value string) []string {
|
|
if strings.TrimSpace(value) == "" {
|
|
return []string{}
|
|
}
|
|
parts := strings.Split(value, ";")
|
|
out := make([]string, 0, len(parts))
|
|
for _, p := range parts {
|
|
if p = strings.TrimSpace(p); p != "" {
|
|
out = append(out, p)
|
|
}
|
|
}
|
|
return out
|
|
}
|
|
|
|
// JoinList собирает список обратно в формат PZ, убирая дубликаты и сохраняя
|
|
// порядок: он важен, моды грузятся именно в нём.
|
|
func JoinList(items []string) string {
|
|
seen := make(map[string]bool, len(items))
|
|
out := make([]string, 0, len(items))
|
|
for _, item := range items {
|
|
item = strings.TrimSpace(item)
|
|
if item == "" || seen[item] {
|
|
continue
|
|
}
|
|
seen[item] = true
|
|
out = append(out, item)
|
|
}
|
|
return strings.Join(out, ";")
|
|
}
|
|
|
|
// Mods возвращает текущие списки модов сервера.
|
|
func (i *INI) Mods() (modIDs, workshopIDs []string) {
|
|
return SplitList(i.Get(KeyMods)), SplitList(i.Get(KeyWorkshopItems))
|
|
}
|
|
|
|
// SetMods записывает списки модов обратно в конфиг.
|
|
func (i *INI) SetMods(modIDs, workshopIDs []string) {
|
|
i.Set(KeyMods, JoinList(modIDs))
|
|
i.Set(KeyWorkshopItems, JoinList(workshopIDs))
|
|
}
|