mariadb-server-10.2.preinst 6.55 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
#!/bin/bash -e
#
# summary of how this script can be called:
#        * <new-preinst> install
#        * <new-preinst> install <old-version>
#        * <new-preinst> upgrade <old-version>
#        * <old-preinst> abort-upgrade <new-version>
#

. /usr/share/debconf/confmodule

if [ -n "$DEBIAN_SCRIPT_DEBUG" ]; then set -v -x; DEBIAN_SCRIPT_TRACE=1; fi
${DEBIAN_SCRIPT_TRACE:+ echo "#42#DEBUG# RUNNING $0 $*" 1>&2 }

export PATH=$PATH:/sbin:/usr/sbin:/bin:/usr/bin
MYADMIN="/usr/bin/mysqladmin --defaults-file=/etc/mysql/debian.cnf"
17 18
mysql_datadir=/var/lib/mysql
mysql_upgradedir=/var/lib/mysql-upgrade
19 20 21 22 23 24

# 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.
stop_server() {
    if [ ! -x /etc/init.d/mysql ]; then return; fi
anel's avatar
anel committed
25 26
    # Return immediately if there are no mysql processes running on a host
    # (leave containerized processes with the same name in other namespaces)
27
    # as there is no point in trying to shutdown in that case.
anel's avatar
anel committed
28 29
    # Compatibility with versions that ran 'mariadbd'
    if ! pgrep -x --nslist pid --ns $$ "mysqld|mariadbd" > /dev/null; then return; fi
30

31 32 33 34 35 36 37 38 39
    set +e
    if [ -x /usr/sbin/invoke-rc.d ]; then
      cmd="invoke-rc.d mysql stop"
    else
      cmd="/etc/init.d/mysql stop"
    fi
    $cmd
    errno=$?
    set -e
40

41 42 43 44 45
    # 0=ok, 100=no init script (fresh install)
    if [ "$errno" != 0 -a "$errno" != 100 ]; then
      echo "${cmd/ */} returned $errno" 1>&2
      echo "There is a MySQL server running, but we failed in our attempts to stop it." 1>&2
      echo "Stop it yourself and try again!" 1>&2
46
      db_stop
47 48 49 50 51 52
      exit 1
    fi
}

################################ main() ##########################

53
this_version=10.2
54
max_upgradeable_version=5.7
55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76

# Check if a flag file is found that indicates a previous MariaDB or MySQL
# version was installed. If multiple flags are found, check which one was
# the biggest version number.
for flag in $mysql_datadir/debian-*.flag
do

  # The for loop leaves $flag as the query string if there are no results,
  # so the check below is needed to stop further processing when there are
  # no real results.
  if [ $flag = "$mysql_datadir/debian-*.flag" ]
  then
    break
  fi

  flag_version=`echo $flag | sed 's/.*debian-\([0-9\.]\+\).flag/\1/'`

  # Initialize value if empty
  if [ -z "$found_version" ]
  then
    found_version=$flag_version
  fi
77

78 79 80 81
  # Update value if now bigger then before
  if dpkg --compare-versions "$flag_version" '>>' "$found_version"
  then
    found_version=$flag_version
82
  fi
83

84
done
85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101


# If an upgrade is detected, proceed with it automatically without
# requiring any user interaction.
#
# However, if the user attempts to downgrade, warn about the incompatibility.
# Downgrade is detected if the flag version is bigger than $this_version
# (e.g. 10.1 > 10.0) or the flag version is smaller than 10.0 but bigger
# than $max_upgradeable_version.
if [ ! -z "$found_version" ]
then

  echo "$mysql_datadir: found previous version $found_version"

  if dpkg --compare-versions "$found_version" '>>' "$this_version"
  then
    downgrade_detected=true
102
  fi
103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127

  if dpkg --compare-versions "$found_version" '>>' "$max_upgradeable_version" \
  && dpkg --compare-versions "$found_version" '<<' "10.0"
  then
    downgrade_detected=true
  fi

fi


# Don't abort dpkg if downgrade is detected (as was done previously).
# Instead simply move the old datadir and create a new for this_version.
if [ ! -z "$downgrade_detected" ]
then
  db_input critical mariadb-server-10.2/old_data_directory_saved || true
  db_go
  echo "The file $mysql_datadir/debian-$found_version.flag indicates a" 1>&2
  echo "version that cannot automatically be upgraded. Therefore the" 1>&2
  echo "previous data directory will be renamed to $mysql_datadir-$found_version and" 1>&2
  echo "a new data directory will be initialized at $mysql_datadir." 1>&2
  echo "Please manually export/import your data (e.g. with mysqldump) if needed." 1>&2
  mv -f $mysql_datadir $mysql_datadir-$found_version
  # Also move away the old debian.cnf file that included credentials that are
  # no longer valid
  mv -f /etc/mysql/debian.cnf /etc/mysql/debian.cnf-$found_version
128 129 130 131 132 133 134 135 136 137 138 139 140 141
fi

# to be sure
stop_server

# If we use NIS then errors should be tolerated. It's up to the
# user to ensure that the mysql user is correctly setup.
# Beware that there are two ypwhich one of them needs the 2>/dev/null!
if test -n "`which ypwhich 2>/dev/null`"  &&  ypwhich >/dev/null 2>&1; then
  set +e
fi

#
# Now we have to ensure the following state:
142
# /etc/passwd: mysql:x:100:101:MySQL Server:/nonexistent:/bin/false
143
# /etc/group:  mysql:x:101:
144
#
145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162
# Sadly there could any state be present on the system so we have to
# modify everything carefully i.e. not doing a chown before creating
# the user etc...
#

# creating mysql group if he isn't already there
if ! getent group mysql >/dev/null; then
 	# Adding system group: mysql.
	addgroup --system mysql >/dev/null
fi

# creating mysql user if he isn't already there
if ! getent passwd mysql >/dev/null; then
	# Adding system user: mysql.
	adduser \
	  --system \
          --disabled-login \
	  --ingroup mysql \
163 164
	  --no-create-home \
	  --home /nonexistent \
165 166 167 168 169 170 171 172 173 174 175 176 177
	  --gecos "MySQL Server" \
	  --shell /bin/false \
	  mysql  >/dev/null
fi

# end of NIS tolerance zone
set -e

# if there's a symlink, let's store where it's pointing, because otherwise
# it's going to be lost in some situations
for dir in DATADIR LOGDIR; do
    checkdir=`eval echo "$"$dir`
    if [ -L "$checkdir" ]; then
178 179
	mkdir -p "$mysql_upgradedir"
	cp -dT "$checkdir" "$mysql_upgradedir/$dir.link"
180 181 182 183
    fi
done

# creating mysql home directory
184 185
if [ ! -d $mysql_datadir -a ! -L $mysql_datadir ]; then
 	mkdir $mysql_datadir
186 187 188
fi

# checking disc space
189 190
if LC_ALL=C BLOCKSIZE= df --portability $mysql_datadir/. | tail -n 1 | awk '{ exit ($4>1000) }'; then
  echo "ERROR: There's not enough space in $mysql_datadir/" 1>&2
191 192 193 194 195
  db_stop
  exit 1
fi

# Since the home directory was created before putting the user into
196
# the mysql group and moreover we cannot guarantee that the
197 198 199 200 201 202
# permissions were correctly *before* calling this script, we fix them now.
# In case we use NIS and no mysql user is present then this script should
# better fail now than later..
# The "set +e" is necessary as e.g. a ".journal" of a ext3 partition is
# not chgrp'able (#318435).
set +e
203
find $mysql_datadir ! -uid $(id -u mysql) -print0 | xargs -0 -r chown mysql
204
find $mysql_datadir -follow -not -group mysql -print0 2>/dev/null \
205 206 207 208 209 210 211 212 213
  | xargs -0 --no-run-if-empty chgrp mysql
set -e


db_stop

#DEBHELPER#

exit 0