Compare commits
No commits in common. "28a7fa9f798658c468df58e7410dd1d20fd7a5ec" and "5bb5756604bd059ce798fa3c7184796d411ee2ce" have entirely different histories.
28a7fa9f79
...
5bb5756604
2 changed files with 6 additions and 91 deletions
|
|
@ -42,21 +42,6 @@ require_once __DIR__.'/../class/netdiagmeasurement.class.php';
|
|||
// GET: einzelnes Protokoll mit Geräten und Messungen
|
||||
// =========================================================================
|
||||
if ($_SERVER['REQUEST_METHOD'] === 'GET') {
|
||||
// Leserecht prüfen. Der POST-Zweig weiter unten verlangt seit jeher
|
||||
// 'protocol write', der GET-Zweig prüfte bis 16.08.2026 gar nichts: jeder
|
||||
// angemeldete Benutzer konnte mit einer geratenen ID ein fremdes Protokoll
|
||||
// samt Geräteliste, IP-Adressen und offenen Ports abrufen. Das ist beim
|
||||
// Kunden erhobene Netzstruktur — sie gehört hinter ein Recht.
|
||||
//
|
||||
// 'write' wird bewusst mit akzeptiert: In Dolibarr sind die Rechte einzeln
|
||||
// vergebbar, ein Techniker-Benutzer mit Schreib- aber ohne ausdrückliches
|
||||
// Leserecht ist möglich. Der würde sonst genau die Protokolle nicht mehr
|
||||
// abrufen können, die er selbst hochgeladen hat — die App wäre nach dem
|
||||
// Update kaputt, und zwar erst beim Kunden. Wer schreiben darf, darf lesen.
|
||||
if (!$user->hasRight('netdiag', 'protocol', 'read')
|
||||
&& !$user->hasRight('netdiag', 'protocol', 'write')) {
|
||||
netdiag_api_error('Keine Leseberechtigung', 403);
|
||||
}
|
||||
$id = isset($_GET['id']) ? (int) $_GET['id'] : 0;
|
||||
if ($id <= 0) {
|
||||
netdiag_api_error('Parameter id fehlt', 400);
|
||||
|
|
@ -232,17 +217,9 @@ foreach ($measIn as $m) {
|
|||
$meas->fk_protocol = $protocolId;
|
||||
$dcid = isset($m['deviceClientId']) ? (string) $m['deviceClientId'] : '';
|
||||
$meas->fk_device = ($dcid !== '' && isset($deviceIdMap[$dcid])) ? $deviceIdMap[$dcid] : null;
|
||||
// Auf die Spaltenlängen kürzen (varchar 64/32/255, siehe
|
||||
// sql/llx_netdiag_measurement.sql). Ohne das kippt bei striktem SQL-Modus
|
||||
// EIN zu langes Label den gesamten Sync: create() schlägt fehl, es folgt
|
||||
// rollback() — und der Techniker steht beim Kunden mit einem Protokoll da,
|
||||
// das sich nicht abschließen lässt, obwohl nur eine Beschriftung zu lang
|
||||
// war. Die App setzt Labels durch Verketten zusammen (Raumname + SSID +
|
||||
// Geschwindigkeit …), 255 Zeichen sind dabei erreichbar. Bei den Geräten
|
||||
// wird längst so verfahren (found_via, netdiag_join_list weiter oben).
|
||||
$meas->tool = substr(isset($m['tool']) ? (string) $m['tool'] : 'unknown', 0, 64);
|
||||
$meas->category = substr(isset($m['category']) ? (string) $m['category'] : '', 0, 32);
|
||||
$meas->label = substr(isset($m['label']) ? (string) $m['label'] : '', 0, 255);
|
||||
$meas->tool = isset($m['tool']) ? (string) $m['tool'] : 'unknown';
|
||||
$meas->category = isset($m['category']) ? (string) $m['category'] : '';
|
||||
$meas->label = isset($m['label']) ? (string) $m['label'] : '';
|
||||
$meas->params = isset($m['params']) ? json_encode($m['params'], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES) : null;
|
||||
$meas->result = isset($m['result']) ? json_encode($m['result'], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES) : null;
|
||||
// Nur bekannte Bewertungen uebernehmen. Ein unbekannter Wert landete sonst
|
||||
|
|
|
|||
|
|
@ -332,16 +332,6 @@ function netdiagKundenfelder()
|
|||
'dauerSekunden' => array('Messdauer', 's'),
|
||||
'intervallSek' => array('Messabstand', 's'),
|
||||
'laengsterAusfallSek' => array('Längster Ausfall', 's'),
|
||||
// Geräte-Monitor (Dauerüberwachung). Das ist der Beleg für „das Netz
|
||||
// war über X Stunden stabil" bzw. für die häufigste Reklamation
|
||||
// („die Kamera fällt ständig aus") — die Felder gehören deshalb
|
||||
// vollständig ins Kundendokument, nicht nur die Ampel.
|
||||
'geraeteAnzahl' => array('Überwachte Geräte', ''),
|
||||
'verfuegbarkeitProzent' => array('Verfügbarkeit (schlechtestes Gerät)', '%'),
|
||||
'ausfallzeitSek' => array('Ausfallzeit', 's'),
|
||||
'aussetzer' => array('Aussetzer', ''),
|
||||
'geraete' => array('Je Gerät', ''),
|
||||
'ausfaelle' => array('Einzelne Ausfälle', ''),
|
||||
// Netz/DHCP
|
||||
'server' => array('DHCP-Server', ''),
|
||||
'lease' => array('Lease-Dauer', 's'),
|
||||
|
|
@ -388,32 +378,14 @@ function netdiagKundenfelder()
|
|||
'ssid' => array('WLAN-Name', ''),
|
||||
'raum' => array('Raum / Dose', ''),
|
||||
'iface' => array('Schnittstelle', ''),
|
||||
// Anschlussart. ACHTUNG: hier stand bis 16.08.2026 'typ' — ein Schlüssel,
|
||||
// den kein einziges Werkzeug erzeugt. Die App liefert das LinkInfo-Objekt
|
||||
// durch, und dort heißt das Feld 'type' (app/src/lib/types.ts). Folge:
|
||||
// im Kundendokument fehlte ausgerechnet beim IP-Test an der Dose die
|
||||
// Angabe, ob per LAN oder WLAN gemessen wurde — bei einem Abnahmebeleg
|
||||
// die halbe Aussage. Rohwerte sind englisch und werden in
|
||||
// netdiagKundentext() übersetzt.
|
||||
'type' => array('Anschlussart', ''),
|
||||
// Empfangspegel: bei einer WLAN-Dose IST das der Messwert. Wurde bisher
|
||||
// verworfen, weil nicht in der Liste.
|
||||
'rssi' => array('Empfangspegel', 'dBm'),
|
||||
'typ' => array('Anschlussart', ''),
|
||||
'neu' => array('Neu hinzugekommen', ''),
|
||||
'nichtMehrErreichbar' => array('Nicht mehr erreichbar', ''),
|
||||
'demodaten' => array('DEMODATEN — keine echte Messung', ''),
|
||||
// Bewusst NICHT aufgenommen (Messgeräte-Interna, für den Kunden ohne
|
||||
// Aussage): 'bssid', 'isUsbEthernet', 'isDefault', 'dns'.
|
||||
// Fehler/Hinweise — immer zeigen, sonst bliebe eine gelbe oder rote Ampel
|
||||
// im Kundendokument ohne jede Erklärung stehen. Der Text läuft durch
|
||||
// netdiagKundentext() und wird dort von Messgeräte-Interna befreit.
|
||||
'fehler' => array('Fehler', ''),
|
||||
// 'error' ist die englische Schreibweise desselben Feldes. Die App
|
||||
// vereinheitlicht auf 'fehler', aber in bereits ausgelieferten
|
||||
// Protokollen steht 'error' — und Altdaten lassen sich nicht ändern.
|
||||
// Ohne diesen Eintrag stünde dort eine rote Ampel ohne einen Buchstaben
|
||||
// Erklärung.
|
||||
'error' => array('Fehler', ''),
|
||||
'hinweis' => array('Hinweis', ''),
|
||||
'kundenhinweis' => array('Hinweis', ''),
|
||||
);
|
||||
|
|
@ -435,18 +407,9 @@ function netdiagDauerLesbar($sek)
|
|||
return round($sek / 60).' min';
|
||||
}
|
||||
if ($sek < 86400) {
|
||||
$std = floor($sek / 3600);
|
||||
$min = round(($sek % 3600) / 60);
|
||||
// Volle Stunde nicht als „2 Std 0 min" ausgeben
|
||||
return $std.' Std'.($min > 0 ? ' '.$min.' min' : '');
|
||||
return floor($sek / 3600).' Std '.round(($sek % 3600) / 60).' min';
|
||||
}
|
||||
// (int) nicht weglassen: floor() liefert einen Float, und 1.0 === 1 ist in
|
||||
// PHP false — die Einzahl unten hätte sonst nie gegriffen.
|
||||
$tage = (int) floor($sek / 86400);
|
||||
$std = (int) round(($sek % 86400) / 3600);
|
||||
// Einzahl/Mehrzahl und die glatte Angabe: eine DHCP-Lease von genau einem
|
||||
// Tag las sich vorher als „1 Tage 0 Std".
|
||||
return $tage.($tage === 1 ? ' Tag' : ' Tage').($std > 0 ? ' '.$std.' Std' : '');
|
||||
return floor($sek / 86400).' Tage '.round(($sek % 86400) / 3600).' Std';
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -471,16 +434,6 @@ function netdiagFeldFuerKunde($key, $val)
|
|||
$flat[] = is_array($item) ? json_encode($item, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES) : (string) $item;
|
||||
}
|
||||
$val = implode(', ', $flat);
|
||||
// Leeres Array = das gute Ergebnis: kein offener Port, kein IP-Konflikt,
|
||||
// keine Veränderung seit dem letzten Scan. Bis 16.08.2026 stand hier im
|
||||
// Kundendokument „Offene Ports: " ohne Wert — die Leerprüfung weiter
|
||||
// unten ist ein elseif und wurde nach diesem Zweig nie erreicht.
|
||||
// „keine" statt Weglassen, weil die Zeile sonst kommentarlos
|
||||
// verschwindet und der Kunde nicht unterscheiden kann, ob nichts
|
||||
// gefunden oder nichts geprüft wurde.
|
||||
if ($val === '') {
|
||||
$val = 'keine';
|
||||
}
|
||||
} elseif (is_bool($val)) {
|
||||
$val = $val ? 'ja' : 'nein';
|
||||
} elseif ($val === null || $val === '') {
|
||||
|
|
@ -513,21 +466,6 @@ function netdiagKundentext($text)
|
|||
if (stripos($text, '/proc/net/arp') !== false || stripos($text, 'braucht root') !== false) {
|
||||
return 'Mit dem eingesetzten Messgerät nicht prüfbar — die Aussage bleibt offen.';
|
||||
}
|
||||
// Anschlussart: Android liefert die Rohwerte englisch. Im Abnahmeprotokoll
|
||||
// eines deutschen Handwerksbetriebs hat „Anschlussart: ethernet" nichts zu
|
||||
// suchen. Exakter Vergleich statt stripos, damit nicht versehentlich ein
|
||||
// Fließtext getroffen wird, in dem das Wort vorkommt.
|
||||
$anschluss = array(
|
||||
'wifi' => 'WLAN',
|
||||
'ethernet' => 'LAN (Kabel)',
|
||||
'cellular' => 'Mobilfunk',
|
||||
'vpn' => 'VPN',
|
||||
'other' => 'sonstige',
|
||||
);
|
||||
$k = strtolower(trim($text));
|
||||
if (isset($anschluss[$k])) {
|
||||
return $anschluss[$k];
|
||||
}
|
||||
return $text;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue