diff options
| author | ivan <ivan> | 2011-01-25 03:14:42 +0000 | 
|---|---|---|
| committer | ivan <ivan> | 2011-01-25 03:14:42 +0000 | 
| commit | 40d1e71653e1a0021021d9d3f7f7705cf9df4d61 (patch) | |
| tree | 6bfc15c30b93704e389ee939f800a1b0b8ee1c2c /FS | |
| parent | 2c53505237b44980a578c9df707b6708402ead1b (diff) | |
torrus, 10574
Diffstat (limited to 'FS')
| -rw-r--r-- | FS/FS/NetworkMonitoringSystem.pm | 28 | ||||
| -rw-r--r-- | FS/FS/NetworkMonitoringSystem/Torrus_Internal.pm | 124 | 
2 files changed, 152 insertions, 0 deletions
| diff --git a/FS/FS/NetworkMonitoringSystem.pm b/FS/FS/NetworkMonitoringSystem.pm new file mode 100644 index 000000000..c16d5fe57 --- /dev/null +++ b/FS/FS/NetworkMonitoringSystem.pm @@ -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 index 000000000..68356e72d --- /dev/null +++ b/FS/FS/NetworkMonitoringSystem/Torrus_Internal.pm @@ -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; | 
