BastionGuard/webui/scripts/bastionguard-webui-systemctl
specialworld83 f0f913a209 Release 2.0
2026-07-15 10:52:22 +02:00

67 lines
2 KiB
Bash
Executable file

#!/usr/bin/env bash
set -euo pipefail
# Helper minimale per BastionGuard WebUI.
# Deve essere installato root:root 0755 in /usr/local/sbin e richiamato via sudoers.
# Uso: bastionguard-webui-systemctl user <utente> <show|is-active|is-enabled|start|stop|restart|enable|disable> <unit.service> [Prop...]
if [[ $# -lt 4 || "$1" != "user" ]]; then
echo "Uso: $0 user <utente> <comando> <unit.service> [Prop...]" >&2
exit 64
fi
TARGET_USER="$2"
CMD="$3"
UNIT="$4"
shift 4
if [[ ! "$TARGET_USER" =~ ^[A-Za-z_][A-Za-z0-9_-]*[$]?$ ]]; then
echo "Invalid user" >&2
exit 64
fi
if ! id "$TARGET_USER" >/dev/null 2>&1; then
echo "User does not exist: $TARGET_USER" >&2
exit 67
fi
if [[ ! "$UNIT" =~ ^[A-Za-z0-9@_.:-]+\.service$ ]]; then
echo "Invalid unit: $UNIT" >&2
exit 64
fi
case "$UNIT" in
BastionGuard-*.service|bastionguard-*.service) ;;
*) echo "Unit not allowed: $UNIT" >&2; exit 64 ;;
esac
case "$CMD" in
show|is-active|is-enabled|start|stop|restart|enable|disable) ;;
*) echo "Comando non consentito: $CMD" >&2; exit 64 ;;
esac
UID_NUM="$(id -u "$TARGET_USER")"
RUNTIME_DIR="/run/user/$UID_NUM"
BUS="unix:path=$RUNTIME_DIR/bus"
if [[ ! -d "$RUNTIME_DIR" ]]; then
echo "Runtime utente non presente: $RUNTIME_DIR" >&2
exit 69
fi
SYSTEMCTL=(/usr/bin/systemctl --user "$CMD" "$UNIT")
if [[ "$CMD" == "show" ]]; then
# The WebUI passes only property names, never arbitrary options.
if [[ $# -eq 0 ]]; then
set -- ActiveState SubState LoadState UnitFileState MainPID FragmentPath Description
fi
for prop in "$@"; do
if [[ ! "$prop" =~ ^[A-Za-z0-9_]+$ ]]; then
echo "Invalid property: $prop" >&2
exit 64
fi
SYSTEMCTL+=(-p "$prop")
done
SYSTEMCTL+=(--no-pager)
fi
if command -v runuser >/dev/null 2>&1; then
exec runuser -u "$TARGET_USER" -- env XDG_RUNTIME_DIR="$RUNTIME_DIR" DBUS_SESSION_BUS_ADDRESS="$BUS" "${SYSTEMCTL[@]}"
fi
exec sudo -n -u "$TARGET_USER" env XDG_RUNTIME_DIR="$RUNTIME_DIR" DBUS_SESSION_BUS_ADDRESS="$BUS" "${SYSTEMCTL[@]}"