summaryrefslogtreecommitdiff
path: root/FS/FS
diff options
context:
space:
mode:
authorivan <ivan>2011-01-25 03:14:42 +0000
committerivan <ivan>2011-01-25 03:14:42 +0000
commit40d1e71653e1a0021021d9d3f7f7705cf9df4d61 (patch)
tree6bfc15c30b93704e389ee939f800a1b0b8ee1c2c /FS/FS
parent2c53505237b44980a578c9df707b6708402ead1b (diff)
torrus, 10574
Diffstat (limited to 'FS/FS')
-rw-r--r--FS/FS/NetworkMonitoringSystem.pm28
-rw-r--r--FS/FS/NetworkMonitoringSystem/Torrus_Internal.pm124
2 files changed, 152 insertions, 0 deletions
diff --git a/FS/FS/NetworkMonitoringSystem.pm b/FS/FS/NetworkMonitoringSystem.pm
new file mode 100644
index 0000000..c16d5fe
--- /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 0000000..68356e7
--- /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;