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:
@@ -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"
|
|
||||||
|
|||||||
@@ -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."
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user