[news.admin] arbitron bug fixes

news@becker.UUCP (UseNet News) (06/08/89)

The arbitron program for reporting news readership has a
couple of small bugs in it which
	
	1). cause it to fail under "ksh"
	2). excludes newsgroup hierarchies like
	    "unix-pc" & "u3b" from the report.

I have included a shar file below of the revised
version of arbitron. I've given a copy of this to the
original author who will test it & make an official
release later this summer, he tells me.

 --------- 8< --------- 8< --------- 8< --------- 8< --------- 8< ---------

#! /bin/sh
# This is a shell archive.  Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file".  To overwrite existing
# files, type "sh file -c".  You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g..  If this archive is complete, you
# will see the following message at the end:
#		"End of shell archive."
# Contents:  arbitron
# Wrapped by news@becker on Wed Jun  7 19:05:02 1989
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f arbitron -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"arbitron\"
else
echo shar: Extracting \"arbitron\" \(7928 characters\)
sed "s/^X//" >arbitron <<'END_OF_arbitron'
X#! /bin/sh
X# @(#)arbitron	2.4.3	Mon Jun  5 05:03:55 EDT 1989
X# arbitron -- this program produces rating sweeps for USENET.
X#
X# Usage: arbitron
X#
X# To use this program, edit the "configuration" section below so that the
X# information is correct for your site, and then run it. It will produce a
X# readership survey for your machine and mail that survey to decwrl.dec.com,
X# with a cc to you.
X#
X# To participate in the international monthly ratings sweeps, 
X# run "arbitron" every month. I will run the statistics program on the first
X# day of each month; it will include any report that has reached it by that
X# time. To make sure your site's data is included, run the survey program no
X# later than the 20th day of each month.
X#
X# Brian Reid, DEC Western Research Lab, reid@decwrl.dec.com
X# Updated and bugfixed by 
X#	Spencer Thomas, U.of Utah
X#	Geoff Kuenning, SAH Consulting
X# Updated to work with 2.10.1 and older news systems by
X#	Lindsay Cleveland, AT&T Technologies/Bell Labs
X# Made to work with 16-bit address spaces by
X#	Andy Walker, Maths Dept., University of Nottingham, UK
X# Nagging Bourne shell bug fixed by
X#	Tom Donahue, Rabbit Software Corp
X# Newsgroup inclusion bug fix by
X#	Bruce Becker, G.T.S.
X#
X# Note that the results of this program are dependent on the rate at which
X# you expire news.  If you are a small site that expires news rapidly, the
X# results may indicate fewer active readers than you actually have.
X#
X###########################################################################
X# Configuration information. Edit this section to reflect your site data. #
XTMPDIR=/tmp
XNEWS=/usr/lib/news
XSPOOL=/usr/spool/news
X
X# Make a crude stab at determining the system type. If your installation has
X# only one type of system, you can edit out the "if" statement and just turn
X# this into an assignment statement of the correct value.
Xif [ -d /usr/ucb ]; then
X	STYPE="bsd"
Xelse
X	STYPE="usg"
Xfi
X
X# Range of /etc/passwd UID's that represent actual people (rather than
X# maintenance accounts or daemons or whatever)
XlowUID=100
XhighUID=9999
X
X# If you aren't running a distributed news system (nntpd & rrn, usually),
X# leave NEWSHOST blank. Else set it to the name of the host from which you
X# can rcp a copy of the active file.
XNEWSHOST=
X
X# uucp path: {sun, hplabs, pyramid, decvax, ucbvax}!decwrl!netsurvey
Xsummarypath="netsurvey@decwrl.dec.com $USER"
X
X
X# We need to find the uucp name of your host. If this code doesn't work,
X# then just put it in literally like this:
X#	hostname="ihnp4"
X
Xcase $STYPE in
X	bsd)	cmd='hostname || uuname -l';;
X	sysv)	cmd='uname -n || uuname -l || hostname';;
X	*)	cmd='uuname -l';;
Xesac
X
Xhostname=`sh -c "$cmd" 2>&-`
X
XPATH=$NEWS:/usr/local/bin:/usr/ucb:/usr/bin:/bin
X############################################################################
Xexport PATH
X# ---------------------------------------------------------------------------
Xtrap "rm -f $TMPDIR/arb.*.$$; exit" 0 1 2 3 15
Xset `date`
Xdat="$2$6"
Xdestination="${MAILER-mail} $summarypath"
X
X################################
X# Here are several expressions, each of which figures out approximately how
X# many people use this machine. Comment out all but 1 of them; pick the one
X# you like best. Initially the most universal but least reliable of them is
X# uncommented.
X# # ###### Scheme #1: fast but usually returns too big a number
Xnusers=`awk -F: '
XBEGIN { N = 0 }
X$3 >= '"$lowUID"' && $3 <= '"$highUID"' { N = N + 1 }
XEND { print N }' </etc/passwd`
X
X# # ###### Scheme #2 (works with BSD systems)
X#nusers=`last | sort -u +0 -1 | wc -l`
X
X# # ###### Scheme #3 (works with USG systems)
X#nusers=`who /etc/wtmp | sort -u +0 -1 | wc -l`
X
X################################
X#
X# Set up awk scripts;  these are too large to pass as arguments on most
X# systems.
X#
X# This awk script generates the actual output report.
X# We use 'sed' to substitute in the shell variables to save ourselves
X# endless hassle trying to find quoting/backslashing problems.
X#
X# The input to this script consists of two types of lines (pre-sorted):
X#
X#	(1) Active-file lines.  These have four fields:  newsgroup name,
X#	    first existing article, last article number, 'y' or 'n'
X#	    to allow/disallow posting.
X#			mod.mac 00001 00001 y
X#
X#	(2) .newsrc-derived lines.  These have three fields:  the newsgroup
X#	    name, the user name and the articles-read information.  The latter
X#	    can be arbitrarily complex.  It can also be arbitrarily long;
X#	    this can potentially break either awk or sed, in which
X#	    case the script will not work.
X#			mod.map joe 1-199
X#
X#	The script uses the type 1 lines to define the newsgroups
X#	and their active article ranges.  The .newsrc (type 2) lines are
X#	then used to deduce which users are reading that group (a group
X#	is being read if the last article seen is in that group's active
X#	article range).
X#
Xsed    "/^#/d
X	s/NUSERS/$nusers/g
X	s/HOSTNAME/$hostname/g
X	s/DATE/$dat/g" > $TMPDIR/arb.fmt.$$ << 'DOG'
X# makereport -- utility for "arbitron". Early versions were copied from a
X# similar script distributed with "subscribers.sh" by Blonder, McCreery, and
X# Herron.
X#
XBEGIN	{
X	rdrcount  = 0
X	grpcount  = 0
X	realusers = 0
X}
X#
X# Active file line:  dispose of previous group (if any), record group, and
X# record first and last article numbers.  Set group's reader count to none.
XNF == 4 {
X	if (grpname != "") {
X		printf("%d %s\n", grpcount, grpname)
X	}
X	grpname  = $1
X	grpfirst = $3
X	grplast  = $2
X	grpcount = 0
X}
X#
X# .newsrc line.  Break out the final number, which is the last article that
X# has actually been read.  This is a pretty good indicator of the person's
X# true interest in the group.  If 'lastread' for the group is a current
X# (unexpired) article, record a reader for that group.  Finally, record
X# the user as a "real" user of the news system.
X#
XNF == 3 {
X	if ($1 != grpname) next;
X	n1 = split($3, n2, "-")
X	n3 = split(n2[n1], n4, ",")
X	lastread = n4[n3]
X	if ((grpfirst != grplast) && (lastread >= grpfirst) && \
X		(lastread <= grplast)) {
X		grpcount++
X		if (realuser[$2] != 1) {
X		    realuser[$2] = 1
X		    realusers++
X		}
X	}
X}
X#
X# End of file.  Print the report in 2 columns.
XEND	{
X	# For reorganized network, report a group even if nobody reads it.
X	# This will help us keep track of where the groups propagate.
X	if (grpname != "") {
X		printf("%d %s\n", grpcount, grpname)
X	}
X	printf("9999 Host\t\t%s\n", "HOSTNAME")
X	printf("9998 Users\t\t%d\n", NUSERS)
X	printf("9997 NetReaders\t%d\n", realusers)
X	printf("9996 ReportDate\t%s\n", "DATE")
X	printf("9995 SystemType\tnews-arbitron-2.4.3\n")
X}
XDOG
X
Xcat >$TMPDIR/arb.pwd.$$ <<'MOUSE'
XBEGIN	{
X	seen["/"] = 1
X	seen[""]  = 1
X}
X{
X	if (seen[$6] != 1)	{
X		printf("if [ -r %s/.newsrc ] ; then ", $6)
X		printf("sed -n '/: [0-9]/s/:/ %s/p' <%s/.newsrc; fi\n", $1, $6)
X		seen[$6] = 1
X	}
X}
XMOUSE
X
X# First, make sure we have an active file
Xif [ -z "$NEWSHOST" ]; then
X	ACTIVE=$NEWS/active
Xelse
X	ACTIVE=/tmp/arb.active.$$
X	rcp $NEWSHOST:$NEWS/active $ACTIVE
Xfi
X
Xif [ ! -s $ACTIVE ]; then
X	echo arbitron: ACTIVE file missing or empty. Cannot continue.
X	exit 1
Xfi
X
X# Next, get the list of .newsrc files with duplicates and unreadable files
X# removed.
Xawk -F: -f $TMPDIR/arb.pwd.$$ </etc/passwd | sh >$TMPDIR/arb.tmp.$$
X
X# Check to make sure that we found some
Xif [ -s $TMPDIR/arb.tmp.$$ ]; then
X	# See if "active" file has 4 fields or only two (pre-2.10.2)
X	set `sed 1q < $ACTIVE`
X	if [ $# -eq 2 ]; then
X		egrep  '^[a-z][-a-z0-9_]*\.' $ACTIVE |
X		while read group last; do
X			dir=`echo "$group" | sed 's;\.;/;g'`
X			first=`ls $SPOOL/$dir | grep '^[0-9]*' | sort -n | sed 1q`
X			case $STYPE in
X				usg)	echo "$group $last ${first:-$last} X";;
X		  		*)	echo "$group $last ${first-$last} X";;
X		   	esac
X		done
X	else
X		egrep '^[a-z][-a-z0-9_]*\.' $ACTIVE
X	fi |
X	sort - $TMPDIR/arb.tmp.$$ |
X	awk -f $TMPDIR/arb.fmt.$$ |
X	sort -nr |
X	sed    '/^$/d
X		/^[0-9]* to\./d
X		s/^999[0-9] //' |
X	$destination
Xelse
X	echo Unable to find any readable .newsrc files 2>&1
X	exit 1
Xfi
END_OF_arbitron
if test 7928 -ne `wc -c <arbitron`; then
    echo shar: \"arbitron\" unpacked with wrong size!
fi
chmod +x arbitron
# end of overwriting check
fi
echo shar: End of shell archive.
exit 0

 --------- 8< --------- 8< --------- 8< --------- 8< --------- 8< ---------

Cheers,
-- 
Bruce Becker	Toronto, Ont.
Internet: news@becker.UUCP	UUCP: ...!uunet!mnetor!becker!news
"'Comefrom' considered useful" - the Anti-Dijkstra