Merge pull request 'fix: dual-mode installer — works with or without sudo' (#41) from feat/push-monitoring-agent into master

Reviewed-on: #41
This commit was merged in pull request #41.
This commit is contained in:
2026-06-11 19:14:59 -04:00
3 changed files with 94 additions and 67 deletions

View File

@@ -11,8 +11,18 @@ if [ -z "$SERVER_URL" ] || [ -z "$AGENT_KEY" ]; then
exit 1 exit 1
fi fi
# Self-elevate if not running as root # Detect if we can run as root (try non-interactive sudo)
CAN_ROOT=false
if [ "$(id -u)" -eq 0 ]; then
CAN_ROOT=true
elif command -v sudo >/dev/null 2>&1 && sudo -n true 2>/dev/null; then
CAN_ROOT=true
fi
if [ "$CAN_ROOT" = true ]; then
# ── Root/system mode ──
if [ "$(id -u)" -ne 0 ]; then if [ "$(id -u)" -ne 0 ]; then
# Re-exec with script PTY if available (handles requiretty)
if command -v script >/dev/null 2>&1; then if command -v script >/dev/null 2>&1; then
exec script -q -c "sudo bash '$0' '$1' '$2' '$3'" /dev/null exec script -q -c "sudo bash '$0' '$1' '$2' '$3'" /dev/null
fi fi
@@ -23,16 +33,27 @@ AGENT_BIN="/usr/local/bin/servermanager-agent"
CONFIG_DIR="/etc/servermanager" CONFIG_DIR="/etc/servermanager"
CONFIG_FILE="$CONFIG_DIR/agent.conf" CONFIG_FILE="$CONFIG_DIR/agent.conf"
SERVICE_FILE="/etc/systemd/system/servermanager-agent.service" SERVICE_FILE="/etc/systemd/system/servermanager-agent.service"
USE_SYSTEMD=true
INSTALL_MODE="system"
else
# ── User/no-root mode ──
AGENT_BIN="$HOME/.local/bin/servermanager-agent"
CONFIG_DIR="$HOME/.config/servermanager"
CONFIG_FILE="$CONFIG_DIR/agent.conf"
USE_SYSTEMD=false
INSTALL_MODE="user"
fi
echo "[1/5] Creating config directory..." echo "[1/4] Creating directories..."
mkdir -p "$(dirname "$AGENT_BIN")"
mkdir -p "$CONFIG_DIR" mkdir -p "$CONFIG_DIR"
echo "[2/5] Installing agent binary..." echo "[2/4] Installing agent binary..."
mkdir -p "$(dirname "$AGENT_BIN")"
cat > "$AGENT_BIN" << 'AGENTSCRIPT' cat > "$AGENT_BIN" << 'AGENTSCRIPT'
#!/bin/bash #!/bin/bash
set -e set -e
CONFIG_FILE="/etc/servermanager/agent.conf"
CONFIG_FILE="${1:-$HOME/.config/servermanager/agent.conf}"
load_config() { load_config() {
if [ -f "$CONFIG_FILE" ]; then if [ -f "$CONFIG_FILE" ]; then
@@ -75,10 +96,10 @@ EOF
-o /dev/null -w "%{http_code}" 2>/dev/null || echo "000" -o /dev/null -w "%{http_code}" 2>/dev/null || echo "000"
} }
main() { run() {
load_config load_config
if [ -z "$SERVER_URL" ] || [ -z "$AGENT_KEY" ]; then if [ -z "$SERVER_URL" ] || [ -z "$AGENT_KEY" ]; then
echo "ERROR: SERVER_URL and AGENT_KEY must be set in $CONFIG_FILE" echo "ERROR: SERVER_URL and AGENT_KEY not configured"
exit 1 exit 1
fi fi
echo "ServerManager Agent started (interval: ${INTERVAL}s)" echo "ServerManager Agent started (interval: ${INTERVAL}s)"
@@ -86,25 +107,22 @@ main() {
while true; do while true; do
collect_metrics collect_metrics
http_code=$(push_metrics) http_code=$(push_metrics)
if [ "$http_code" = "200" ]; then echo "[$(date)] HTTP $http_code"
echo "[$(date)] Metrics pushed successfully"
else
echo "[$(date)] Failed to push metrics (HTTP $http_code)"
fi
sleep "$INTERVAL" sleep "$INTERVAL"
done done
} }
main
run
AGENTSCRIPT AGENTSCRIPT
chmod +x "$AGENT_BIN" chmod +x "$AGENT_BIN"
if [ ! -f "$AGENT_BIN" ]; then if [ ! -f "$AGENT_BIN" ]; then
echo "ERROR: Agent binary was not created at $AGENT_BIN" echo "ERROR: Agent binary was not created"
exit 1 exit 1
fi fi
echo " Verified: $AGENT_BIN ($(wc -c < "$AGENT_BIN") bytes)" echo " Binary: $AGENT_BIN ($(wc -c < "$AGENT_BIN") bytes)"
echo "[3/5] Writing config..." echo "[3/4] Writing config..."
cat > "$CONFIG_FILE" << EOF cat > "$CONFIG_FILE" << EOF
SERVER_URL="$SERVER_URL" SERVER_URL="$SERVER_URL"
AGENT_KEY="$AGENT_KEY" AGENT_KEY="$AGENT_KEY"
@@ -112,38 +130,37 @@ INTERVAL=$INTERVAL
EOF EOF
chmod 600 "$CONFIG_FILE" chmod 600 "$CONFIG_FILE"
echo "[4/5] Installing systemd service..." echo "[4/4] Enabling auto-start..."
if [ "$USE_SYSTEMD" = true ]; then
echo " Using systemd service..."
cat > "$SERVICE_FILE" << 'UNIT' cat > "$SERVICE_FILE" << 'UNIT'
[Unit] [Unit]
Description=ServerManager Monitoring Agent Description=ServerManager Monitoring Agent
Documentation=https://github.com/servermanager
After=network-online.target After=network-online.target
Wants=network-online.target Wants=network-online.target
[Service] [Service]
Type=simple Type=simple
ExecStart=/usr/local/bin/servermanager-agent ExecStart=/usr/local/bin/servermanager-agent
Restart=always Restart=always
RestartSec=10 RestartSec=10
StartLimitIntervalSec=60
StartLimitBurst=5
NoNewPrivileges=yes
ProtectSystem=full
ProtectHome=yes
PrivateDevices=yes
PrivateTmp=yes
[Install] [Install]
WantedBy=multi-user.target WantedBy=multi-user.target
UNIT UNIT
systemctl daemon-reload 2>/dev/null || true
echo "[5/5] Enabling and starting service..." systemctl enable servermanager-agent 2>/dev/null || true
systemctl daemon-reload systemctl restart servermanager-agent 2>/dev/null || true
systemctl enable servermanager-agent else
systemctl restart servermanager-agent echo " Using crontab (@reboot)..."
CRON_JOB="@reboot $AGENT_BIN > $CONFIG_DIR/agent.log 2>&1"
(crontab -l 2>/dev/null | grep -v '_sm_agent\|servermanager-agent'; echo "$CRON_JOB") | crontab - 2>/dev/null || {
echo "WARNING: Could not install crontab. Agent must be started manually."
echo " Run: $AGENT_BIN &"
}
fi
echo "" echo ""
echo "ServerManager Agent installed successfully!" echo "ServerManager Agent installed successfully!"
echo " Mode: $INSTALL_MODE"
echo " Binary: $AGENT_BIN" echo " Binary: $AGENT_BIN"
echo " Config: $CONFIG_FILE" echo " Config: $CONFIG_FILE"
echo " Service: $SERVICE_FILE"

View File

@@ -1,29 +1,35 @@
#!/bin/bash #!/bin/bash
# ServerManager Agent Uninstaller # ServerManager Agent Uninstaller
# Self-elevate if not running as root # Try system paths first, fall back to user paths
if [ "$(id -u)" -ne 0 ]; then if [ -f /usr/local/bin/servermanager-agent ]; then
if command -v script >/dev/null 2>&1; then
exec script -q -c "sudo bash '$0'" /dev/null
fi
exec sudo bash "$0"
fi
AGENT_BIN="/usr/local/bin/servermanager-agent"
CONFIG_DIR="/etc/servermanager"
SERVICE_FILE="/etc/systemd/system/servermanager-agent.service"
echo "[1/3] Stopping and disabling service..." echo "[1/3] Stopping and disabling service..."
systemctl stop servermanager-agent 2>/dev/null || true systemctl stop servermanager-agent 2>/dev/null || true
systemctl disable servermanager-agent 2>/dev/null || true systemctl disable servermanager-agent 2>/dev/null || true
systemctl daemon-reload 2>/dev/null || true systemctl daemon-reload 2>/dev/null || true
echo "[2/3] Removing files..." echo "[2/3] Removing system files..."
rm -f "$AGENT_BIN" 2>/dev/null || true rm -f /usr/local/bin/servermanager-agent 2>/dev/null || true
rm -rf "$CONFIG_DIR" 2>/dev/null || true rm -rf /etc/servermanager 2>/dev/null || true
rm -f "$SERVICE_FILE" 2>/dev/null || true rm -f /etc/systemd/system/servermanager-agent.service 2>/dev/null || true
echo "[3/3] Reloading systemd..." echo "[3/3] Reloading systemd..."
systemctl daemon-reload 2>/dev/null || true systemctl daemon-reload 2>/dev/null || true
elif [ -f "$HOME/.local/bin/servermanager-agent" ]; then
echo "[1/2] Removing cron job..."
crontab -l 2>/dev/null | grep -v 'servermanager-agent' | crontab - 2>/dev/null || true
echo "[2/2] Removing user files..."
rm -f "$HOME/.local/bin/servermanager-agent" 2>/dev/null || true
rm -rf "$HOME/.config/servermanager" 2>/dev/null || true
else
echo "Agent is not installed."
# Still try to clean up any leftover system files
rm -f /usr/local/bin/servermanager-agent 2>/dev/null || true
rm -rf /etc/servermanager 2>/dev/null || true
rm -f /etc/systemd/system/servermanager-agent.service 2>/dev/null || true
systemctl daemon-reload 2>/dev/null || true
crontab -l 2>/dev/null | grep -v 'servermanager-agent' | crontab - 2>/dev/null || true
fi
echo "ServerManager Agent uninstalled successfully." echo "ServerManager Agent uninstalled successfully."

View File

@@ -68,7 +68,6 @@ class AgentService
$output = trim($result['output']); $output = trim($result['output']);
$exitStatus = $result['exit_status'] ?? -1; $exitStatus = $result['exit_status'] ?? -1;
$path = '/usr/local/bin/servermanager-agent';
if ($exitStatus !== 0) { if ($exitStatus !== 0) {
$lastLines = implode("\n", array_slice(explode("\n", $output), -20)); $lastLines = implode("\n", array_slice(explode("\n", $output), -20));
@@ -79,6 +78,11 @@ class AgentService
]; ];
} }
$path = '/usr/local/bin/servermanager-agent';
if (preg_match('/Binary:\s*(\S+)/', $output, $m)) {
$path = $m[1];
}
$serverModel = new \ServerManager\Models\Server(); $serverModel = new \ServerManager\Models\Server();
$serverModel->setAgentInstalled($serverId, true, $path); $serverModel->setAgentInstalled($serverId, true, $path);