joe@auspyr.UUCP (Joe Angelo) (07/11/87)
[[ sent to alt.sources, comp.sources.unix ]] This is the sort of thing we aren't likely to see (anymore) in a moderated news group... [[ no, I'm not trying to start anything!! ]] ------------------------------------------------------------------------- echo >/dev/null ' I have seen lots of requests for a recursive UUCP script; most of which generate a "uucp" command line at the end of a "find"; ei: find -exec uucp. Yukky and boring. Well, my method is not much better. The attached script will generate a C. file for the remote system and place it in the UUCP queque dirs (if permissions provide, otherwise, the file is saved elsewhere; like /tmp). The script works for V7, BSD, and HoneyDanber UUCP since the format of C. files is exactly the same; even the name is VERY similar. The only problem might be that some systems use a 5 character instead of a 6 character UUCP ID string in the name of the C. file; it is easy to fix if you have one of these systems -- look for the sick sed line. There are some problems expanding .. and ../../../../.., but what the heck -- this script was mostly designed for internal xfer of large directories of source code and was found to be quite useful. Any/all suggestions/warnings/impeachments welcome... -- "Need input. Joe Angelo, Sr. Sys. Engineer @ Austec, Inc., San Jose, CA. More input. ARPA: auspyr!joe@lll-tis[-b].arpa PHONE: [408] 279-5533 Ahhh, input!" UUCP: {sdencore,cbosgd,ptsfa,dana}!aussjo!joe UUCP: {amdahl,lll-tis,imagen,necntc,dlb,sci,altnet}!auspyr!joe ' # uuqr -- takes file name list from stdin or args (via find) and generates # a C. file for uucp in the name of the remote system. # # usage: # # uuqr [dirs] system!directory # # examples: # # uuqr /tmp anysystem! xfer all in /tmp to anysystem!~nuucp/tmp/ # uuqr /tmp anysystem!/foo xfer all in /tmp to anysystem!/foo/tmp # uuqr /tmp anysystem!/ xfer all in /tmp to anysystem!/tmp # uuqr . anysystem!/duplicate xfer all in . to anysystem!/duplicate # # uuqr anysystem xfer all f-names from stdin to anysystem!~nuucp # uuqr anysystem!/tmp xfer all f-namme from stdin to anysystem!/tmp case $# in 0) echo Usage: $0 '[dirs] system!directory Where: dirs is a find(1) dir_name or nothing to denote that file name list comes from standard input' exit ;; esac # # UUCP queue organization # # Set TYPE to: If: # LINEAR /usr/spool/uucp contains FILES in form of C.*, D.*, X.*. # SUBDIRS /usr/spool/uucp contains DIRS in form of C. D. X., D.hostname. # HONEYBABY /usr/spool/uucp contains DIRS for each remote host. TYPE=HONEYBABY TYPE=LINEAR TYPE=SUBDIRS PWD=`pwd` DIR=/usr/spool/uucppublic # # USER=$LOGNAME if SYSV # USER=$USER for arg in $* do case "$arg" in *!*) HOST=`echo "$arg" | cut -d! -f1` XDIR=`echo "$arg" | cut -d! -f2` DIR=`echo $XDIR | awk ' { if( substr($1,1,1) != "/" ) printf("/usr/spool/uucppublic/%s\n", $1) else printf("%s\n", $1) }'` ;; *) LIST="$LIST $arg" ;; esac done # # generate the directory name to store the file into # SPOOLDIR=/usr/spool/uucp case "$TYPE" in HONEYBABY) SPOOLDIR="/usr/spool/uucp/$HOST" if test ! -d $SPOOLDIR then mkdir $SPOOLDIR 1>/dev/null 2>&1 fi ;; LINEAR) SPOOLDIR="/usr/spool/uucp" ;; SUBDIRS) SPOOLDIR="/usr/spool/uucp/C." ;; esac OLDPLACE=$SPOOLDIR # # make sure spool dir exists # DIDERROR=/bin/false if test ! -d "$SPOOLDIR" then echo $0: spool dir non existant, output saved elsewhere... DIDERROR=/bin/true SPOOLDIR=/tmp fi # # make sure we can write to the spool dir, # most portable way is to echo something into a file there; test -w nonstandard # echo neat_stuff > /tmp/WAMMO$$ if cp /tmp/WAMMO$$ $SPOOLDIR/WAMMO$$ 1>/dev/null 2>&1 then neat=yup else echo $0: can not write to spooldir, output saved elsewere... DIDERROR=/bin/true SPOOLDIR=/tmp fi rm -f /tmp/WAMMO$$ $SPOOLDIR/WAMMO$$ # # generate the hostname part of the C. file... # usually 6 characters only -- change for more or less. # HOSTPART=`echo $HOST | sed 's/^\(......\)\(.*\)/\1/'` # # generate a UNIQ ID string # STILLWORKING=/bin/true tmpid=$$ while $STILLWORKING do # edit below if you have 6 character UUCP ids and not 5... UUCP_ID=`echo $tmpid | sed ' s/^\([0-9][0-9][0-9][0-9]\)$/A\1/ s/^\([0-9][0-9][0-9]\)$/AA\1/ s/^\([0-9][0-9]\)$/AAA\1/ s/^\([0-9]\)$/AAAA\1/'` CFILE=$SPOOLDIR/C.$HOSTPART$UUCP_ID if test ! -f $CFILE then break fi tmpid=`expr $tmpid + 1` done echo $0: saving output in $CFILE # # is filename list from args or stdin? # ( if test ! -s "$LIST" then find $LIST -type f -print else echo stdin while read FILENAME do echo $FILENAME done fi ) | awk ' { # convert relative to absolute. # keep absolute as is. if( substr($1,1,1) != "/" ) name="'$PWD'/"$1 else name=$1 printf("S %s '$DIR'/%s '$USER' -dc D.0 777\n", name, $1); }' | tr -s '/' > $CFILE if $DIRERROR then echo $0: someday, you should move $CFILE to $OLDPLACE else echo $0: $CFILE ready, now call the remote system... fi -- "Need input. Joe Angelo, Sr. Sys. Engineer @ Austec, Inc., San Jose, CA. More input. ARPA: auspyr!joe@lll-tis[-b].arpa PHONE: [408] 279-5533 Ahhh, input!" UUCP: {sdencore,cbosgd,ptsfa,dana}!aussjo!joe UUCP: {amdahl,lll-tis,imagen,necntc,dlb,sci,altnet}!auspyr!joe