diff options
-rw-r--r-- | app.js | 239 | ||||
-rw-r--r-- | config.js | 2 | ||||
-rw-r--r-- | numberlogger.js | 20 | ||||
-rw-r--r-- | package.json | 9 | ||||
-rw-r--r-- | services.js | 1 |
5 files changed, 131 insertions, 140 deletions
@@ -1,84 +1,93 @@ var os = require('os'); -var http = require('http'); var ps = require('portscanner'); -var dispatcher = require('httpdispatcher'); -var spawn = require('child_process').spawn; var nl = require('./numberlogger.js'); -var services = require('./services.js'); +var config = require('./config.js'); +var express = require('express'); +var compression = require('compression'); var PORT = 3369; -var logger = function(name,length) { +var serverstat = { + "uptime": os.uptime(), + "load": [0, 0, 0], + "services": {}, + "stats" : {} +}; + +var serverinfo = { + "hostname": os.hostname(), + "release": os.release(), + "cpuname": os.cpus()[0].model, + "cpunum": os.cpus().length, + "totmem": Math.round(os.totalmem()/1024/1024), + "desc" : config.description, + "stats": {} +}; + +var statResponse = {}; + +function checkp(key) { + ps.checkPortStatus(config.services[key], 'localhost', function (error, status) { + serverstat.services[key] = (status == 'open'); + }) +} + +var logger = function (name, length) { this.name = name; - this.sec = new nl(name+":sec",length); - this.min = new nl(name+":min",length); - this.hrs = new nl(name+":hrs",length); - this.day = new nl(name+":day",length); + this.sec = new nl(name + ":sec", length); + this.min = new nl(name + ":min", length); + this.hrs = new nl(name + ":hrs", length); + this.day = new nl(name + ":day", length); this.time = new Date(); -} +}; -logger.prototype.add = function(time,x) { - function average(l,n) { +logger.prototype.add = function (time, x) { + function average(l, n) { var sum = 0; - for (var i=0;i<n;++i) + for (var i = 0; i < n; ++i) sum += l.ns[l.len - 1 - i]; - return sum/n; + return sum / n; } - if (time.getDay()!=this.time.getDay()) - this.day.add(average(this.hrs,24)); + + if (time.getDay() != this.time.getDay()) + this.day.add(average(this.hrs, 24)); if (time.getHours() != this.time.getHours()) - this.hrs.add(average(this.min,60)); + this.hrs.add(average(this.min, 60)); if (time.getMinutes() != this.time.getMinutes()) - this.min.add(average(this.sec,60)); + this.min.add(average(this.sec, 60)); this.sec.add(x); this.time = time; -} - -logger.prototype.stringify = function() { - return [this.sec.stringify(),this.min.stringify(),this.hrs.stringify(),this.day.stringify()]; -} - -var cpustat = new logger("cpu",100); -var memstat = new logger("mem",100); - -var serverstat={ - "hostname":os.hostname(), - "release":"undef", - "uptime":"", - "load":[0,0,0], - "cpu":cpustat.stringify(), - "mem":memstat.stringify(), - "services":{} -} - -serverstat.release = os.release(); - -function secondsToString(seconds) -{ - function adds(x,a){ - return x + " " + a + " "; +}; + +logger.prototype.setupResponse = function(res){ + var host = this; + var stat = []; + function setupSingleStat(id){ + stat.push(host[id].name); + res[host[id].name] = function (stat) { + stat.stats[host.name] = host[id].stringify(); + }; } - var numdays = Math.floor(seconds / 86400); seconds%=86400; - var numhours = Math.floor(seconds / 3600); seconds%=3600; - var numminutes = Math.floor(seconds / 60); seconds%=60; - return adds(numdays,"day") + adds(numhours,"hrs")+ adds(numminutes,"min") + adds(seconds,"sec"); - -} - -function checkp(key){ - ps.checkPortStatus(services[key], 'localhost', function(error, status) { - // Status is 'open' if currently in use or 'closed' if available - // console.log(key,status); - if (status=='open') - serverstat.services[key]=true; - else - serverstat.services[key]=false; - }) -} - -function refreshStat(){ - for (key in services) { - if (services.hasOwnProperty(key)) { + console.log("Setting up response for "+this.name); + setupSingleStat("sec"); + setupSingleStat("min"); + setupSingleStat("hrs"); + setupSingleStat("day"); + serverinfo.stats[this.name] = stat; +}; + +logger.prototype.stringify = function () { + return [this.sec.stringify(), this.min.stringify(), this.hrs.stringify(), this.day.stringify()]; +}; + +var cpustat = new logger("cpu", 100); +var memstat = new logger("mem", 100); +cpustat.setupResponse(statResponse); +memstat.setupResponse(statResponse); + +function refreshStat() { + for (var key in config.services) { + if (config.services.hasOwnProperty(key)) { checkp(key); } } @@ -86,46 +95,11 @@ function refreshStat(){ serverstat.load = os.loadavg(); } -function handleRequest(request, response){ - try { - //log the request on console -// console.log(request.url); - //Disptach - dispatcher.dispatch(request, response); - } catch(err) { - console.log(err); - } -} - -//For all your static (js/css/images/etc.) set the directory name (relative path). -dispatcher.setStatic('resources'); - -//A sample GET request -dispatcher.onGet("/", function(req, res) { - res.writeHead(200, {'Content-Type': 'application/json','Access-Control-Allow-Origin': '*'}); - res.end(JSON.stringify(serverstat)); -}); - -//A sample POST request -//dispatcher.onPost("/post1", function(req, res) { -// res.writeHead(200, {'Content-Type': 'text/plain'}); -// res.end('Got Post Data'); -//}); - -//Create a server -var server = http.createServer(handleRequest); - -//Lets start our server -server.listen(PORT, function(){ - //Callback triggered when server is successfully listening. Hurray! - console.log("Server listening on: http://localhost:%s", PORT); -}); - refreshStat(); -setInterval(refreshStat,1000); +setInterval(refreshStat, 1000); -function getCPUInfo(callback){ +function getCPUInfo() { var cpus = os.cpus(); var user = 0; @@ -133,52 +107,67 @@ function getCPUInfo(callback){ var sys = 0; var idle = 0; var irq = 0; - var total = 0; - for(var cpu in cpus){ + for (var cpu in cpus) + if (cpus.hasOwnProperty(cpu)) { - user += cpus[cpu].times.user; - nice += cpus[cpu].times.nice; - sys += cpus[cpu].times.sys; - irq += cpus[cpu].times.irq; - idle += cpus[cpu].times.idle; - } + user += cpus[cpu].times.user; + nice += cpus[cpu].times.nice; + sys += cpus[cpu].times.sys; + irq += cpus[cpu].times.irq; + idle += cpus[cpu].times.idle; + } var total = user + nice + sys + idle + irq; return { - 'idle': idle, + 'idle': idle, 'total': total }; } -function getUsage(callback, free){ - +function getUsage() { + var stats = getCPUInfo(); - setInterval(function() { + setInterval(function () { var nstats = getCPUInfo(); - var endIdle = nstats.idle; - var endTotal = nstats.total; - var idle = nstats.idle - stats.idle; - var total = nstats.total - stats.total; - var perc = 1 - idle / total; + var idle = nstats.idle - stats.idle; + var total = nstats.total - stats.total; + var perc = 1 - idle / total; stats = nstats; var time = new Date(); - cpustat.add(time,perc); - memstat.add(time,memPercentage()); - serverstat.cpu=cpustat.stringify(); - serverstat.mem=memstat.stringify(); - - }, 1000 ); + cpustat.add(time, perc); + memstat.add(time, memPercentage()); + }, 1000); } -function memPercentage(){ +function memPercentage() { return 1 - os.freemem() / os.totalmem(); } getUsage(); + +var app = express(); +app.use(compression()); +app.get('/', function (req, res) { + res.append('Content-Type', 'application/json'); + res.append('Access-Control-Allow-Origin', '*'); + res.send(JSON.stringify(serverinfo)); +}); + +app.get('/stat', function (req, res) { + res.append('Content-Type', 'application/json'); + res.append('Access-Control-Allow-Origin', '*'); + var stat = JSON.parse(JSON.stringify(serverstat)); + for (var query in req.query) + if (req.query.hasOwnProperty(query)) + statResponse[req.query[query]](stat); + res.send(JSON.stringify(stat)); +}); +app.listen(PORT); +console.log("Server listening on: %s", PORT); diff --git a/config.js b/config.js new file mode 100644 index 0000000..bb2699e --- /dev/null +++ b/config.js @@ -0,0 +1,2 @@ +module.exports.services = {"ssh": 22, "minecraft": 25565}; +module.exports.description = "This is my desc"; diff --git a/numberlogger.js b/numberlogger.js index 764027e..95b9b4f 100644 --- a/numberlogger.js +++ b/numberlogger.js @@ -1,18 +1,18 @@ -var numberLogger = function(name,length){ - this.name=name; +var numberLogger = function (name, length) { + this.name = name; this.ns = new Array(length); this.len = length; - for (i=0;i<length;++i) + for (i = 0; i < length; ++i) this.ns[i] = 0; -} +}; -numberLogger.prototype.add = function(x) { - this.ns.splice(0,1); +numberLogger.prototype.add = function (x) { + this.ns.splice(0, 1); this.ns.push(x); -} +}; -numberLogger.prototype.stringify = function() { - return {"name":this.name,"dat":this.ns,"len":this.length}; -} +numberLogger.prototype.stringify = function () { + return {"name": this.name, "dat": this.ns, "len": this.length}; +}; module.exports = numberLogger; diff --git a/package.json b/package.json index 38c1be5..42d936d 100644 --- a/package.json +++ b/package.json @@ -1,9 +1,9 @@ { "name": "serverstat", "version": "0.0.1", - "description":"server status generator", + "description": "server status generator", "bin": { - "bilicom": "./bin/serverstat.js" + "bilicom": "./bin/serverstat.js" }, "author": { "name": "Tuowen Zhao", @@ -15,7 +15,8 @@ }, "license": "MIT", "dependencies": { - "portscanner": "1.0.0", - "httpdispatcher": "1.0.0" + "portscanner": "1.0.0", + "express": "4.14.0", + "compression": "1.6.2" } } diff --git a/services.js b/services.js deleted file mode 100644 index e812e50..0000000 --- a/services.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = {"ssh":22,"minecraft":25565}; |