diff options
| -rwxr-xr-x | collectors/snmpfetchng.pl | 17 | ||||
| -rw-r--r-- | include/config.local.pm | 19 | ||||
| -rw-r--r-- | include/nms/util.pm | 31 | ||||
| -rwxr-xr-x | web/api/public/switch-state | 2 | ||||
| -rwxr-xr-x | web/api/read/oplog | 7 | ||||
| -rwxr-xr-x | web/api/write/fap | 19 | ||||
| -rwxr-xr-x | web/api/write/switches | 3 | ||||
| -rw-r--r-- | web/js/nms-draw-chart.js | 186 | ||||
| -rw-r--r-- | web/js/nms-info-box.js | 22 | ||||
| -rw-r--r-- | web/js/nms-map-handlers.js | 99 | ||||
| -rw-r--r-- | web/js/nms-map.js | 13 | 
11 files changed, 257 insertions, 161 deletions
| diff --git a/collectors/snmpfetchng.pl b/collectors/snmpfetchng.pl index 3a5ecce..399023b 100755 --- a/collectors/snmpfetchng.pl +++ b/collectors/snmpfetchng.pl @@ -28,7 +28,7 @@ $dbh->{RaiseError} = 1;  my $influx = nms::influx_connect();  my $qualification = <<"EOF";  (last_updated IS NULL OR now() - last_updated > poll_frequency) -AND (locked='f' OR now() - last_updated > '15 minutes'::interval) +AND (locked='f' OR now() - last_updated > '5 minutes'::interval)  AND (mgmt_v4_addr is not null or mgmt_v6_addr is not null) AND deleted = false  EOF @@ -99,11 +99,15 @@ sub inner_loop  		my $s = SNMP::Session->new(DestHost => $switch{'mgtip'},  					  Community => $switch{'community'},  					  UseEnums => 1, -					  Timeout => 5000000, +					  Timeout  => 10000000,  					  Version => '2'); -		my $ret = $s->bulkwalk(0, 10, @nms::config::snmp_objects, sub{ callback(\%switch, @_); }); -		if (!defined($ret)) { -			mylog("Fudge: ".  $s->{'ErrorStr'}); +		if (!defined($s)) { +			mylog("Fudge, no session defined. Now what?") +		} else { +			my $ret = $s->bulkwalk(0, 10, @nms::config::snmp_objects, sub{ callback(\%switch, @_); }); +			if (!defined($ret)) { +				mylog("Fudge: ".  $s->{'ErrorStr'}); +			}  		}  	}  	mylog( "Polling " . @switches . " switches: $poll_todo"); @@ -235,6 +239,7 @@ sub callback{  				on_success => $cv,  				on_error => sub {  					$cv->croak("Failed to write data: @_"); +					# warn "Failed to write data: @_";  				}  			);  			$cv->recv; @@ -242,7 +247,7 @@ sub callback{  		        warn "caught error: $_";  		}; -                if ((time - $switch{'start'}) > 5) { +                if ((time - $switch{'start'}) > 10) {                          mylog( "Polled $switch{'sysname'} in " . (time - $switch{'start'}) . "s.");  		}  	} else { diff --git a/include/config.local.pm b/include/config.local.pm new file mode 100644 index 0000000..821391c --- /dev/null +++ b/include/config.local.pm @@ -0,0 +1,19 @@ +#! /usr/bin/perl +use strict; +use warnings; +package nms::config; + +# DB +our $db_name = "nms"; +our $db_host = "localhost"; +our $db_username = "nms"; +our $db_password = "<REDACTED>"; +our $graphite_host = "graphite"; +our $graphite_port = "2003"; + +# Influx +our $influx_host = "http://localhost:8086"; +our $influx_username = "gondulWrite"; +our $influx_password = "<REDACTED>"; +our $influx_database = "gondul"; + diff --git a/include/nms/util.pm b/include/nms/util.pm index 69f5392..e30c0b6 100644 --- a/include/nms/util.pm +++ b/include/nms/util.pm @@ -130,7 +130,10 @@ sub guess_placement_tg {  		my ($e, $s) = ($1, $2);  		$src = "main"; -		$x = int(292 + (($e-1)/2) * 31.1); +		$x = int(572 + (($e-1)/2) * 31.1); +		if (($e-1/2)>9) { +			$x += 140; +		}  		$y = undef;  		$x += 14 if ($e >= 21); @@ -148,15 +151,16 @@ sub guess_placement_tg {  		$yy = $y + 120;  		# Justeringer -		$y += 45 if $name eq "e1-4"; -		$y += 20 if $name eq "e3-4"; -		$y += 15 if $name eq "e5-4"; -		$yy -= 25 if $name eq "e7-1"; -		$yy -= 25 if $name eq "e5-1"; -		$yy -= 25 if $name eq "e3-1"; -		$y += 20 if ($e >= 79 and $s == 2); -		$yy -= 20 if ($e >= 79 and $s == 1); -		$yy -= 30 if ($e >= 81 and $s == 1); +		 +		#	$y += 45 if $name eq "e1-4"; +		#$y += 20 if $name eq "e3-4"; +		#$y += 15 if $name eq "e5-4"; +		#$yy -= 25 if $name eq "e7-1"; +		#$yy -= 25 if $name eq "e5-1"; +		#$yy -= 25 if $name eq "e3-1"; +		#$y += 20 if ($e >= 79 and $s == 2); +		#$yy -= 20 if ($e >= 79 and $s == 1); +		#$yy -= 30 if ($e >= 81 and $s == 1);  	} elsif ($name =~ /^creativia(\d+)$/) {  		my ($s) = ($1); @@ -181,11 +185,14 @@ sub guess_placement_tg {  		$y = int(759 + 20.5 * $s);  		$xx = $x + 65;  		$yy = $y + 14; -	} elsif ($name =~ /^s(\d).floor/) { +	} elsif ($name =~ /^d(\d).floor/) {  		my $d = ($1);  		$src = "distro";  		$d -= 1; -		$x = 260 + $d * 145; +		$x = 438 + $d * 145; +		if ($d > 1) { +			$x += 230; +		}  		$y = 417;  		$xx = $x + 130;  		$yy = $y + 20; diff --git a/web/api/public/switch-state b/web/api/public/switch-state index d192504..2aff40c 100755 --- a/web/api/public/switch-state +++ b/web/api/public/switch-state @@ -80,7 +80,7 @@ while ( my $ref = $q->fetchrow_hashref() ) {  	$json{'switches'}{$sysname}{vcp}{jnxVirtualChassisPortInOctets} = $data{'vcp'}{'jnxVirtualChassisPortInOctets'};  	$json{'switches'}{$sysname}{vcp}{jnxVirtualChassisPortOutOctets} = $data{'vcp'}{'jnxVirtualChassisPortOutOctets'}; -	$json{'switches'}{$sysname}{'temp'} = $data{'misc'}{'jnxOperatingTemp'}{'7.1.0.0'} || $data{'misc'}{'ciscoEnvMonTemperatureStatusValue'}{'1011'} || $data{'misc'}{'ciscoEnvMonTemperatureStatusValue'}{'1008'}; +	$json{'switches'}{$sysname}{'temp'} = $data{'misc'}{'jnxOperatingTemp'}{'7.1.0.0'} || $data{'misc'}{'jnxOperatingTemp'}{'7.1.0.0'} || $data{'misc'}{'jnxOperatingTemp'}{'7.2.0.0'} || $data{'misc'}{'jnxOperatingTemp'}{'7.3.0.0'} || $data{'misc'}{'jnxOperatingTemp'}{'7.4.0.0'} || $data{'misc'}{'jnxOperatingTemp'}{'7.5.0.0'} || $data{'misc'}{'jnxOperatingTemp'}{'7.6.0.0'} || $data{'misc'}{'ciscoEnvMonTemperatureStatusValue'}{'1011'} || $data{'misc'}{'ciscoEnvMonTemperatureStatusValue'}{'1008'};  	$json{'switches'}{$sysname}{'time'} = $ref->{'time'};  } diff --git a/web/api/read/oplog b/web/api/read/oplog index 88a7616..22e21ac 100755 --- a/web/api/read/oplog +++ b/web/api/read/oplog @@ -17,9 +17,12 @@ my $query = $nms::web::dbh->prepare('select id,date_trunc(\'second\',time) as ti  $query->execute();  while (my $ref = $query->fetchrow_hashref()) {  	my %meh; +	if (!defined($ref->{'log'})) { +		next; +	}  	$meh{'time'} = $ref->{'h'} . ":" . $ref->{'m'}; -	$meh{'log'} = $ref->{'log'}; -	$meh{'username'} = $ref->{'username'}; +	$meh{'log'} = $ref->{'log'} || "weird?"; +	$meh{'username'} = $ref->{'username'} || "undefined";  	$meh{'id'} = $ref->{'id'};  	$meh{'systems'} = $ref->{'systems'};  	$meh{'timestamp'} = $ref->{'timestamp'}; diff --git a/web/api/write/fap b/web/api/write/fap new file mode 100755 index 0000000..69058eb --- /dev/null +++ b/web/api/write/fap @@ -0,0 +1,19 @@ +#!/bin/bash + +fil=/var/log/apache2/kek +echo 'Content-Type: text/html' +echo +echo +pw="<REDACTED>" +sw=$(echo $PATH_INFO | sed 's/^\///') +POST -H'Content-Type: application/json'  https://gondul:${pw}@awx.tg23.gathering.org/api/v2/job_templates/19/launch/ >/dev/null 2>&1 <<_EOF_ +{"credential_passwords":{},"limit":"$sw","extra_vars":{}} +_EOF_ +ret=$? +./oplog >/dev/null 2>&1 <<_EOF_ +{"systems": "$sw", "log": "Refap queued in AWX for $sw"} +_EOF_ +while read; do +	true	 +done +echo '"ok"' diff --git a/web/api/write/switches b/web/api/write/switches index e0ee950..470cde1 100755 --- a/web/api/write/switches +++ b/web/api/write/switches @@ -23,7 +23,6 @@ my @dups;  my $sth = $nms::web::dbh->prepare("SELECT sysname FROM switches WHERE sysname=?"); -  my @fields = ( 'community', 'tags', 'distro_name', 'distro_phy_port',  'mgmt_v4_addr', 'mgmt_v6_addr', 'mgmt_vlan', 'placement', 'poll_frequency', 'sysname', 'traffic_vlan', 'deleted');  sub convertplace @@ -112,7 +111,7 @@ foreach my $tmp2 (@tmp) {  				push @set, "$_=" . $dbh->quote($switch{$_});  			}  		} keys %switch; -		$nms::web::dbh->do("UPDATE SWITCHES SET " . join(", ", @set) . "WHERE sysname=" . $dbh->quote($switch{'sysname'}) . ";"); +		$nms::web::dbh->do("UPDATE SWITCHES SET " . join(", ", @set) . " WHERE sysname=" . $dbh->quote($switch{'sysname'}) . ";");  		push @dups, $switch{'sysname'};  	}  } diff --git a/web/js/nms-draw-chart.js b/web/js/nms-draw-chart.js index 4145a9a..ccdf220 100644 --- a/web/js/nms-draw-chart.js +++ b/web/js/nms-draw-chart.js @@ -14,7 +14,7 @@ function setNightModeChart(night) {  function drawLatency(canvas, sw, chart, callback) {    var q = encodeURIComponent('SELECT mean("latency") AS "mean_latency" FROM "ping" WHERE time > now() - 1h AND "switch"=\''+sw+'\' GROUP BY time(60s), "version" fill(null)');    var dataset = []; - +      $.getJSON( "/query?db=gondul&q="+q, function( results ) {      try {        results['results'][0]['series'].forEach(function(serie) { @@ -67,8 +67,11 @@ function drawLatency(canvas, sw, chart, callback) {            responsive: true,            animation: false,            elements: { +            point: { +              radius: 0 +            },              line: { -              tension: 0.05 +              tension: 0.4              }            }          } @@ -86,68 +89,52 @@ function drawSumOfPorts(canvas, sw) {    var megabit = kilobit * 1024;    var gigabit = megabit * 1024;    var terabit = gigabit * 1024; - -  var q = encodeURIComponent('SELECT non_negative_derivative(first("ifHCInOctets"), 1s) * 8 AS "ifHCInOctets", non_negative_derivative(first("ifHCOutOctets"), 1s) * 8 AS "ifHCOutOctets" FROM "ports" WHERE time > now() - 30m AND "switch"=\''+sw+'\' GROUP BY time(90s),"interface" fill(null)'); +   +  var q = encodeURIComponent('SELECT non_negative_derivative(first("ifHCInOctets"), 1s) * 8 AS "ifHCInOctets", non_negative_derivative(first("ifHCOutOctets"), 1s) * 8 AS "ifHCOutOctets" FROM "ports" WHERE time > now() - 60m AND "switch"=\'' + sw + '\' GROUP BY time(90s),"interface" fill(null)');    var dataset = []; - -  $.getJSON( "/query?db=gondul&q="+q, function( results ) { -    var bits_in = []; -    var bits_out = []; - -    results['results'][0]['series'].forEach(function(serie) { -      // Bytes in -      serie['values'].forEach(function(element) { -        bits_in.push(element[1]); -      }); -      // Bytes out -      serie['values'].forEach(function(element) { -        bits_out.push(element[2]); +   +  $.getJSON("/query?db=gondul&q=" + q, function (results) { +    var bits_in = {}; +    var bits_out = {}; +     +    results['results'][0]['series'].forEach(function (serie) { +      serie['values'].forEach(function (element) { +        var time = new Date(element[0]); +        var timeStr = time.toISOString(); +        bits_in[timeStr] = (bits_in[timeStr] || 0) + element[1]; +        bits_out[timeStr] = (bits_out[timeStr] || 0) + element[2];        });      }); - -    var bits_in_size = bitToSize(Math.max.apply( Math, bits_in )); -    var bits_out_size = bitToSize(Math.max.apply( Math, bits_out )); -    var size = 0; - -    if(bits_in_size >= bits_out_size) { -      size = bits_in_size; -    } else { -      size = bits_out_size; -    } - +     +    var max_bits_in = Math.max(...Object.values(bits_in)); +    var max_bits_out = Math.max(...Object.values(bits_out)); +    var size = bitToSize(Math.max(max_bits_in, max_bits_out)); +          var size_divider;      switch (size) {        case 0: -        size_divider = 1; -        break; +      size_divider = 1; +      break;        case 1: -        size_divider = kilobit; -        break; +      size_divider = kilobit; +      break;        case 2: -        size_divider = megabit; -        break; +      size_divider = megabit; +      break;        case 3: -        size_divider = gigabit; -        break; +      size_divider = gigabit; +      break;        case 4: -        size_divider = terabit; -        break; +      size_divider = terabit; +      break;      } -    results['results'][0]['series'].forEach(function(serie) { -      // Bytes in -      var data = []; -      serie['values'].forEach(function(element) { -        data.push({t: new Date(element[0]), y: element[1] / size_divider }); -      }); -      dataset.push({data: data, backgroundColor:'rgba(58,125,48,200)', label:'Traffic in (' + sizeToText(size)+')'}); -      // Bytes out -      data = []; -      serie['values'].forEach(function(element) { -        data.push({t: new Date(element[0]), y: -Math.abs(element[2] / size_divider) }); -      }); -      dataset.push({data: data, backgroundColor:'rgba(84,84,142,225)', label:'Traffic out (' + sizeToText(size)+')'}); -    }); - +     +    var inData = Object.entries(bits_in).map(([t, y]) => ({ t: new Date(t), y: y / size_divider })); +    var outData = Object.entries(bits_out).map(([t, y]) => ({ t: new Date(t), y: -Math.abs(y / size_divider) })); +     +    dataset.push({ data: inData, backgroundColor: 'rgba(100,155,100,0.8)', label: 'Traffic in (' + sizeToText(size) + ')' }); +    dataset.push({ data: outData, backgroundColor: 'rgba(0,155,200,0.8)', label: 'Traffic out (' + sizeToText(size) + ')' }); +          // Draw the chart      var ctx = document.getElementById(canvas).getContext('2d');      var myChart = new Chart(ctx, { @@ -160,7 +147,7 @@ function drawSumOfPorts(canvas, sw) {            display: false          },          scales: { -          xAxes:[{ +          xAxes: [{              type: 'time',              time: {                parser: "HH:mm", @@ -175,15 +162,15 @@ function drawSumOfPorts(canvas, sw) {              }            }],            yAxes: [{ -            stacked: true, +            stacked: false,              ticks: { -              callback: function(label, index, labels) { -                return Math.abs(label)+' '+sizeToText(size); +              callback: function (label, index, labels) { +                return Math.abs(label) + ' ' + sizeToText(size);                }              },              scaleLabel: {                display: true, -              labelString: sw+' - All ports' +              labelString: sw + ' - All ports'              }            }]          }, @@ -194,7 +181,7 @@ function drawSumOfPorts(canvas, sw) {              radius: 0            },            line: { -            tension: 0 +            tension: 0.4            }          }        } @@ -204,75 +191,75 @@ function drawSumOfPorts(canvas, sw) {  function drawPort(canvas, sw, port) { - +      var kilobit = 1024;    var megabit = kilobit * 1024;    var gigabit = megabit * 1024;    var terabit = gigabit * 1024; - -  var q = encodeURIComponent('SELECT non_negative_derivative(first("ifHCInOctets"), 1s) * 8 AS "ifHCInOctets", non_negative_derivative(first("ifHCOutOctets"), 1s) * 8 AS "ifHCOutOctets" FROM "ports" WHERE time > now() - 30m AND "switch"=\''+sw+'\' AND "interface"=\''+port+'\' GROUP BY time(30s) fill(null)'); +   +  var q = encodeURIComponent('SELECT non_negative_derivative(first("ifHCInOctets"), 1s) * 8 AS "ifHCInOctets", non_negative_derivative(first("ifHCOutOctets"), 1s) * 8 AS "ifHCOutOctets" FROM "ports" WHERE time > now() - 60m AND "switch"=\''+sw+'\' AND "interface"=\''+port+'\' GROUP BY time(30s) fill(null)');    var dataset = []; - +      $.getJSON( "/query?db=gondul&q="+q, function( results ) {      var serie = results['results'][0]['series'][0]; - +          var bits_in = [];      var bits_out = []; - +          // Bytes in      serie['values'].forEach(function(element) {        bits_in.push(element[1]);      }); - +          // Bytes out      serie['values'].forEach(function(element) {        bits_out.push(element[2]);      }); - +          var bits_in_size = bitToSize(Math.max.apply( Math, bits_in ));      var bits_out_size = bitToSize(Math.max.apply( Math, bits_out ));      var size = 0; - +          if(bits_in_size >= bits_out_size) {        size = bits_in_size;      } else {        size = bits_out_size;      } - +          var size_divider;      switch (size) {        case 0: -        size_divider = 1; -        break; +      size_divider = 1; +      break;        case 1: -        size_divider = kilobit; -        break; +      size_divider = kilobit; +      break;        case 2: -        size_divider = megabit; -        break; +      size_divider = megabit; +      break;        case 3: -        size_divider = gigabit; -        break; +      size_divider = gigabit; +      break;        case 4: -        size_divider = terabit; -        break; +      size_divider = terabit; +      break;      } - +          // Bytes in      var data = [];      serie['values'].forEach(function(element) {        data.push({t: new Date(element[0]), y: element[1] / size_divider });      }); -    dataset.push({data: data, backgroundColor:'rgba(58,125,48,200)', label:'Traffic in (' + sizeToText(size)+')'}); - +    dataset.push({data: data, backgroundColor:'rgba(100,155,100,0.8)', label:'Traffic in (' + sizeToText(size)+')'}); +          // Bytes out      data = [];      serie['values'].forEach(function(element) {        data.push({t: new Date(element[0]), y: -Math.abs(element[2] / size_divider) });      }); -    dataset.push({data: data, backgroundColor:'rgba(84,84,142,225)', label:'Traffic out (' + sizeToText(size)+')'}); - - +    dataset.push({data: data, backgroundColor:'rgba(0,155,200,0.8)', label:'Traffic out (' + sizeToText(size)+')'}); +     +          // Draw the chart      var ctx = document.getElementById(canvas).getContext('2d');      var myChart = new Chart(ctx, { @@ -311,11 +298,14 @@ function drawPort(canvas, sw, port) {          responsive: true,          animation: false,          elements: { +          point: { +            radius: 0 +          },            line: { -            tension: 0 +            tension: 0.3            }          } - +                }      });    }); @@ -327,7 +317,7 @@ function bitToSize(bits) {    var megabit = kilobit * 1024;    var gigabit = megabit * 1024;    var terabit = gigabit * 1024; - +      if(bits >= 0 && bits < kilobit) {      return 0;    } @@ -348,19 +338,19 @@ function bitToSize(bits) {  function sizeToText(size) {    switch(size) {      case 0: -      return 'bit/s'; -      break; +    return 'bit/s'; +    break;      case 1: -      return 'Kb/s'; -      break; +    return 'Kb/s'; +    break;      case 2: -      return 'Mb/s'; -      break; +    return 'Mb/s'; +    break;      case 3: -      return 'Gb/s'; -      break; +    return 'Gb/s'; +    break;      case 4: -      return 'Tb/s'; -      break; +    return 'Tb/s'; +    break;    }  } diff --git a/web/js/nms-info-box.js b/web/js/nms-info-box.js index 4de8f3e..859b0ff 100644 --- a/web/js/nms-info-box.js +++ b/web/js/nms-info-box.js @@ -895,7 +895,7 @@ var switchLatencyPanel = function() {                  var latency = document.createElement("canvas");                  latency.id = this.sw+'latency_chart';                  latency.width = 500; -                latency.height = 50; +                latency.height = 80;                  drawLatency(this.sw+'latency_chart',this.sw, false, function(chart) { latencyChart = chart; });                  topper.appendChild(latency);                  this._render(topper); @@ -938,6 +938,10 @@ nmsInfoBox.setLegendPick = function(tag,id) {  nmsInfoBox.addPanelType("switchSummary",switchSummaryPanel); +var copybuttonfunc = function(text) { +	console.log('clickened', text); +	navigator.clipboard.writeText(text); +}  var switchLinks = function() {  	nmsInfoPanel.call(this,"switchLinks");  	var latencyChart; @@ -954,18 +958,30 @@ var switchLinks = function() {  		var topp = document.createElement("div")  		var urls = [ "http://gondul.tg23.gathering.org/api/templates/magic.conf/switch=" + sw, -			     "http://185.110.148.105/api/templates/magic.conf/switch=" + sw ]; +			     "http://185.110.148.105/api/templates/magic.conf/switch=" + sw, +			     "http://gondul.tg23.gathering.org/api/write/fap/" + 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) { +			console.log("create link")  			topp.appendChild(document.createElement("br")); +			var container = document.createElement("div");  			var link = document.createElement("a");  			link.href = urls[x];  			link.textContent = urls[x]; -			topp.appendChild(link); +			var copybutton = document.createElement("button"); +			copybutton.setAttribute("onclick", "copybuttonfunc('"+urls[x]+"')"); +			copybutton.type = "button"; +			var btnText = document.createTextNode("copy url"); +			copybutton.className = "btn btn-primary"; +			copybutton.appendChild(btnText); +			container.appendChild(link); +			container.appendChild(copybutton); +			topp.appendChild(container);  		}  		this._render(topp);  	}; diff --git a/web/js/nms-map-handlers.js b/web/js/nms-map-handlers.js index 03ee2ea..275e5e2 100644 --- a/web/js/nms-map-handlers.js +++ b/web/js/nms-map-handlers.js @@ -200,7 +200,7 @@ function uplinkInfo(sw)  		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) ? (tu) + " / " + (tt) : "None configured"; +		ret.data[1].value = tt ? (tu) + " / " + (tt) : "None configured";  		ret.data[1].description = "Client ports (live/total)";  	}  	if (testTree(nmsData,['switchstate','switches',sw,'totals','live'])) { @@ -432,6 +432,36 @@ function pingUpdater()  		}  	}  } +function printDiff(t) +{ +        var str = ""; +        if (t.d > 1) +                str = t.d + " days"; +        else if (t.d == 1) +                str = t.d + " day"; +         +        if (t.h > 1) +                str += " " + t.h + " hours"; +        else if (t.h == 1) +                str += " " + t.h + " hour"; +        else if (t.d > 0) +                str += " 0 hours"; + +        if (t.m > 1) +                str += " " + t.m + " minutes"; +        else if (t.m == 1) +                str += " " + t.m + " minute"; +        else if (t.d > 0 || t.h > 0) +                str += " 0 minutes"; + +        if (t.s > 1) +                str += " " + t.s + " seconds"; +        else if (t.s == 1) +                str += " " + t.s + " second"; +        else if (t.d > 0 || t.h > 0 || t.m > 0) +                str += " 0 seconds"; +        return str; +}  function pingInfo(sw)  { @@ -445,11 +475,8 @@ function pingInfo(sw)  			v4 = undefined;  		if (v6 == undefined || v6 == null || isNaN(v6))  			v6 = undefined; -		ret.data[0].value = v4; -		ret.data[0].description = "IPv4 latency(ms)"; -		ret.data[1] = {}; -		ret.data[1].value = v6; -		ret.data[1].description = "IPv6 latency(ms)"; +		ret.data[0].value = v6 + " (v4: " +  v4 + " )"; +		ret.data[0].description = "Latency(ms)";  		if (v4 == undefined && v6 == undefined) {  			ret.score = 1000;  			ret.why = "No IPv4 or IPv6 ping reply"; @@ -485,6 +512,9 @@ function pingInfo(sw)  			var distro = nmsData['smanagement']['switches'][sw]['distro_name'];  			var phy = nmsData['smanagement']['switches'][sw]['distro_phy_port'];  			if (!(distro == "" || phy == "" || distro == undefined || phy == undefined)) { +						ret.data[3] = {}; +						ret.data[3].description = "Distro-port"; +						ret.data[3].value = distro + " " + phy;  				if (testTree(nmsData,['snmp','snmp',distro, 'ports',phy,'ifOperStatus'])) {  					var x = nmsData['snmp']['snmp'][distro]['ports'][phy]['ifOperStatus'];  					var ping = "no"; @@ -494,13 +524,30 @@ function pingInfo(sw)  						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"; +						ret.data[3].value += " (😇 up!)";  						if (isNaN(ping) && isNaN(ping6)) {  							ret.score = 700; -							ret.why = "Distro port is alive, but no IPv4/IPv6 ping. ROLLBACK!"; +							ret.why = "Distro port is alive, but no IPv4/IPv6 ping."; +							if (testTree(nmsData,['snmp','snmp',distro, 'ports',phy,'ifLastChange'])) { +								if (testTree(nmsData,['snmp','snmp',distro, 'misc','sysUpTimeInstance'])) { +									ret.data[4] = {}; +									ret.data[4].description = 'Distro port changed'; +									diff = (parseInt(nmsData['snmp']['snmp'][distro]['misc']['sysUpTimeInstance']['']) - parseInt(nmsData['snmp']['snmp'][distro]['ports'][phy]['ifLastChange'])) / 100; +									var diff2 = { +										d:parseInt((diff/60/60/24)), +										h:parseInt((diff/60/60)%24), +										m:parseInt((diff/60)%60), +										s:parseInt(diff%60) +									} + + + +									ret.data[4].value = printDiff(diff2); +								} +							}  						} +					} else { +						ret.data[3].value += " (👺down)";  					}  				}  			} @@ -545,7 +592,7 @@ function dhcpUpdater()  		var c = nmsColor.blue;  		var sv4 = nmsData.dhcp.dhcp4[nmsData.smanagement.switches[sw].traffic_vlan];  		var sv6 = nmsData.dhcp.dhcp6[nmsData.smanagement.switches[sw].traffic_vlan];  -		if (sv4 == undefined || sv6 == undefined) { +		if (sv4 == undefined && sv6 == undefined) {  			nmsMap.setSwitchColor(sw,c);  			continue;  		}	 @@ -580,7 +627,7 @@ function dhcpInfo(sw) {  		var now = nmsData.dhcp.time;  		var then = nmsData.dhcp.dhcp4[nmsData.smanagement.switches[sw].traffic_vlan];  		var diff = now - then; -		var divider = 6; +		var divider = 10;  		if (dhcpClients < 10) {  			divider = 12;  		} @@ -616,7 +663,7 @@ function dhcpInfo(sw) {                  var now = nmsData.dhcp.time;                  var then = nmsData.dhcp.dhcp6[nmsData.smanagement.switches[sw].traffic_vlan];                  var diff = now - then; -                var divider = 6; +                var divider = 10;                  if (dhcpClients < 10) {                          divider = 12;                  } @@ -958,30 +1005,18 @@ function networkInfo(sw) {  			}  			ret.data[i++] = { -				value: a.v.name || "Not set", +				value: (a.v.name || "Not set") + " " + "vlan: " + (a.v.vlan || "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"  			} @@ -997,14 +1032,8 @@ function mgmtInfo(sw) {  		var mg = nmsData.smanagement.switches[sw];  		ret.data =  			[{ -				value: mg.mgmt_v4_addr || "N/A", -				description: "Management IP (v4)" -			}, { -				value: mg.mgmt_v6_addr || "N/A", -				description: "Management IP (v6)" -			}, { -				value: mg.distro_name || "N/A", -				description: "Distro" +				value: (mg.mgmt_v4_addr || "N/A") + " / " + (mg.mgmt_v6_addr || "N/A"), +				description: "Management IP"  			}  			];  		if ((mg.mgmt_v4_addr == undefined || mg.mgmt_v4_addr == "") && (mg.mgmt_v6_addr == undefined || mg.mgmt_v6_addr == "")) { @@ -1015,7 +1044,7 @@ function mgmtInfo(sw) {  			ret.score = 550;  		} else if (mg.mgmt_v6_addr == undefined || mg.mgmt_v6_addr == "") {  			ret.why = "No IPv6 management IP"; -			ret.score = 550; +			ret.score = 560;  			if (tagged(sw,'ignorev6')) {  				ret.score = 0;  			} diff --git a/web/js/nms-map.js b/web/js/nms-map.js index d5bc044..18a22b4 100644 --- a/web/js/nms-map.js +++ b/web/js/nms-map.js @@ -333,8 +333,17 @@ nmsMap._drawSwitch = function(sw)  	this._c.switch.ctx.shadowBlur = 0;  	var switchtext = sw;  	var textl = switchtext.length; -	if (textl > 12) -		switchtext = switchtext.slice(0,7) + ".." + switchtext.slice(textl-2,textl); +	// Cut switch name if longer than this +	var text_cut_l = 14; +	// Cut switch name by more if we have a status indicator +	if (this._info[sw]) { +		text_cut_l -= this._info[sw].length +	} +	if (textl > text_cut_l) { +		var rhs_text = this._info[sw]; + +		switchtext = switchtext.slice(0,text_cut_l - 5) + ".." + switchtext.slice(textl-2,textl); +	}  	if (this._lastName[sw] != switchtext) {  		nmsMap.stats.textSwitchDraws++; | 
