const dns = require("dns"); const superagent = require("superagent"); function resolveDNSAsync(domain) { return new Promise((res, rej) => { if (!/([\--z]+\.)?([\--z]+)\.([A-z]+)/g.test(domain)) return rej("Not a valid domain"); const options = { family: 4, hints: dns.ADDRCONFIG | dns.V4MAPPED }; dns.lookup(domain, options, (err, address, family) => { if (err) return rej(err); res(address); }); }); } function roundToTwo(num) { return +(Math.round(num + "e+2") + "e-2"); } module.exports = () => { // Code entered here will be run every 5 minutes return new Promise(async (res, rej) => { let servers = { canterlot: [await resolveDNSAsync("canterlot.equestria.dev"), 52937], ponyville: [await resolveDNSAsync("ponyville-ipv4.equestria.dev"), 52937], bridlewood: [await resolveDNSAsync("bridlewood.equestria.dev"), 52937], zephyrheights: [await resolveDNSAsync("zephyrheights-ipv4.equestria.dev"), 52938], maretimebay: [await resolveDNSAsync("maretimebay-ipv4.equestria.dev"), 52937] } let stats = {} for (let key in Object.keys(servers)) { key = Object.keys(servers)[key]; let status = { online: null, cpu: null, memory: null, os: null, uptime: null } superagent.get(`http://${servers[key][0]}:${servers[key][1]}/json`) .timeout({ response: 5000, }) .then(data => data = data.body) .then(data => { status.online = true; status.cpu = data.cpu; status.cpu.load = Math.floor(data.cpu.load * 100); status.memory = data.memory; status.memory.swap.used = roundToTwo(data.memory.swap.used / 1073741824); status.memory.swap.free = roundToTwo(data.memory.swap.free / 1073741824); status.memory.swap.total = roundToTwo(data.memory.swap.total / 1073741824); status.memory.physical.used = roundToTwo(data.memory.physical.used / 1073741824); status.memory.physical.free = roundToTwo(data.memory.physical.free / 1073741824); status.memory.physical.total = roundToTwo(data.memory.physical.total / 1073741824); status.os = data.os; status.uptime = data.uptime; }) .catch(reason => { if (reason.timeout) { // We timed out. status.online = false; } else { if(reason.code == "ECONNREFUSED") { status.online = false; console.warn(`Server ${key} refused our connection. `) } else { console.error(reason); } } }) .finally(() => { stats[key] = status; if(Object.keys(stats).length == Object.keys(servers).length) { res(stats); } }); } }); }