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 Kabelverbindung gibt
Android die DHCP-Angaben aber grundsaetzlich nicht heraus (nur DhcpInfo, nur
WLAN, deprecated) - gemessen wurde also nichts, "0 gefunden" war der
Rueckgabewert fuer "nicht ermittelbar". netdiagAltlastKorrektur() zeigt diese
Messungen jetzt als "nicht messbar" mit Erklaerung, in PDF und
Technikeransicht. Rohdaten bleiben unangetastet, korrigiert wird nur die
Darstellung - und die wird bei jedem Abruf neu erzeugt. Die Ergebniszahlen
werden dabei unterdrueckt: "Gefundene Geraete: 0" widerspraeche der Aussage
direkt darueber.

"Lease-Dauer: 864000 s s": aeltere App-Fassungen haben die Einheit in den Wert
geschrieben, die Feldtabelle haengt sie erneut an (Prod-Messung #42).

Adress- und Lease-Felder mit dem Wert 0 erscheinen jetzt als "nicht
ermittelbar" statt als "0" - das war nie eine Messung, sondern das
"nichts ermittelt" der alten Android-API.

Neu in der Whitelist: dhcpQuelle (system = LinkProperties ab Android 11 fuer
jeden Anschlusstyp, wlan = alter Weg nur fuer WLAN). Damit ist klaerbar, ob
eine fehlende DHCP-Angabe an der Leitung lag oder an der Android-Version.

Geprueft gegen die lokale Testinstanz mit einer Kopie der echten
Prod-Messungen.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Eduard Wisch 2026-08-16 23:11:07 +02:00
parent b2ab430ae7
commit 0f37cae9e5
5 changed files with 131 additions and 5 deletions

View file

@ -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

View file

@ -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);

View file

@ -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 : '');
}

View file

@ -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') {

View file

@ -252,7 +252,10 @@ print '<th>'.$langs->trans("Tool").'</th><th>'.$langs->trans("Label").'</th>';
print '<th>'.$langs->trans("Result").'</th><th class="center">'.$langs->trans("MeasureStatus").'</th>';
print '</tr>';
foreach ($measurements as $m) {
$st = (int) $m->measure_status;
// Dieselbe Korrektur wie im PDF, damit Technikeransicht und Kundendokument
// nicht auseinanderlaufen (netdiagAltlastKorrektur(), Werkzeug dhcpcheck).
$korr = netdiagAltlastKorrektur($m->tool, $m->measure_status, $m->label, $m->result);
$st = (int) $korr['status'];
// Unbekannte Werte nie als OK durchgehen lassen (Array-Zugriff waere sonst leer)
if ($st < 0 || $st > 3) {
$st = 1;
@ -261,7 +264,10 @@ foreach ($measurements as $m) {
print '<td class="nowraponall">'.dol_print_date($m->date_measure, 'dayhour').'</td>';
print '<td>'.dol_escape_htmltag($m->category).'</td>';
print '<td>'.dol_escape_htmltag(netdiagToolName($m->tool)).'</td>';
print '<td>'.dol_escape_htmltag($m->label);
print '<td>'.dol_escape_htmltag($korr['label']);
if ($korr['hinweis'] !== '') {
print '<br><span class="opacitymedium small">'.dol_escape_htmltag($korr['hinweis']).'</span>';
}
// Messparameter darunter: sonst ist nicht erkennbar, wogegen gemessen wurde
$params = netdiagFormatParams($m->params);
if ($params !== '') {