From c200780b40207e371544dc2eaeca3f0022411ddf Mon Sep 17 00:00:00 2001 From: Vincent Bernat Date: Sat, 10 Nov 2012 13:56:26 +0100 Subject: [PATCH] Fix symlink mess In postinst when upgrading from 0.5 to a more recent version. Closes: #680917, #656886. --- debian/changelog | 7 ++++ debian/roundcube-core.postinst | 67 ++++++++++++++++++++++++++++++++++ 2 files changed, 74 insertions(+) diff --git a/debian/changelog b/debian/changelog index e1dcca2..cedeca5 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,10 @@ +roundcube (0.7.2-6) unstable; urgency=low + + * Fix the symlink mess in postinst when upgrading from 0.5 to a more + recent version. Closes: #680917, #656886. + + -- Vincent Bernat Sat, 10 Nov 2012 13:51:17 +0100 + roundcube (0.7.2-5) unstable; urgency=low * Fix problem with some uuencoded attachments. Patch from Michał diff --git a/debian/roundcube-core.postinst b/debian/roundcube-core.postinst index 36457be..7213406 100644 --- a/debian/roundcube-core.postinst +++ b/debian/roundcube-core.postinst @@ -35,6 +35,68 @@ apache_install() { fi } +fix_symlinks() { + # In 0.5.1-1, symlinks have been mangled. Before this version, + # /var/lib/roundcube and /usr/share/roundcube were using symlinks + # to each other: + # /usr/share/roundcube/config -> /var/lib/roundcube/config + # /usr/share/roundcube/logs -> /var/lib/roundcube/logs + # /usr/share/roundcube/plugins -> /var/lib/roundcube/plugins + # /usr/share/roundcube/skins -> /var/lib/roundcube/skins + # /usr/share/roundcube/temp -> /var/lib/roundcube/temp + # /var/lib/roundcube/logs -> ../../log/roundcube + # /var/lib/roundcube/.htaccess -> /usr/share/roundcube/.htaccess + # /var/lib/roundcube/bin -> /usr/share/roundcube/bin + # /var/lib/roundcube/index.php -> /usr/share/roundcube/bin + # /var/lib/roundcube/program -> /usr/share/roundcube/bin + # /var/lib/roundcube/robots.txt -> /usr/share/roundcube/bin + + # As of 0.7.2-6, the user is expected to use /var/lib/roundcube + # since /usr/share/roundcube does not contain the appropriate + # symlinks anymore. + # /var/lib/roundcube/logs -> ../../log/roundcube + # /var/lib/roundcube/.htaccess -> /usr/share/roundcube/.htaccess + # /var/lib/roundcube/index.php -> /usr/share/roundcube/bin + # /var/lib/roundcube/program -> /usr/share/roundcube/bin + # /var/lib/roundcube/robots.txt -> /usr/share/roundcube/bin + # /var/lib/roundcube/plugins/* -> /usr/share/roundcube/plugins/* + # /var/lib/roundcube/skins/* -> /usr/share/roundcube/skins/* + + # Because dpkg will not overwrite a symlink but follow them, an + # upgrade gives a confuse situation. We have the following + # symlinks in /usr/share/roundcube: + # /usr/share/roundcube/plugins -> /var/lib/roundcube/plugins + # /usr/share/roundcube/skins -> /var/lib/roundcube/skins + # And the following are not symlinks as they should be: + # /var/lib/roundcube/plugins/* -> /usr/share/roundcube/plugins/* + # /var/lib/roundcube/skins/* -> /usr/share/roundcube/skins/* + + # We detect and fix that. + for dir in plugins skins; do + [ -L /usr/share/roundcube/${dir} ] || continue + echo "Fixing symbolic link /usr/share/roundcube/${dir}" + [ ! -L /var/lib/roundcube/${dir} ] || { + echo "/var/lib/roundcube/${dir} is not expected to be a symbolic link. Abort." + exit 1 + } + # Remove the symbolic link and make a real directory. + rm /usr/share/roundcube/${dir} + mkdir /usr/share/roundcube/${dir} + + # We move each subdirectory regardless we own them or not. The + # ideal solution would be to leave files installed by the user + # in /var/lib/roundcube/${dir} but since other packages (like + # roundcube-plugins and roundcube-plugins-extra) may have + # installed files, it is something difficult to track. We do + # not want each package to fix this mess. What's important is + # that user installation will keep working as expected, + # despite the move. + for d in /var/lib/roundcube/${dir}/*; do + mv ${d} /usr/share/roundcube/${dir} + ln -s /usr/share/roundcube/${dir}/${d##*/} /var/lib/roundcube/${dir}/${d##*/} + done + done +} case "$1" in configure) @@ -72,6 +134,11 @@ EOF fi fi + # Fix bug 680917 + if [ -n "$2" ] && dpkg --compare-versions "$2" lt 0.7.2-6; then + fix_symlinks + fi + CONFFILE=/etc/roundcube/main.inc.php touch $CONFFILE.ucftmp chmod 640 $CONFFILE.ucftmp -- 2.39.2