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"
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to