Files
2026-07-13 12:31:02 +08:00

753 lines
25 KiB
Bash

#!/bin/bash
# CheckCle Server Monitoring Agent - One-Click Installation Script
# This script provides fully automated installation using environment variables
set -e
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
CONFIG_FILE="/etc/monitoring-agent/monitoring-agent.env"
# GitHub release base URL
GITHUB_BASE_URL="https://github.com/operacle/checke-server-agent/releases/download/v1.0.0"
# Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# Helper functions
log_info() {
echo -e "${BLUE}[INFO]${NC} $1"
}
log_success() {
echo -e "${GREEN}[SUCCESS]${NC} $1"
}
log_warning() {
echo -e "${YELLOW}[WARNING]${NC} $1"
}
log_error() {
echo -e "${RED}[ERROR]${NC} $1"
}
# Check if running as root
check_root() {
if [[ $EUID -ne 0 ]]; then
log_error "This script must be run as root (use sudo)"
exit 1
fi
}
# Detect system architecture and package format with fallback
detect_system() {
log_info "Detecting system architecture and package format..."
# Detect architecture
ARCH=$(uname -m)
case $ARCH in
x86_64)
PACKAGE_ARCH="amd64"
;;
aarch64|arm64)
PACKAGE_ARCH="arm64"
;;
*)
log_error "Unsupported architecture: $ARCH"
log_info "Supported architectures: x86_64 (amd64), aarch64/arm64"
exit 1
;;
esac
# Detect OS and preferred package format
PREFERRED_FORMAT=""
PREFERRED_MANAGER=""
if [[ -f /etc/os-release ]]; then
OS_ID=$(grep "^ID=" /etc/os-release | cut -d'=' -f2 | tr -d '"')
OS_LIKE=$(grep "^ID_LIKE=" /etc/os-release 2>/dev/null | cut -d'=' -f2 | tr -d '"' || echo "")
log_info "Detected OS: $OS_ID"
[[ -n "$OS_LIKE" ]] && log_info "OS family: $OS_LIKE"
# Determine preferred package format based on OS
case "$OS_ID" in
debian|ubuntu|linuxmint|elementary|pop)
PREFERRED_FORMAT="deb"
PREFERRED_MANAGER="dpkg"
;;
rhel|centos|fedora|rocky|almalinux|oracle|amazonlinux)
PREFERRED_FORMAT="rpm"
if command -v dnf >/dev/null 2>&1; then
PREFERRED_MANAGER="dnf"
elif command -v yum >/dev/null 2>&1; then
PREFERRED_MANAGER="yum"
else
PREFERRED_MANAGER="rpm"
fi
;;
arch|manjaro|artix|endeavouros)
# Arch-based systems - use tar.gz fallback
log_info "Arch-based system detected, using tar.gz format"
PREFERRED_FORMAT="tar.gz"
PREFERRED_MANAGER="tar"
;;
*)
# Check OS_LIKE for family detection
if [[ "$OS_LIKE" == *"debian"* ]] || [[ "$OS_LIKE" == *"ubuntu"* ]]; then
PREFERRED_FORMAT="deb"
PREFERRED_MANAGER="dpkg"
elif [[ "$OS_LIKE" == *"rhel"* ]] || [[ "$OS_LIKE" == *"fedora"* ]]; then
PREFERRED_FORMAT="rpm"
if command -v dnf >/dev/null 2>&1; then
PREFERRED_MANAGER="dnf"
elif command -v yum >/dev/null 2>&1; then
PREFERRED_MANAGER="yum"
else
PREFERRED_MANAGER="rpm"
fi
elif [[ "$OS_LIKE" == *"arch"* ]]; then
PREFERRED_FORMAT="tar.gz"
PREFERRED_MANAGER="tar"
fi
;;
esac
fi
# If no preferred format detected, check available package managers
if [[ -z "$PREFERRED_FORMAT" ]]; then
if command -v dpkg >/dev/null 2>&1; then
PREFERRED_FORMAT="deb"
PREFERRED_MANAGER="dpkg"
elif command -v rpm >/dev/null 2>&1; then
PREFERRED_FORMAT="rpm"
if command -v dnf >/dev/null 2>&1; then
PREFERRED_MANAGER="dnf"
elif command -v yum >/dev/null 2>&1; then
PREFERRED_MANAGER="yum"
else
PREFERRED_MANAGER="rpm"
fi
else
# Fallback to tar.gz for unsupported systems
log_info "No native package manager found, using tar.gz fallback"
PREFERRED_FORMAT="tar.gz"
PREFERRED_MANAGER="tar"
fi
fi
# Set initial package format and manager
PACKAGE_FORMAT="$PREFERRED_FORMAT"
PACKAGE_MANAGER="$PREFERRED_MANAGER"
# Construct initial package filename and URL
construct_package_url
log_success "System detection complete:"
log_info " Architecture: $ARCH -> $PACKAGE_ARCH"
log_info " Package format: $PACKAGE_FORMAT"
log_info " Package manager: $PACKAGE_MANAGER"
log_info " Package URL: $PACKAGE_URL"
}
# Construct package URL based on current format
construct_package_url() {
if [[ "$PACKAGE_FORMAT" == "tar.gz" ]]; then
PACKAGE_FILENAME="monitoring-agent_1.0.0_${PACKAGE_ARCH}.tar.gz"
else
PACKAGE_FILENAME="monitoring-agent_1.0.0_${PACKAGE_ARCH}.${PACKAGE_FORMAT}"
fi
PACKAGE_URL="${GITHUB_BASE_URL}/${PACKAGE_FILENAME}"
}
# Validate required environment variables - check both current and sudo environments
validate_environment() {
# Check if SERVER_TOKEN is available in current environment or passed as argument
if [[ -z "$SERVER_TOKEN" ]]; then
log_error "SERVER_TOKEN environment variable is required"
log_info "Usage examples:"
log_info " SERVER_TOKEN=your-token sudo -E bash $0"
log_info " sudo SERVER_TOKEN=your-token bash $0"
log_info " curl -L script-url | SERVER_TOKEN=your-token sudo bash"
log_info ""
log_info "Required: SERVER_TOKEN"
log_info "Optional: POCKETBASE_URL, SERVER_NAME, AGENT_ID, HEALTH_CHECK_PORT"
exit 1
fi
log_success "Environment validation passed"
log_info "SERVER_TOKEN: ${SERVER_TOKEN:0:8}..."
[[ -n "$POCKETBASE_URL" ]] && log_info "POCKETBASE_URL: $POCKETBASE_URL"
[[ -n "$SERVER_NAME" ]] && log_info "SERVER_NAME: $SERVER_NAME"
[[ -n "$AGENT_ID" ]] && log_info "AGENT_ID: $AGENT_ID"
}
# Download package with fallback to tar.gz
download_package() {
local temp_dir="/tmp/monitoring-agent-install"
mkdir -p "$temp_dir"
log_info "Downloading monitoring agent package..."
log_info "URL: $PACKAGE_URL"
# Try to download the preferred package format first
if curl -L -f -s -o "$temp_dir/$PACKAGE_FILENAME" "$PACKAGE_URL" 2>/dev/null; then
# Verify the file was actually downloaded and has content
if [[ -s "$temp_dir/$PACKAGE_FILENAME" ]]; then
DOWNLOADED_PACKAGE="$temp_dir/$PACKAGE_FILENAME"
log_success "Package downloaded successfully: $PACKAGE_FILENAME"
return 0
else
log_warning "Downloaded file is empty, trying fallback..."
rm -f "$temp_dir/$PACKAGE_FILENAME"
fi
else
log_warning "Failed to download preferred package format: $PACKAGE_FORMAT"
fi
# If preferred format failed and it's not tar.gz, try tar.gz fallback
if [[ "$PACKAGE_FORMAT" != "tar.gz" ]]; then
log_warning "Native package ($PACKAGE_FORMAT) not available, trying tar.gz fallback..."
# Switch to tar.gz format
PACKAGE_FORMAT="tar.gz"
PACKAGE_MANAGER="tar"
construct_package_url
log_info "Fallback URL: $PACKAGE_URL"
if curl -L -f -s -o "$temp_dir/$PACKAGE_FILENAME" "$PACKAGE_URL" 2>/dev/null; then
# Verify the file was actually downloaded and has content
if [[ -s "$temp_dir/$PACKAGE_FILENAME" ]]; then
DOWNLOADED_PACKAGE="$temp_dir/$PACKAGE_FILENAME"
log_success "Fallback package downloaded successfully: $PACKAGE_FILENAME"
return 0
else
log_error "Downloaded fallback file is empty"
rm -f "$temp_dir/$PACKAGE_FILENAME"
fi
else
log_error "Failed to download tar.gz fallback"
fi
fi
# Both attempts failed
log_error "Failed to download package from: $PACKAGE_URL"
log_info "Please check:"
log_info " 1. Internet connectivity"
log_info " 2. Package availability for your architecture ($PACKAGE_ARCH)"
log_info " 3. GitHub repository access"
exit 1
}
# Install tar.gz package
install_tar_package() {
log_info "Installing monitoring agent from tar.gz package..."
local temp_extract_dir="/tmp/monitoring-agent-extract"
mkdir -p "$temp_extract_dir"
# Extract tar.gz package
if tar -xzf "$DOWNLOADED_PACKAGE" -C "$temp_extract_dir"; then
log_success "Package extracted successfully"
else
log_error "Failed to extract tar.gz package"
exit 1
fi
# Install files to their proper locations
log_info "Installing files to system directories..."
# Create necessary directories
mkdir -p /usr/bin
mkdir -p /etc/monitoring-agent
mkdir -p /var/lib/monitoring-agent
mkdir -p /var/log/monitoring-agent
# Detect systemd service directory based on OS
if [[ -d /lib/systemd/system ]]; then
SYSTEMD_DIR="/lib/systemd/system"
elif [[ -d /usr/lib/systemd/system ]]; then
SYSTEMD_DIR="/usr/lib/systemd/system"
else
SYSTEMD_DIR="/etc/systemd/system"
fi
mkdir -p "$SYSTEMD_DIR"
# Copy files from extracted package
if [[ -f "$temp_extract_dir/usr/bin/monitoring-agent" ]]; then
cp "$temp_extract_dir/usr/bin/monitoring-agent" /usr/bin/
chmod +x /usr/bin/monitoring-agent
log_success "Binary installed to /usr/bin/monitoring-agent"
else
log_error "Binary not found in package"
exit 1
fi
if [[ -f "$temp_extract_dir/etc/monitoring-agent/monitoring-agent.env" ]]; then
cp "$temp_extract_dir/etc/monitoring-agent/monitoring-agent.env" /etc/monitoring-agent/
log_success "Configuration template installed"
fi
# Create monitoring-agent user and group if they don't exist
if ! getent group monitoring-agent >/dev/null 2>&1; then
groupadd --system monitoring-agent
log_success "Created monitoring-agent group"
else
log_info "monitoring-agent group already exists"
fi
if ! getent passwd monitoring-agent >/dev/null 2>&1; then
useradd --system --gid monitoring-agent --home-dir /var/lib/monitoring-agent --shell /bin/false --comment "Monitoring Agent" monitoring-agent
log_success "Created monitoring-agent user"
else
log_info "monitoring-agent user already exists"
fi
# Set proper ownership and permissions
chown -R monitoring-agent:monitoring-agent /var/lib/monitoring-agent
chown -R monitoring-agent:monitoring-agent /var/log/monitoring-agent
chown -R monitoring-agent:monitoring-agent /etc/monitoring-agent
chmod 755 /var/lib/monitoring-agent
chmod 755 /var/log/monitoring-agent
chmod 755 /etc/monitoring-agent
# Check if Docker is installed and configure service file accordingly
DOCKER_AVAILABLE=false
if command -v docker >/dev/null 2>&1 && getent group docker >/dev/null 2>&1; then
DOCKER_AVAILABLE=true
# Add monitoring-agent user to docker group if Docker is available
usermod -a -G docker monitoring-agent
log_info "Docker detected, added monitoring-agent user to docker group"
else
log_info "Docker not detected, skipping Docker group configuration"
fi
# Create the systemd service file with proper Docker configuration
create_systemd_service_file "$SYSTEMD_DIR" "$DOCKER_AVAILABLE"
# Clean up extraction directory
rm -rf "$temp_extract_dir"
log_success "Tar.gz package installation completed"
}
# Create systemd service file with Docker configuration
create_systemd_service_file() {
local systemd_dir="$1"
local docker_available="$2"
log_info "Creating systemd service file at $systemd_dir/monitoring-agent.service"
cat > "$systemd_dir/monitoring-agent.service" << 'EOF'
[Unit]
Description=CheckCle Server Monitoring Agent
Documentation=https://github.com/operacle/checkcle-server-agent
After=network.target
Wants=network.target
[Service]
Type=simple
User=monitoring-agent
Group=monitoring-agent
EOF
# Add Docker group only if Docker is available
if [[ "$docker_available" == "true" ]]; then
echo "# Add docker group for Docker monitoring access" >> "$systemd_dir/monitoring-agent.service"
echo "SupplementaryGroups=docker" >> "$systemd_dir/monitoring-agent.service"
else
echo "# Docker not available - skipping Docker group configuration" >> "$systemd_dir/monitoring-agent.service"
fi
# Continue with the rest of the service configuration
cat >> "$systemd_dir/monitoring-agent.service" << 'EOF'
ExecStart=/usr/bin/monitoring-agent
Restart=always
RestartSec=10
StandardOutput=journal
StandardError=journal
# Security settings
NoNewPrivileges=yes
ProtectSystem=strict
ProtectHome=yes
PrivateTmp=yes
ProtectKernelTunables=yes
ProtectControlGroups=yes
RestrictSUIDSGID=yes
RemoveIPC=yes
RestrictRealtime=yes
# Allow access to system information and configuration
ReadWritePaths=/var/log/monitoring-agent
ReadOnlyPaths=/proc /sys /etc/monitoring-agent
# Network access
PrivateNetwork=no
# Environment
EnvironmentFile=/etc/monitoring-agent/monitoring-agent.env
WorkingDirectory=/var/lib/monitoring-agent
[Install]
WantedBy=multi-user.target
EOF
log_success "Created systemd service file with Docker support: $docker_available"
}
# Install package based on detected package manager
install_package() {
log_info "Installing monitoring agent package using $PACKAGE_MANAGER..."
case $PACKAGE_MANAGER in
dpkg)
# Update package lists
apt-get update -qq
# Install the package
if dpkg -i "$DOWNLOADED_PACKAGE" 2>/dev/null; then
log_success "DEB package installed successfully"
else
log_warning "Package installation had dependency issues, fixing..."
apt-get install -f -y
log_success "Dependencies resolved and package installed"
fi
;;
rpm)
# Install the package directly
if rpm -ivh "$DOWNLOADED_PACKAGE" 2>/dev/null; then
log_success "RPM package installed successfully"
else
log_error "RPM package installation failed"
log_info "Try installing manually: sudo rpm -ivh $DOWNLOADED_PACKAGE"
exit 1
fi
;;
yum)
if yum localinstall -y "$DOWNLOADED_PACKAGE"; then
log_success "Package installed successfully via YUM"
else
log_error "YUM package installation failed"
exit 1
fi
;;
dnf)
if dnf localinstall -y "$DOWNLOADED_PACKAGE"; then
log_success "Package installed successfully via DNF"
else
log_error "DNF package installation failed"
exit 1
fi
;;
tar)
install_tar_package
;;
*)
log_error "Unsupported package manager: $PACKAGE_MANAGER"
exit 1
;;
esac
}
# Auto-detect system information
detect_system_info() {
log_info "Auto-detecting system information..."
# Detect hostname
DETECTED_HOSTNAME=$(hostname)
log_info "Detected hostname: $DETECTED_HOSTNAME"
# Detect IP address
DETECTED_IP=$(ip route get 8.8.8.8 2>/dev/null | head -1 | awk '{print $7}' | head -1)
if [[ -z "$DETECTED_IP" ]]; then
DETECTED_IP=$(hostname -I | awk '{print $1}')
fi
log_info "Detected IP address: $DETECTED_IP"
# Detect OS
if [[ -f /etc/os-release ]]; then
DETECTED_OS=$(grep "^ID=" /etc/os-release | cut -d'=' -f2 | tr -d '"')
else
DETECTED_OS="linux"
fi
log_info "Detected OS: $DETECTED_OS"
}
# Configure agent using environment variables
configure_agent() {
log_info "Configuring agent with provided settings..."
# Use environment variables or auto-detected defaults
SERVER_NAME="${SERVER_NAME:-$DETECTED_HOSTNAME}"
POCKETBASE_URL="${POCKETBASE_URL:-http://localhost:8090}"
IP_ADDRESS="${IP_ADDRESS:-$DETECTED_IP}"
HOSTNAME="${HOSTNAME:-$DETECTED_HOSTNAME}"
OS_TYPE="${OS_TYPE:-$DETECTED_OS}"
AGENT_ID="${AGENT_ID:-monitoring-agent-$(hostname -s)}"
HEALTH_CHECK_PORT="${HEALTH_CHECK_PORT:-8081}"
log_info "Final configuration:"
log_info " Server Name: $SERVER_NAME"
log_info " Agent ID: $AGENT_ID"
log_info " PocketBase URL: $POCKETBASE_URL"
log_info " IP Address: $IP_ADDRESS"
log_info " OS Type: $OS_TYPE"
log_info " Health Check Port: $HEALTH_CHECK_PORT"
write_config
}
# Write configuration to file
write_config() {
log_info "Writing configuration to $CONFIG_FILE..."
# Create directory if it doesn't exist
mkdir -p "$(dirname "$CONFIG_FILE")"
cat > "$CONFIG_FILE" << EOF
# CheckCle Server Monitoring Agent Configuration
# Generated on $(date)
# Basic Configuration
AGENT_ID=$AGENT_ID
CHECK_INTERVAL=30s
HEALTH_CHECK_PORT=$HEALTH_CHECK_PORT
# PocketBase Configuration
POCKETBASE_ENABLED=true
POCKETBASE_URL=$POCKETBASE_URL
# Server Configuration
SERVER_NAME=$SERVER_NAME
HOSTNAME=$HOSTNAME
IP_ADDRESS=$IP_ADDRESS
OS_TYPE=$OS_TYPE
SERVER_TOKEN=$SERVER_TOKEN
# Remote Control
REMOTE_CONTROL_ENABLED=true
COMMAND_CHECK_INTERVAL=10s
# Monitoring Settings
REPORT_INTERVAL=5m
MAX_RETRIES=3
REQUEST_TIMEOUT=10s
EOF
# Set proper permissions
chown root:monitoring-agent "$CONFIG_FILE" 2>/dev/null || chown root:root "$CONFIG_FILE"
chmod 640 "$CONFIG_FILE"
log_success "Configuration written successfully"
}
# Start and enable service
start_service() {
log_info "Starting monitoring agent service..."
# Reload systemd
systemctl daemon-reload
# Enable service
systemctl enable monitoring-agent
log_success "Service enabled for auto-start"
# Start service
if systemctl start monitoring-agent; then
log_success "Service started successfully"
else
log_error "Failed to start service"
log_info "Check logs with: journalctl -u monitoring-agent -f"
return 1
fi
# Check service status
sleep 2
if systemctl is-active --quiet monitoring-agent; then
log_success "Service is running"
else
log_warning "Service may have issues, checking status..."
systemctl status monitoring-agent --no-pager
return 1
fi
}
# Test installation
test_installation() {
log_info "Testing installation..."
# Test health endpoint
local health_port=${HEALTH_CHECK_PORT:-8081}
log_info "Testing health endpoint at http://localhost:$health_port/health"
# Wait a moment for service to fully start
sleep 3
if curl -s "http://localhost:$health_port/health" > /dev/null; then
log_success "Health endpoint is responding"
else
log_warning "Health endpoint not responding yet (service may still be starting)"
fi
# Show recent logs
log_info "Recent service logs:"
journalctl -u monitoring-agent --no-pager -n 5
}
# Show post-installation information
show_post_install_info() {
echo
echo "============================================="
echo " Installation Complete!"
echo "============================================="
echo
log_success "CheckCle Monitoring Agent installed and configured successfully"
echo
echo "System Information:"
echo " Architecture: $ARCH ($PACKAGE_ARCH)"
echo " Package: $PACKAGE_FILENAME"
echo " Package Manager: $PACKAGE_MANAGER"
if [[ "$PACKAGE_FORMAT" == "tar.gz" ]]; then
echo " Installation Type: Manual (tar.gz)"
else
echo " Installation Type: Native package ($PACKAGE_FORMAT)"
fi
echo
echo "Configuration: $CONFIG_FILE"
echo "Service status: systemctl status monitoring-agent"
echo "Service logs: journalctl -u monitoring-agent -f"
echo "Health check: curl http://localhost:${HEALTH_CHECK_PORT:-8081}/health"
echo
echo "The monitoring agent is now running and will appear in your dashboard."
echo
}
# Clean up temporary files
cleanup() {
if [[ -n "$DOWNLOADED_PACKAGE" && -f "$DOWNLOADED_PACKAGE" ]]; then
rm -f "$DOWNLOADED_PACKAGE"
rm -rf "$(dirname "$DOWNLOADED_PACKAGE")"
fi
}
# Main installation function
main() {
echo "============================================="
echo " CheckCle Server Monitoring Agent"
echo " One-Click Installation"
echo "============================================="
echo
check_root
validate_environment
detect_system
detect_system_info
log_info "Starting automated installation..."
# Set up cleanup trap
trap cleanup EXIT
# Download and install package
download_package
install_package
# Configure and start service
configure_agent
if start_service; then
test_installation
show_post_install_info
else
log_error "Service failed to start properly"
log_info "Check configuration: sudo nano $CONFIG_FILE"
log_info "Restart service: sudo systemctl restart monitoring-agent"
exit 1
fi
}
# Handle script arguments
case "${1:-}" in
--help|-h)
echo "CheckCle Server Monitoring Agent - One-Click Installer"
echo
echo "Usage: SERVER_TOKEN=your-token [OPTIONS] sudo bash $0"
echo " or: sudo SERVER_TOKEN=your-token [OPTIONS] bash $0"
echo " or: curl -L script-url | SERVER_TOKEN=your-token [OPTIONS] sudo bash"
echo
echo "System Requirements:"
echo " - Linux with systemd"
echo " - Supported architectures: x86_64 (amd64), aarch64/arm64"
echo " - Supported distributions: Debian/Ubuntu (.deb), RHEL/CentOS/Fedora (.rpm), or any Linux (tar.gz fallback)"
echo
echo "Package Installation Logic:"
echo " 1. Detects OS and tries native package format first (.deb for Debian-based, .rpm for RHEL-based)"
echo " 2. If native package is not available, automatically falls back to tar.gz"
echo " 3. tar.gz works on any Linux distribution with systemd"
echo
echo "Required Environment Variables:"
echo " SERVER_TOKEN Server authentication token"
echo
echo "Optional Environment Variables:"
echo " POCKETBASE_URL PocketBase URL (default: http://localhost:8090)"
echo " SERVER_NAME Server name (default: hostname)"
echo " AGENT_ID Agent identifier (default: monitoring-agent-hostname)"
echo " HEALTH_CHECK_PORT Health check port (default: 8081)"
echo
echo "Examples:"
echo " SERVER_TOKEN=abc123 sudo -E bash $0"
echo " sudo SERVER_TOKEN=abc123 POCKETBASE_URL=https://pb.example.com bash $0"
echo
echo "Options:"
echo " --help, -h Show this help message"
echo " --uninstall Uninstall the monitoring agent"
echo
exit 0
;;
--uninstall)
check_root
log_info "Uninstalling monitoring agent..."
systemctl stop monitoring-agent 2>/dev/null || true
systemctl disable monitoring-agent 2>/dev/null || true
# Remove based on detected package manager
if command -v dpkg >/dev/null 2>&1 && dpkg -l monitoring-agent >/dev/null 2>&1; then
dpkg -r monitoring-agent 2>/dev/null || true
log_success "DEB package removed"
elif command -v rpm >/dev/null 2>&1 && rpm -q monitoring-agent >/dev/null 2>&1; then
rpm -e monitoring-agent 2>/dev/null || true
log_success "RPM package removed"
else
# Manual removal for tar.gz installations
log_info "Performing manual cleanup for tar.gz installation..."
rm -f /usr/bin/monitoring-agent 2>/dev/null || true
rm -rf /etc/monitoring-agent 2>/dev/null || true
rm -f /lib/systemd/system/monitoring-agent.service 2>/dev/null || true
rm -f /usr/lib/systemd/system/monitoring-agent.service 2>/dev/null || true
rm -f /etc/systemd/system/monitoring-agent.service 2>/dev/null || true
userdel monitoring-agent 2>/dev/null || true
groupdel monitoring-agent 2>/dev/null || true
rm -rf /var/lib/monitoring-agent 2>/dev/null || true
rm -rf /var/log/monitoring-agent 2>/dev/null || true
log_success "Manual cleanup completed"
fi
systemctl daemon-reload 2>/dev/null || true
log_success "Monitoring agent uninstalled"
exit 0
;;
*)
main "$@"
;;
esac