Files
2026-08-01 23:30:21 +02:00

108 lines
2.8 KiB
Bash

#!/bin/bash
# /opt/check_providers/send_sms.sh
# Wrapper générique pour envoyer un SMS via Gammu
#
# Usage :
# send_sms.sh "Message texte" ← aux numéros par défaut
# send_sms.sh "+33612345678" "Message texte" ← à un numéro spécifique
# send_sms.sh --force "Message texte" ← ignore l'anti-flood
#
# Compatible avec :
# - check_providers.py (alerte FIBRE down/up)
# - quota_4g.sh (alerte quota)
# - NUT (NOTIFYCMD dans upsmon.conf)
# - tout script qui appelle : send_sms.sh "message"
#
# NUT : dans /etc/nut/upsmon.conf :
# NOTIFYCMD /opt/check_providers/send_sms.sh
# NOTIFYFLAG ONBATT SYSLOG+EXEC
# NOTIFYFLAG LOWBATT SYSLOG+EXEC
# NOTIFYFLAG ONLINE SYSLOG+EXEC
#
# ============================================================
# CONFIGURATION
# ============================================================
# Numéro(s) de téléphone par défaut (séparés par des espaces)
DEFAULT_NUMBERS="+33687654443 +33672161654"
GAMMU_BIN="/usr/bin/gammu"
GAMMURC="/etc/gammurc"
LOG="logger -t sms-alert"
# Anti-flood : pas plus d'un SMS identique par heure
FLOOD_DIR="/var/run/sms_flood"
FLOOD_TTL=3600 # secondes
# ============================================================
mkdir -p "$FLOOD_DIR"
# --- Parse arguments ---
FORCE=0
NUMBERS=""
MESSAGE=""
while [ $# -gt 0 ]; do
case "$1" in
--force|-f)
FORCE=1
shift
;;
+*)
# Numéro de téléphone
NUMBERS="$NUMBERS $1"
shift
;;
*)
MESSAGE="$1"
shift
;;
esac
done
# Numéros par défaut si aucun spécifié
NUMBERS="${NUMBERS:-$DEFAULT_NUMBERS}"
NUMBERS=$(echo "$NUMBERS" | xargs) # trim
if [ -z "$MESSAGE" ]; then
echo "Usage: $0 [--force] [+33XXXXXXXXX ...] \"message\""
echo ""
echo "Options:"
echo " --force, -f Ignore l'anti-flood"
echo ""
echo "Exemples:"
echo " $0 \"Test SMS\""
echo " $0 +33612345678 +33698765432 \"Alerte serveur\""
echo " $0 --force \"Message urgent\""
exit 1
fi
# --- Anti-flood ---
HASH=$(echo -n "$MESSAGE" | md5sum | cut -d' ' -f1)
FLOOD_FILE="$FLOOD_DIR/$HASH"
if [ "$FORCE" -eq 0 ] && [ -f "$FLOOD_FILE" ]; then
AGE=$(( $(date +%s) - $(stat -c %Y "$FLOOD_FILE") ))
if [ "$AGE" -lt "$FLOOD_TTL" ]; then
$LOG "Anti-flood : message identique envoyé il y a ${AGE}s, ignoré"
exit 0
fi
fi
# --- Envoi ---
SENT=0
for NUMBER in $NUMBERS; do
if $GAMMU_BIN -c "$GAMMURC" sendsms TEXT "$NUMBER" -text "$MESSAGE" 2>&1; then
$LOG "SMS envoyé à $NUMBER : $MESSAGE"
SENT=1
else
$LOG "Échec envoi SMS à $NUMBER"
fi
done
# Marquer anti-flood seulement si au moins un SMS est parti
[ "$SENT" -eq 1 ] && touch "$FLOOD_FILE"
exit 0