#! /bin/sh # @(#)util/savelog.sh 1.4 26 Oct 1991 22:49:39 # # savelog - save a log file # # Copyright (C) 1987, 1988 Ronald S. Karr and Landon Curt Noll # # See the file COPYING, distributed with smail, for restriction # and warranty information. # # usage: savelog [-m mode] [-u user] [-g group] [-t] [-c cycle] [-l] file... # # -m mode - chmod log files to mode # -u user - chown log files to user # -g group - chgrp log files to group # -c cycle - save cycle versions of the logfile (default: 7) # -t - touch file # -l - don't compress any log files (default: compress) # file - log file names # # The savelog command saves and optionally compresses old copies of files # into an 'dir'/OLD sub-directory. The 'dir' directory is determined from # the directory of each 'file'. # # Older version of 'file' are named: # # OLD/'file'. # # where is the version number, 0 being the newest. By default, # version numbers > 0 are compressed (unless -l prevents it). The # version number 0 is never compressed on the off chance that a process # still has 'file' opened for I/O. # # If the 'file' does not exist or if it is zero length, no further processing # is performed. However if -t was also given, it will be created. # # For files that do exist and have lengths greater than zero, the following # actions are performed. # # 1) Version numered files are cycled. That is version 6 is moved to # version 7, version is moved to becomes version 6, ... and finally # version 0 is moved to version 1. Both compressed names and # uncompressed names are cycled, regardless of -t. Missing version # files are ignored. # # 2) The new OLD/file.1 is compressed and is changed subject to # the -m, -u and -g flags. This step is skipped if the -t flag # was given. # # 3) The main file is moved to OLD/file.0. # # 4) If the -m, -u, -g or -t flags are given, then file is created # (as an empty file) subject to the given flags. # # 5) The new OLD/file.0 is chanegd subject to the -m, -u and -g flags. # # Note: If the OLD sub-directory does not exist, it will be created # with mode 0755. # # Note: If no -m, -u or -g flag is given, then the primary log file is # not created. # # Note: Since the version numbers start with 0, version number # is never formed. The count must be at least 2. # # Bugs: If a process is still writing to the file.0 and savelog # moved it to file.1 and compresses it, data could be lost. # Smail does not have this problem in general because it # restats files often. # common location PATH="X_UTIL_PATH_X:X_SECURE_PATH_X"; export PATH COMPRESS="X_COMPRESS_X" COMP_FLAG="X_COMP_FLAG_X" DOT_Z="X_DOT_Z_X" CHOWN="X_CHOWN_X" GETOPT="X_UTIL_BIN_DIR_X/getopt" # parse args exitcode=0 # no problems to far prog=$0 mode= user= group= touch= count=7 set -- `$GETOPT m:u:g:c:lt $*` if [ $# -eq 0 -o $? -ne 0 ]; then echo "usage: $prog [-m mode][-u user][-g group][-t][-c cycle][-l] file ..." 1>&2 exit 1 fi for i in $*; do case $i in -m) mode=$2; shift 2;; -u) user=$2; shift 2;; -g) group=$2; shift 2;; -c) count=$2; shift 2;; -t) touch=1; shift;; -l) COMPRESS=""; shift;; --) shift; break;; esac done if [ "$count" -lt 2 ]; then echo "$prog: count must be at least 2" 1>&2 exit 2 fi # cycle thru filenames while [ $# -gt 0 ]; do # get the filename filename=$1 shift # catch bogus files if [ -b "$filename" -o -c "$filename" -o -d "$filename" ]; then echo "$prog: $filename is not a regular file" 1>&2 exitcode=3 continue fi # if not a file or empty, do nothing major if [ ! -s $filename ]; then # if -t was given and it does not exist, create it if [ ! -z "$touch" -a ! -f $filename ]; then touch $filename if [ "$?" -ne 0 ]; then echo "$prog: could not touch $filename" 1>&2 exitcode=4 continue fi if [ ! -z "$user" ]; then $CHOWN $user $filename fi if [ ! -z "$group" ]; then chgrp $group $filename fi if [ ! -z "$mode" ]; then chmod $mode $filename fi fi continue fi # be sure that the savedir exists and is writable savedir=`expr "$filename" : '\(.*\)/'` if [ -z "$savedir" ]; then savedir=./OLD else savedir=$savedir/OLD fi if [ ! -s $savedir ]; then mkdir $savedir if [ "$?" -ne 0 ]; then echo "$prog: could not mkdir $savedir" 1>&2 exitcode=5 continue fi chmod 0755 $savedir fi if [ ! -d $savedir ]; then echo "$prog: $savedir is not a directory" 1>&2 exitcode=6 continue fi if [ ! -w $savedir ]; then echo "$prog: directory $savedir is not writable" 1>&2 exitcode=7 continue fi # deterine our uncompressed file names newname=`expr "$filename" : '.*/\(.*\)'` if [ -z "$newname" ]; then newname=$savedir/$filename else newname=$savedir/$newname fi # cycle the old compressed log files cycle=`expr $count - 1` rm -f $newname.$cycle $newname.$cycle$DOT_Z while [ "$cycle" -gt 1 ]; do # --cycle oldcycle=$cycle cycle=`expr $cycle - 1` # cycle log if [ -f $newname.$cycle$DOT_Z ]; then mv -f $newname.$cycle$DOT_Z $newname.$oldcycle$DOT_Z fi if [ -f $newname.$cycle ]; then # file was not compressed for some reason move it anyway mv -f $newname.$cycle $newname.$oldcycle fi done # compress the old uncompressed log if needed if [ -f $newname.0 ]; then if [ -z "$COMPRESS" ]; then newfile=$newname.1 mv $newname.0 $newfile else newfile=$newname.1$DOT_Z $COMPRESS $COMP_FLAG < $newname.0 > $newfile rm -f $newname.0 fi if [ ! -z "$user" ]; then $CHOWN $user $newfile fi if [ ! -z "$group" ]; then chgrp $group $newfile fi if [ ! -z "$mode" ]; then chmod $mode $newfile fi fi # move the file into the file.0 holding place mv -f $filename $newname.0 # replace file if needed if [ ! -z "$touch" -o ! -z "$user" -o \ ! -z "$group" -o ! -z "$mode" ]; then touch $filename fi if [ ! -z "$user" ]; then $CHOWN $user $filename fi if [ ! -z "$group" ]; then chgrp $group $filename fi if [ ! -z "$mode" ]; then chmod $mode $filename fi # fix the permissions on the holding place file.0 file if [ ! -z "$user" ]; then $CHOWN $user $newname.0 fi if [ ! -z "$group" ]; then chgrp $group $newname.0 fi if [ ! -z "$mode" ]; then chmod $mode $newname.0 fi done exit $exitcode