@@ -6,65 +6,117 @@ const ping = require('ping');
66const app = express ( ) ;
77const PORT = 3000 ;
88
9- // Middleware
109app . use ( cors ( ) ) ;
1110app . 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.
1544app . 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
42107app . 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