Centos – Avoid file conflict in rpm package

centosredhatrpm

I have created a rpm package.The part of .spec file is below

%install    
mkdir -p ${RPM_BUILD_ROOT}/etc/xyz    
cp -rf %{BDIR}/console ${RPM_BUILD_ROOT}/etc/xyz

%files    
/etc/xyz/console

So XYZ package copies console directory to /etc/xyz directory. console dir also contains some other dir.

Installation works perfectly fine but when I remove package rpm doesn't remove files and directory under /etc/xyz/console dir.

So on re-installing rpm package it says files are getting conflict.

How do we clean all files under dir?

Updates:

Directory structure:

console-
   -dashboard.html
   -index.html
   -login.html
   -logout.html

   -cgi-bin
   -cgi-bin/authenticate.py
   -cgi-bin/login.py
   -cgi-bin/logout.py

   -media
   -media/script/application.js
   -media/script/bootstrap.js
   -media/script/jquery.min.js960.css
   -media/script/jquery.flot.js

   -media/css/bootstrap.css
   -media/css/style.css
   -media/css/jquery-ui-1.10.0.custom.css

   -media/image/logo.png
   -media/image/banner.png

spec file:

%install

[ "$(cd "${RPM_BUILD_ROOT}" && pwd)" != "/" ] && rm -rf ${RPM_BUILD_ROOT}
mkdir -p ${RPM_BUILD_ROOT}/etc/application/console/cgi-bin
mkdir -p ${RPM_BUILD_ROOT}/etc/application/console/media/css
mkdir -p ${RPM_BUILD_ROOT}/etc/application/console/media/css/images
mkdir -p ${RPM_BUILD_ROOT}/etc/application/console/media/script


cp %{BDIR}/console/dashboard.html ${RPM_BUILD_ROOT}/etc/application/console/dashboard.html
cp %{BDIR}/console/index.html ${RPM_BUILD_ROOT}/etc/application/console/index.html
cp %{BDIR}/console/login.html ${RPM_BUILD_ROOT}/etc/application/console/login.html
cp %{BDIR}/console/logout.html ${RPM_BUILD_ROOT}/etc/application/console/logout.html


cp %{BDIR}/console/cgi-bin/authenticate.py ${RPM_BUILD_ROOT}/etc/application/console/cgi-bin/authenticate.py
cp %{BDIR}/console/cgi-bin/login.py ${RPM_BUILD_ROOT}/etc/application/console/cgi-bin/login.py
cp %{BDIR}/console/cgi-bin/logout.py ${RPM_BUILD_ROOT}/etc/application/console/cgi-bin/logout.py

cp %{BDIR}/console/media/css/boostrap.css ${RPM_BUILD_ROOT}/etc/application/console/media/css/boostrap.css
cp %{BDIR}/console/media/css/style.css ${RPM_BUILD_ROOT}/etc/application/console/media/css/style.css
cp %{BDIR}/console/media/css/jquery-ui-1.10.0.custom.css ${RPM_BUILD_ROOT}/etc/application/console/media/css/jquery-ui-1.10.0.custom.css

cp %{BDIR}/console/media/css/images/logo.png ${RPM_BUILD_ROOT}/etc/application/console/media/css/images/logo.png
cp %{BDIR}/console/media/css/images/banner.png ${RPM_BUILD_ROOT}/etc/application/console/media/css/images/banner.png

%files
%defattr(0700, root, root)

/etc/application/console/dashboard.html
/etc/application/console/index.html
/etc/application/console/login.html
/etc/application/console/logout.html

/etc/application/console/cgi-bin/authenticate.py
/etc/application/console/cgi-bin/authenticate.pyc
/etc/application/console/cgi-bin/authenticate.pyo
/etc/application/console/cgi-bin/login.py
/etc/application/console/cgi-bin/login.pyc
/etc/application/console/cgi-bin/login.pyo
/etc/application/console/cgi-bin/logout.py
/etc/application/console/cgi-bin/logout.pyc
/etc/application/console/cgi-bin/logout.pyo

/etc/application/console/media/css/boostrap.css
/etc/application/console/media/css/style.css
/etc/application/console/media/css/jquery-ui-1.10.0.custom.css

/etc/application/console/media/css/images/logo.png
/etc/application/console/media/css/images/banner.png


%post
echo "post install executing"

%preun

%postun
echo "post remove executing"

rm -rf /etc/application/console/cgi-bin/authenticate.py*
rm -rf /etc/application/console/cgi-bin/login.py*
rm -rf /etc/application/console/cgi-bin/logout.py*

Errors:

file /etc/application/console/cgi-bin/login.py from install of applicationconsole-1.0-1.x86_64 conflicts with file from package application_console-1.0-1.x86_64
file /etc/application/console/cgi-bin/logout.py from install of applicationconsole-1.0-1.x86_64 conflicts with file from package application_console-1.0-1.x86_64
file /etc/application/console/cgi-bin/authenticate.py from install of applicationconsole-1.0-1.x86_64 conflicts with file from package application_console-1.0-1.x86_64

More verbose remove package output

    D:     erase: waitpid(31098) rc 31098 status 0 secs 0.179    
    D: fini      100700  1 (   0,   0)      4827 /etc/application/console/cgi-bin/login.py skip
    D: fini      100700  1 (   0,   0)      1195 /etc/application/console/cgi-bin/logout.py
skip
    D: fini      100700  1 (   0,   0)      7227 /etc/application/console/cgi-bin/authenticate.py skip
    D: fini      100700  1 (   0,   0)     33550 /etc/cachebox/console/application.html
    D: fini      100700  1 (   0,   0)     33550 /etc/cachebox/console/login.html
    D: fini      100700  1 (   0,   0)     33550 /etc/cachebox/console/logout.html

If you notice rpm package manager is skipping some files.Question is why?

Best Answer

RPM will only remove files specified under "%files" directive, but only if there are no files under that directory. If you want "rpm -e" to remove all the files under "/etc/xyz/console" you will have to explicitly specify them under "%files"directive.

RPM does not delete anything it doesn't recognize on purpose as it is not safe, so you do not lose data just by removing the package, think about config files on the update for example. There is always an easy way to see what the RPM gets delivered with into the OS "rpm -qpl your_package.rpm" In your case there are 2 ways to have the files removed:

1) Specify them explicitly under "%files"

2) Or run "%postun" script where you remove your files and directories you intend.

Hope this helps.