home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / misc / volume8 / unpkmaps2 / unpackmaps < prev   
Encoding:
Text File  |  1989-09-23  |  5.7 KB  |  241 lines

  1. #    Written by: Chris Lewis, clewis@eci386
  2. #    unpackmaps release 2.0 (alpha)
  3. trap "rm -f /tmp/unp?$$; exit" 0 1 2 3 15
  4. IFS="     
  5. "
  6. export IFS
  7. PATH=/bin:/usr/bin
  8. export PATH
  9.  
  10. #    The name of the file that you've caused your news system to
  11. #    batch the file names of the map articles.
  12. # Eg: C-news
  13. BATCH=/usr/lib/news/batch/b.maps/togo
  14. # Eg: B-news
  15. #BATCH=/usr/spool/batch/maps
  16. #    News spool directory
  17. NEWSSPOOL=/usr/spool/news
  18. #    Where you want the maps to go.
  19. #    I like using /usr/spool/maps, but on our system, /usr/spool/news
  20. #    is a separate file system, and /usr runs close to the limit...
  21. MAPDIR=/usr/spool/news/maps
  22. #    Person to send results and error messages to
  23. NOTIFY=clewis
  24. #    pathalias binary
  25. PATHALIAS=/usr/lbin/pathalias
  26. #    where you want the path files to go:
  27. #    A convenient place is /usr/lib/uucp/paths which is the smail
  28. #    default.  If you're going to put this in /usr/lib/uucp, I suggest
  29. #    (rather than make /usr/lib/uucp writeable by everybody), doing
  30. #    the following:
  31. #        su root
  32. #        cd /usr/lib/uucp
  33. #        touch paths
  34. #        chown news paths    (or usenet)
  35. #        chmod 644 paths
  36. PATHFILE=/usr/lib/uucp/paths
  37. #    Auxiliary options to pathalias.  Tune to local tastes....
  38. PATHOPTS="-dwatmath"
  39. #    If you have a version[s] of your machine's map entry that is different 
  40. #    from what's published, change this variable to point at it/them.
  41. #    (Eg: I publish the first entry here, and the second one is local tuning
  42. #    and hidden connections)
  43. PATHLOCAL="/usr2/clewis/maps/path.local /usr2/clewis/maps/path.nonpublic"
  44. #    If this variable is set to the compress binary, maps will be
  45. #    compressed.  DO NOT define this unless you've applied the accompanying
  46. #    patch to your version 9 pathalias source, and you've set the path
  47. #    in config.h to point at the same place.
  48. COMPRESS=/usr2/clewis/maps/compress12
  49. #    1 to strip comments from maps - don't do this if you ever try
  50. #    to read the maps and figure out where the site is, their contacts
  51. #    etc.
  52. NOCOMMENTS=0
  53. #    PS: there is *one* possible edit that you might want to make
  54. #    below - the maps used to generate wierd domains, but most of that
  55. #    appears to be gone now (don't ask me, I never particularly understood
  56. #    it, but since Peter Honeyman recommended it...).  If you object
  57. #    to these wierd domains, uncomment the egrep.
  58.  
  59. #    Edit no more....
  60.  
  61. umask 022
  62.  
  63. PATH=/bin:/usr/bin
  64. export PATH
  65.  
  66. if test ! -d $MAPDIR -o ! -w $MAPDIR
  67. then
  68.     echo "$MAPDIR missing, unwritable or not a directory" >&2
  69.     exit
  70. fi
  71.  
  72. if [ $# = 1 ]
  73. then
  74.     case $1 in
  75.     -p)
  76.         forcepath=true
  77.         ;;
  78.     -i)
  79.         cd /
  80.         rm -f $BATCH.work
  81.         # using find/sort instead of ls just in case there's lots of
  82.         # articles....
  83.         find $NEWSSPOOL/comp/mail/maps -type f -print | sort > $BATCH
  84.         ;;
  85.     *)
  86.         echo "usage: unpackmaps [-i] [-p]" >&2
  87.         exit 1
  88.         ;;
  89.     esac
  90. fi
  91.  
  92. cd $MAPDIR
  93.         
  94. while [ -f $BATCH -o -f $BATCH.work ]
  95. do
  96.     # There is no window of vulnerability here as long as noone else is
  97.     # creating $BATCH.work.
  98.     if [ ! -f $BATCH.work ]
  99.     then
  100.     mv $BATCH $BATCH.work
  101.     fi
  102.  
  103.     while read i stuff
  104.     do
  105.     #    Using stuff to capture remaining junk on line.
  106.     #    Eg: C-news article sizes.
  107.  
  108.     if [ -z "$i" ]
  109.     then
  110.         break
  111.     fi
  112.  
  113.     if [ ! -r $i ]
  114.     then
  115.         echo "$i apparently superseded or expired"
  116.         continue
  117.     fi
  118.  
  119.     # This awk script depends on the following map article format:
  120.     # <don't cares>
  121.     # cat << 'something' > filename
  122.     # map body
  123.     # something
  124.     # <don't cares>
  125.     # "something" doesn't have to be enclosed in quotes in the cat line.
  126.     # This isn't particularly fast - could be dramatically speeded up
  127.     # if written in C, but I was trying to ensure that this is as simple
  128.     # and self-evident as possible.
  129.  
  130.     awk '
  131.     $1 == "cat" {
  132.         endtoken=$3;
  133.         if (substr(endtoken, 1, 1) == "'"'"'")
  134.             endtoken=substr(endtoken, 2, length(endtoken)-2);
  135.         collecting = 1;
  136.         foundone = 1;
  137.         name = $5;
  138.         if (index(name, "/") != 0) {
  139.             printf("Security violation attempt in %s!\n", "'$i'");
  140.             exit;
  141.         } else
  142.             printf("extracting %s from %s\n", name, "'$i'");
  143.         next;
  144.         }
  145.  
  146.         {
  147.         if (!collecting)
  148.             next;
  149.         if ($1 == endtoken) {
  150.             line = "rm -f " name ".Z"
  151.             print "" | line
  152.             collecting = 0;
  153.             next
  154.         }
  155.         if ("'$NOCOMMENTS'" == 1 && $0 ~ /#/)
  156.             print substr($0, 1, index($0, "#")) > name
  157.         else
  158.             print $0 > name
  159.         }
  160.         
  161.         END {
  162.         if (collecting) {
  163.             printf("Non-terminated map in %s\n", "'$i'");
  164.         }
  165.         if (!foundone) {
  166.             printf("%s does not contain a properly formed map\n", "'$i'");
  167.         }
  168.         }' $i
  169.     done < $BATCH.work
  170.     rm $BATCH.work
  171. done > /tmp/unpA$$ 2>&1
  172.  
  173. if test -n "$PATHALIAS" -a -x "$PATHALIAS" 
  174. then
  175.     if test -s /tmp/unpA$$ -o -n "$forcepath"
  176.     then
  177.     cd $MAPDIR
  178.  
  179.     (
  180.     $PATHALIAS -f $PATHOPTS ?.* $PATHLOCAL |
  181.  
  182.     # format of the pathalias -f output is
  183.     # cost    host    route
  184.     #
  185.     # format of a 'paths' file for smail is
  186.     # host    route    first_hop_cost
  187.     #
  188.     # move cost field to end of line:
  189.  
  190.     sed 's/\(.*\)    \(.*\)    \(.*\)/\2    \3    \1/' |
  191.  
  192.     # convert target domain/host to lower case:
  193.  
  194.     #lcasep |
  195.     
  196.     # remove some additional wierdnesses (per Peter Honeyman):
  197.     # You can leave it in or not.
  198.  
  199.     # egrep -v '(\.(com|edu|mil|gov|net|org|arpa|[a-z][a-z])    .*!.*!)|(.\.(com|edu|mil|gov|net|org|arpa|[a-z][a-z])    )' |
  200.  
  201.     # sort the stream:
  202.     
  203.     sort > /tmp/paths ) > /tmp/unpB$$ 2>&1
  204.  
  205.     if test ! -s /tmp/paths
  206.     then
  207.         echo "Pathalias failed no map file created" >> /tmp/unpB$$
  208.     else
  209.         cat /tmp/paths > $PATHFILE 2>> /tmp/unpB$$
  210.         if test $? != 0
  211.         then
  212.         echo "Copy to $PATHFILE failed" >> /tmp/unpB$$
  213.         else
  214.         rm /tmp/paths
  215.         fi
  216.         echo "Map remade" >> /tmp/unpB$$
  217.     fi
  218.  
  219.     if test -s /tmp/unpB$$
  220.     then
  221.         echo "Pathalias output:" >> /tmp/unpA$$
  222.         cat /tmp/unpB$$ >> /tmp/unpA$$
  223.     fi
  224.     fi
  225. fi
  226.  
  227. if test -x "$COMPRESS"
  228. then
  229.     files=`ls ?.* | sed -e '/\.Z$/d'`
  230.     if [ -n "$files" ]
  231.     then
  232.     $COMPRESS -f $files
  233.     fi
  234. fi
  235.  
  236.  
  237. if test -s /tmp/unpA$$
  238. then
  239.     mail $NOTIFY < /tmp/unpA$$
  240. fi
  241.