1package Classes::Device; 2our @ISA = qw(Monitoring::GLPlugin::SNMP Monitoring::GLPlugin::UPNP); 3use strict; 4 5sub classify { 6 my ($self) = @_; 7 if (! ($self->opts->hostname || $self->opts->snmpwalk)) { 8 $self->add_unknown('either specify a hostname or a snmpwalk file'); 9 } else { 10 if ($self->opts->servertype && $self->opts->servertype eq 'linuxlocal') { 11 } elsif ($self->opts->servertype && $self->opts->servertype eq 'windowslocal') { 12 eval "require DBD::WMI"; 13 if ($@) { 14 $self->add_unknown("module DBD::WMI is not installed"); 15 } 16 } elsif ($self->opts->servertype && $self->opts->servertype eq 'solarislocal') { 17 eval "require Sun::Solaris::Kstat"; 18 if ($@) { 19 $self->add_unknown("module Sun::Solaris::Kstat is not installed"); 20 } 21 } elsif ($self->opts->port && $self->opts->port == 49000) { 22 $self->{productname} = 'upnp'; 23 $self->check_upnp_and_model(); 24 } else { 25 $self->{broken_snmp_agent} = [ 26 sub { 27 if ($self->implements_mib("UCD-SNMP-MIB")) { 28 $self->debug("this is a very, very dumb brick with just the UCD-SNMP-MIB"); 29 $self->{productname} = "generic_ucd"; 30 $self->{uptime} = $self->timeticks(100 * 3600); 31 my $sysobj = $self->get_snmp_object('MIB-2-MIB', 'sysObjectID', 0); 32 if (! $sysobj) { 33 $self->add_rawdata('1.3.6.1.2.1.1.2.0', "dearmanufactureryouareasdumbasyourpieceofcrap"); 34 $self->{sysobjectid} = "dearmanufactureryouareasdumbasyourpieceofcrap"; 35 } 36 return 1; 37 } 38 return 0; 39 }, 40 ]; 41 $self->check_snmp_and_model(); 42 } 43 if ($self->opts->servertype) { 44 $self->{productname} = $self->opts->servertype; 45 $self->{productname} = 'cisco' if $self->opts->servertype eq 'cisco'; 46 $self->{productname} = 'huawei' if $self->opts->servertype eq 'huawei'; 47 $self->{productname} = 'hh3c' if $self->opts->servertype eq 'hh3c'; 48 $self->{productname} = 'hp' if $self->opts->servertype eq 'hp'; 49 $self->{productname} = 'brocade' if $self->opts->servertype eq 'brocade'; 50 $self->{productname} = 'eltex' if $self->opts->servertype eq 'eltex'; 51 $self->{productname} = 'netscreen' if $self->opts->servertype eq 'netscreen'; 52 $self->{productname} = 'junos' if $self->opts->servertype eq 'junos'; 53 $self->{productname} = 'linuxlocal' if $self->opts->servertype eq 'linuxlocal'; 54 $self->{productname} = 'procurve' if $self->opts->servertype eq 'procurve'; 55 $self->{productname} = 'bluecoat' if $self->opts->servertype eq 'bluecoat'; 56 $self->{productname} = 'checkpoint' if $self->opts->servertype eq 'checkpoint'; 57 $self->{productname} = 'clavister' if $self->opts->servertype eq 'clavister'; 58 $self->{productname} = 'ifmib' if $self->opts->servertype eq 'ifmib'; 59 $self->{productname} = 'generic_hostresources' if $self->opts->servertype eq 'generic_hostresources'; 60 $self->{productname} = 'generic_ucd' if $self->opts->servertype eq 'generic_ucd'; 61 } 62 if ($self->opts->mode eq "uptime" && $self->opts->mode eq "short") { 63 return $self; 64 } elsif (! $self->check_messages()) { 65 $self->debug("I am a ".$self->{productname}."\n"); 66 if ($self->opts->mode =~ /^my-/) { 67 $self->load_my_extension(); 68 } elsif ($self->{productname} =~ /upnp/i) { 69 $self->rebless('Classes::UPNP'); 70 } elsif ($self->{productname} =~ /FRITZ/i) { 71 $self->rebless('Classes::UPNP::AVM'); 72 } elsif ($self->{productname} =~ /linuxlocal/i) { 73 $self->rebless('Server::LinuxLocal'); 74 } elsif ($self->{productname} =~ /windowslocal/i) { 75 $self->rebless('Server::WindowsLocal'); 76 } elsif ($self->{productname} =~ /solarislocal/i) { 77 $self->rebless('Server::SolarisLocal'); 78 } elsif ($self->{productname} =~ /Bluecat/i) { 79 $self->rebless('Classes::Bluecat'); 80 } elsif ($self->{productname} =~ /Cisco/i) { 81 $self->rebless('Classes::Cisco'); 82 } elsif ($self->{productname} =~ /fujitsu intelligent blade panel 30\/12/i) { 83 $self->rebless('Classes::Cisco'); 84 } elsif ($self->{productname} =~ /UCOS /i) { 85 $self->rebless('Classes::Cisco'); 86 } elsif ($self->{productname} =~ /Nortel/i) { 87 $self->rebless('Classes::Nortel'); 88 } elsif ($self->implements_mib('SYNOPTICS-ROOT-MIB')) { 89 $self->rebless('Classes::Nortel'); 90 } elsif ($self->{productname} =~ /AT-GS/i) { 91 $self->rebless('Classes::AlliedTelesyn'); 92 } elsif ($self->{productname} =~ /AT-\d+GB/i) { 93 $self->rebless('Classes::AlliedTelesyn'); 94 } elsif ($self->{productname} =~ /Allied Telesyn Ethernet Switch/i) { 95 $self->rebless('Classes::AlliedTelesyn'); 96 } elsif ($self->{productname} =~ /(Linux cumulus)|(Cumulus Linux)/i) { 97 $self->rebless('Classes::Cumulus'); 98 } elsif ($self->{productname} =~ /MES/i) { 99 $self->rebless('Classes::Eltex'); 100 } elsif ($self->{productname} =~ /DS_4100/i) { 101 $self->rebless('Classes::Brocade'); 102 } elsif ($self->{productname} =~ /Connectrix DS_4900B/i) { 103 $self->rebless('Classes::Brocade'); 104 } elsif ($self->{productname} =~ /EMC\s*DS.*4700M/i) { 105 $self->rebless('Classes::Brocade'); 106 } elsif ($self->{productname} =~ /EMC\s*DS-24M2/i) { 107 $self->rebless('Classes::Brocade'); 108 } elsif ($self->{productname} =~ /Brocade.*IronWare/i) { 109 # although there can be a 110 # Brocade Communications Systems, Inc. FWS648, IronWare Version 07.1.... 111 $self->rebless('Classes::Foundry'); 112 } elsif ($self->{productname} =~ /Brocade/i) { 113 $self->rebless('Classes::Brocade'); 114 } elsif ($self->{productname} =~ /Fibre Channel Switch/i) { 115 $self->rebless('Classes::Brocade'); 116 } elsif ($self->{productname} =~ /Pulse Secure.*LLC/i) { 117 # Pulse Secure,LLC,Pulse Policy Secure,IC-6500,5.2R7.1 (build 37645) 118 $self->rebless('Classes::PulseSecure::Gateway'); 119 } elsif ($self->{productname} =~ /Juniper.*MAG\-\d+/i) { 120 # Juniper Networks,Inc,MAG-4610,7.2R10 121 $self->rebless('Classes::Juniper'); 122 } elsif ($self->{productname} =~ /Juniper.*MAG\-SM\d+/i) { 123 # Juniper Networks,Inc,MAG-SMx60,7.4R8 124 $self->rebless('Classes::Juniper::IVE'); 125 } elsif ($self->implements_mib('JUNIPER-MIB') || $self->{productname} =~ /srx/i) { 126 $self->rebless('Classes::Juniper::SRX'); 127 } elsif ($self->{productname} =~ /NetScreen/i) { 128 $self->rebless('Classes::Juniper'); 129 } elsif ($self->{productname} =~ /JunOS/i) { 130 $self->rebless('Classes::Juniper'); 131 } elsif ($self->{productname} =~ /DrayTek.*Vigor/i) { 132 $self->rebless('Classes::DrayTek'); 133 } elsif ($self->implements_mib('NETGEAR-MIB')) { 134 $self->rebless('Classes::Netgear'); 135 } elsif ($self->{productname} =~ /^(GS|FS)/i) { 136 $self->rebless('Classes::Juniper'); 137 } elsif ($self->implements_mib('NETSCREEN-PRODUCTS-MIB')) { 138 $self->rebless('Classes::Juniper::NetScreen'); 139 } elsif ($self->implements_mib('PAN-PRODUCTS-MIB')) { 140 $self->rebless('Classes::PaloAlto'); 141 } elsif ($self->{productname} =~ /SecureOS/i) { 142 $self->rebless('Classes::SecureOS'); 143 } elsif ($self->{productname} =~ /Linux.*((el6.f5.x86_64)|(el5.1.0.f5app)) .*/i) { 144 $self->rebless('Classes::F5'); 145 } elsif ($self->{sysobjectid} =~ /1\.3\.6\.1\.4\.1\.3375\./) { 146 $self->rebless('Classes::F5'); 147 } elsif ($self->{productname} =~ /(H?H3C|HP Comware|HPE Comware)/i) { 148 $self->rebless('Classes::HH3C'); 149 } elsif ($self->{productname} =~ /(Huawei)/i) { 150 $self->rebless('Classes::Huawei'); 151 } elsif ($self->{sysobjectid} =~ /1\.3\.6\.1\.4\.1\.2011\.2\./) { 152 $self->rebless('Classes::Huawei'); 153 } elsif ($self->{productname} =~ /Procurve/i || 154 ($self->implements_mib('HP-ICF-CHASSIS') && 155 $self->implements_mib('NETSWITCH-MIB'))) { 156 $self->rebless('Classes::HP::Procurve'); 157 } elsif ($self->{productname} =~ /((cpx86_64)|(Check\s*Point)|(IPSO)|(Linux.*\dcp) )/i || $self->implements_mib('CHECKPOINT-MIB')) { 158 $self->rebless('Classes::CheckPoint'); 159 } elsif ($self->{productname} =~ /Clavister/i) { 160 $self->rebless('Classes::Clavister'); 161 } elsif ($self->{productname} =~ /Blue\s*Coat/i) { 162 $self->rebless('Classes::Bluecoat'); 163 } elsif ($self->{productname} =~ /Foundry/i) { 164 $self->rebless('Classes::Foundry'); 165 } elsif ($self->{productname} =~ /IronWare/i) { 166 # although there can be a 167 # Brocade Communications Systems, Inc. FWS648, IronWare Version 07.1.... 168 $self->rebless('Classes::Foundry'); 169 } elsif ($self->{productname} eq 'generic_hostresources') { 170 $self->rebless('Classes::HOSTRESOURCESMIB'); 171 } elsif ($self->{productname} eq 'generic_ucd') { 172 $self->rebless('Classes::UCDMIB'); 173 } elsif ($self->{productname} =~ /Linux Stingray/i) { 174 $self->rebless('Classes::HOSTRESOURCESMIB'); 175 } elsif ($self->{productname} =~ /Fortinet|Fortigate/i) { 176 $self->rebless('Classes::Fortigate'); 177 } elsif ($self->implements_mib('FORTINET-FORTIGATE-MIB')) { 178 $self->rebless('Classes::Fortigate'); 179 } elsif ($self->implements_mib('ALCATEL-IND1-BASE-MIB')) { 180 $self->rebless('Classes::Alcatel'); 181 } elsif ($self->implements_mib('ONEACCESS-SYS-MIB')) { 182 $self->rebless('Classes::OneOS'); 183 } elsif ($self->{productname} eq "ifmib") { 184 $self->rebless('Classes::Generic'); 185 } elsif ($self->implements_mib('SW-MIB')) { 186 $self->rebless('Classes::Brocade'); 187 } elsif ($self->{sysobjectid} =~ /1\.3\.6\.1\.4\.1\.9\./) { 188 $self->rebless('Classes::Cisco'); 189 } elsif ($self->{productname} =~ /Arista.*EOS.*/) { 190 $self->rebless('Classes::Arista'); 191 } elsif ($self->{sysobjectid} =~ /1\.3\.6\.1\.4\.1\.272\./) { 192 $self->rebless('Classes::Bintec::Bibo'); 193 } elsif ($self->implements_mib('STEELHEAD-MIB') || $self->implements_mib('STEELHEAD-EX-MIB')) { 194 $self->rebless('Classes::Riverbed'); 195 } elsif ($self->implements_mib('LCOS-MIB')) { 196 $self->rebless('Classes::Lancom'); 197 } elsif ($self->implements_mib('PHION-MIB') || 198 $self->{productname} =~ /Barracuda/) { 199 $self->rebless('Classes::Barracuda'); 200 } elsif ($self->implements_mib('VORMETRIC-MIB')) { 201 $self->rebless('Classes::Vormetric'); 202 } elsif ($self->implements_mib('ARUBAWIRED-CHASSIS-MIB')) { 203 $self->rebless('Classes::HP::Aruba'); 204 } elsif ($self->implements_mib('DEVICE-MIB') and $self->{productname} =~ /Versa Appliance/) { 205 $self->rebless('Classes::Versa'); 206 } elsif ($self->{productname} =~ /^Linux/i) { 207 $self->rebless('Classes::Server::Linux'); 208 } else { 209 $self->map_oid_to_class('1.3.6.1.4.1.12532.252.5.1', 210 'Classes::Juniper::IVE'); 211 $self->map_oid_to_class('1.3.6.1.4.1.9.1.1348', 212 'Classes::CiscoCCM'); 213 $self->map_oid_to_class('1.3.6.1.4.1.9.1.746', 214 'Classes::CiscoCCM'); 215 $self->map_oid_to_class('1.3.6.1.4.1.244.1.11', 216 'Classes::Lantronix::SLS'); 217 if (my $class = $self->discover_suitable_class()) { 218 $self->rebless($class); 219 } else { 220 $self->rebless('Classes::Generic'); 221 } 222 } 223 } 224 } 225 return $self; 226} 227 228 229package Classes::Generic; 230our @ISA = qw(Classes::Device); 231use strict; 232 233 234sub init { 235 my ($self) = @_; 236 if ($self->mode =~ /device::interfaces::aggregation::availability/) { 237 $self->analyze_and_check_aggregation_subsystem("Classes::IFMIB::Component::LinkAggregation"); 238 } elsif ($self->mode =~ /device::interfaces::ifstack/) { 239 $self->analyze_and_check_interface_subsystem("Classes::IFMIB::Component::StackSubsystem"); 240 } elsif ($self->mode =~ /device::interfaces/) { 241 $self->analyze_and_check_interface_subsystem("Classes::IFMIB::Component::InterfaceSubsystem"); 242 } elsif ($self->mode =~ /device::routes/) { 243 if ($self->implements_mib('IP-FORWARD-MIB')) { 244 $self->analyze_and_check_interface_subsystem("Classes::IPFORWARDMIB::Component::RoutingSubsystem"); 245 } else { 246 $self->analyze_and_check_interface_subsystem("Classes::IPMIB::Component::RoutingSubsystem"); 247 } 248 } elsif ($self->mode =~ /device::bgp/ && $self->{productname} !~ /JunOS/i) { 249 $self->analyze_and_check_bgp_subsystem("Classes::BGP::Component::PeerSubsystem"); 250 } elsif ($self->mode =~ /device::ospf/) { 251 $self->analyze_and_check_neighbor_subsystem("Classes::OSPF::Component::NeighborSubsystem"); 252 } elsif ($self->mode =~ /device::vrrp/) { 253 $self->analyze_and_check_vrrp_subsystem("Classes::VRRPMIB::Component::VRRPSubsystem"); 254 } else { 255 $self->rebless('Monitoring::GLPlugin::SNMP'); 256 $self->no_such_mode(); 257 } 258} 259