305 lines
10 KiB
Bash
305 lines
10 KiB
Bash
#!/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 "<schedule>" "<command>" [log_name] [project_dir]
|
|
# bash scripts/manage_hms_cron.sh list
|
|
# bash scripts/manage_hms_cron.sh remove "<keyword_pattern>"
|
|
# bash scripts/manage_hms_cron.sh uninstall
|
|
# bash scripts/manage_hms_cron.sh test "<spark_command>" [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"
|
|
|
|
local tmp_cron
|
|
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" <<EOF
|
|
$BLOCK_START
|
|
# ABDM M2 Care Context Push Sync (Every 1 minute)
|
|
* * * * * cd $project_dir && $php_bin spark abdm:push-sync --limit=20 --worker=cron-abdm-m2 >> $log_dir/abdm_push_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 \"<cron_schedule>\" \"<command>\" [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" <<EOF
|
|
$BLOCK_START
|
|
$new_cron_line
|
|
$BLOCK_END
|
|
EOF
|
|
fi
|
|
|
|
crontab "$tmp_cron"
|
|
echo "Added task to crontab:"
|
|
echo " $new_cron_line"
|
|
echo ""
|
|
cmd_list
|
|
}
|
|
|
|
# ------------------------------------------------------------------------------
|
|
# Action: Remove a task matching pattern
|
|
# ------------------------------------------------------------------------------
|
|
cmd_remove() {
|
|
local pattern="${1:-}"
|
|
if [ -z "$pattern" ]; then
|
|
echo "Usage: $0 remove \"<keyword_pattern>\""
|
|
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 \"<spark_command>\" [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 \"<schedule>\" \"<spark_command>\" [log_file] [project_dir]"
|
|
echo " bash scripts/manage_hms_cron.sh list"
|
|
echo " bash scripts/manage_hms_cron.sh remove \"<pattern>\""
|
|
echo " bash scripts/manage_hms_cron.sh uninstall"
|
|
echo " bash scripts/manage_hms_cron.sh test \"<spark_command>\" [project_dir]"
|
|
;;
|
|
esac
|