#! /bin/sh # fixscript will replace this line with code to load innshellvars # @(#) $Id: actsyncd.in 6490 2003-10-18 05:49:04Z rra $ # @(#) Under RCS control in /usr/local/news/src/inn/local/RCS/actsyncd.sh,v # # actsyncd - actsync daemon # # usage: # actsyncd [-x] config_file [debug_level [debug_outfmt]] # # -x xexec instead of reload # config_file name of file used to determine how to run actsync # debug_level force no action and use -v debug_level # debug_outfmt change -o a1 output to -o debug_outfmt for debug # By: Landon Curt Noll chongo@toad.com (chongo was here /\../\) # # Copyright (c) Landon Curt Noll, 1993. # All rights reserved. # # Permission to use and modify is hereby granted so long as this # notice remains. Use at your own risk. No warranty is implied. # preset vars # # Our lock file LOCK="${LOCKS}/LOCK.actsyncd" # where actsync is located ACTSYNC="${PATHBIN}/actsync" # exit value of actsync if unable to get an active file NOSYNC=127 # parse args # if [ $# -gt 1 ]; then case $1 in -x|-r) shift ;; # no longer relevant esac fi case $# in 1) cfg="$1"; DEBUG=; DEBUG_FMT=; ;; 2) cfg="$1"; DEBUG="$2"; DEBUG_FMT=; ;; 3) cfg="$1"; DEBUG="$2"; DEBUG_FMT="$3"; ;; *) echo "usage: $0 [-x] config_file [debug_level [debug_outfmt]]" 1>&2; exit 1 ;; esac if [ ! -s "$cfg" ]; then echo "$0: config_file not found or empty: $ign" 1>&2 exit 2 fi # parse config_file # host="`sed -n -e 's/^host=[ ]*//p' $cfg | tail -1`" if [ -z "$host" ]; then echo "$0: no host specified in $cfg" 1>&2 exit 3 fi flags="`sed -n -e 's/^flags=[ ]*//p' $cfg | tail -1`" if [ -z "$flags" ]; then echo "$0: no flags specified in $cfg" 1>&2 exit 4 fi ign="`sed -n -e 's/^ignore_file=[ ]*//p' $cfg | tail -1`" if [ -z "$ign" ]; then echo "$0: no ignore file specified in $cfg" 1>&2 exit 5 fi ftp="`sed -n -e 's/^ftppath=[ ]*//p' $cfg | tail -1`" spool="`sed -n -e 's/^spool=[ ]*//p' $cfg | tail -1`" if [ -z "$spool" ]; then spool=$SPOOL #echo "$0: no spool directory specified in $cfg" 1>&2 #exit 6 fi if [ ! -f "$ign" ]; then ign="${PATHETC}/$ign" fi if [ ! -s "$ign" ]; then echo "$0: ignore_file not found or empty: $ign" 1>&2 exit 7 fi # force -o c mode (overrides any -o argument in the command line) # if [ -z "$DEBUG" ]; then # standard actsyncd output mode flags="$flags -o c" # DEBUG processing, if debug_level was given # else if [ ! -z "$ftp" ]; then echo "$0: cannot use DEBUG mode with ftp (yet)" >&2 exit 88; fi # force -v level as needed flags="$flags -v $DEBUG" # force -o level but reject -o x modes if [ ! -z "$DEBUG_FMT" ]; then case "$DEBUG_FMT" in x*) echo "$0: do not use any of the -o x debug_outfmt modes!" 1>&2; exit 8 ;; *) flags="$flags -o $DEBUG_FMT" ;; esac fi # execute actsync directly echo "DEBUG: will execute $ACTSYNC -i $ign $flags $host" 1>&2 eval "$ACTSYNC -i $ign $flags $host" status="$?" echo "DEBUG: exit status $status" 1>&2 exit "$status" fi # Lock out others # shlock -p $$ -f "${LOCK}" || { echo "$0: Locked by `cat '${LOCK}'`" 1>&2 exit 9 } # setup # origdir=`pwd` workdir="${TMPDIR}/actsyncd" ctlinndcmds="cc_commands" out="sync.msg" cleanup="$SED -e 's/^/ /' < $out; cd ${origdir}; rm -rf '$workdir' '$LOCK'" trap "eval $cleanup; exit 123" 1 2 3 15 set -e rm -rf "$workdir" mkdir "$workdir" cd "$workdir" set +e rm -f "$out" touch "$out" chmod 0644 "$out" # try to sync # # Try to sync off of the host. If unable to connect/sync then retry # up to 9 more times waiting 6 minutes between each try. # echo "=-= `date` for $host" >>$out 2>&1 for loop in 1 2 3 4 5 6 7 8 9 10; do # get the active file to compare against status=0 case $host in /*) cp $host active; status=$? ;; .*) cp $origdir/$host active; status=$? ;; *) if [ -z "$ftp" ]; then port=`expr "$host" : '.*:\(.*\)'` if [ -n "$port" ]; then port="-p $port" host=`expr "$host" : '\(.*\):.*'` fi echo "getlist -h $host $port" >>$out if getlist -h $host $port > active 2>>$out; then : else status=$NOSYNC fi else echo "$GETFTP ftp://$host/$ftp" >>$out $GETFTP ftp://$host/$ftp >>$out 2>&1 status=$? if [ "$status" -ne 0 ]; then status=$NOSYNC else case "$ftp" in *.gz) echo "$GZIP -d active" >>$out if $GZIP -d active >>$out 2>&1; then : else status=1 fi ;; *.Z) echo "$UNCOMPRESS active" >>$out if $UNCOMPRESS active >>$out 2>&1; then : else status=1 fi ;; esac fi fi ;; esac if [ "$status" -ne "$NOSYNC" ]; then # detect bad status # if [ "$status" -ne 0 ]; then echo "FATAL: `date` for $host exit $status" >>$out eval $cleanup exit "$status" fi echo "$ACTSYNC -i $ign $flags ./active" >>$out eval "$ACTSYNC -i $ign $flags ./active >$ctlinndcmds 2>>$out" if [ $? -ne 0 ]; then echo "FATAL: `date` for $host actsync balked" >>$out eval $cleanup exit $? fi if [ ! -s $ctlinndcmds ]; then echo "No changes need to be made" >>$out else echo "=-= `date` for $host, updating active" >>$out echo "mod-active $ctlinndcmds" >>$out mod-active $ctlinndcmds >>$out 2>&1 if [ $? -ne 0 ]; then echo "FATAL: `date` for $host mod-active FAILED" >>$out eval $cleanup exit 1 fi fi # normal exit - all done # echo "=-= `date` for $host, end" >>$out eval $cleanup exit 0 fi # failed to get the remote active file echo "=-= `date` for $host failed to connect/sync, retrying" >>$out # wait 6 minutes # sleep 360 done # give up # echo "FATAL: `date` for $host failed to connect/sync 10 times" >>$out 2>&1 eval $cleanup exit 1