2024-09-18 16:53:20 +00:00
|
|
|
#!/bin/bash
|
|
|
|
|
2025-01-06 15:13:20 +00:00
|
|
|
# Global Configuration
|
2024-09-18 16:53:20 +00:00
|
|
|
SCRIPT_PATH="/home/litespeed/mb-backups/backup_all.sh"
|
2024-11-12 18:15:11 +00:00
|
|
|
LOG_FILE="/home/litespeed/mb-backups/logs/cron_check.log"
|
2025-01-06 15:13:20 +00:00
|
|
|
CRON_SCHEDULE="0 0 * * *"
|
|
|
|
|
|
|
|
# Slack Webhook URL (optional)
|
|
|
|
SLACK_WEBHOOK_URL="https://hooks.slack.com/services/your/webhook/url"
|
|
|
|
|
|
|
|
# Email Notification (optional)
|
|
|
|
EMAIL="your_email@example.com"
|
|
|
|
|
|
|
|
# Helper functions
|
|
|
|
log_message() {
|
|
|
|
local level="$1"
|
|
|
|
local message="$2"
|
|
|
|
echo "[$(date)] [$level] $message" | tee -a "$LOG_FILE"
|
|
|
|
}
|
|
|
|
|
|
|
|
send_notification() {
|
|
|
|
local message="$1"
|
|
|
|
if [ -n "$SLACK_WEBHOOK_URL" ]; then
|
|
|
|
curl -X POST -H 'Content-type: application/json' \
|
|
|
|
--data "{\"text\":\"$message\"}" "$SLACK_WEBHOOK_URL"
|
|
|
|
log_message "INFO" "Slack notification sent."
|
|
|
|
fi
|
|
|
|
|
|
|
|
if [ -n "$EMAIL" ]; then
|
|
|
|
echo "$message" | mail -s "Backup Script Notification" "$EMAIL"
|
|
|
|
log_message "INFO" "Email notification sent."
|
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
|
|
|
check_cron_service() {
|
|
|
|
if ! systemctl is-active --quiet crond; then
|
|
|
|
log_message "ERROR" "Cron service is not running. Attempting to restart..."
|
|
|
|
sudo systemctl start crond && log_message "INFO" "Cron service restarted successfully." || {
|
|
|
|
log_message "ERROR" "Failed to restart cron service."
|
|
|
|
exit 1
|
|
|
|
}
|
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
|
|
|
install_cronnext() {
|
|
|
|
log_message "INFO" "Checking for 'cronnext' tool..."
|
|
|
|
if ! command -v cronnext &> /dev/null; then
|
|
|
|
log_message "WARNING" "'cronnext' tool not found. Attempting to install..."
|
|
|
|
if command -v pip &> /dev/null; then
|
|
|
|
pip install cronnext && log_message "INFO" "'cronnext' installed successfully." || {
|
|
|
|
log_message "ERROR" "Failed to install 'cronnext'. Please install it manually."
|
|
|
|
send_notification "Cronnext installation failed. Please check the server configuration."
|
|
|
|
exit 1
|
|
|
|
}
|
|
|
|
else
|
|
|
|
log_message "ERROR" "'pip' is not installed. Unable to install 'cronnext'."
|
|
|
|
send_notification "Pip is missing; unable to install Cronnext. Please investigate."
|
|
|
|
exit 1
|
|
|
|
fi
|
|
|
|
else
|
|
|
|
log_message "INFO" "'cronnext' is already installed."
|
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
|
|
|
check_and_repair_cron() {
|
|
|
|
log_message "INFO" "Checking for existing cron job for $SCRIPT_PATH..."
|
|
|
|
local existing_job
|
|
|
|
existing_job=$(crontab -l 2>/dev/null | grep -F "$SCRIPT_PATH")
|
|
|
|
|
|
|
|
if [ -z "$existing_job" ]; then
|
|
|
|
log_message "WARNING" "Automated backups are NOT enabled. Attempting to re-add cron job..."
|
|
|
|
(crontab -l 2>/dev/null; echo "$CRON_SCHEDULE SHELL=/bin/bash PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin RESTIC_PASSWORD=\"YourResticPassword\" $SCRIPT_PATH > /home/litespeed/mb-backups/logs/auto/backup.log 2>&1") | crontab - && \
|
|
|
|
log_message "INFO" "Cron job re-added successfully." || \
|
|
|
|
log_message "ERROR" "Failed to add cron job."
|
|
|
|
else
|
|
|
|
log_message "INFO" "Automated backups are already enabled with the following schedule:"
|
|
|
|
echo "$existing_job" | awk '{print "Schedule: " $1, $2, $3, $4, $5}' | tee -a "$LOG_FILE"
|
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
|
|
|
calculate_next_run_fallback() {
|
|
|
|
local cron_schedule="$1"
|
|
|
|
case "$cron_schedule" in
|
|
|
|
"0 * * * *") # Hourly
|
|
|
|
date -d "+1 hour" "+%Y-%m-%d %H:00:00"
|
|
|
|
;;
|
|
|
|
"0 0 * * *") # Daily at midnight
|
|
|
|
date -d "tomorrow 00:00" "+%Y-%m-%d %H:%M:%S"
|
|
|
|
;;
|
|
|
|
"0 0 * * 0") # Weekly at midnight on Sunday
|
|
|
|
date -d "next sunday 00:00" "+%Y-%m-%d %H:%M:%S"
|
|
|
|
;;
|
|
|
|
"*/15 * * * *") # Every 15 minutes
|
|
|
|
date -d "15 minutes" "+%Y-%m-%d %H:%M:%S"
|
|
|
|
;;
|
|
|
|
*) # Unsupported schedules
|
|
|
|
log_message "ERROR" "Unsupported schedule for fallback: $cron_schedule"
|
|
|
|
echo "Unsupported schedule"
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
}
|
|
|
|
|
|
|
|
display_next_run() {
|
|
|
|
log_message "INFO" "Calculating next run time for the cron job..."
|
|
|
|
install_cronnext
|
|
|
|
|
|
|
|
local next_run
|
|
|
|
next_run=$(cronnext "$CRON_SCHEDULE" 2>/dev/null)
|
2024-09-18 16:53:20 +00:00
|
|
|
|
2025-01-06 15:13:20 +00:00
|
|
|
if [ -n "$next_run" ]; then
|
|
|
|
log_message "INFO" "Next scheduled run time: $next_run"
|
|
|
|
else
|
|
|
|
log_message "WARNING" "Failed to calculate next run time using 'cronnext'. Falling back to manual calculation..."
|
|
|
|
next_run=$(calculate_next_run_fallback "$CRON_SCHEDULE")
|
|
|
|
if [ "$next_run" == "Unsupported schedule" ]; then
|
|
|
|
send_notification "Failed to calculate next run time: unsupported schedule $CRON_SCHEDULE."
|
|
|
|
else
|
|
|
|
log_message "INFO" "Next scheduled run time (fallback): $next_run"
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
}
|
2024-11-12 18:15:11 +00:00
|
|
|
|
2025-01-06 15:13:20 +00:00
|
|
|
# Main Execution
|
|
|
|
log_message "INFO" "Starting backup schedule verification script..."
|
|
|
|
check_cron_service
|
|
|
|
check_and_repair_cron
|
|
|
|
display_next_run
|
2024-09-18 16:53:20 +00:00
|
|
|
|
2025-01-06 15:13:20 +00:00
|
|
|
log_message "INFO" "Backup schedule verification completed successfully."
|