feat: add bds core, locale updates and safety fixes

This commit is contained in:
2026-05-31 14:01:34 +03:00
parent d1686355e8
commit c769140913
34 changed files with 1535 additions and 12 deletions

132
lib/services.sh Normal file
View File

@@ -0,0 +1,132 @@
#!/usr/bin/env bash
SERVICE_NAME=""
SERVICE_FILE=""
SERVICE_CREATED="no"
SERVICE_MODE_ACTIVE="none"
stop_service_if_running() {
local service_name="${1:-${SERVICE_NAME:-${CORE}_minecraft}}"
if [[ "$INIT_SYSTEM" != "systemd" ]]; then
return 0
fi
if [[ "${DRY_RUN:-no}" == "yes" ]]; then
info "[dry-run] systemctl stop ${service_name}"
return 0
fi
emit_step "service_stop" "$service_name"
systemctl stop "$service_name" >/dev/null 2>&1 || true
}
create_service() {
local core="$1"
local dir="$2"
local mode="$3"
local start_script="$4"
local start_script_escaped="$4"
start_script_escaped="${start_script_escaped//\\/\\\\}"
start_script_escaped="${start_script_escaped//\"/\\\"}"
start_script_escaped="${start_script_escaped//%/%%}"
SERVICE_NAME="${core}_minecraft"
SERVICE_FILE="/etc/systemd/system/${SERVICE_NAME}.service"
if [[ "$mode" == "none" || "$INIT_SYSTEM" != "systemd" ]]; then
warn "$(t service_create_skipped "$mode" "$INIT_SYSTEM")"
SERVICE_MODE_ACTIVE="none"
return 0
fi
emit_step "service_create" "$core:$mode"
if [[ "$mode" == "tmux-systemd" ]]; then
run_cmd bash -c "cat > '$SERVICE_FILE' <<EOF
[Unit]
Description=Minecraft ${core} server (tmux)
After=network.target
[Service]
Type=forking
User=${SERVER_USER}
Group=${SERVER_USER}
WorkingDirectory=${dir}
ExecStart=/usr/bin/tmux new-session -d -s ${SERVICE_NAME} \"${start_script_escaped}\"
ExecStop=/usr/bin/tmux send-keys -t ${SERVICE_NAME} 'stop' C-m
ExecStopPost=/bin/sleep 8
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF"
elif [[ "$mode" == "screen" ]]; then
run_cmd bash -c "cat > '$SERVICE_FILE' <<EOF
[Unit]
Description=Minecraft ${core} server (screen)
After=network.target
[Service]
Type=forking
User=${SERVER_USER}
Group=${SERVER_USER}
WorkingDirectory=${dir}
ExecStart=/usr/bin/screen -dmS ${SERVICE_NAME} \"${start_script_escaped}\"
ExecStop=/usr/bin/screen -S ${SERVICE_NAME} -X quit
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF"
else
run_cmd bash -c "cat > '$SERVICE_FILE' <<EOF
[Unit]
Description=Minecraft ${core} server
After=network.target
[Service]
Type=simple
User=${SERVER_USER}
Group=${SERVER_USER}
WorkingDirectory=${dir}
ExecStart="${start_script_escaped}"
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF"
fi
SERVICE_CREATED="yes"
SERVICE_MODE_ACTIVE="$mode"
emit_step "service_reload_enable" "$SERVICE_NAME"
run_cmd systemctl daemon-reload
run_cmd systemctl enable "$SERVICE_NAME"
}
start_service() {
if [[ "$SERVICE_MODE_ACTIVE" == "none" ]]; then
info "$(t service_start_skipped "$SERVICE_MODE_ACTIVE")"
return 0
fi
emit_step "service_start" "$SERVICE_NAME"
run_cmd systemctl restart "$SERVICE_NAME"
}
remove_service_if_exists() {
if [[ "$SERVICE_CREATED" != "yes" ]]; then
return 0
fi
if [[ -n "$SERVICE_NAME" ]]; then
run_cmd systemctl stop "$SERVICE_NAME" || true
run_cmd systemctl disable "$SERVICE_NAME" || true
fi
if [[ -n "${SERVICE_FILE}" && -f "$SERVICE_FILE" ]]; then
run_cmd rm -f "$SERVICE_FILE"
fi
run_cmd systemctl daemon-reload || true
}