]> git.donarmstrong.com Git - roundcube.git/blobdiff - debian/roundcube-core.postinst
Fix symlink mess
[roundcube.git] / debian / roundcube-core.postinst
index aed1d06cb896b05c1691b58b524cb601f314a7a4..721340650d9ee2e2b8a90d4e4fdea8f039799de1 100644 (file)
@@ -8,7 +8,7 @@ set -e
 . /usr/share/debconf/confmodule
 . /usr/share/dbconfig-common/dpkg/postinst 
 dbc_generate_include=php:/etc/roundcube/debian-db.php
-dbc_generate_include_owner="www-data:www-data"
+dbc_generate_include_owner="root:www-data"
 dbc_generate_include_perms="640"
 dbc_dbfile_owner="www-data:www-data"
 dbc_dbfile_perms="0660"
@@ -35,12 +35,74 @@ 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)
 
        # We try to fix an incomplete upgrade (see #610725 and #613586)
-       if [ -n "$2" ] && dpkg --compare-versions "$2" le 0.5.1+dfsg-2; then
+       if [ -n "$2" ] && dpkg --compare-versions "$2" le 0.5.1+dfsg-5; then
            db_get roundcube/dbconfig-upgrade || true
            if [ x"$RET" = x"true" ]; then
                if [ x"$dbc_dbtype" = x"mysql" ]; then
@@ -65,15 +127,22 @@ EOF
                    cat <<EOF | while read command; do dbc_mysql_exec_command "$command" || true ; done
 ALTER TABLE \`messages\` ADD INDEX \`index_index\` (\`user_id\`, \`cache_key\`, \`idx\`);
 ALTER TABLE \`contacts\`ADD INDEX \`user_contacts_index\` (\`user_id\`,\`email\`);
+ALTER TABLE \`identities\` ADD \`changed\` datetime NOT NULL DEFAULT '1000-01-01 00:00:00' AFTER \`user_id\`;
 ALTER TABLE \`identities\` ADD INDEX \`user_identities_index\` (\`user_id\`, \`del\`);
 EOF
                fi
            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
+       chown root:www-data $CONFFILE.ucftmp
 
        db_get roundcube/hosts || true
        hosts="$RET"
@@ -118,8 +187,9 @@ EOF
        done >> $CONFFILE.ucftmp
 
        ucf --debconf-ok $CONFFILE.ucftmp $CONFFILE
-       chown root:www-data $CONFFILE
-        rm -f $CONFFILE.ucftmp
+       chown root:www-data $CONFFILE
+       [ ! -f $CONFFILE.dpkg-dist ] || chown root:www-data $CONFFILE.dpkg-dist
+       rm -f $CONFFILE.ucftmp
        
        # Handle webserver reconfiguration/restart ; stolen from zabbix package
        db_get roundcube/reconfigure-webserver || true