let nameJson = []; let scanJson = { aps: [], stations: [] }; const drawScan = () => { let html; // Access Points getE("apNum").innerHTML = scanJson.aps.length; html = ` SSID Name Ch RSSI Enc MAC Vendor ` scanJson.aps.forEach((item, index) => { const selected = item[item.length - 1]; const width = parseInt(item[3]) + 130; let color = ''; if (width < 50) color = "meter_red"; else if (width < 70) color = "meter_orange"; else color = "meter_green"; html += ` " : ""}> ${index} ${esc(item[0])} ${item[1].length > 0 ? esc(item[1]) : ``} ${esc(item[2])}"
item[3]
${esc(item[4])} ${item[4] === "-" ? "" : "🔒"} ${esc(item[5])} ${esc(item[6])} `; }) getE("apTable").innerHTML = html; // Stations getE("stNum").innerHTML = scanJson.stations.length; html = ` Vendor MAC Ch Name Pkts AP Last seen `; scanJson.stations.forEach((item, index) => { const selected = item[item.length - 1]; const ap = item[5] >= 0 ? esc(scanJson.aps[item[5]][0]) : ""; html += ` " : ""}> ${i} ${esc(item[3])} ${esc(item[0])} ${esc(item[1])} ${item[2].length > 0 ? esc(item[2]) : ``} ${esc(item[4])} ${ap} ${esc(item[6])} `; }) getE("stTable").innerHTML = html; } const drawNames = () => { getE("nNum").innerHTML = nameJson.length; let html = ` MAC Vendor Name AP-BSSID Ch ` nameJson.forEach((item, index) => { const selected = item[item.length - 1]; html += ` " : ""}> ${index} ${esc(item[0])} ${esc(item[1])} ${esc(item[2].substring(0,16))} ${esc(item[3])} ${esc(item[4])} `; }) getE("nTable").innerHTML = html; } const scan = type => { getFile(`run?cmd=scan ${type == 0 ? "aps" : "stations -t"} ${getE("scanTime").value}s -ch ${getE("ch").options[getE("ch").selectedIndex].value}`); } const load = () => { // APs and Stations getFile("run?cmd=save scan", () => getFile("scan.json", res => { scanJson = JSON.parse(res); drawScan(); }) ); // Names getFile("run?cmd=save names", () => getFile("names.json", res => { nameJson = JSON.parse(res); drawNames(); }) ); } const selectRow = (type, id, selected) => { if (type === 0 || type === 1) { scanJson.aps[id][7] = selected; drawScan(); } else if (type === 2) { save(id); nameJson[id][5] = selected; drawNames(); } switch(type) { case 0: return getFile(`run?cmd=${selected ? "" : "de" } select ap ${id}`); case 1: return getFile(`run?cmd=${selected ? "" : "de" } select station ${id}`); case 2: return getFile(`run?cmd=${selected ? "" : "de" } select name ${id}`); } } const remove = (type, id) => { if (type === 0 || type === 1) { scanJson.aps.splice(id, 1); drawScan(); } else if (type === 2) { nameJson.splice(id, 1); drawNames(); } switch(type) { case 0: getFile(`run?cmd=remove ap ${id}`); break; case 1: getFile(`run?cmd=remove station ${id}`); break; case 2: getFile(`run?cmd=remove name ${id}`); } } const save = id => { const mac = getE(`name_${id}_mac`).innerHTML.replace("
" ,""); const name = getE(`name_${id}_name`).innerHTML.replace("
", ""); const apbssid = getE(`name_${id}_apbssid`).innerHTML.replace("
", ""); const ch = getE(`name_${id}_ch`).innerHTML.replace("
", ""); const changed = mac !== nameJson[id][0] || name !== nameJson[id][2] || apbssid !== nameJson[id][3] || ch !== nameJson[id][4]; if (changed) { nameJson[id][0] = mac; nameJson[id][2] = name; nameJson[id][3] = apbssid; nameJson[id][4] = ch; if (nameJson[id][0].length !== 17) { return showMessage("ERROR: MAC invalid"); } getFile(`run?cmd=replace name ${id} -n "${nameJson[id][2]}" -m "${nameJson[id][0]}" -ch ${nameJson[id][4]} -b "${nameJson[id][3]}" ${nameJson[id][5] ? "-s" : ""}`); drawNames(); } } const add = (type, id) => { if(nameJson.length >= 25){ return showMessage("Device Name List is full!"); } switch(type) { case 0: getFile(`run?cmd=add name "${scanJson.aps[id][0]}" -ap ${id}`); scanJson.aps[id][1] = scanJson.aps[id][0]; // name = SSID nameJson.push([scanJson.aps[id][5], scanJson.aps[id][6], scanJson.aps[id][0], "", scanJson.aps[id][2], false]); drawScan(); break; case 1: getFile(`run?cmd=add name "${scanJson.stations[id][0]}" station ${id}`); scanJson.stations[id][2] = `device_${nameJson.length}`; // name = device_ nameJson.push([scanJson.stations[id][0], scanJson.stations[id][3], `device_${nameJson.length}`, scanJson.aps[scanJson.stations[id][5]][5], scanJson.stations[id][1], false]); drawScan(); break; case 2: getFile(`run?cmd=add name device_${nameJson.length} -m 00:00:00:00:00:00 -ch 1`); nameJson.push(["00:00:00:00:00:00", "", `device_${nameJson.length}`, "", 1, false]); drawNames(); } drawNames(); } const selectAll = (type, select) => { switch(type) { case 0: getFile(`run?cmd=${select ? "" : "de"}select aps`); scanJson.aps.forEach(item => { item[7] = select; return item }) drawScan(); break; case 1: getFile(`run?cmd=${select ? "" : "de"}select stations`); scanJson.stations.forEach(item => { item[7] = select; return item }) drawScan(); break; case 2: getFile(`run?cmd=${select ? "" : "de"}select names`); nameJson.stations.forEach(item => { item[5] = select; return item }) drawNames(); } }