92 lines
3.7 KiB
Bash
Executable File
92 lines
3.7 KiB
Bash
Executable File
#!/bin/bash
|
||
# sms_timer_manager.sh — reconciles DB flags with systemd timers
|
||
# Runs every 1 min via cron:
|
||
# 1. timer_active → enable/disable systemd timer
|
||
# 2. run_requested → run campaign script immediately (script resets flag itself)
|
||
|
||
set -euo pipefail
|
||
|
||
# Адрес контейнера supabase-db меняется при пересоздании, поэтому берём его динамически
|
||
# (как в sms_run_with_db.sh). До 29.09.2026 здесь был зашит 10.0.4.12, к которому нет маршрута:
|
||
# скрипт каждую минуту писал «Failed to query DB, skipping» с 01.07.2026, из-за чего переключатели
|
||
# таймеров и кнопка «Запустить сейчас» в админке молча ничего не делали.
|
||
DB_HOST="$(docker inspect supabase-db --format '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' 2>/dev/null)"
|
||
DB_PORT="5432"
|
||
DB_NAME="postgres"
|
||
DB_USER="supabase_admin"
|
||
DB_PASS="4fe80bb21c7c3d17a8d8b226adf7a479"
|
||
if [ -z "$DB_HOST" ]; then
|
||
echo "$(date): ERROR: Cannot resolve supabase-db IP"
|
||
exit 1
|
||
fi
|
||
|
||
declare -A TIMERS=(
|
||
["first_sms"]="sms-first-campaign.timer"
|
||
["second_sms"]="sms-second-campaign.timer"
|
||
["manual"]="sms-manual-campaign.timer"
|
||
["paid_storage"]="sms-paid-storage-campaign.timer"
|
||
)
|
||
declare -A SERVICES=(
|
||
["first_sms"]="sms-first-campaign.service"
|
||
["second_sms"]="sms-second-campaign.service"
|
||
["manual"]="sms-manual-campaign.service"
|
||
["paid_storage"]="sms-paid-storage-campaign.service"
|
||
)
|
||
declare -A SCRIPTS=(
|
||
["first_sms"]="/opt/supersam/scripts/sms_first_campaign.py"
|
||
["second_sms"]="/opt/supersam/scripts/sms_second_campaign.py"
|
||
["manual"]="/opt/supersam/scripts/sms_manual_campaign.py"
|
||
["paid_storage"]="/opt/supersam/scripts/sms_paid_storage_campaign.py"
|
||
)
|
||
|
||
QUERY="SELECT campaign_type, timer_active, run_requested FROM sms_campaign_settings"
|
||
RESULTS=$(PGPASSWORD="$DB_PASS" psql -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" -d "$DB_NAME" -t -A -F '|' -c "$QUERY" 2>/dev/null || echo "")
|
||
|
||
if [ -z "$RESULTS" ]; then
|
||
echo "$(date): Failed to query DB, skipping"
|
||
exit 0
|
||
fi
|
||
|
||
while IFS='|' read -r campaign_type timer_active run_requested; do
|
||
[ -z "$campaign_type" ] && continue
|
||
timer_name="${TIMERS[$campaign_type]:-}"
|
||
service_name="${SERVICES[$campaign_type]:-}"
|
||
script_path="${SCRIPTS[$campaign_type]:-}"
|
||
[ -z "$timer_name" ] && continue
|
||
|
||
if ! systemctl list-unit-files "$timer_name" 2>/dev/null | grep -q "$timer_name"; then
|
||
continue
|
||
fi
|
||
|
||
# ── 1. Timer enable/disable ──
|
||
is_active=$(systemctl is-active "$timer_name" 2>/dev/null || echo "inactive")
|
||
|
||
if [ "$timer_active" = "t" ] || [ "$timer_active" = "true" ]; then
|
||
if [ "$is_active" != "active" ]; then
|
||
systemctl enable --now "$timer_name" 2>/dev/null
|
||
echo "$(date): ENABLED $timer_name for $campaign_type"
|
||
fi
|
||
else
|
||
if [ "$is_active" = "active" ]; then
|
||
systemctl disable --now "$timer_name" 2>/dev/null
|
||
echo "$(date): DISABLED $timer_name for $campaign_type"
|
||
fi
|
||
fi
|
||
|
||
# ── 2. Run requested → immediate execution ──
|
||
# Don't reset flag here — script reads it from DB and resets after processing
|
||
if [ "$run_requested" = "t" ] || [ "$run_requested" = "true" ]; then
|
||
is_running=$(systemctl is-active "$service_name" 2>/dev/null || echo "inactive")
|
||
if [ "$is_running" = "active" ]; then
|
||
echo "$(date): $campaign_type already running, skipping run_requested"
|
||
continue
|
||
fi
|
||
|
||
echo "$(date): RUN REQUESTED — starting $campaign_type immediately"
|
||
systemctl start "$service_name" 2>/dev/null || {
|
||
nohup python3 "$script_path" >> "/var/log/supersam-sms-${campaign_type}.log" 2>&1 &
|
||
echo "$(date): Started $campaign_type via nohup fallback"
|
||
}
|
||
fi
|
||
|
||
done <<< "$RESULTS" |