home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / misc / volume7 / rna < prev    next >
Text File  |  1989-07-21  |  19KB  |  635 lines

  1. Newsgroups: comp.sources.misc
  2. subject: v07i092: RNA
  3. From: allbery@uunet.UU.NET (Brandon S. Allbery - comp.sources.misc)
  4. Reply-To: venta@i2ack.UUCP (Paolo Ventafridda)
  5.  
  6. Posting-number: Volume 7, Issue 92
  7. Submitted-by: venta@i2ack.UUCP (Paolo Ventafridda)
  8. Archive-name: rna
  9.  
  10. :
  11. # This is a shell archive, meaning:
  12. # 1. Remove everything above the : line.
  13. # 2. Save the resulting text in a file.
  14. # 3. Execute the file with /bin/sh (not csh) to create:
  15. #    README
  16. #    version
  17. #    RNA
  18. # This archive created: Wed Jul 12 14:21:18 1989
  19. export PATH; PATH=/bin:/usr/bin:$PATH
  20. if test -f 'README'
  21. then
  22.     echo shar: "will not over-write existing file 'README'"
  23. else
  24. cat << \SHAR_EOF > 'README'
  25.  
  26.                             Remote Network Archive
  27.                             ----------------------
  28.  
  29.  
  30.          Hey,  don't  do  it,  don't go installing  RNA  without  first
  31.          reading these few lines!  Lemme explain what RNA was made for,
  32.          and  what  rna won't do.  It won't take long, so forget  about
  33.          the keyboard for a while and read this tiny manual.
  34.          GIVE ME A CHANCE!  Thank you.
  35.  
  36.                                Paolo Ventafridda
  37.  
  38.  
  39.          WHAT IS RNA
  40.          -----------
  41.          Suppose  that  your system has some software (any  kind)  that
  42.          other  people  on the network sometimes request, and  you  are
  43.          becoming  crazy on uucp transfers, and mail such "please could
  44.          you send me file xxx thx" etc.  Rna will allow your neighbours
  45.          to help themselves using simple mail commands such as "send me
  46.          file  xxx " just like if they were asking YOU.  All files will
  47.          travel  through  ANY network like mail, not like  UUCP;   this
  48.          means  that also BITNET, DECNET, FIDOnet users will be able to
  49.          help themselves without bothering you anymore!
  50.  
  51.          There's  a  program  around called NETLIB, developed  by  AT&T
  52.          research centers, which already does this thing, and also very
  53.          well;   it's  powerful, but also complicated to  install,  and
  54.          anyway has bigger docs than rna ;-)
  55.  
  56.          If  you  don't need all of that power, and you want  something
  57.          really  easy  to install and to mantain,and eventually  remove
  58.          ;-(  than have a look at rna.  There are two good reasons  for
  59.          trying it:
  60.          1- it works fine
  61.          2- it's free.
  62.  
  63.          FEATURES
  64.          --------
  65.          -  Handles  commands  such  as  "  please  send  tetris.Z   to
  66.          bob@usixth  "  , it doesn't care of where these  commands  are
  67.          placed  inside  your mail, even the Subject will do.  You  can
  68.          put multiple commands inside the same message.
  69.        
  70.          -  If  file  does not exist, or is not readable,  it  gives  a
  71.          response about it.
  72.  
  73.          -  If requested file is not ascii, it will uuencode it  before
  74.          shipping.
  75.         
  76.          -  Index is available with " send index to ..  " :  index is a
  77.          ls of your public directory, automatically done on request, so
  78.          you  don't  need to spend time on your archive.  If you  want,
  79.          create  a "index" file in pubdir, containing full descriptions
  80.          of your (some) files.  This list will be appended to the "ls".
  81.         
  82.          - Help is available with "send help to ...".  This is a trick:
  83.          help is a common file like others.  But don't tell it around.
  84.          
  85.          -  Attention  please:  rna does not recognize in this  version
  86.          the  address  of the sender, in fact you have to specify  "to:
  87.          ..".   This might cause some problems to someone.  Trust  your
  88.          neighbours,  or  install  netlib!  Anyway, if  someone  enjoys
  89.          sending big files to enemies through your rna, a copy of their
  90.          letters will still be in your log.
  91.  
  92.          WHAT? A SHELL SCRIPT?
  93.          ---------------------
  94.          What's  wrong, John, never seen a shell script?  Well, rna  IS
  95.          written  in standard Bourne Shell.  People thinks that only  C
  96.          programs  can  do  useful  things;  well, i  think  that  Real
  97.          Programmers don't use C, if they can do it in Shell.
  98.          Now,  RNA  is NOT meant to run full time, but only once  every
  99.          while,  launched by cron, just to see if there's something  to
  100.          do.  So speed is not important, not at all!
  101.  
  102.          INSTALLATION  
  103.          ------------
  104.          You  need a dedicated directory for the rna package.  In  this
  105.          directory  rna  will keep its logs and its files.   rna  takes
  106.          only  a  couple  of  temporary files, the rest  is  done  with
  107.          variables.
  108.  
  109.          You need a directory which will contain your "public" software
  110.          (PUBDIR).   RNA  in  this  version   only  allows  ONE  public
  111.          directory, and all files are taken there.
  112.  
  113.          You  may  put inside PUBDIR a file named "help";   that's  the
  114.          file  that  will be sent to your guests whenever they ask  for
  115.          it.  If there's no help, RNA will say "no help available" (you
  116.          bet it).
  117.  
  118.          You  may put inside PUBDIR a file named "index";  when someone
  119.          asks  for  an index, RNA does an ls -log , greps out  eventual
  120.          "index" and "help" files, and appends -if existing- this file.
  121.          Usually   it  should  contain   full  descriptions  of  files,
  122.          warnings, greetings or whatever.
  123.  
  124.          You  need a dummy login entry for the mail, say "rnalib",  and
  125.          put an alias like " netlib rnalib " ;-) _
  126.          Guests  should send mail to this login, whose mailbox will  be
  127.          checked by RNA.  Don't use root or other system accounts.
  128.  
  129.          Last  but  not least, go in /usr/lib/cron/crontabs and put  an
  130.          entry  for executing RNA, say once every hour, or once a  day.
  131.          RNA  starts,  check  if there's mail for it,  and  if  there's
  132.          nothing waiting it exits.  No CPU load.
  133.  
  134.          For  permissions:   RNA  wants  to be  owner  of  its  working
  135.          directory  (of course), owner of it's own mail (of course) and
  136.          able  to  go in usr/mail (/usr/spool/mail..) to cp and  remove
  137.          pending messages .  RNA needs also PUBDIR to be readable.
  138.  
  139.          To  configure  RNA edit the program itself:  at the  beginning
  140.          there's everything you need, and a comment for every variable,
  141.          so it's really easy and would make this doc useless.
  142.  
  143.      Addendum: have a look at getmail() procedure: it set permissions
  144.      as on my system, you may need to fit your own mail setup.
  145.  
  146.          ACCOUNTING
  147.          ----------
  148.          RNA  keeps a log of its actions ( file "xxx" sent to "yyy"  ),
  149.          and  also  keep a copy of all mails, so that you'll always  be
  150.          able to go and see what happened.
  151.  
  152.          If  you want a "debug" view of what RNA does, set DEBUG inside
  153.          configuration:   debug  occurs  as stdout,  and  won't  affect
  154.          default log file.
  155.  
  156.          SYNTAX
  157.          ------ 
  158.          RNA  detects  command  lines  by grepping  out  "@@"  headers.
  159.          Allowed syntax is in the form of:
  160.  
  161.                 @@ [please] action argument [to] address
  162.  
  163.          where  [please]  and  [to] (also To, to:, etc.)  don't  count;
  164.          action  is  only  "send"  (or   SEND  etc.),  and  address  is
  165.          recognized in three forms:
  166.  
  167.                 - UUCP address, containing a "!"
  168.                 - ARPA address, containing a "@"
  169.                 - local address
  170.  
  171.          UUCP  and  ARPA are checked to be made of at least  two  words
  172.          (host  and  user..).   In this case address is  validated  and
  173.          passed to your mailer (its business then).
  174.          Wildcards  are  not  allowed.   Security  is  accomplished  by
  175.          looking for "/" and similar chars.
  176.          
  177.          ARCHIVING
  178.          ---------
  179.          RNA  recognizes non-ascii files by looking at file names.   By
  180.          default any file whose name contains:
  181.  
  182.                 *.Z*
  183.                 *.z*
  184.                 *.tar*
  185.                 *.cpio*
  186.                 or NO "." at all
  187.  
  188.          will  be  considered  non-ascii, and though  uuencoded  before
  189.          mailing.   Any  file with other suffixes, such as .src,  .any,
  190.          .doc  etc.  will be left as-it-is.  Remember that a file  like
  191.          "tetris",  with  no dots, will be uuencoded.  If you  want  to
  192.          change this behaviour, change the source, it's easy.
  193.  
  194.          COPYRIGHTS, AUTHOR'S NOTES ETC.ETC.
  195.          -----------------------------------
  196.          
  197.          This  is  of course freeware, so i don't ask money for it  and
  198.          you can't ask money TO me for any trouble it may cause you.
  199.  
  200.          This  software  may be freely distributed provided  you  don't
  201.          make  money  out of it.  This means that EUNET sites  are  not
  202.          allowed to use it without explicit request to myself.
  203.  
  204.          For a free EUropean CONnection
  205.  
  206.                 Paolo Ventafridda, July 1989
  207.  
  208.          venta@altger.UUCP  ({..}!altos86!altger!venta)
  209.          venta@i2ack.UUCP   (sublink/subnet/s.u.n.: EUcon networks only)
  210.      {...}!ddsw1!deejay!i2ack!venta   (USENET)
  211.      desperation: pyramid!tmpmbx!deejay!i2ack!venta
  212.  
  213.          Don't send through mcvax/unido/i2unix since i am blacklisted,
  214.          like all of the rest of EUcon.
  215.  
  216.  
  217. SHAR_EOF
  218. fi
  219. if test -f 'version'
  220. then
  221.     echo shar: "will not over-write existing file 'version'"
  222. else
  223. cat << \SHAR_EOF > 'version'
  224. Version 1.0 july 1989
  225.  
  226. If there's some feedback, i can easily add multiple public directories
  227. ( send file from dir to user@host )
  228. directory password protection
  229. ( send file from dir to user@host password= abcdefg )
  230. and finally sender address.
  231.  
  232. SHAR_EOF
  233. fi
  234. if test -f 'RNA'
  235. then
  236.     echo shar: "will not over-write existing file 'RNA'"
  237. else
  238. cat << \SHAR_EOF > 'RNA'
  239. :
  240. # Remote Network Archive  version 1.0
  241. # by venta@i2ack.UUCP (EUcon)
  242. #
  243. # Before doing anything, Read the manual!
  244. # ---------------------------------------------
  245. # setup these DEFines , and you are ready to go
  246. # ---------------------------------------------
  247. # Archive directory: this is were your archived files are stored.
  248. # All the stuff in/out going is merely taken here. Don't choose
  249. # other system dirs such as uucppublic.
  250. PUBDIR=/usr/spool/uucppublic/rna
  251. # System directory: this is a dedicated directory for rna. System
  252. # files, log, and garbage will be put here. This directory will not
  253. # be public, and should be closed to others but root.
  254. WORKDIR=/usr/local/src/sendnews
  255. #
  256. # The login used as rna entry: tipically a dummy login, just to allow
  257. # mail spooling. Usually stuff like 'fserver', 'netserv', 'netlib' etc.
  258. LOGNAME=rnalib
  259. #
  260. # The local postmaster, i.e. the person which will eventually solve
  261. # remote users problems. 
  262. # If you don't know what a Postmaster is, you are probably in the
  263. # wrong place. Put 'root' and go on, this is only a reference.
  264. POSTMASTER=root
  265. #
  266. # The mail file for LOGNAME, complete path. Usually:
  267. # /usr/spool/mail/$LOGNAME  on Xenix systems
  268. # /usr/mail/$LOGNAME  on Unix System V and BSD .
  269. MAIL=/usr/spool/mail/$LOGNAME
  270. #
  271. # The name of your machine, as of 'uname -n' or similar.. Hey, dont put
  272. # another one, use the correct local machine name. Don't cheat.
  273. UNAME=i2ack
  274. #
  275. # Name of the file containing all of rna logs, status etc. 
  276. # also called "accounting"..
  277. LOGFILE=$WORKDIR/log
  278. #
  279. # Name of the file which is going to keep record of ALL incoming mails.
  280. # Sort of archive, needs to be cleaned up sometimes.
  281. MAILFILE=$WORKDIR/mail
  282. #
  283. # Debugging would occur on stdout, NOT on logfile
  284. # 1=debug (try it for fun once), nodebug= leave a SPACE, dont put a 0
  285. DEBUG=
  286. #
  287. # some progs never in the same place... please tell where they are
  288. MAILER=/bin/mail
  289. ENCODE=/usr/local/bin/uuencode
  290. #
  291. # --- internal variables ---
  292. TMP=$WORKDIR/tmp
  293. CMDS=$WORKDIR/tmpcmds
  294. CMDLOG=$WORKDIR/commlog
  295.  
  296. # -------------------- some procedures... ----
  297. quit() {
  298.     acc "shutdown requested"
  299.     exit
  300. }
  301.  
  302. acc() {
  303.     echo "`date '+%d.%m.%y - %H:%M:%S` : $@" >>$LOGFILE
  304.     test $DEBUG && echo "$@"
  305. }
  306.  
  307. getmail() {
  308.    rm $TMP 2>/dev/null
  309.    mv $MAIL $TMP
  310.    touch $MAIL; chown $LOGNAME $MAIL; chgrp mail $MAIL; chmod 620 $MAIL
  311.    touch $MAILFILE; echo "`cat $TMP`\n===\n" >>$MAILFILE 
  312.     }
  313.  
  314. clrfiles() {
  315.     rm -f $CMDLOG 2>/dev/null; touch $CMDLOG
  316.     rm -f $CMDS 2>/dev/null
  317. }    
  318.  
  319.  
  320.  
  321. parse() {
  322.  
  323. # some pre-parsing for naughty characters..
  324. grep @@ $TMP | sed 's/\*/ERR/g' >$CMDS
  325.  
  326. if test -s $CMDS; then
  327.     set `wc -l $CMDS`; cmds=$1
  328.     acc "mail contains $cmds command line(s)"
  329.  
  330. test $DEBUG && echo "start parsing"
  331.     strings="`cat $CMDS`"
  332.     set -f $strings
  333. test $DEBUG && echo "$# words"
  334. #
  335. # main parse loop
  336. #
  337. error=0; position=0; action=""; argument=""; destination=""
  338. #
  339. while [ "$1" != "" ]
  340. do
  341. test $DEBUG && echo "parsing: $1"
  342.     case $1 in
  343.         @@) 
  344.         test $DEBUG &&    echo restart found
  345.             action=""; argument=""; position=0; destination=""
  346.             shift;;
  347.  
  348.         ERR)    
  349.             ( acc "parser: wildcards error" )
  350.             error=1;;
  351.  
  352.         [sS][eE][nN][dD]|[sS][eE][nN][Dd]:)
  353.             test $DEBUG && echo send detected
  354.             if test $position -eq 0 
  355.             then
  356.                 action=send; position=1;
  357.                 shift
  358.                 if test -z "$1" 
  359.                 then
  360.                     error=1;
  361.  test $DEBUG && echo "eof while arg in send"
  362.                 else
  363.                     argument=$1; position=2
  364.                     shift
  365.                 fi
  366.             else
  367.             error=1; 
  368. test $DEBUG && echo send is in wrong position
  369.             fi;;
  370.             
  371.  
  372.         [tT][Oo]|[tT][oO]:)    
  373.     test $DEBUG && echo to detected
  374.             if test $position -eq 2 
  375.             then
  376.                 shift
  377.             else
  378. test $DEBUG && echo to is in wrong position
  379.                 error=1
  380.             fi;;
  381.  
  382.         *[Pp]lease*)
  383.     test $DEBUG &&    echo please detected
  384.                 if test $position -eq 0 -o $position -eq 2
  385.             then
  386.                 shift
  387.         test $DEBUG &&    echo please shifted
  388.             else
  389.             test $DEBUG && echo error please
  390.                 error=1
  391.             fi;;
  392.                 
  393.  
  394.         *)
  395.             if test $position -eq 2
  396.             then
  397.                 destination=$1; position=3
  398.                 shift
  399.             else
  400.             test $DEBUG &&    echo unknown
  401.                 error=1
  402.             fi;;
  403.     esac            
  404.  
  405. if test $error -gt 0
  406. then
  407. test $DEBUG && echo recovering error
  408.     while [ "$1" != "@@" ]
  409.     do
  410.     test -z "$1" && test $DEBUG && echo eof detected while recovering error
  411.         test -z "$1" && break
  412.         shift
  413.     done
  414.     error=0
  415. test $DEBUG &&    echo end rewind
  416. fi
  417.     test $DEBUG && echo action=$action argument=$argument dest=$destination
  418.  
  419. if test $position -eq 3
  420. then
  421.     ( acc "parser: $action ($argument) to: ($destination)" )
  422.     echo $action $argument $destination >>$CMDLOG
  423.     
  424.     position=0; argument=""; destination="";
  425. fi
  426.         
  427.  
  428. # end while
  429. done
  430. test $DEBUG && echo EOF
  431. else
  432. acc "parser: no command lines found"
  433. fi
  434.  
  435. }    
  436.  
  437. interp() {
  438.  
  439. if test -s $CMDLOG; then
  440.     set `wc -l $CMDLOG`; cmds=$1
  441.     ( acc "interpreter: found $cmds command line(s)" )
  442.  
  443.  
  444. strings="`cat $CMDLOG`"
  445. set -f $strings
  446. test $DEBUG && echo "$# words"
  447. #
  448. # main loop
  449. #
  450. while [ "$1" != "" ]
  451. do
  452. test $DEBUG && echo "parsing: $1"
  453. #
  454. action=""; argument=""; destination=""
  455. case $1 in
  456.  
  457.     help)
  458.         action=send
  459.         shift; shift
  460.         argument=help
  461.         destination=$1;;
  462.  
  463.     send)    
  464.         action=send
  465.         shift; argument=$1
  466.         shift; destination=$1;;
  467.  
  468.      *)
  469.         ( acc "interpreter error: token $1" )
  470.         shift; shift;;
  471.  
  472. esac
  473.  
  474. test $DEBUG && echo "ACTION=$action, ARG=$argument, DEST=$destination"
  475.  
  476. # first we parse destination: if it's illegal, we dont waste
  477. # time parsing the argument
  478. if test `echo $destination | grep @` 
  479. then
  480. test $DEBUG && echo arpa address
  481.     if [ `echo $destination | sed 's/@/ /g' | wc -w` -eq 2 ]; then 
  482.         destype=ARPA
  483.         test $DEBUG && echo valid arpa address 
  484.     else
  485.         ( acc "interpreter: wrong arpa address \"$destination\" " )
  486.         destination=UNKNOWN
  487.     fi 
  488. elif test `echo $destination | grep !`
  489. then
  490. echo UUCP address
  491.     if [ `echo $destination | sed 's/!/ /g' | wc -w` -ge 2 ]; then
  492.         test $DEBUG && echo valid uucp address 
  493.         destype=UUCP
  494.     else
  495.         ( acc "interpreter: wrong uucp address \"$destination\" " )
  496.         destination=UNKNOWN
  497.     fi
  498. else
  499.     test $DEBUG && echo local delivery
  500.     destype=LOCAL
  501. fi
  502.  
  503. test $DEBUG && echo "status: dest=$destination , arg=$argument , destype=$destype"
  504.  
  505. if test $destination != "UNKNOWN"; then
  506. # now we check if argument is valid
  507.     test $DEBUG && echo destination OK
  508.         if test "$argument" = "ERR"; then
  509.         test $DEBUG && echo ERR detected in argument
  510.     errarg="argument field contains wild characters"
  511.         argument=ERROR
  512.     elif test `echo $argument | grep /`; then
  513.         test $DEBUG && echo ILLEGAL ARG
  514.         errarg="\"$argument\" is not a valid argument"
  515.         ( acc "interpreter: $errarg denied to $destination" )
  516.         argument=ERROR
  517.     elif test -r $PUBDIR/$argument; then
  518.         test $DEBUG && echo FILE $argument is ok
  519.         ( acc "mailer: sending $argument to $destination" )
  520.         errarg=NONE
  521.     elif test "$argument" = "index"; then
  522.    test $DEBUG && echo this is an index request but no verbose index available
  523.         argument=index
  524.     else
  525. test $DEBUG && echo nonexistent $argument
  526.         errarg="\"$argument\" is not available"
  527.         ( acc "interpreter: $errarg for $destination" )
  528.         argument=ERROR
  529.     fi
  530.  
  531. # now we ship the stuff . 
  532.  
  533. ( echo "Subject: RNA mail from $UNAME"; echo
  534.   echo ""
  535.   echo "This is the RNA output for a request destinated to you."
  536.   echo "Binary files have been uuencoded to an ASCII format."
  537.   echo 
  538.   if test "$errarg" != "NONE"; then
  539.     echo "Error: $errarg"
  540.  
  541.   echo
  542.   echo "For more details on this RNA delivery please mail ${POSTMASTER}@${UNAME}."
  543.   echo "If you need help on the RNA remote commands and usage, send mail"
  544.   echo "to ${LOGNAME}@$UNAME containing: @@ send help to yourname@yourhost"
  545.   echo 
  546.  
  547.   else
  548.  
  549.   echo "RNA request:  $action \"$argument\" to: \"$destination\" ($destype)"
  550.   echo
  551.   if test "$argument" = "index"; then
  552.     echo; echo "List of available files at $UNAME :"; echo
  553.     ( set `ls -l $PUBDIR | wc -l`; 
  554.     ls -log $PUBDIR | tail -`expr $1 - 1` | grep -v help | grep -v index )
  555.     
  556.     if test -r $PUBDIR/$argument; then
  557.         echo; cat $PUBDIR/$argument
  558.     fi
  559.   elif test "$argument" = "help"; then
  560.     echo; 
  561.     if test -r $PUBDIR/$argument; then
  562.         echo; cat $PUBDIR/$argument
  563.     else
  564.         echo "Sorry no help available"
  565.         ( acc "no help file in public directory" )
  566.     fi
  567.  else    
  568.     # some rules for detecting non-ascii data. 
  569.     ready=""
  570.     if test `echo $argument | grep '\.Z'` ; then
  571.         noready="compressed file"
  572.     elif test `echo $argument | grep '\.z'`; then
  573.         noready="crypted file"
  574.     elif test `echo $argument | grep '\.tar'`; then
  575.         noready="tar file"
  576.     elif test `echo $argument | grep '\.cpio'`; then
  577.         noready="cpio file"
  578.     elif test ! "`echo $argument | grep '\.'`"; then
  579.         noready="program file"
  580.     else
  581.     noready="ascii file"
  582.     ready=OK
  583.     fi 
  584.  
  585. echo "( $noready )"
  586. echo
  587.   echo "+------ cut start of $argument ----------------------------------+"
  588.   if test $ready ; then
  589.       cat $PUBDIR/$argument
  590.   else
  591.     $ENCODE $PUBDIR/$argument $argument
  592.     ( acc "encoding $noready" )
  593.   fi
  594.   echo "+------  cut end of $argument  ----------------------------------+"
  595.   echo;
  596.   fi
  597.   fi
  598.  ) | $MAILER $destination
  599.  # 
  600.  
  601. fi    
  602.             
  603. shift
  604.  
  605. # end while
  606. done
  607. #echo EOF
  608. else
  609. ( acc "interpreter: no valid commands found" )
  610. fi
  611.  
  612.  
  613. }
  614.  
  615. # -----------------------------------
  616. #            main program
  617. # -----------------------------------
  618. touch $LOGFILE
  619.     test -r $WORKDIR/shutdown && quit
  620.     test -s $MAIL && ( acc "found mail";
  621.          clrfiles; getmail; 
  622.          parse; interp )
  623.  
  624. # end of RNA
  625. SHAR_EOF
  626. fi
  627. exit 0
  628. #    End of shell archive
  629. --
  630. Paolo Ventafridda, Milano -Italy _ Sublink (EUcon): venta@i2ack.UUCP  ****
  631. ****  The SUBLINK Foundation     _ +39-2-4035289 (300-2400 MNP4, 9600 PEP)
  632. .                  For a free EUropean CONnection                        .
  633.