torrus, 10574
authorivan <ivan>
Tue, 25 Jan 2011 03:14:42 +0000 (03:14 +0000)
committerivan <ivan>
Tue, 25 Jan 2011 03:14:42 +0000 (03:14 +0000)
FS/FS/NetworkMonitoringSystem.pm [new file with mode: 0644]
FS/FS/NetworkMonitoringSystem/Torrus_Internal.pm [new file with mode: 0644]

diff --git a/FS/FS/NetworkMonitoringSystem.pm b/FS/FS/NetworkMonitoringSystem.pm
new file mode 100644 (file)
index 0000000..c16d5fe
--- /dev/null
@@ -0,0 +1,28 @@
+package FS::NetworkMonitoringSystem;
+
+use strict;
+use vars qw( $conf $system $AUTOLOAD );
+use FS::Conf;
+use FS::UID;
+
+FS::UID->install_callback( sub { 
+  $conf = new FS::Conf;
+  $system = $conf->config('network_monitoring_system');
+} );
+
+sub AUTOLOAD {
+  my $self = shift;
+
+  my($sub)=$AUTOLOAD;
+  $sub =~ s/.*://;
+
+  my $conf = new FS::Conf;
+  die "FS::NetworkMonitoringSystem::$AUTOLOAD called, but none configured\n"
+    unless $system;
+
+  eval "use FS::NetworkMonitoringSystem::$system;";
+  die $@ if $@;
+
+  $self .= "::$system";
+  $self->$sub(@_);
+}
diff --git a/FS/FS/NetworkMonitoringSystem/Torrus_Internal.pm b/FS/FS/NetworkMonitoringSystem/Torrus_Internal.pm
new file mode 100644 (file)
index 0000000..68356e7
--- /dev/null
@@ -0,0 +1,124 @@
+package FS::NetworkMonitoringSystem::Torrus_Internal;
+
+use strict;
+#use vars qw( $DEBUG $me );
+use Fcntl qw(:flock);
+use IO::File;
+use File::Slurp qw(slurp);
+
+#$DEBUG = 0;
+#$me = '[FS::NetworkMonitoringSystem::Torrus_Internal]';
+
+our $lock;
+our $lockfile = '/usr/local/etc/torrus/discovery/FSLOCK';
+our $ddxfile  = '/usr/local/etc/torrus/discovery/routers.ddx';
+
+sub add_router {
+  my($self, $ip) = @_;
+
+  my $newhost = 
+    qq(  <host>\n).
+    qq(    <param name="snmp-host" value="$ip"/>\n).
+    qq(  </host>\n);
+
+  my $ddx = $self->_torrus_loadddx;
+
+  $ddx =~ s{(</snmp-discovery>)}{$newhost$1};
+
+  $self->_torrus_newddx($ddx);
+
+sub add_interface {
+  my($self, $router_ip, $interface, $serviceid ) = @_;
+
+  $interface =~ s(\/)(_)g;
+
+  #should just use a proper XML parser huh
+
+  my $newline = "     $serviceid:$interface:Both:main,";
+
+  my @ddx = split(/\n/, $self->_torrus_loadddx);
+  my $new = '';
+
+  my $added = 0;
+
+  while ( my $line = shift(@ddx) ) {
+    $new .= "$line\n";
+    next unless $line =~ /^\s*<param\s+name="snmp-host"\s+value="$router_ip"\/?>/i;
+
+    while ( my $hostline = shift(@ddx) ) {
+      $new .= "$hostline\n";
+      if ( $hostline =~ /^\s*<param name="RFC2863_IF_MIB::external-serviceid"\/?>/i ) {
+
+        while ( my $paramline = shift(@ddx) ) {
+          if ( $paramline =~ /^\s*</param>/ ) {
+            $new .= "$newline\n$paramline";
+            last; #paramline
+          } else {
+            $new .= $paramline;
+          }
+        }
+
+        $added++;
+
+      } elsif ( $hostline =~ /^\s+<\/host>\s*/i ) {
+        unless ( $added ) {
+          $new .= 
+            qq(   <param name="RFC2863_IF_MIB::external-serviceid">\n).
+            qq(     $newline\n").
+            qq(   </param>\n).
+        }
+        $new .= $hostline;
+        last; #hostline
+      }
+    }
+
+  }
+
+  $self->_torrus_newddx($new);
+
+}
+
+sub _torrus_lock {
+  $lock = new IO:::File ">>$lockfile" or die $!;
+  flock($lock, LOCK_EX);
+}
+
+sub _torrus_unlock {
+  flock($lock, LOCK_UN);
+  close $lock;
+}
+
+sub _torrus_loadddx {
+  my($self) = @_;
+  $self->_torrus_lock;
+  return slurp($ddxfile);
+}
+
+sub _torrus_newddx {
+  my($self, $ddx) = @_;
+
+  my $new = new IO::File ">$ddxfile.new"
+    or die "can't write to $ddxfile.new: $!";
+  print $new $ddx;
+  close $new;
+  rename("$ddxfile", $ddxfile.`date +%Y%m%d%H%M%S`) or die $!;
+  rename("$ddxfile.new", $ddxfile) or die $!;
+
+  $self->_torrus_reload;
+}
+
+sub _torrus_reload {
+  my($self) = @_;
+
+  #i should have better error checking
+
+  system('torrus', 'devdiscover', "--in=$ddxfile");
+
+  system('torrus', 'compile', '--tree=main'); # , '--verbose'
+
+  $self->_torrus_unlock;
+
+}
+
+1;