From 40d1e71653e1a0021021d9d3f7f7705cf9df4d61 Mon Sep 17 00:00:00 2001 From: ivan Date: Tue, 25 Jan 2011 03:14:42 +0000 Subject: [PATCH] torrus, 10574 --- FS/FS/NetworkMonitoringSystem.pm | 28 +++++ FS/FS/NetworkMonitoringSystem/Torrus_Internal.pm | 124 +++++++++++++++++++++++ 2 files changed, 152 insertions(+) create mode 100644 FS/FS/NetworkMonitoringSystem.pm create mode 100644 FS/FS/NetworkMonitoringSystem/Torrus_Internal.pm 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( \n). + qq( \n). + qq( \n); + + my $ddx = $self->_torrus_loadddx; + + $ddx =~ s{()}{$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*/i; + + while ( my $hostline = shift(@ddx) ) { + $new .= "$hostline\n"; + if ( $hostline =~ /^\s*/i ) { + + while ( my $paramline = shift(@ddx) ) { + if ( $paramline =~ /^\s*/ ) { + $new .= "$newline\n$paramline"; + last; #paramline + } else { + $new .= $paramline; + } + } + + $added++; + + } elsif ( $hostline =~ /^\s+<\/host>\s*/i ) { + unless ( $added ) { + $new .= + qq( \n). + qq( $newline\n"). + qq( \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; -- 2.11.0