Linux SRV-16 6.18.44-paas #1 SMP PREEMPT_DYNAMIC Thu Aug 13 10:08:12 UTC 2026 x86_64
/
proc
/
thread-self
/
root
/
proc
/
212
/
root
/
srv
/
admin
/
scripts
/
mysql
/
//proc/thread-self/root/proc/212/root/srv/admin/scripts/mysql/mysql-start.inc.sh
#!/bin/bash # based on /etc/init.d/mysql from debian . /lib/lsb/init-functions.distrib ## Fetch a particular option from mysql's invocation. # # Usage: void mysqld_get_param option mysqld_get_param() { ${MYSQL_PATH}/sbin/mysqld --print-defaults \ | tr " " "\n" \ | grep -- "--$1" \ | tail -n 1 \ | cut -d= -f2 } ## Do some sanity checks before even trying to start mysqld. sanity_checks() { # check for diskspace shortage datadir=`mysqld_get_param datadir` if LC_ALL=C BLOCKSIZE= df --portability $datadir/. | tail -n 1 | awk '{ exit ($4>4096) }'; then echo "ERROR: The partition with $datadir is too full!" exit 1 fi } ## Checks if there is a server running and if so if it is accessible. # # check_alive insists on a pingable server # check_dead also fails if there is a lost mysqld in the process list # # Usage: boolean mysqld_status [check_alive|check_dead] [warn|nowarn] mysqld_status () { ping_output=`$MYSQL_MYADMIN ping 2>&1`; ping_alive=$(( ! $? )) ps_alive=0 pidfile=`mysqld_get_param pid-file` if [ -f "$pidfile" ] && ps `cat $pidfile` >/dev/null 2>&1; then ps_alive=1; fi if [ "$1" = "check_alive" -a $ping_alive = 1 ] || [ "$1" = "check_dead" -a $ping_alive = 0 -a $ps_alive = 0 ]; then return 0 # EXIT_SUCCESS else if [ "$2" = "warn" ]; then echo -e "$ps_alive processes alive and '$MYSQL_MYADMIN ping' resulted in\n$ping_output\n" fi return 1 # EXIT_FAILURE fi } mysqld_process_is_alive() { # start-stop-daemon exits with status code 0 if it would start # $_MYSQLDAEMON and 1 if $_MYSQLDAEMON is already running do_as "$DB_USER" /sbin/start-stop-daemon --quiet \ --exec "$_MYSQLDAEMON" --test --start -- ${MYSQLDAEMON_ARGS} && return 1 || return 0 } mysqld_install () { ${MYSQL_DO_AS} install -d "${MYSQL_RUN_DIR}" [ -d "${MYSQL_DATA}/mysql" ] && return ${MYINSTALL} || true mysqld_upgrade_done } mysqld_adjust_oom () { # Try to avoid msyqld getting oom'd pidfile=`mysqld_get_param pid-file` if [ -f "$pidfile" ] && [ -d /proc/`cat $pidfile` ]; then echo -1000 > /proc/`cat $pidfile`/oom_score_adj fi } mysqld_rescue_start() { echo -n 'Starting MySQL for maintenance' ${MYSQLDAEMON} --skip-grant-tables & for i in {0..600}; do sleep 1 echo -n . mysqld_process_is_alive mysqld_status check_alive nowarn && break done mysqld_status check_alive warn || exit 1 echo done } mysqld_get_version() { ${MYSQLDAEMON} -V | sed 's/^.*Ver \([0-9\.]\+\)-[0-9]\+.*$/\1/' } mysqld_upgrade_done() { local ver="$1" if [ -z "${ver}" ]; then ver="`mysqld_get_version`" fi echo "${ver}" | ${MYSQL_DO_AS} tee "${MYSQL_DATA}/mysql_upgrade_info" \ > /dev/null } mysqld_upgrade () { [ ! -f "${MYSQL_DATA}/simplehosting-mysql-default_db_created" ] && return 0 local ver="$(mysqld_get_version)" echo "MySQL version: ${ver}" if [ ! -f "${MYSQL_DATA}/mysql_upgrade_info" ] || [ "${ver}" != "$(cat "${MYSQL_DATA}/mysql_upgrade_info")" ]; then echo 'MySQL upgrade needed' mysqld_rescue_start if dpkg --compare-versions "$DB_VERSION" gt 8.0; then # Mysql 8.4 automatically upgrade the DB, mysqld_upgrade doesn't exists anymore mysqld_upgrade_done "${ver}" else MYSQL_PWD=$(mysql -s -e "SELECT ${MYSQL_PASSWORD_FIELD} FROM mysql.user WHERE User = 'root';" | tail -n 1) if [ ! -z "${MYSQL_PWD}" ]; then mysql -e "UPDATE mysql.user SET ${MYSQL_PASSWORD_FIELD} = '' WHERE User = 'root';" fi ${MYSQL_MYUPGRADE} if [ ! -z "${MYSQL_PWD}" ]; then mysql -e "UPDATE mysql.user SET ${MYSQL_PASSWORD_FIELD} = '${MYSQL_PWD}' WHERE User = 'root';" fi # mysql_upgrade restores permissions check (running flush privileges) # which prevents itself to query mysqld to know where to write # mysql_upgrade_info file. mysqld_upgrade_done "${ver}" fi # do_stop is defined in the init.d/mysql, which is and should be the # only file to source this one. do_stop fi } mysqld_check_hosting_admin_user() { $MYADMIN status > /dev/null && return 0 do_stop mysqld_rescue_start mysqld_generate_admin_password do_stop mysqld_init start } mysqld_generate_admin_password() { echo "MYSQL: generating ${SYS_USER} passwd and gandi.cnf" local GANDI_PASSWD=`perl -le 'print map{("a".."z","A".."Z",0..9)[int(rand(62))]}(1..24)'` # Workaround https://gitlab.corp.gandi.net/gandi/squad-hosting/external-issues/-/issues/214 # For unknown reason root user cannot write at the root of the NFS tmp folder on bullseye nodes # With bash < 5.1 here document is created using a tmp file. Make sure it is created as hosting-admin. MYSQL_GANDI_CNF=$MYSQL_GANDI_CNF GANDI_PASSWD=$GANDI_PASSWD MYSQL_RUN_DIR=$MYSQL_RUN_DIR capsh --user=${SYS_USER} -- -c 'cat > ${MYSQL_GANDI_CNF} <<EOF [client] user = ${SYS_USER} socket = ${MYSQL_RUN_DIR}/mysqld.sock password = "${GANDI_PASSWD}" [mysql_upgrade] user = ${SYS_USER} socket = ${MYSQL_RUN_DIR}/mysqld.sock password = "${GANDI_PASSWD}" EOF' ${SYS_DO_AS} chmod 600 ${MYSQL_GANDI_CNF} echo "MYSQL: setting or fixing ${SYS_USER} user configuration" # ALTER USER is recommended for mysql 5.7+, replacing deprecated SET PASSWORD and PASSWORD() local alter_password_query="" if [ "${DB_VERSION}" = "5.5" ] || [ "${DB_VERSION}" = "5.6" ]; then alter_password_query="SET PASSWORD FOR '${SYS_USER}'@'localhost' = PASSWORD('${GANDI_PASSWD}');" else alter_password_query="ALTER USER '${SYS_USER}'@'localhost' IDENTIFIED WITH mysql_native_password BY '${GANDI_PASSWD}';" fi mysql -D mysql -e " INSERT INTO mysql.user (Host, User, ${MYSQL_PASSWORD_FIELD}, Select_priv, Insert_priv, Update_priv, Delete_priv, Create_priv, Drop_priv, Reload_priv, Shutdown_priv, Process_priv, File_priv, Grant_priv, References_priv, Index_priv, Alter_priv, Show_db_priv, Super_priv, Create_tmp_table_priv, Lock_tables_priv, Execute_priv, Repl_slave_priv, Repl_client_priv, Create_view_priv, Show_view_priv, Create_routine_priv, Alter_routine_priv, Create_user_priv, Event_priv, Trigger_priv, ssl_cipher, x509_issuer, x509_subject, max_questions, max_updates, max_connections, max_user_connections) VALUES ('localhost', '${SYS_USER}', '', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'N', 'N', 'N', 'N', 'N', 'Y', 'Y', '', '', '', 0, 0, 0, 0) ON DUPLICATE KEY UPDATE ${MYSQL_PASSWORD_FIELD}='', Select_priv='Y', Insert_priv='Y', Update_priv='Y', Delete_priv='Y', Create_priv='Y', Drop_priv='Y', Reload_priv='Y', Shutdown_priv='Y', Process_priv='Y', File_priv='Y', Grant_priv='Y', References_priv='Y', Index_priv='Y', Alter_priv='Y', Show_db_priv='Y', Super_priv='Y', Create_tmp_table_priv='Y', Lock_tables_priv='Y', Execute_priv='Y', Repl_slave_priv='Y', Repl_client_priv='Y', Create_view_priv='N', Show_view_priv='N', Create_routine_priv='N', Alter_routine_priv='N', Create_user_priv='N', Event_priv='Y', Trigger_priv='Y', ssl_cipher='', x509_issuer='', x509_subject='', max_questions=0, max_updates=0, max_connections=0, max_user_connections=0; FLUSH PRIVILEGES; ${alter_password_query}" } mysqld_postinit () { # MySQL tends to automagically create users we don't want # This line removes them. local MYSQL_USERS_CLEANED_FILE="${MYSQL_DATA}/simplehosting-mysql-users_cleaned" if [[ ! -e "${MYSQL_USERS_CLEANED_FILE}" || "${RESCUE_GRANT_TABLES}" ]]; then echo 'MYSQL: fixing root user configuration' mysql -D mysql -e " INSERT INTO mysql.user (Host, User, ${MYSQL_PASSWORD_FIELD}, Select_priv, Insert_priv, Update_priv, Delete_priv, Create_priv, Drop_priv, Reload_priv, Shutdown_priv, Process_priv, File_priv, Grant_priv, References_priv, Index_priv, Alter_priv, Show_db_priv, Super_priv, Create_tmp_table_priv, Lock_tables_priv, Execute_priv, Repl_slave_priv, Repl_client_priv, Create_view_priv, Show_view_priv, Create_routine_priv, Alter_routine_priv, Create_user_priv, Event_priv, Trigger_priv, ssl_cipher, x509_issuer, x509_subject, max_questions, max_updates, max_connections, max_user_connections, ssl_type) VALUES ('localhost', 'root', '', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'N', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'N', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', '', '', '', 0, 0, 0, 0, '') ON DUPLICATE KEY UPDATE ${MYSQL_PASSWORD_FIELD}='', Select_priv='Y', Insert_priv='Y', Update_priv='Y', Delete_priv='Y', Create_priv='Y', Drop_priv='Y', Reload_priv='Y', Shutdown_priv='N', Process_priv='Y', File_priv='Y', Grant_priv='Y', References_priv='Y', Index_priv='Y', Alter_priv='Y', Show_db_priv='Y', Super_priv='N', Create_tmp_table_priv='Y', Lock_tables_priv='Y', Execute_priv='Y', Repl_slave_priv='Y', Repl_client_priv='Y', Create_view_priv='Y', Show_view_priv='Y', Create_routine_priv='Y', Alter_routine_priv='Y', Create_user_priv='Y', Event_priv='Y', Trigger_priv='Y', ssl_cipher='', x509_issuer='', x509_subject='', max_questions=0, max_updates=0, max_connections=0, max_user_connections=0, ssl_type=''; FLUSH PRIVILEGES;" echo 'MYSQL: cleaning some unwanted users' # Deprecated? mysql -D mysql -e " DELETE FROM mysql.user WHERE User = 'root' AND Host != 'localhost'; DELETE FROM mysql.user WHERE User = '' and ${MYSQL_PASSWORD_FIELD} = '' and Select_priv = 'N' and Insert_priv = 'N' and Update_priv = 'N' and Delete_priv = 'N' and Create_priv = 'N' and Drop_priv = 'N' and Reload_priv = 'N' and Shutdown_priv = 'N' and Process_priv = 'N' and File_priv = 'N' and Grant_priv = 'N' and References_priv = 'N' and Index_priv = 'N' and Alter_priv = 'N' and Show_db_priv = 'N' and Super_priv = 'N' and Create_tmp_table_priv = 'N' and Lock_tables_priv = 'N' and Execute_priv = 'N' and Repl_slave_priv = 'N' and Repl_client_priv = 'N' and Create_view_priv = 'N' and Show_view_priv = 'N' and Create_routine_priv = 'N' and Alter_routine_priv = 'N' and Create_user_priv = 'N' and Event_priv = 'N' and Trigger_priv = 'N' and Create_tablespace_priv = 'N'; DELETE FROM mysql.db WHERE User = '' and Db LIKE 'test%'; FLUSH PRIVILEGES;" echo 'MYSQL: cleaning users : done' mysqld_generate_admin_password ${MYSQL_DO_AS} touch "${MYSQL_USERS_CLEANED_FILE}" fi # Defines a default database so that users are not lost local MYSQL_DEFAULT_DB_CREATED_FILE="${MYSQL_DATA}/simplehosting-mysql-default_db_created" if [[ ! -e "${MYSQL_DEFAULT_DB_CREATED_FILE}" ]]; then echo 'MySQL: creating db' $MYSQL -e 'CREATE DATABASE IF NOT EXISTS default_db;' ${MYSQL_DO_AS} touch "${MYSQL_DEFAULT_DB_CREATED_FILE}" fi } mysqld_init () { case "${1:-''}" in 'start') # Start daemon log_daemon_msg "Starting MySQL database server" "mysqld" if mysqld_status check_alive nowarn; then log_progress_msg "already running" log_end_msg 0 else # Start MySQL! do_as "$DB_USER" /sbin/start-stop-daemon --start --background \ --exec $_MYSQLDAEMON -- $MYSQLDAEMON_ARGS for i in {0..600}; do sleep 1 mysqld_process_is_alive if mysqld_status check_alive nowarn ; then break; fi echo -n "." done if mysqld_status check_alive warn; then log_end_msg 0 # Now start mysqlcheck or whatever the admin wants. output=$(${SYS_DO_AS} /srv/admin/scripts/mysql/mysql-check.sh) [ -n "$output" ] && log_action_msg "$output" else log_end_msg 1 log_failure_msg "Please take a look at the syslog" fi fi ;; 'stop') # * As a passwordless mysqladmin (e.g. via ~/.my.cnf) must be possible # at least for cron, we can rely on it here, too. (although we have # to specify it explicit as e.g. sudo environments points to the normal # users home and not /root) log_daemon_msg "Stopping MySQL database server" "mysqld" if ! mysqld_status check_dead nowarn; then set +e shutdown_out=`$MYADMIN shutdown 2>&1`; r=$? set -e if [ "$r" -ne 0 ]; then log_end_msg 1 [ "$VERBOSE" != "no" ] && log_failure_msg "Error: $shutdown_out" log_daemon_msg "Killing MySQL database server by signal" "mysqld" killall -15 mysqld server_down= for i in 1 2 3 4 5 6 7 8 9 10; do sleep 1 if mysqld_status check_dead nowarn; then server_down=1; break; fi done if test -z "$server_down"; then killall -9 mysqld; fi fi fi if ! mysqld_status check_dead warn; then log_end_msg 1 log_failure_msg "Please stop MySQL manually and read /usr/share/doc/mysql-server-5.1/README.Debian.gz!" exit -1 else log_end_msg 0 fi ;; 'restart') set +e; $SELF stop; set -e $SELF start ;; 'reload'|'force-reload') log_daemon_msg "Reloading MySQL database server" "mysqld" $MYADMIN reload log_end_msg 0 ;; 'status') if mysqld_status check_alive nowarn; then log_action_msg "$($MYADMIN version)" else log_action_msg "MySQL is stopped." exit 3 fi ;; *) echo "Usage: $SELF start|stop|restart|reload|force-reload|status" exit 1 ;; esac }