On 2011/12/15 05:12PM, Raphael Hertzog wrote: [...] >> In the preinst script, "upgrade" command, I'd invoke the helper as >> above, and it will result in something like (as per Raphael's >> suggestions): >> 1) # Ensure ownership of $dir by the package >> 2) mv "$dir" "$dir".dpkg_bak >> >> In postinst, command "configure", I'd have >> 1) rm -rf "$dir".dpkg_bak > >Yes. > >> and finally, in postrm upgrade I'd have: >> 1) mv "$dir".dpkg_bak "$dir" > >Here it should be "postrm failed-upgrade" I think. And it should not fail >if $dir.dpkg_bak does not exist (the failure to upgrade might be due to >something else and maybe that dir doesn't exist yet). > >BTW for consistency please use ".dpkg-bak" and not ".dpkg_bak". > I've tried to go on about the first case (substitute a directory with a symlink). I've noticed there are idioms to perform some of the operations that I had to perform, so I tried to stick to them. I thought it was a good idea to share with you the patch for the first case for feedback, before going on. I've created the patch according to the guidelines at the dpkg team's website¹. Any feedback would be much appreciated. Cheers, ¹ http://wiki.debian.org/Teams/Dpkg/Contribute -- Gianluca Ciccarelli http://disi.unitn.it/~ciccarelli GPG key ID: FDF429B0
From 27c6be170a5544be6e8aaf6b9f549e4aba0b53c0 Mon Sep 17 00:00:00 2001 From: Gianluca Ciccarelli (sturmer) <ciccarelli@disi.unitn.it> Date: Wed, 28 Dec 2011 16:46:00 +0100 Subject: [PATCH] dpkg-maintscipt-helper: Case 1 for bug 583585 Case 1: We have a directory that has to be transformed into a symlink in a later version. In preinst, we just create a backup of the directory; in postinst, the backup is safely eliminated; in postrm failed-upgrade, the backup directory is restored. --- scripts/dpkg-maintscript-helper.sh | 65 +++++++++++++++++++++++++++++++++++- 1 files changed, 64 insertions(+), 1 deletions(-) diff --git a/scripts/dpkg-maintscript-helper.sh b/scripts/dpkg-maintscript-helper.sh index 92088ae..4a659ec 100755 --- a/scripts/dpkg-maintscript-helper.sh +++ b/scripts/dpkg-maintscript-helper.sh @@ -26,6 +26,7 @@ ## ## Functions to remove an obsolete conffile during upgrade ## +# Dispatcher function rm_conffile() { local CONFFILE="$1" local LASTVERSION="$2" @@ -128,6 +129,7 @@ abort_rm_conffile() { ## ## Functions to rename a conffile during upgrade ## +# Dispatcher function mv_conffile() { local OLDCONFFILE="$1" local NEWCONFFILE="$2" @@ -216,6 +218,64 @@ abort_mv_conffile() { fi } +# (Dispatcher function) +# Substitute a directory with a symlink +stash_dir() { + local DIRECTORY=$1 + local LAST_VERSION=$2 + + [ -d "$DIRECTORY" ] || error "a directory should be specified" + if [ "$LAST_VERSION" = "--" -o \ + -z "$LAST_VERSION"]; then + error "please specify the number of the first version having a symlink" + fi + + while [ "$1" != "--" -a $# -gt 0 ]; do shift; done + [ -n "$DPKG_MAINTSCRIPT_NAME" ] || \ + error "could not determine the launching maint script" + + # In the case statement, $1 is the preinst command, $2 the version + case "$DPKG_MAINTSCRIPT_NAME" in + preinst) + if [ -n "$2" ] && dpkg --compare-versions "$2" le-nl "$LASTVERSION"; then + create_dir_backup "$DIRECTORY" + fi + ;; + postinst) + if [ -n "$2" ] && dpkg --compare-versions "$2" le-nl "$LASTVERSION"; then + rm_dir_backup "$DIRECTORY" + fi + ;; + postrm) + if [ -n "$1" ] && [ "$1" = "failed-upgrade" ] && \ + [ -n "$2" ] && dpkg --compare-versions "$2" le-nl "$LASTVERSION"; then + restore_dir_backup "$DIRECTORY" + fi + ;; + *) + # TODO substitute stash_dir with a variable + debug "$0 stash_dir not required in $DPKG_MAINTSCRIPT_NAME" + ;; + esac + shift +} + +create_dir_backup() { + # Ensure ownership of the dir by the package + [ -d "$DIRECTORY" -a -O "$DIRECTORY" ] || \ + error "the package has no ownership of the directory, check permissions" + + mv "$DIRECTORY" "$DIRECTORY".dpkg-bak +} + +rm_dir_backup() { + rm -rf "$DIRECTORY".dpkg-bak +} + +restore_dir_backup() { + [ -d "$DIRECTORY" ] && mv "$DIRECTORY".dpkg-bak "$DIRECTORY" +} + # Common functions debug() { if [ -n "$DPKG_DEBUG" ]; then @@ -266,7 +326,7 @@ shift case "$command" in supports) case "$1" in - rm_conffile|mv_conffile) + rm_conffile|mv_conffile|stash_dir) code=0 ;; *) @@ -289,6 +349,9 @@ rm_conffile) mv_conffile) mv_conffile "$@" ;; +stash_dir) + stash_dir "$@" + ;; --help|help|-?|-h) usage ;; -- 1.7.2.5
Attachment:
signature.asc
Description: Digital signature