Index: ossp-pkg/shtool/ChangeLog RCS File: /v/ossp/cvs/ossp-pkg/shtool/ChangeLog,v rcsdiff -q -kk '-r1.162' '-r1.163' -u '/v/ossp/cvs/ossp-pkg/shtool/ChangeLog,v' 2>/dev/null --- 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 ] [-s|--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 ] + [ ...]'. This is a sophisticated command for rotating + logfiles of daemons. + [Ralf S. Engelschall] + *) Added GNU long-option support (`--xxxx'). [Ralf S. Engelschall] Index: ossp-pkg/shtool/Makefile.in RCS File: /v/ossp/cvs/ossp-pkg/shtool/Makefile.in,v rcsdiff -q -kk '-r1.43' '-r1.44' -u '/v/ossp/cvs/ossp-pkg/shtool/Makefile.in,v' 2>/dev/null --- 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 \ Index: ossp-pkg/shtool/README RCS File: /v/ossp/cvs/ossp-pkg/shtool/README,v rcsdiff -q -kk '-r1.81' '-r1.82' -u '/v/ossp/cvs/ossp-pkg/shtool/README,v' 2>/dev/null --- 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 Index: ossp-pkg/shtool/sh.rotate RCS File: /v/ossp/cvs/ossp-pkg/shtool/sh.rotate,v co -q -kk -p'1.1' '/v/ossp/cvs/ossp-pkg/shtool/sh.rotate,v' | diff -u /dev/null - -L'ossp-pkg/shtool/sh.rotate' 2>/dev/null --- ossp-pkg/shtool/sh.rotate +++ - 2024-05-14 00:14:57.487237816 +0200 @@ -0,0 +1,401 @@ +## +## rotate -- Logfile rotation +## Copyright (c) 2001 Ralf S. Engelschall +## 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 . +## + +str_tool="rotate" +str_usage="[-v|--verbose] [-t|--trace] [-f|--force] [-n|--num-files ] [-s|--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 ] [...]" +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 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 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 + Index: ossp-pkg/shtool/shtool.pod RCS File: /v/ossp/cvs/ossp-pkg/shtool/shtool.pod,v rcsdiff -q -kk '-r1.55' '-r1.56' -u '/v/ossp/cvs/ossp-pkg/shtool/shtool.pod,v' 2>/dev/null --- 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 a logfile. + =item B Roll standardized distribution tarballs. @@ -525,6 +529,80 @@ shtool fixperm -v * ... +=item B [B<-v>|B<--verbose>] [B<-t>|B<--trace>] [B<-f>|B<--force>] [B<-n>|B<--num-files> I] [B<-s>|B<--min-size> I] [B<-c>|B<--copy>] [B<-r>|B<--remove>] [B<-a>|B<--archive-dir> I] [B<-z>|B<--compress> [I:]I] [B<-b>|B<--background>] [B<-d>|B<--delay>] [B<-p>|B<--pad> I] [B<-o>|B<--owner> I] [B<-g>|B<--group> I] [B<-m>|B<--mode> I] [B<-M>|B<--migrate> I] [B<-P>|B<--prolog> I] [B<-E>|B<--epilog> I] I [...] + +This command rotates a logfile I by subsequently creating up to +I (optionally compressed) archive files of it. Archive files are +named "I.I[I" where I is the +version number, 0 being the newest and "I-1" the oldest. + +A rotation step consists of the following steps: 1. remove archive file +number I-1; 2. move archive file number I-1 to I for I +counting from 1 to I-1; 3. move I to archive file number 0; +4. creating a new and empty instance of I. + +Option ``B<-s>'' can be used to only start a rotation step if I is +at least I bytes long. The argument I can be specified also +with the trailing units C (kilo), C (mega) or C (giga). + +Option ``B<-c>'' changes the approach of moving I to archive file +number 0: instead of a move followed by the creation of a new I, a +copy is performed followed by a truncation of I. The difference is +that in the first case (the default), if an application has I +still opened, after the rotation step it will have archive file number +0 opened and usually has to reopen the new I, while in the second +case the application can keep its open file handles to I. The +drawback of the second approach is that logfile entries are lost when +they are written to I between the executation of the copy and the +subsequent truncation operation. + +Option ``B<-r>'' removes I after rotation instead of providing a +new empty file. Option ``B<-a>'' forces archive files to be created in +the separate directory I. + +Option ``B<-z>'' enables compression of archive files with compression +level I (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 +part of the filename "I.II". The default +padding I 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-1 is removed from the filesystem. The +specified I 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 [B<-t>|B<--trace>] [B<-v>|B<--verbose>] [B<-o>|B<--output> I] [B<-c>|B<--compress> I] [B<-u>|B<--user> I] [B<-g>|B<--group> I] [B<-e>|B<--exclude> I] I [I ...] This command is for `rolling' distribution `tarballs', i.e. for the creation Index: ossp-pkg/shtool/shtoolize.in RCS File: /v/ossp/cvs/ossp-pkg/shtool/shtoolize.in,v rcsdiff -q -kk '-r1.25' '-r1.26' -u '/v/ossp/cvs/ossp-pkg/shtool/shtoolize.in,v' 2>/dev/null --- 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; Index: ossp-pkg/shtool/shtoolize.pod RCS File: /v/ossp/cvs/ossp-pkg/shtool/shtoolize.pod,v rcsdiff -q -kk '-r1.7' '-r1.8' -u '/v/ossp/cvs/ossp-pkg/shtool/shtoolize.pod,v' 2>/dev/null --- 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 Index: ossp-pkg/shtool/test.db RCS File: /v/ossp/cvs/ossp-pkg/shtool/test.db,v rcsdiff -q -kk '-r1.17' '-r1.18' -u '/v/ossp/cvs/ossp-pkg/shtool/test.db,v' 2>/dev/null --- 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 .