123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185 |
- #!/bin/bash
- # Health check script for apt-mirror2 container
- # This script monitors the health of nginx and apt-mirror2 services
- HEALTH_LOG="/var/log/health-check.log"
- NGINX_PID_FILE="/var/run/nginx.pid"
- MIRROR_LOCK_FILE="/var/run/apt-mirror.lock"
- HEALTH_STATUS_FILE="/var/run/health.status"
- # Function to log health check messages
- log_health() {
- echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> "$HEALTH_LOG"
- }
- # Function to check nginx status
- check_nginx() {
- if [ -f "$NGINX_PID_FILE" ]; then
- local pid=$(cat "$NGINX_PID_FILE")
- if kill -0 "$pid" 2>/dev/null; then
- # Check if nginx is listening on port 80
- if netstat -tlnp 2>/dev/null | grep -q ":80.*nginx" || ss -tlnp 2>/dev/null | grep -q ":80.*nginx"; then
- echo "nginx:running:$pid"
- return 0
- else
- echo "nginx:not_listening:$pid"
- return 1
- fi
- else
- echo "nginx:not_running:"
- return 1
- fi
- else
- echo "nginx:no_pid_file:"
- return 1
- fi
- }
- # Function to check apt-mirror2 status
- check_mirror() {
- if [ -f "$MIRROR_LOCK_FILE" ]; then
- local pid=$(cat "$MIRROR_LOCK_FILE")
- if kill -0 "$pid" 2>/dev/null; then
- echo "mirror:syncing:$pid"
- return 0
- else
- echo "mirror:stale_lock:$pid"
- return 1
- fi
- else
- echo "mirror:idle:"
- return 0
- fi
- }
- # Function to check disk usage
- check_disk() {
- local usage=$(df /var/spool/apt-mirror | tail -1 | awk '{print $5}' | sed 's/%//')
- echo "disk:$usage%"
- if [ "$usage" -gt 90 ]; then
- return 1
- fi
- return 0
- }
- # Function to check last sync time
- check_last_sync() {
- if [ -f "/var/spool/apt-mirror/last-sync.txt" ]; then
- local last_sync=$(cat "/var/spool/apt-mirror/last-sync.txt")
- echo "last_sync:$last_sync"
- else
- echo "last_sync:never"
- fi
- }
- # Function to get system uptime
- get_uptime() {
- local uptime=$(uptime -p 2>/dev/null || echo "unknown")
- echo "uptime:$uptime"
- }
- # Function to get memory usage
- get_memory() {
- local mem_info=$(free -m | grep Mem)
- local total=$(echo $mem_info | awk '{print $2}')
- local used=$(echo $mem_info | awk '{print $3}')
- local usage=$((used * 100 / total))
- echo "memory:${usage}%"
- }
- # Function to perform comprehensive health check
- do_health_check() {
- local status="healthy"
- local details=()
-
- # Check nginx
- local nginx_status=$(check_nginx)
- details+=("nginx:$nginx_status")
- if ! echo "$nginx_status" | grep -q "running"; then
- status="unhealthy"
- fi
-
- # Check mirror
- local mirror_status=$(check_mirror)
- details+=("mirror:$mirror_status")
-
- # Check disk
- local disk_status=$(check_disk)
- details+=("disk:$disk_status")
- if echo "$disk_status" | grep -q "9[0-9]%\|100%"; then
- status="warning"
- fi
-
- # Get additional info
- details+=("$(check_last_sync)")
- details+=("$(get_uptime)")
- details+=("$(get_memory)")
-
- # Write status to file
- cat > "$HEALTH_STATUS_FILE" << EOF
- {
- "status": "$status",
- "timestamp": "$(date -Iseconds)",
- "details": {
- $(printf '%s\n' "${details[@]}" | sed 's/:/": "/; s/$/"/; s/^/ "/; s/:/": "/')
- }
- }
- EOF
-
- echo "$status"
- }
- # Function to run continuous monitoring
- run_monitoring() {
- log_health "Starting health monitoring"
-
- while true; do
- local health_status=$(do_health_check)
- log_health "Health check result: $health_status"
-
- # Sleep for 30 seconds before next check
- sleep 30
- done
- }
- # Function to run single health check
- run_once() {
- local health_status=$(do_health_check)
- echo "$health_status"
-
- if [ "$health_status" = "healthy" ]; then
- exit 0
- else
- exit 1
- fi
- }
- # Function to get detailed status
- get_status() {
- if [ -f "$HEALTH_STATUS_FILE" ]; then
- cat "$HEALTH_STATUS_FILE"
- else
- echo '{"status": "unknown", "timestamp": "", "details": {}}'
- fi
- }
- # Main execution
- case "${1:-once}" in
- "once")
- run_once
- ;;
- "monitor")
- run_monitoring
- ;;
- "status")
- get_status
- ;;
- *)
- echo "Usage: $0 {once|monitor|status}"
- echo " once - Run health check once and exit"
- echo " monitor - Run continuous health monitoring"
- echo " status - Get detailed status information"
- exit 1
- ;;
- esac
|