home *** CD-ROM | disk | FTP | other *** search
- From decwrl!ucbvax!tut.cis.ohio-state.edu!gem.mps.ohio-state.edu!ginosko!uunet!allbery Thu Aug 3 08:50:38 PDT 1989
- Article 984 of comp.sources.misc:
- Path: decwrl!ucbvax!tut.cis.ohio-state.edu!gem.mps.ohio-state.edu!ginosko!uunet!allbery
- From: allbery@uunet.UU.NET (Brandon S. Allbery - comp.sources.misc)
- Newsgroups: comp.sources.misc
- Subject: v07i092: RNA
- Message-ID: <61155@uunet.UU.NET>
- Date: 22 Jul 89 01:00:38 GMT
- Sender: allbery@uunet.UU.NET
- Reply-To: venta@i2ack.UUCP (Paolo Ventafridda)
- Lines: 629
- Approved: allbery@uunet.UU.NET (Brandon S. Allbery - comp.sources.misc)
-
- Posting-number: Volume 7, Issue 92
- Submitted-by: venta@i2ack.UUCP (Paolo Ventafridda)
- Archive-name: rna
-
- :
- # This is a shell archive, meaning:
- # 1. Remove everything above the : line.
- # 2. Save the resulting text in a file.
- # 3. Execute the file with /bin/sh (not csh) to create:
- # README
- # version
- # RNA
- # This archive created: Wed Jul 12 14:21:18 1989
- export PATH; PATH=/bin:/usr/bin:$PATH
- if test -f 'README'
- then
- echo shar: "will not over-write existing file 'README'"
- else
- cat << \SHAR_EOF > 'README'
-
- Remote Network Archive
- ----------------------
-
-
- Hey, don't do it, don't go installing RNA without first
- reading these few lines! Lemme explain what RNA was made for,
- and what rna won't do. It won't take long, so forget about
- the keyboard for a while and read this tiny manual.
- GIVE ME A CHANCE! Thank you.
-
- Paolo Ventafridda
-
-
- WHAT IS RNA
- -----------
- Suppose that your system has some software (any kind) that
- other people on the network sometimes request, and you are
- becoming crazy on uucp transfers, and mail such "please could
- you send me file xxx thx" etc. Rna will allow your neighbours
- to help themselves using simple mail commands such as "send me
- file xxx " just like if they were asking YOU. All files will
- travel through ANY network like mail, not like UUCP; this
- means that also BITNET, DECNET, FIDOnet users will be able to
- help themselves without bothering you anymore!
-
- There's a program around called NETLIB, developed by AT&T
- research centers, which already does this thing, and also very
- well; it's powerful, but also complicated to install, and
- anyway has bigger docs than rna ;-)
-
- If you don't need all of that power, and you want something
- really easy to install and to mantain,and eventually remove
- ;-( than have a look at rna. There are two good reasons for
- trying it:
- 1- it works fine
- 2- it's free.
-
- FEATURES
- --------
- - Handles commands such as " please send tetris.Z to
- bob@usixth " , it doesn't care of where these commands are
- placed inside your mail, even the Subject will do. You can
- put multiple commands inside the same message.
-
- - If file does not exist, or is not readable, it gives a
- response about it.
-
- - If requested file is not ascii, it will uuencode it before
- shipping.
-
- - Index is available with " send index to .. " : index is a
- ls of your public directory, automatically done on request, so
- you don't need to spend time on your archive. If you want,
- create a "index" file in pubdir, containing full descriptions
- of your (some) files. This list will be appended to the "ls".
-
- - Help is available with "send help to ...". This is a trick:
- help is a common file like others. But don't tell it around.
-
- - Attention please: rna does not recognize in this version
- the address of the sender, in fact you have to specify "to:
- ..". This might cause some problems to someone. Trust your
- neighbours, or install netlib! Anyway, if someone enjoys
- sending big files to enemies through your rna, a copy of their
- letters will still be in your log.
-
- WHAT? A SHELL SCRIPT?
- ---------------------
- What's wrong, John, never seen a shell script? Well, rna IS
- written in standard Bourne Shell. People thinks that only C
- programs can do useful things; well, i think that Real
- Programmers don't use C, if they can do it in Shell.
- Now, RNA is NOT meant to run full time, but only once every
- while, launched by cron, just to see if there's something to
- do. So speed is not important, not at all!
-
- INSTALLATION
- ------------
- You need a dedicated directory for the rna package. In this
- directory rna will keep its logs and its files. rna takes
- only a couple of temporary files, the rest is done with
- variables.
-
- You need a directory which will contain your "public" software
- (PUBDIR). RNA in this version only allows ONE public
- directory, and all files are taken there.
-
- You may put inside PUBDIR a file named "help"; that's the
- file that will be sent to your guests whenever they ask for
- it. If there's no help, RNA will say "no help available" (you
- bet it).
-
- You may put inside PUBDIR a file named "index"; when someone
- asks for an index, RNA does an ls -log , greps out eventual
- "index" and "help" files, and appends -if existing- this file.
- Usually it should contain full descriptions of files,
- warnings, greetings or whatever.
-
- You need a dummy login entry for the mail, say "rnalib", and
- put an alias like " netlib rnalib " ;-) _
- Guests should send mail to this login, whose mailbox will be
- checked by RNA. Don't use root or other system accounts.
-
- Last but not least, go in /usr/lib/cron/crontabs and put an
- entry for executing RNA, say once every hour, or once a day.
- RNA starts, check if there's mail for it, and if there's
- nothing waiting it exits. No CPU load.
-
- For permissions: RNA wants to be owner of its working
- directory (of course), owner of it's own mail (of course) and
- able to go in usr/mail (/usr/spool/mail..) to cp and remove
- pending messages . RNA needs also PUBDIR to be readable.
-
- To configure RNA edit the program itself: at the beginning
- there's everything you need, and a comment for every variable,
- so it's really easy and would make this doc useless.
-
- Addendum: have a look at getmail() procedure: it set permissions
- as on my system, you may need to fit your own mail setup.
-
- ACCOUNTING
- ----------
- RNA keeps a log of its actions ( file "xxx" sent to "yyy" ),
- and also keep a copy of all mails, so that you'll always be
- able to go and see what happened.
-
- If you want a "debug" view of what RNA does, set DEBUG inside
- configuration: debug occurs as stdout, and won't affect
- default log file.
-
- SYNTAX
- ------
- RNA detects command lines by grepping out "@@" headers.
- Allowed syntax is in the form of:
-
- @@ [please] action argument [to] address
-
- where [please] and [to] (also To, to:, etc.) don't count;
- action is only "send" (or SEND etc.), and address is
- recognized in three forms:
-
- - UUCP address, containing a "!"
- - ARPA address, containing a "@"
- - local address
-
- UUCP and ARPA are checked to be made of at least two words
- (host and user..). In this case address is validated and
- passed to your mailer (its business then).
- Wildcards are not allowed. Security is accomplished by
- looking for "/" and similar chars.
-
- ARCHIVING
- ---------
- RNA recognizes non-ascii files by looking at file names. By
- default any file whose name contains:
-
- *.Z*
- *.z*
- *.tar*
- *.cpio*
- or NO "." at all
-
- will be considered non-ascii, and though uuencoded before
- mailing. Any file with other suffixes, such as .src, .any,
- .doc etc. will be left as-it-is. Remember that a file like
- "tetris", with no dots, will be uuencoded. If you want to
- change this behaviour, change the source, it's easy.
-
- COPYRIGHTS, AUTHOR'S NOTES ETC.ETC.
- -----------------------------------
-
- This is of course freeware, so i don't ask money for it and
- you can't ask money TO me for any trouble it may cause you.
-
- This software may be freely distributed provided you don't
- make money out of it. This means that EUNET sites are not
- allowed to use it without explicit request to myself.
-
- For a free EUropean CONnection
-
- Paolo Ventafridda, July 1989
-
- venta@altger.UUCP ({..}!altos86!altger!venta)
- venta@i2ack.UUCP (sublink/subnet/s.u.n.: EUcon networks only)
- {...}!ddsw1!deejay!i2ack!venta (USENET)
- desperation: pyramid!tmpmbx!deejay!i2ack!venta
-
- Don't send through mcvax/unido/i2unix since i am blacklisted,
- like all of the rest of EUcon.
-
-
- SHAR_EOF
- fi
- if test -f 'version'
- then
- echo shar: "will not over-write existing file 'version'"
- else
- cat << \SHAR_EOF > 'version'
- Version 1.0 july 1989
-
- If there's some feedback, i can easily add multiple public directories
- ( send file from dir to user@host )
- directory password protection
- ( send file from dir to user@host password= abcdefg )
- and finally sender address.
-
- SHAR_EOF
- fi
- if test -f 'RNA'
- then
- echo shar: "will not over-write existing file 'RNA'"
- else
- cat << \SHAR_EOF > 'RNA'
- :
- # Remote Network Archive version 1.0
- # by venta@i2ack.UUCP (EUcon)
- #
- # Before doing anything, Read the manual!
- #
- # ---------------------------------------------
- # setup these DEFines , and you are ready to go
- # ---------------------------------------------
- # Archive directory: this is were your archived files are stored.
- # All the stuff in/out going is merely taken here. Don't choose
- # other system dirs such as uucppublic.
- PUBDIR=/usr/spool/uucppublic/rna
- #
- # System directory: this is a dedicated directory for rna. System
- # files, log, and garbage will be put here. This directory will not
- # be public, and should be closed to others but root.
- WORKDIR=/usr/local/src/sendnews
- #
- # The login used as rna entry: tipically a dummy login, just to allow
- # mail spooling. Usually stuff like 'fserver', 'netserv', 'netlib' etc.
- LOGNAME=rnalib
- #
- # The local postmaster, i.e. the person which will eventually solve
- # remote users problems.
- # If you don't know what a Postmaster is, you are probably in the
- # wrong place. Put 'root' and go on, this is only a reference.
- POSTMASTER=root
- #
- # The mail file for LOGNAME, complete path. Usually:
- # /usr/spool/mail/$LOGNAME on Xenix systems
- # /usr/mail/$LOGNAME on Unix System V and BSD .
- MAIL=/usr/spool/mail/$LOGNAME
- #
- # The name of your machine, as of 'uname -n' or similar.. Hey, dont put
- # another one, use the correct local machine name. Don't cheat.
- UNAME=i2ack
- #
- # Name of the file containing all of rna logs, status etc.
- # also called "accounting"..
- LOGFILE=$WORKDIR/log
- #
- # Name of the file which is going to keep record of ALL incoming mails.
- # Sort of archive, needs to be cleaned up sometimes.
- MAILFILE=$WORKDIR/mail
- #
- # Debugging would occur on stdout, NOT on logfile
- # 1=debug (try it for fun once), nodebug= leave a SPACE, dont put a 0
- DEBUG=
- #
- # some progs never in the same place... please tell where they are
- MAILER=/bin/mail
- ENCODE=/usr/local/bin/uuencode
- #
- # --- internal variables ---
- TMP=$WORKDIR/tmp
- CMDS=$WORKDIR/tmpcmds
- CMDLOG=$WORKDIR/commlog
-
- # -------------------- some procedures... ----
- quit() {
- acc "shutdown requested"
- exit
- }
-
- acc() {
- echo "`date '+%d.%m.%y - %H:%M:%S` : $@" >>$LOGFILE
- test $DEBUG && echo "$@"
- }
-
- getmail() {
- rm $TMP 2>/dev/null
- mv $MAIL $TMP
- touch $MAIL; chown $LOGNAME $MAIL; chgrp mail $MAIL; chmod 620 $MAIL
- touch $MAILFILE; echo "`cat $TMP`\n===\n" >>$MAILFILE
- }
-
- clrfiles() {
- rm -f $CMDLOG 2>/dev/null; touch $CMDLOG
- rm -f $CMDS 2>/dev/null
- }
-
-
-
- parse() {
-
- # some pre-parsing for naughty characters..
- grep @@ $TMP | sed 's/\*/ERR/g' >$CMDS
-
- if test -s $CMDS; then
- set `wc -l $CMDS`; cmds=$1
- acc "mail contains $cmds command line(s)"
-
- test $DEBUG && echo "start parsing"
- strings="`cat $CMDS`"
- set -f $strings
- test $DEBUG && echo "$# words"
- #
- # main parse loop
- #
- error=0; position=0; action=""; argument=""; destination=""
- #
- while [ "$1" != "" ]
- do
- test $DEBUG && echo "parsing: $1"
- case $1 in
- @@)
- test $DEBUG && echo restart found
- action=""; argument=""; position=0; destination=""
- shift;;
-
- ERR)
- ( acc "parser: wildcards error" )
- error=1;;
-
- [sS][eE][nN][dD]|[sS][eE][nN][Dd]:)
- test $DEBUG && echo send detected
- if test $position -eq 0
- then
- action=send; position=1;
- shift
- if test -z "$1"
- then
- error=1;
- test $DEBUG && echo "eof while arg in send"
- else
- argument=$1; position=2
- shift
- fi
- else
- error=1;
- test $DEBUG && echo send is in wrong position
- fi;;
-
-
- [tT][Oo]|[tT][oO]:)
- test $DEBUG && echo to detected
- if test $position -eq 2
- then
- shift
- else
- test $DEBUG && echo to is in wrong position
- error=1
- fi;;
-
- *[Pp]lease*)
- test $DEBUG && echo please detected
- if test $position -eq 0 -o $position -eq 2
- then
- shift
- test $DEBUG && echo please shifted
- else
- test $DEBUG && echo error please
- error=1
- fi;;
-
-
- *)
- if test $position -eq 2
- then
- destination=$1; position=3
- shift
- else
- test $DEBUG && echo unknown
- error=1
- fi;;
- esac
-
- if test $error -gt 0
- then
- test $DEBUG && echo recovering error
- while [ "$1" != "@@" ]
- do
- test -z "$1" && test $DEBUG && echo eof detected while recovering error
- test -z "$1" && break
- shift
- done
- error=0
- test $DEBUG && echo end rewind
- fi
- test $DEBUG && echo action=$action argument=$argument dest=$destination
-
- if test $position -eq 3
- then
- ( acc "parser: $action ($argument) to: ($destination)" )
- echo $action $argument $destination >>$CMDLOG
-
- position=0; argument=""; destination="";
- fi
-
-
- # end while
- done
- test $DEBUG && echo EOF
- else
- acc "parser: no command lines found"
- fi
-
- }
-
- interp() {
-
- if test -s $CMDLOG; then
- set `wc -l $CMDLOG`; cmds=$1
- ( acc "interpreter: found $cmds command line(s)" )
-
-
- strings="`cat $CMDLOG`"
- set -f $strings
- test $DEBUG && echo "$# words"
- #
- # main loop
- #
- while [ "$1" != "" ]
- do
- test $DEBUG && echo "parsing: $1"
- #
- action=""; argument=""; destination=""
- case $1 in
-
- help)
- action=send
- shift; shift
- argument=help
- destination=$1;;
-
- send)
- action=send
- shift; argument=$1
- shift; destination=$1;;
-
- *)
- ( acc "interpreter error: token $1" )
- shift; shift;;
-
- esac
-
- test $DEBUG && echo "ACTION=$action, ARG=$argument, DEST=$destination"
-
- # first we parse destination: if it's illegal, we dont waste
- # time parsing the argument
- if test `echo $destination | grep @`
- then
- test $DEBUG && echo arpa address
- if [ `echo $destination | sed 's/@/ /g' | wc -w` -eq 2 ]; then
- destype=ARPA
- test $DEBUG && echo valid arpa address
- else
- ( acc "interpreter: wrong arpa address \"$destination\" " )
- destination=UNKNOWN
- fi
- elif test `echo $destination | grep !`
- then
- echo UUCP address
- if [ `echo $destination | sed 's/!/ /g' | wc -w` -ge 2 ]; then
- test $DEBUG && echo valid uucp address
- destype=UUCP
- else
- ( acc "interpreter: wrong uucp address \"$destination\" " )
- destination=UNKNOWN
- fi
- else
- test $DEBUG && echo local delivery
- destype=LOCAL
- fi
-
- test $DEBUG && echo "status: dest=$destination , arg=$argument , destype=$destype"
-
- if test $destination != "UNKNOWN"; then
- # now we check if argument is valid
- test $DEBUG && echo destination OK
- if test "$argument" = "ERR"; then
- test $DEBUG && echo ERR detected in argument
- errarg="argument field contains wild characters"
- argument=ERROR
- elif test `echo $argument | grep /`; then
- test $DEBUG && echo ILLEGAL ARG
- errarg="\"$argument\" is not a valid argument"
- ( acc "interpreter: $errarg denied to $destination" )
- argument=ERROR
- elif test -r $PUBDIR/$argument; then
- test $DEBUG && echo FILE $argument is ok
- ( acc "mailer: sending $argument to $destination" )
- errarg=NONE
- elif test "$argument" = "index"; then
- test $DEBUG && echo this is an index request but no verbose index available
- argument=index
- else
- test $DEBUG && echo nonexistent $argument
- errarg="\"$argument\" is not available"
- ( acc "interpreter: $errarg for $destination" )
- argument=ERROR
- fi
-
- # now we ship the stuff .
-
- ( echo "Subject: RNA mail from $UNAME"; echo
- echo ""
- echo "This is the RNA output for a request destinated to you."
- echo "Binary files have been uuencoded to an ASCII format."
- echo
- if test "$errarg" != "NONE"; then
- echo "Error: $errarg"
-
- echo
- echo "For more details on this RNA delivery please mail ${POSTMASTER}@${UNAME}."
- echo "If you need help on the RNA remote commands and usage, send mail"
- echo "to ${LOGNAME}@$UNAME containing: @@ send help to yourname@yourhost"
- echo
-
- else
-
- echo "RNA request: $action \"$argument\" to: \"$destination\" ($destype)"
- echo
- if test "$argument" = "index"; then
- echo; echo "List of available files at $UNAME :"; echo
- ( set `ls -l $PUBDIR | wc -l`;
- ls -log $PUBDIR | tail -`expr $1 - 1` | grep -v help | grep -v index )
-
- if test -r $PUBDIR/$argument; then
- echo; cat $PUBDIR/$argument
- fi
- elif test "$argument" = "help"; then
- echo;
- if test -r $PUBDIR/$argument; then
- echo; cat $PUBDIR/$argument
- else
- echo "Sorry no help available"
- ( acc "no help file in public directory" )
- fi
- else
- # some rules for detecting non-ascii data.
- ready=""
- if test `echo $argument | grep '\.Z'` ; then
- noready="compressed file"
- elif test `echo $argument | grep '\.z'`; then
- noready="crypted file"
- elif test `echo $argument | grep '\.tar'`; then
- noready="tar file"
- elif test `echo $argument | grep '\.cpio'`; then
- noready="cpio file"
- elif test ! "`echo $argument | grep '\.'`"; then
- noready="program file"
- else
- noready="ascii file"
- ready=OK
- fi
-
- echo "( $noready )"
- echo
- echo "+------ cut start of $argument ----------------------------------+"
- if test $ready ; then
- cat $PUBDIR/$argument
- else
- $ENCODE $PUBDIR/$argument $argument
- ( acc "encoding $noready" )
- fi
- echo "+------ cut end of $argument ----------------------------------+"
- echo;
- fi
- fi
- ) | $MAILER $destination
- #
-
- fi
-
- shift
-
- # end while
- done
- #echo EOF
- else
- ( acc "interpreter: no valid commands found" )
- fi
-
-
- }
-
- # -----------------------------------
- # main program
- # -----------------------------------
- touch $LOGFILE
- test -r $WORKDIR/shutdown && quit
- test -s $MAIL && ( acc "found mail";
- clrfiles; getmail;
- parse; interp )
-
- # end of RNA
- SHAR_EOF
- fi
- exit 0
- # End of shell archive
- --
- Paolo Ventafridda, Milano -Italy _ Sublink (EUcon): venta@i2ack.UUCP ****
- **** The SUBLINK Foundation _ +39-2-4035289 (300-2400 MNP4, 9600 PEP)
- . For a free EUropean CONnection .
-
-
-