Как удалить папку приложения предыдущей версии при обновлении (-Uvh) пакета RPM (номер версии изменен)?

#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}

Я пытаюсь создать свой собственный пакет RPM, и вот файл SPEC, он работает правильно при установке (rpm -ivh app-2.1-6.el6.x86_64.rpm) или обновлении (rpm -Uvh app-2.1-7. el6.x86_64.rpm) или удалить (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. 

Мой вопрос: независимо от того, как я изменяю номер версии, установка / обновление / удаление работают правильно, но если я изменю номер версии на 2.2 или 3.2, папка предыдущей версии (/opt/app-2.1) не будет удалена , может ли кто-нибудь мне помочь, как мне удалить папку предыдущей версии (/opt/app-2.1) при обновлении (-Uvh) пакета RPM?


person Haifeng Zhang    schedule 15.05.2014    source источник


Ответы (1)


Проблема в том, что вашему пакету не принадлежит каталог /opt/2.1.

Как и tar, rpm создаст все «отсутствующие» каталоги для установки содержимого по пути.

Но при стирании rpm удалит только те каталоги, которые явно упомянуты в манифесте% files.

Краткий ответ: если вы хотите, чтобы rpm --erase удалял путь к каталогу, упоминание в% files.

Короче: добавьте% dir / opt / app -% {version} в% files. Если каталог пуст (т. Е. Все остальные файлы в / opt / app -% {version} являются "собственными" и могут быть удалены), "own / opt / app =% {version}" также будет удален.

person Jeff Johnson    schedule 22.09.2014