From Fedora Project Wiki

Revision as of 15:17, 24 April 2009 by Toshio (talk | contribs) (Fix import for # lines)

Handling of Logfiles

Goals

  • logfiles should stay intact during package upgrades (e.g. do not lose old content)
  • logfiles should not be removed by package removals
  • rpm -V operations should not list them as bad files
  • logfiles should be associated with an rpm packages

Sniplet

%post
test -e %logfile || {
touch %logfile
chmod 0620 %logfile
chown root:somegroup %logfile
}

%files
%ghost %config                      %logfile

Rationale

rpm knows several attributes (%verify, %ghost, %config) which are candidates for handling logfiles. The following spec file uses possible combinations and shows their effects:

%global foos	A B C D E F H
%global logdir	/var/log/%name

Name:		foo
Version:	1
Release:	1
Summary:	none

Group:		none
License:	GPL
BuildRoot:	%_tmppath/%name-%version-%release-root
BuildArch:	noarch


%description

%install
rm -rf $RPM_BUILD_ROOT
mkdir -p $RPM_BUILD_ROOT%logdir

for i in %foos; do
touch $RPM_BUILD_ROOT%logdir/foo-$i
done


%post
for i in %foos; do
date >> %logdir/foo-$i
done
date >> %logfile/foo-Z

%clean
rm -rf $RPM_BUILD_ROOT


%files
%defattr(-,root,root,-)
%logdir/foo-A
%verify(not md5 size mtime) %logdir/foo-B
%config            %verify(not md5 size mtime) %logdir/foo-C
%config %ghost                                 %logdir/foo-D
%ghost                                 %logdir/foo-E
%config                                        %logdir/foo-F
%config(noreplace)                             %logdir/foo-G
%config(noreplace) %verify(not md5 size mtime) %logdir/foo-H

Initial installation

# rpm -U foo-1-1.noarch.rpm
# rpm -V foo
S.5....T   /var/log/foo/foo-A
S.5....T c /var/log/foo/foo-F
S.5....T c /var/log/foo/foo-G
# rpm -qf /var/log/foo/*
foo-1-1
foo-1-1
foo-1-1
foo-1-1
foo-1-1
foo-1-1
foo-1-1
foo-1-1
file /var/log/foo/foo-Z is not owned by any package

Conclusion::

  • case A (no attributes), F (plain %config) and G (%config(noreplace)) are violating third constraint (silent rpm -V)
  • case Z (not listed in %files) can not be associated with rpm package which violates fourth constraint

Upgrade

  • increase Release
# rpm -U foo-1-2.noarch.rpm
# wc -l /var/log/foo/*
1 /var/log/foo/foo-A
1 /var/log/foo/foo-B
2 /var/log/foo/foo-C
2 /var/log/foo/foo-D
2 /var/log/foo/foo-E
2 /var/log/foo/foo-F
2 /var/log/foo/foo-G
2 /var/log/foo/foo-H
2 /var/log/foo/foo-Z

Conclusion:: case A (no attributes) and B (only %verify) are violating first constraint (content must stay intact during upgrade)

Removal

warning: /var/log/foo/foo-H saved as /var/log/foo/foo-H.rpmsave
warning: /var/log/foo/foo-G saved as /var/log/foo/foo-G.rpmsave
warning: /var/log/foo/foo-F saved as /var/log/foo/foo-F.rpmsave
warning: /var/log/foo/foo-C saved as /var/log/foo/foo-C.rpmsave
foo-C.rpmsave
foo-D
foo-F.rpmsave
foo-G.rpmsave
foo-H.rpmsave
foo-Z

Conclusion::

  • only cases D (%config %ghost) and Z (not listed in %files) do not remove file after removal
  • A and B (no %ghost or %config) plus E (plain %ghost) remove logfiles completely
  • cases C, F, G and H (various %config attributes) rename old logfiles to .rpmsave; since .rpmsave files will not be backup-ed by rpm, subsequent rpm -U ; rpm -e operations will cause loss of logfiles too

Overall Comments

So it looks like case D satisfies all the requirements? --abadger1999 14:55, 24 April 2009 (UTC)