summaryrefslogtreecommitdiffstats
path: root/etc
diff options
context:
space:
mode:
authordougb <dougb@FreeBSD.org>2011-02-22 21:13:40 +0000
committerdougb <dougb@FreeBSD.org>2011-02-22 21:13:40 +0000
commit7cea22540cedabac2509b77af9bb24843679a751 (patch)
tree86f9fe33da39fa232a253a1453d72a02d08f1272 /etc
parentf4cf481489b4389917b5159274baa5bbad704e3f (diff)
downloadFreeBSD-src-7cea22540cedabac2509b77af9bb24843679a751.zip
FreeBSD-src-7cea22540cedabac2509b77af9bb24843679a751.tar.gz
Update how accounting log files are rotated.
The old version had a race between the time that the old file was cp'ed to acct.0 and the time that 'sa -s' was run that prevented the commands that occurred in the meantime from being backed up. It's also arguable that the old version was inefficient in using cp which can be a problem on a space-constrained system. This version avoids both problems, albeit it's considerably more complicated. The advantage of putting the log rotation in the rc.d script is that it can handle the _enable and _file questions without having to do gymnastics to discover either value in the periodic script. As a side effect of reviewing the rc.d script I cleaned it up a bit.
Diffstat (limited to 'etc')
-rwxr-xr-xetc/periodic/daily/310.accounting9
-rwxr-xr-xetc/rc.d/accounting40
2 files changed, 38 insertions, 11 deletions
diff --git a/etc/periodic/daily/310.accounting b/etc/periodic/daily/310.accounting
index 0856399..b964616 100755
--- a/etc/periodic/daily/310.accounting
+++ b/etc/periodic/daily/310.accounting
@@ -41,13 +41,16 @@ case "$daily_accounting_enable" in
m=$n
n=$(($n - 1))
done
- cp -pf acct acct.0 || rc=3
- sa -s $daily_accounting_flags || rc=3
+
+ /etc/rc.d/accounting rotate_log || rc=3
case "$daily_accounting_compress" in
[Yy][Ee][Ss])
- gzip -f acct.0 || rc=3;;
+ gzip --keep -f acct.0 || rc=3;;
esac
+
+ sa -s $daily_accounting_flags /var/account/acct.0 &&
+ unlink acct.0 || rc=3
fi;;
*) rc=0;;
diff --git a/etc/rc.d/accounting b/etc/rc.d/accounting
index e4ae4a1..7ebc11f 100755
--- a/etc/rc.d/accounting
+++ b/etc/rc.d/accounting
@@ -14,28 +14,31 @@ name="accounting"
rcvar=`set_rcvar`
accounting_command="/usr/sbin/accton"
accounting_file="/var/account/acct"
+
+extra_commands="rotate_log"
+
start_cmd="accounting_start"
stop_cmd="accounting_stop"
+rotate_log_cmd="accounting_rotate_log"
accounting_start()
{
local _dir
- _dir=`dirname "$accounting_file"`
- if [ ! -d `dirname "$_dir"` ]; then
+ _dir="${accounting_file%/*}"
+ if [ ! -d "$_dir" ]; then
if ! mkdir -p "$_dir"; then
- warn "Could not create $_dir."
- return 1
+ err 1 "Could not create $_dir."
fi
fi
+
if [ ! -e "$accounting_file" ]; then
+ echo -n "Creating accounting file ${accounting_file}"
touch "$accounting_file"
+ echo '.'
fi
+ chmod 644 "$accounting_file"
- if [ ! -f ${accounting_file} ]; then
- echo "Creating accounting file ${accounting_file}"
- ( umask 022 ; > ${accounting_file} )
- fi
echo "Turning on accounting."
${accounting_command} ${accounting_file}
}
@@ -46,5 +49,26 @@ accounting_stop()
${accounting_command}
}
+accounting_rotate_log()
+{
+ local _dir _file
+
+ _dir="${accounting_file%/*}"
+ cd $_dir
+
+ if checkyesno accounting_enable; then
+ _file=`mktemp newacct-XXXXX`
+ ${accounting_command} ${_dir}/${_file}
+ fi
+
+ mv ${accounting_file} ${accounting_file}.0
+
+ if checkyesno accounting_enable; then
+ ln $_file ${accounting_file##*/}
+ ${accounting_command} ${accounting_file}
+ unlink $_file
+ fi
+}
+
load_rc_config $name
run_rc_command "$1"
OpenPOWER on IntegriCloud