#!/usr/bin/env bash # ============================================================================== # HMS CI4 - Cron Job Manager Script # ============================================================================== # Usage: # bash scripts/manage_hms_cron.sh install [project_dir] # bash scripts/manage_hms_cron.sh add "" "" [log_name] [project_dir] # bash scripts/manage_hms_cron.sh list # bash scripts/manage_hms_cron.sh remove "" # bash scripts/manage_hms_cron.sh uninstall # bash scripts/manage_hms_cron.sh test "" [project_dir] # # Examples: # bash scripts/manage_hms_cron.sh install /var/www/html/hms_etria # bash scripts/manage_hms_cron.sh add "*/5 * * * *" "spark abdm:push-sync --limit=20" "abdm_push.log" # bash scripts/manage_hms_cron.sh list # bash scripts/manage_hms_cron.sh remove "abdm:push-sync" # ============================================================================== set -euo pipefail BLOCK_START="# BEGIN HMS_CI4_AUTOGENERATED_CRON" BLOCK_END="# END HMS_CI4_AUTOGENERATED_CRON" # Resolve PHP CLI binary (prefers php83 / php82 / php8.3 / php8.2 over default php) detect_php() { if [ -n "${PHP_BIN:-}" ]; then echo "$PHP_BIN" return fi for cand in php83 php8.3 php82 php8.2 php; do if command -v "$cand" >/dev/null 2>&1; then echo "$(command -v "$cand")" return fi done echo "php" } # Resolve project directory resolve_project_dir() { local dir="${1:-}" if [ -z "$dir" ]; then # If script is inside scripts/, project root is parent local script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" if [ -f "${script_dir}/../spark" ]; then dir="$(cd "${script_dir}/.." && pwd)" else dir="/var/www/html/hms_etria" fi fi echo "$dir" } # ------------------------------------------------------------------------------ # Action: List Cron Jobs # ------------------------------------------------------------------------------ cmd_list() { echo "=== Current HMS Managed Cron Jobs ===" local cron_block cron_block="$(crontab -l 2>/dev/null | awk -v start="$BLOCK_START" -v end="$BLOCK_END" ' $0 == start {flag=1; next} $0 == end {flag=0; next} flag {print} ' || true)" if [ -z "$cron_block" ]; then echo "No HMS cron jobs found in crontab." else echo "$cron_block" fi } # ------------------------------------------------------------------------------ # Action: Install Default Cron Suite # ------------------------------------------------------------------------------ cmd_install() { local project_dir project_dir="$(resolve_project_dir "${1:-}")" local php_bin php_bin="$(detect_php)" local log_dir="${project_dir}/writable/logs/cron" if [ ! -d "$project_dir" ]; then echo "ERROR: Project directory not found: $project_dir" exit 1 fi mkdir -p "$log_dir" TMP_CRON="$(mktemp)" trap 'rm -f "${TMP_CRON:-}"' EXIT # Keep non-HMS crontab lines crontab -l 2>/dev/null | awk -v start="$BLOCK_START" -v end="$BLOCK_END" ' $0 == start {in_block=1; next} $0 == end {in_block=0; next} !in_block {print} ' > "$TMP_CRON" # Append default managed block cat >> "$TMP_CRON" <> $log_dir/abdm_push_sync.log 2>&1 # ABDM Work Task Board Auto-Link Sync (Every 1 minute) * * * * * cd $project_dir && $php_bin spark abdm:taskboard-sync --limit=20 >> $log_dir/abdm_taskboard_sync.log 2>&1 # ABDM Deep-Link SMS Notification Sync (Every 1 minute) * * * * * cd $project_dir && $php_bin spark abdm:sms-notify --limit=20 >> $log_dir/abdm_sms_notify.log 2>&1 # ABDM Bridge Records Sync (Every 1 minute) * * * * * cd $project_dir && $php_bin spark bridge:sync --limit 10 >> $log_dir/bridge_sync.log 2>&1 # SNOMED CT Medical Coding Worker (Every 1 minute) * * * * * cd $project_dir && $php_bin spark snomed:process-coding >> $log_dir/snomed_process.log 2>&1 # ABDM M3 HIU Data Request Poll (Every 2 minutes) */2 * * * * cd $project_dir && $php_bin spark abdm:hiu-poll --limit=15 >> $log_dir/abdm_hiu_poll.log 2>&1 # ABDM M3 HIU Retry Queue (Every 5 minutes) */5 * * * * cd $project_dir && $php_bin spark abdm:hiu-retry --limit=20 >> $log_dir/abdm_hiu_retry.log 2>&1 # ABDM Audit & Gateway Log Maintenance (Daily at 02:30 AM) 30 2 * * * cd $project_dir && $php_bin spark abdm:prune-logs --days=30 --strip-payload-days=2 --optimize >> $log_dir/abdm_prune_logs.log 2>&1 $BLOCK_END EOF crontab "$TMP_CRON" echo "Successfully installed default HMS cron suite for: $project_dir" echo "PHP binary detected: $php_bin" echo "Logs directory: $log_dir" echo "" cmd_list } # ------------------------------------------------------------------------------ # Action: Add / Append a single task to cron # ------------------------------------------------------------------------------ cmd_add() { local schedule="${1:-}" local command_str="${2:-}" local log_file="${3:-}" local project_dir project_dir="$(resolve_project_dir "${4:-}")" local php_bin php_bin="$(detect_php)" local log_dir="${project_dir}/writable/logs/cron" if [ -z "$schedule" ] || [ -z "$command_str" ]; then echo "Usage: $0 add \"\" \"\" [log_file] [project_dir]" echo "Example: $0 add \"*/5 * * * *\" \"spark abdm:push-sync --limit=20\" \"abdm_push.log\"" exit 1 fi mkdir -p "$log_dir" # Normalize command: if starts with 'spark ', wrap with cd and php local full_exec="" if [[ "$command_str" =~ ^spark[[:space:]] ]] || [[ "$command_str" == "spark" ]]; then full_exec="cd $project_dir && $php_bin $command_str" elif [[ "$command_str" =~ ^php[[:space:]]spark ]]; then full_exec="cd $project_dir && $command_str" else full_exec="$command_str" fi # Append log redirection if log_file is provided or auto-generate if [ -n "$log_file" ]; then full_exec="${full_exec} >> ${log_dir}/${log_file} 2>&1" fi local new_cron_line="${schedule} ${full_exec}" local tmp_cron tmp_cron="$(mktemp)" trap 'rm -f "$tmp_cron"' EXIT local existing_crontab existing_crontab="$(crontab -l 2>/dev/null || true)" if echo "$existing_crontab" | grep -q "$BLOCK_START"; then # Insert before BLOCK_END awk -v start="$BLOCK_START" -v end="$BLOCK_END" -v newline="$new_cron_line" ' $0 == end { print newline; print $0; next } { print } ' <<< "$existing_crontab" > "$tmp_cron" else # No HMS block yet: create block cat <<< "$existing_crontab" > "$tmp_cron" cat >> "$tmp_cron" <\"" echo "Example: $0 remove \"abdm:push-sync\"" exit 1 fi local tmp_cron tmp_cron="$(mktemp)" trap 'rm -f "$tmp_cron"' EXIT local existing_crontab existing_crontab="$(crontab -l 2>/dev/null || true)" awk -v start="$BLOCK_START" -v end="$BLOCK_END" -v pat="$pattern" ' $0 == start { in_block=1; print; next } $0 == end { in_block=0; print; next } in_block && $0 ~ pat { next } { print } ' <<< "$existing_crontab" > "$tmp_cron" crontab "$tmp_cron" echo "Removed any task matching: $pattern" echo "" cmd_list } # ------------------------------------------------------------------------------ # Action: Uninstall HMS Cron Block completely # ------------------------------------------------------------------------------ cmd_uninstall() { local tmp_cron tmp_cron="$(mktemp)" trap 'rm -f "$tmp_cron"' EXIT crontab -l 2>/dev/null | awk -v start="$BLOCK_START" -v end="$BLOCK_END" ' $0 == start {in_block=1; next} $0 == end {in_block=0; next} !in_block {print} ' > "$tmp_cron" crontab "$tmp_cron" echo "Uninstalled all HMS managed cron jobs." } # ------------------------------------------------------------------------------ # Action: Test run a command immediately # ------------------------------------------------------------------------------ cmd_test() { local command_str="${1:-}" local project_dir project_dir="$(resolve_project_dir "${2:-}")" local php_bin php_bin="$(detect_php)" if [ -z "$command_str" ]; then echo "Usage: $0 test \"\" [project_dir]" echo "Example: $0 test \"spark abdm:push-sync --limit=5\"" exit 1 fi echo "Running test: cd $project_dir && $php_bin $command_str" cd "$project_dir" && "$php_bin" $command_str } # ------------------------------------------------------------------------------ # CLI Router # ------------------------------------------------------------------------------ case "${1:-help}" in install) shift cmd_install "$@" ;; add) shift cmd_add "$@" ;; list) cmd_list ;; remove) shift cmd_remove "$@" ;; uninstall) cmd_uninstall ;; test) shift cmd_test "$@" ;; *) echo "HMS CI4 Cron Job Manager" echo "Usage:" echo " bash scripts/manage_hms_cron.sh install [project_dir]" echo " bash scripts/manage_hms_cron.sh add \"\" \"\" [log_file] [project_dir]" echo " bash scripts/manage_hms_cron.sh list" echo " bash scripts/manage_hms_cron.sh remove \"\"" echo " bash scripts/manage_hms_cron.sh uninstall" echo " bash scripts/manage_hms_cron.sh test \"\" [project_dir]" ;; esac