glass-isc-dhcp/lib/lease_parser.js

135 lines
4.8 KiB
JavaScript

/**
* Created by cmiles on 8/9/2017.
*/
module.exports = {
parse: function(input) {
var lease_data = input.split("lease");
for (i = 0; i < lease_data.length; i++) {
ip_address = "";
lines = lease_data[i].split("\n");
for (l = 0; l < lines.length; l++) {
/* Trim whitespaces at each ends of the line */
lines[l] = lines[l].trim();
/* Break each newline into an array split into spaces
Ex: [ 'starts', '3', '2017/08/09', '04:50:53;' ]
*/
line_data_arg = lines[l].split(" ");
if (/{/i.test(lines[l]) && /\./i.test(lines[l]) && !/uid/i.test(lines[l])){
ip_address = line_data_arg[0].trim();
if(typeof dhcp_lease_data[ip_address] === "undefined") {
dhcp_lease_data[ip_address] = {};
}
option_data = {};
}
if(ip_address != "") {
if (/start/i.test(lines[l])) {
/*
Make sure we force format as UTC because that is what the leases are formatted in
*/
date = (line_data_arg[2] + ' ' + line_data_arg[3]).trim().replace(/\//gi, '-').replace(/;/i, '') + ' UTC';
start_unix_time = (Date.parse(date) / 1000);
dhcp_lease_data[ip_address].start = start_unix_time;
}
if (/ends/i.test(lines[l])) {
/*
Make sure we force format as UTC because that is what the leases are formatted in
*/
lease_end = (line_data_arg[2] + ' ' + line_data_arg[3]).trim().replace(/\//gi, '-').replace(/;/i, '') + ' UTC';
now_unix_time = parseInt((new Date().getTime() / 1000).toFixed(0));
end_unix_time = parseInt((new Date(lease_end).getTime() / 1000).toFixed(0).toLocaleString());
/*
console.log('now ' + now_unix_time);
console.log('end ' + end_unix_time);
console.log('now ' + new Date());
console.log('end_raw ' + lease_end);
console.log('end ' + new Date(lease_end));
*/
if (end_unix_time <= now_unix_time) {
delete dhcp_lease_data[ip_address];
break;
}
dhcp_lease_data[ip_address].end = end_unix_time;
}
if (/ethernet/i.test(lines[l])) {
if(typeof line_data_arg[2] !== "undefined") {
dhcp_lease_data[ip_address].mac = line_data_arg[2].replace(/;/gi, '').trim();
/* Mac OUI Lookup */
var mac_oui = dhcp_lease_data[ip_address].mac.split(":").join("").toUpperCase().slice(0,6);
dhcp_lease_data[ip_address].mac_oui_vendor = '';
if(typeof oui_data[mac_oui] !== "undefined") {
dhcp_lease_data[ip_address].mac_oui_vendor = oui_data[mac_oui];
}
}
}
if (/hostname/i.test(lines[l])) {
if(typeof line_data_arg[1] !== "undefined")
dhcp_lease_data[ip_address].host = line_data_arg[1].replace(/;/gi, '').replace(/"/gi, '').trim();
}
if (/set/i.test(lines[l])) {
set_data = lines[l].replace(/;/gi, '').replace(/"/gi, '').replace(/ = /gi, ' ').replace(/set/gi, '').trim();
set_data_split = set_data.split(" ");
option_key = set_data_split[0].trim();
option_value = set_data.replace(RegExp(option_key, "g"), '').trim();
option_data[option_key] = option_value;
if (typeof dhcp_lease_data[ip_address]['options'] === "undefined")
dhcp_lease_data[ip_address]['options'] = [];
}
if (/option/i.test(lines[l])) {
set_data = lines[l].replace(/;/gi, '').replace(/"/gi, '').replace(/ = /gi, ' ').replace(/option/gi, '').trim();
set_data_split = set_data.split(" ");
option_key = set_data_split[0].trim();
option_value = set_data.replace(RegExp(option_key, "g"), '').trim();
option_data[option_key] = option_value;
if (typeof dhcp_lease_data[ip_address]['options'] === "undefined")
dhcp_lease_data[ip_address]['options'] = [];
}
if (lines[l].charAt(0) == "}" && typeof dhcp_lease_data[ip_address]['options'] !== "undefined"){
if (typeof option_data !== 'undefined') {
dhcp_lease_data[ip_address]['options'] = option_data;
}
option_data = [];
}
/* End of Lease */
if (lines[l].charAt(0) == "}"){
if(debug_watch_lease_parse_stream) {
console.log("[Glass Server] Lease Parse");
console.log(JSON.stringify(dhcp_lease_data[ip_address], null, 2));
}
}
}
}
}
return;
},
clean: function() {
for (var key in dhcp_lease_data) {
now_unix_time = parseInt((new Date().getTime() / 1000).toFixed(0));
end_unix_time = dhcp_lease_data[key].end;
if((now_unix_time >= end_unix_time)) {
console.log("[DHCP Lease Data] Lease " + key + " has expired - clearing");
delete dhcp_lease_data[key];
}
}
},
};