Relay-Version: version B 2.10 5/3/83; site utzoo.UUCP Posting-Version: version B 2.10.2 9/5/84; site caribou.UUCP Path: utzoo!watmath!clyde!cbosgd!osu-eddie!caribou!bill From: bill@caribou.UUCP (Bill's area) Newsgroups: net.sources Subject: Re: uuhosts: extract and display mod.map.all Message-ID: <132@caribou.UUCP> Date: Wed, 26-Dec-84 08:17:45 EST Article-I.D.: caribou.132 Posted: Wed Dec 26 08:17:45 1984 Date-Received: Thu, 27-Dec-84 03:24:03 EST References: <500@ut-sally.UUCP> Distribution: net Organization: Caribou Labs, Columbus, OH Lines: 561 > > : 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> 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@ut-sally.ARPA, jsq@ut-sally.UUCP, {ihnp4,seismo,ctvax}!ut-sally!jsq *** REPLACE THIS LINE WITH YOUR MESSAGE ***