Grosse évolution avec, entre autres, l'implémentation des alertes par SMS et email

This commit is contained in:
2026-10-07 10:06:20 +00:00
parent 0a2ec261ec
commit 2c1d1a51e4
17 changed files with 1551 additions and 11 deletions
+75
View File
@@ -0,0 +1,75 @@
<?php
// ============================================================================
// sonnette.php - Réception d'un coup de sonnette d'un CM5 (synthèse §51, étape C).
// Lancé par systemd pour CHAQUE connexion reçue sur le port de la sonnette (ship2net-sonnette.socket, Accept=yes :
// aucun processus permanent) ; la connexion est l'entrée et la sortie standard ; systemd fournit l'adresse de
// l'appelant dans $REMOTE_ADDR.
//
// Protocole : une ligne, "evenement" ou "vie". Réponse : une ligne "ok", ou "inconnu" (module non reconnu).
// - "vie" (battement de cœur, au plus toutes les 10 min) : signal enregistré, chien de garde réarmé, rien d'autre ;
// - "evenement" (alarme SMS/e-mail, archive prête, retour du réseau) : idem, plus une demande de traitement des
// alertes et des archives de ce bateau ;
// - tout autre texte est traité comme "evenement" (le signal n'est qu'une indication : il ne porte aucune donnée
// ni aucun droit - au pire, une lecture inutile chez un bateau connu).
// Un bateau qui était déclaré injoignable déclenche toujours le traitement (alerte de retour de connexion).
// ============================================================================
chdir("/var/www/html");
require_once __DIR__ . "/config/config.php";
require_once __DIR__ . "/fonctions_alertes.php";
$adresse = getenv('REMOTE_ADDR') ?: '';
// Adresse IPv4 éventuellement présentée sous forme IPv6 (::ffff:100.92.x.y) :
if (strncmp($adresse, '::ffff:', 7) === 0) $adresse = substr($adresse, 7);
// Lecture de la ligne (3 s au plus, 32 caractères au plus) :
stream_set_timeout(STDIN, 3);
$ligne = strtolower(trim((string)fgets(STDIN, 32)));
$motif = ($ligne === 'vie') ? 'vie' : 'evenement';
if (filter_var($adresse, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4) === false)
{
error_log("sonnette : adresse d'appelant invalide (".$adresse.")");
echo "inconnu\n";
exit(0);
}
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
try
{
$db = new mysqli("127.0.0.1", BDD_USER, BDD_PASSWORD, BDD_DATABASE, 3307);
$bateau = Bateau_par_adresse_netbird($db, $adresse);
if ($bateau === null)
{
error_log("sonnette : signal de ".$adresse." - module inconnu ou non affecté, ignoré");
echo "inconnu\n";
exit(0);
}
$id_bateau = $bateau['id_bateau'];
// État avant ce signal (le bateau était-il déclaré injoignable ?) :
$stmt = $db->prepare("SELECT Injoignable_depuis FROM TB_Bateaux WHERE Cle_primaire=?");
$stmt->bind_param('i', $id_bateau);
$stmt->execute();
$etait_injoignable = ($stmt->get_result()->fetch_row()[0] ?? null) !== null;
$stmt->close();
// Signal enregistré :
$stmt = $db->prepare("UPDATE TB_Bateaux SET Date_dernier_signal=UTC_TIMESTAMP(), Dernier_motif=? WHERE Cle_primaire=?");
$stmt->bind_param('si', $motif, $id_bateau);
$stmt->execute();
$stmt->close();
$seuil = Reglage_entier($db, 'Seuil_injoignable', SEUIL_INJOIGNABLE_DEFAUT);
$db->close();
Rearmer_gardien($id_bateau, $seuil);
if ($motif === 'evenement' || $etait_injoignable) Demander_traitement_alertes($id_bateau);
echo "ok\n";
}
catch (Throwable $e)
{
error_log("sonnette : ".$e->getMessage());
echo "erreur\n";
}