uuhosts: extract and display mod.map.all

John Quarterman jsq at ut-sally.UUCP
Mon Dec 17 08:47:37 AEST 1984


: This is a shar archive.  Extract with sh, not csh.
echo x - README
sed -e 's/^X//' > README << '!Funky!Stuff!'
XThis is the source directory for uuhosts, which may be used to
Xautomatically collect map information from mod.map.all and also
Xto display it to the users.
X
XUnlike the version I posted some time back, this one doesn't have
Xsecurity problems with extracting things from mod.map.all, and it
Xcan also display UUCP mail paths and USENET map entries faster.
!Funky!Stuff!
echo x - Makefile
sed -e 's/^X//' > Makefile << '!Funky!Stuff!'
XSHELL=/bin/sh
X
X# nmail.paths is found in this directory
XLIB=/usr/local/lib
X# Most of the news parameter files and mapsh are in this directory.
XNEWS=$(LIB)/news
X# The maps from mod.map.all are under this directory.
XMAPS=$(NEWS)/maps
X
XSOURCES=uuhosts.sh mapsh.c uucp.from.news.sh
XALL=uuhosts mapsh uucp.from.news
X
Xall: $(ALL)
X
Xuuhosts: uuhosts.sh
X	sed -e \
X's%^LIB=.*$$%LIB=$(LIB)%;s%^NEWS=.*$$%NEWS=$(NEWS)%;s%^MAPS=.*$$%MAPS=$(MAPS)%'\
X uuhosts.sh > uuhosts
X
Xmapsh: mapsh.c
X	$(CC) -o mapsh -DMAPS=\"$(MAPS)\" mapsh.c
X
Xuucp.from.news: uucp.from.news.sh
X	sed -e \
X's%^LIB=.*$$%LIB=$(LIB)%;s%^NEWS=.*$$%NEWS=$(NEWS)%;s%^MAPS=.*$$%MAPS=$(MAPS)%'\
X uucp.from.news.sh > uucp.from.news
X
Xinstall: mapsh
X	cp uuhosts /usr/local/uuhosts
X	rm $(NEWS)/mapsh
X	cp mapsh $(NEWS)/mapsh
X	strip $(NEWS)/mapsh
X	chown root $(NEWS)/mapsh
X	chgrp news $(NEWS)/mapsh
X	chmod 4550 $(NEWS)/mapsh
X	ls -lg $(NEWS)/mapsh
X
Xclean:
X	rm -f $(ALL)
X	rm -f *.o
X	rm -f *.shar
X
Xshar:
X	shar README Makefile $(SOURCES) > uuhosts.shar
!Funky!Stuff!
echo x - uuhosts.sh
sed -e 's/^X//' > uuhosts.sh << '!Funky!Stuff!'
X#!/bin/sh
X# '@(#) uuhosts.sh 1.39 84/12/15'
X
X# PATH will have to be adjusted for non-BSD systems.
XPATH=/usr/local:/usr/ucb:/bin:/usr/bin
XLIB=/usr/local/lib
XNEWS=$LIB/news
XMAPS=$NEWS/maps
XNEWSMAPGROUP=mod.map.news
XUUCPMAPGROUP=mod.map.uucp
XNEWSMAP=$NEWSMAPGROUP
XUUCPMAP=$UUCPMAPGROUP
XMAPSH=$NEWS/mapsh
X
X# Routing information produced by pathalias.
Xpaths=$LIB/nmail.paths
X
X# The directories $MAPS/$NEWSMAP and $MAPS/$UUCPMAP contain the map information
X# extracted from the newsgroups mod.map.news (for the USENET news map)
X# and mod.map.uucp (for the UUCP mail map).  The extraction is done by
X# a line in $NEWS/sys like this:
X
X# maps:mod.map.news,mod.map.mail:B:/usr/local/uuhosts -x
X
X# Locally-known USENET news map information should go in $MAPS/$NEWSMAP/Local.
X
X# $MAPSH is needed, to use the chroot(2) system call to limit
X# what can be done when executing a shell with a news article as input.
X# $MAPS, $MAPS/bin and $MAPS/bin/* must be unwritable by anyone:
X
X# $MAPS: total 16
X# dr-xr-xr-x  6 root     news          512 Nov 11 16:42 .
X# drwxrwxr-x 19 news     news         1024 Nov 11 16:45 ..
X# dr-xr-xr-x  2 root     news          512 Nov 11 16:39 bin
X# drwxrwxr-x  2 news     news         2048 Nov 11 16:42 mod.map.news
X# drwxrwxr-x  2 news     news        10240 Nov 11 16:39 mod.map.uucp
X# drwxrwxrwx  2 news     news           24 Nov 11 16:41 tmp
X
X# $MAPS/bin: total 59
X# -r-xr-xr-x  1 root     news        10240 Nov 11 15:29 cat
X# -r-xr-xr-x  1 root     news         4096 Nov 11 16:33 echo
X# -r-xr-xr-x  1 root     news        18432 Nov 11 15:29 sed
X# -r-xr-xr-x  1 root     news        27648 Nov 11 15:29 sh
X
X# Update notices are mailed to postmaster (for UUCP) and usenet (for news),
X# which should be aliases which redistribute to the local mail and news
X# (respectively) administrators.
X
Xcd $NEWS
X
Xcase $1 in
X	-x)
X		# extract a new map piece into a map directory
X		temphead=/tmp/maphead.$$
X		temptext=/tmp/maptext.$$
X		tempcomm=/tmp/mapcomm.$$
X		cp /dev/null $temphead
X		cp /dev/null $temptext
X		echo 'exec /bin/mail usenet' > $tempcomm
X		awk '
XBEGIN	{
X	temphead = "'$temphead'"; tempcomm = "'$tempcomm'";
X	typeset = 0; isnewsmap = 0; isuucpmap = 0;
X	shead = 0; stext = 1; snews = 2; suucp = 3;
X	state = shead;
X}
Xstate == shead && ($1 == "From:" || $1 == "Sender:" \
X    || $1 == "Date:" || $1 == "Message-ID:" || $1 == "Message-Id:") {
X	print "Original-" $0 >> temphead;
X	next;
X}
Xstate == shead && $1 == "Newsgroups:" {	# no cross-postings allowed
X	if ($2 == "'$NEWSMAPGROUP'") {
X		isnewsmap = 1;
X		typeset = 1;
X		print "Reply-To: usenet" >> temphead;
X		print "exec /bin/mail usenet" > tempcomm;
X	} else if ($2 == "'$UUCPMAPGROUP'") {
X		isuucpmap = 1;
X		typeset = 1;
X		print "Reply-To: postmaster" >> temphead;
X		print "exec /bin/mail postmaster" > tempcomm;
X	}
X}
Xstate == shead && $1 == "Subject:" {
X	if ($1 == "Re:" || $1 == "RE:" || $1 == "re:"\
X	|| !typeset) {	# this requires Newsgroups: before Subject:
X		print "Subject:  not a map update" >> temphead;
X		print "Original-" $0 >> temphead;
X	} else
X		print $0 >> temphead;
X	next;
X}
Xstate == shead && /^$/	{
X	if (isnewsmap != 0) {
X		print "cd '$NEWSMAP'" | "uuhosts -n";
X		state = snews;
X	} else if (isuucpmap != 0) {
X		print "cd '$UUCPMAP'" | "uuhosts -u";
X		state = suucp;
X	} else
X		state = stext;
X}
Xstate == shead {
X		print $0 >> temphead;
X}
Xstate == snews	{
X	print | "uuhosts -n";
X}
Xstate == suucp	{
X	print | "uuhosts -u";
X}
Xstate == stext	{
X	print;
X}
X' > $temptext 2>&1
X		cat $temphead $temptext | sh $tempcomm
X		rm -f $temphead $temptext $tempcomm
X		exit 0
X	;;
X
X	-u)
X		# extract a UUCP map piece
X		$MAPSH
X		cd $MAPS/$UUCPMAP
X		for f in *.a *.ar
X		do
X			ar xv $f
X			rm $f
X		done
X		exit 0
X	;;
X
X	-n)
X		# extract a USENET map piece
X		$MAPSH
X		exec uuhosts -i
X		exit 0
X	;;
X
X	-i)
X		# make an index for the USENET map
X		cd $MAPS/$NEWSMAP
X		awk '$1 == "Name:" { 
X			printf ("%s\t%s\n", $2, FILENAME);
X		}' Local [a-z]* | sort -f > Index.$$
X		mv Index.$$ Index
X		exit 0
X	;;
X
X	-g)
X		# by geographical region
X		cd $MAPS/$NEWSMAP
X		shift
X		if test $# -eq 0
X		then
X			exec ls
X			exit 1
X		fi
X		exec cat $*
X		exit 1
X	;;
X
X	-k)
X		# by keyword
X		cd $MAPS/$NEWSMAP
X		shift
X		exec awk '
XBEGIN		{ inside = 1; outside = 0; state = outside; }
X/^Name:/	{ state = inside; count = 0; useit = 0; }
Xstate == inside	{ block[count++] = $0; }
X/'"$*"'/	{ useit = 1; }
X/^$/ && state == inside	{
X	if (useit == 1) {
X		for (i = 0; i < count; i++) {
X			print block[i];
X		}
X	}
X	state = outside;
X}
X' *
X		exit 1
X	;;
X
X	-*)
X		# unknown option
X	;;
X
X	"")
X		# no arguments
X	;;
X
X	*)
X		# by site name
X		if [ -x /usr/bin/look ]; then
X			look=/usr/bin/look
X			lookopt="-f "
X		else
X			look=grep
X			lookopt="^"
X		fi
X		for arg in $*
X		do
X			echo 'UUCP mail path:'
X			$look $lookopt$arg $paths
X			echo '
XUUCP mail host information:'
X			cd $MAPS/$UUCPMAP
X			sed -e '
Xs/^#N/#Name		/
Xs/^#S/#System-CPU-OS	/
Xs/^#O/#Organization	/
Xs/^#C/#Contact	/
Xs/^#E/#Electronic-Address/
Xs/^#T/#Telephone	/
Xs/^#P/#Postal-Address	/
Xs/^#L/#Latitude-Longitude/
Xs/^#R/#Remarks	/
Xs/^#W/#Written-by	/' ${arg}*
X			cd $MAPS/$NEWSMAP
X			echo '
XUSENET news host information:'
X			sed -n -e "/^Name:[ 	]*${arg}/,/^$/p" \
X				`$look $lookopt$arg Index | awk '{print $2}'`
X		done
X		exit 0
X	;;
Xesac
X
Xecho 'Usage:	'uuhosts' hostname ...
Xfor information about a particular UUCP or USENET host or hosts, or
X
X	'uuhosts' -g geographical-region
Xfor information about USENET news sites in a geographical region, or
X
X	'uuhosts' -g
Xfor a list of known USENET geographical-regions.
X
XSee uuhosts(1) for further details and more obscure options.
X'
Xexit 1
!Funky!Stuff!
echo x - mapsh.c
sed -e 's/^X//' > mapsh.c << '!Funky!Stuff!'
X#include <stdio.h>
X
X#ifndef MAPS
X#define MAPS "/usr/local/lib/news/maps"
X#endif
X
Xmain(argc,argv)
Xint argc;
Xchar **argv;
X{
X	char *rootdir = MAPS;
X	char *command = "/bin/sh";
X
X	if (geteuid() != 0) {
X		fprintf (stderr, "mapsh must be setuid to root\n");
X		exit(1);
X	}
X	if (chroot(rootdir) == -1) {
X		fprintf (stderr, "mapsh:  chroot(%s) failed\n", rootdir);
X		perror ("");
X		exit(1);
X	}
X	if (setuid(getuid()) == -1) {
X		perror ("mapsh:  setuid(getuid()) failed");
X		exit(1);
X	}
X	if (chdir("/") == -1) {
X		fprintf (stderr, "mapsh:  chdir(%s) failed\n", "/");
X		perror ("");
X		exit(1);
X	}
X	execvp (command, argv);
X	fprintf (stderr, "mapsh:  %s not found\n", command);
X	perror ("mapsh:  execvp(2) failed");
X	exit(1);
X}
!Funky!Stuff!
echo x - uucp.from.news.sh
sed -e 's/^X//' > uucp.from.news.sh << '!Funky!Stuff!'
X#!/bin/sh
X#
X#	This command, uucp.from.news, is a stopgap measure for use until
X#	the UUCP map is complete.  It extracts mail information from the
X#	USENET news map and uses it to fill in gaps in the UUCP mail map.
X#
X#	It should be called from the news map directory, $MAPS/$NEWSMAP,
X#	with a list of news map files as arguments, i.e.:
X#		cd $MAPS/$NEWSMAP
X#		uucp.from.news *
X#	It looks through the news map entries for ones with mail information,
X#	extracts those into individual files in $DIR by host name, and later
X#	copies all those for which there are not already host entries in
X#	the mail map directory to the mail map directory,  $MAPS/UUCPMAP.
X#	The new mail map files all have '-' appended so they can be easily
X#	distinguished.  If uucp.from.news is run again, such
X#	$MAPS/UUCPMAP/*- entries will be overwritten.
X#
X#	The temporary directory $DIR is removed after the command is done.
X#
XPATH=/usr/local:/usr/ucb:/bin:/usr/bin
Xumask 0002
X
XLIB=/usr/local/lib
XNEWS=$LIB/news
XMAPS=$NEWS/maps
XNEWSMAPGROUP=mod.map.news
XUUCPMAPGROUP=mod.map.uucp
XNEWSMAP=$NEWSMAPGROUP
XUUCPMAP=$UUCPMAPGROUP
X
XDIR=uucptmp
Xmkdir $DIR
X
Xawk '
XBEGIN {
X	sbetween = 0; sinside = 1; state = sbetween;
X	Date = "'"`date`"'";
X	split (Date, date, " ");
X	Mark = "uucp.from.news " date[3] " " date[2] " " date[6];
X	dir = "'$DIR'";
X}
Xstate == sbetween && $1 == "Name:" {
X	state = sinside;
X	last = "";
X	Name = "";
X	System = "";
X	Organization = "";
X	Contact = "";
X	Telephone = "";
X	Postal = "";
X	Address = "";
X	News = "";
X	Mail = "";
X	Latlong = "";
X	Remarks = "";
X	Written = "";
X	Comments = "";
X}
Xstate != sinside {
X	next;
X}
X# { print $0; }
X$1 == "Name:"		{ Name = $2;		next; }
X$1 == "Organization:"	{
X	Organization = $2;
X	for (x = 3; x <= NF; x++)
X		Organization = Organization " " $x;
X	last = $1;
X	next;
X}
X$1 == "Contact:"	{
X	Contact = $2;
X	for (x = 3; x <= NF; x++)
X		Contact = Contact " " $x;
X	last = $1;
X	next;
X}
X$1 == "Phone:"		{
X	Telephone = $2;
X	for (x = 3; x <= NF; x++)
X		Telephone = Telephone " " $x;
X	last = $1;
X	next;
X}
X$1 == "Postal-Address:"	{
X	Postal = $2;
X	for (x = 3; x <= NF; x++)
X		Postal = Postal " " $x;
X	last = $1;
X	next;
X}
X$1 == "Electronic-Address:" {
X	Address = $2;
X	for (x = 3; x <= NF; x++)
X		Address = Address " " $x;
X	last = $1;
X	next;
X}
X$1 == "News:"		{
X	News = $2;
X	for (x = 3; x <= NF; x++)
X		News = News " " $x;
X	last = $1;
X	next;
X}
X/^	/ && last == "News:" {
X	for (x = 2; x <= NF; x++)
X		News = News " " $x;
X	next;
X}
X$1 == "Mail:"		{
X	Mail = $2;
X	for (x = 3; x <= NF; x++)
X		Mail = Mail " " $x;
X	last = $1;
X	next;
X}
X/^	/ && last == "Mail:" {
X	for (x = 1; x <= NF; x++)
X		Mail = Mail " " $x;
X	next;
X}
X$1 == "Comments:"	{
X	last = $1;
X	if ($2 == "last" && $3 == "edited") {
X		Written = $4;
X		for (x = 5; x <= NF; x++)
X			Written = Written " " $x;
X		next;
X	}
X	Comments = $2;
X	for (x = 3; x <= NF; x++)
X		Comments = Comments " " $x;
X	next;
X}
X/^$/ {
X	state = sbetween;
X	if (Mail == "")
X		next;
X	output = dir "/" Name;
X	printf ("echo x - %s\n", output);
X	printf ("cat > %s << '\''End-of-%s'\''\n", output, output);
X	printf ("#N\t%s\n", Name);
X	printf ("#S\t%s\n", System);
X	printf ("#O\t%s\n", Organization);
X	printf ("#C\t%s\n", Contact);
X	printf ("#E\t%s\n", Address);
X	printf ("#T\t%s\n", Telephone);
X	printf ("#P\t%s\n", Postal);
X	printf ("#L\t%s\n", Latlong);
X	printf ("#R\t%s\n", Mark);
X#	split (News, news, "");
X#	printf ("#R\tNews:  %s", news[1]);
X#	for (x = 2; news[x] != ""; x++) {
X#		if ((x % 8) == 0)
X#			printf ("\n\t");
X#		else
X#			printf (", ");
X#		printf ("%s", news[x]);
X#	}
X#	printf ("\n");
X	printf ("#W\t%s\n", Written);
X	printf ("#\n");
X	split (Mail, mail, " ");
X	printf ("%s\t%s", Name, mail[1]);
X	for (x = 2; mail[x] != ""; x++) {
X		if ((x % 8) == 0)
X			printf ("\n\t");
X		else
X			printf (", ");
X		printf ("%s", mail[x]);
X	}
X	printf ("\n");
X	if (Comments != "") {
X		printf ("#\n");
X		printf ("#%s\n", Comments);
X	}
X	printf ("\n");
X	printf ("End-of-%s\n", output);
X	next;
X}
X' $* | sh
X
Xcd $DIR
Xfor f in *
Xdo
X	there=$MAPS/$UUCPMAP/$f
X	if [ -r ${there} ]; then
X		echo ${there}
X		continue
X	fi
X	if [ -r ${there}. ]; then
X		echo ${there}.
X		continue
X	fi
X	if [ -r ${there}% ]; then
X		echo ${there}%
X		continue
X	fi
X#	if [ -r ${there}- ]; then
X#		echo ${there}-
X#		continue
X#	fi
X	echo new ${there}-
X	mv $f ${there}-
Xdone
Xcd ..
Xrm -rf $DIR
!Funky!Stuff!
exit
-- 

John Quarterman, CS Dept., University of Texas, Austin, Texas 78712 USA
jsq at ut-sally.ARPA, jsq at ut-sally.UUCP, {ihnp4,seismo,ctvax}!ut-sally!jsq



More information about the Comp.sources.unix mailing list