aboutsummaryrefslogtreecommitdiffstats
path: root/web/js
diff options
context:
space:
mode:
Diffstat (limited to 'web/js')
-rw-r--r--web/js/nms-draw-chart.js111
-rw-r--r--web/js/nms-info-box.js110
-rw-r--r--web/js/nms-map-handlers.js272
-rw-r--r--web/js/nms-map.js3
-rw-r--r--web/js/nms-template.js74
-rw-r--r--web/js/nms-time.js16
-rw-r--r--web/js/nms.js55
7 files changed, 463 insertions, 178 deletions
diff --git a/web/js/nms-draw-chart.js b/web/js/nms-draw-chart.js
index da621e7..60698c0 100644
--- a/web/js/nms-draw-chart.js
+++ b/web/js/nms-draw-chart.js
@@ -16,63 +16,65 @@ function drawLatency(canvas, sw, chart, callback) {
var dataset = [];
$.getJSON( "/query?db=gondul&q="+q, function( results ) {
- results['results'][0]['series'].forEach(function(serie) {
- var data = [];
- serie['values'].forEach(function(element) {
- data.push({t: new Date(element[0]), y: element[1]});
- });
- var borderColor = "rgba(0,155,200,255)";
- console.log(serie['tags']['version']);
- if(serie['tags']['version'] === "v6") {
- borderColor = "rgba(100,155,100,255)";
+ try {
+ results['results'][0]['series'].forEach(function(serie) {
+ var data = [];
+ serie['values'].forEach(function(element) {
+ data.push({t: new Date(element[0]), y: element[1]});
+ });
+ var borderColor = "rgba(0,155,200,255)";
+ if(serie['tags']['version'] === "v6") {
+ borderColor = "rgba(100,155,100,255)";
+ }
+ dataset.push({data: data, fill:false, borderColor:borderColor, label:serie['tags']['version'] });
+ });
+ if(chart != false) {
+ chart.data.datasets = dataset;
+ chart.update();
+ return;
}
- dataset.push({data: data, fill:false, borderColor:borderColor, label:serie['tags']['version'] });
- });
- if(chart != false) {
- chart.data.datasets = dataset;
- chart.update();
- return;
- }
- var ctx = document.getElementById(canvas).getContext('2d');
- var myChart = new Chart(ctx, {
- type: 'line',
- data: {
- datasets: dataset
- },
- options: {
- legend: {
- display: false
+ var ctx = document.getElementById(canvas).getContext('2d');
+ var myChart = new Chart(ctx, {
+ type: 'line',
+ data: {
+ datasets: dataset
},
- scales: {
- xAxes:[{
- type: 'time',
- time: {
- format: "HH:mm",
- unit: 'minute',
- tooltipFormat: 'HH:mm',
- displayFormats: {
- 'minute': 'HH:mm',
- 'hour': 'HH:mm',
- min: '00:00',
- max: '23:59'
- },
- }
- }],
- yAxes: [{
- ticks: {
- beginAtZero: true
+ options: {
+ legend: {
+ display: false
+ },
+ scales: {
+ xAxes:[{
+ type: 'time',
+ time: {
+ format: "HH:mm",
+ unit: 'minute',
+ tooltipFormat: 'HH:mm',
+ displayFormats: {
+ 'minute': 'HH:mm',
+ 'hour': 'HH:mm',
+ min: '00:00',
+ max: '23:59'
+ },
+ }
+ }],
+ yAxes: [{
+ ticks: {
+ beginAtZero: true
+ }
+ }]
+ },
+ responsive: true,
+ animation: false,
+ elements: {
+ line: {
+ tension: 0.05
}
- }]
- },
- responsive: true,
- animation: false,
- elements: {
- line: {
- tension: 0.05
- }
- }
- }
- });
+ }
+ }
+ });
+ } catch(e) {
+ }
if(callback != undefined) {
callback(myChart);
}
@@ -95,6 +97,7 @@ function drawSumOfPorts(canvas, sw) {
var bits_in = [];
var bits_out = [];
+
results['results'][0]['series'].forEach(function(serie) {
// Bytes in
diff --git a/web/js/nms-info-box.js b/web/js/nms-info-box.js
index 1971b61..1eea112 100644
--- a/web/js/nms-info-box.js
+++ b/web/js/nms-info-box.js
@@ -50,6 +50,10 @@ var nmsInfoBox = nmsInfoBox || {
'name': 'SNMP',
'panels': ['switchSNMP:misc']
},
+ 'links': {
+ 'name': 'Links',
+ 'panels': ['switchLinks']
+ },
'edit': {
'name': 'Edit settings',
'panels': ['switchEdit']
@@ -125,7 +129,11 @@ var nmsInfoBox = nmsInfoBox || {
'jnxBoxSerialNo': {
'name': 'Serial numbers',
'panels': ['inventoryListing:jnxBoxSerialNo']
- }
+ },
+ 'transceiver': {
+ 'name': 'Transceivers',
+ 'panels': ['inventoryListing:transceiver']
+ }
}
},
{
@@ -657,7 +665,13 @@ var switchPortsPanel = function () {
indicies.push(obj);
}
indicies.sort(function(a,b) {
- return snmpJson[a].ifIndex - snmpJson[b].ifIndex;
+ var tmpx = [ snmpJson[a].ifName, snmpJson[b].ifName ];
+ tmpx.sort();
+ if (tmpx[0] == snmpJson[a].ifName) {
+ return -1;
+ } else {
+ return 1;
+ }
});
for(var obji in indicies) {
var obj = indicies[obji];
@@ -686,7 +700,7 @@ var switchPortsPanel = function () {
}
} catch(e) {};
- groupObj.innerHTML = '<span class="panel-heading" style="display:block;"><a class="collapse-controller" role="button" data-toggle="collapse" href="#'+cleanObj+'-group">' + snmpJson[obj].ifDescr + ' </a><small>' + snmpJson[obj].ifAlias + '</small><span class="pull-right">' + traffic + '<i class="btn-xs ' + button + '"><span class="glyphicon ' + glyphicon + '" title="' + title + '" aria-hidden="true"></span></i></span></span>';
+ groupObj.innerHTML = '<span class="panel-heading" style="display:block;"><a class="collapse-controller" role="button" data-toggle="collapse" href="#'+cleanObj+'-group">' + snmpJson[obj].ifName + ' </a><small>' + snmpJson[obj].ifAlias + '</small><span class="pull-right">' + traffic + '<i class="btn-xs ' + button + '"><span class="glyphicon ' + glyphicon + '" title="' + title + '" aria-hidden="true"></span></i></span></span>';
var groupObjCollapse = document.createElement("div");
groupObjCollapse.id = cleanObj + "-group";
@@ -818,7 +832,7 @@ var switchAddPanel = function() {
var myData = JSON.stringify(myData);
$.ajax({
type: "POST",
- url: "/api/write/switch-add",
+ url: "/api/write/switches",
dataType: "text",
data:myData,
success: function (data, textStatus, jqXHR) {
@@ -885,6 +899,9 @@ var inventoryListingPanel = function() {
case 'jnxBoxSerialNo':
listTitle = 'Serial Numbers';
break;
+ case 'transceiver':
+ listTitle = 'Transceivers';
+ break;
default:
listTitle = 'Distro names';
}
@@ -900,15 +917,18 @@ var inventoryListingPanel = function() {
switch (this.mode) {
case 'distro_name':
value = nmsData.switches.switches[sw]["distro_name"];
+ resultArray.push([sw, value]);
break;
case 'sysDescr':
value = nmsData.snmp.snmp[sw]["misc"]["sysDescr"][0];
+ resultArray.push([sw, value]);
break;
case 'jnxBoxSerialNo':
if(testTree(nmsData,["snmp","snmp",sw,"misc","entPhysicalSerialNum"])) {
for (var x in nmsData.snmp.snmp[sw]["misc"]["entPhysicalSerialNum"]) {
value = "misc" + x + ":" + nmsData.snmp.snmp[sw]["misc"]["entPhysicalSerialNum"][x];
- resultArray.push([sw, value]);
+ var entPhysicalDescr = nmsData.snmp.snmp[sw]["misc"]["entPhysicalDescr"][x];
+ resultArray.push([sw, entPhysicalDescr+': '+value]);
}
}
if (testTree(nmsData,["snmp","snmp",sw,"misc","jnxVirtualChassisMemberSerialnumber"])) {
@@ -918,11 +938,23 @@ var inventoryListingPanel = function() {
}
}
value = nmsData.snmp.snmp[sw]["misc"]["jnxBoxSerialNo"][0];
+ resultArray.push([sw, value]);
break;
+ case 'transceiver':
+ if(testTree(nmsData,["snmp","snmp",sw,"misc","entPhysicalSerialNum"])) {
+ for (var x in nmsData.snmp.snmp[sw]["misc"]["entPhysicalSerialNum"]) {
+ var entPhysicalDescr = nmsData.snmp.snmp[sw]["misc"]["entPhysicalDescr"][x];
+ if(!entPhysicalDescr.match(/^SFP/)) {
+ continue;
+ }
+ value = entPhysicalDescr + ": " + nmsData.snmp.snmp[sw]["misc"]["entPhysicalSerialNum"][x];
+ resultArray.push([sw, entPhysicalDescr+': '+value]);
+ }
+ }
+ break;
+
}
} catch (e) {console.log("sw: " + sw); console.log(e);}
-
- resultArray.push([sw, value]);
}
resultArray.sort();
@@ -986,7 +1018,12 @@ var switchEditPanel = function () {
var tmpsw = '\'' + this.sw + '\'';
var tmpv = '\'' + v + '\'';
var tmphandler = '"nmsInfoBox._editChange(' + tmpsw + ',' + tmpv + ');"';
+ if(v == 'community') {
+ var html = '<input type="password" autocomplete="off" onfocus="this.type = \'text\'" class="form-control" value="' + template[v] + '" id="edit-' + this.sw + '-' + v + '" onchange=' + tmphandler + ' oninput=' + tmphandler + '>';
+ }
+ else {
var html = '<input type="text" class="form-control" value="' + template[v] + '" id="edit-' + this.sw + '-' + v + '" onchange=' + tmphandler + ' oninput=' + tmphandler + ' ' + (v == 'sysname' || v == 'subnet4' || v == 'subnet6' || v == 'mgmt_v4_gw' || v == 'mgmt_v6_gw' ? "readonly" : "") + '>';
+ }
if (v == "placement") {
v = "placement <a onclick='var _x = document.getElementById(\"edit-" + this.sw + "-placement\"); _x.value = \"\\\"reset\\\"\"; _x.oninput();' class='pull-right'>Reset</a>";
}
@@ -1055,7 +1092,7 @@ var switchEditPanel = function () {
var myData = nmsInfoBox._editStringify(this.sw);
$.ajax({
type: "POST",
- url: "/api/write/switch-update",
+ url: "/api/write/switches",
dataType: "text",
data:myData,
success: function (data, textStatus, jqXHR) {
@@ -1075,7 +1112,7 @@ var switchEditPanel = function () {
myData = JSON.stringify(myData);
$.ajax({
type: "POST",
- url: "/api/write/switch-update",
+ url: "/api/write/switches",
dataType: "text",
data:myData,
success: function (data, textStatus, jqXHR) {
@@ -1199,6 +1236,40 @@ nmsInfoBox.setLegendPick = function(tag,id) {
}
nmsInfoBox.addPanelType("switchSummary",switchSummaryPanel);
+var switchLinks = function() {
+ nmsInfoPanel.call(this,"switchLinks");
+ var latencyChart;
+ this.init = function() {
+ this.refresh();
+ };
+ this.refresh = function(reason) {
+ var content = [];
+ if (this.sw == false) {
+ console.log("ugh, cleanup failed?");
+ return;
+ }
+ var sw = this.sw;
+
+ var topp = document.createElement("div")
+ var urls = [ "https://gondul.tg.lol/api/templates/magic.conf/switch=" + sw,
+ "http://185.110.148.5/api/templates/magic.conf/switch=" + sw,
+ "http://gondul.tg.lol/api/templates/magic.conf/switch=" + sw ];
+ if (testTree(nmsData,['smanagement','switches',sw])) {
+ var mg = nmsData["smanagement"]["switches"][sw];
+ urls.push("ssh://[" + mg.mgmt_v6_addr + "]");
+ urls.push("ssh://" + mg.mgmt_v4_addr);
+ }
+ for (var x in urls) {
+ topp.appendChild(document.createElement("br"));
+ var link = document.createElement("a");
+ link.href = urls[x];
+ link.textContent = urls[x];
+ topp.appendChild(link);
+ }
+ this._render(topp);
+ };
+};
+nmsInfoBox.addPanelType("switchLinks",switchLinks);
/*
* Panel type: Add network
*
@@ -1221,7 +1292,7 @@ var networkAddPanel = function() {
var myData = JSON.stringify(myData);
$.ajax({
type: "POST",
- url: "/api/write/network-add",
+ url: "/api/write/networks",
dataType: "text",
data:myData,
success: function (data, textStatus, jqXHR) {
@@ -1253,14 +1324,13 @@ var networkListPanel = function() {
table.className = "table table-condensed";
table.id = "searchResults-table"
for (var net in networks) {
- console.log(networks[net]);
var row = table.insertRow(net);
var cell1 = row.insertCell(0);
var cell2 = row.insertCell(1);
var cell3 = row.insertCell(2);
cell1.innerHTML = "<a href='#' onclick='nmsInfoBox.showWindow(\"networkInfo\",\""+net+"\");'>"+net+ '</a>';
cell2.innerHTML = networks[net].vlan;
- cell3.innerHTML = networks[net].routing_point;
+ cell3.innerHTML = networks[net].router;
}
this._render(table);
@@ -1306,14 +1376,9 @@ var networkEditPanel = function() {
var tags;
for (var v in net) {
/*
- * Placement and tags needs to be sent and edited
+ * Tags needs to be sent and edited
* as plain JSON...
*/
- if (v == "placement") {
- place = JSON.stringify(net[v]);
- template[v] = place;
- continue;
- }
if (v == "tags") {
tags = JSON.stringify(net[v]);
template[v] = tags;
@@ -1384,10 +1449,10 @@ var networkEditPanel = function() {
};
this.save = function () {
- var myData = nmsInfoBox._editStringify(this.sw);
+ var myData = nmsInfoBox._editStringify(this.sw,"name");
$.ajax({
type: "POST",
- url: "/api/write/network-update",
+ url: "/api/write/networks",
dataType: "text",
data:myData,
success: function (data, textStatus, jqXHR) {
@@ -1396,6 +1461,7 @@ var networkEditPanel = function() {
nmsInfoBox.hide();
}
nmsData.invalidate("switches");
+ nmsData.invalidate("networks");
nmsData.invalidate("smanagement");
}
});
@@ -1500,7 +1566,7 @@ nmsInfoBox._editChange = function(sw, v) {
out.value = myData;
};
-nmsInfoBox._editStringify = function(sw) {
- nmsInfoBox._editValues['sysname'] = sw;
+nmsInfoBox._editStringify = function(sw, sysname='sysname') {
+ nmsInfoBox._editValues[sysname] = sw;
return JSON.stringify([nmsInfoBox._editValues]);
};
diff --git a/web/js/nms-map-handlers.js b/web/js/nms-map-handlers.js
index f9fe52b..90f6922 100644
--- a/web/js/nms-map-handlers.js
+++ b/web/js/nms-map-handlers.js
@@ -73,6 +73,13 @@ var handler_cpu = {
name:"CPU utilization"
};
+var handler_memory = {
+ init:memoryInit,
+ getInfo:memoryInfo,
+ tag:"memory",
+ name:"Memory utilization"
+};
+
var handler_health = {
init:healthInit,
getInfo:healthInfo,
@@ -85,6 +92,11 @@ var handler_mgmt = {
tag:"mgmt",
name:"Management info"
};
+var handler_net = {
+ getInfo:networkInfo,
+ tag:"net",
+ name:"Network info"
+};
var handler_snmpup = {
getInfo:snmpUpInfo,
tag:"snmpup",
@@ -124,6 +136,7 @@ var handlerInfo = function(tag,desc) {
var handlers = [
handler_health,
handler_mgmt,
+ handler_net,
handler_uplinks,
handler_temp,
handler_ping,
@@ -133,12 +146,13 @@ var handlers = [
handler_dhcp,
handler_snmp,
handler_cpu,
+ handler_memory,
handler_snmpup
];
function uplinkInfo(sw)
{
- var ret = new handlerInfo("uplink","Uplinks");
+ var ret = new handlerInfo("snmpup","Uplinks");
ret.why = "Uplinks";
ret.score = 0;
var u = 0;
@@ -152,39 +166,41 @@ function uplinkInfo(sw)
ret.data[0].description = "Uplinks (live/configured)";
if (nmsData.switches.switches[sw].subnet4 == undefined ||
nmsData.switches.switches[sw].subnet4 == null) {
- if (tagged(sw,'3up')) {
- known_t = 3;
- } else if (tagged(sw,'2up')) {
- known_t = 2;
- } else if (tagged(sw, '1up')) {
- known_t = 1;
- } else if (tagged(sw,'4up')) {
- known_t = 4;
- }
- if (known_t != t) {
- ret.data[0].value += "(Overridden: " + known_t + ")";
- }
-
- if (u == known_t) {
- ret.score = 0;
- ret.why = "All uplinks up";
- } else if (u == 1) {
- ret.score = 800;
- ret.why = "Only 1 of " + known_t + " uplinks alive";
- } else if (u < known_t) {
- ret.score = 450;
- ret.why = u + " of " + known_t + " uplinks alive";
- } else if (u > known_t) {
- ret.score = 350;
- ret.why = u + " of " + known_t + " uplinks alive";
- }
- }
- }
- if (testTree(nmsData,['switchstate','switches',sw,'clients','live'])) {
+ if (tagged(sw,'3up')) {
+ known_t = 3;
+ } else if (tagged(sw,'2up')) {
+ known_t = 2;
+ } else if (tagged(sw, '1up')) {
+ known_t = 1;
+ } else if (tagged(sw,'4up')) {
+ known_t = 4;
+ }
+ if (known_t != t) {
+ ret.data[0].value += "(Overridden: " + known_t + ")";
+ }
+ if (u == known_t) {
+ ret.score = 0;
+ ret.why = "All uplinks up";
+ } else if (u == 1) {
+ ret.score = 800;
+ ret.why = "Only 1 of " + known_t + " uplinks alive";
+ } else if (u < known_t && !(t >= 10 && u <5)) {
+ ret.score = 450;
+ ret.why = u + " of " + known_t + " uplinks alive";
+ } else if (u > known_t) {
+ ret.score = 350;
+ ret.why = u + " of " + known_t + " uplinks alive";
+ } else if (u < known_t && (t >= 10 && u < 5)) {
+ ret.score = 150;
+ ret.why = u + " of " + known_t + " uplinks alive (huge diff suggests WIP - downgrading)";
+ }
+ }
+ }
+ if (testTree(nmsData,['switchstate','switches',sw,'clients','total'])) {
var tu = parseInt(nmsData.switchstate.switches[sw].clients.live);
var tt = parseInt(nmsData.switchstate.switches[sw].clients.total);
ret.data[1] = {};
- ret.data[1].value = (tu) + " / " + (tt);
+ ret.data[1].value = (tu && tt) ? (tu) + " / " + (tt) : "None configured";
ret.data[1].description = "Client ports (live/total)";
}
if (testTree(nmsData,['switchstate','switches',sw,'totals','live'])) {
@@ -471,21 +487,26 @@ function pingInfo(sw)
if (!(distro == "" || phy == "" || distro == undefined || phy == undefined)) {
if (testTree(nmsData,['snmp','snmp',distro, 'ports',phy,'ifOperStatus'])) {
var x = nmsData['snmp']['snmp'][distro]['ports'][phy]['ifOperStatus'];
- var ping = parseFloat(nmsData["ping"]["switches"][sw]["latency4"]);
- var ping6 = parseFloat(nmsData["ping"]["switches"][sw]["latency6"]);
+ var ping = "no";
+ var ping6 = "no ";
+ try {
+ ping = parseFloat(nmsData["ping"]["switches"][sw]["latency4"]);
+ ping6 = parseFloat(nmsData["ping"]["switches"][sw]["latency6"]);
+ } catch(e) {}
if (x == "up") {
ret.data[3] = {};
ret.data[3].description = "Distro-port";
ret.data[3].value = "Distro port is live";
if (isNaN(ping) && isNaN(ping6)) {
- ret.score = 850;
+ ret.score = 700;
ret.why = "Distro port is alive, but no IPv4/IPv6 ping. ROLLBACK!";
}
}
}
}
} catch(e) {
- console.log("lol");
+ console.log("Lazy about errors....");
+ console.log(e);
}
}
return ret;
@@ -516,13 +537,13 @@ function getDhcpColor(stop)
function dhcpUpdater()
{
- if (!testTree(nmsData,['dhcp','dhcp']) || !testTree(nmsData,['switches','switches'])) {
- return
+ if (!testTree(nmsData,['dhcp','dhcp']) || !testTree(nmsData,['switches','switches']) || !testTree(nmsData,['smanagement','switches'])) {
+ return;
}
var now = nmsData.dhcp.time;
for (var sw in nmsData.switches.switches) {
var c = nmsColor.blue;
- var s = nmsData.dhcp.dhcp[sw];
+ var s = nmsData.dhcp.dhcp[nmsData.smanagement.switches[sw].traffic_vlan];
if (s == undefined) {
nmsMap.setSwitchColor(sw,c);
continue;
@@ -536,11 +557,24 @@ function dhcpInfo(sw) {
var ret = new handlerInfo("dhcp","DHCP state");
ret.why = "No DHCP data";
ret.data[0].description = "DHCP age";
- if (testTree(nmsData,['dhcp','dhcp',sw])) {
+ if (!testTree(nmsData,['dhcp','dhcp']) || !testTree(nmsData,['switches','switches']) || !testTree(nmsData,['smanagement','switches'])) {
+ return ret.data[1] = {};
+ }
+ var dhcpClients = 0;
+ var clientPortsUp = 0;
+ var clientPortsUp = setTree(nmsData,['switchstate','switches',sw,'clients','live'],0);
+ var clientPortsTotal = setTree(nmsData,['switchstate','switches',sw,'clients','total'],0);
+ if (testTree(nmsData,['dhcp','networks',nmsData.smanagement.switches[sw].traffic_vlan,'clients'])) {
+ dhcpClients = nmsData.dhcp.networks[nmsData.smanagement.switches[sw].traffic_vlan].clients;
+ }
+ if (testTree(nmsData,['dhcp','dhcp',nmsData.smanagement.switches[sw].traffic_vlan])) {
var now = nmsData.dhcp.time;
- var then = nmsData.dhcp.dhcp[sw];
+ var then = nmsData.dhcp.dhcp[nmsData.smanagement.switches[sw].traffic_vlan];
var diff = now - then;
var divider = 6;
+ if (dhcpClients < 10) {
+ divider = 12;
+ }
if(tagged(sw,'slowdhcp')) {
divider = 12;
}
@@ -551,24 +585,39 @@ function dhcpInfo(sw) {
} else {
ret.data[0].value = "No DHCP data";
if (testTree(nmsData,['smanagement','switches',sw])) {
- if (nmsData.smanagement.switches[sw].subnet4 == undefined ||
- nmsData.smanagement.switches[sw].subnet4 == "") {
- ret.data[0].value = "No associated subnets";
+ if (nmsData.smanagement.switches[sw].traffic_vlan == undefined ||
+ nmsData.smanagement.switches[sw].traffic_vlan == "") {
+ ret.data[0].value = "No associated networks";
ret.score = 0;
- ret.why = "No subnet registered";
+ ret.why = "No network associated";
} else {
- ret.score = 350;
- ret.why = "No DHCP data";
+ if (!(clientPortsUp < 2 && clientPortsTotal > 20)) {
+ ret.score = 350;
+ ret.why = "No DHCP data";
+ } else {
+ ret.data[0].value = "No DHCP data, but too few clients anyway";
+ }
}
} else {
ret.score = 100;
ret.why = "No management data for DHCP";
}
}
- if (testTree(nmsData,['dhcp','switches',sw,'clients'])) {
+ if (testTree(nmsData,['dhcp','networks',nmsData.smanagement.switches[sw].traffic_vlan,'clients'])) {
+ var dhcpClients = nmsData.dhcp.networks[nmsData.smanagement.switches[sw].traffic_vlan].clients;
ret.data[1] = {};
- ret.data[1].value = nmsData.dhcp.switches[sw].clients;
+ ret.data[1].value = nmsData.dhcp.networks[nmsData.smanagement.switches[sw].traffic_vlan].clients;
ret.data[1].description = "DHCP clients";
+ if (testTree(nmsData,['switchstate','switches',sw,'clients','live'])) {
+ var tu = parseInt(nmsData.switchstate.switches[sw].clients.live);
+ var tt = parseInt(nmsData.switchstate.switches[sw].clients.total);
+ if (tu - dhcpClients > 12) {
+ if (ret.score < 450) {
+ ret.score = 450;
+ ret.why = "Far more client ports than dhcp clients";
+ }
+ }
+ }
}
if (testTree(nmsData,['switches','switches',sw, 'tags'])) {
if (tagged(sw,'ignoredhcp')) {
@@ -709,7 +758,7 @@ function snmpInit() {
}
function snmpUpInfo(sw) {
- var ret = new handlerInfo("snmpup","SNMP uplink data");
+ var ret = new handlerInfo("uplink","SNMP uplink data");
ret.why = "No SNMP data";
ret.score = 0;
@@ -718,16 +767,20 @@ function snmpUpInfo(sw) {
var seen_up = 0;
for (var port in nmsData.snmp.snmp[sw].ports) {
var x = nmsData.snmp.snmp[sw].ports[port];
- if (x["ifAlias"].match(/Uplink/i) && x["ifOperStatus"] == "up") {
+ if (x["ifAlias"].match(/Gruppe/i) && x["ifOperStatus"] == "up") {
total_up += parseInt(x["ifHighSpeed"]);
}
- if (x["ifAlias"].match(/LAG Member/i) && x["ifOperStatus"] == "up") {
+ if (x["ifAlias"].match(/Fysisk/i) && x["ifOperStatus"] == "up") {
seen_up += parseInt(x["ifHighSpeed"]);
}
}
ret.data[0].value = "LAG member speed and total speed is " + seen_up;
if (total_up != seen_up) {
ret.score = 500;
+ if (tagged(sw,'ignoreuplink')) {
+ ret.score = 0;
+ }
+
ret.why = "LAG member (ge/xe/et) speed is " + seen_up + " but logical (ae) is " + total_up;
ret.data[0].value = ret.why;
}
@@ -777,6 +830,47 @@ function cpuUpdater() {
}
}
}
+function memoryUpdater() {
+ for (var sw in nmsData.switches.switches) {
+ try {
+ var buffer = 0;
+ for (var u in nmsData.snmp.snmp[sw].misc.jnxOperatingBuffer) {
+ var local = nmsData.snmp.snmp[sw].misc['jnxOperatingBuffer'][u];
+ buffer = Math.max(nmsData.snmp.snmp[sw].misc.jnxOperatingBuffer[u],buffer);
+ }
+ nmsMap.setSwitchColor(sw, nmsColor.getColorStop(buffer * 10));
+ nmsMap.setSwitchInfo(sw, buffer + " % ");
+ } catch (e) {
+ nmsMap.setSwitchColor(sw, "white");
+ nmsMap.setSwitchInfo(sw, "N/A");
+ }
+ }
+}
+function memoryInfo(sw) {
+ var ret = new handlerInfo("memory","Memory utilization");
+ ret.why = "No Memory info";
+ ret.score = 0;
+
+ if (testTree(nmsData,['snmp','snmp',sw, 'misc','jnxOperatingBuffer'])) {
+ var memory = 0;
+ for (var u in nmsData.snmp.snmp[sw].misc.jnxOperatingBuffer) {
+ var local = nmsData.snmp.snmp[sw].misc['jnxOperatingBuffer'][u];
+ memory = Math.max(nmsData.snmp.snmp[sw].misc.jnxOperatingBuffer[u],memory);
+ }
+ if (memory < 70) {
+ ret.score = 0;
+ } else if (memory < 80) {
+ ret.score = 100;
+ } else if (memory < 90) {
+ ret.score = memory * 2;
+ } else {
+ ret.score = memory * 6;
+ }
+ ret.why = "Memory utilization: " + memory + "%";
+ ret.data[0].value = memory + "%";
+ }
+ return ret;
+}
function tagged(sw, tag) {
if (testTree(nmsData,['switches','switches',sw, 'tags'])) {
@@ -787,6 +881,63 @@ function tagged(sw, tag) {
return false;
}
+function networkInfo(sw) {
+ var ret = new handlerInfo("net","Network info");
+ ret.score = 0;
+ ret.why = "All good";
+ if (testTree(nmsData,['smanagement','switches',sw])) {
+ var i = 0;
+ var mg = nmsData.smanagement.switches[sw];
+ var objs = [{
+ d: "Management",
+ v: setTree(nmsData,['networks','networks',mg.mgmt_vlan],undefined)
+ },{
+ d: "Traffic",
+ v: setTree(nmsData,['networks','networks',mg.traffic_vlan],undefined)
+ }
+ ];
+ for (var x in objs) {
+ a = objs[x];
+ if (a.v == undefined) {
+ ret.data[i++] = {
+ value: 'Not set',
+ description: a.d + ' network'
+ };
+ continue;
+ }
+
+ ret.data[i++] = {
+ value: a.v.name || "Not set",
+ description: a.d + " network"
+ }
+ ret.data[i++] = {
+ value: a.v.vlan || "Not set",
+ description: a.d + " vlan"
+ }
+ ret.data[i++] = {
+ value: a.v.subnet4 || "Not set",
+ description: a.d + " subnet IPv4"
+ }
+ ret.data[i++] = {
+ value: a.v.gw4 || "Not set",
+ description: a.d + " gw IPv4"
+ }
+ ret.data[i++] = {
+ value: a.v.subnet6 || "Not set",
+ description: a.d + " subnet IPv6"
+ }
+ ret.data[i++] = {
+ value: a.v.gw6 || "Not set",
+ description: a.d + " gw IPv6"
+ }
+ ret.data[i++] = {
+ value: a.v.router || "Not set",
+ description: a.d + " net router"
+ }
+ }
+ }
+ return ret;
+}
function mgmtInfo(sw) {
var ret = new handlerInfo("mgmt","Management info");
ret.score = 0;
@@ -801,15 +952,10 @@ function mgmtInfo(sw) {
value: mg.mgmt_v6_addr || "N/A",
description: "Management IP (v6)"
}, {
- value: mg.subnet4 || "N/A",
- description: "Subnet (v4)"
- }, {
- value: mg.subnet6 || "N/A",
- description: "Subnet (v6)"
- }, {
value: mg.distro_name || "N/A",
description: "Distro"
- }];
+ }
+ ];
if ((mg.mgmt_v4_addr == undefined || mg.mgmt_v4_addr == "") && (mg.mgmt_v6_addr == undefined || mg.mgmt_v6_addr == "")) {
ret.why = "No IPv4 or IPv6 management IP";
ret.score = 1000;
@@ -843,6 +989,16 @@ function cpuInit() {
setLegend(5,"white","N/A");
cpuUpdater();
}
+function memoryInit() {
+ nmsData.addHandler("snmp", "mapHandler", memoryUpdater);
+ nmsColor.drawGradient([nmsColor.green,nmsColor.orange,nmsColor.red]);
+ setLegend(1,getColorStop(0),"0 %");
+ setLegend(2,getColorStop(250),"25 %");
+ setLegend(3,getColorStop(600),"60 %");
+ setLegend(4,getColorStop(1000),"100 %");
+ setLegend(5,"white","N/A");
+ memoryUpdater();
+}
function healthInfo(sw) {
var worst = new handlerInfo("health", "Health");
diff --git a/web/js/nms-map.js b/web/js/nms-map.js
index 1ebcf92..5927324 100644
--- a/web/js/nms-map.js
+++ b/web/js/nms-map.js
@@ -218,7 +218,7 @@ nmsMap.drawNow = function ()
} else {
now = new Date(nmsData.now); //Date assumes UTC
}
- now = now.toString().split(' ').splice(1,4).join(' '); //Date returns local time
+ now = now.toString().split(' ').splice(0,5).join(' '); //Date returns local time
if (nmsMap._lastNow == now) {
nmsMap.stats.nowDups++;
return;
@@ -231,6 +231,7 @@ nmsMap.drawNow = function ()
ctx.clearRect(0,0,800,100);
ctx.fillStyle = "white";
ctx.strokeStyle = "black";
+ ctx.translate(200,0);
ctx.lineWidth = nms.fontLineFactor;
ctx.strokeText(now, this._settings.textMargin, 25);
ctx.fillText(now, this._settings.textMargin, 25);
diff --git a/web/js/nms-template.js b/web/js/nms-template.js
index c34ef34..0f25367 100644
--- a/web/js/nms-template.js
+++ b/web/js/nms-template.js
@@ -4,36 +4,52 @@ var nmsTemplate = nmsTemplate || {
}
nmsTemplate.test = function() {
- var input = document.getElementById("template-input");
- var output = document.getElementById("template-output");
- var qp = document.getElementById("template-query-params");
- $.ajax({
- type: "POST",
- url: "/api/templates/test" + qp.value,
- async: false,
- data: input.value,
- dataType: "text",
- success: function (indata, textStatus, jqXHR) {
- var output = document.getElementById("template-output");
- output.value = jqXHR.responseText;
- },
- error: function (jqXHR, textStatus) {
- var output = document.getElementById("template-output");
- output.value = jqXHR.responseText;
- }
- });
+ var input = document.getElementById("template-input");
+ var output = document.getElementById("template-output");
+ var qp = document.getElementById("template-query-params");
+ $.ajax({
+ type: "POST",
+ url: "/api/templates/test" + qp.value,
+ async: false,
+ data: input.value,
+ dataType: "text",
+ success: function (indata, textStatus, jqXHR) {
+ var output = document.getElementById("template-output");
+ output.value = jqXHR.responseText;
+ },
+ error: function (jqXHR, textStatus) {
+ var output = document.getElementById("template-output");
+ output.value = jqXHR.responseText;
+ }
+ });
}
nmsTemplate.fromFile = function(template) {
- $.ajax({
- type: "GET",
- url: "/templates/" + template,
- async: false,
- dataType: "text",
- success: function (indata, textStatus, jqXHR) {
- var output = document.getElementById("template-input");
- output.value = indata;
- }
- });
- nmsTemplate.test();
+ if(template == '') { return; }
+ $.ajax({
+ type: "GET",
+ url: "/templates/" + template,
+ async: false,
+ dataType: "text",
+ success: function (indata, textStatus, jqXHR) {
+ var output = document.getElementById("template-input");
+ output.value = indata;
+ }
+ });
+ nmsTemplate.test();
}
+
+nmsTemplate.getTemplates = function() {
+ $.ajax({
+ type: "GET",
+ url: "/api/read/template-list",
+ async: false,
+ dataType: "json",
+ success: function (indata, textStatus, jqXHR) {
+ $.each( indata['templates'], function( value ) {
+ $('#nmsTemplate-select').append($("<option></option>").attr("value",indata['templates'][value]['file']).text(indata['templates'][value]['file']));
+ });
+ }
+ });
+}
+//nmsTemplate.getTemplates();
diff --git a/web/js/nms-time.js b/web/js/nms-time.js
index 315ac79..482cfa7 100644
--- a/web/js/nms-time.js
+++ b/web/js/nms-time.js
@@ -10,11 +10,15 @@
*/
var nmsTime = nmsTime || {
_now: undefined,
- _handle: undefined
+ _handle: undefined,
+ _stopTime: undefined
}
nmsTime.replayEvent = function() {
- throw "Not yet implemented.";
+ var eStart = setTree(nmsData,["config","config","data","start"],"2018-03-23T00:00:00+0200");
+ nmsTime._stopTime = new Date(setTree(nmsData,["config","config","data","end"],"2018-04-01T14:30:00+0200"));
+ nmsTime.setNow(eStart);
+ nmsTime.startPlayback(60);
}
nmsTime.isRealTime = function() {
@@ -89,6 +93,10 @@ nmsTime.step = function(amount) {
nmsTime.realTime();
return;
}
+ if (nmsTime._stopTime != undefined && nmsTime._now.getTime() >= nmsTime._stopTime.getTime()) {
+ nmsTime.stopPlayback();
+ nmsTime._stopTime = undefined;
+ }
nmsTime._now.setMinutes(nmsTime._now.getMinutes() + amount);
nmsTime._updateData();
}
@@ -127,7 +135,7 @@ nmsTime.startPlayback = function(speed) {
return;
}
nmsTime._speed = speed;
- nmsTime._handle = setInterval(nmsTime._tick,1000);
+ nmsTime._handle = setInterval(nmsTime._tick,2000);
}
nmsTime.togglePause = function() {
@@ -137,7 +145,7 @@ nmsTime.togglePause = function() {
if (nmsTime.isRealTime()) {
nmsTime.setNow(Date.now());
} else {
- nmsTime.startPlayback(nmsTime._speed ? nmsTime._speed : 5);
+ nmsTime.startPlayback(nmsTime._speed ? nmsTime._speed : 60);
}
}
}
diff --git a/web/js/nms.js b/web/js/nms.js
index e1d9283..0422f00 100644
--- a/web/js/nms.js
+++ b/web/js/nms.js
@@ -29,6 +29,7 @@ var nms = {
},
menuShowing:true,
+ oplogShowing:true,
get uptime() {
return (Date.now() - this._startTime)/1000;
},
@@ -60,6 +61,7 @@ var nms = {
'menuShowing',
'vertical',
'interval',
+ 'oplogShowing',
'user'
],
keyBindings:{
@@ -75,12 +77,15 @@ var nms = {
'8':setMapModeFromN,
'9':setMapModeFromN,
'c':toggleConnect,
+ 'H':moveTimeFromKey,
'h':moveTimeFromKey,
'j':moveTimeFromKey,
'k':moveTimeFromKey,
'l':moveTimeFromKey,
+ 'L':moveTimeFromKey,
'p':moveTimeFromKey,
'r':moveTimeFromKey,
+ 'o':toggleOplog,
'Escape':hideWindow,
'?':toggleHelp
},
@@ -134,7 +139,7 @@ function nmsTimer(handler, interval, name, description) {
function byteCount(bytes,precision) {
if (precision ==undefined)
precision = 1;
- var units = ['', 'K', 'M', 'G', 'T', 'P'];
+ var units = ['', 'K', 'M', 'G', 'T', 'P', 'E','Z'];
var i = 0;
while (bytes > 1024) {
bytes = bytes / 1024;
@@ -356,6 +361,7 @@ function getInitialConfig() {
} else {
nms._public = false;
document.body.classList.add("gondul-private");
+ nmsTemplate.getTemplates();
}
}
});
@@ -414,7 +420,7 @@ function detectHandler() {
var views = document.location.hash.slice(1);
var interval = nms.interval;
if (views == undefined || views == "")
- views = "ping";
+ views = "health";
views = views.split(",");
if (views.length > 1) {
@@ -444,6 +450,11 @@ function setMenu()
var nav = document.getElementsByTagName("nav")[0];
nav.style.display = nms.menuShowing ? '' : 'none';
}
+function setOplog()
+{
+ var nav = document.getElementById("oplog-parent-mini");
+ nav.style.display = nms.oplogShowing ? '' : 'none';
+}
function toggleMenu()
{
@@ -451,6 +462,12 @@ function toggleMenu()
setMenu();
saveSettings();
}
+function toggleOplog()
+{
+ nms.oplogShowing = ! nms.oplogShowing;
+ setOplog();
+ saveSettings();
+}
function hideWindow(e,key)
{
nmsInfoBox.hide();
@@ -499,6 +516,9 @@ function setMapModeFromN(e,key)
function moveTimeFromKey(e,key)
{
switch(key) {
+ case 'H':
+ nmsTime.stepKey(-1440);
+ break;
case 'h':
nmsTime.stepKey(-60);
break;
@@ -511,6 +531,9 @@ function moveTimeFromKey(e,key)
case 'l':
nmsTime.stepKey(60);
break;
+ case 'L':
+ nmsTime.stepKey(1440);
+ break;
case 'p':
nmsTime.togglePause();
break;
@@ -616,6 +639,7 @@ function restoreSettings()
nms[v] = retrieve[v];
}
setMenu();
+ setOplog();
}
/*
@@ -642,14 +666,25 @@ function nmsUpdateNavbarGraph() {
* do stuff with nmsData.snmp.snmp[sw].misc
* }
*
+ * New: setTree(root, array, default):
+ * same thing, but instead of just returing true/false, return the value found
+ * or the provided default.
*/
-function testTree(root, ar) {
- if (ar == undefined || root == undefined)
- return false;
- for (var i in ar) {
- root = root[ar[i]];
- if (root == undefined)
- return false;
+function setTree(root, ar, def) {
+ if (ar == undefined || root == undefined) {
+ return def;
+ } else {
+ for (var i in ar) {
+ root = root[ar[i]];
+ if (root == undefined)
+ return def;
+ }
}
- return true;
+ return root;
}
+function testTree(root, ar) {
+ var x = setTree(root,ar,false);
+ if (x != false)
+ return true;
+}
+