|
|
1.1 ! root 1: #! /bin/sh ! 2: # @(#)util/savelog.sh 1.4 26 Oct 1991 22:49:39 ! 3: # ! 4: # savelog - save a log file ! 5: # ! 6: # Copyright (C) 1987, 1988 Ronald S. Karr and Landon Curt Noll ! 7: # ! 8: # See the file COPYING, distributed with smail, for restriction ! 9: # and warranty information. ! 10: # ! 11: # usage: savelog [-m mode] [-u user] [-g group] [-t] [-c cycle] [-l] file... ! 12: # ! 13: # -m mode - chmod log files to mode ! 14: # -u user - chown log files to user ! 15: # -g group - chgrp log files to group ! 16: # -c cycle - save cycle versions of the logfile (default: 7) ! 17: # -t - touch file ! 18: # -l - don't compress any log files (default: compress) ! 19: # file - log file names ! 20: # ! 21: # The savelog command saves and optionally compresses old copies of files ! 22: # into an 'dir'/OLD sub-directory. The 'dir' directory is determined from ! 23: # the directory of each 'file'. ! 24: # ! 25: # Older version of 'file' are named: ! 26: # ! 27: # OLD/'file'.<number><compress_suffix> ! 28: # ! 29: # where <number> is the version number, 0 being the newest. By default, ! 30: # version numbers > 0 are compressed (unless -l prevents it). The ! 31: # version number 0 is never compressed on the off chance that a process ! 32: # still has 'file' opened for I/O. ! 33: # ! 34: # If the 'file' does not exist or if it is zero length, no further processing ! 35: # is performed. However if -t was also given, it will be created. ! 36: # ! 37: # For files that do exist and have lengths greater than zero, the following ! 38: # actions are performed. ! 39: # ! 40: # 1) Version numered files are cycled. That is version 6 is moved to ! 41: # version 7, version is moved to becomes version 6, ... and finally ! 42: # version 0 is moved to version 1. Both compressed names and ! 43: # uncompressed names are cycled, regardless of -t. Missing version ! 44: # files are ignored. ! 45: # ! 46: # 2) The new OLD/file.1 is compressed and is changed subject to ! 47: # the -m, -u and -g flags. This step is skipped if the -t flag ! 48: # was given. ! 49: # ! 50: # 3) The main file is moved to OLD/file.0. ! 51: # ! 52: # 4) If the -m, -u, -g or -t flags are given, then file is created ! 53: # (as an empty file) subject to the given flags. ! 54: # ! 55: # 5) The new OLD/file.0 is chanegd subject to the -m, -u and -g flags. ! 56: # ! 57: # Note: If the OLD sub-directory does not exist, it will be created ! 58: # with mode 0755. ! 59: # ! 60: # Note: If no -m, -u or -g flag is given, then the primary log file is ! 61: # not created. ! 62: # ! 63: # Note: Since the version numbers start with 0, version number <cycle> ! 64: # is never formed. The <cycle> count must be at least 2. ! 65: # ! 66: # Bugs: If a process is still writing to the file.0 and savelog ! 67: # moved it to file.1 and compresses it, data could be lost. ! 68: # Smail does not have this problem in general because it ! 69: # restats files often. ! 70: ! 71: # common location ! 72: PATH="X_UTIL_PATH_X:X_SECURE_PATH_X"; export PATH ! 73: COMPRESS="X_COMPRESS_X" ! 74: COMP_FLAG="X_COMP_FLAG_X" ! 75: DOT_Z="X_DOT_Z_X" ! 76: CHOWN="X_CHOWN_X" ! 77: GETOPT="X_UTIL_BIN_DIR_X/getopt" ! 78: ! 79: # parse args ! 80: exitcode=0 # no problems to far ! 81: prog=$0 ! 82: mode= ! 83: user= ! 84: group= ! 85: touch= ! 86: count=7 ! 87: set -- `$GETOPT m:u:g:c:lt $*` ! 88: if [ $# -eq 0 -o $? -ne 0 ]; then ! 89: echo "usage: $prog [-m mode][-u user][-g group][-t][-c cycle][-l] file ..." 1>&2 ! 90: exit 1 ! 91: fi ! 92: for i in $*; do ! 93: case $i in ! 94: -m) mode=$2; shift 2;; ! 95: -u) user=$2; shift 2;; ! 96: -g) group=$2; shift 2;; ! 97: -c) count=$2; shift 2;; ! 98: -t) touch=1; shift;; ! 99: -l) COMPRESS=""; shift;; ! 100: --) shift; break;; ! 101: esac ! 102: done ! 103: if [ "$count" -lt 2 ]; then ! 104: echo "$prog: count must be at least 2" 1>&2 ! 105: exit 2 ! 106: fi ! 107: ! 108: # cycle thru filenames ! 109: while [ $# -gt 0 ]; do ! 110: ! 111: # get the filename ! 112: filename=$1 ! 113: shift ! 114: ! 115: # catch bogus files ! 116: if [ -b "$filename" -o -c "$filename" -o -d "$filename" ]; then ! 117: echo "$prog: $filename is not a regular file" 1>&2 ! 118: exitcode=3 ! 119: continue ! 120: fi ! 121: ! 122: # if not a file or empty, do nothing major ! 123: if [ ! -s $filename ]; then ! 124: # if -t was given and it does not exist, create it ! 125: if [ ! -z "$touch" -a ! -f $filename ]; then ! 126: touch $filename ! 127: if [ "$?" -ne 0 ]; then ! 128: echo "$prog: could not touch $filename" 1>&2 ! 129: exitcode=4 ! 130: continue ! 131: fi ! 132: if [ ! -z "$user" ]; then ! 133: $CHOWN $user $filename ! 134: fi ! 135: if [ ! -z "$group" ]; then ! 136: chgrp $group $filename ! 137: fi ! 138: if [ ! -z "$mode" ]; then ! 139: chmod $mode $filename ! 140: fi ! 141: fi ! 142: continue ! 143: fi ! 144: ! 145: # be sure that the savedir exists and is writable ! 146: savedir=`expr "$filename" : '\(.*\)/'` ! 147: if [ -z "$savedir" ]; then ! 148: savedir=./OLD ! 149: else ! 150: savedir=$savedir/OLD ! 151: fi ! 152: if [ ! -s $savedir ]; then ! 153: mkdir $savedir ! 154: if [ "$?" -ne 0 ]; then ! 155: echo "$prog: could not mkdir $savedir" 1>&2 ! 156: exitcode=5 ! 157: continue ! 158: fi ! 159: chmod 0755 $savedir ! 160: fi ! 161: if [ ! -d $savedir ]; then ! 162: echo "$prog: $savedir is not a directory" 1>&2 ! 163: exitcode=6 ! 164: continue ! 165: fi ! 166: if [ ! -w $savedir ]; then ! 167: echo "$prog: directory $savedir is not writable" 1>&2 ! 168: exitcode=7 ! 169: continue ! 170: fi ! 171: ! 172: # deterine our uncompressed file names ! 173: newname=`expr "$filename" : '.*/\(.*\)'` ! 174: if [ -z "$newname" ]; then ! 175: newname=$savedir/$filename ! 176: else ! 177: newname=$savedir/$newname ! 178: fi ! 179: ! 180: # cycle the old compressed log files ! 181: cycle=`expr $count - 1` ! 182: rm -f $newname.$cycle $newname.$cycle$DOT_Z ! 183: while [ "$cycle" -gt 1 ]; do ! 184: # --cycle ! 185: oldcycle=$cycle ! 186: cycle=`expr $cycle - 1` ! 187: # cycle log ! 188: if [ -f $newname.$cycle$DOT_Z ]; then ! 189: mv -f $newname.$cycle$DOT_Z $newname.$oldcycle$DOT_Z ! 190: fi ! 191: if [ -f $newname.$cycle ]; then ! 192: # file was not compressed for some reason move it anyway ! 193: mv -f $newname.$cycle $newname.$oldcycle ! 194: fi ! 195: done ! 196: ! 197: # compress the old uncompressed log if needed ! 198: if [ -f $newname.0 ]; then ! 199: if [ -z "$COMPRESS" ]; then ! 200: newfile=$newname.1 ! 201: mv $newname.0 $newfile ! 202: else ! 203: newfile=$newname.1$DOT_Z ! 204: $COMPRESS $COMP_FLAG < $newname.0 > $newfile ! 205: rm -f $newname.0 ! 206: fi ! 207: if [ ! -z "$user" ]; then ! 208: $CHOWN $user $newfile ! 209: fi ! 210: if [ ! -z "$group" ]; then ! 211: chgrp $group $newfile ! 212: fi ! 213: if [ ! -z "$mode" ]; then ! 214: chmod $mode $newfile ! 215: fi ! 216: fi ! 217: ! 218: # move the file into the file.0 holding place ! 219: mv -f $filename $newname.0 ! 220: ! 221: # replace file if needed ! 222: if [ ! -z "$touch" -o ! -z "$user" -o \ ! 223: ! -z "$group" -o ! -z "$mode" ]; then ! 224: touch $filename ! 225: fi ! 226: if [ ! -z "$user" ]; then ! 227: $CHOWN $user $filename ! 228: fi ! 229: if [ ! -z "$group" ]; then ! 230: chgrp $group $filename ! 231: fi ! 232: if [ ! -z "$mode" ]; then ! 233: chmod $mode $filename ! 234: fi ! 235: ! 236: # fix the permissions on the holding place file.0 file ! 237: if [ ! -z "$user" ]; then ! 238: $CHOWN $user $newname.0 ! 239: fi ! 240: if [ ! -z "$group" ]; then ! 241: chgrp $group $newname.0 ! 242: fi ! 243: if [ ! -z "$mode" ]; then ! 244: chmod $mode $newname.0 ! 245: fi ! 246: done ! 247: exit $exitcode
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.