+#!/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;
+}
+