Relay-Version: version B 2.10 5/3/83; site utzoo.UUCP Posting-Version: version B 2.10.2 9/18/84; site ut-sally.UUCP Path: utzoo!watmath!clyde!burl!ulysses!allegra!mit-eddie!genrad!wjh12!talcott!harvard!seismo!ut-sally!jsq From: jsq@ut-sally.UUCP (John Quarterman) Newsgroups: net.sources Subject: uuhosts: extract and display mod.map.all Message-ID: <500@ut-sally.UUCP> Date: Sun, 16-Dec-84 17:47:37 EST Article-I.D.: ut-sally.500 Posted: Sun Dec 16 17:47:37 1984 Date-Received: Tue, 18-Dec-84 02:16:39 EST Distribution: net Organization: U. Texas CS Dept., Austin, Texas Lines: 559 : 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#includeX 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@ut-sally.ARPA, jsq@ut-sally.UUCP, {ihnp4,seismo,ctvax}!ut-sally!jsq