diff misc/list-clients.in @ 0:c7f6b056b673

First import of vendor version
author Peter Gervai <grin@grin.hu>
date Tue, 10 Mar 2009 13:49:58 +0100
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/misc/list-clients.in	Tue Mar 10 13:49:58 2009 +0100
@@ -0,0 +1,238 @@
+#! /bin/sh
+
+# generate periodic list of a DCC server's clients
+
+# This script should be run at midnight UTC, which is rarely midnight local
+#   time.
+# It prefers to generates a new HTML file based on an existing file, but
+#   will start from scratch if the output file does not already exist.
+
+#   -A		    all, not just anonymous clients
+#   -T		    do not tell dccd to clear its counters
+#   -I		    do not wrap the result with <HTML></HTML> etc. so that
+#			it can be server-side included into a web page
+#   -Z timezone	    in case dccd is far away
+#   -O cdcc-op	    something else to tell cdcc to do
+#   -d ndays	    keep this many days of snapshots instead of 7
+#   -n clients	    number of clients in each snapshot
+#   -s server	    host running dccd instead of localhost
+#   -i server-ID    DCC server-ID of the server
+#   -o ofile	    output file
+
+# Rhyolite Software DCC 1.3.103-1.30 $Revision$
+# @configure_input@
+
+DCC_HOMEDIR=@prefix@
+DEBUG=
+ARGS="xATIh:Z:O:d:n:s:p:i:o:"
+# check the args once to get the home directory to get server name and ID
+while getopts ":$ARGS" c; do
+    case $c in
+	x) set -x;;
+	h) DCC_HOMEDIR="$OPTARG";;
+	*) ;;
+    esac
+done
+if test -s $DCC_HOMEDIR/dcc_conf; then
+    . $DCC_HOMEDIR/dcc_conf
+fi
+
+CDCC=@bindir@/cdcc
+ALL=As
+CLEAR=clear
+INCLUDE=no
+OPS=
+NDAYS=7
+NCLIENTS=100
+TZ=UTC
+SERVER=localhost
+TITLE=`hostname`
+ID=$SRVR_ID
+PASSWD=
+OUT=
+USAGE="`basename $0`: [-xATI] [-Z timezone] [-O cdcc-op] [-d ndays] [-n nclients]
+    [-s server] [-p password] -i server-ID -o ofile"
+OPTIND=1
+while getopts "$ARGS" c; do
+    case $c in
+	x) set -x;;
+	A) ALL=;;
+	T) CLEAR=;;
+	I) INCLUDE=yes;;
+	h) ;;
+	Z) TZ=$OPTARG;;
+	O) OPS="$OPS$OPTARG; ";;
+	d) NDAYS="$OPTARG";;
+	n) NCLIENTS="$OPTARG";;
+	s) SERVER="$OPTARG"; TITLE="$OPTARG";;
+	p) PASSWD="; password $OPTARG";;
+	i) ID="$OPTARG";;
+	o) OUT="$OPTARG";;
+	*) echo "$USAGE" 1>&2; exit 1;;
+    esac
+done
+shift `expr $OPTIND - 1 || true`
+if test "$#" -ne 0; then
+    echo "$USAGE" 1>&2
+    exit 1
+fi
+
+# check that the ID is not 1
+if expr "$ID" - 1 >/dev/null 2>&1; then :
+else
+    echo "$USAGE" 1>&2
+    exit 1
+fi
+
+# we need an output file
+if test "$OUT" = ""; then
+    echo "use '-o ofile' to specify an output file" 1>&2
+    exit 1
+fi
+
+CMD="${OPS}server $SERVER; id $ID$PASSWD"
+
+NCLIENTS5=`expr $NCLIENTS + 5`
+
+export TZ
+
+set -e
+
+
+# prefer the target directory for temporary files
+OUTDIR=`dirname $OUT`
+if test -z "$OUTDIR" -o -w "$OUTDIR"; then
+    NEW=$OUT.new$$
+    TMP=$OUT.tmp$$
+else
+    NEW=/tmp/list-clients-new$$
+    TMP=/tmp/list-clients-tmp$$
+fi
+trap "set +e; /bin/rm -f $NEW $TMP; exit" 0 1 2 15
+
+
+# create or add to the HTML file
+makeout () {
+    if test -s $OUT; then
+	# start the new file with the head of the old file
+	sed -e '/<!--clients sample-->/,$d'			\
+	    -e '/<\/BODY>/,$d' -e '/<\/body>,$/d'		\
+	    -e '/<\/HTML>/,$d' -e '/<\/html>/,$d' $OUT >$NEW
+    else
+	# create a new ouptut file
+	if test "$INCLUDE" != yes; then
+	    cat >>$NEW <<EOF
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<HTML>
+<HEAD>
+    <TITLE>$TITLE Clients</TITLE>
+    <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
+</HEAD>
+
+<BODY>
+
+<H1>Recent $TITLE Clients</H1>
+<P>
+EOF
+	fi
+    fi
+
+    if test -z "$HEADING"; then
+	HEADING=`date`
+    fi
+
+    cat >>$NEW <<EOF
+<!--clients sample-->
+<H3>$HEADING</H3>
+<P>
+<PRE>
+EOF
+    if test -s $TMP; then
+	sed -e '1,/^  *server-ID/d' -e '/^$/d' -e '/^version/,$d' $TMP >>$NEW
+    else
+	echo "$*" >>$NEW
+    fi
+
+    cat >>$NEW <<EOF
+</PRE>
+
+EOF
+
+    # save a limited number samples from the old file
+    if test -s $OUT; then
+	IGNORECASE=1 awk '/<!--clients sample-->/{ ++nsample; }
+/<!--end clients samples-->/{ nsample = 1; }
+/<\/body>/{ nsample = 1; }
+/<\/html>/{ nsample = 1; }
+{ if (nsample < '$NDAYS' && nsample > 0) print $0;
+}' $OUT >>$NEW
+    else
+	echo '<!--end clients samples-->' >>$NEW
+    fi
+
+    if test "$INCLUDE" != yes; then
+	if grep -i '</body>' $NEW >/dev/null; then :
+	else
+	    echo '</BODY>' >>$NEW
+	fi
+	if grep -i '</html>' $NEW >/dev/null; then :
+	else
+	    echo '</HTML>' >>$NEW
+	fi
+    fi
+
+    cp -f $NEW $OUT
+
+    if test ! -s $TMP; then
+	echo "$*" 2>&1
+	exit 1
+    fi
+}
+
+
+
+
+
+# See if the server knows about client versions
+eval `$CDCC "$CMD; stats" 2>&1						\
+    | sed -n -e 's/^ *version [1-9]\.\([0-9]\{1,\}\)\.\([0-9]\{1,\}\) .*/VERS1=\1 VERS2=\2/p'\
+	-e 's/.*no working DCC server.*/VERS1=dead/p'`
+if test "$VERS1" = dead; then
+    makeout "$SERVER is not responding"
+fi
+if test -z "$VERS1" -o -z "$VERS2"; then
+    makeout "$SERVER of an unrecognized version"
+fi
+SVERS=`expr "${VERS1}000" + $VERS2`
+# dccd versions starting with *.3.32 answer `cdcc "clients -V"`
+#   Starting with 3.67, dccd understands `cdcc "clients -A"`
+if test "$SVERS" -ge 3032; then
+    if test "$SVERS" -ge 3067; then
+	COPTS="-V$ALL"
+    else
+	COPTS="-Vs"
+    fi
+else
+    COPTS="-s"
+fi
+
+# Prime reverse DNS resolution with a dummy run and then do it for real
+$CDCC "$CMD; clients $COPTS $NCLIENTS5" >/dev/null
+$CDCC "$CMD; clients $COPTS $NCLIENTS5" >$TMP
+
+if test ! -s $TMP; then
+    makeout "obtained no data from $SERVER"
+fi
+
+HEADING=`$CDCC "$CMD; stats $CLEAR"					\
+    | sed -n								\
+	-e '/clients since/h'						\
+	-e 's@.* \([0-9]\{1,\}\) clients since.*@\1 Clients@p'		\
+	-e 's@.* \([0-9]\{1,\}\) clients in.*@\1 Clients@p'		\
+	-e '/reports added between/{'					\
+	    -e x -e G							\
+	    -e 's@.*clients since \(.*\)\n.*\( and .*\)@between \1\2@p'	\
+	    -e 's@.*ween \([^.]*\)\.[0-9]*\(.*\)@between \1\2@p'	\
+	    -e '}'`
+
+makeout "missing $TMP"