Files
server-manager/bin/agent.sh
Agent bfa102cf97 feat: push-based monitoring with remote agent
- Add database migration 006 for agent_key, agent_installed, agent_install_path, agent_last_seen_at columns
- Add Server model methods: findByAgentKey, generateAgentKey, regenerateAgentKey, updateAgentLastSeen, setAgentInstalled
- Auto-generate agent_key on server creation
- Create AgentService for SSH-based install/uninstall of remote agent
- Create bin/agent.sh - bash agent script for remote servers
- Create install/agent-install.sh and install/agent-uninstall.sh
- Create install/servermanager-agent.service systemd unit
- Add POST /api/metrics/push endpoint (auth via agent_key)
- Add web routes for agent install/uninstall/regenerate-key
- Add agent status section to server detail view with install/uninstall modals
- Make MonitoringService::saveMetrics() public for reuse
2026-06-11 18:28:22 -04:00

84 lines
1.9 KiB
Bash

#!/bin/bash
# ServerManager Monitoring Agent
# This script runs as a systemd service on monitored servers.
set -e
CONFIG_FILE="/etc/servermanager/agent.conf"
load_config() {
if [ -f "$CONFIG_FILE" ]; then
source "$CONFIG_FILE"
fi
SERVER_URL="${SERVER_URL:-}"
AGENT_KEY="${AGENT_KEY:-}"
INTERVAL="${INTERVAL:-60}"
}
collect_metrics() {
CPU=$(top -bn1 2>/dev/null | grep 'Cpu(s)' | awk '{print $2}' | cut -d'%' -f1)
[ -z "$CPU" ] && CPU=0
RAM=$(free 2>/dev/null | grep Mem | awk '{printf "%.1f", $3/$2 * 100}')
[ -z "$RAM" ] && RAM=0
DISK=$(df / 2>/dev/null | tail -1 | awk '{print $5}' | sed 's/%//')
[ -z "$DISK" ] && DISK=0
LOAD=$(cat /proc/loadavg 2>/dev/null | awk '{print $1}')
[ -z "$LOAD" ] && LOAD=0
UPTIME=$(uptime -p 2>/dev/null | sed 's/^up //')
[ -z "$UPTIME" ] && UPTIME=""
}
push_metrics() {
local payload
payload=$(cat <<EOF
{
"agent_key": "$AGENT_KEY",
"cpu": $CPU,
"ram": $RAM,
"disk": $DISK,
"load": $LOAD,
"uptime": "$UPTIME"
}
EOF
)
curl -s -X POST "$SERVER_URL/api/metrics/push" \
-H "Content-Type: application/json" \
-d "$payload" \
--connect-timeout 10 \
--max-time 30 \
-o /dev/null -w "%{http_code}" 2>/dev/null || echo "000"
}
main() {
load_config
if [ -z "$SERVER_URL" ] || [ -z "$AGENT_KEY" ]; then
echo "ERROR: SERVER_URL and AGENT_KEY must be set in $CONFIG_FILE"
exit 1
fi
echo "ServerManager Agent started"
echo "Server: $SERVER_URL"
echo "Interval: ${INTERVAL}s"
sleep 5
while true; do
collect_metrics
http_code=$(push_metrics)
if [ "$http_code" = "200" ]; then
echo "[$(date)] Metrics pushed successfully"
else
echo "[$(date)] Failed to push metrics (HTTP $http_code)"
fi
sleep "$INTERVAL"
done
}
main