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