133 lines
3.1 KiB
Bash
133 lines
3.1 KiB
Bash
#!/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
|
|
}
|