summaryrefslogtreecommitdiff
path: root/torrus/perllib/Torrus/SNMP_Failures.pm
diff options
context:
space:
mode:
Diffstat (limited to 'torrus/perllib/Torrus/SNMP_Failures.pm')
-rw-r--r--torrus/perllib/Torrus/SNMP_Failures.pm205
1 files changed, 205 insertions, 0 deletions
diff --git a/torrus/perllib/Torrus/SNMP_Failures.pm b/torrus/perllib/Torrus/SNMP_Failures.pm
new file mode 100644
index 000000000..4203dc166
--- /dev/null
+++ b/torrus/perllib/Torrus/SNMP_Failures.pm
@@ -0,0 +1,205 @@
+# Copyright (C) 2010 Stanislav Sinyagin
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+
+# $Id: SNMP_Failures.pm,v 1.1 2010-12-27 00:03:39 ivan Exp $
+# Stanislav Sinyagin <ssinyagin@yahoo.com>
+
+
+# SNMP failures statistics interface
+
+package Torrus::SNMP_Failures;
+
+use Torrus::DB;
+use Torrus::Log;
+use strict;
+
+
+sub new
+{
+ my $self = {};
+ my $class = shift;
+ my %options = @_;
+ bless $self, $class;
+
+ %{$self->{'options'}} = %options;
+
+ die() if ( not defined($options{'-Tree'}) or
+ not defined($options{'-Instance'}) );
+
+ $self->{'db_failures'} =
+ new Torrus::DB( 'snmp_failures_' . $options{'-Instance'},
+ -Subdir => $self->{'options'}{'-Tree'},
+ -Btree => 1,
+ -WriteAccess => $options{'-WriteAccess'} );
+
+ $self->{'counters'} = ['unreachable', 'deleted', 'mib_errors'];
+
+ return( defined( $self->{'db_failures'} ) ? $self:undef );
+}
+
+
+sub DESTROY
+{
+ my $self = shift;
+ $self->{'db_failures'}->closeNow();
+}
+
+
+
+sub init
+{
+ my $self = shift;
+
+ $self->{'db_failures'}->trunc();
+
+ foreach my $c ( @{$self->{'counters'}} )
+ {
+ $self->{'db_failures'}->put('c:' . $c, 0);
+ }
+}
+
+
+
+sub host_failure
+{
+ my $self = shift;
+ my $type = shift;
+ my $hosthash = shift;
+
+ $self->{'db_failures'}->put('h:' . $hosthash,
+ $type . ':' . time());
+}
+
+
+sub set_counter
+{
+ my $self = shift;
+ my $type = shift;
+ my $count = shift;
+
+ $self->{'db_failures'}->put('c:' . $type, $count);
+}
+
+
+sub remove_host
+{
+ my $self = shift;
+ my $hosthash = shift;
+
+ $self->{'db_failures'}->del('h:' . $hosthash);
+}
+
+
+sub mib_error
+{
+ my $self = shift;
+ my $hosthash = shift;
+ my $path = shift;
+
+ my $count = $self->{'db_failures'}->get('M:' . $hosthash);
+ $count = 0 unless defined($count);
+
+ $self->{'db_failures'}->put('m:' . $hosthash, $path . ':' . time());
+ $self->{'db_failures'}->put('M:' . $hosthash, $count + 1);
+
+ my $global_count = $self->{'db_failures'}->get('c:mib_errors');
+ $self->{'db_failures'}->put('c:mib_errors', $global_count + 1);
+}
+
+
+
+sub read
+{
+ my $self = shift;
+ my $out = shift;
+ my %options = @_;
+
+ foreach my $c ( @{$self->{'counters'}} )
+ {
+ if( not defined( $out->{'total_' . $c} ) )
+ {
+ $out->{'total_' . $c} = 0;
+ }
+
+ $out->{'total_' . $c} +=
+ $self->{'db_failures'}->get('c:' . $c);
+
+ if( $options{'-details'} and
+ not defined( $out->{'detail_' . $c} ) )
+ {
+ $out->{'detail_' . $c} = {};
+ }
+ }
+
+ &Torrus::DB::checkInterrupted();
+
+ if( $options{'-details'} )
+ {
+ my $cursor = $self->{'db_failures'}->cursor();
+ while( my ($key, $val) = $self->{'db_failures'}->next($cursor) )
+ {
+ if( $key =~ /^h:(.+)$/o )
+ {
+ my $hosthash = $1;
+ my ($counter, $timestamp) = split(/:/o, $val);
+
+ $out->{'detail_' . $counter}{$hosthash} = {
+ 'timestamp' => 0 + $timestamp,
+ 'time' => scalar(localtime( $timestamp )),
+ };
+ }
+ elsif( $key =~ /^m:(.+)$/o )
+ {
+ my $hosthash = $1;
+ my ($path, $timestamp) = split(/:/o, $val);
+
+ $out->{'detail_mib_errors'}{$hosthash}{'nodes'}{$path} = {
+ 'timestamp' => 0 + $timestamp,
+ 'time' => scalar(localtime( $timestamp )),
+ }
+ }
+ elsif( $key =~ /^M:(.+)$/o )
+ {
+ my $hosthash = $1;
+ my $count = 0 + $val;
+
+ if( not defined
+ ( $out->{'detail_mib_errors'}{$hosthash}{'count'}) )
+ {
+ $out->{'detail_mib_errors'}{$hosthash}{'count'} = 0;
+ }
+
+ $out->{'detail_mib_errors'}{$hosthash}{'count'} += $count;
+ }
+
+ &Torrus::DB::checkInterrupted();
+ }
+
+ undef $cursor;
+ }
+}
+
+
+
+
+1;
+
+
+# Local Variables:
+# mode: perl
+# indent-tabs-mode: nil
+# perl-indent-level: 4
+# End: