diff --git a/ChangeLog.md b/ChangeLog.md index cbc6132..04118d8 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -1,5 +1,34 @@ # Changelog NetDiag +## 1.1.4 — 2026-08-16 + +### Drei Falschaussagen im Kundendokument, alle aus Altdaten + +- **„0 DHCP-Server (!)" in Rot.** In der Produktionsdatenbank stehen drei + ausgelieferte Messungen des entfernten Werkzeugs `dhcpcheck` mit Ergebnis + `{"count":0,"server":[],"hinweis":""}` und Status 2. Bei einer Kabelverbindung + gibt Android die DHCP-Angaben aber grundsätzlich nicht heraus (nur `DhcpInfo`, + nur WLAN, deprecated) — gemessen wurde also nichts, „0 gefunden" war der + Rückgabewert für „nicht ermittelbar". `netdiagAltlastKorrektur()` zeigt diese + Messungen jetzt als „nicht messbar" mit Erklärung, in PDF **und** + Technikeransicht. Die gespeicherten Rohdaten bleiben unangetastet (Beleg); + korrigiert wird nur die Darstellung, und die wird bei jedem Abruf neu erzeugt. + Die Ergebniszahlen werden bei so korrigierten Messungen unterdrückt — + „Gefundene Geräte: 0" widerspräche der Aussage direkt darüber. +- **„Lease-Dauer: 864000 s s".** Ältere App-Fassungen haben die Einheit in den + Wert geschrieben, die Feldtabelle hängt sie erneut an. Nachgewiesen an + Prod-Messung #42. Die Einheit wird jetzt nur noch angehängt, wenn sie nicht + schon am Wert steht. +- **Adress- und Lease-Felder mit dem Wert 0** (`server`, `dhcpServer`, + `gateway`, `ipv4`, `lease` …) sind keine Messung, sondern das „nichts + ermittelt" der alten Android-API. Sie erscheinen jetzt als „nicht ermittelbar" + statt als „0". + +Neues Feld in der Whitelist: `dhcpQuelle` — `system` (LinkProperties, ab +Android 11, gilt für jeden Anschlusstyp) oder `wlan` (alter Weg, nur WLAN, dafür +mit Lease-Dauer). Damit ist im Nachhinein klärbar, ob eine fehlende DHCP-Angabe +an der Leitung lag oder an der Android-Version. + ## 1.1.3 — 2026-08-16 ### Internet-Kette im PDF + ein Zeichenfehler, der jedes Protokoll betraf diff --git a/core/modules/modNetDiag.class.php b/core/modules/modNetDiag.class.php index 8504442..3db9914 100644 --- a/core/modules/modNetDiag.class.php +++ b/core/modules/modNetDiag.class.php @@ -67,7 +67,7 @@ class modNetDiag extends DolibarrModules $this->editor_url = ''; $this->editor_squarred_logo = ''; - $this->version = '1.1.3'; + $this->version = '1.1.4'; // Konstanten-Name in llx_const für Modul-Status $this->const_name = 'MAIN_MODULE_'.strtoupper($this->name); diff --git a/lib/netdiag.lib.php b/lib/netdiag.lib.php index 45b5dde..b2381cd 100644 --- a/lib/netdiag.lib.php +++ b/lib/netdiag.lib.php @@ -394,6 +394,9 @@ function netdiagKundenfelder() 'ipv4' => array('IP-Adresse', ''), 'prefixLength' => array('Präfixlänge', ''), 'dhcpServer' => array('DHCP-Server', ''), + // 'system' = vom Betriebssystem gemeldet (gilt für jeden Anschlusstyp), + // 'wlan' = alter WLAN-Weg. Macht einen fehlenden Wert einordenbar. + 'dhcpQuelle' => array('Quelle der DHCP-Angabe', ''), 'leaseSec' => array('Lease-Dauer', 's'), 'linkSpeedMbps' => array('Verbindungsgeschwindigkeit', 'Mbit/s'), 'rxLinkSpeedMbps' => array('Empfangsgeschwindigkeit', 'Mbit/s'), @@ -431,6 +434,51 @@ function netdiagKundenfelder() ); } +/** + * Bekannte Falschaussagen aus Altmessungen bei der Anzeige geraderücken. + * + * Betrifft das entfernte Werkzeug `dhcpcheck`. In der Produktionsdatenbank + * stehen drei ausgelieferte Messungen mit dem Label „0 DHCP-Server (!)", + * Ergebnis `{"count":0,"server":[],"hinweis":""}` und **Status 2 (rot)** — eine + * Aussage über das Kundennetz, welche die Messung nie hergab: bei einer + * Kabelverbindung gibt Android die DHCP-Lease grundsätzlich nicht heraus (sie + * steckt nur im deprecated `DhcpInfo` und nur für WLAN). Gemessen wurde also + * nichts; „0 gefunden" ist der Rückgabewert für „nicht ermittelbar". + * + * Korrigiert wird bei der **Anzeige**, nicht in der Datenbank: die gespeicherte + * Messung bleibt unangetastet (Rohdaten sind Beleg), aber jedes neu erzeugte + * Kundendokument zeigt statt der roten Ampel ein ehrliches „nicht messbar". + * + * @param string $tool Werkzeug-ID der Messung + * @param int $status gespeicherter Status + * @param string $label gespeichertes Label + * @param string $json gespeichertes Ergebnis-JSON + * @return array{status:int,label:string,hinweis:string} korrigierte Anzeige + */ +function netdiagAltlastKorrektur($tool, $status, $label, $json) +{ + $out = array('status' => (int) $status, 'label' => (string) $label, 'hinweis' => ''); + if ($tool !== 'dhcpcheck') { + return $out; + } + $data = json_decode((string) $json, true); + if (!is_array($data)) { + return $out; + } + $leer = (isset($data['count']) && (int) $data['count'] === 0) + && (!isset($data['server']) || $data['server'] === array() || $data['server'] === ''); + if (!$leer) { + return $out; + } + $out['status'] = 3; // nicht messbar + $out['label'] = 'DHCP-Server nicht ermittelbar'; + $out['hinweis'] = 'Diese Messung stammt aus einer früheren App-Fassung. Bei einer ' + .'Kabelverbindung gibt Android die DHCP-Angaben nicht heraus — es wurde also nichts ' + .'gemessen. Die frühere Darstellung („0 DHCP-Server") las sich wie ein Befund über ' + .'das Kundennetz und war keiner.'; + return $out; +} + /** * Sekundenwert lesbar machen (aus „8123456" wird „94 Tage 0 Std"). * @@ -499,11 +547,36 @@ function netdiagFeldFuerKunde($key, $val) return null; // nicht ermittelt — lieber weglassen als „: " drucken } + /* + * Adressfelder mit dem Wert 0 bzw. 0.0.0.0 sind KEINE Messung, sondern der + * Rückgabewert „nichts ermittelt" der alten Android-API. In ausgelieferten + * Protokollen steht deshalb „DHCP-Server: 0" — eine Angabe, die es so im + * Kundennetz nie gab, und bei einer Kabelverbindung schlicht der Umstand, + * dass Android die Lease dort gar nicht herausgibt (nur WLAN, deprecated). + * Rückwirkend wirksam: Protokoll-PDFs werden bei jedem Abruf neu erzeugt. + * Lease-Dauer 0 fällt in dieselbe Kategorie. + */ + $adressfelder = array('server', 'dhcpServer', 'gateway', 'dns', 'ipv4', 'ip'); + if (in_array($key, $adressfelder, true) && ($val === 0 || $val === '0' || $val === '0.0.0.0')) { + return $label.': nicht ermittelbar'; + } + if (in_array($key, array('lease', 'leaseSec'), true) && ($val === 0 || $val === '0')) { + return $label.': nicht ermittelbar'; + } + // Sekundenwerte lesbar machen statt sechsstellige Zahlen zu drucken if ($einheit === 's' && is_numeric($val) && $val >= 3600) { return $label.': '.netdiagDauerLesbar($val); } $text = netdiagKundentext((string) $val); + /* + * Einheit nicht doppelt anhängen. Ältere App-Fassungen haben sie in den + * Wert geschrieben („864000 s"); im Kundendokument stand dadurch + * „Lease-Dauer: 864000 s s". Nachgewiesen an der Prod-Messung #42. + */ + if ($einheit !== '' && preg_match('/\s'.preg_quote($einheit, '/').'$/u', $text)) { + return $label.': '.$text; + } return $label.': '.$text.($einheit !== '' ? ' '.$einheit : ''); } diff --git a/lib/netdiag_pdf.lib.php b/lib/netdiag_pdf.lib.php index 6b904be..7aa16f7 100644 --- a/lib/netdiag_pdf.lib.php +++ b/lib/netdiag_pdf.lib.php @@ -161,7 +161,11 @@ function netdiagGeneratePdf($db, $protocol, $outputlangs) // stünde im PDF doppelt "OK OK". $statusmarks = array(0 => '', 1 => '! ', 2 => 'X ', 3 => '? '); foreach ($measurements as $m) { - $st = (int) $m->measure_status; + // Bekannte Falschaussagen aus Altmessungen geraderücken (siehe + // netdiagAltlastKorrektur() — betrifft das entfernte Werkzeug dhcpcheck, + // dessen „0 DHCP-Server (!)" in Rot in ausgelieferten Protokollen steht). + $korr = netdiagAltlastKorrektur($m->tool, $m->measure_status, $m->label, $m->result); + $st = (int) $korr['status']; if ($st < 0 || $st > 3) { $st = 1; // unbekannter Wert -> als Warnung behandeln, nie als OK } @@ -182,18 +186,32 @@ function netdiagGeneratePdf($db, $protocol, $outputlangs) netdiagPdfEnsureSpace($pdf, 11); $pdf->SetFont('', 'B', 9); // Klarname statt interner ID — „ipscan" sagt dem Kunden nichts - $title = netdiagToolName($m->tool).($m->label ? ' — '.$m->label : ''); + $title = netdiagToolName($m->tool).($korr['label'] ? ' — '.$korr['label'] : ''); $pdf->Cell(150, 6, dol_trunc($title, 80), 1, 0, 'L'); $pdf->Cell(30, 6, $statusmarks[$st].$statuslabels[$st], 1, 1, 'C', true); $pdf->SetFont('', '', 8); // Messparameter: ohne sie steht das Ergebnis ohne Bezug da — man sieht // nicht, gegen welches Ziel gemessen wurde (Prod-Messung #126). + if ($korr['hinweis'] !== '') { + $pdf->SetFont('', 'I', 7); + $pdf->MultiCell(180, 4, netdiagPdfText($korr['hinweis']), 1, 'L'); + $pdf->SetFont('', '', 8); + } $params = netdiagFormatParams($m->params); if ($params !== '') { $pdf->SetFont('', 'I', 7); $pdf->MultiCell(180, 4, netdiagPdfText($params), 1, 'L'); $pdf->SetFont('', '', 8); } + /* + * Bei einer als Altlast korrigierten Messung KEINE Zahlen mehr drucken: + * „Gefundene Geräte: 0 | DHCP-Server: keine" widerspricht der Aussage + * „nicht messbar" direkt darüber und liest sich wieder wie ein Befund. + * Der Erklärtext steht bereits hinter der Titelzeile. + */ + if ($korr['hinweis'] !== '') { + continue; + } if ($m->tool === 'stresstest') { netdiagPdfStressTest($pdf, $m->result); } elseif ($m->tool === 'wifikanal') { diff --git a/netdiagprotocol_card.php b/netdiagprotocol_card.php index 90df87d..60165f4 100644 --- a/netdiagprotocol_card.php +++ b/netdiagprotocol_card.php @@ -252,7 +252,10 @@ print '