myvesta/bin/v-import-cpanel-backup

379 lines
14 KiB
Bash

#!/bin/bash
# Author / Idea: Maks Usmanov - Skamasle and good people who help to improve:
# Thanks to https://github.com/Skamasle/sk-import-cpanel-backup-to-vestacp/graphs/contributors
# Github: https://github.com/Skamasle/sk-import-cpanel-backup-to-vestacp
# Run at your own risk
# This script take cpanel full backup and import it in vestacp account
# This script can import databases and database users and password,
# Import domains, subdomains and website files
# This script import also mail accounts and mails into accounts if previous cpanel run dovecot
###########
# If you need restore main database user read line 160 or above
###########
if [ $# -lt 1 ]; then
echo "usage: bash $0 cpanel-backup.tar.gz"
echo "or"
echo "usage: bash $0 cpanel-backup.tar.gz MX"
exit 1
fi
if [[ $PATH != *"/usr/local/vesta/bin"* ]]; then
VESTA=/usr/local/vesta
export VESTA
PATH=$PATH:/usr/local/vesta/bin
export PATH
fi
if [ ! -e /usr/bin/rsync ] || [ ! -e /usr/bin/file ] ; then
echo "#######################################"
echo "rsync not installed, try installing it"
echo "This script need: rsync, file"
echo "#######################################"
if [ -e /etc/redhat-release ]; then
echo "Run: yum install rsync file"
else
echo "Run: apt-get install rsync file"
fi
exit 3
fi
# Put this to 0 if you want use bash -x to debug it
sk_debug=1
sk_vesta_package=default
#
# Only for gen_password but I dont like it, a lot of lt
# maybe will use it for other functions :)
source /usr/local/vesta/func/main.sh
sk_file=$1
sk_tmp=sk_tmp
# I see than this is stupid, not know why is here.
sk_file_name=$(ls $sk_file)
tput setaf 2
echo "Checking provided file..."
tput sgr0
if file $sk_file |grep -q -c "gzip compressed data," ; then
tput setaf 2
echo "OK - Gziped File"
tput sgr0
if [ ! -d /root/${sk_tmp} ]; then
echo "Creating tmp.."
mkdir /root/${sk_tmp}
fi
echo "Extracting backup..."
if [ "$sk_debug" != 0 ]; then
tar xzvf $sk_file -C /root/${sk_tmp} 2>&1 |
while read sk_extracted_file; do
ex=$((ex+1))
echo -en "wait... $ex files extracted\r"
done
else
tar xzf $sk_file -C /root/${sk_tmp}
fi
if [ $? -eq 0 ];then
tput setaf 2
echo "Backup extracted without errors..."
tput sgr0
else
echo "Error on backup extraction, check your file, try extract it manually"
echo "Remove tmp"
rm -rf "/root/${sk_tmp}"
exit 1
fi
else
echo "Error 3 not-gzip - no stantard cpanel backup provided of file not installed ( Try yum install file, or apt-get install file )"
rm -rf "/root/${sk_tmp}"
exit 3
fi
cd /root/${sk_tmp}/*
sk_importer_in=$(pwd)
echo "Access tmp directory $sk_importer_in"
echo "Get prefix..."
sk_dead_prefix=$(cat meta/dbprefix)
if [ $sk_dead_prefix = 1 ]; then
echo "Error 666 - I dont like your prefix, I dont want do this job"
exit 666
else
echo "I like your prefix, start working"
fi
main_domain1=$(grep main_domain userdata/main |cut -d " " -f2)
if [ "$(ls -A mysql)" ]; then
sk_cp_user=$(ls mysql |grep sql | grep -v roundcube.sql |head -n1 |cut -d "_" -f1)
if [ -z "$sk_cp_user" ]; then
sk_cp_user=$(grep "user:" userdata/${main_domain1} | cut -d " " -f2)
fi
echo "$sk_cp_user" > sk_db_prefix
tput setaf 2
echo "Get user: $sk_cp_user"
tput sgr0
sk_restore_dbs=0
else
sk_restore_dbs=1
# get real cPanel user if no databases exist
sk_cp_user=$(grep "user:" userdata/${main_domain1} | cut -d " " -f2)
fi
# So get real user, may be we need it after -- oh yes, not remember where but this save my day march 19 2017 on 0.5
sk_real_cp_user=$(grep "user:" userdata/${main_domain1} | cut -d " " -f2)
if /usr/local/vesta/bin/v-list-users | grep -q -w $sk_cp_user ;then
echo "User alredy exist on your server, maybe on vestacp or in your /etc/passwd"
echo "**"
echo "Grep your /etc/passwd"
grep -q -w $sk_cp_user /etc/passwd
echo "**"
echo "Stop Working, clening..."
rm -rf /root/${sk_tmp}
exit 21
else
echo "Generate random password for $sk_cp_user and create Vestacp Account ..."
sk_password=$(generate_password)
/usr/local/vesta/bin/v-add-user $sk_cp_user $sk_password administrator@${main_domain1} $sk_vesta_package $sk_cp_user $sk_cp_user
if [ $? != 0 ]; then
tput setaf 2
echo "Stop Working... Cant create user...if is fresh install of vestacp try reboot or reopen session check bug https://bugs.vestacp.com/issues/138"
tput sgr0
rm -rf "/root/${sk_tmp}"
exit 4
fi
fi
### Start with Databases
mysql -e "SET GLOBAL max_allowed_packet=1073741824;"
tput setaf 2
echo "Start with Databases"
tput sgr0
sed -i 's/\\//g' mysql.sql
sed -i "s/\`/'/g" mysql.sql
## User / Password
grep "GRANT USAGE ON" mysql.sql | awk -F "'" '{ print $2, $6 }' | uniq > user_password_db
# User and database
grep "GRANT" mysql.sql |grep -v "USAGE ON" > u_db
cat u_db | awk -F "'" '{ print $2, $4 }' | sort | uniq > uni_u_db
sed -i "s/$sk_dead_prefix //g" user_password_db
# Get database list
sk_db_list=$(grep -m 1 Database: mysql/*.create | awk '{ print $5 }')
mysql -e "SHOW DATABASES" > server_dbs
for sk_dbr in $sk_db_list
do
grep -w $sk_dbr server_dbs
if [ $? == "1" ]; then
echo " Create and restore ${sk_dbr} "
sed -i "s/utf8mb4_unicode_520_ci/utf8mb4_unicode_ci/g" mysql/${sk_dbr}.create
sed -i "s/utf8mb4_0900_ai_ci/utf8mb4_unicode_ci/g" mysql/${sk_dbr}.create
v-sed '/*!999999\- enable the sandbox mode */' '' mysql/${sk_dbr}.create
mysql < mysql/${sk_dbr}.create
sed -i "s/utf8mb4_unicode_520_ci/utf8mb4_unicode_ci/g" mysql/${sk_dbr}.sql
sed -i "s/utf8mb4_0900_ai_ci/utf8mb4_unicode_ci/g" mysql/${sk_dbr}.sql
v-sed '/*!999999\- enable the sandbox mode */' '' mysql/${sk_dbr}.sql
mysql ${sk_dbr} < mysql/${sk_dbr}.sql
else
echo "Error: Cant restore database $sk_dbr alredy exists in mysql server"
fi
done
cat uni_u_db | while read db userdb
do
grep -w $userdb user_password_db |while read user end_user_pass
do
# default cpanel user has all database privileges
# if you use default user in your config files to connect with database
# you will need remove && [ "$userdb" != "$sk_cp_user" ] to restore main user, but
# this will cause database duplication in db.conf and will interfer with vestacp backups
if [ "$userdb" == "$user" ] && [ "$userdb" != "$sk_cp_user" ] && [ "$userdb" != "$sk_real_cp_user" ] ; then
echo "DB='$db' DBUSER='$userdb' MD5='$end_user_pass' HOST='localhost' TYPE='mysql' CHARSET='UTF8' U_DISK='0' SUSPENDED='no' TIME='$TIME' DATE='$DATE'" >> /usr/local/vesta/data/users/${sk_cp_user}/db.conf
fi
done
done
# Leave vesta restore passwords and create users
tput setaf 2
echo "Rebuild databases files for $sk_cp_user"
tput sgr0
/usr/local/vesta/bin/v-rebuild-databases $sk_cp_user
## end mysql
skaddons=$(cat addons |cut -d "=" -f1)
sed -i 's/_/./g; s/=/ /g' addons
echo "Converting addons domains, subdomains and some other fun"
cp sds sk_sds
cp sds2 sk_sds2
sed -i 's/_/./g' sk_sds
sed -i 's/public_html/public@html/g; s/_/./g; s/public@html/public_html/g; s/=/ /g; s/$sk_default_sub/@/g' sk_sds2
cat addons | while read sk_addon_domain sk_addon_sub
do
echo "Converting default subdomain: $sk_addon_sub in domain: $sk_addon_domain"
sed -i -e "s/$sk_addon_sub/$sk_addon_domain/g" sk_sds
sed -i -e "s/$sk_addon_sub/$sk_addon_domain/g" sk_sds2
mv userdata/$sk_addon_sub userdata/${sk_addon_domain}
done
tput setaf 2
echo "Start restoring domains"
tput sgr0
function get_domain_path() {
while read sk_domain path
do
if [ -e userdata/${sk_domain} ];then
/usr/local/vesta/bin/v-add-domain $sk_cp_user $sk_domain
echo "Restoring $sk_domain..."
rm -f /home/${sk_cp_user}/web/${sk_domain}/public_html/index.html
if [ "$sk_debug" != 0 ]; then
rsync -av homedir/${path}/ /home/${sk_cp_user}/web/${sk_domain}/public_html 2>&1 |
while read sk_file_dm; do
sk_sync=$((sk_sync+1))
echo -en "-- $sk_sync restored files\r"
done
echo " "
else
rsync homedir/${path}/ /home/${sk_cp_user}/web/${sk_domain}/public_html
fi
chown $sk_cp_user:$sk_cp_user -R /home/${sk_cp_user}/web/${sk_domain}/public_html
chmod 751 /home/${sk_cp_user}/web/${sk_domain}/public_html
echo "$sk_domain" >> exclude_path
fi
done
}
get_domain_path < sk_sds2
/usr/local/vesta/bin/v-add-domain $sk_cp_user $main_domain1
# need it for restore main domain
if [ ! -e exclude_path ];then
touch exclude_path
fi
echo "Restore main domain: $main_domain1"
rm -f /home/${sk_cp_user}/web/${main_domain1}/public_html/index.html
if [ "$sk_debug" != 0 ]; then
rsync -av --exclude-from='exclude_path' homedir/public_html/ /home/${sk_cp_user}/web/${main_domain1}/public_html 2>&1 |
while read sk_file_dm; do
sk_sync=$((sk_sync+1))
echo -en "-- $sk_sync restored files\r"
done
echo " "
else
rsync --exclude-from='exclude_path' homedir/public_html/ /home/${sk_cp_user}/web/${main_domain1}/public_html 2>&1
fi
chown $sk_cp_user:$sk_cp_user -R /home/${sk_cp_user}/web/${main_domain1}/public_html
chmod 751 /home/${sk_cp_user}/web/${main_domain1}/public_html
rm -f sk_sds2 sk_sds
##################
# mail
time_n_date=$(date +'%T %F')
time=$(echo "$time_n_date" |cut -f 1 -d \ )
date=$(echo "$time_n_date" |cut -f 2 -d \ )
tput setaf 2
echo "Start Restoring Mails"
tput sgr0
sk_cod=$(date +%s) # Just for numbers and create another file if acccount was restored before.
sk_mdir=${sk_importer_in}/homedir/mail
cd $sk_mdir
for sk_maild in $(ls -1)
do
if [[ "$sk_maild" != "cur" && "$sk_maild" != "new" && "$sk_maild" != "tmp" ]]; then
if [ -d "$sk_maild" ]; then
for sk_mail_account in $(ls $sk_maild/)
do
echo "Create and restore mail account: $sk_mail_account@$sk_maild"
sk_mail_pass1=$(generate_password)
/usr/local/vesta/bin/v-add-mail-account $sk_cp_user $sk_maild $sk_mail_account $sk_mail_pass1
mv ${sk_maild}/${sk_mail_account} /home/${sk_cp_user}/mail/${sk_maild}
chown ${sk_cp_user}:mail -R /home/${sk_cp_user}/mail/${sk_maild}
find /home/${sk_cp_user}/mail/${sk_maild} -type f -name 'dovecot*' -delete
if [ -f "${sk_importer_in}/homedir/etc/${sk_maild}/shadow" ]; then
echo "Set password for ${sk_mail_account}@${sk_maild}"
pass=$(grep "^${sk_mail_account}:" ${sk_importer_in}/homedir/etc/${sk_maild}/shadow | awk -F ":" '{print $2}')
newline="${sk_mail_account}:{SHA512-CRYPT}$pass:${sk_cp_user}:mail::/home/${sk_cp_user}:0"
newline2="ACCOUNT='${sk_mail_account}' ALIAS='' AUTOREPLY='no' FWD='' FWD_ONLY='' MD5='{SHA512-CRYPT}$pass' QUOTA='unlimited' U_DISK='0' SUSPENDED='no' TIME='$time' DATE='$date'"
escaped=$(printf '%s\n' "$newline" | sed -e 's/[\/&]/\\&/g')
escaped2=$(printf '%s\n' "$newline2" | sed -e 's/[\/&]/\\&/g')
sed -i "s/^${sk_mail_account}:.*/$escaped/g" /home/${sk_cp_user}/conf/mail/${sk_maild}/passwd
sed -i "s/^ACCOUNT='${sk_mail_account}.*/$escaped2/g" /usr/local/vesta/data/users/${sk_cp_user}/mail/${sk_maild}.conf
else
echo "${sk_mail_account}@${sk_maild} | $sk_mail_pass1" >> /root/sk_mail_password_${sk_cp_user}-${sk_cod}
fi
done
fi
#else
# this only detect default dirs account new, cur, tmp etc
# maybe can do something with this, but on most cpanel default account have only spam.
fi
done
echo "All mail accounts restored"
############# ssl functions <(°-°)>
tput setaf 2
echo "Restoring SSL for domains"
tput sgr0
mv ${sk_importer_in}/sslkeys/* ${sk_importer_in}/sslcerts/
if ls -1 ${sk_importer_in}/ssl/* >/dev/null 2>&1; then
mv ${sk_importer_in}/ssl/* ${sk_importer_in}/sslcerts/
else
echo "No SSL Cert. found..."
fi
sk_domains=$(/usr/local/vesta/bin/v-list-web-domains $sk_cp_user plain |awk '{ print $1 }')
for ssl in $sk_domains
do
if [ -e ${sk_importer_in}/sslcerts/${ssl}.key ]; then
echo "Found SSL for ${ssl}, restoring..."
/usr/local/vesta/bin/v-add-web-domain-ssl $sk_cp_user $ssl ${sk_importer_in}/sslcerts/
fi
done
function sk_restore_pass () {
sk_actual_pass=$(grep -w "^$sk_cp_user:" /etc/shadow |tr ":" " " | awk '{ print $2 }' )
sk_new_pass=$(cat $sk_importer_in/shadow)
# need replace I hope you have installed it as in most systems...
# sed is a hero but replace is easy and not need space // :D
replace "$sk_cp_user:$sk_actual_pass" "$sk_cp_user:$sk_new_pass" -- /etc/shadow
tput setaf 5
echo "Old cPanel password restored in $sk_cp_user vesta account"
tput sgr0
}
function sk_fix_mx () {
tput setaf 2
echo "Start With MX Records"
tput sgr0
cd $sk_importer_in/dnszones
for sk_mx in $sk_domains
do
if [ -e $sk_mx.db ]; then
sk_id=$(grep MX /usr/local/vesta/data/users/${sk_cp_user}/dns/${sk_mx}.conf |tr "'" " " | cut -d " " -f 2)
/usr/local/vesta/bin/v-delete-dns-record $sk_cp_user $sk_mx $sk_id
grep MX ${sk_mx}.db | awk '{for(sk=NF;sk>=1;sk--) printf "%s ", $sk;print ""}' | while read value pri ns rest
do
if [ "$ns" == "MX" ];then
if [ "$value" == "$sk_mx" ] || [ "$value" == "$sk_mx." ];then
value=mail.$value
fi
/usr/local/vesta/bin/v-add-dns-record $sk_cp_user $sk_mx @ MX $value $pri
if [[ "$?" -ge "1" ]]; then
/usr/local/vesta/bin/v-add-dns-record $sk_cp_user $sk_mx @ MX mail.${sk_mx} 0
fi
echo "MX fixed in $sk_mx"
fi
done
fi
done
}
if [ "$2" == "MX" ];then
# Need some fixed so run if you want try it, marked as experimental
sk_fix_mx
fi
sk_restore_pass
echo "Remove tmp files"
rm -rf "/root/${sk_tmp}"
tput setaf 4
echo "##############################"
echo "cPanel Backup restored"
echo "Review your content and report any fail"
if [ -f "/root/sk_mail_password_${sk_cp_user}-${sk_cod}" ]; then
echo "I reset mail password not posible restore it yet."
echo "Check your new passwords runing: cat /root/sk_mail_password_${sk_cp_user}-${sk_cod}"
fi
echo "##############################"
tput sgr0