76 lines
3.2 KiB
PHP
76 lines
3.2 KiB
PHP
<?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";
|
|
}
|