From 5013a6d72767302d50d6d843bf7bf049ab00b69d Mon Sep 17 00:00:00 2001 From: Ludovic Pouzenc Date: Sun, 18 Mar 2018 01:29:23 +0100 Subject: Add a html generator for etat_reseau status page. Should run near poke.php. --- api/gen_etat_reseau.php | 262 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 262 insertions(+) create mode 100644 api/gen_etat_reseau.php diff --git a/api/gen_etat_reseau.php b/api/gen_etat_reseau.php new file mode 100644 index 0000000..20323da --- /dev/null +++ b/api/gen_etat_reseau.php @@ -0,0 +1,262 @@ + + * + * This file is part of CHD Gestion. + * + * CHD Gestion is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * CHD Gestion is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with CHD Gestion. If not, see . + **/ + +// topological sorting from https://gist.github.com/gowon/1744369137826450b185 +function topoNodeLevel($k, $ar,$n,$ref=array()) +{ + if(!isset($ar[$n][$k])){return 0;} + if(in_array($n,$ref)){return -1;} + $ref[]=$n; + $r=topoNodeLevel($k, $ar,$ar[$n][$k],$ref); + return ($r==-1?-1:$r+1); +} + +function toposort($k, &$array) { + $ar=array(); + foreach($array as $i=>$tmp) + { + $ar[]=topoNodeLevel($k, $array,$i); + } + if(!in_array(-1,$ar)) + { + array_multisort($ar,SORT_ASC,$array); + }else{ + error_log("Circular reference detected : " . print_r($array, true)); + } +} + +include_once('inc/config.php'); +$mysqli = new mysqli($db_config['host'], $db_config['username'], $db_config['password'], $db_config['database']); +if (mysqli_connect_errno()) { + die(mysqli_connect_error()); +} +unset($db_config); +$mysqli->set_charset("utf8") or die($mysqli->error); + +// Détail des équipements (nom, ip, uplink) +$res = $mysqli->query("SELECT e.id, + IFNULL(NULLIF(e.hostname,''), CONCAT('e', e.id)) as 'name', e.uplink_id, e.ipmgmt_id, r.title as relais +FROM equipements e +LEFT JOIN relais r ON ( r.id = e.relais_id ) +WHERE (e.relais_id IS NOT NULL OR e.hostname='STG1') +AND e.date_hs IS NULL"); +$equipements = array(); +while ( $e_row = $res->fetch_assoc() ) { + $id = $e_row['id']; + $equipements[$id] = $e_row; +} + +// Liste des relais par ville, avec les équipements associés +$res = $mysqli->query("SELECT v.title as ville, r.title as relais, GROUP_CONCAT(e.id) as equipement_ids +FROM villes v +JOIN relais r ON (v.id = r.ville_id) +JOIN equipements e ON (r.id = e.relais_id) +WHERE e.date_hs IS NULL +GROUP BY v.title, r.title +"); + +// Pour chaque relais +$world = array(); +while ( $r_row = $res->fetch_assoc() ) { + // La ville sera en clé du tableau associatif + $ville = $r_row['ville']; + unset($r_row['ville']); + + // On veut un tableau d'id d'équipements à partir de la chaine séparée par des virgules récupérée + $eids = explode(',', $r_row['equipement_ids']); + unset($r_row['equipement_ids']); + + // Construction d'un tableau d'équipements impliqué dans l'accès à internet du relais considéré + $r_row['equipements'] = array(); + + // Pour chaque id d'équipement (initialement : les équipements sur le relai, après : les équipements sur le chemin) + while ( $eid = array_pop($eids) ) { + if ( array_key_exists($eid, $equipements) ) { + // On référence l'équipement depuis le tableau en mémoire de tous les équipements + $r_row['equipements'][$eid] = &$equipements[$eid]; + + // On ajoute les équipements en amont s'il ne sont pas déjà là + $uplink_id = $equipements[$eid]['uplink_id']; + if ( ! array_key_exists($uplink_id, $r_row['equipements'])) { + array_push($eids, $uplink_id); + } + } + } + // On trie topologiquement les équipements + toposort('uplink_id', $r_row['equipements']); + + // On ajoute la ligne relais enrichie au tableau des relais, indexé par ville + $world[$ville][] = $r_row; +} +?> + + + + + Comminges Haut Débit : État du réseau + + + + + +

Comminges Haut Débit : État du réseau

+
Généré le
+ + $relais ) { + echo "

$ville

\n"; + foreach ( $relais as $r ) { +?> + + + + + + + + + + +
SiteÉquipementÉtat
+ + + +
+
+ + + -- cgit v1.1