#!/bin/sh #Use existing passwords to reset the da_admin account password. #https://www.directadmin.com/features.php?id=2677 ROOT_LOGIN=root ROOT_PASS= DA_ADMIN=da_admin DA_ADMIN_PASS= MYSQL_HOST=localhost SETUP_TXT=/usr/local/directadmin/scripts/setup.txt MYSQL_CONF=/usr/local/directadmin/conf/mysql.conf MY_CNF=/usr/local/directadmin/conf/my.cnf TMP_MY_CNF=/root/.tmp_my_cnf TMP_SQL=/root/.tmp.sql ############################### # FUNCTIONS set_my_cnf() { CNF=$1 CL=$2 CP=$3 CH=$4 echo -n '' > ${CNF} chmod 600 ${CNF} echo "[client]" >> ${CNF} echo "user=$CL" >> ${CNF} echo "password=$CP" >> ${CNF} echo "host=$CH" >> ${CNF} } #return 0 for success test_login() { L=$1 P=$2 set_my_cnf "${TMP_MY_CNF}" "$L" "$P" "$MYSQL_HOST" RES=`mysql --defaults-extra-file=${TMP_MY_CNF} -e "quit"` R=$? /bin/rm -f ${TMP_MY_CNF} return $R } set_host_vars() { if [ -s ${MYSQL_CONF} ]; then TEST_HOST=`grep ^host= ${MYSQL_CONF} | cut -d= -f2` if [ "${TEST_HOST}" != "" ]; then MYSQL_HOST=${TEST_HOST} echo "Using host=${MYSQL_HOST}" fi if [ "${MYSQL_HOST}" != "localhost" ]; then echo "This script currently only supports resetting local da_admin accounts. For remote accounts, please to this manually, accounting for access hosts." exit 4 fi #in case some other account name is used. TEST_DA_ADMIN=`grep ^user= ${MYSQL_CONF} | cut -d= -f2` if [ "${TEST_DA_ADMIN}" != "" ]; then DA_ADMIN=${TEST_DA_ADMIN} fi fi } #find a currently working login #return 0 for success set_root_login_vars() { if [ -s ${SETUP_TXT} ]; then ROOT_PASS=`grep '^mysql=' ${SETUP_TXT} | cut -d= -f2` test_login "$ROOT_LOGIN" "$ROOT_PASS" if [ "$?" -eq 0 ]; then echo "Using 'mysql=' ${ROOT_LOGIN} pass from ${SETUP_TXT}" return 0 fi fi if [ -s ${MYSQL_CONF} ]; then ROOT_LOGIN=`grep '^user=' ${MYSQL_CONF} | cut -d= -f2` ROOT_PASS=`grep '^passwd=' ${MYSQL_CONF} | cut -d= -f2` test_login "$ROOT_LOGIN" "$ROOT_PASS" if [ "$?" -eq 0 ]; then echo "Using 'passwd=' ${DA_ADMIN} pass from ${MYSQL_CONF}" return 0 fi fi #still no go? if [ -s ${SETUP_TXT} ]; then ROOT_LOGIN=`grep '^mysqluser=' ${SETUP_TXT} | cut -d= -f2` ROOT_PASS=`grep '^adminpass=' ${SETUP_TXT} | cut -d= -f2` test_login "$ROOT_LOGIN" "$ROOT_PASS" if [ "$?" -eq 0 ]; then echo "Using 'adminpass=' ${ROOT_LOGIN} pass from ${SETUP_TXT}" return 0 fi fi #check any other ideas here. echo "Could not find any working logins for ${MYSQL_HOST}" return 1 } set_pass_stdin() { read DA_ADMIN_PASS } #from setup.sh random_pass() { PASS_LEN=`perl -le 'print int(rand(6))+9'` START_LEN=`perl -le 'print int(rand(8))+1'` END_LEN=$(expr ${PASS_LEN} - ${START_LEN}) SPECIAL_CHAR=`perl -le 'print map { (qw{@ ^ _ - /})[rand 6] } 1'`; NUMERIC_CHAR=`perl -le 'print int(rand(10))'`; PASS_START=`perl -le "print map+(A..Z,a..z,0..9)[rand 62],0..$START_LEN"`; PASS_END=`perl -le "print map+(A..Z,a..z,0..9)[rand 62],0..$END_LEN"`; PASS=${PASS_START}${SPECIAL_CHAR}${NUMERIC_CHAR}${PASS_END} echo $PASS } set_pass_random() { DA_ADMIN_PASS=`random_pass` } set_pass_var() { DA_ADMIN_PASS=$1 } validate_password() { P=${DA_ADMIN_PASS} if [ "$P" = "" ]; then echo "Password is blank" return 1 fi return 0 } set_password_in_mysql() { set_my_cnf "${TMP_MY_CNF}" "$ROOT_LOGIN" "$ROOT_PASS" "$MYSQL_HOST" USE_HOST=localhost echo -n '' > ${TMP_SQL} chmod 600 ${TMP_SQL}; echo "ALTER USER ${DA_ADMIN}@${USE_HOST} IDENTIFIED BY '${DA_ADMIN_PASS}';" >> ${TMP_SQL}; RES=`mysql --defaults-extra-file=${TMP_MY_CNF} < ${TMP_SQL}` R=$? if [ "$R" -ne 0 ]; then echo "Error running password update for ${DA_ADMIN}@${USE_HOST}" echo ${RES} fi /bin/rm -f ${TMP_MY_CNF} /bin/rm -f ${TMP_SQL} return $R } set_new_pass_to_configs() { if [ -s ${MYSQL_CONF} ]; then perl -pi -e "s/^passwd=.*/passwd=${DA_ADMIN_PASS}/" ${MYSQL_CONF} else echo -n '' > ${MYSQL_CONF} chmod 600 ${MYSQL_CONF} chown diradmin:diradmin ${MYSQL_CONF} echo "user=${DA_ADMIN}" >> ${MYSQL_CONF} echo "passwd=${DA_ADMIN_PASS}" >> ${MYSQL_CONF} #echo host fi if [ -s ${MY_CNF} ]; then perl -pi -e "s/^password=.*/password=${DA_ADMIN_PASS}/" ${MY_CNF} else echo -n '' > ${MY_CNF} chmod 600 ${MY_CNF} chown diradmin:diradmin ${MY_CNF} echo "[client]" echo "user=${DA_ADMIN}" >> ${MY_CNF} echo "password=${DA_ADMIN_PASS}" >> ${MY_CNF} #echo host fi } show_help() { echo "Usage:" echo " $0 --stdin - the password will be passed on stdin" echo " $0 --random - pick a new random password" echo " $0 --password 'newpass' - set to specified password'" echo " $0 - this help page" } # END FUNCTIONS ############################### # # MAIN START # case "$1" in '--stdin') set_pass_stdin ;; '--random') set_pass_random ;; '--password') set_pass_var "$2" ;; *) show_help; exit 2 ;; esac set_host_vars set_root_login_vars if [ "$?" -ne 0 ]; then echo "Could not find a working root/da_admin login to use for the reset. Aborting" exit 1 fi #At this point, we have a working: ROOT_LOGIN@MYSQL_HOST with ROOT_PASS. validate_password if [ "$?" -ne 0 ]; then echo "Password '$DA_ADMIN_PASS' is not valid. Aborting" exit 3 fi set_password_in_mysql if [ "$?" -ne 0 ]; then exit 5 fi set_new_pass_to_configs echo "Success!" exit 0;