Browse Source

observium: Add snmpd script for interface parsing (for librenms/observium)

Sebastien Badia 9 years ago
parent
commit
83417352ec
3 changed files with 298 additions and 0 deletions
  1. 8 0
      README.md
  2. 141 0
      observium/snmpd_ifAliasBird
  3. 149 0
      observium/snmpd_ifAliasQuagga

+ 8 - 0
README.md

@@ -0,0 +1,8 @@
+# Gitoyen -- Router scripts
+
+A collection of little tools for gitoyen routers
+
+## Blackhole
+
+Blackhole management (for quagga and bird) and a second script for flood
+detection and automatic null-routing.

+ 141 - 0
observium/snmpd_ifAliasBird

@@ -0,0 +1,141 @@
+#! /usr/bin/perl
+
+use strict;
+
+my $baseoid = ".1.3.6.1.2.1.31.1.1.1.18";
+
+my $cache_secs = 60;
+
+# ----------------------------------
+
+my $mib;
+my $mibtime;
+
+$| = 1;
+
+while (my $cmd = <STDIN>) {
+  chomp $cmd;
+  if ($cmd eq "PING") {
+    print "PONG\n";
+  } elsif ($cmd eq "get") {
+    my $oid_in = <STDIN>;
+    chomp($oid_in);
+    my $oid = get_oid($oid_in);
+    my $mib = create_alias_mib();
+
+    if ($oid != 0 && defined{$mib->{$oid}}) {
+      print "$baseoid.$oid\n";
+      print $mib->{$oid}[0]."\n";
+      print $mib->{$oid}[1]."\n";
+    } else {
+      print "NONE\n";
+    }
+
+  } elsif ($cmd eq "getnext") {
+    my $oid_in = <STDIN>;
+
+    my $oid = get_oid($oid_in);
+    my $found = 0;
+
+    my $mib = create_alias_mib();
+    my @s = sort { oidcmp($a, $b) } keys %{ $mib };
+    for (my $i = 0; $i < @s; $i++) {
+      if (oidcmp($oid, $s[$i]) == -1) {
+        print "$baseoid.".$s[$i]."\n";
+        print $mib->{$s[$i]}[0]."\n";
+        print $mib->{$s[$i]}[1]."\n";
+        $found = 1;
+        last;
+      }
+    }
+    if (!$found) {
+      print "NONE\n";
+    }
+  } else {
+    # Unknown command
+  }
+}
+
+exit 0;
+
+
+sub get_oid
+{
+
+  my ($oid) = @_;
+  chomp $oid;
+
+  my $base = $baseoid;
+  $base =~ s/\./\\./g;
+
+  if ($oid !~ /^$base(\.|$)/) {
+    # Requested oid doesn't match base oid
+    return 0;
+  }
+
+  $oid =~ s/^$base\.?//;
+  return $oid;
+}
+
+sub oidcmp {
+  my ($x, $y) = @_;
+
+  my @a = split /\./, $x;
+  my @b = split /\./, $y;
+
+  my $i = 0;
+
+  while (1) {
+
+    if ($i > $#a) {
+      if ($i > $#b) {
+        return 0;
+      } else {
+        return -1;
+      }
+    } elsif ($i > $#b) {
+      return 1;
+    }
+
+    if ($a[$i] < $b[$i]) {
+      return -1;
+    } elsif ($a[$i] > $b[$i]) {
+      return 1;
+    }
+
+    $i++;
+  }
+}
+
+sub create_alias_mib
+{
+  # We cache the results for $cache_secs seconds
+  if (time - $mibtime < $cache_secs) {
+    return $mib;
+  }
+
+  my %name;
+  my %alias;
+
+  # retrieve the interface alias & number
+  open Q, "/usr/local/sbin/birdc sh interfaces |";
+  while(my $l = <Q>) {
+    chomp($l);
+    if ($l =~ /^([^[:space:]]+)[[:space:]]([^[:space:]]+)[[:space:]]\(index=(\d+)\).*/) {
+      $name{$1} = [ $3 ];
+    }
+  }
+  close Q;
+
+  open Q, "( if [ -e /etc/network/interfaces ]; then cat /etc/network/interfaces; elif [ -e /etc/rc.conf ]; then cat /etc/rc.conf; fi) |";
+  while(my $l = <Q>) {
+    chomp($l);
+    if ($l =~ /^# ([^:]*): (.*)$/) {
+      $alias{$name{$1}[0]} = [ "string", $2 ];
+    }
+  }
+  close Q;
+  $mib = \%alias;
+  $mibtime = time;
+  return $mib;
+}

+ 149 - 0
observium/snmpd_ifAliasQuagga

@@ -0,0 +1,149 @@
+#! /usr/bin/perl
+
+use strict;
+
+my $baseoid = ".1.3.6.1.2.1.31.1.1.1.18";
+
+my $vtysh = "/usr/local/bin/vtysh -c 'sh interface'";
+
+my $cache_secs = 60;
+
+# ----------------------------------
+
+my $mib;
+my $mibtime;
+
+$| = 1;
+
+while (my $cmd = <STDIN>) {
+    chomp $cmd;
+
+    if ($cmd eq "PING") {
+        print "PONG\n";
+    } elsif ($cmd eq "get") {
+        my $oid_in = <STDIN>;
+        my $oid = get_oid($oid_in);
+        my $mib = create_alias_mib();
+
+        if ($oid != 0 && defined{$mib->{$oid}}) {
+            print "$baseoid.$oid\n";
+            print $mib->{$oid}[0]."\n";
+            print $mib->{$oid}[1]."\n";
+        } else {
+            print "NONE\n";
+        }
+
+    } elsif ($cmd eq "getnext") {
+        my $oid_in = <STDIN>;
+
+        my $oid = get_oid($oid_in);
+        my $found = 0;
+
+        my $mib = create_alias_mib();
+        my @s = sort { oidcmp($a, $b) } keys %{ $mib };
+        for (my $i = 0; $i < @s; $i++) {
+            if (oidcmp($oid, $s[$i]) == -1) {
+                print "$baseoid.".$s[$i]."\n";
+                print $mib->{$s[$i]}[0]."\n";
+                print $mib->{$s[$i]}[1]."\n";
+                $found = 1;
+                last;
+            }
+        }
+        if (!$found) {
+            print "NONE\n";
+        }
+    } else {
+        # Unknown command
+    }
+
+}
+
+exit 0;
+
+
+sub get_oid
+{
+
+  my ($oid) = @_;
+  chomp $oid;
+
+  my $base = $baseoid;
+  $base =~ s/\./\\./g;
+
+  if ($oid !~ /^$base(\.|$)/) {
+    # Requested oid doesn't match base oid
+    return 0;
+  }
+
+  $oid =~ s/^$base\.?//;
+  return $oid;
+}
+
+sub oidcmp {
+  my ($x, $y) = @_;
+
+  my @a = split /\./, $x;
+  my @b = split /\./, $y;
+
+  my $i = 0;
+
+  while (1) {
+
+    if ($i > $#a) {
+      if ($i > $#b) {
+        return 0;
+      } else {
+        return -1;
+      }
+    } elsif ($i > $#b) {
+      return 1;
+    }
+
+    if ($a[$i] < $b[$i]) {
+      return -1;
+    } elsif ($a[$i] > $b[$i]) {
+      return 1;
+    }
+
+    $i++;
+  }
+}
+
+
+sub create_alias_mib
+{
+    # We cache the results for $cache_secs seconds
+    if (time - $mibtime < $cache_secs) {
+        return $mib;
+    }
+
+        my %name;
+        my %alias;
+
+   # retrieve the interface alias & number
+   open Q, "$vtysh |";
+   while(my $l = <Q>) {
+        if ($l =~ /^Interface ([[:graph:]]+)[^[:graph:]]+.*/) {
+            my $ifname = $1;
+            my $ifdesc= "";
+            my $ifindex= -1;
+
+            $l = <Q>;
+            if ($l =~ /^[[:space:]]*Description: (.+)/) {
+                $ifdesc = $1;
+                $l = <Q>;
+            }
+            if ($l =~ /^[[:space:]]*index[[:space:]]+(\d+) .*/) {
+                $ifindex = $1;
+            }
+
+            if ($ifindex != -1) {
+                $alias{$ifindex} = [ "string", $ifdesc ];
+            }
+        }
+   }
+   $mib = \%alias;
+   $mibtime = time;
+   return $mib;
+}