svn commit: r218961 - in head/etc: periodic/daily rc.d

Doug Barton dougb at FreeBSD.org
Tue Feb 22 21:13:40 UTC 2011


Author: dougb
Date: Tue Feb 22 21:13:40 2011
New Revision: 218961
URL: http://svn.freebsd.org/changeset/base/218961

Log:
  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.

Modified:
  head/etc/periodic/daily/310.accounting
  head/etc/rc.d/accounting

Modified: head/etc/periodic/daily/310.accounting
==============================================================================
--- head/etc/periodic/daily/310.accounting	Tue Feb 22 19:37:12 2011	(r218960)
+++ head/etc/periodic/daily/310.accounting	Tue Feb 22 21:13:40 2011	(r218961)
@@ -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;;

Modified: head/etc/rc.d/accounting
==============================================================================
--- head/etc/rc.d/accounting	Tue Feb 22 19:37:12 2011	(r218960)
+++ head/etc/rc.d/accounting	Tue Feb 22 21:13:40 2011	(r218961)
@@ -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"


More information about the svn-src-all mailing list