Веб-панель управления сервером Project Zomboid
Менеджер запускает сервер 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>
This commit is contained in:
@@ -0,0 +1,52 @@
|
||||
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))
|
||||
}
|
||||
Reference in New Issue
Block a user