Hello everybody,

looking at this old but nasty bug that must be fixed for stretch:

* Trying to understand what goes wrong I wrote a small script that
  creates a few scenarios and executes logrotate then. Run it in
  an arbitrary directory like /tmp/ as regular user, with a single
  parameter in the range 0 to 4. Expect a lot of failures.

* In my understanding logrotate never compresses older logfiles even
  if they are not compressed yet, this will lead to the observed
  clashes. So I was about to write a patch that similar for Bolesław's
  proposal detects if the target file already exists, but would
  compress it then. However:

* github[1] contains a link[2] to a patch gentoo created. At least
  for all scenario my test script above creates, it solves the problems.
  I'd suggest you all test it as well and report back.

Cheers,

    Christoph

[1] https://github.com/logrotate/logrotate/pull/23
[2] 
https://gitweb.gentoo.org/repo/gentoo.git/plain/app-admin/logrotate/files/logrotate-3.10.0-atomic-create.patch?id=3aae9fbc
#!/bin/sh

set -e

mkdir -p logs
rm logs/* 2>/dev/null || true

create () {
    touch logs/logfile
    while [ "$1" ] ; do
        echo "$1" >logs/logfile$1
        shift
    done
}

compress () {
    while [ "$1" ] ; do
        gzip logs/logfile$1
        shift
    done
}


case "$1" in
0)
    # vanilla: some older logfiles
    create      '.1' '.2' '.3'
    compress    '.1' '.2' '.3'
    ;;
1)
    # first generation exists both plain and compressed
    create      '.1' '.2' '.3'
    compress    '.1' '.2' '.3'
    create      '.1'
    ;;
2)
    # first generation is not compressed - ERROR
    create      '.1' '.2' '.3' '.4'
    compress         '.2' '.3' '.4'
    ;;
3)
    # gen.1 not compressed, gen.2 missing
    create      '.1'      '.3' '.4'
    compress              '.3' '.4'
    ;;
4)
    # gen.1 not compressed, gen.[23] missing
    create      '.1'           '.4'
    compress                   '.4'
    ;;
'')
    echo "Usage: $0 <scenario>"
    exit 1
    ;;
*)
    echo "BUG: Undefined scenario '$1'"
    exit 2
    ;;
esac

CONF="$PWD/logrotate.conf"

cat <<__EOS__ >"$CONF"
$PWD/logs/logfile {
    daily
    missingok
    rotate 3
    compress
    copytruncate
    create 640 $(getent passwd $(id -u) | cut -d: -f1) $(getent group $(id -g) 
| cut -d: -f1)
}
__EOS__

STATE="$PWD/state"
rm "$STATE" >/dev/null || true

echo 'Files in logs/ [PRE]:'
ls -1 logs/

/usr/sbin/logrotate --force --state "$STATE" --verbose "$CONF" || true

echo 'Files in logs/ [POST]:'
ls -1 logs/
echo 'State file:'
cat "$STATE"

Attachment: signature.asc
Description: Digital signature

Reply via email to