OSSP CVS Repository

ossp - Check-in [1029]
Not logged in
[Honeypot]  [Browse]  [Home]  [Login]  [Reports
[Search]  [Ticket]  [Timeline
  [Patchset]  [Tagging/Branching

Check-in Number: 1029
Date: 2001-Sep-23 13:15:57 (local)
2001-Sep-23 11:15:57 (UTC)
User:rse
Branch:
Comment: *** empty log message ***
Tickets:
Inspections:
Files:
ossp-pkg/shtool/ChangeLog      1.162 -> 1.163     10 inserted, 0 deleted
ossp-pkg/shtool/Makefile.in      1.43 -> 1.44     1 inserted, 0 deleted
ossp-pkg/shtool/README      1.81 -> 1.82     1 inserted, 0 deleted
ossp-pkg/shtool/sh.rotate      added-> 1.1
ossp-pkg/shtool/shtool.pod      1.55 -> 1.56     78 inserted, 0 deleted
ossp-pkg/shtool/shtoolize.in      1.25 -> 1.26     21 inserted, 1 deleted
ossp-pkg/shtool/shtoolize.pod      1.7 -> 1.8     1 inserted, 0 deleted
ossp-pkg/shtool/test.db      1.17 -> 1.18     7 inserted, 0 deleted

ossp-pkg/shtool/ChangeLog 1.162 -> 1.163

--- ChangeLog    2001/09/23 10:58:10     1.162
+++ ChangeLog    2001/09/23 11:15:57     1.163
@@ -11,6 +11,16 @@
 
  Changes between 1.5.4 and 1.6.0 (14-Jun-2001 to xx-Sep-2001):
 
+   *) Added new command `shtool rotate `[-v|--verbose] [-t|--trace]
+      [-f|--force] [-n|--num-files <count>] [-s|--min-size <size>]
+      [-c|--copy] [-r|--remove] [-a|--archive-dir <dir>] [-z|--compress
+      [<tool>:]<level>] [-b|--background] [-d|--delay] [-p|--pad <len>]
+      [-o|--owner <owner>] [-g|--group <group>] [-m|--mode <mode>]
+      [-M|--migrate <cmd>] [-P|--prolog <cmd>] [-E|--epilog <cmd>]
+      [<file> ...]'. This is a sophisticated command for rotating
+      logfiles of daemons.
+      [Ralf S. Engelschall]
+
    *) Added GNU long-option support (`--xxxx').
       [Ralf S. Engelschall]
 


ossp-pkg/shtool/Makefile.in 1.43 -> 1.44

--- Makefile.in  2001/06/14 19:02:54     1.43
+++ Makefile.in  2001/09/23 11:15:57     1.44
@@ -54,6 +54,7 @@
  sh.mkln \
  sh.mkshadow \
  sh.fixperm \
+ sh.rotate \
  sh.tarball \
  sh.subst \
  sh.guessos \


ossp-pkg/shtool/README 1.81 -> 1.82

--- README       2001/09/23 10:27:52     1.81
+++ README       2001/09/23 11:15:57     1.82
@@ -32,6 +32,7 @@
   mkln       Make link with calculation of relative paths
   mkshadow   Make a shadow tree
   fixperm    Fix file permissions inside a source tree
+  rotate     Rotate logfiles
   tarball    Roll distribution tarballs
   subst      Apply sed(1) substitution operations
   guessos    Simple OS/platform guesser


ossp-pkg/shtool/sh.rotate -> 1.1

*** /dev/null    Sun Apr 28 22:30:01 2024
--- -    Sun Apr 28 22:30:01 2024
***************
*** 0 ****
--- 1,401 ----
+ ##
+ ##  rotate -- Logfile rotation
+ ##  Copyright (c) 2001 Ralf S. Engelschall <rse@engelschall.com>
+ ##  Originally written for use in OpenPKG
+ ##
+ ##  This file is part of shtool and free software; you can redistribute
+ ##  it and/or modify it under the terms of the GNU General Public
+ ##  License as published by the Free Software Foundation; either version
+ ##  2 of the License, or (at your option) any later version.
+ ##
+ ##  This file is distributed in the hope that it will be useful,
+ ##  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ ##  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ ##  General Public License for more details.
+ ##
+ ##  You should have received a copy of the GNU General Public License
+ ##  along with this program; if not, write to the Free Software
+ ##  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ ##  USA, or contact Ralf S. Engelschall <rse@engelschall.com>.
+ ##
+ 
+ str_tool="rotate"
+ str_usage="[-v|--verbose] [-t|--trace] [-f|--force] [-n|--num-files <count>] [-s|--min-size <size>] [-c|--copy] [-r|--remove] [-a|--archive-dir <dir>] [-z|--compress [<tool>:]<level>] [-b|--background] [-d|--delay] [-p|--pad <len>] [-o|--owner <owner>] [-g|--group <group>] [-m|--mode <mode>] [-M|--migrate <cmd>] [-P|--prolog <cmd>] [-E|--epilog <cmd>] <file> [...]"
+ arg_spec="1+"
+ opt_spec="v.t.f.n:s:c.r.a:z:b.d.p:o:g:m:M:P:E:"
+ opt_alias="v:verbose,t:trace,f:force,n:num-files,s:size,m:min-size,c:copy,r:remove,a:archive-dir,z:compress,b:background,d:delay,p:pad,o:owner,g:group,m:mode,M:migrate,P:prolog,E:epilog"
+ opt_v=no
+ opt_t=no
+ opt_f=no
+ opt_n=10
+ opt_s=""
+ opt_c=no
+ opt_r=no
+ opt_a=""
+ opt_z=""
+ opt_b=no
+ opt_d=no
+ opt_p=1
+ opt_o=""
+ opt_g=""
+ opt_m=""
+ opt_M=""
+ opt_P=""
+ opt_E=""
+ 
+ . ./sh.common
+ 
+ #   make sure we have at least one file to rotate
+ if [ ".$opt_n" = .0 ]; then
+     echo "$msgprefix:Error: invalid argument \`$opt_n' to option -n." 1>&2
+     exit 1
+ fi
+ 
+ #   canonicalize -s option argument
+ if [ ".$opt_s" != . ]; then
+     if [ ".`expr $opt_s : '[0-9]*$'`" != .0 ]; then
+         :
+     elif [ ".`expr $opt_s : '[0-9]*[Kk]$'`" != .0 ]; then
+         opt_s=`expr $opt_s : '\([0-9]*\)[Kk]$'`
+         opt_s=`expr $opt_s \* 1024`
+     elif [ ".`expr $opt_s : '[0-9]*[Mm]$'`" != .0 ]; then
+         opt_s=`expr $opt_s : '\([0-9]*\)[Mm]$'`
+         opt_s=`expr $opt_s \* 1048576` # 1024*1024
+     elif [ ".`expr $opt_s : '[0-9]*[Gg]$'`" != .0 ]; then
+         opt_s=`expr $opt_s : '\([0-9]*\)[Gg]$'`
+         opt_s=`expr $opt_s \* 1073741824` # 1024*1024*1024
+     else
+         echo "$msgprefix:Error: invalid argument \`$opt_s' to option -s." 1>&2
+         exit 1
+     fi
+ fi
+ 
+ #   option -d/-z consistency
+ if [ ".$opt_d" = .yes -a ".$opt_z" = . ]; then
+     echo "$msgprefix:Error: option -d requires option -z." 1>&2
+     exit 1
+ fi
+ 
+ #   make sure target directory exists
+ if [ ".$opt_a" != . ]; then
+     if [ ! -d $opt_a ]; then
+         if [ ".$opt_f" = .no ]; then
+             echo "$msgprefix:Error: archive directory \`$opt_a' does not exist." 1>&2
+             exit 1
+         fi
+         mkdir $opt_a || exit $?
+         chmod 755 $opt_a
+     fi
+     if [ ! -w $opt_a ]; then
+         echo "$msgprefix:Error: archive directory \`$opt_a' not writable." 1>&2
+         exit 1
+     fi
+ fi
+ 
+ #   determine compression approach
+ if [ ".$opt_z" != . ]; then
+     comp_lvl="$opt_z"
+     comp_prg=""
+     case $comp_lvl in
+         *:* ) eval `echo $comp_lvl |\
+                     sed -e 's%^\(.*\):\(.*\)$%comp_prg="\1"; comp_lvl="\2"%'` ;;
+     esac
+ 
+     #   compression level consistency
+     case $comp_lvl in
+         [0-9] )
+             ;;
+         * ) echo "$msgprefix:Error: invalid compression level \`$comp_lvl'" 1>&2
+             exit 1
+             ;;
+     esac
+ 
+     #   determine a suitable compression tool
+     if [ ".$comp_prg" = . ]; then
+         #   check whether the test command supports the -x option
+         if [ -x /bin/sh ] 2>/dev/null; then
+             minusx="-x"
+         else
+             minusx="-r"
+         fi
+         #   search for tools in $PATH
+         paths="`echo $PATH |\
+                 sed -e 's%/*:%:%g' -e 's%/*$%%' \
+                     -e 's/^:/.:/' -e 's/::/:.:/g' -e 's/:$/:./' \
+                     -e 's/:/ /g'`"
+         for prg in bzip2 gzip compress; do
+             for path in $paths; do
+                 if [ $minusx "$path/$prg" -a ! -d "$path/$prg" ]; then
+                     comp_prg="$prg"
+                     break
+                 fi
+             done
+             if [ ".$comp_prg" != . ]; then
+                 break
+             fi
+         done
+         if [ ".$comp_prg" = . ]; then
+             echo "$msgprefix:Error: no suitable compression tool found in \$PATH" 1>&2
+             exit 1
+         fi
+     fi
+ 
+     #   determine standard compression extension
+     #   and make sure it is a known tool
+     case $comp_prg in
+         */bzip2    | bzip2    ) comp_ext="bz2" comp_lvl="-$comp_lvl" ;;
+         */gzip     | gzip     ) comp_ext="gz"  comp_lvl="-$comp_lvl" ;;
+         */compress | compress ) comp_ext="Z";  comp_lvl=""           ;;
+         * ) echo "$msgprefix:Error: tool \`$comp_prg' is not a known compression tool" 1>&2
+             exit 1
+             ;;
+     esac
+     comp_suf=".$comp_ext"
+ fi
+ 
+ #   iterate over all given logfile arguments
+ for file in $*; do
+     #   make sure the logfile exists
+     if [ ! -f $file ]; then
+         if [ ".$opt_f" = .yes ]; then
+             continue
+         fi
+         echo "$msgprefix:Error: logfile \`$file' not found" 1>&2
+         exit 1
+     fi
+ 
+     #   determine log directory (where original logfile is placed)
+     ldir="."
+     case $file in
+         */* ) eval `echo $file | sed -e 's%^\(.*\)/\([^/]*\)$%ldir="\1"; file="\2";%'` ;;
+     esac
+ 
+     #   determine archive directory (where rotated logfiles are placed)
+     adir="$ldir"
+     if [ ".$opt_a" != . ]; then
+         case "$opt_a" in
+             /* | ./* ) adir="$opt_a" ;;
+             * ) adir="$ldir/$opt_a"  ;;
+         esac
+     fi
+ 
+     #   optionally take logfile size into account
+     if [ ".$opt_s" != . ]; then
+         #   determine size of logfile
+         set -- `ls -l $ldir/$file | sed -e 's; -> .*$;;' -e 's;[       ][      ]*; ;g'`
+         n=`expr $# - 4`
+         eval "size=\`echo \${$n}\`"
+ 
+         #   skip logfile if size is still too small
+         if [ $size -lt $opt_s ]; then
+             if [ ".$opt_v" = .yes ]; then
+                 echo "$ldir/$file: still too small in size -- skipping"
+             fi
+             continue
+         fi
+     fi
+ 
+     #   verbosity
+     if [ ".$opt_v" = .yes ]; then
+         echo "rotating $ldir/$file"
+     fi
+ 
+     #   execute prolog
+     if [ ".$opt_P" != . ]; then
+         if [ ".$opt_t" = .yes ]; then
+             echo "$opt_P"
+         fi
+         eval $opt_P
+         [ $? -ne 0 ] && exit $?
+     fi
+ 
+     #   kick away out-rotated logfile
+     n=`expr $opt_n - 1`
+     n=`echo dummy | awk "{ printf(\"%0${opt_p}d\", n); }" n=$n`
+     if [ -f "${adir}/${file}.${n}${comp_suf}" ]; then
+         #   optionally migrate away the out-rotated logfile
+         if [ ".$opt_M" != . ]; then
+             if [ ".$opt_t" = .yes ]; then
+                 echo "$opt_M ${adir}/${file}.${n}${comp_suf}"
+             fi
+             eval "$opt_M ${adir}/${file}.${n}${comp_suf}"
+             [ $? -ne 0 ] && exit $?
+         fi
+         #   finally get rid of the out-rotated logfile
+         if [ ".$opt_t" = .yes ]; then
+             echo "rm -f ${adir}/${file}.${n}${comp_suf}"
+         fi
+         rm -f ${adir}/${file}.${n}${comp_suf} || exit $?
+     fi
+ 
+     #   rotate already archived logfiles
+     while [ $n -gt 0 ]; do
+         m=$n
+         n=`expr $n - 1`
+         n=`echo dummy | awk "{ printf(\"%0${opt_p}d\", n); }" n=$n`
+         if [ $n -eq 0 -a ".$opt_d" = .yes ]; then
+             #   special case: first rotation file under delayed compression situation
+             if [ ! -f "${adir}/${file}.${n}" ]; then
+                 continue
+             fi
+ 
+             #   compress file (delayed)
+             if [ ".$opt_b" = .yes ]; then
+                 if [ ".$opt_t" = .yes ]; then
+                     echo "mv ${adir}/${file}.${n} ${adir}/${file}.${m}"
+                 fi
+                 mv ${adir}/${file}.${n} ${adir}/${file}.${m} || exit $?
+                 if [ ".$opt_t" = .yes ]; then
+                     echo "(${comp_prg} ${comp_lvl} <${adir}/${file}.${m} >${adir}/${file}.${m}${comp_suf}; rm -f ${adir}/${file}.${m}) &"
+                 fi
+                 ( ${comp_prg} ${comp_lvl} \
+                       <${adir}/${file}.${m} \
+                       >${adir}/${file}.${m}${comp_suf} || exit $?
+                   rm -f ${adir}/${file}.${m} || exit $?
+                 ) </dev/null >/dev/null 2>&1 &
+             else
+                 if [ ".$opt_t" = .yes ]; then
+                     echo "${comp_prg} ${comp_lvl} <${adir}/${file}.${n} >${adir}/${file}.${m}${comp_suf}"
+                 fi
+                 ${comp_prg} ${comp_lvl} \
+                     <${adir}/${file}.${n} \
+                     >${adir}/${file}.${m}${comp_suf} || exit $?
+                 if [ ".$opt_t" = .yes ]; then
+                     echo "rm -f ${adir}/${file}.${n}"
+                 fi
+                 rm -f ${adir}/${file}.${n} || exit $?
+             fi
+ 
+             #   fix file attributes
+             if [ ".$opt_o" != . ]; then
+                 if [ ".$opt_t" = .yes ]; then
+                     echo "chown $opt_o ${adir}/${file}.${m}${comp_suf}"
+                 fi
+                 chown $opt_o ${adir}/${file}.${m}${comp_suf} || exit $?
+             fi
+             if [ ".$opt_g" != . ]; then
+                 if [ ".$opt_t" = .yes ]; then
+                     echo "chgrp $opt_g ${adir}/${file}.${m}${comp_suf}"
+                 fi
+                 chgrp $opt_g ${adir}/${file}.${m}${comp_suf} || exit $?
+             fi
+             if [ ".$opt_m" != . ]; then
+                 if [ ".$opt_t" = .yes ]; then
+                     echo "chmod $opt_m ${adir}/${file}.${m}${comp_suf}"
+                 fi
+                 chmod $opt_m ${adir}/${file}.${m}${comp_suf} || exit $?
+             fi
+         else
+             #   standard case: second and following rotation file
+             if [ ! -f "${adir}/${file}.${n}${comp_suf}" ]; then
+                 continue
+             fi
+             if [ ".$opt_t" = .yes ]; then
+                 echo "mv ${adir}/${file}.${n}${comp_suf} ${adir}/${file}.${m}${comp_suf}"
+             fi
+             mv ${adir}/${file}.${n}${comp_suf} ${adir}/${file}.${m}${comp_suf} || exit $?
+         fi
+     done
+ 
+     #   move away current logfile
+     if [ ".$opt_c" = .yes ]; then
+         #   approach: copy[+truncate]
+         if [ ".$opt_t" = .yes ]; then
+             echo "cp -p ${ldir}/${file} ${adir}/${file}.${n}"
+         fi
+         cp -p ${ldir}/${file} ${adir}/${file}.${n} || exit $?
+         if [ ".$opt_r" = .no ]; then
+             if [ ".$opt_t" = .yes ]; then
+                 echo "cp /dev/null ${ldir}/${file}"
+             fi
+             cp /dev/null ${ldir}/${file} || exit $?
+         fi
+     else
+         #   approach: move[+touch]
+         if [ ".$opt_t" = .yes ]; then
+             echo "mv ${ldir}/${file} ${adir}/${file}.${n}"
+         fi
+         mv ${ldir}/${file} ${adir}/${file}.${n} || exit $?
+         if [ ".$opt_r" = .no ]; then
+             if [ ".$opt_t" = .yes ]; then
+                 echo "touch ${ldir}/${file}"
+             fi
+             touch ${ldir}/${file} || exit $?
+             #   fix file attributes
+             if [ ".$opt_o" != . ]; then
+                 if [ ".$opt_t" = .yes ]; then
+                     echo "chown $opt_o ${ldir}/${file}"
+                 fi
+                 chown $opt_o ${ldir}/${file} || exit $?
+             fi
+             if [ ".$opt_g" != . ]; then
+                 if [ ".$opt_t" = .yes ]; then
+                     echo "chgrp $opt_g ${ldir}/${file}"
+                 fi
+                 chgrp $opt_g ${ldir}/${file} || exit $?
+             fi
+             if [ ".$opt_m" != . ]; then
+                 if [ ".$opt_t" = .yes ]; then
+                     echo "chmod $opt_m ${ldir}/${file}"
+                 fi
+                 chmod $opt_m ${ldir}/${file} || exit $?
+             fi
+         fi
+     fi
+ 
+     #   regular compression step
+     if [ ".$opt_z" != . -a ".$opt_d" = .no ]; then
+         #   compress file
+         if [ ".$opt_b" = .yes ]; then
+             if [ ".$opt_t" = .yes ]; then
+                 echo "(${comp_prg} ${comp_lvl} <${adir}/${file}.${n} >${adir}/${file}.${n}${comp_suf}; rm -f ${adir}/${file}.${n}) &"
+             fi
+             ( ${comp_prg} ${comp_lvl} \
+                   <${adir}/${file}.${n} \
+                   >${adir}/${file}.${n}${comp_suf} || exit $?
+               rm -f ${adir}/${file}.${n} || exit $?
+             ) </dev/null >/dev/null 2>&1 &
+         else
+             if [ ".$opt_t" = .yes ]; then
+                 echo "${comp_prg} ${comp_lvl} <${adir}/${file}.${n} >${adir}/${file}.${n}${comp_suf}"
+             fi
+             ${comp_prg} ${comp_lvl} \
+                 <${adir}/${file}.${n} \
+                 >${adir}/${file}.${n}${comp_suf} || exit $?
+             if [ ".$opt_t" = .yes ]; then
+                 echo "rm -f ${opt_a}${file}.${n}"
+             fi
+             rm -f ${adir}/${file}.${n} || exit $?
+         fi
+ 
+         #   fix file attributes
+         if [ ".$opt_o" != . ]; then
+             if [ ".$opt_t" = .yes ]; then
+                 echo "chown $opt_o ${adir}/${file}.${n}${comp_suf}"
+             fi
+             chown $opt_o ${adir}/${file}.${n}${comp_suf} || exit $?
+         fi
+         if [ ".$opt_g" != . ]; then
+             if [ ".$opt_t" = .yes ]; then
+                 echo "chgrp $opt_g ${adir}/${file}.${n}${comp_suf}"
+             fi
+             chgrp $opt_g ${adir}/${file}.${n}${comp_suf} || exit $?
+         fi
+         if [ ".$opt_m" != . ]; then
+             if [ ".$opt_t" = .yes ]; then
+                 echo "chmod $opt_m ${adir}/${file}.${n}${comp_suf}"
+             fi
+             chmod $opt_m ${adir}/${file}.${n}${comp_suf} || exit $?
+         fi
+     fi
+ 
+     #   execute epilog
+     if [ ".$opt_E" != . ]; then
+         if [ ".$opt_t" = .yes ]; then
+             echo "$opt_E"
+         fi
+         eval $opt_E
+         [ $? -ne 0 ] && exit $?
+     fi
+ done
+ 


ossp-pkg/shtool/shtool.pod 1.55 -> 1.56

--- shtool.pod   2001/09/23 10:58:10     1.55
+++ shtool.pod   2001/09/23 11:15:57     1.56
@@ -246,6 +246,10 @@
 
 Fix file permissions inside a source tree by cleaning up the permission bits.
 
+=item B<rotate>
+
+Rotate a logfile.
+
 =item B<tarball>
 
 Roll standardized distribution tarballs.
@@ -525,6 +529,80 @@
       shtool fixperm -v *
       ...
 
+=item B<rotate> [B<-v>|B<--verbose>] [B<-t>|B<--trace>] [B<-f>|B<--force>] [B<-n>|B<--num-files> I<count>] [B<-s>|B<--min-size> I<size>] [B<-c>|B<--copy>] [B<-r>|B<--remove>] [B<-a>|B<--archive-dir> I<dir>] [B<-z>|B<--compress> [I<tool>:]I<level>] [B<-b>|B<--background>] [B<-d>|B<--delay>] [B<-p>|B<--pad> I<len>] [B<-o>|B<--owner> I<owner>] [B<-g>|B<--group> I<group>] [B<-m>|B<--mode> I<mode>] [B<-M>|B<--migrate> I<cmd>] [B<-P>|B<--prolog> I<cmd>] [B<-E>|B<--epilog> I<cmd>] I<file> [...]
+
+This command rotates a logfile I<file> by subsequently creating up to
+I<count> (optionally compressed) archive files of it. Archive files are
+named "I<file>.I<number>[I<compress-suffix]>" where I<number> is the
+version number, 0 being the newest and "I<count>-1" the oldest.
+
+A rotation step consists of the following steps: 1. remove archive file
+number I<count>-1; 2. move archive file number I<N>-1 to I<N> for I<N>
+counting from 1 to I<count>-1; 3. move I<file> to archive file number 0;
+4. creating a new and empty instance of I<file>.
+
+Option ``B<-s>'' can be used to only start a rotation step if I<file> is
+at least I<size> bytes long. The argument I<size> can be specified also
+with the trailing units C<K> (kilo), C<M> (mega) or C<G> (giga).
+
+Option ``B<-c>'' changes the approach of moving I<file> to archive file
+number 0: instead of a move followed by the creation of a new I<file>, a
+copy is performed followed by a truncation of I<file>. The difference is
+that in the first case (the default), if an application has I<file>
+still opened, after the rotation step it will have archive file number
+0 opened and usually has to reopen the new I<file>, while in the second
+case the application can keep its open file handles to I<file>. The
+drawback of the second approach is that logfile entries are lost when
+they are written to I<file> between the executation of the copy and the
+subsequent truncation operation.
+
+Option ``B<-r>'' removes I<file> after rotation instead of providing a
+new empty file. Option ``B<-a>'' forces archive files to be created in
+the separate directory I<dir>.
+
+Option ``B<-z>'' enables compression of archive files with compression
+level I<level> (if option ``B<-b>'' is present, compression takes place in
+background). By default, the tools bzip2(1), gzip(1) and compress(1) are
+searched for in C<$PATH> (in this order), but one also can override this
+by prefixing the compression level with one of the three particular tool
+names. Option ``B<-d>'' delays the compression of archive file number 0.
+This is useful if option ``B<-c>'' is not used, because an application
+might still write to archive file 0 (through an open file handle).
+
+Option ``B<-p>'' enables padding with leading zeros in the I<number>
+part of the filename "I<file>.I<number>I<compress-suffix>". The default
+padding I<len> is 1. This is interesting if more than 10 archive files
+are used, because it leads to still sorted directory listings.
+
+Options ``B<-o>'', ``B<-g>'' and ``B<-m>'' can be used to make sure that
+the created files have particular file attributes. The valid arguments
+are the same as for chown(1), chgrp(1) and chmod(1). Be aware that using
+options ``B<-o>'' and ``B<-g>'' require root privileges.
+
+Option ``B<-M>'' allows one to execute a "migration" command just before
+the archive file number I<count>-1 is removed from the filesystem. The
+specified I<cmd> gets the archive filename as an argument appended.
+Options ``B<-P>'' (prolog) and ``B<-E>'' (epilog) can be used to execute
+commands before and after the rotation step. They are interesting in
+conjunction with option ``B<-s>'', because they are not executed at all
+if it is decided that no rotation step is performed.
+
+Option ``B<-f>'' (force) can be used to allow the archive directory
+(option ``B<-a>'') to be silently created if it still does not exist and
+that still not existing intermediate logfiles are silently skipped in
+the rotation step.
+
+Option ``B<-v>'' (verbose) can be used to display the files which are
+rotated. Option ``B<-t>'' (trace) can be used to enable the output of
+the essential shell commands which are executed for the rotation step.
+
+Example:
+
+  #   shell script
+  shtool rotate -n10 -s1M -zbzip2:9 -d -r /var/log/ap.access.log
+  shtool rotate -n5 -s128K -zbzip2:9 -d -r /var/log/ap.error.log
+  apachectl graceful
+
 =item B<tarball> [B<-t>|B<--trace>] [B<-v>|B<--verbose>] [B<-o>|B<--output> I<tarball>] [B<-c>|B<--compress> I<prog>] [B<-u>|B<--user> I<user>] [B<-g>|B<--group> I<group>] [B<-e>|B<--exclude> I<pattern>] I<path> [I<path> ...]
 
 This command is for `rolling' distribution `tarballs', i.e. for the creation


ossp-pkg/shtool/shtoolize.in 1.25 -> 1.26

--- shtoolize.in 2001/09/23 10:58:10     1.25
+++ shtoolize.in 2001/09/23 11:15:57     1.26
@@ -35,7 +35,7 @@
 #   Available modules
 my @available = qw(
     echo mdate table prop move install mkdir mkln mkshadow
-    fixperm tarball subst guessos arx slo scpp version path
+    fixperm rotate tarball subst guessos arx slo scpp version path
 );
 
 ##
@@ -256,6 +256,8 @@
     my $u2 = '';
     my $u3 = '';
     my $u4 = '';
+    my $u5 = '';
+    my $u6 = '';
     if ($u =~ m|^(.{50}.*?)\s+(.+)$|) {
         ($u, $u2) = ($1, $2);
     }
@@ -265,10 +267,18 @@
     if ($u3 =~ m|^(.{50}.*?)\s+(.+)$|) {
         ($u3, $u4) = ($1, $2);
     }
+    if ($u4 =~ m|^(.{50}.*?)\s+(.+)$|) {
+        ($u4, $u5) = ($1, $2);
+    }
+    if ($u5 =~ m|^(.{50}.*?)\s+(.+)$|) {
+        ($u5, $u6) = ($1, $2);
+    }
     $usage .= sprintf("    echo '  %-8s %s'\n", $name, $u);
     $usage .= sprintf("    echo '  %-8s %s'\n", '', $u2) if ($u2);
     $usage .= sprintf("    echo '  %-8s %s'\n", '', $u3) if ($u3);
     $usage .= sprintf("    echo '  %-8s %s'\n", '', $u4) if ($u4);
+    $usage .= sprintf("    echo '  %-8s %s'\n", '', $u5) if ($u5);
+    $usage .= sprintf("    echo '  %-8s %s'\n", '', $u6) if ($u6);
 }
 if (@unused) {
     $usage .= "    echo ''\n";
@@ -278,6 +288,8 @@
         my $u2 = '';
         my $u3 = '';
         my $u4 = '';
+        my $u5 = '';
+        my $u6 = '';
         if ($u =~ m|^(.{50}.*?)\s+(.+)$|) {
             ($u, $u2) = ($1, $2);
         }
@@ -287,10 +299,18 @@
         if ($u3 =~ m|^(.{50}.*?)\s+(.+)$|) {
             ($u3, $u4) = ($1, $2);
         }
+        if ($u4 =~ m|^(.{50}.*?)\s+(.+)$|) {
+            ($u4, $u5) = ($1, $2);
+        }
+        if ($u5 =~ m|^(.{50}.*?)\s+(.+)$|) {
+            ($u5, $u6) = ($1, $2);
+        }
         $usage .= sprintf("    echo '  %-8s %s'\n", $name, $u);
         $usage .= sprintf("    echo '  %-8s %s'\n", '', $u2) if ($u2);
         $usage .= sprintf("    echo '  %-8s %s'\n", '', $u3) if ($u3);
         $usage .= sprintf("    echo '  %-8s %s'\n", '', $u4) if ($u4);
+        $usage .= sprintf("    echo '  %-8s %s'\n", '', $u5) if ($u5);
+        $usage .= sprintf("    echo '  %-8s %s'\n", '', $u6) if ($u6);
     }
 }
 $usage =~ s|\n$||s;


ossp-pkg/shtool/shtoolize.pod 1.7 -> 1.8

--- shtoolize.pod        2001/06/14 19:02:54     1.7
+++ shtoolize.pod        2001/09/23 11:15:57     1.8
@@ -53,6 +53,7 @@
  mkln       Make link with calculation of relative paths
  mkshadow   Make a shadow tree
  fixperm    Fix file permissions inside a source tree
+ rotate     Rotate a logfile
  tarball    Roll distribution tarballs
  subst      Apply sed(1) substitution operations
  guessos    Simple OS/platform guesser


ossp-pkg/shtool/test.db 1.17 -> 1.18

--- test.db      2001/06/14 21:27:14     1.17
+++ test.db      2001/09/23 11:15:57     1.18
@@ -97,6 +97,13 @@
 shtool fixperm .
 @end{fixperm}
 
+@begin{rotate}
+echo foo >foo
+shtool rotate -n2 foo
+shtool rotate -n2 foo
+shtool rotate -n2 foo
+@end{rotate}
+
 @begin{tarball}
 #   cannot be checked easily, so just start it
 shtool tarball -o test .

CVSTrac 2.0.1