367 lines
9.7 KiB
Bash
367 lines
9.7 KiB
Bash
|
|
#!/bin/bash
|
|
|
|
# CheckCle Regional Monitoring Agent - Universal Installation Script
|
|
# This script automatically detects system architecture and installs the appropriate package
|
|
# Usage: curl -fsSL https://raw.githubusercontent.com/operacle/checkcle/main/scripts/install-regional-agent.sh | sudo bash -s -- [options]
|
|
|
|
set -e
|
|
|
|
# Default values
|
|
REGION_NAME=""
|
|
AGENT_ID=""
|
|
AGENT_IP_ADDRESS=""
|
|
AGENT_TOKEN=""
|
|
POCKETBASE_URL=""
|
|
BASE_PACKAGE_URL="https://github.com/operacle/Distributed-Regional-Monitoring/releases/download/V1.0.0"
|
|
PACKAGE_VERSION="1.0.0"
|
|
SERVICE_NAME="regional-check-agent"
|
|
|
|
# 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"
|
|
}
|
|
|
|
# Function to show usage
|
|
show_usage() {
|
|
echo "Usage: $0 [OPTIONS]"
|
|
echo ""
|
|
echo "Options:"
|
|
echo " --region-name=NAME Set the region name (required)"
|
|
echo " --agent-id=ID Set the agent ID (required)"
|
|
echo " --agent-ip=IP Set the agent IP address (required)"
|
|
echo " --token=TOKEN Set the authentication token (required)"
|
|
echo " --pocketbase-url=URL Set the PocketBase API URL (required)"
|
|
echo " --package-version=VER Set package version (default: $PACKAGE_VERSION)"
|
|
echo " --help Show this help message"
|
|
echo ""
|
|
echo "Example:"
|
|
echo " $0 --region-name=\"us-east-1\" --agent-id=\"agent_abc123\" \\"
|
|
echo " --agent-ip=\"192.168.1.100\" --token=\"your-token\" \\"
|
|
echo " --pocketbase-url=\"https://your-pb.com\""
|
|
}
|
|
|
|
# Parse command line arguments
|
|
while [[ $# -gt 0 ]]; do
|
|
case $1 in
|
|
--region-name=*)
|
|
REGION_NAME="${1#*=}"
|
|
shift
|
|
;;
|
|
--agent-id=*)
|
|
AGENT_ID="${1#*=}"
|
|
shift
|
|
;;
|
|
--agent-ip=*)
|
|
AGENT_IP_ADDRESS="${1#*=}"
|
|
shift
|
|
;;
|
|
--token=*)
|
|
AGENT_TOKEN="${1#*=}"
|
|
shift
|
|
;;
|
|
--pocketbase-url=*)
|
|
POCKETBASE_URL="${1#*=}"
|
|
shift
|
|
;;
|
|
--package-version=*)
|
|
PACKAGE_VERSION="${1#*=}"
|
|
shift
|
|
;;
|
|
--help)
|
|
show_usage
|
|
exit 0
|
|
;;
|
|
*)
|
|
echo "Unknown option: $1"
|
|
show_usage
|
|
exit 1
|
|
;;
|
|
esac
|
|
done
|
|
|
|
# Validate required parameters
|
|
if [[ -z "$REGION_NAME" || -z "$AGENT_ID" || -z "$AGENT_IP_ADDRESS" || -z "$AGENT_TOKEN" || -z "$POCKETBASE_URL" ]]; then
|
|
log_error "Missing required parameters"
|
|
echo ""
|
|
show_usage
|
|
exit 1
|
|
fi
|
|
|
|
echo "============================================="
|
|
echo " CheckCle Regional Monitoring Agent"
|
|
echo " Universal Installation"
|
|
echo "============================================="
|
|
|
|
# Check if running as root
|
|
if [[ $EUID -ne 0 ]]; then
|
|
log_error "This script must be run as root (use sudo)"
|
|
echo " Usage: sudo bash $0 [options]"
|
|
exit 1
|
|
fi
|
|
|
|
# Detect operating system
|
|
OS_TYPE=$(uname -s | tr '[:upper:]' '[:lower:]')
|
|
|
|
# Check if it's a supported OS
|
|
if [[ "$OS_TYPE" != "linux" ]]; then
|
|
log_error "Unsupported operating system: $OS_TYPE"
|
|
log_info "This installer only supports Linux systems"
|
|
exit 1
|
|
fi
|
|
|
|
# Detect architecture
|
|
ARCH=$(uname -m)
|
|
|
|
# Map architecture to package architecture
|
|
case $ARCH in
|
|
x86_64|amd64)
|
|
PKG_ARCH="amd64"
|
|
;;
|
|
aarch64|arm64)
|
|
PKG_ARCH="arm64"
|
|
;;
|
|
armv7l|armv6l)
|
|
PKG_ARCH="arm64"
|
|
log_warning "ARM 32-bit detected, using ARM64 package (may require compatibility layer)"
|
|
;;
|
|
*)
|
|
log_error "Unsupported architecture: $ARCH"
|
|
log_info "Supported architectures: x86_64 (amd64), aarch64 (arm64)"
|
|
exit 1
|
|
;;
|
|
esac
|
|
|
|
log_success "System: $OS_TYPE ($ARCH -> $PKG_ARCH)"
|
|
|
|
# Construct package URLs and names
|
|
PACKAGE_URL="$BASE_PACKAGE_URL/distributed-regional-check-agent_${PACKAGE_VERSION}_${PKG_ARCH}.deb"
|
|
PACKAGE_NAME="distributed-regional-check-agent_${PACKAGE_VERSION}_${PKG_ARCH}.deb"
|
|
|
|
# Check for required tools
|
|
MISSING_TOOLS=()
|
|
|
|
if ! command -v wget >/dev/null 2>&1 && ! command -v curl >/dev/null 2>&1; then
|
|
MISSING_TOOLS+=("wget or curl")
|
|
fi
|
|
|
|
if ! command -v dpkg >/dev/null 2>&1; then
|
|
MISSING_TOOLS+=("dpkg")
|
|
fi
|
|
|
|
if ! command -v systemctl >/dev/null 2>&1; then
|
|
MISSING_TOOLS+=("systemd")
|
|
fi
|
|
|
|
if [ ${#MISSING_TOOLS[@]} -ne 0 ]; then
|
|
log_error "Missing required tools: ${MISSING_TOOLS[*]}"
|
|
log_info "On Debian/Ubuntu: sudo apt-get update && sudo apt-get install wget curl"
|
|
exit 1
|
|
fi
|
|
|
|
# Create temporary directory
|
|
TEMP_DIR=$(mktemp -d)
|
|
|
|
# Download the .deb package
|
|
log_info "Downloading package for $PKG_ARCH..."
|
|
cd "$TEMP_DIR"
|
|
|
|
# Test if package exists first
|
|
if command -v curl >/dev/null 2>&1; then
|
|
HTTP_STATUS=$(curl -s -o /dev/null -w "%{http_code}" -I "$PACKAGE_URL")
|
|
if [ "$HTTP_STATUS" != "200" ] && [ "$HTTP_STATUS" != "302" ]; then
|
|
log_error "Package not found at $PACKAGE_URL (HTTP $HTTP_STATUS)"
|
|
log_info "Check: https://github.com/operacle/Distributed-Regional-Monitoring/releases"
|
|
rm -rf "$TEMP_DIR"
|
|
exit 1
|
|
fi
|
|
fi
|
|
|
|
# Try wget first, then curl as fallback
|
|
DOWNLOAD_SUCCESS=false
|
|
|
|
if command -v wget >/dev/null 2>&1; then
|
|
if wget -q --show-progress --timeout=30 --tries=3 "$PACKAGE_URL" -O "$PACKAGE_NAME"; then
|
|
DOWNLOAD_SUCCESS=true
|
|
fi
|
|
fi
|
|
|
|
if [ "$DOWNLOAD_SUCCESS" = false ] && command -v curl >/dev/null 2>&1; then
|
|
if curl -L --connect-timeout 30 --max-time 300 --retry 3 --retry-delay 2 -o "$PACKAGE_NAME" "$PACKAGE_URL" --progress-bar; then
|
|
DOWNLOAD_SUCCESS=true
|
|
fi
|
|
fi
|
|
|
|
if [ "$DOWNLOAD_SUCCESS" = false ]; then
|
|
log_error "Failed to download package from $PACKAGE_URL"
|
|
log_info "Check internet connection and package availability"
|
|
rm -rf "$TEMP_DIR"
|
|
exit 1
|
|
fi
|
|
|
|
# Verify download was successful
|
|
if [ ! -f "$PACKAGE_NAME" ] || [ ! -s "$PACKAGE_NAME" ]; then
|
|
log_error "Downloaded package is empty or missing"
|
|
rm -rf "$TEMP_DIR"
|
|
exit 1
|
|
fi
|
|
|
|
# Verify package integrity
|
|
if dpkg-deb --info "$PACKAGE_NAME" > /dev/null 2>&1; then
|
|
log_success "Package verified"
|
|
else
|
|
log_error "Package verification failed - corrupted download"
|
|
rm -rf "$TEMP_DIR"
|
|
exit 1
|
|
fi
|
|
|
|
# Install the package
|
|
log_info "Installing package..."
|
|
if dpkg -i "$PACKAGE_NAME" 2>/dev/null; then
|
|
log_success "Package installed"
|
|
else
|
|
log_warning "Fixing dependencies..."
|
|
if apt-get update && apt-get install -f -y; then
|
|
log_success "Package installed with dependencies"
|
|
else
|
|
log_error "Failed to install package"
|
|
log_info "Try: sudo apt-get update && sudo apt-get install -f"
|
|
rm -rf "$TEMP_DIR"
|
|
exit 1
|
|
fi
|
|
fi
|
|
|
|
# Configure the agent
|
|
log_info "Configuring agent..."
|
|
|
|
# Ensure configuration directory exists
|
|
mkdir -p /etc/regional-check-agent
|
|
|
|
# Create the environment configuration file
|
|
cat > /etc/regional-check-agent/regional-check-agent.env << EOF
|
|
# Distributed Regional Check Agent Configuration
|
|
# Auto-generated on $(date)
|
|
|
|
# Server Configuration
|
|
PORT=8091
|
|
|
|
# Operation defaults
|
|
DEFAULT_COUNT=4
|
|
DEFAULT_TIMEOUT=10s
|
|
MAX_COUNT=20
|
|
MAX_TIMEOUT=30s
|
|
|
|
# Logging
|
|
ENABLE_LOGGING=true
|
|
|
|
# PocketBase integration
|
|
POCKETBASE_ENABLED=true
|
|
POCKETBASE_URL=$POCKETBASE_URL
|
|
|
|
# Regional Agent Configuration
|
|
REGION_NAME=$REGION_NAME
|
|
AGENT_ID=$AGENT_ID
|
|
AGENT_IP_ADDRESS=$AGENT_IP_ADDRESS
|
|
AGENT_TOKEN=$AGENT_TOKEN
|
|
|
|
# Monitoring configuration
|
|
CHECK_INTERVAL=30s
|
|
MAX_RETRIES=3
|
|
REQUEST_TIMEOUT=10s
|
|
EOF
|
|
|
|
# Set proper permissions
|
|
if id "regional-check-agent" &>/dev/null; then
|
|
chown root:regional-check-agent /etc/regional-check-agent/regional-check-agent.env
|
|
chmod 640 /etc/regional-check-agent/regional-check-agent.env
|
|
else
|
|
chown root:root /etc/regional-check-agent/regional-check-agent.env
|
|
chmod 600 /etc/regional-check-agent/regional-check-agent.env
|
|
fi
|
|
|
|
log_success "Configuration complete"
|
|
|
|
# Enable and start the service
|
|
log_info "Starting service..."
|
|
|
|
# Reload systemd daemon
|
|
systemctl daemon-reload
|
|
|
|
# Enable the service for auto-start
|
|
if systemctl enable $SERVICE_NAME; then
|
|
log_success "Service enabled"
|
|
else
|
|
log_error "Failed to enable service"
|
|
rm -rf "$TEMP_DIR"
|
|
exit 1
|
|
fi
|
|
|
|
# Start the service
|
|
if systemctl start $SERVICE_NAME; then
|
|
log_success "Service started"
|
|
else
|
|
log_error "Failed to start service"
|
|
log_info "Check logs: sudo journalctl -u $SERVICE_NAME -f"
|
|
rm -rf "$TEMP_DIR"
|
|
exit 1
|
|
fi
|
|
|
|
# Wait a moment for service to initialize
|
|
sleep 5
|
|
|
|
# Test health endpoint
|
|
HEALTH_CHECK_ATTEMPTS=3
|
|
for i in $(seq 1 $HEALTH_CHECK_ATTEMPTS); do
|
|
if curl -s -f --connect-timeout 5 http://localhost:8091/health > /dev/null; then
|
|
log_success "Health endpoint responding"
|
|
break
|
|
else
|
|
if [ $i -lt $HEALTH_CHECK_ATTEMPTS ]; then
|
|
sleep 2
|
|
else
|
|
log_warning "Health endpoint not responding (service may still be starting)"
|
|
fi
|
|
fi
|
|
done
|
|
|
|
# Cleanup
|
|
rm -rf "$TEMP_DIR"
|
|
|
|
echo ""
|
|
echo "============================================="
|
|
echo " Installation Complete!"
|
|
echo "============================================="
|
|
echo ""
|
|
log_success "CheckCle Regional Monitoring Agent installed successfully"
|
|
echo ""
|
|
echo "Agent Details:"
|
|
echo " Region: $REGION_NAME"
|
|
echo " Agent ID: $AGENT_ID"
|
|
echo " Status: $(systemctl is-active $SERVICE_NAME 2>/dev/null || echo 'unknown')"
|
|
echo " Health: http://localhost:8091/health"
|
|
echo ""
|
|
echo "Management Commands:"
|
|
echo " Status: sudo systemctl status $SERVICE_NAME"
|
|
echo " Logs: sudo journalctl -u $SERVICE_NAME -f"
|
|
echo " Restart: sudo systemctl restart $SERVICE_NAME"
|
|
echo ""
|
|
log_success "Agent is now monitoring and reporting to your dashboard!" |