diff options
author | Niko Tyni <ntyni@iki.fi> | 2005-02-13 20:23:04 +0100 |
---|---|---|
committer | Niko Tyni <ntyni@iki.fi> | 2005-02-13 20:23:04 +0100 |
commit | 6d76521656e91daa160bc8019828f1b68d7aa5dc (patch) | |
tree | aaa27615a0702942fa1606d9a5c89f0a3547467c /lib/Smokeping/probes/CiscoRTTMonDNS.pm | |
parent | 6dba1afbe4b475a7d34f5ef867b7b37291cd1484 (diff) | |
download | smokeping-6d76521656e91daa160bc8019828f1b68d7aa5dc.tar.gz smokeping-6d76521656e91daa160bc8019828f1b68d7aa5dc.tar.xz |
Moved probes, matchers and ciscoRttMonMIB modules to lib/Smokeping.
Diffstat (limited to 'lib/Smokeping/probes/CiscoRTTMonDNS.pm')
-rw-r--r-- | lib/Smokeping/probes/CiscoRTTMonDNS.pm | 294 |
1 files changed, 294 insertions, 0 deletions
diff --git a/lib/Smokeping/probes/CiscoRTTMonDNS.pm b/lib/Smokeping/probes/CiscoRTTMonDNS.pm new file mode 100644 index 0000000..0f16154 --- /dev/null +++ b/lib/Smokeping/probes/CiscoRTTMonDNS.pm @@ -0,0 +1,294 @@ +package Smokeping::probes::CiscoRTTMonDNS; + +=head1 301 Moved Permanently + +This is a Smokeping probe module. Please use the command + +C<smokeping -man Smokeping::probes::CiscoRTTMonDNS> + +to view the documentation or the command + +C<smokeping -makepod Smokeping::probes::CiscoRTTMonDNS> + +to generate the POD document. + +=cut + +use strict; +use base qw(Smokeping::probes::basefork); +use Symbol; +use Carp; +use BER; +use SNMP_Session; +use SNMP_util "0.97"; +use Smokeping::ciscoRttMonMIB "0.2"; + +my $e = "="; +sub pod_hash { + return { + name => <<DOC, +Smokeping::probes::CiscoRTTMonDNS.pm - Probe for SmokePing +DOC, + description => <<DOC, +A probe for smokeping, which uses the ciscoRttMon MIB functionality ("Service Assurance Agent", "SAA") of Cisco IOS to time ( recursive, type A) DNS queries to a DNS server. + +DOC + + notes => <<DOC, +${e}head2 host parameter + +The host parameter specifies the DNS server, which the router will use. + +${e}head2 IOS VERSIONS + +This probe only works with IOS 12.0(3)T or higher. It is recommended to test it on less critical routers first. + +${e}head2 INSTALLATION + +To install this probe copy ciscoRttMonMIB.pm to (\$SMOKEPINGINSTALLDIR)/lib/Smokeping and CiscoRTTMonDNS.pm to (\$SMOKEPINGINSTALLDIR)/lib/Smokeping/probes. + +The router(s) must be configured to allow read/write SNMP access. Sufficient is: + + snmp-server community RTTCommunity RW + +If you want to be a bit more restrictive with SNMP write access to the router, then consider configuring something like this + + access-list 2 permit 10.37.3.5 + snmp-server view RttMon ciscoRttMonMIB included + snmp-server community RTTCommunity view RttMon RW 2 + +The above configuration grants SNMP read-write only to 10.37.3.5 (the smokeping host) and only to the ciscoRttMon MIB tree. The probe does not need access to SNMP variables outside the RttMon tree. +DOC + bugs => <<DOC, +The probe does unnecessary DNS queries, i.e. more than configured in the "pings" variable, because the RTTMon MIB only allows to set a total time for all queries in one measurement run (one "life"). Currently the probe sets the life duration to "pings"*2+3 seconds (2 secs is the timeout value hardcoded into this probe). +DOC + see_also => <<DOC, +http://people.ee.ethz.ch/~oetiker/webtools/smokeping/ + +http://www.switch.ch/misc/leinen/snmp/perl/ + +The best source for background info on SAA is Cisco's documentation on http://www.cisco.com and the CISCO-RTTMON-MIB documentation, which is available at: + +ftp://ftp.cisco.com/pub/mibs/v2/CISCO-RTTMON-MIB.my +DOC + authors => <<DOC, +Joerg.Kummer at Roche.com +DOC + } +} + +my $pingtimeout =2; + +sub new($$$) +{ + my $proto = shift; + my $class = ref($proto) || $proto; + my $self = $class->SUPER::new(@_); + + # no need for this if we run as a cgi + unless ( $ENV{SERVER_SOFTWARE} ) { + $self->{pingfactor} = 1000; + }; + return $self; +} + +sub ProbeDesc($){ + my $self = shift; + return "CiscoRTTMonDNS.pm"; +} + +sub pingone ($$) { + my $self = shift; + my $target = shift; + + my $name = $target->{vars}{name}; + + my $pings = $self->pings($target) || 20; + + # use the proces ID as as row number to make this poll distinct on the router; + my $row=$$; + + if (defined + StartRttMibEcho($target->{vars}{ioshost}.":::::2", $target->{addr}, $name, + $pings, $target->{vars}{iosint}, $row)) + { + # wait for the series to finish + sleep ($pings*$pingtimeout+5); + if (my @times=FillTimesFromHistoryTable($target->{vars}{ioshost}.":::::2", $pings, $row)){ + DestroyData ($target->{vars}{ioshost}.":::::2", $row); + return @times; + } + else { + return(); + } + } + else { + return (); + } +} + +sub StartRttMibEcho ($$$$$$){ + my ($host, $target, $dnsName, $pings, $sourceip, $row) = @_; + + # resolve the target name and encode its IP address + $_=$target; + if (!/^([0-9]|\.)+/) { + (my $name, my $aliases, my $addrtype, my $length, my @addrs) = gethostbyname ($target); + $target=join('.',(unpack("C4",$addrs[0]))); + } + my @octets=split(/\./,$target); + my $encoded_target= pack ("CCCC", @octets); + + # resolve the source name and encode its IP address + my $encoded_source = undef; + if (defined $sourceip) { + $_=$sourceip; + if (!/^([0-9]|\.)+/) { + (my $name, my $aliases, my $addrtype, my $length, my @addrs) = gethostbyname ($sourceip); + $sourceip=join('.',(unpack("C4",$addrs[0]))); + } + my @octets=split(/\./,$sourceip); + $encoded_source= pack ("CCCC", @octets); + } + + ############################################################# + # rttMonCtrlAdminStatus - 1:active 2:notInService 3:notReady 4:createAndGo 5:createAndWait 6:destroy + #delete data from former measurements + #return undef unless defined + # &snmpset($host, "rttMonCtrlAdminStatus.$row",'integer', 6); + + ############################################################# + # Check RTTMon version and supported protocols + $SNMP_Session::suppress_warnings = 10; # be silent + (my $version)=&snmpget ($host, "rttMonApplVersion"); + if (! defined $version ) { + Smokeping::do_log ("$host doesn't support or allow RTTMon !\n"); + return undef; + } + Smokeping::do_log ("$host supports $version\n"); + $SNMP_Session::suppress_warnings = 0; # report errors + + # echo(1), pathEcho(2), fileIO(3), script(4), udpEcho(5), tcpConnect(6), http(7), + # dns(8), jitter(9), dlsw(10), dhcp(11), ftp(12) + + my $DnsSupported=0==1; + snmpmaptable ($host, + sub () { + my ($proto, $supported) = @_; + # 1 is true , 2 is false + $DnsSupported=0==0 if ($proto==8 && $supported==1); + }, + "rttMonApplSupportedRttTypesValid"); + + if (! $DnsSupported) { + Smokeping::do_log ("$host doesn't support DNS resolution time measurements !\n"); + return undef; + } + + + ############################################################# + #setup the new data row + + my @params=(); + push @params, + "rttMonCtrlAdminStatus.$row", 'integer', 5, + "rttMonCtrlAdminRttType.$row", 'integer', 8, + "rttMonEchoAdminProtocol.$row", 'integer', 26, + "rttMonEchoAdminNameServer.$row", 'octetstring', $encoded_target, + "rttMonEchoAdminTargetAddressString.$row",'octetstring', $dnsName, + "rttMonCtrlAdminTimeout.$row", 'integer', $pingtimeout*1000, + "rttMonCtrlAdminFrequency.$row", 'integer', $pingtimeout, + "rttMonCtrlAdminNvgen.$row", 'integer', 2, + "rttMonHistoryAdminNumBuckets.$row", 'integer', $pings, + "rttMonHistoryAdminNumLives.$row", 'integer', 1, + "rttMonHistoryAdminFilter.$row", 'integer', 2, + "rttMonScheduleAdminRttStartTime.$row", 'timeticks', 1, + "rttMonScheduleAdminRttLife.$row", 'integer', $pings*$pingtimeout+3, + "rttMonScheduleAdminConceptRowAgeout.$row",'integer', 60; + + # the router (or this script) doesn't check whether the IP address is one of + # the router's IP address, i.e. the router might send packets, but never + # gets replies.. + if (defined $sourceip) { + push @params, "rttMonEchoAdminSourceAddress.$row", 'octetstring', $encoded_source; + } + + return undef unless defined + &snmpset($host, @params); + + ############################################################# + # and go ! + return undef unless defined + &snmpset($host, "rttMonCtrlAdminStatus.$row",'integer',1); + + return 1; +} + + +# RttResponseSense values +# 1:ok 2:disconnected 3:overThreshold 4:timeout 5:busy 6:notConnected 7:dropped 8:sequenceError +# 9:verifyError 10:applicationSpecific 11:dnsServerTimeout 12:tcpConnectTimeout 13:httpTransactionTimeout +#14:dnsQueryError 15:httpError 16:error + +sub FillTimesFromHistoryTable($$$$) { + my ($host, $pings, $row) = @_; + my @times; + + # snmpmaptable walks two tables (of equal size) + # - "rttMonHistoryCollectionCompletionTime.$row", + # - "rttMonHistoryCollectionSense.$row" + # The code in the sub() argument is executed for each index value snmptable walks + + snmpmaptable ($host, + sub () { + my ($index, $rtt, $status) = @_; + push @times, (sprintf ("%.10e", $rtt/1000)) + if ($status==1); + }, + "rttMonHistoryCollectionCompletionTime.$row", + "rttMonHistoryCollectionSense.$row"); + + return sort { $a <=> $b } @times; +} + +sub DestroyData ($$) { + my ($host, $row) = @_; + + &snmpset($host, "rttMonCtrlOperState.$row", 'integer', 3); + &snmpset($host, "rttMonCtrlAdminStatus.$row", 'integer', 2); + #delete any old config + &snmpset($host, "rttMonCtrlAdminStatus.$row", 'integer', 6); +} + +sub targetvars { + my $class = shift; + return $class->_makevars($class->SUPER::targetvars, { + _mandatory => [ 'ioshost', 'name' ], + ioshost => { + _doc => <<DOC, +The (mandatory) ioshost parameter specifies the Cisco router, which will send the DNS requests, +as well as the SNMP community string on the router. +DOC + _example => 'RTTcommunity@Myrouter.foobar.com.au', + }, + name => { + _doc => "The (mandatory) name parameter is the DNS name to resolve.", + _example => 'www.foobar.com.au', + }, + iosint => { + _doc => <<DOC, +The (optional) iosint parameter is the source address for the DNS packets. +This should be one of the active (!) IP addresses of the router to get +results. IOS looks up the target host address in the forwarding table +and then uses the interface(s) listed there to send the DNS packets. By +default IOS uses the (primary) IP address on the sending interface as +source address for packets originated by the router. +DOC + _example => '10.33.22.11', + }, + }); +} + +=head1 +1; + |