aboutsummaryrefslogtreecommitdiff
path: root/gnu/libexec/uucp/contrib/savelog.sh
diff options
context:
space:
mode:
Diffstat (limited to 'gnu/libexec/uucp/contrib/savelog.sh')
-rwxr-xr-xgnu/libexec/uucp/contrib/savelog.sh247
1 files changed, 247 insertions, 0 deletions
diff --git a/gnu/libexec/uucp/contrib/savelog.sh b/gnu/libexec/uucp/contrib/savelog.sh
new file mode 100755
index 000000000000..64c989f292b2
--- /dev/null
+++ b/gnu/libexec/uucp/contrib/savelog.sh
@@ -0,0 +1,247 @@
+#! /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'.<number><compress_suffix>
+#
+# where <number> 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 <cycle>
+# is never formed. The <cycle> 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