# -*- perl -*- use strict; package CHIRP::Identify; use lib "/usr/local/cricket/lib"; use snmpUtils; use lib::Parse; use lib::Lowercase; my($snmpCache) = {}; sub Identify { my($hostname, $community, $snmp_port, $idfile) = @_; $community = 'public' unless defined($community); $snmp_port = '161' unless defined($snmp_port); $idfile = "id.cfg" unless defined($idfile); my($snmp) = "$community\@$hostname:$snmp_port"; my($snmp_cache) = {}; my($config) = {}; my($deviceTable) = {}; CHIRP::Parse::GenConfig(\$config, $idfile); CHIRP::Lowercase::LowercaseConfig(\$config); $deviceTable->{vendor} = "Unknown"; $deviceTable->{model} = "Unknown"; $deviceTable->{module} = "lib::Unknown::Unknown"; $deviceTable->{package} = "CHIRP::Unknown::Unknown"; $deviceTable->{options} = ""; if(defined($config->{"device"}->{"--default--"})) { foreach my $key (keys % {$config->{"device"}->{"--default--"}}) { $deviceTable->{$key} = $config->{"device"}->{"--default--"}->{$key}; $deviceTable->{$key} =~ s/^"//; $deviceTable->{$key} =~ s/"$//; } } my($saveDeviceTable) = $deviceTable; my(@order) = (); if(defined($config->{"device"}->{"--order--"})) { @order = split(/\s*,\s*/, $config->{"device"}->{"--order--"}); } foreach my $device (@order) { next if($device =~ /--default--/); my($tmpDeviceTable) = $saveDeviceTable; foreach my $tag (keys % {$config->{"device"}->{$device}}) { $tmpDeviceTable->{$tag} = $config->{"device"}->{$device}->{$tag}; $tmpDeviceTable->{$tag} =~ s/^"//; $tmpDeviceTable->{$tag} =~ s/"$//; } my(@tags) = (); if(defined($tmpDeviceTable->{match})) { @tags = split(/\s*\&\s*/, $tmpDeviceTable->{"match"}); } my($success) = 1; foreach my $tag (@tags) { if(defined($tmpDeviceTable->{lc($tag)})) { if(!Match(\$config, $device, $hostname, $community, $snmp_port, $tmpDeviceTable->{lc($tag)})) { $success = 0; last; } } else { print STDERR "WARNING: Device \"$device\" references missing tag: >$tag<\n"; $success = 0; last; } } if($success == 1) { $deviceTable = $tmpDeviceTable; last; } } if(!defined($deviceTable->{vendor})) { $deviceTable->{vendor} = "Unknown"; } if(!defined($deviceTable->{model})) { $deviceTable->{model} = "Unknown"; } if(!defined($deviceTable->{module})) { $deviceTable->{module} = "lib::Unknown::Unknown"; } if(!defined($deviceTable->{package})) { $deviceTable->{package} = "CHIRP::Unknown::Unknown"; } if(!defined($deviceTable->{options})) { $deviceTable->{options} = ""; } return $deviceTable; } sub Match { my($config, $device, $hostname, $community, $snmp_port, $match) = @_; my($snmpValue); if($match =~ /^snmp:\/\//) { $match =~ s/%snmp-host%/$hostname/i; $match =~ s/%snmp-community%/$community/i; $match =~ s/%snmp-port%/$snmp_port/i; $match =~ s/%snmp%/$community\@$hostname:$snmp_port/i; my($snmp, $value) = split(/\s*=\s*/, $match); my($oid) = $snmp =~ /\/([^\/]*)$/; $snmp =~ s/snmp:\/\///; $snmp =~ s/\/[^\/]*$//; if($oid !~ /^[0-9\.]*$/) { $oid = $$config->{"oid"}->{lc($oid)}; } if(!defined($oid)) { print STDERR "ERROR: Device \"$device\" has an invalid match tag: >$match<\n"; } elsif (defined($snmpCache->{lc($oid)})) { $snmpValue = $snmpCache->{lc($oid)}; } else { ($snmpValue) = snmpUtils::get($snmp, $oid); if(defined($snmpValue)) { $snmpCache->{lc($oid)} = $snmpValue; } else { $snmpCache->{lc($oid)} = ""; } } if(defined($snmpValue)) { if($snmpValue =~ /$value/) { return 1; } } else { print STDERR "WARNING: Unable to retrieve oid >$oid< from $hostname\n"; } } else { print STDERR "ERROR: Device \"$device\" has an invalid match tag: >$match<\n"; } return 0; } 1;