Hi anyone looking at this patch!
I have tried to write a similar patch to apply to the current
mysql-5.7 server branch, and discovered a showstopping bug in the code
I wrote: it fails if it's a clean install! The fix (now applied to
the github branch) is to change the new line in the
mysql-server-5.7.postinst patch from
olds=$(ls ... 2>/dev/null)
to
olds=$(ls ... 2>/dev/null || true)
so that it doesn't fail if any of the file patterns listed are not
found.
Attached is a similar patch for mysql-server-5.7, now tested on my
machine, against the head of mysql-5.7/debian/master on
git://anonscm.debian.org/pkg-mysql/mysql.git - happy for someone else
to also test it, and apply it if it they're happy with it. (I also
removed the new but unnecessary "pathfind" function as invoke-rc.d is
in an essential package.) The logic is exactly the same as the patch
for mariadb-10.1.
Best wishes,
Julian
diff --git a/debian/mysql-server-5.7.lintian-overrides b/debian/mysql-server-5.7.lintian-overrides
index 18e5d5e1..36927084 100644
--- a/debian/mysql-server-5.7.lintian-overrides
+++ b/debian/mysql-server-5.7.lintian-overrides
@@ -1,3 +1,5 @@
# These long lines reproduce actual output and to reformat them
# would damage the integrity of the man page.
manpage-has-errors-from-man usr/share/man/man1/mysqlbinlog.1.gz 1979: warning [p 13, 2.7i, div `3tbd3,2', 0.8i]: can't break line
+# the second update-rc.d is informational only: see postrm for details
+mysql-server-5.7: duplicate-updaterc.d-calls-in-postrm mysql
diff --git a/debian/mysql-server-5.7.postinst b/debian/mysql-server-5.7.postinst
index 54adbd09..868be838 100755
--- a/debian/mysql-server-5.7.postinst
+++ b/debian/mysql-server-5.7.postinst
@@ -22,27 +22,8 @@ run_init_sql() {
return $result
}
-# To avoid having hardcoded paths in the script, we do a search on the path, as suggested at:
-# https://www.debian.org/doc/manuals/developers-reference/ch06.en.html#bpp-debian-maint-scripts
-pathfind() {
- OLDIFS="$IFS"
- IFS=:
- for p in $PATH; do
- if [ -x "$p/$*" ]; then
- IFS="$OLDIFS"
- return 0
- fi
- done
- IFS="$OLDIFS"
- return 1
-}
-
invoke() {
- if pathfind invoke-rc.d; then
- invoke-rc.d mysql $1
- else
- /etc/init.d/mysql $1
- fi
+ invoke-rc.d mysql $1
}
# Check if server is able to start. If it fails we abort early and refer
@@ -315,6 +296,22 @@ if [ "$1" = "configure" ]; then
invoke start
fi
fi
+
+ # Fix broken postrms in mysql-server-5.[1-6] and mariadb-server-10.[01]
+ # packages to prevent purging these packages from breaking our package.
+ # (See #852495) It is unlikely that a user would have mariadb-server
+ # postrm files lying around, but we aim to be safe.
+
+ # We comment out all of the commands which assume that there is no other
+ # mysql server installed.
+ # (Because of the Conflicts in the control file for this package, they can
+ # only possibly be in a configuration-only state at this point. And this
+ # cannot harm even if the system is in a very broken state and we are being
+ # configured in spite of those packages being in a different state.)
+ olds=$(ls /var/lib/dpkg/info/mysql-server-5.[1-6].postrm /var/lib/dpkg/info/mariadb-server-10.[01].postrm 2>/dev/null || true)
+ if [ -n "$olds" ]; then
+ perl -i -pe 's/stop_server(?=\s|$)/# stop_server/; s/^(\s*)((?:update|invoke)-rc\.d.*$)/$1# $2\n$1true/; s/^(\s*)(deb-systemd-helper.*$)/$1# $2\n$1true/; s%rm -f "/etc/apparmor.d%# rm -f "/etc/apparmor.d%' $olds
+ fi
fi
# forget we ever saw the password. don't use reset to keep the seen status
diff --git a/debian/mysql-server-5.7.postrm b/debian/mysql-server-5.7.postrm
index 49d45f1b..171ea338 100755
--- a/debian/mysql-server-5.7.postrm
+++ b/debian/mysql-server-5.7.postrm
@@ -11,49 +11,11 @@ if [ -n "$DEBIAN_SCRIPT_DEBUG" ]; then set -v -x; DEBIAN_SCRIPT_TRACE=1; fi
${DEBIAN_SCRIPT_TRACE:+ echo "#42#DEBUG# RUNNING $0 $*" 1>&2 }
mysql_cfgdir=/etc/mysql
-MYADMIN="/usr/bin/mysqladmin --defaults-file=/etc/mysql/debian.cnf"
-
-# To avoid having hardcoded paths in the script, we do a search on the path, as suggested at:
-# https://www.debian.org/doc/manuals/developers-reference/ch06.en.html#bpp-debian-maint-scripts
-pathfind() {
- OLDIFS="$IFS"
- IFS=:
- for p in $PATH; do
- if [ -x "$p/$*" ]; then
- IFS="$OLDIFS"
- return 0
- fi
- done
- IFS="$OLDIFS"
- return 1
-}
-
-# Try to stop the server in a sane way. If it does not success let the admin
-# do it himself. No database directories should be removed while the server
-# is running!
-stop_server() {
- set +e
- if pathfind invoke-rc.d; then
- invoke-rc.d mysql stop
- else
- /etc/init.d/mysql stop
- fi
- errno=$?
- set -e
-
- if [ "$?" != 0 ]; then
- echo "Trying to stop the MySQL server resulted in exitcode $?." 1>&2
- echo "Stop it yourself and try again!" 1>&2
- exit 1
- fi
-}
case "$1" in
purge|remove|upgrade|failed-upgrade|abort-install|abort-upgrade|disappear)
- if [ -n "`$MYADMIN ping 2>/dev/null`" ]; then
- stop_server
- sleep 2
- fi
+ # We handle purge actions below. The server has already been stopped
+ # if necessary by the prerm.
;;
*)
echo "postrm called with unknown argument '$1'" 1>&2
@@ -91,6 +53,60 @@ if [ "$1" = "purge" ]; then
fi
fi
-#DEBHELPER#
+# We manually add the debhelper snippets here to ensure that when purging,
+# only safe-to-run snippets are run if another mysql-server or mariadb-server
+# package is installed.
+
+# Automatically added by dh_installinit
+# modified to protect against another mysql server package being installed
+if [ "$1" = "purge" -a ! \( -x /usr/sbin/mysqld -o -L /usr/sbin/mysqld \) ]; then
+ update-rc.d mysql remove >/dev/null
+fi
+
+
+# In case this system is running systemd, we make systemd reload the unit files
+# to pick up changes.
+if [ -d /run/systemd/system ] ; then
+ systemctl --system daemon-reload >/dev/null || true
+fi
+# End automatically added section
+# Automatically added by dh_systemd_enable
+if [ "$1" = "remove" ]; then
+ if [ -x "/usr/bin/deb-systemd-helper" ]; then
+ deb-systemd-helper mask mysql.service >/dev/null
+ fi
+fi
+
+# modified to protect against another mysql server package being installed
+if [ "$1" = "purge" -a ! \( -x /usr/sbin/mysqld -o -L /usr/sbin/mysqld \) ]; then
+ if [ -x "/usr/bin/deb-systemd-helper" ]; then
+ deb-systemd-helper purge mysql.service >/dev/null
+ deb-systemd-helper unmask mysql.service >/dev/null
+ fi
+fi
+# End automatically added section
+# Automatically added by dh_installdebconf
+if [ "$1" = purge ] && [ -e /usr/share/debconf/confmodule ]; then
+ . /usr/share/debconf/confmodule
+ db_purge
+fi
+# End automatically added section
+# Automatically added by dh_apparmor
+# modified to protect against another mysql server package being installed
+if [ "$1" = "purge" -a ! \( -x /usr/sbin/mysqld -o -L /usr/sbin/mysqld \) ] && ! [ -e "/etc/apparmor.d/usr.sbin.mysqld" ] ; then
+ rm -f "/etc/apparmor.d/disable/usr.sbin.mysqld" || true
+ rm -f "/etc/apparmor.d/force-complain/usr.sbin.mysqld" || true
+ rm -f "/etc/apparmor.d/local/usr.sbin.mysqld" || true
+ rmdir /etc/apparmor.d/disable 2>/dev/null || true
+ rmdir /etc/apparmor.d/local 2>/dev/null || true
+ rmdir /etc/apparmor.d 2>/dev/null || true
+fi
+# End automatically added section
exit 0
+
+# We add the debhelper snippets here, after the exit 0, so that they can
+# be visually checked in the future to ensure that nothing has been left
+# out above.
+
+#DEBHELPER#
diff --git a/debian/mysql-server-5.7.preinst b/debian/mysql-server-5.7.preinst
index 4ac328cc..143cf61d 100755
--- a/debian/mysql-server-5.7.preinst
+++ b/debian/mysql-server-5.7.preinst
@@ -20,21 +20,6 @@ DATADIR=/var/lib/mysql
LOGDIR=/var/log/mysql
UPGRADEDIR=/var/lib/mysql-upgrade
-# To avoid having hardcoded paths in the script, we do a search on the path, as suggested at:
-# https://www.debian.org/doc/manuals/developers-reference/ch06.en.html#bpp-debian-maint-scripts
-pathfind() {
- OLDIFS="$IFS"
- IFS=:
- for p in $PATH; do
- if [ -x "$p/$*" ]; then
- IFS="$OLDIFS"
- return 0
- fi
- done
- IFS="$OLDIFS"
- return 1
-}
-
# Try to stop the server in a sane way. If it does not success let the admin
# do it himself. No database directories should be removed while the server
# is running! Another mysqld in e.g. a different chroot is fine for us.
@@ -42,12 +27,7 @@ stop_server() {
if [ ! -x /etc/init.d/mysql ]; then return; fi
set +e
- if pathfind invoke-rc.d; then
- cmd="invoke-rc.d mysql stop"
- else
- cmd="/etc/init.d/mysql stop"
- fi
- $cmd
+ invoke-rc.d mysql stop
errno=$?
set -e