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

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

Copyt trusty code

File size: 6.1 KB
Line 
1###
2# SNMP: OID: 2 SYSTEM: If_Mib
3###
4package Ocsinventory::Agent::Modules::Snmp::If_Mib;
5
6use strict;
7use warnings;
8
9sub snmp_info {
10   return ( { oid_value => "1.3.6.1.2.1.2.1.0",
11            oid_name => "If_Mib" } );
12}
13
14sub snmp_run {
15   my ($session , $snmp )= @_;
16   my $logger=$snmp->{logger};
17   my $common=$snmp->{common};
18   
19   $logger->debug("Running If MIB module");   
20
21   # OID a recuperer
22   my $snmp_ifdescr="1.3.6.1.2.1.2.2.1.2";
23   my $snmp_iftype="1.3.6.1.2.1.2.2.1.3.";
24   my $snmp_ifspeed="1.3.6.1.2.1.2.2.1.5.";
25   my $snmp_physAddr="1.3.6.1.2.1.2.2.1.6.";
26   my $snmp_ifadminstatus="1.3.6.1.2.1.2.2.1.7.";
27   my $snmp_ipAdEntIfIndex="1.3.6.1.2.1.4.20.1.2";
28   my $snmp_ipAdEntNetMask="1.3.6.1.2.1.4.20.1.3.";
29   my $snmp_ipRouteIfIndex="1.3.6.1.2.1.4.21.1.2.";
30   my $snmp_ipRouteNextHop="1.3.6.1.2.1.4.21.1.7.";
31   my $snmp_ipRouteType="1.3.6.1.2.1.4.21.1.8";
32
33   my $SPEED=undef; 
34   my $MACADDR=undef;
35   my $SLOT=undef; 
36   my $STATUS=undef; 
37   my $TYPE=undef;
38   my $IPADDR=undef;
39   my $IPMASK=undef;
40   my $IPGATEWAY=undef;
41   my $IPSUBNET=undef;
42
43   my $ref;
44   my $result_snmp;
45   my $address_index=undef;
46   my $netmask_index=undef;
47   my $network_index=undef;
48   my $gateway_index=undef;
49
50   # the informations on ip address and gateway are not indexed on the
51   # interfaces so we must get it before and integrate the informations
52   # after for each interface
53
54   # We take all the snmp_ifadminstatus in a table if this information exist
55   $result_snmp=$session->get_entries(-columns => [$snmp_ipAdEntIfIndex]);
56   foreach my $result ( keys %{$result_snmp} ) {
57      if ( $result =~ /1\.3\.6\.1\.2\.1\.4\.20\.1\.2\.(\S+)/ ) {
58         my $address=$1;
59         $address_index->{$result_snmp->{$result}}=$address;
60         # We have the address so we can lokk for the netmask associated
61         my $netmask=$session->get_request(-varbindlist => [$snmp_ipAdEntNetMask.$address]);
62         if ( defined($netmask->{$snmp_ipAdEntNetMask.$address} ) ) {
63            $netmask_index->{$result_snmp->{$result}}=$netmask->{$snmp_ipAdEntNetMask.$address};
64         }
65      }
66   }
67   # now we can do the same thing for the gateway
68   # It is an other index and only indirect information (routing)
69   # are required actually
70   $result_snmp=$session->get_entries(-columns => [$snmp_ipRouteType]);
71   foreach my $result ( keys %{$result_snmp} ) {
72      if ( $result =~ /1\.3\.6\.1\.2\.1\.4\.21\.1\.8\.(\S+)/ ) {
73         if ( $result_snmp->{$result} == 4  ) {
74            my $net_address=$1;
75            # We get the index associating the interface with the gateway and subnet
76            my $ind=$session->get_request(-varbindlist => [$snmp_ipRouteIfIndex.$net_address] );
77            $ind=$ind->{$snmp_ipRouteIfIndex.$net_address};
78            # We ave already the network so we can add the information with the index
79            $network_index->{$ind}=$net_address;
80            # We get the gateway
81            my $gateway=$session->get_request(-varbindlist => [$snmp_ipRouteNextHop.$net_address] );
82            $gateway_index->{$ind}=$gateway->{$snmp_ipRouteNextHop.$net_address};
83         }
84      }
85   }
86
87   # We look for interfaces
88   $result_snmp=$session->get_entries(-columns => [$snmp_ifdescr]);
89   foreach my $result ( keys  %{$result_snmp} ) {
90      # We work on real interface and no vlan
91      if ( $result_snmp->{$result} =~ /[eE]th|FC|[bB]ond/ ) {
92         if ( $result =~ /1\.3\.6\.1\.2\.1\.2\.2\.1\.2\.(\S+)/ ) {
93            $ref=$1;
94            $SLOT=$result_snmp->{$result};
95
96            $TYPE=$session->get_request(-varbindlist => [$snmp_iftype.$ref]);
97            if ( defined( $TYPE->{$snmp_iftype.$ref} ) ) {
98               $TYPE= $TYPE->{$snmp_iftype.$ref};
99               if ( $TYPE == 6 ) {
100                  $TYPE="ethernetCsmacd";
101               } elsif ( $TYPE ==  56 ) {
102                  $TYPE="fibreChannel";
103               }
104            }
105
106            $SPEED=$session->get_request(-varbindlist => [$snmp_ifspeed.$ref]);
107            if ( defined( $SPEED->{$snmp_ifspeed.$ref}) ) {
108               $SPEED=$SPEED->{$snmp_ifspeed.$ref};
109               if ( $SPEED / 1000000000000 >= 1 ) {
110                  $SPEED=$SPEED / 1000000000000;
111                  $SPEED=$SPEED." T";
112               } elsif ( $SPEED / 1000000000 >= 1 ) {
113                  $SPEED=$SPEED / 1000000000;
114                  $SPEED=$SPEED." G";
115               } elsif ( $SPEED / 1000000 >= 1 ) {
116                  $SPEED=$SPEED / 1000000;
117                  $SPEED=$SPEED." M";
118               }
119
120            }
121
122            $MACADDR=$session->get_request(-varbindlist => [$snmp_physAddr.$ref]);
123            if ( defined( $MACADDR->{$snmp_physAddr.$ref}) ) {
124               # For MACADDR, we need a translation beetween Hexa and string
125               $MACADDR=$MACADDR->{$snmp_physAddr.$ref};
126               #$MACADDR= sprintf "%02x:%02x:%02x:%02x:%02x:%02x" ,
127               #         map hex, split /\:/, $MACADDR->{$snmp_physAddr.$ref};
128            }
129
130            $STATUS=$session->get_request(-varbindlist => [ $snmp_ifadminstatus.$ref ]);
131            if ( $STATUS->{$snmp_ifadminstatus.$ref} == 1 ) {
132               $STATUS="Up";
133            } else {
134               $STATUS="Down";
135            }
136
137           # If we have the adress ip and netmask we can put it
138           if ( defined ( $address_index ) ) {
139              $IPADDR=$address_index->{$ref};
140              $IPMASK=$netmask_index->{$ref};
141           }
142           if ( defined ( $network_index ) ) {
143              $IPGATEWAY=$gateway_index->{$ref};
144              $IPSUBNET=$network_index->{$ref};
145           }
146
147           $common->addSnmpNetwork( {
148                TYPE      => $TYPE,
149                SLOT      => $SLOT,
150                SPEED     => $SPEED,
151                MACADDR   => $MACADDR,
152                STATUS    => $STATUS,
153                IPADDR    => $IPADDR,
154                IPMASK    => $IPMASK,
155                IPGATEWAY => $IPGATEWAY,
156                IPSUBNET  => $IPSUBNET,
157                });
158           $MACADDR=undef;
159           $SLOT=undef;
160           $STATUS=undef;
161           $TYPE=undef;
162           $SPEED=undef;
163           $IPADDR=undef;
164           $IPMASK=undef;
165           $IPGATEWAY=undef;
166           $IPSUBNET=undef;
167        }
168      }
169   } # End foreach result
170}
171
1721;
Note: See TracBrowser for help on using the repository browser.