File Coverage

blib/lib/SNMPMonitor.pm
Criterion Covered Total %
statement 10 12 83.3
branch n/a
condition n/a
subroutine 4 4 100.0
pod n/a
total 14 16 87.5


line stmt bran cond sub pod time code
1             package SNMPMonitor;
2             our $VERSION = '0.10';
3              
4 1     1   26850 use 5.008008;
  1         4  
  1         36  
5 1     1   953 use common::sense;
  1         8  
  1         5  
6              
7 1     1   882 use Module::Pluggable require => 1;
  1         11419  
  1         9  
8              
9 1     1   634 use NetSNMP::OID (':all');
  0            
  0            
10             use NetSNMP::agent (':all');
11             use NetSNMP::ASN (':all');
12              
13             sub new {
14             my $class = shift;
15             my $self = {
16             running => '1',
17             debugging => '0',
18             subagent => '0',
19             valid_plugins => '',
20             plugin => '',
21             agent => new NetSNMP::agent('dont_init_agent' => 1,'dont_init_lib' => 1),
22             oid => {},
23             };
24            
25             bless $self, $class;
26             $self->set_accessors;
27              
28             $self->load_plugins;
29             $self->check_oid;
30             $self->register;
31             return $self;
32             }
33              
34             # Create accessor and mutator methods in the symbol table.
35             sub set_accessors {
36             my $self = shift;
37              
38             # create accessor methods for defined parameters
39             for my $datum (keys %{$self}) {
40             no strict "refs";
41              
42             *$datum = sub {
43             my $self = shift; # Don't ignore calling class/object
44             $self->{$datum} = shift if @_;
45             return $self->{$datum};
46             };
47             }
48             }
49              
50             # finds and attempts to load and initialize plugins
51             sub load_plugins {
52             my $self = shift;
53             my $FH = shift;
54              
55             my @plugins = $self->plugins;
56             my $valid_plugins = ();
57             foreach (@plugins) {
58             my ($initialized, $error) = $self->evaluate_plugin($_);
59             push @{$valid_plugins}, $initialized if $initialized;
60             print $FH "Error in Plugin: $_\n$@\n" unless $initialized;
61             }
62             $self->plugin($valid_plugins);
63             }
64              
65             # Evaluates plugins for validity,
66             # Returns initialized object if valid,
67             # Returns the error if invalid.
68             sub evaluate_plugin {
69             my $self = shift;
70             my $plugin = shift;
71              
72             # print STDERR "evaluating, " . $plugin . "\n";
73             my $new_object = eval { $plugin->new; };
74             return $new_object, $@;
75             }
76              
77             # Registers All Plugins with the SNMP Agent
78             sub register {
79             my $self = shift;
80             my $FH = shift || 'STDERR';
81              
82             foreach (@{$self->plugin}) {
83             print $FH "@ Registering: " . $_->name . "\n";
84             $self->print_info($_);
85             $self->register_plugin($_);
86             }
87             }
88              
89             # Actually Registers a Plugin with the SNMP Agtent.
90             sub register_plugin {
91             my $self = shift;
92             my $plugin = shift;
93              
94             $self->agent->register(
95             $plugin->name,
96             $plugin->full_oid,
97             sub {
98             $plugin->set_monitor(@_)
99             },
100             );
101              
102             }
103              
104             sub dump_plugins {
105             my $self = shift;
106             foreach (@{$self->plugin}) {
107             $self->print_info($_);
108             }
109             }
110              
111              
112             #print some info about the plugins
113             sub print_info {
114             my $self = shift;
115             my $plugin = shift;
116             my $FH = shift || 'STDERR';
117              
118             print $FH "--> Name: " . $plugin->name . "\n";
119             print $FH "--> Full Name: " . $plugin->full_name . "\n";
120             print $FH "--> Name: " . $plugin->name . "\n";
121             print $FH "--> OID: " . $plugin->plugin_oid . "\n";
122             # print $FH "Root OID: " . $plugin->root_oid . "\n";
123             print $FH "--> Full OID: " . $plugin->full_oid . "\n\n";
124             }
125              
126             sub check_oid {
127             my $self = shift;
128            
129             INCREMENT: foreach my $plugin (@{$self->plugin}) {
130            
131             #print STDOUT $self->oid;
132             if ($self->oid->{$plugin->plugin_oid}) {
133             $self->increment_oid($plugin);
134             redo INCREMENT;
135             }
136             else {
137             $self->oid->{$plugin->plugin_oid} = $plugin->name;
138             }
139             }
140             }
141              
142             sub increment_oid {
143             my $self = shift;
144             my $plugin = shift;
145             my $FH = shift || 'STDOUT' ;
146              
147             my @oid = split/\./, $plugin->plugin_oid;
148             $oid[-1] += 1;
149             my $new_oid = join '.', @oid;
150             print $FH "! Created new OID: $new_oid for " . $plugin->name . "\n";
151              
152             $plugin->plugin_oid($new_oid);
153             $plugin->reset_oid;
154             }
155              
156             1;
157             __END__