Skip to content

Commit fb435f3

Browse files
authored
Update server.js
1 parent f99bb22 commit fb435f3

File tree

1 file changed

+86
-34
lines changed

1 file changed

+86
-34
lines changed

server.js

Lines changed: 86 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -6,65 +6,117 @@ const ping = require('ping');
66
const app = express();
77
const PORT = 3000;
88

9-
// Middleware
109
app.use(cors());
1110
app.use(express.json());
1211

12+
// Helper: Maak een lijst van IP's uit een range string
13+
// Ondersteunt formaten zoals "192.168.1.1-50" en "192.168.1.1-192.168.1.50"
14+
function parseIPRange(rangeStr) {
15+
const ips = [];
16+
try {
17+
if (!rangeStr.includes('-')) return [rangeStr];
18+
19+
const parts = rangeStr.split('-');
20+
const startIP = parts[0];
21+
const endPart = parts[1];
22+
23+
const startOctets = startIP.split('.').map(Number);
24+
25+
// Bepaal eindnummer (handelt '...1.1-50' en '...1.1-192.168.1.50' af)
26+
let endLastOctet = 0;
27+
if (endPart.includes('.')) {
28+
endLastOctet = parseInt(endPart.split('.')[3]);
29+
} else {
30+
endLastOctet = parseInt(endPart);
31+
}
32+
33+
// Genereer IP lijst (alleen voor laatste octet ranges voor nu)
34+
for (let i = startOctets[3]; i <= endLastOctet; i++) {
35+
ips.push(`${startOctets[0]}.${startOctets[1]}.${startOctets[2]}.${i}`);
36+
}
37+
} catch (e) {
38+
console.error("Parse error:", e);
39+
}
40+
return ips;
41+
}
42+
1343
// --- API: SCAN ---
14-
// Route om het netwerk te scannen. Gebruikt de 'subnet' query parameter.
1544
app.get('/api/scan', async (req, res) => {
1645
try {
17-
// Lees de 'subnet' parameter uit de URL (bijv. ?subnet=192.168.1.1-255)
18-
const scanRange = req.query.subnet || null;
19-
console.log(`[SCAN] Start op range: ${scanRange ? scanRange : 'Auto (Lokaal)'}`);
20-
21-
// local-devices voert de ARP scan uit. Als scanRange null is, scant het lokaal.
22-
const devices = await find(scanRange);
46+
const scanRange = req.query.subnet;
47+
console.log(`[SCAN] Start: ${scanRange || 'Auto'}`);
48+
49+
let results = [];
50+
51+
if (scanRange && scanRange.includes('-')) {
52+
// --- SNELLE MODUS: Parallel Pingen ---
53+
const ipList = parseIPRange(scanRange);
54+
console.log(`[SCAN] ${ipList.length} IP's pingen...`);
55+
56+
// 1. Ping alles tegelijk (Promise.all) voor maximale snelheid
57+
// We pingen met een korte timeout (1s) omdat we er veel tegelijk doen.
58+
// '-c 1' zorgt dat er maar 1 packet verstuurd wordt.
59+
const pingPromises = ipList.map(ip =>
60+
ping.promise.probe(ip, { timeout: 1, extra: ['-c', '1'] })
61+
);
2362

24-
console.log(`[SCAN] Klaar. ${devices.length} apparaten gevonden.`);
63+
const pingResults = await Promise.all(pingPromises);
64+
65+
// Filter alleen de apparaten die online zijn
66+
const aliveHosts = pingResults.filter(r => r.alive);
67+
console.log(`[SCAN] Ping klaar. ${aliveHosts.length} hosts online.`);
68+
69+
// 2. Haal ARP data op (nu de ARP cache gevuld is door de pings)
70+
// Dit koppelt MAC adressen aan de gevonden IP's
71+
const arpTable = await find();
72+
73+
// 3. Combineer data
74+
results = aliveHosts.map(host => {
75+
// Zoek MAC in ARP tabel
76+
const arpEntry = arpTable.find(a => a.ip === host.host);
77+
return {
78+
ip: host.host,
79+
// Gebruik ARP naam of 'Unknown'
80+
name: arpEntry ? arpEntry.name : 'Unknown',
81+
// Gebruik ARP mac of een placeholder zodat hij tenminste in de lijst komt
82+
mac: arpEntry ? arpEntry.mac : '??:??:??:??:??:??'
83+
};
84+
});
85+
86+
} else {
87+
// --- AUTO MODUS (local-devices standaard) ---
88+
// Voor als er geen specifieke range wordt opgegeven
89+
results = await find(scanRange || null);
90+
}
91+
92+
console.log(`[SCAN] Klaar. ${results.length} resultaten verstuurd.`);
2593

2694
res.json({
2795
success: true,
28-
devices: devices
96+
devices: results
2997
});
3098

3199
} catch (error) {
32-
console.error('[SCAN] Fout bij netwerk scan:', error);
33-
res.status(500).json({
34-
success: false,
35-
message: 'Kon netwerk niet scannen. Controleer of de container met --network host draait en of de benodigde tools (net-tools) aanwezig zijn.'
36-
});
100+
console.error('[SCAN] Error:', error);
101+
res.status(500).json({ success: false, message: error.message });
37102
}
38103
});
39104

40105
// --- API: PING ---
41-
// Route om een specifiek IP-adres te pingen. Gebruikt een JSON body.
106+
// Endpoint voor het pingen van een enkel IP adres
42107
app.post('/api/ping', async (req, res) => {
43108
const { ip } = req.body;
44-
45-
if (!ip) {
46-
return res.status(400).json({ success: false, message: 'Geen IP-adres opgegeven' });
47-
}
109+
if (!ip) return res.status(400).json({ success: false });
48110

49111
try {
50-
console.log(`[PING] Pingen naar ${ip}...`);
51-
52-
// Voer de ping uit (met een korte timeout en slechts 1 pakket)
53-
const resPing = await ping.promise.probe(ip, {
54-
timeout: 2,
55-
extra: ["-c", "1"] // Stuur slechts 1 pakket (Linux/macOS)
56-
});
57-
112+
const resPing = await ping.promise.probe(ip, { timeout: 2 });
58113
res.json({
59114
success: true,
60-
alive: resPing.alive, // true of false
61-
time: resPing.time, // Latency in ms
62-
output: resPing.output // Volledige ping output (voor debug)
115+
alive: resPing.alive,
116+
time: resPing.time
63117
});
64-
65118
} catch (error) {
66-
console.error('[PING] Fout:', error);
67-
res.status(500).json({ success: false, message: 'Ping mislukt. Controleer IP en netwerk.' });
119+
res.status(500).json({ success: false });
68120
}
69121
});
70122

0 commit comments

Comments
 (0)