diff options
Diffstat (limited to 'web/js')
-rw-r--r-- | web/js/nms-draw-chart.js | 111 | ||||
-rw-r--r-- | web/js/nms-info-box.js | 110 | ||||
-rw-r--r-- | web/js/nms-map-handlers.js | 272 | ||||
-rw-r--r-- | web/js/nms-map.js | 3 | ||||
-rw-r--r-- | web/js/nms-template.js | 74 | ||||
-rw-r--r-- | web/js/nms-time.js | 16 | ||||
-rw-r--r-- | web/js/nms.js | 55 |
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; +} + |