The root helper gains one read-only action, `drives`: it finds the drives itself (smartctl --scan-open), reads each as JSON, and writes a summary the agent carries on every sample (agent 1.20.0). Steward judges the figures in drives.py (failing / worn / watch / ok / no SMART / unreadable), records them per drive and as host roll-ups for covering rules, keeps the newest report on the registration and lists it on the host page. install-deps.sh installs smartmontools with apt, dnf, yum, zypper, pacman or apk, run by install.sh and every agent playbook; one it can't install is reported, never fatal. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
88 lines
4.0 KiB
Django/Jinja
88 lines
4.0 KiB
Django/Jinja
#!/bin/sh
|
|
# Steward host agent installer
|
|
# Generated for: {{ host_name }} ({{ host_address }})
|
|
# Steward URL: {{ url }}
|
|
set -e
|
|
|
|
STEWARD_URL="{{ url }}"
|
|
AGENT_TOKEN="{{ token }}"
|
|
AGENT_VERSION="{{ agent_version }}"
|
|
|
|
AGENT_USER="steward-agent"
|
|
AGENT_DIR="/usr/local/lib/steward-agent"
|
|
CONF_FILE="/etc/steward-agent.conf"
|
|
UNIT_DIR="/etc/systemd/system"
|
|
UNITS="steward-agent.service steward-maint.service steward-maint.path"
|
|
FILES_URL="${STEWARD_URL}/plugins/host_agent/files"
|
|
|
|
# ── preflight ────────────────────────────────────────────────────────────────
|
|
[ "$(id -u)" = "0" ] || { echo "must run as root (use sudo)"; exit 1; }
|
|
command -v systemctl >/dev/null 2>&1 || { echo "systemd not found — unsupported init system"; exit 1; }
|
|
command -v python3 >/dev/null 2>&1 || { echo "python3 not found — install python3 first"; exit 1; }
|
|
|
|
# Handle --uninstall
|
|
if [ "${1:-}" = "--uninstall" ]; then
|
|
systemctl disable --now steward-maint.path steward-agent.service 2>/dev/null || true
|
|
for u in $UNITS; do rm -f "$UNIT_DIR/$u"; done
|
|
rm -f "$CONF_FILE"
|
|
rm -rf "$AGENT_DIR" /var/lib/steward-agent /var/lib/steward-maint
|
|
systemctl daemon-reload
|
|
# keep the system user — removing it risks orphaned files elsewhere
|
|
echo "uninstalled"
|
|
exit 0
|
|
fi
|
|
|
|
# ── create system user ───────────────────────────────────────────────────────
|
|
if ! id "$AGENT_USER" >/dev/null 2>&1; then
|
|
useradd --system --no-create-home --shell /usr/sbin/nologin "$AGENT_USER"
|
|
fi
|
|
|
|
# ── drop the agent file ──────────────────────────────────────────────────────
|
|
mkdir -p "$AGENT_DIR"
|
|
curl -fsSL "${STEWARD_URL}/plugins/host_agent/agent.py" -o "$AGENT_DIR/agent.py"
|
|
chmod 0755 "$AGENT_DIR/agent.py"
|
|
chown root:root "$AGENT_DIR/agent.py"
|
|
|
|
# ── write config ─────────────────────────────────────────────────────────────
|
|
cat > "$CONF_FILE" <<EOF
|
|
url = $STEWARD_URL
|
|
token = $AGENT_TOKEN
|
|
interval_seconds = 30
|
|
# Container logs are collected by default. To opt this host out entirely:
|
|
# docker_logs_enabled = false
|
|
# To skip specific noisy containers (comma-separated names):
|
|
# docker_log_exclude = watchtower, some-chatty-service
|
|
EOF
|
|
chown "root:$AGENT_USER" "$CONF_FILE"
|
|
chmod 0640 "$CONF_FILE"
|
|
|
|
# ── the maintenance helper and the units (#5766) ─────────────────────────────
|
|
# One copy, served by Steward, the same the playbooks install. The agent may
|
|
# write only its request directory; the helper (root) and its results don't
|
|
# belong to it.
|
|
curl -fsSL "${FILES_URL}/maint.py" -o "$AGENT_DIR/maint.py"
|
|
chmod 0755 "$AGENT_DIR/maint.py"
|
|
chown root:root "$AGENT_DIR/maint.py"
|
|
# Its packages (smartctl for drive health, #5789), with whichever package
|
|
# manager this host has; one that can't be installed is said, never fatal.
|
|
curl -fsSL "${FILES_URL}/install-deps.sh" -o "$AGENT_DIR/install-deps.sh"
|
|
chmod 0755 "$AGENT_DIR/install-deps.sh"
|
|
chown root:root "$AGENT_DIR/install-deps.sh"
|
|
"$AGENT_DIR/install-deps.sh" || true
|
|
install -d -o root -g root -m 0755 /var/lib/steward-agent /var/lib/steward-maint /var/lib/steward-maint/results
|
|
install -d -o "$AGENT_USER" -g "$AGENT_USER" -m 0700 /var/lib/steward-agent/requests
|
|
for u in $UNITS; do
|
|
curl -fsSL "${FILES_URL}/$u" -o "$UNIT_DIR/$u"
|
|
chmod 0644 "$UNIT_DIR/$u"
|
|
done
|
|
|
|
systemctl daemon-reload
|
|
systemctl enable --now steward-maint.path
|
|
systemctl enable steward-agent.service
|
|
systemctl restart steward-agent.service
|
|
|
|
echo
|
|
echo "Steward host agent $AGENT_VERSION installed and running."
|
|
echo "Check status: systemctl status steward-agent"
|
|
echo "Logs: journalctl -u steward-agent -f"
|