home *** CD-ROM | disk | FTP | other *** search
/ PC-Online 1996 May / PCOnline_05_1996.bin / linux / source / contrib / smail / smail-3.1 / smail-3 / smail-3.1.28 / util / savelog < prev    next >
Text File  |  1994-05-30  |  6KB  |  249 lines

  1. #! /bin/sh
  2. # @(#)util/savelog.sh    1.5 7/11/92 11:40:30
  3. #
  4. # savelog - save a log file
  5. #
  6. #    Copyright (C) 1987, 1988 Ronald S. Karr and Landon Curt Noll
  7. #    Copyright (C) 1992  Ronald S. Karr
  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="/usr/lib/smail:/usr/bin:/bin:/usr/bin:/usr/local/bin"; export PATH
  73. COMPRESS="gzip"
  74. COMP_FLAG="-9"
  75. DOT_Z=".gz"
  76. CHOWN="chown"
  77. GETOPT="/usr/lib/smail/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
  248.