Path: utzoo!utgpu!news-server.csri.toronto.edu!cs.utexas.edu!swrinde!zaphod.mps.ohio-state.edu!julius.cs.uiuc.edu!apple!olivea!tymix!romana!jms From: jms@romana.Tymnet.COM (Joe Smith) Newsgroups: comp.unix.admin Subject: Re: problems with rdist Summary: More wishes Message-ID: <1291@romana.Tymnet.COM> Date: 17 Oct 90 01:21:07 GMT References: <107196@convex.convex.com> Reply-To: jms@tardis.Tymnet.COM (Joe Smith) Organization: BT Tymnet, San Jose, CA Lines: 118 To add to the list of things that rdist does not do for me: *) No bidirectional younger copy. If remote file is newer, I want it copied to the master. (See enclosed script for a fix.) *) Complains about remote directory having the wrong permissions instead of fixing. (See enclosed script for a fix.) *) If sending selected files from wildcarded directories, (such as "/home/delta/*/{.login,.cshrc}"), it does not create missing directories. (See enclosed script for a fix.) *) When output is redirected to a file, rdist does not flush the buffers after each file, and stdio buffers up 8K bytes of output. This means that "tail -f logfile" cannot be used to monitor the progress in realtime. (I don't have the sources to rdist to fix this.) *) Changes to the owner, group, or mode of a file are not propagated to the remote system unless the date (or checksum) of the file changes. (I don't have the sources to rdist to fix this.) ----------%<-------- cut here for "fix-warnings" --------->%---------- #!/bin/sh # Problems in the rdist procedure are located and fixed. # In particular, wrong protection on directories and "remote file is newer". cmds=/tmp/fix-warnings$$.1 warn=/tmp/fix-warnings$$.2 localhost=`hostname` # The log from rdist is piped into this script as stdin. # Typical use is: # (echo; echo -n "==$$== --- starting $0 $*"; date) >>$logfile # rdist -y -c some files to remotehost >>$logfile # sed "1,/=$$=/D" $logfile | /etc/rdist/fix-warnings >>$logfile # Where the use of =$$= is to select only messages from this run. egrep "Warning|host|directory" | sed 's/:/ /g' >$warn # keep only good stuff sendcommands() { if [ -s $cmds ]; then # check if size of file is nonzero echo; echo " Commands to be executed on $remotehost:" cat $cmds # list the chmod commands here fi if [ "$newfiles" != "" ]; then # add "rdist" to list of commands echo "remotehost=$remotehost" >>$cmds echo 'echo -n "$remotehost - "' >>$cmds # rdist says "updating host" echo "rdist -y -c $newfiles $localhost" >>$cmds echo 'echo -n "$remotehost - ";date' >>$cmds fi if [ -s $cmds ]; then echo rsh $remotehost /bin/sh <$cmds # do chmod or mkdir as needed echo : >$cmds # zero out the file fi if [ "$dirfiles" != "" ]; then # parent directory was missing rdist -y -c $dirfiles $remotehost # try sending file again fi } : >$cmds remotehost="$1" newfiles="" dirfiles="" fixed="" # Get rid of extra stuff (such as a timestamp I put) in front of rdist's # "updating host" message so that the name of the remote host can be found. sed -e 's/^.*updating host/updating host/' $warn | \ (while read x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 do #"updating host boomer" if [ "$x1 $x2" = "updating host" ]; then if sendcommands; then hosts="$hosts $remotehost"; fi # previous host remotehost=$x3 # remember name of remote host newfiles="" # reset list of newer files dirfiles="" # and list of files missing parent dirs fi #"/home/gemini/some/dir: Warning: remote mode 775 != local mode 2775" if [ "$x3 $x4" = "remote mode" ]; then sgid=`expr $x9 - $x5` if [ "$sgid" = "2000" ]; then x9="g+s"; fi if [ "$sgid" = "-2000" ]; then x9="g-s"; fi echo "chmod $x9 $x1" >>$cmds # rdist should do this itself! fixed=yes fi #"Warning: /mnt/xd4h/2/02042/c00.log: remote copy is newer" if [ "$x5 $x6" = "is newer" ]; then newfiles="$newfiles $x2" fixed=yes fi #"rdist: boomer:/tym/7/07000/rdista08190: No such file or directory" if [ "$x4 $x5 $x8" = "No such directory" ]; then missingdir=`dirname $x3` dup=no for dir in $dirfiles do if [ $missingdir = $dir ]; then dup=yes; fi done if [ $dup = no ]; then # Assume that just one directory is missing. This will create it. rdist -c $missingdir $remotehost # create dir, right owner.group, mode # But if more than one directory is missing, "mkdir -p" creates them all. echo "mkdir -p $missingdir" >>$cmds dirfiles="$dirfiles $missingdir" # double check for dir being updated fi fi done sendcommands # do last (or only) host #if [ "$fixed" = "" ]; then echo "$0: no warnings"; fi ) rm $cmds $warn #[End of /etc/rdist/fix-warnings]# -- Joe Smith (408)922-6220 | SMTP: jms@tardis.tymnet.com or jms@gemini.tymnet.com BT Tymnet Tech Services | UUCP: ...!{ames,pyramid}!oliveb!tymix!tardis!jms PO Box 49019, MS-C41 | BIX: smithjoe | 12 PDP-10s still running! "POPJ P," San Jose, CA 95161-9019 | humorous dislaimer: "My Amiga 3000 speaks for me."