#!/afs/net/tools/@sys/perl # # named_stats --- collect statistics for the MIT nameservers. # # This program connects to a pre-arranged port on four hosts and dumps the # name daemon statistics in a nice tabular form. This program has been # written for MIT. You will need to change things to make them work for # your site. # # Written by Theodore Ts'o, Copyright 1991. # # Use this code however you want, as long as you don't try to make # money off of it and as long as you don't claim it's yours. # # # Change this to be whatever port number you assign in /etc/services # $default_nstats_port = XXXXX; # # Change this to be the list of hosts that you're interested in. # @hosts = ("bitsy.mit.edu", "strawb.mit.edu", "w20ns.mit.edu", "lithium.lcs.mit.edu"); @querytypes = ("A", "NS", "MD", "MF", "CNAME", "SOA", "MB", "MG", "MR", "NULL", "WKS", "PTR", "HINFO", "MINFO", "MX", "TXT", "UINFO", "UID", "GID", "UNSPEC", "UNSPECA", "AXFR", "MAILB", "MAILA", "ANY"); $boottime = "time since boot (secs)"; ($name, $aliases, $nstats_port) = getservbyname("nstats", 'tcp'); if (!$nstats_port) { $nstats_port = $default_nstats_port; } grep(s/$/ queries/, @querytypes); foreach $query (@querytypes) { $added{$query} = 1; } foreach $host (@hosts) { ($hostname = $host) =~ s/\..*//; push(@hostnames, $hostname); ($name, $aliases, $type, $len, $thisaddr) = gethostbyname($host); $port = $nstats_port; &mkport($thisaddr,$port); $dateline = <SERVER>; $dateline =~ s/###//; printf("%8-s:%s", $hostname,$dateline); while (<SERVER>) { chop; ($num, $var) = /([0-9]+)\s+(.*)/; $data{$hostname, $var} = $num; $total{$var} += $num; $seen{$var} = 1; if (!$added{$var}) { $added{$var} = 1; push(@varnames, $var); } } } print "\n"; printf("%25-s", ""); foreach $host (@hostnames) { printf("%10s", $host); } printf("%10s", "TOTAL"); print "\n"; foreach $var (@varnames,@querytypes) { if ((!$seen{$var}) || ($total{$var} == 0)) { next; } printf("%25-s", $var); foreach $host (@hostnames) { $num = $data{$host, $var}; printf("%10d", $num); } # # Totals don't make sense for some stats # if ($var =~ /^time since/) { print "\n"; next; } printf("%10s", $total{$var}); print "\n"; } # # End of main program, subroutines begin here # sub mkport { $port = $_[1]; $saddr = $_[0]; # print "$saddr,$port\n"; $sockaddr = 'S n a4 x8'; $sin = pack($sockaddr, 2, $port, $saddr); socket(SERVER, 2, 1, 0) || ((print "socket:$!\n"), return $FAIL); # setsockopt(SERVER,&SOL_SOCKET,&SO_KEEPALIVE,1) # || (print "Server setsockopt failed\n"); connect(SERVER, $sin) || ((print "connect:$!\n"), return $FAIL); $sockname = getsockname(SERVER) || ((print "getsockname:$!\n"), return $FAIL); ($family, $port, $addr) = unpack($sockaddr, $sockname); @addr = unpack("CCCC", $addr); # select(SERVER); $| = 1; select(STDOUT); $| = 1; $connecting = 1; }