diff options
Diffstat (limited to 'src/pmlogger/pmlogger_daily.sh')
-rwxr-xr-x | src/pmlogger/pmlogger_daily.sh | 952 |
1 files changed, 952 insertions, 0 deletions
diff --git a/src/pmlogger/pmlogger_daily.sh b/src/pmlogger/pmlogger_daily.sh new file mode 100755 index 0000000..12bc3d7 --- /dev/null +++ b/src/pmlogger/pmlogger_daily.sh @@ -0,0 +1,952 @@ +#! /bin/sh +# +# Copyright (c) 2013-2014 Red Hat. +# Copyright (c) 1995-2000,2003 Silicon Graphics, Inc. All Rights Reserved. +# +# This program is 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 program 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. +# +# Daily administrative script for PCP archive logs +# + +. $PCP_DIR/etc/pcp.env +. $PCP_SHARE_DIR/lib/rc-proc.sh + +# error messages should go to stderr, not the GUI notifiers +# +unset PCP_STDERR + +# constant setup +# +prog=`basename $0` +tmp=`mktemp -d /tmp/pcp.XXXXXXXXX` || exit 1 +status=0 + +_cleanup() +{ + lockfile=`cat $tmp/lock 2>/dev/null` + rm -f "$PCP_RUN_DIR/pmlogger_daily.pid" "$lockfile" + rm -rf $tmp +} +trap "_cleanup; exit \$status" 0 1 2 3 15 +echo >$tmp/lock + +if is_chkconfig_on pmlogger +then + PMLOGGER_CTL=on +else + PMLOGGER_CTL=off +fi + +# control file for pmlogger administration ... edit the entries in this +# file to reflect your local configuration (see also -c option below) +# +CONTROL=$PCP_PMLOGGERCONTROL_PATH + +# default number of days to keep archive logs +# +CULLAFTER=14 + +# default compression program and days until starting compression +# +COMPRESS=xz +COMPRESSAFTER="" +COMPRESSREGEX="\.(meta|index|Z|gz|bz2|zip|xz|lzma|lzo|lz4)$" + +# threshold size to roll $PCP_LOG_DIR/NOTICES +# +NOTICES=$PCP_LOG_DIR/NOTICES +ROLLNOTICES=20480 + +# mail addresses to send daily NOTICES summary to +# +MAILME="" +MAILFILE=$PCP_LOG_DIR/NOTICES.daily + +# search for your mail agent of choice ... +# +MAIL='' +for try in Mail mail email +do + if which $try >/dev/null 2>&1 + then + MAIL=$try + break + fi +done + +# NB: FQDN cleanup; don't guess a 'real name for localhost', and +# definitely don't truncate it a la `hostname -s`. Instead now +# we use such a string only for the default log subdirectory, ie. +# for substituting LOCALHOSTNAME in the fourth column of $CONTROL. + +# determine path for pwd command to override shell built-in +# (see BugWorks ID #595416). +PWDCMND=`which pwd 2>/dev/null | $PCP_AWK_PROG ' +BEGIN { i = 0 } +/ not in / { i = 1 } +/ aliased to / { i = 1 } + { if ( i == 0 ) print } +'` +if [ -z "$PWDCMND" ] +then + # Looks like we have no choice here... + # force it to a known IRIX location + PWDCMND=/bin/pwd +fi +eval $PWDCMND -P >/dev/null 2>&1 +[ $? -eq 0 ] && PWDCMND="$PWDCMND -P" +here=`$PWDCMND` + +echo > $tmp/usage +cat >> $tmp/usage <<EOF +Options: + -c=FILE,--control=FILE pmlogger control file + -k=N,--discard=N remove archives after N days + -m=ADDRs,--mail=ADDRs send daily NOTICES entries to email addresses + -M do not rewrite, merge or rename archives + -N,--showme perform a dry run, showing what would be done + -o merge yesterdays logs only (old form, default is all) + -r,--norewrite do not process archives with pmlogrewrite(1) + -s=SIZE,--rotate=SIZE rotate NOTICES file after reaching SIZE bytes + -t=WANT implies -VV, keep verbose output trace for WANT days + -V,--verbose verbose output (multiple times for very verbose) + -x=N,--compress-after=N compress archive data files after N days + -X=PROGRAM,--compressor=PROGRAM use PROGRAM for archive data file compression + -Y=REGEX,--regex=REGEX egrep filter when compressing files ["$COMPRESSREGEX"] + --help +EOF + +_usage() +{ + pmgetopt --progname=$prog --config=$tmp/usage --usage + status=1 + exit +} + +# option parsing +# +SHOWME=false +VERBOSE=false +VERY_VERBOSE=false +MYARGS="" +OFLAG=false +TRACE=0 +RFLAG=false +MFLAG=false + +ARGS=`pmgetopt --progname=$prog --config=$tmp/usage -- "$@"` +[ $? != 0 ] && exit 1 + +eval set -- "$ARGS" +while [ $# -gt 0 ] +do + case "$1" + in + -c) CONTROL="$2" + shift + ;; + -k) CULLAFTER="$2" + shift + check=`echo "$CULLAFTER" | sed -e 's/[0-9]//g'` + if [ ! -z "$check" -a X"$check" != Xforever ] + then + echo "Error: -k option ($CULLAFTER) must be numeric" + status=1 + exit + fi + ;; + -m) MAILME="$2" + shift + ;; + -N) SHOWME=true + MYARGS="$MYARGS -N" + ;; + -M) MFLAG=true + RFLAG=true + ;; + -o) OFLAG=true + ;; + -r) RFLAG=true + ;; + -s) ROLLNOTICES="$2" + shift + check=`echo "$ROLLNOTICES" | sed -e 's/[0-9]//g'` + if [ ! -z "$check" ] + then + echo "Error: -s option ($ROLLNOTICES) must be numeric" + status=1 + exit + fi + ;; + -t) TRACE="$2" + shift + # from here on, all stdout and stderr output goes to + # $PCP_LOG_DIR/pmlogger/daily.<date>.trace + # + exec 1>$PCP_LOG_DIR/pmlogger/daily.`date "+%Y%m%d.%H.%M"`.trace 2>&1 + VERBOSE=true + VERY_VERBOSE=true + MYARGS="$MYARGS -V -V" + ;; + -V) if $VERBOSE + then + VERY_VERBOSE=true + else + VERBOSE=true + fi + MYARGS="$MYARGS -V" + ;; + -x) COMPRESSAFTER="$2" + shift + check=`echo "$COMPRESSAFTER" | sed -e 's/[0-9]//g'` + if [ ! -z "$check" ] + then + echo "Error: -x option ($COMPRESSAFTER) must be numeric" + status=1 + exit + fi + ;; + -X) COMPRESS="$2" + shift + ;; + -Y) COMPRESSREGEX="$2" + shift + ;; + --) shift + break + ;; + -\?) _usage + ;; + esac + shift +done + +[ $# -ne 0 ] && _usage + +if [ ! -f "$CONTROL" ] +then + echo "$prog: Error: cannot find control file ($CONTROL)" + status=1 + exit +fi + +# each new archive log started by pmnewlog or pmlogger_check is named +# yyyymmdd.hh.mm +# +LOGNAME=`date "+%Y%m%d.%H.%M"` + +_error() +{ + _report Error "$1" +} + +_warning() +{ + _report Warning "$1" +} + +_report() +{ + echo "$prog: $1: $2" + echo "[$CONTROL:$line] ... logging for host \"$host\" unchanged" + touch $tmp/err +} + +_unlock() +{ + rm -f lock + echo >$tmp/lock +} + +# filter file names to leave those that look like PCP archives +# managed by pmlogger_check and pmlogger_daily, namely they begin +# with a datestamp +# +# need to handle both the year 2000 and the old name formats, and +# possible ./ prefix (from find .) +# +_filter_filename() +{ + sed -n \ + -e 's/^\.\///' \ + -e '/^[12][0-9][0-9][0-9][0-1][0-9][0-3][0-9][-.]/p' \ + -e '/^[0-9][0-9][0-1][0-9][0-3][0-9][-.]/p' +} + +_get_ino() +{ + # get inode number for $1 + # throw away stderr (and return '') in case $1 has been removed by now + # + stat "$1" 2>/dev/null \ + | sed -n '/Device:[ ].*[ ]Inode:/{ +s/Device:[ ].*[ ]Inode:[ ]*// +s/[ ].*// +p +}' +} + +# mails out any entries for the previous 24hrs from the PCP notices file +# +if [ ! -z "$MAILME" ] +then + # get start time of NOTICES entries we want - all earlier are discarded + # + args=`pmdate -1d '-v yy=%Y -v my=%b -v dy=%d'` + args=`pmdate -1d '-v Hy=%H -v My=%M'`" $args" + args=`pmdate '-v yt=%Y -v mt=%b -v dt=%d'`" $args" + + # + # Basic algorithm: + # from NOTICES head, look for a DATE: entry for yesterday or today; + # if its yesterday, find all HH:MM timestamps which are in the window, + # until the end of yesterday is reached; + # copy out the remainder of the file (todays entries). + # + # initially, entries have one of three forms: + # DATE: weekday mon day HH:MM:SS year + # Started by pmlogger_daily: weekday mon day HH:MM:SS TZ year + # HH:MM message + # + + # preprocess to provide a common date separator - if new date stamps are + # ever introduced into the NOTICES file, massage them first... + # + rm -f $tmp/pcp + $PCP_AWK_PROG ' +/^Started/ { print "DATE:",$4,$5,$6,$7,$9; next } + { print } + ' $NOTICES | \ + $PCP_AWK_PROG -F ':[ \t]*|[ \t]+' $args ' +$1 == "DATE" && $3 == mt && $4 == dt && $8 == yt { tday = 1; print; next } +$1 == "DATE" && $3 == my && $4 == dy && $8 == yy { yday = 1; print; next } + { if ( tday || (yday && $1 > Hy) || (yday && $1 == Hy && $2 >= My) ) + print + }' >$tmp/pcp + + if [ -s $tmp/pcp ] + then + if [ ! -z "$MAIL" ] + then + $MAIL -s "PCP NOTICES summary for `hostname`" $MAILME <$tmp/pcp + else + echo "$prog: Warning: cannot find a mail agent to send mail ..." + echo "PCP NOTICES summary for `hostname`" + cat $tmp/pcp + fi + [ -w `dirname "$NOTICES"` ] && mv $tmp/pcp "$MAILFILE" + fi +fi + + +# Roll $PCP_LOG_DIR/NOTICES -> $PCP_LOG_DIR/NOTICES.old if larger +# that 10 Kbytes, and you can write in $PCP_LOG_DIR +# +if [ -s "$NOTICES" -a -w `dirname "$NOTICES"` ] +then + if [ "`wc -c <"$NOTICES"`" -ge $ROLLNOTICES ] + then + if $VERBOSE + then + echo "Roll $NOTICES -> $NOTICES.old" + echo "Start new $NOTICES" + fi + if $SHOWME + then + echo "+ mv -f $NOTICES $NOTICES.old" + echo "+ touch $NOTICES" + else + echo >>"$NOTICES" + echo "*** rotated by $prog: `date`" >>"$NOTICES" + mv -f "$NOTICES" "$NOTICES.old" + echo "Started by $prog: `date`" >"$NOTICES" + (id "$PCP_USER" && chown $PCP_USER:$PCP_GROUP "$NOTICES") >/dev/null 2>&1 + fi + fi +fi + +# Keep our pid in $PCP_RUN_DIR/pmlogger_daily.pid ... this is checked +# by pmlogger_check when it fails to obtain the lock should it be run +# while pmlogger_daily is running +# +# For most packages, $PCP_RUN_DIR is included in the package, +# but for Debian and cases where /var/run is a mounted filesystem +# it may not exist, so create it here before it is used to create +# any pid/lock files +# +# $PCP_RUN_DIR creation is also done in pmcd startup, but pmcd may +# not be running on this system +# +if [ ! -d "$PCP_RUN_DIR" ] +then + mkdir -p -m 775 "$PCP_RUN_DIR" + chown $PCP_USER:$PCP_GROUP "$PCP_RUN_DIR" +fi +echo $$ >"$PCP_RUN_DIR"/pmlogger_daily.pid + +# note on control file format version +# 1.0 was shipped as part of PCPWEB beta, and did not include the +# socks field [this is the default for backwards compatibility] +# 1.1 is the first production release, and the version is set in +# the control file with a $version=1.1 line (see below) +# + +rm -f $tmp/err +line=0 +version='' +cat $CONTROL \ +| sed -e "s;PCP_LOG_DIR;$PCP_LOG_DIR;g" \ +| while read host primary socks dir args +do + # start in one place for each iteration (beware relative paths) + cd "$here" + line=`expr $line + 1` + + # NB: FQDN cleanup: substitute the LOCALHOSTNAME marker in the config line + # differently for the directory and the pcp -h HOST arguments. + dir_hostname=`hostname || echo localhost` + dir=`echo $dir | sed -e "s;LOCALHOSTNAME;$dir_hostname;"` + [ "x$host" = "xLOCALHOSTNAME" ] && host=local: + + $VERY_VERBOSE && echo "[control:$line] host=\"$host\" primary=\"$primary\" socks=\"$socks\" dir=\"$dir\" args=\"$args\"" + + case "$host" + in + \#*|'') # comment or empty + continue + ;; + + \$*) # in-line variable assignment + $SHOWME && echo "# $host $primary $socks $dir $args" + cmd=`echo "$host $primary $socks $dir $args" \ + | sed -n \ + -e "/='/s/\(='[^']*'\).*/\1/" \ + -e '/="/s/\(="[^"]*"\).*/\1/' \ + -e '/=[^"'"'"']/s/[;&<>|].*$//' \ + -e '/^\\$[A-Za-z][A-Za-z0-9_]*=/{ +s/^\\$// +s/^\([A-Za-z][A-Za-z0-9_]*\)=/export \1; \1=/p +}'` + if [ -z "$cmd" ] + then + # in-line command, not a variable assignment + _warning "in-line command is not a variable assignment, line ignored" + else + case "$cmd" + in + 'export PATH;'*) + _warning "cannot change \$PATH, line ignored" + ;; + 'export IFS;'*) + _warning "cannot change \$IFS, line ignored" + ;; + *) + $SHOWME && echo "+ $cmd" + eval $cmd + ;; + esac + fi + continue + ;; + esac + + if [ -z "$version" -o "$version" = "1.0" ] + then + if [ -z "$version" ] + then + echo "$prog: Warning: processing default version 1.0 control format" + version=1.0 + fi + args="$dir $args" + dir="$socks" + socks=n + fi + + if [ -z "$primary" -o -z "$socks" -o -z "$dir" -o -z "$args" ] + then + _error "insufficient fields in control file record" + continue + fi + + if $VERY_VERBOSE + then + pflag='' + [ $primary = y ] && pflag=' -P' + echo "Check pmlogger$pflag -h $host ... in $dir ..." + fi + + if [ ! -d $dir ] + then + _error "archive directory ($dir) does not exist" + continue + fi + + cd $dir + dir=`$PWDCMND` + $SHOWME && echo "+ cd $dir" + + if $VERBOSE + then + echo + echo "=== daily maintenance of PCP archives for host $host ===" + echo + fi + + if [ ! -w $dir ] + then + echo "$prog: Warning: no write access in $dir, skip lock file processing" + else + # demand mutual exclusion + # + fail=true + rm -f $tmp/stamp + for try in 1 2 3 4 + do + if pmlock -v lock >$tmp/out + then + echo $dir/lock >$tmp/lock + fail=false + break + else + if [ ! -f $tmp/stamp ] + then + touch -t `pmdate -30M %Y%m%d%H%M` $tmp/stamp + fi + if [ ! -z "`find lock -newer $tmp/stamp -print 2>/dev/null`" ] + then + : + else + echo "$prog: Warning: removing lock file older than 30 minutes" + LC_TIME=POSIX ls -l $dir/lock + rm -f lock + fi + fi + sleep 5 + done + + if $fail + then + # failed to gain mutex lock + # + if [ -f lock ] + then + echo "$prog: Warning: is another PCP cron job running concurrently?" + LC_TIME=POSIX ls -l $dir/lock + else + echo "$prog: `cat $tmp/out`" + fi + _warning "failed to acquire exclusive lock ($dir/lock) ..." + continue + fi + fi + + pid='' + if [ X"$primary" = Xy ] + then + # NB: FQDN cleanup: previously, we used to quietly accept several + # putative-aliases in the first (hostname) slot for a primary logger, + # which were all supposed to refer to the local host. So now we + # squash them all to the officially pcp-preferred way to access it. + host=local: + + if test -f "$PCP_TMP_DIR/pmlogger/primary" + then + $VERY_VERBOSE && $PCP_ECHO_PROG $PCP_ECHO_N "... try $PCP_TMP_DIR/pmlogger/primary: ""$PCP_ECHO_C" + primary_inode=`_get_ino $PCP_TMP_DIR/pmlogger/primary` + $VERY_VERBOSE && echo primary_inode=$primary_inode + for file in $PCP_TMP_DIR/pmlogger/* + do + case "$file" + in + */primary|*\*) + ;; + */[0-9]*) + inode=`_get_ino "$file"` + $VERY_VERBOSE && echo $file inode=$inode + if [ "$primary_inode" = "$inode" ] + then + pid="`echo $file | sed -e 's/.*\/\([^/]*\)$/\1/'`" + break + fi + ;; + esac + done + if [ -z "$pid" ] + then + if $VERY_VERBOSE + then + echo "primary pmlogger process pid not found" + ls -l "$PCP_TMP_DIR/pmlogger" + fi + else + if _get_pids_by_name pmlogger | grep "^$pid\$" >/dev/null + then + $VERY_VERBOSE && echo "primary pmlogger process $pid identified, OK" + else + $VERY_VERBOSE && echo "primary pmlogger process $pid not running" + pid=`` + fi + fi + fi + else + for log in $PCP_TMP_DIR/pmlogger/[0-9]* + do + [ "$log" = "$PCP_TMP_DIR/pmlogger/[0-9]*" ] && continue + $VERY_VERBOSE && $PCP_ECHO_PROG $PCP_ECHO_N "... try $log: ""$PCP_ECHO_C" + match=`sed -e '3s/\/[0-9][0-9][0-9][0-9][0-9.]*$//' $log \ + | $PCP_AWK_PROG ' +BEGIN { m = 0 } +NR == 3 && $0 == "'$dir'" { m = 2; next } +END { print m }'` + $VERY_VERBOSE && $PCP_ECHO_PROG $PCP_ECHO_N "match=$match ""$PCP_ECHO_C" + if [ "$match" = 2 ] + then + pid=`echo $log | sed -e 's,.*/,,'` + if _get_pids_by_name pmlogger | grep "^$pid\$" >/dev/null + then + $VERY_VERBOSE && echo "pmlogger process $pid identified, OK" + break + fi + $VERY_VERBOSE && echo "pmlogger process $pid not running, skip" + pid='' + else + $VERY_VERBOSE && echo "different directory, skip" + fi + done + fi + + if [ -z "$pid" ] + then + if [ "$PMLOGGER_CTL" = "on" ] + then + _error "no pmlogger instance running for host \"$host\"" + fi + else + # now execute pmnewlog to "roll the archive logs" + # + [ X"$primary" != Xy ] && args="-p $pid $args" + # else: -P is already the default + [ X"$socks" = Xy ] && args="-s $args" + args="$args -m pmlogger_daily" + $SHOWME && echo "+ pmnewlog$MYARGS $args $LOGNAME" + if pmnewlog$MYARGS $args $LOGNAME + then + : + else + _error "problems executing pmnewlog for host \"$host\"" + touch $tmp/err + fi + fi + $VERBOSE && echo + + # Merge archive logs. + # + # Will work for new style YYYYMMDD.HH.MM[-NN] archives and old style + # YYMMDD.HH.MM[-NN] archives. + # Note: we need to handle duplicate-breaking forms like + # YYYYMMDD.HH.MM-seq# (even though pmlogger_merge already picks most + # of these up) in case the base YYYYMMDD.HH.MM archive is for some + # reason missing here + # + # Assume if .meta file is present then other archive components are + # also present (if not the case it is a serious process botch, and + # pmlogger_merge will fail below) + # + # Find all candidate input archives, remove any that contain today's + # date and group the remainder by date. + # + TODAY=`date +%Y%m%d` + + find *.meta \ + \( -name "*.[0-2][0-9].[0-5][0-9].meta" \ + -o -name "*.[0-2][0-9].[0-5][0-9]-[0-9][0-9].meta" \ + \) \ + -print 2>/dev/null \ + | sed \ + -e "/^$TODAY\./d" \ + -e 's/\.meta//' \ + | sort -n \ + | $PCP_AWK_PROG ' + { if (lastdate != "" && match($1, "^" lastdate "\\.") == 1) { + # same date as previous one + inlist = inlist " " $1 + next + } + else { + # different date as previous one + if (inlist != "") print lastdate,inlist + inlist = $1 + lastdate = $1 + sub(/\..*/, "", lastdate) + } + } +END { if (inlist != "") print lastdate,inlist }' >$tmp/list + + if $OFLAG + then + # -o option, preserve the old semantics, and only process the + # previous day's archives ... aim for a time close to midday + # yesterday and report that date + # + now_hr=`pmdate %H` + hr=`expr 12 + $now_hr` + grep "^[0-9]*`pmdate -${hr}H %y%m%d` " $tmp/list >$tmp/tmp + mv $tmp/tmp $tmp/list + fi + + # pmlogrewrite if no -r on command line and + # (a) pmlogrewrite exists in the same directory that the input + # archives are found, or + # (b) if $PCP_VAR_LIB/config/pmlogrewrite exists + # "exists" => file, directory or symbolic link + # + rewrite='' + if $RFLAG + then + : + else + for type in -f -d -L + do + if [ $type "$dir/pmlogrewrite" ] + then + rewrite="$dir/pmlogrewrite" + break + fi + done + if [ -z "$rewrite" ] + then + for type in -f -d -L + do + if [ $type "$PCP_VAR_DIR/config/pmlogrewrite" ] + then + rewrite="$PCP_VAR_DIR/config/pmlogrewrite" + break + fi + done + fi + fi + + rm -f $tmp/skip + if $MFLAG + then + # -M don't rewrite, merge or rename + # + : + else + if [ ! -s $tmp/list ] + then + if $VERBOSE + then + echo "$prog: Warning: no archives found to merge" + $VERY_VERBOSE && ls -l + fi + else + cat $tmp/list \ + | while read outfile inlist + do + if [ -f $outfile.0 -o -f $outfile.index -o -f $outfile.meta ] + then + echo "$prog: Warning: output archive ($outfile) already exists" + echo "[$CONTROL:$line] ... skip log merging, culling and compressing for host \"$host\"" + touch $tmp/skip + break + else + if [ -n "$rewrite" ] + then + $VERY_VERBOSE && echo "Rewriting input archives using $rewrite" + for arch in $inlist + do + if pmlogrewrite -iq -c "$rewrite" $arch + then + : + else + echo "$prog: Warning: rewrite for $arch using -c $rewrite failed" + echo "[$CONTROL:$line] ... skip log merging, culling and compressing for host \"$host\"" + touch $tmp/skip + break + fi + done + + fi + if $VERY_VERBOSE + then + for arch in $inlist + do + echo "Input archive $arch ..." + pmdumplog -L $arch + done + fi + narch=`echo $inlist | wc -w | sed -e 's/ //g'` + if [ "$narch" = 1 ] + then + # optimization ... rename don't merge for one input + # archive case + # + if $SHOWME + then + echo "+ pmlogmv$MYARGS $inlist $outfile" + else + if pmlogmv$MYARGS $inlist $outfile + then + if $VERY_VERBOSE + then + echo "Renamed output archive $outfile ..." + pmdumplog -L $outfile + fi + else + _error "problems executing pmlogmv for host \"$host\"" + fi + fi + else + # more than one input archive, merge away + # + if $SHOWME + then + echo "+ pmlogger_merge$MYARGS -f $inlist $outfile" + else + if pmlogger_merge$MYARGS -f $inlist $outfile + then + if $VERY_VERBOSE + then + echo "Merged output archive $outfile ..." + pmdumplog -L $outfile + fi + else + _error "problems executing pmlogger_merge for host \"$host\"" + fi + fi + fi + fi + done + fi + fi + + if [ -f $tmp/skip ] + then + # this is sufficiently serious that we don't want to remove + # the lock file, so problems are not compounded the next time + # the script is run + $VERY_VERBOSE && echo "Skip culling and compression ..." + continue + fi + + # and cull old archives + # + if [ X"$CULLAFTER" != X"forever" ] + then + if [ "$PCP_PLATFORM" = freebsd ] + then + # FreeBSD semantics for find(1) -mtime +N are "rounded up to + # the next full 24-hour period", compared to GNU/Linux semantics + # "any fractional part is ignored". So, these are almost always + # off by one day in terms of the files selected. + # For consistency, try to match the GNU/Linux semantics by using + # one MORE day. + # + mtime=`expr $CULLAFTER + 1` + else + mtime=$CULLAFTER + fi + find . -type f -mtime +$mtime \ + | _filter_filename \ + | sort >$tmp/list + if [ -s $tmp/list ] + then + if $VERBOSE + then + echo "Archive files older than $CULLAFTER days being removed ..." + fmt <$tmp/list | sed -e 's/^/ /' + fi + if $SHOWME + then + cat $tmp/list | xargs echo + rm -f + else + cat $tmp/list | xargs rm -f + fi + else + $VERY_VERBOSE && echo "$prog: Warning: no archive files found to cull" + fi + fi + + # and compress old archive data files + # (after cull - don't compress unnecessarily) + # + if [ ! -z "$COMPRESSAFTER" ] + then + if [ "$PCP_PLATFORM" = freebsd ] + then + # See note above re. find(1) on FreeBSD + # + mtime=`expr $COMPRESSAFTER - 1` + else + mtime=$COMPRESSAFTER + fi + find . -type f -mtime +$mtime \ + | _filter_filename \ + | egrep -v "$COMPRESSREGEX" \ + | sort >$tmp/list + if [ -s $tmp/list ] + then + if $VERBOSE + then + echo "Archive files older than $COMPRESSAFTER days being compressed ..." + fmt <$tmp/list | sed -e 's/^/ /' + fi + if $SHOWME + then + cat $tmp/list | xargs echo + $COMPRESS + else + cat $tmp/list | xargs $COMPRESS + fi + else + $VERY_VERBOSE && echo "$prog: Warning: no archive files found to compress" + fi + fi + + # and cull old trace files (from -t option) + # + if [ "$TRACE" -gt 0 ] + then + if [ "$PCP_PLATFORM" = freebsd ] + then + # See note above re. find(1) on FreeBSD + # + mtime=`expr $TRACE - 1` + else + mtime=$TRACE + fi + find $PCP_LOG_DIR/pmlogger -type f -mtime +$mtime \ + | sed -n -e '/pmlogger\/daily\..*\.trace/p' \ + | sort >$tmp/list + if [ -s $tmp/list ] + then + if $VERBOSE + then + echo "Trace files older than $TRACE days being removed ..." + fmt <$tmp/list | sed -e 's/^/ /' + fi + if $SHOWME + then + cat $tmp/list | xargs echo + rm -f + else + cat $tmp/list | xargs rm -f + fi + else + $VERY_VERBOSE && echo "$prog: Warning: no trace files found to cull" + fi + fi + + _unlock + +done + +[ -f $tmp/err ] && status=1 +exit |