raumstatus/node/statusbot.js

142 lines
3.9 KiB
JavaScript

var _u = require("underscore");
var express = require('express'),
app = express();
var flash = require('connect-flash');
var SnmpMac = require("./snmp-mac");
var IpPoll = require("./ip-poll");
var spaceanswer = {
"api": "0.13",
"space": "Chaostreff Dortmund",
"logo": "http://www.chaostreff-dortmund.de/logo.jpg",
"url": "http://www.chaostreff-dortmund.de/",
"location": {
"address": "Braunschweiger Str 22, 44145 Dortmund, Germany",
"lon": 7.4649449,
"lat": 51.527611
},
"contact": {
"phone": "+49231 8 404 777",
"irc": "irc://irc.hackint.eu/#ctdo",
"ml": "ccc@chaostreff-dortmund.de",
"twitter": "@ctdo",
"issue_mail": "server-admin@chaostreff-dortmund.de"
},
"issue_report_channels": [ "issue_email" ],
"state": {
"open": null,
"lastchange": 0
}
};
var simpleanswer = { "state": "unknown",
"count": 0,
"names": [],
"lastchange": 0
};
var snmpMac = new SnmpMac("juni.ctdo.de", "ctdo23");
var ippoll = new IpPoll("switch2.raum.ctdo.de", "195.160.169.20-62 195.160.169.70-126");
snmpMac.on('done', function (res) {
console.log(res);
simpleanswer.names = res;
simpleanswer.lastchange = parseInt((new Date().getTime()) / 1000);
});
ippoll.on('doneCount', function (num) {
console.log("there are " + num + " hosts up");
simpleanswer.count = num;
simpleanswer.lastchange = parseInt((new Date().getTime()) / 1000);
});
ippoll.on('doneState', function (state) {
console.log("room state is: " + state);
simpleanswer.state = state;
spaceanswer.state.open = state;
spaceanswer.state.lastchange = parseInt((new Date().getTime()) / 1000);
simpleanswer.lastchange = spaceanswer.state.lastchange;
});
function work() {
snmpMac.poll();
ippoll.pollCount();
ippoll.pollState();
}
work();
setInterval(work, 60000);
app.set('views', __dirname + '/views');
app.set('view engine', 'jade');
app.use(express.static(__dirname + '/public'));
app.use(express.bodyParser());
app.use(express.cookieParser('chaostreff'));
app.use(express.session({ cookie: { maxAge: 60000 }}));
app.use(flash());
app.configure('development', function () {
app.use(express.errorHandler());
app.locals.pretty = true;
});
app.get('/api/spaceapi/v13', function (req, res) {
res.send(spaceanswer);
});
app.get('/api/simple/v2', function (req, res) {
res.send(simpleanswer);
});
app.get('/db', function (req, res) {
res.render('database', { title: 'Manage MAC', status: req.flash('status') })
});
app.post('/form', function (req, res) {
var mac = req.body.mac,
label = req.body.label,
action = req.body.action;
var status = "";
mac = mac.toLowerCase();
if (/^([0-9a-f]{2}[:-]){5}([0-9a-f]{2})$/.exec(mac)) {
if (action == "add") {
if (/^[0-9a-zA-Z]+$/.exec(label)) {
snmpMac.add(mac, label, function (err) {
console.log("add mac result: " + err);
req.flash('status', err == null ? "" : "database error: " + err);
res.redirect("/db");
});
} else {
req.flash('status', 'label is invalid ("^[0-9a-zA-Z]+$")');
res.redirect("/db");
}
} else if (action == "remove") {
snmpMac.delete(mac, function (err) {
console.log("delete mac result: " + err);
req.flash('status', err == null ? "" : "database error: " + err);
res.redirect("/db");
});
} else {
res.redirect("/db");
}
} else {
req.flash('status', 'mac address is invalid');
res.redirect("/db");
}
});
app.get('/', function (req, res) {
res.render('index', { title: 'Home', status: req.flash('status') })
});
app.disable('x-powered-by');
app.listen(3000);
snmpMac.poll();
ippoll.pollCount();
ippoll.pollState();