/
githubmirror
/
edex-ui
Обзор
Документация
Войти
/
githubmirror
/
edex-ui
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
v2.2.6
src/classes/netstat.class.js
186 строк
8 KB
Gabriel Saillard
refactor: store maxmind databases cache in config subdir #937
03 дек 2020, 23:46
Не верифицирован
03 дек 2020, 23:46
eb747a0
Код
Авторство
О чём код?
class Netstat { constructor(parentId) { if (!parentId) throw "Missing parameters"; // Create DOM this.parent = document.getElementById(parentId); this.parent.innerHTML += `<div id="mod_netstat"> <div id="mod_netstat_inner"> <h1>NETWORK STATUS<i id="mod_netstat_iname"></i></h1> <div id="mod_netstat_innercontainer"> <div> <h1>STATE</h1> <h2>UNKNOWN</h2> </div> <div> <h1>IPv4</h1> <h2>--.--.--.--</h2> </div> <div> <h1>PING</h1> <h2>--ms</h2> </div> </div> </div> </div>`; this.offline = false; this.lastconn = {finished: false}; // Prevent geoip lookup attempt until maxminddb is loaded this.iface = null; this.failedAttempts = {}; this.runsBeforeGeoIPUpdate = 0; this._httpsAgent = new require("https").Agent({ keepAlive: false, maxSockets: 10 }); // Init updaters this.updateInfo(); this.infoUpdater = setInterval(() => { this.updateInfo(); }, 2000); // Init GeoIP integrated backend this.geoLookup = { get: () => null }; let geolite2 = require("geolite2-redist"); let maxmind = require("maxmind"); geolite2.downloadDbs(require("path").join(require("electron").remote.app.getPath("userData"), "geoIPcache")).then(() => { geolite2.open('GeoLite2-City', path => { return maxmind.open(path); }).catch(e => {throw e}).then(lookup => { this.geoLookup = lookup; this.lastconn.finished = true; }); }) } updateInfo() { window.si.networkInterfaces().then(async data => { let offline = false; let net = data[0]; let netID = 0; if (typeof window.settings.iface === "string") { while (net.iface !== window.settings.iface) { netID++; if (data[netID]) { net = data[netID]; } else { // No detected interface has the custom iface name, fallback to automatic detection on next loop window.settings.iface = false; return false; } } } else { // Find the first external, IPv4 connected networkInterface that has a MAC address set while (net.operstate !== "up" || net.internal === true || net.ip4 === "" || net.mac === "") { netID++; if (data[netID]) { net = data[netID]; } else { // No external connection! this.iface = null; document.getElementById("mod_netstat_iname").innerText = "Interface: (offline)"; this.offline = true; document.querySelector("#mod_netstat_innercontainer > div:first-child > h2").innerHTML = "OFFLINE"; document.querySelector("#mod_netstat_innercontainer > div:nth-child(2) > h2").innerHTML = "--.--.--.--"; document.querySelector("#mod_netstat_innercontainer > div:nth-child(3) > h2").innerHTML = "--ms"; break; } } } if (net.ip4 !== this.internalIPv4) this.runsBeforeGeoIPUpdate = 0; this.iface = net.iface; this.internalIPv4 = net.ip4; document.getElementById("mod_netstat_iname").innerText = "Interface: "+net.iface; if (net.ip4 === "127.0.0.1") { offline = true; } else { if (this.runsBeforeGeoIPUpdate === 0 && this.lastconn.finished) { this.lastconn = require("https").get({host: "myexternalip.com", port: 443, path: "/json", localAddress: net.ip4, agent: this._httpsAgent}, res => { let rawData = ""; res.on("data", chunk => { rawData += chunk; }); res.on("end", () => { try { let data = JSON.parse(rawData); this.ipinfo = { ip: data.ip, geo: this.geoLookup.get(data.ip).location }; let ip = this.ipinfo.ip; document.querySelector("#mod_netstat_innercontainer > div:nth-child(2) > h2").innerHTML = window._escapeHtml(ip); this.runsBeforeGeoIPUpdate = 10; } catch(e) { this.failedAttempts[e] = (this.failedAttempts[e] || 0) + 1; if (this.failedAttempts[e] > 2) return false; console.warn(e); console.info(rawData.toString()); let electron = require("electron"); electron.ipcRenderer.send("log", "note", "NetStat: Error parsing data from myexternalip.com"); electron.ipcRenderer.send("log", "debug", `Error: ${e}`); } }); }).on("error", e => { // Drop it }); } else if (this.runsBeforeGeoIPUpdate !== 0) { this.runsBeforeGeoIPUpdate = this.runsBeforeGeoIPUpdate - 1; } let p = await this.ping(window.settings.pingAddr || "1.1.1.1", 80, net.ip4).catch(() => { offline = true }); this.offline = offline; if (offline) { document.querySelector("#mod_netstat_innercontainer > div:first-child > h2").innerHTML = "OFFLINE"; document.querySelector("#mod_netstat_innercontainer > div:nth-child(2) > h2").innerHTML = "--.--.--.--"; document.querySelector("#mod_netstat_innercontainer > div:nth-child(3) > h2").innerHTML = "--ms"; } else { document.querySelector("#mod_netstat_innercontainer > div:first-child > h2").innerHTML = "ONLINE"; document.querySelector("#mod_netstat_innercontainer > div:nth-child(3) > h2").innerHTML = Math.round(p)+"ms"; } } }); } ping(target, port, local) { return new Promise((resolve, reject) => { let s = new require("net").Socket(); let start = process.hrtime(); s.connect({ port, host: target, localAddress: local, family: 4 }, () => { let time_arr = process.hrtime(start); let time = (time_arr[0] * 1e9 + time_arr[1]) / 1e6; resolve(time); s.destroy(); }); s.on('error', e => { s.destroy(); reject(e); }); s.setTimeout(1900, function() { s.destroy(); reject(new Error("Socket timeout")); }); }); } } module.exports = { Netstat };