#!/bin/bash
set -e

export DEBIAN_FRONTEND=noninteractive

apt-get update
apt-get install -y gnupg python3-pip supervisor libaio1t64 libnuma1 libncurses6 libtirpc3t64 xz-utils &&
  apt-get -y clean

# Oracle's APT repository does not provide arm64 packages.  Use the signed
# generic distribution on both architectures instead.
MYSQL_VERSION=8.4.13
case "$(dpkg --print-architecture)" in
  amd64) mysql_arch=x86_64 ;;
  arm64) mysql_arch=aarch64 ;;
  *)
    echo "Unsupported MySQL architecture" >&2
    exit 1
    ;;
esac
mysql_dist="mysql-${MYSQL_VERSION}-linux-glibc2.28-${mysql_arch}"
mysql_url="https://cdn.mysql.com/Downloads/MySQL-8.4/${mysql_dist}.tar.xz"
mysql_tmp="$(mktemp -d)"
trap 'rm -rf "$mysql_tmp"' EXIT
curl -fsSL -o "$mysql_tmp/mysql.tar.xz" "$mysql_url"
curl -fsSL -o "$mysql_tmp/mysql.tar.xz.asc" "$mysql_url.asc"
gpg --batch --dearmor -o "$mysql_tmp/mysql.gpg" /scripts/mysql-2025-release.asc
gpgv --keyring "$mysql_tmp/mysql.gpg" "$mysql_tmp/mysql.tar.xz.asc" "$mysql_tmp/mysql.tar.xz"
mkdir -p /opt/mysql
tar -xJf "$mysql_tmp/mysql.tar.xz" --strip-components=1 -C /opt/mysql \
  --exclude='*/bin/mysqld-debug' --exclude='*/lib/*.a' --exclude='*/lib/plugin/debug' \
  "$mysql_dist/bin" "$mysql_dist/lib" "$mysql_dist/share" "$mysql_dist/LICENSE" "$mysql_dist/README"
for program in mysql mysqladmin mysqlbinlog mysqlcheck mysqld mysqld_safe mysqldump mysqlshow; do
  ln -s "/opt/mysql/bin/$program" "/usr/local/bin/$program"
done
# Ubuntu renamed libaio for the time64 transition; MySQL uses the old SONAME.
multiarch="$(dpkg-architecture -qDEB_HOST_MULTIARCH)"
ln -s "libaio.so.1t64" "/usr/lib/$multiarch/libaio.so.1"
mysqld --version
mkdir -p /etc/mysql/conf.d /etc/mysql/mysql.conf.d /var/lib/mysql
cat > /etc/my.cnf << 'EOF'
!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mysql.conf.d/
EOF
cat > /etc/mysql/mysql.conf.d/mysqld.cnf << 'EOF'
[mysqld]
basedir = /opt/mysql
datadir = /var/lib/mysql
mysqlx-socket = /app/tmp/sockets/mysqlx.sock
EOF

# Install the plugin for the distribution's Supervisor inside this image.
pip install --break-system-packages git+https://github.com/coderanger/supervisor-stdout
rm -rf /var/lib/apt/lists/*
rm -rf /usr/share/doc/
rm -rf /usr/share/man/
rm -rf /usr/share/locale/
rm -rf /var/log/*

mkdir -p /var/log/supervisor /var/log/mysql
chgrp -R 0 /etc/supervisor /var/lib/mysql /var/log/supervisor /var/log/mysql
chmod -R g=u /etc/supervisor /var/lib/mysql /var/log/supervisor /var/log/mysql

# MySQL config directory varies by version
if [ -d /etc/mysql/mysql.conf.d ]; then
  MYSQLD_CNF=/etc/mysql/mysql.conf.d/mysqld.cnf
else
  MYSQLD_CNF=/etc/mysql/conf.d/mysqld.cnf
fi

cat >> "$MYSQLD_CNF" << EOF
socket = /app/tmp/sockets/mysqld.sock
pid-file = /app/tmp/pids/mysqld.pid
user = 1001
# Sorting rows that contain JSON columns (NATIVE_JSON_COLUMNS) can exceed the
# 256K default and fail with "Out of sort memory" (ER 1038) on MySQL 8.
sort_buffer_size = 4M
EOF

# Determine the client config file
if [ -f /etc/mysql/conf.d/mysql.cnf ]; then
  MYSQL_CNF=/etc/mysql/conf.d/mysql.cnf
else
  MYSQL_CNF=/etc/mysql/conf.d/client.cnf
  touch "$MYSQL_CNF"
fi

cat >> "$MYSQL_CNF" << EOF
[client]
socket   = /app/tmp/sockets/mysqld.sock
[mysql_upgrade]
socket   = /app/tmp/sockets/mysqld.sock
EOF
