/** * Tool: IP-Konflikt-Prüfung — findet IP-Adressen, die von zwei Geräten * gleichzeitig benutzt werden und so das Netz durcheinanderbringen. * * Verfahren ohne Root: Das Subnetz wird über mehrere Runden angepingt und * jeweils die ARP-Tabelle ausgelesen. Tauchen für eine IP mehrere MAC-Adressen * auf, nutzen mehrere Geräte dieselbe Adresse — ein Konflikt. */ import { scanner } from '../../scanner'; import type { MeasureStatus, Tool } from '../types'; export const ipConflictTool: Tool = { id: 'ipconflict', category: 'netzwerk', name: 'IP-Konflikt', icon: 'alert-triangle', description: 'Findet IP-Adressen, die zwei Geräte gleichzeitig benutzen.', scope: 'protocol', params: [ { key: 'subnet', label: 'Netzbereich (CIDR) — leer = aktiver Adapter', type: 'text', placeholder: 'leer lassen → automatisch über WLAN/LAN', }, { key: 'rounds', label: 'Prüfrunden (mehr = zuverlässiger, dauert länger)', type: 'number', default: 4, }, ], async run(ctx) { // Netzbereich: Dialog → Protokoll → aktiver Adapter let subnet = String(ctx.params.subnet ?? '').trim() || String(ctx.protocol.subnet ?? '').trim(); if (!subnet) { try { subnet = String((await scanner.getLocalSubnet()).subnet ?? '').trim(); } catch { /* unten abgefangen */ } } if (!subnet) { return { label: 'Kein Netzbereich — WLAN/LAN nicht aktiv?', result: { error: 'Netzbereich konnte nicht ermittelt werden' }, measureStatus: 2, }; } const rounds = Number(ctx.params.rounds) || 4; const res = await scanner.arpConflictScan({ subnet, rounds }); // ARP-Tabelle nicht lesbar → ehrliche Rückmeldung statt falscher Entwarnung if (!res.arpAvailable) { return { label: 'ARP-Tabelle nicht lesbar — Konfliktprüfung nicht möglich', result: { subnet, hinweis: 'Android gibt /proc/net/arp auf diesem Gerät nicht frei. Eine ' + 'zuverlässige IP-Konflikt-Erkennung ist ohne Root hier leider nicht möglich.', }, measureStatus: 1, }; } const n = res.conflicts.length; const status: MeasureStatus = n > 0 ? 2 : 0; return { label: n > 0 ? `${n} IP-Konflikt${n > 1 ? 'e' : ''} gefunden!` : `Kein Konflikt — ${res.checked} Adressen geprüft`, result: { subnet, geprueft: res.checked, runden: res.rounds, konflikte: res.conflicts.map((c) => `${c.ip} → ${c.macs.join(' / ')}`), hinweis: n > 0 ? 'Mehrere MAC-Adressen pro IP — diese Geräte stören sich gegenseitig.' : 'Jede gefundene IP wird von genau einem Gerät benutzt.', }, measureStatus: status, }; }, };