source: ocsinventory-agent/trunk/fuentes/lib/Ocsinventory/Agent/Modules/Snmp/9.pm @ 468

Last change on this file since 468 was 468, checked in by mabarracus, 4 years ago

Copyt trusty code

File size: 11.8 KB
Line 
1###
2# SNMP: OID: 9 SYSTEM: Cisco
3###
4# Version 0.9
5###
6
7package Ocsinventory::Agent::Modules::Snmp::9;
8
9use strict;
10use warnings;
11use Data::Dumper;
12
13sub snmp_run {
14   my ($session , $snmp )= @_;
15   my $logger=$snmp->{logger};
16   my $common=$snmp->{common};
17
18   my $list_mib=["Entity_Mib"];
19
20   $logger->debug("Running Cisco (9) MIB module");
21
22   foreach my $mib ( @{$list_mib} ) {
23      $snmp->snmp_oid_run($mib);
24   }
25
26   # OID
27   my $snmp_osversion="1.3.6.1.4.1.9.2.1.73.0";
28   my $snmp_dot1dBasePortIfIndex="1.3.6.1.2.1.17.1.4.1.2.";
29   my $snmp_ifdesc="1.3.6.1.2.1.2.2.1.2.";
30   my $snmp_iftype="1.3.6.1.2.1.2.2.1.3";
31   my $snmp_ifspeed="1.3.6.1.2.1.2.2.1.5.";
32   my $snmp_physAddr="1.3.6.1.2.1.2.2.1.6.";
33   my $snmp_ifadminstatus="1.3.6.1.2.1.2.2.1.7.";
34   # Specific Cisco
35   my $snmp_description="1.3.6.1.4.1.9.2.2.1.1.28.";
36   my $snmp_cisco_deviceAddress="1.3.6.1.4.1.9.9.23.1.2.1.1.4.";
37   my $snmp_cisco_deviceId="1.3.6.1.4.1.9.9.23.1.2.1.1.6.";
38   my $snmp_cisco_devicePort="1.3.6.1.4.1.9.9.23.1.2.1.1.7.";
39   my $snmp_cisco_devicePlatform="1.3.6.1.4.1.9.9.23.1.2.1.1.8.";
40   my $snmp_vtp_vlan_state="1.3.6.1.4.1.9.9.46.1.3.1.1.2";
41   my $snmp_dot1dTpFdbPort="1.3.6.1.2.1.17.4.3.1.2";
42 
43   my $snmp_cisco_ImageTable="1.3.6.1.4.1.9.9.25.1.1.1.2.4";
44   my $snmp_cisco_ImageVersion="1.3.6.1.4.1.9.9.25.1.1.1.2.5";
45   my $snmp_cisco_cpmProcessName="1.3.6.1.4.1.9.9.109.1.2.1.1.2";
46   my $snmp_cisco_cpmProcessCPU="1.3.6.1.4.1.9.9.109.1.2.1.1.6.";
47
48
49   my $oid;
50   my $oid_complet;
51
52   my $osversion;
53   my $ref;
54   my $serial;
55   my $first_serial=undef;
56   my $software;
57   my $firmware;
58   my $location;
59   my $TotalEthernet=0;
60   my $result_snmp;
61   my $result_sub;
62   my $index_mac={};
63   my $ref_mac={};
64
65
66   my $DESCRIPTION=undef; 
67   my $SPEED=undef; 
68   my $MACADDR=undef;
69   my $DEVICEMACADDR=undef;
70   my $SLOT=undef;
71   my $STATUS=undef;
72   my $TYPE=undef; 
73   my $DEVICENAME=undef;
74   my $DEVICEADDRESS=undef;
75   my $DEVICEPORT=undef;
76   my $DEVICETYPE=undef;
77   my $VLAN=undef;
78   my $CPU=undef;
79
80    $common->setSnmpCommons( {TYPE => "Network"} );
81
82 # Info interessante SNMPv2-SMI::enterprises.9.9.23.1.2.1.1.6.10140.1
83 # SNMPv2-SMI::enterprises.9.9.25.1.1.1.2.1
84
85    # version IOS
86    $result_snmp=$session->get_request(-varbindlist => [$snmp_osversion]);
87    if ( defined($result_snmp->{$snmp_osversion}) ) {
88       $osversion=$result_snmp->{$snmp_osversion};
89    }
90   
91    # We are going to look for the vlan existing on this equipment
92    $result_snmp=$session->get_entries(-columns => [$snmp_vtp_vlan_state]);
93    foreach my $resultmac ( keys  %{$result_snmp} ) {
94       if ( $resultmac =~ /1\.3\.6\.1\.4\.1\.9\.9\.46\.1\.3\.1\.1\.2\.1\.(\S+)/ ) {
95           my $ref_vlan=$1;
96           # Now we can scan this vlan for mac adress
97           # We must first open a new session with the index associated with the vlan
98           my $sub_session= Net::SNMP->session(
99                -retries     => 1 ,
100                -timeout     => 3,
101                -version     => $session->version,
102                -hostname    => $session->hostname,
103                -community   => $snmp->{snmp_community}."@".$ref_vlan,
104                -translate   => [-nosuchinstance => 0, -nosuchobject => 0],
105                #-username      => $comm->{username}, # V3 test after
106                #-authkey       => $comm->{authkey},
107                #-authpassword  => $comm->{authpasswd},
108                #-authprotocol  => $comm->{authproto},
109                #-privkey       => $comm->{privkey},
110                #-privpassword  => $comm->{privpasswd},
111                #-privprotocol  => $comm->{privproto},
112          );
113          if ( defined ( $sub_session ) ) {
114             my $result_snmp_mac=$sub_session->get_entries(-columns => [$snmp_dot1dTpFdbPort ]);
115             if ( defined ($result_snmp_mac ) ) {
116                # We scan all lines
117                for my $ligne_snmp_mac ( keys %{$result_snmp_mac} ) {
118                    # We first take in the OID the 6 last numbers indicate in decimal the mac address
119                    if ( $ligne_snmp_mac =~ /17\.4\.3\.1\.2\.(\S+)\.(\S+)\.(\S+)\.(\S+)\.(\S+)\.(\S+)$/ ) {
120                       my $distant_mac=sprintf("%.2x:%.2x:%.2x:%.2x:%.2x:%.2x",$1,$2,$3,$4,$5,$6);
121                       my $data_values={};
122                       my $index_bridge=$result_snmp_mac->{$ligne_snmp_mac};
123   
124                       # We have no table for this reference
125                       if ( ! defined ( $index_mac->{$index_bridge}) ) {
126                           # init of the table
127                           $index_mac->{$index_bridge}=[];
128                           # we take the value gived by the OID
129                           my $snmp_intero=$snmp_dot1dBasePortIfIndex.$index_bridge;
130                           # We take the index reference for the ifdesc
131                           # So when we scan this ifdesc, we can add the vlans and mac
132                           my $ref_snmp_line=$sub_session->get_request(-varbindlist => [ $snmp_intero ]);
133                           # We transmit the ointer value to the ref_mac so we can have a double acces for the data
134                           # If we have no information: the mac is not associated with a port
135                           # It's the switch mac adress
136                           if ( defined ( $ref_snmp_line->{$snmp_intero}) ) {
137                              $ref_mac->{$ref_snmp_line->{$snmp_intero}}=$index_mac->{$index_bridge};
138                           }
139                       }
140                       $data_values->{MACADRESS}[0]=$distant_mac;
141                       $data_values->{VLANID}[0]=$ref_vlan;
142                       push(@{$index_mac->{$result_snmp_mac->{$ligne_snmp_mac}}},$data_values);
143                    }
144                }
145             }
146             $sub_session->close;
147          }
148       }
149       
150   }
151
152    # We look for interfaces
153    $result_snmp=$session->get_entries(-columns => [$snmp_iftype]);
154    foreach my $result ( keys  %{$result_snmp} ) {
155        # We work on real interface and no vlan
156        if ( $result_snmp->{$result} == 6 ) {
157           if ( $result =~ /1\.3\.6\.1\.2\.1\.2\.2\.1\.3\.(\S+)/ ) {
158               $ref=$1;
159               $TYPE="ethernetCsmacd";
160
161               $SLOT=$session->get_request(-varbindlist => [$snmp_ifdesc.$ref]);
162               if ( defined( $SLOT->{$snmp_ifdesc.$ref} ) ) {
163                   $SLOT=$SLOT->{$snmp_ifdesc.$ref};
164               }
165
166               $SPEED=$session->get_request(-varbindlist => [$snmp_ifspeed.$ref]);
167               if ( defined( $SPEED->{$snmp_ifspeed.$ref}) ) {
168                   $SPEED=$SPEED->{$snmp_ifspeed.$ref};
169                   if ( $SPEED / 1000000000000 >= 1 ) {
170                      $SPEED=$SPEED / 1000000000000;
171                      $SPEED=$SPEED." T";
172                   } elsif ( $SPEED / 1000000000 >= 1 ) {
173                      $SPEED=$SPEED / 1000000000;
174                      $SPEED=$SPEED." G";
175                   } elsif ( $SPEED / 1000000 >= 1 ) {
176                      $SPEED=$SPEED / 1000000;
177                      $SPEED=$SPEED." M";
178                   }
179
180               }
181
182               $MACADDR=$session->get_request(-varbindlist => [$snmp_physAddr.$ref]);
183               if ( defined( $MACADDR->{$snmp_physAddr.$ref}) ) {
184                  # For MACADDR, we need a translation beetween Hexa and string
185                  $MACADDR=$MACADDR->{$snmp_physAddr.$ref};
186                  if ( length ($MACADDR) == 14 ) {
187                     $MACADDR=substr($MACADDR,2,2).":".
188                        substr($MACADDR,4,2).":".
189                        substr($MACADDR,6,2).":".
190                        substr($MACADDR,8,2).":".
191                        substr($MACADDR,10,2).":".
192                        substr($MACADDR,12,2);
193                  } else {
194                     $MACADDR="";
195                  }
196               }
197               if ( defined $ref_mac->{$ref} ) {
198                  $VLAN=$ref_mac->{$ref};
199               }
200
201               $STATUS=$session->get_request(-varbindlist => [ $snmp_ifadminstatus.$ref ]);
202               if ( $STATUS->{$snmp_ifadminstatus.$ref} == 1 ) {
203                  $STATUS="Up";
204               } else {
205                  $STATUS="Down";
206               }
207
208               $DESCRIPTION=$session->get_request(-varbindlist => [ $snmp_description.$ref ]);
209               if ( defined( $DESCRIPTION ) ) {
210                  $DESCRIPTION=$DESCRIPTION->{$snmp_description.$ref};
211               }
212               $DEVICEADDRESS=$session->get_entries( -columns => [ $snmp_cisco_deviceAddress.$ref ] );
213               if ( defined( $DEVICEADDRESS ) ) {
214                  my $DEVICEADDRESS_uniq;
215                  foreach my $key ( keys %{$DEVICEADDRESS} ) {
216                     $DEVICEADDRESS_uniq=$DEVICEADDRESS->{$key} ;
217                     if ( length ( $DEVICEADDRESS_uniq ) == 10 ) {
218                        $DEVICEADDRESS_uniq=hex(substr($DEVICEADDRESS_uniq,2,2)).
219                                        ".".hex(substr($DEVICEADDRESS_uniq,4,2)).
220                                        ".".hex(substr($DEVICEADDRESS_uniq,6,2)).
221                                        ".".hex(substr($DEVICEADDRESS_uniq,8,2));
222                     } else {
223                        $DEVICEADDRESS_uniq=undef;
224                     }
225                     
226                  }
227                  $DEVICEADDRESS=$DEVICEADDRESS_uniq;
228               }
229               $DEVICENAME=$session->get_entries( -columns => [ $snmp_cisco_deviceId.$ref ] );
230               if ( defined( $DEVICENAME ) ) {
231                  my $DEVICENAME_uniq;
232                  my $DEVICETYPE_uniq;
233                  my $DEVICEPORT_uniq;
234                 
235                  foreach my $key ( keys %{$DEVICENAME} ) {
236                     $DEVICENAME_uniq=$DEVICENAME->{$key};
237                  }
238                  $DEVICENAME=$DEVICENAME_uniq;
239               # If we have the device name, the cdp can be used for the other informations
240                  $DEVICETYPE=$session->get_entries( -columns => [ $snmp_cisco_devicePlatform.$ref ] );
241                  if ( defined( $DEVICETYPE ) ) {
242                     foreach my $key ( keys %{$DEVICETYPE} ) {
243                        $DEVICETYPE_uniq=$DEVICETYPE->{$key};
244                     }
245                     $DEVICETYPE=$DEVICETYPE_uniq;
246                  }
247                  $DEVICEPORT=$session->get_entries( -columns => [ $snmp_cisco_devicePort.$ref ] );
248                  if ( defined( $DEVICEPORT ) ) {
249                     foreach my $key ( keys %{$DEVICEPORT} ) {
250                        $DEVICEPORT_uniq=$DEVICEPORT->{$key};
251                     }
252                     $DEVICEPORT=$DEVICEPORT_uniq;
253                  }
254               }
255           }
256
257           $common->addSnmpNetwork( { 
258                DESCRIPTION   => $DESCRIPTION,
259                SPEED         => $SPEED,
260                MACADDR       => $MACADDR,
261                SLOT          => $SLOT,
262                STATUS        => $STATUS,
263                TYPE          => $TYPE,
264                DEVICENAME    => $DEVICENAME,
265                DEVICEADDRESS => $DEVICEADDRESS,
266                DEVICEPORT    => $DEVICEPORT,
267                DEVICETYPE    => $DEVICETYPE,
268                VLAN          => $VLAN,
269                });
270           $DESCRIPTION=undef;
271           $MACADDR=undef;
272           $SLOT=undef;
273           $STATUS=undef;
274           $TYPE=undef;
275           $SPEED=undef;
276           $MACADDR=undef;
277           $DEVICEADDRESS=undef;
278           $DEVICENAME=undef;
279           $DEVICEPORT=undef;
280           $DEVICETYPE=undef;
281           $VLAN=undef;
282        }
283    }
284    # We have finished for interfaces
285
286
287    # We look for Softwares on the switch
288    # We look for feature
289    # All feature are separated by a pipe
290    $result_snmp=$session->get_request ( -varbindlist => [ $snmp_cisco_ImageTable ]) ;
291    if ( defined ( $result_snmp ) ) {
292        $result_snmp=$result_snmp->{$snmp_cisco_ImageTable};
293        my @tab_feature=split(/\$/,$result_snmp);
294        @tab_feature=split(/\|/,$tab_feature[1]);
295        foreach $result_sub ( @tab_feature ) {
296          $common->addSoftware( { NAME => $result_sub , COMMENTS => "Feature" } );
297        }
298    }
299    # We look for IOS version
300    $result_snmp=$session->get_request ( -varbindlist => [ $snmp_cisco_ImageVersion ]) ;
301    if ( defined ( $result_snmp ) ) {
302        $result_snmp=$result_snmp->{$snmp_cisco_ImageVersion};
303        my @tab_feature=split(/\$/,$result_snmp);
304        $common->addSoftware( { NAME => $tab_feature[1] , COMMENTS => "IOS" } );
305    }
306} 
307
3081;
Note: See TracBrowser for help on using the repository browser.