#! /bin/bash
# Afrihost - cpanel mysqlupgrade with backups

# cpanel check
if ! [ -f "/usr/local/cpanel/cpanel" ]; then
       echo "-" 
       exit
fi

pscript=$(basename $0)
TODAY=$(date  +"%Y-%b-%d")
YESTERDAY=$(date -d yesterday +"%Y-%b-%d")
PWDIR="/root/.preports/"$pscript""
OUTFILE="$PWDIR/`hostname`.sql_upgrade"

# Define the valid options for the argument  
valid_options=("mariadb11.8" "mariadb11.4" "mariadb10.11" "mariadb10.5" "mariadb10.6" "mysql8" "mysql5.7")

# Check if the argument is provided
if [ $# -lt 1 ]; then
  echo -e "\n====== Afrihost Mysql/Mariadb upgrade - with backups ======"
  echo -e "\n[ ERROR ] Requires mysql/maria version to upgrade to as first argument."
  echo -e "\\nUSAGE: $0 ${valid_options[@]}"
  echo -e "\nexample: $0 mariadb10.11"
  echo -e "\n===================================================\n"
  exit 1
fi
  
# Check if the argument is a valid option
if [[ ! " ${valid_options[@]} " =~ " $1 " ]]; then
  echo "Error: Invalid argument. Valid options are: ${valid_options[*]}"
  exit 1
fi

#setting environment
env_set() 
{
if [ ! -d "$PWDIR" ]; then
                mkdir -p "$PWDIR" ;
        else
        rm -f $PWDIR/*
fi
}
env_set

sql_mode_check () {
if egrep  '\[client\]|\[mysql\]' /etc/my.cnf ; 
 then sed -i '/\[mysqld\]/a sql-mode=""' /etc/my.cnf ; 
fi
if ! egrep -q 'sql-mode' /etc/my.cnf  ;then
 echo "sql-mode=\"\"" >> /etc/my.cnf
 service mysql stop ; service mysqld stop ; /scripts/restartsrv_mysql
fi
}

# Check if the argument is a MariaDB version
if [[ $1 == mariadb* ]]; then
  { grep -q  MariaDB  /etc/yum.conf && echo -e "\n=== ERROR: MariaDB is excluded in yum.conf.Remove entry and re-run script===\n" && exit 1 ;  }
  if ! {  mysql --version  | grep -i maria || mysql --version  | grep -i "mysql  Ver 8" ; }  ; then
   installed_version=10.0
  else
   installed_version=$(mysql --version | awk '{print $5}' | awk -F "-"   '{print $1}' | awk -F "."   '{print $1"."$2}')
  fi
  required_version=$(echo $1 | awk -F'mariadb' '{print $2}')
  echo "Installed_version=$installed_version"
  echo "Required_version=$required_version"
if [ "$required_version" > "$installed_version" ] ; then
    echo "Requested version is higher than installed version"
    echo "Upgrading MariaDB to $1"
    echo -e "[INFO] This script would run \n[INFO] whmapi1 start_background_mysql_upgrade version="$required_version""
    echo "You have 10 seconds to press ctrl+c is something appears off!"
    sleep 20
    touch /root/.mysql_ugrade_start_$(date +"%Y"_"%m_%d_%R")
    sed -i '/innodb_force_recovery/d' /etc/my.cnf
    /scripts/restartsrv_mysql
    mysql -e  "SHOW ENGINES" | grep -i "innoDB.*YES"  | awk  '{print $1,$1}' || { echo "innodb_broken" ; touch /root/.mysqlupgrade_innodb_precheck.fail ; exit ; }
    rm -fv /etc/yum.repos.d/MariaDB*
    [ -d /var/softaculous ] && rm -rf /var/softaculous/
    mysqlcheck --all-databases -r
    /scripts/restartsrv_mysql --stop ; /scripts/restartsrv_mysql --stop
    rsync -avP /var/lib/mysql/ /backup/mysql_orig_"$(echo $((RANDOM % 65 + 499)))"/
    /scripts/restartsrv_mysql --start
    mysql -e  "SHOW ENGINES" | grep -i "innoDB.*YES"  | awk  '{print $1,$1}' || { echo "innodb_broken" ; touch /root/.mysqlupgrade_innodb_precheck.fail ; exit ; }
    whmapi1 start_background_mysql_upgrade version="$required_version"
    sql_mode_check
    echo "== $TODAY [ mysql upgrade running in the background - check if it's busy with  #ps auwfx| grep mysql ; mysql V   ]" >> $OUTFILE
    touch /root/.mysql_ugrade_end_$(date +"%Y"_"%m_%d_%R")
  else
    echo "MariaDB already seems to be set to upgrade version or there's some other error"
    exit 0
  fi
fi

# Check if the argument is a MySQL version
if [[ $1 == mysql* ]]; then
  if [[ $(mysql --version | awk '{print $5}' | cut -d, -f1) == *"mariadb"* ]]; then
    echo "Error: Cannot upgrade to MySQL while running MariaDB."
    exit 1
  fi
  installed_version=$(mysql --version | awk '{print $5}' | awk -F "." '{print $1"."$2}')
  required_version=$(echo "$1" | awk -F'mysql' '{print $2}')
  if [[ "$required_version" > "$installed_version" ]]; then
    echo -e "Upgrading Mysql $installed_version to $1"
    if echo $required_version | grep 8 ; then required_version_fmt=8.0 ; fi
    echo -e "[INFO] This script would run \n[INFO] whmapi1 start_background_mysql_upgrade version="$required_version_fmt""
    echo -e "You have 10 seconds to press ctrl+c is something appears off!"
    sleep 20
    touch /root/.mysql_ugrade_start_$(date +"%Y"_"%m_%d_%R")
    sed -i '/innodb_force_recovery/d' /etc/my.cnf
    /scripts/restartsrv_mysql
    mysql -e  "SHOW ENGINES" | grep -i "innoDB.*YES"  | awk  '{print $1,$1}' || { echo "innodb_broken" ; touch /root/.mysqlupgrade_innodb_precheck.fail ; exit ; }
    rm -fv /etc/yum.repos.d/MariaDB*
    [ -d /var/softaculous ] && rm -rf /var/softaculous/
    mysqlcheck --all-databases -r
    /scripts/restartsrv_mysql --stop ; /scripts/restartsrv_mysql --stop
    rsync -avP /var/lib/mysql/ /backup/mysql_orig_"$(echo $((RANDOM % 65 + 499)))"/
    /scripts/restartsrv_mysql --start
    mysql -e  "SHOW ENGINES" | grep -i "innoDB.*YES"  | awk  '{print $1,$1}' || { echo "innodb_broken" ; touch /root/.mysqlupgrade_innodb_precheck.fail ; exit ; }
    whmapi1 start_background_mysql_upgrade version="$required_version_fmt"
    sql_mode_check
    echo "== $TODAY [  mysql upgrade running in the background - check if it's busy with  #ps auwfx| grep mysql ; mysql V   ]" >> $OUTFILE
    touch /root/.mysql_ugrade_end_$(date +"%Y"_"%m_%d_%R")
  else
    echo "No need to upgrade MySQL"
    exit 0
  fi
fi
