devsofttech_hms_ci4/scripts/manage_hms_cron.sh

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