#!/bin/bash # # Install Quarterly Retraining Cron Job # # This script installs a cron job that runs quarterly model retraining # on the first Sunday of Jan, Apr, Jul, and Oct at 2 AM. # # Usage: # sudo ./scripts/install_cron.sh # # Requirements: # - Root access (for modifying /etc/cron.d/) # - Slack webhook URL (optional, for notifications) # - Email configuration (optional, for notifications) set -e # Check if running as root if [ "$EUID" -ne 0 ]; then echo "Error: This script must be run as root (use sudo)" exit 1 fi # Configuration SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" CRON_FILE="/etc/cron.d/foxhunt-quarterly-retrain" USER="${SUDO_USER:-foxhunt}" RETRAIN_SCRIPT="$PROJECT_ROOT/scripts/quarterly_retrain.sh" # Prompt for configuration read -p "Enter Slack webhook URL (optional, press Enter to skip): " SLACK_WEBHOOK read -p "Enter email recipients (comma-separated, optional): " EMAIL_RECIPIENTS # Validate retrain script exists if [ ! -f "$RETRAIN_SCRIPT" ]; then echo "Error: Retraining script not found: $RETRAIN_SCRIPT" exit 1 fi # Make script executable chmod +x "$RETRAIN_SCRIPT" # Create cron job cat > "$CRON_FILE" << EOF # Foxhunt Quarterly Model Retraining # # Runs on the first Sunday of each quarter (Jan, Apr, Jul, Oct) at 2 AM # Schedule: minute hour day month weekday # # Day 1-7: First week of month # Month 1,4,7,10: Jan, Apr, Jul, Oct # Weekday 0: Sunday SHELL=/bin/bash PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin FOXHUNT_ROOT=$PROJECT_ROOT SLACK_WEBHOOK=$SLACK_WEBHOOK EMAIL_RECIPIENTS=$EMAIL_RECIPIENTS # Run at 2 AM on first Sunday of quarterly months 0 2 1-7 1,4,7,10 0 $USER [ "\$(date +\%u)" = "7" ] && $RETRAIN_SCRIPT >> /var/log/foxhunt/quarterly_retrain.log 2>&1 EOF # Set correct permissions chmod 644 "$CRON_FILE" # Create log directory mkdir -p /var/log/foxhunt chown $USER:$USER /var/log/foxhunt # Create systemd timer (alternative to cron) TIMER_FILE="/etc/systemd/system/foxhunt-retrain.timer" SERVICE_FILE="/etc/systemd/system/foxhunt-retrain.service" cat > "$TIMER_FILE" << EOF [Unit] Description=Foxhunt Quarterly Retraining Timer Documentation=https://github.com/foxhunt/docs/MODEL_RETRAINING_SOP.md [Timer] # First Sunday of Jan, Apr, Jul, Oct at 2 AM OnCalendar=Sun *-01,04,07,10-01..07 02:00:00 Persistent=true [Install] WantedBy=timers.target EOF cat > "$SERVICE_FILE" << EOF [Unit] Description=Foxhunt Quarterly Model Retraining Documentation=https://github.com/foxhunt/docs/MODEL_RETRAINING_SOP.md [Service] Type=oneshot User=$USER WorkingDirectory=$PROJECT_ROOT Environment="FOXHUNT_ROOT=$PROJECT_ROOT" Environment="SLACK_WEBHOOK=$SLACK_WEBHOOK" Environment="EMAIL_RECIPIENTS=$EMAIL_RECIPIENTS" ExecStart=$RETRAIN_SCRIPT StandardOutput=append:/var/log/foxhunt/quarterly_retrain.log StandardError=append:/var/log/foxhunt/quarterly_retrain.log [Install] WantedBy=multi-user.target EOF chmod 644 "$TIMER_FILE" "$SERVICE_FILE" # Reload systemd systemctl daemon-reload echo "✅ Installation complete!" echo "" echo "Cron job installed: $CRON_FILE" echo "Systemd timer installed: $TIMER_FILE" echo "" echo "Choose your scheduling method:" echo "" echo "Option 1: Cron (traditional)" echo " Status: Active (check with: cat $CRON_FILE)" echo " Logs: /var/log/foxhunt/quarterly_retrain.log" echo "" echo "Option 2: Systemd timer (recommended)" echo " Enable: sudo systemctl enable foxhunt-retrain.timer" echo " Start: sudo systemctl start foxhunt-retrain.timer" echo " Status: sudo systemctl status foxhunt-retrain.timer" echo " Logs: sudo journalctl -u foxhunt-retrain.service" echo "" echo "Next scheduled run:" if command -v systemctl &> /dev/null; then systemctl list-timers foxhunt-retrain.timer --no-pager 2>/dev/null || echo " (Enable timer first)" fi echo "" echo "To test immediately:" echo " sudo -u $USER $RETRAIN_SCRIPT --dry-run"