Haifeng Zhang
Haifeng Zhang

Reputation: 31915

How to remove the previous version app folder when update(-Uvh) the RPM package(version number modified)?

#define program installation destination
%define app_destination   /opt
%define app_name    MY_APP_NAME
%define app_version    2.1
%define app_release    7%{?dist}
%define app_dir    %{app_name}-%{app_version}
%define compress_file    %{app_dir}.tar.gz
%define app_service_softlink    /etc/init.d/%{app_name}
%define app_dir_softlink    %{app_destination}/%{app_name}


Name:    %{app_name}
Version:    %{app_version}
Release:    %{app_release}
Summary:    MY APP ONE-SENTENCE SUMMARY %{app_version}

# An open source software license
License:    GPLv3+
URL:    http://www.starscriber.com/
Source0:    http://ftp.gnu.org/gnu/%{compress_file}


%description 
MY APP DESCRIPTION

%pre
#each time before install/upgrade RPM, check and remove the softlinks provided below
echo "pre..."

if [ -L %{app_service_softlink} ];then
    rm %{app_service_softlink}
elif [ -f %{app_service_softlink} ];then
    rm %{app_service_softlink}
fi

if [ -L %{app_dir_softlink} ]; then 
    rm %{app_dir_softlink}
elif [ -d %{app_dir_softlink} ]; then
    rmdir %{app_dir_softlink}
fi



%prep
%setup -q
echo "prep..."

# Script commands to "build" the program (e.g. to compile it) and 
# get it ready for installing. The program should come with 
# instructions on how to do this. 
%build


%install
echo "install..."
# uses relative paths 
# creates buildroot/destination directory 
mkdir -p %{buildroot}%{app_destination}

# copies tar.gz file from source directory to buildroot/destination directory
cp %{_sourcedir}/%{compress_file} %{buildroot}%{app_destination}

# changes directory to buildroot/destination
cd %{buildroot}%{app_destination}

# extracts compression file
tar xf %{compress_file}

# removes the compression file
rm -rf %{compress_file}

cd %{buildroot}%{app_destination}


#invoked after %post when RPM pkg is removal or upgrade
%preun
echo "preun..."
#leftover cleanup


#invoked after %preun when RPM pkg is removal or upgrade
%postun
echo "postun..."
if [ "$1" == "0" ]; then
    rm -rf %{app_destination}/%{app_dir}
fi

if [ ! -d %{app_destination}/%{app_dir} ]; then
    if [ -L %{app_service_softlink} ]; then
        rm %{app_service_softlink}
    elif [ -f %{app_service_softlink} ]; then
        rm %{app_service_softlink}
    fi

    if [ -L %{app_dir_softlink} ]; then
        rm %{app_dir_softlink}
    elif [ -d %{app_dir_softlink} ]; then
        rmdir %{app_dir_softlink}
    fi
fi

%files
#all files under the provided folder will be gathered up to create RPM pkg
%{app_destination}/%{app_dir}/bin
%{app_destination}/%{app_dir}/conf
%{app_destination}/%{app_dir}/misc



%post
echo "post"
#symbolic link to the new appdir with version
echo "builds new symbolic link for the app folder"
ln -sf  %{app_destination}/%{app_dir}  %{app_dir_softlink}

echo "builds new symbolic link for the app service"
# make a symbolic for the service file using the new created softlink
ln -sf %{app_destination}/%{app_name}/misc/%{app_name} %{app_service_softlink}

I am trying to create my own RPM package, and here's the SPEC file, it works properly when install(rpm -ivh app-2.1-6.el6.x86_64.rpm), or upgrade(rpm -Uvh app-2.1-7.el6.x86_64.rpm) or remove (rpm -e app-2.1-7.el6.x86_64.rpm)

For RPM package app-2.1-7.el6.x86_64.rpm, the version is 2.1 and release number is 7. 

My question is, no matter how I modify the release number, install/upgrade/remove are working properly, but if I modify the version number to 2.2 or 3.2, the previous version folder(/opt/app-2.1) will not be deleted, can anyone help me, how should I delete the previous version folder(/opt/app-2.1) when I update(-Uvh) the RPM package?

Upvotes: 1

Views: 1434

Answers (1)

Jeff Johnson
Jeff Johnson

Reputation: 2390

The problem is that your package doesn't "own" the directory /opt/2.1 directory.

Just like tar, rpm will create all "missing" directories in order to install content on a path.

But on erase, rpm will only remove directories that are mentioned explicitly in the %files manifest.

Short answer: If you want rpm --erase to remove a directory path, the mention in %files.

Shorter anser: Add %dir /opt/app-%{version} to %files. If the directory is empty (i.e. all other files in /opt/app-%{version} are "owned" and can be removed), the the "owned /opt/app=%{version} will be removed as well.

Upvotes: 1

Related Questions