#! /usr/bin
##  INNform.pl - Show status of our newsserver
##  1995 by Andre Schmidt - all rights reserved
##  21.02.95	0.01	Init
##  12.07	0.02	Clean up, inetd useable
##  21		0.03	Clean up for Perl5
$version="0.03";
##  Status: hack
##  Usage: run from your httpd as cgi or from inetd

require "ctime.pl";

##  uncomment the following line if cgi use only
#print `cgiutils -ct text/html -cl de -expires now`;

chop($host = `hostname`);
if ($host eq 'wburg') { # wburg is running NEXTSTEP 3.3
 $ENV{'PATH'} = "/usr/local/www/bin:/usr/local/www/cgi-bin:$ENV{'PATH'}";
 $NEWSSERVER = "wburg.hanse.de";
 $NEWSSPOOL = "/var/spool/news";
 $SPOOLMINFREE = "8000";
 $CTLINND = "/usr/g/news/bin/ctlinnd";
 $DFCMD = "df";
 $PSCMD = "ps auxww";
}
elsif ($host eq 'rzsun02') { # rzsun02 is running SunOS 4.1.3
 $ENV{'PATH'} = "/usr/g/www/bin:/usr/local/www/cgi-bin:$ENV{'PATH'}";
 $NEWSSERVER = "news.uni-hamburg.de";
 $NEWSSPOOL = "/var/spool/news";
 $SPOOLMINFREE = "8000";
 $CTLINND = "/usr/g/news/bin/ctlinnd";
 $DFCMD = "df";
 $PSCMD = "ps auxww";
}
elsif ($host eq 'rzsun01') { # rzsun01 is running Solaris 2.4
 $ENV{'PATH'} = "/usr/g/www/bin:/usr/local/www/cgi-bin:$ENV{'PATH'}";
 $NEWSSERVER = "rzsun01.uni-hamburg.de";
 $NEWSSPOOL = "/var/spool/news";
 $SPOOLMINFREE = "8000";
 $CTLINND = "/opt/news/bin/ctlinnd";
 $DFCMD = "df";
 $PSCMD = "ps -elf";
}

($program = $0) =~ s%.*/%%;
($dow, $mon, $day, $time, $year) = split(" ", &ctime(time));

# Estimated INN output:
# Server running
# Allowing remote connections
# Parameters c 14 i 0 (0) l 0 o 243 t 300 normal specified
# Not reserved
# Readers separate enabled
@status = `$CTLINND mode` if (-x $CTLINND);
# Estimated df output:
# Filesystem            kbytes    used   avail capacity  Mounted on
# /dev/sd3a             197278  139751   37799    79%    /private/spool
@df = `$DFCMD $NEWSSPOOL`;

&zap;

if (@status) {
    chop($sserver = @status[0]);
    chop($sremote = @status[1]);
    chop($sparameters = @status[2]);
    chop($sreserved = @status[3]);
    chop($sreaders = @status[4]); }
else {
    $sserver = "not available"; }
if (@df) {
    ($dev,$sum,$used,$avail,$cap,$mount) = split (" ",@df[1]); }
else {
    $avail = "$SPOOLMINFREE"; }
&output;

exit 0;

sub output {
print(	"<HTML><HEAD><TITLE>$program: $NEWSSERVER</TITLE></HEAD>\n",
	"<BODY><H1> Status of $NEWSSERVER </H1>\n");
print (	"<HR><H3>Generall Information:</H3>\n",
	   "<B>Local time:</B> $day.$mon.$year $time<br>\n",
	"<HR><H3>Information From INND:</H3>\n",
	   "<B>Server-status:</B> $sserver<br>\n",
	   "<B>Remote-status:</B> $sremote<br>\n",
	   "<B>Parameters:</B> $sparameters<br>\n",
	   "<B>Reserved-status:</B> $sreserved<br>\n",
	   "<B>Reader-status:</B> $sreaders<br>\n",
	"<HR><H3>Disk Usage Information:</H3>\n",
	   "<B>Free space in spool:</B> ",$avail-$SPOOLMINFREE," kb<br>\n",
	"<HR><H3>Process Information</H3>\n",
	   "<B>Number of clients:</B> $reader<br>\n",
	   "<B>Number of server connections:</B> $nntplink<br>\n",
	   "<B>Total number of news processes:</B> $news<br>\n",
	"<HR><H3>Memory Usage:</H3>\n",
	  "<H5>Virtual Memory:</H5>\n",
	   "<B>Clients:</B> $vreader kb<br>\n",
	   "<B>Server:</B> $vnntplink kb<br>\n",
	   "<B>INND:</B> $vinnd kb<br>\n",
	   "<B>Total news memory usage:</B> $vnews kb<br>\n",
	  "<H5>Real Memory:</H5>\n",
	   "<B>Clients:</B> $rreader kb<br>\n",
	   "<B>Server:</B> $rnntplink kb<br>\n",
	   "<B>INND:</B> $rinnd kb<br>\n",
	   "<B>Total news memory usage:</B> $rnews kb<br>\n",
	"<HR><ADDRESS>INNstatus $version<br>21.Jul.95/",
	"<A HREF=\"http://rznext01.rrz.uni-hamburg.de/~schmidt/\">",
	"Andr&eacute\; Schmidt</A></ADDRESS></BODY></HTML>\n");
}

sub zap {
  $reader = $vreader = $rreader = 0;
  $nntplink = $vnntplink = $rnntplink = 0;
  $innd = $vinnd = $rinnd = 0;
  $news = $vnews = $rnews = 0;
  open(PS, "$PSCMD|") || die "can't run $PSCMD: $!";
  $cand = <PS>; #Header

  while ($cand = <PS>) {
    chop($cand);
    local($user, $pid, $cpu, $mem, $vsize, $rsize, $tt, $stat, $time) = split(' ', $cand);
    next if $pid == $$;
    if ($cand =~ s/.*in.nnrpd.*//) {
	$reader++;
	$vreader += &conv($vsize);
	$rreader += &conv($rsize);
    }
    if ($cand =~ s/.*nntplink.*//) {
	$nntplink++;
	$vnntplink += &conv($vsize);
	$rnntplink += &conv($rsize);
    }
    if ($cand =~ s/.*innd.*//) {
	$innd++;
	$vinnd += &conv($vsize);
	$rinnd += &conv($rsize);
    }
    if ($user eq "news") {
	$news++;
	$vnews += &conv($vsize);
	$rnews += &conv($rsize);
    }
  }
  close PS;
}

sub conv {
	local($insize) = @_;
	(($outsize = $insize) =~ s/([0-9.]+)[K|M]$/$1/) ;
	($m, $k) = split('.', $outsize);
	if ($outsize < "10") {
	    $outsize *= 1000 ;#if (/[0-9]*[.][0-9]*/);
	}
	$outsize;
}
