#!/bin/bash # # wordpress-tools # https://git.stack-source.com/msb/wordpress-tools # Copyright (c) 2023 Matthew Saunders Brown \ # GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) # require root if [ "${EUID}" -ne 0 ]; then echo "This script must be run as root" exit fi virtualhost_basedir="/srv/www" virtualhost_htdocsdir="html" declare -a input_keys_index input_keys_index=(s d u p x) declare -A input_keys_array input_keys_array[s]="MySQL Hostname (Server)" input_keys_array[d]="MySQL Database" input_keys_array[u]="MySQL Username" input_keys_array[p]="MySQL Password" input_keys_array[x]="MySQL Table Prefix" declare -A input_values_array help() { thisfilename=$(basename -- "$0") echo "$thisfilename - Update wp-config.php DB info." echo "" echo "Usage: $thisfilename [-v ] [-s ] [-d ] [-u ] [-p ] [-x ]" echo "" echo " -v VirtualHost of WordPress config that will be updated. If not set attempt to autodect based on current/working dir." echo " -s MySQL Hostname, defaults to 127.0.0.1" echo " -d MySQL Database, defaults to 'VirtualHost' with dots & dashes changed from symbols to words if not specified." echo " -u MySQL Username, defaults to owner of html dir if not specified." echo " -p WordPress db table prefix, defaults to wp_" echo " -f Force update - skips confirmation step, for automation." echo " -h Print this help." echo "" echo " You will be prompted to any options that were not" echo " specified on the command line and given a chance" echo " to confirm before performing the install unless the" echo " -f option is specified." exit } # force (-f) defaults to false force=false # set any options that were passed while getopts "v:s:d:u:p:x:fh" opt; do case "${opt}" in h ) help exit;; v ) input_values_array[v]=${OPTARG} ;; s ) input_values_array[s]=${OPTARG} ;; d ) input_values_array[d]=${OPTARG} ;; u ) input_values_array[u]=${OPTARG} ;; p ) input_values_array[p]=${OPTARG} ;; x ) input_values_array[x]=${OPTARG} ;; f ) force=true ;; \? ) echo "Invalid option: $OPTARG" 1>&2 exit 1;; : ) echo "Invalid option: $OPTARG requires an argument" 1>&2 exit 1;; esac done # v - virtualhost function validate_v() { if [[ -d "$virtualhost_basedir/${input_values_array[v]}" ]]; then if [[ ! -d "$virtualhost_basedir/${input_values_array[v]}/$virtualhost_htdocsdir" ]]; then echo "${input_values_array[v]} is installed, but DocumentRoot for ${input_values_array[v]} does not exist." echo "$virtualhost_basedir/${input_values_array[v]}/$virtualhost_htdocsdir" exit fi else echo "VirtualHost ${input_values_array[v]} is not installed on this server." echo "$virtualhost_basedir/${input_values_array[v]}/$virtualhost_htdocsdir" unset input_values_array[v] fi } if [[ -n "${input_values_array[v]}" ]] ; then validate_v else cwd=`pwd` echo "cwd = $cwd" if echo $cwd |grep -q ^/srv/www/ ; then input_values_array[v]=`echo $cwd |cut -d '/' -f 4` validate_v else while [ -z "${input_values_array[v]}" ]; do read -p "Enter the VirtualHost of WordPress config " virtualhost if [ -n "$virtualhost" ] ; then input_values_array[v]=$virtualhost validate_v fi done fi fi # s - Shell Username # get shell user value, user can't override shell_username=$(stat -c '%U' $virtualhost_basedir/${input_values_array[v]}) # m - MySQL Hostname if [[ -z "${input_values_array[s]}" ]] ; then if [[ -f "$virtualhost_basedir/${input_values_array[v]}/.my.cnf" ]]; then input_values_array[s]=`grep host /srv/www/${input_values_array[v]}/.my.cnf |cut -d = -f 2` else input_values_array[s]="127.0.0.1" fi fi # d - MySQL Database if [[ -z "${input_values_array[d]}" ]] ; then if [[ -f "$virtualhost_basedir/${input_values_array[v]}/.my.cnf" ]]; then input_values_array[d]=`grep database /srv/www/${input_values_array[v]}/.my.cnf |cut -d = -f 2` else mysql_database=${input_values_array[v]} mysql_database=${mysql_database//./dot} mysql_database=${mysql_database//-/dash} input_values_array[d]=$mysql_database fi fi # u - MySQL Username if [[ -z "${input_values_array[u]}" ]] ; then if [[ -f "$virtualhost_basedir/${input_values_array[v]}/.my.cnf" ]]; then input_values_array[u]=`grep user /srv/www/${input_values_array[v]}/.my.cnf |cut -d = -f 2` else input_values_array[u]="$shell_username@${input_values_array[v]}" fi fi # p - MySQL Password if [[ -z "${input_values_array[p]}" ]] ; then if [[ -f "$virtualhost_basedir/${input_values_array[v]}/.my.cnf" ]]; then input_values_array[p]=`grep password /srv/www/${input_values_array[v]}/.my.cnf |cut -d = -f 2` fi fi # p - MySQL Password function validate_p() { mysql_username_count=`mysql -s -N -e "SELECT COUNT(*) FROM mysql.user WHERE User='${input_values_array[n]}'"` if [[ "$mysql_username_count" -gt 0 ]]; then mysql_password_verification=`mysql -s -A -N -e "SELECT COUNT(1) Password_is_OK FROM mysql.user WHERE user='${input_values_array[n]}' AND password=PASSWORD('${input_values_array[w]}')"` if [[ "$mysql_password_verification" -ne 1 ]]; then read -p "ERROR: Invalid MySQL Password for existing MySQL User ${input_values_array[n]}, please enter current password: " mysql_password if [ -n "$mysql_password" ] ; then input_values_array[p]=$mysql_password restart_script fi fi fi } # x - MySQL DB Prefix function validate_x() { if mysql -e "USE ${input_values_array[d]}" 2> /dev/null; then mysql_db_prefix=`echo ${input_values_array[x]} |sed 's|_|\\\_|g'` mysql_db_prefix_count=`mysql -s -N -e "SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = '${input_values_array[d]}' AND TABLE_NAME LIKE '$mysql_db_prefix%'"` if [[ "$mysql_db_prefix_count" -gt 0 ]]; then read -p "One or more MySQL tables with DB Prefix '${input_values_array[x]}' already exist, please enter new prefix: " mysql_db_prefix if [ -n "$mysql_db_prefix" ] ; then input_values_array[x]=$mysql_db_prefix restart_script fi fi fi } if [ -z "${input_values_array[x]}" ] ; then input_values_array[x]="wp_" fi # display confirmation function display_confirmation() { echo for key in "${!input_keys_index[@]}" ; do value=${input_keys_index[$key]} echo "$value - ${input_keys_array[$value]}: ${input_values_array[$value]}" done echo echo "i - install now with these settings" echo "q - quit without installing" echo read -p "Select option to edit or install/quit: " option echo } function restart_script() { # set command line args cli_args= for key in "${!input_values_array[@]}" ; do value=${input_values_array[$key]} cli_args="$cli_args -$key '$value'" done # echo "${0} $cli_args" echo eval ${0} $cli_args exit } if [[ "$force" == "false" ]]; then display_confirmation else option="i" fi if [[ "$option" == "i" ]]; then # validate MySQL DB Prefix validate_x # validate MySQL User Password validate_p echo echo "Updating WP config db info for VirtualHost ${input_values_array[v]} now..." # switch to Shell User and update config # sudo -u ${input_values_array[s]} --shell /bin/bash << EOF echo cd $virtualhost_basedir/${input_values_array[v]}/$virtualhost_htdocsdir echo wp config set DB_HOST ${input_values_array[s]} echo wp config set DB_NAME ${input_values_array[d]} echo wp config set DB_USER ${input_values_array[u]} echo wp config set DB_PASSWORD ${input_values_array[p]} # EOF elif [[ "$option" == "q" ]]; then echo "Quiting without updating config." elif [[ " ${input_keys_index[@]} " =~ " $option " ]]; then read -p "Enter new value for ${input_keys_array[$option]} (${input_values_array[$option]}): " new_value if [ -n "$new_value" ] ; then input_values_array[$option]=$new_value fi restart_script else echo "ERROR: Invalid entry, try again." fi