|
| 1 | +#!/bin/bash |
| 2 | + |
| 3 | +# v-restore-user-cpanel |
| 4 | +# Restores an exported backup from cPanel |
| 5 | + |
| 6 | +# Based on sk-import-cpanel-backup-to-vestacp |
| 7 | +# Credits: Maks Usmanov (skamasle) and contributors: |
| 8 | +# Thanks to https://github.com/Skamasle/sk-import-cpanel-backup-to-vestacp/graphs/contributors |
| 9 | + |
| 10 | +# Known issue |
| 11 | +# - Importing certificates fails at the moment. Due to format changes of CPanel side |
| 12 | +# - It doesn't update DKIM or any MX records in DNS |
| 13 | + |
| 14 | +# shellcheck source=/etc/hestiacp/hestia.conf |
| 15 | +source /etc/hestiacp/hestia.conf |
| 16 | +# shellcheck source=/usr/local/hestia/func/main.sh |
| 17 | +source $HESTIA/func/main.sh |
| 18 | + |
| 19 | +if [ $# -lt 1 ]; then |
| 20 | + echo "usage: bash $0 cpanel-backup.tar.gz" |
| 21 | + echo "or" |
| 22 | + echo "usage: bash $0 cpanel-backup.tar.gz MX" |
| 23 | + exit 1 |
| 24 | +fi |
| 25 | + |
| 26 | +if [ ! -e /usr/bin/rsync ] || [ ! -e /usr/bin/file ]; then |
| 27 | + echo "#######################################" |
| 28 | + echo "rsync not installed, try install it" |
| 29 | + echo "This script need: rsync, file" |
| 30 | + echo "#######################################" |
| 31 | + if [ -e /etc/redhat-release ]; then |
| 32 | + echo "Run: yum install rsync file" |
| 33 | + else |
| 34 | + echo "Run: apt-get install rsync file" |
| 35 | + fi |
| 36 | + exit 3 |
| 37 | +fi |
| 38 | +# Default settings |
| 39 | +# Put this to 0 if you want use bash -x to debug it |
| 40 | +debug=1 |
| 41 | +# Pacakge to be used by default "default" |
| 42 | +hestia_package=default |
| 43 | + |
| 44 | +if [ -f "$1" ]; then |
| 45 | + cpanel_backup="$1" |
| 46 | +fi |
| 47 | +if [ -z "$BACKUP_TEMP" ]; then |
| 48 | + BACKUP_TEMP=$BACKUP |
| 49 | +else |
| 50 | + echo "File does not exists" |
| 51 | + exit 1 |
| 52 | +fi |
| 53 | + |
| 54 | +# Creating temporary directory |
| 55 | +tmpdir=$(mktemp -p "$BACKUP_TEMP" -d) |
| 56 | + |
| 57 | +tput setaf 2 |
| 58 | +echo "Checking provided file..." |
| 59 | +tput sgr0 |
| 60 | +if ! file "$cpanel_backup" | grep -q -c "gzip compressed data,"; then |
| 61 | + echo "Error 3 not-gzip - no stantard cpanel backup provided of file not installed ( Try yum install file, or apt-get install file )" |
| 62 | + rm -rf "$tmpdir" |
| 63 | + exit 3 |
| 64 | +fi |
| 65 | + |
| 66 | +tput setaf 2 |
| 67 | +echo "OK - Gziped File" |
| 68 | +tput sgr0 |
| 69 | +echo "Extracting backup..." |
| 70 | +if tar xzf "$cpanel_backup" -C "$tmpdir"; then |
| 71 | + tput setaf 2 |
| 72 | + echo "Backup extracted without errors..." |
| 73 | + tput sgr0 |
| 74 | +else |
| 75 | + echo "Error on backup extraction, check your file, try extract it manually" |
| 76 | + echo "Remove tmp" |
| 77 | + rm -rf "$tmpdir" |
| 78 | + exit 1 |
| 79 | +fi |
| 80 | + |
| 81 | +cd $tmpdir/* |
| 82 | + |
| 83 | +echo "Get prefix..." |
| 84 | +user_prefix=$(cat meta/dbprefix) |
| 85 | + |
| 86 | +sk_importer_in=$(pwd) |
| 87 | +echo "Access tmp directory $sk_importer_in" |
| 88 | +dbprefix=$(cat meta/dbprefix) |
| 89 | +if [ $dbprefix = 1 ]; then |
| 90 | + echo "Error 255 - I dont like your prefix, I dont want do this job" |
| 91 | + exit 255 |
| 92 | +fi |
| 93 | +main_domain1=$(grep main_domain userdata/main | cut -d " " -f2) |
| 94 | +new_user=$(grep "user:" userdata/${main_domain1} | cut -d " " -f2) |
| 95 | +echo "Get User: $new_user" |
| 96 | +check_sysuser=$(cut -f 1 -d : /etc/passwd | grep "^$new_user$") |
| 97 | +if [ -n "$check_sysuser" ] || [ -e "$HESTIA/data/users/$new_user" ]; then |
| 98 | + check_result "$E_EXISTS" "user $user exists" |
| 99 | + echo "User allready exists" |
| 100 | + exit 2 |
| 101 | +fi |
| 102 | + |
| 103 | +# Create a new user |
| 104 | +tmp_passwd=$(generate_password) |
| 105 | +email=$(cat ./cp/$new_user | grep CONTACTEMAIL= | cut -f2 -d'=') |
| 106 | +$BIN/v-add-user "$new_user" "$tmp_passwd" "$email" "$hestia_package" |
| 107 | +# Restore user password |
| 108 | +update_user_value "$new_user" 'MD5' "$(cat shadow)" |
| 109 | +$BIN/v-rebuild-user "$new_user" |
| 110 | + |
| 111 | +# Restore databases |
| 112 | +mysql -e "SET GLOBAL max_allowed_packet=1073741824;" |
| 113 | +tput setaf 2 |
| 114 | +echo "Start with Databases" |
| 115 | +tput sgr0 |
| 116 | +sed -i 's/\\//g' mysql.sql |
| 117 | +sed -i "s/\`/'/g" mysql.sql |
| 118 | + |
| 119 | +grep "GRANT USAGE ON" mysql.sql | awk -F "'" '{ print $2, $6 }' | uniq > user_password_db |
| 120 | +# User and database |
| 121 | +grep "GRANT" mysql.sql | grep -v "USAGE ON" > u_db |
| 122 | +cat u_db | awk -F "'" '{ print $2, $4 }' | sort | uniq > uni_u_db |
| 123 | + |
| 124 | +## User / Password |
| 125 | +grep "GRANT USAGE ON" mysql.sql | awk -F "'" '{ print $2, $6 }' | uniq > user_password_db |
| 126 | +# User and database |
| 127 | +grep "GRANT" mysql.sql | grep -v "USAGE ON" > u_db |
| 128 | +cat u_db | awk -F "'" '{ print $2, $4 }' | sort | uniq > uni_u_db |
| 129 | +sed -i "s/$user_prefix //g" user_password_db |
| 130 | +# Get database list |
| 131 | +db_list=$(grep -m 1 Database: mysql/*.create | awk '{ print $5 }') |
| 132 | +mysql -e "SHOW DATABASES" > server_dbs |
| 133 | +for db in $db_list; do |
| 134 | + grep -w db server_dbs |
| 135 | + if [ $? == "1" ]; then |
| 136 | + echo " Create and restore ${db} " |
| 137 | + mysql < mysql/${db}.create |
| 138 | + sed -i "s/utf8mb4_0900_ai_ci/utf8mb4_unicode_ci/g" mysql/${db}.sql |
| 139 | + mysql ${db} < mysql/${db}.sql |
| 140 | + else |
| 141 | + echo "Error: Cant restore database $db alredy exists in mysql server" |
| 142 | + fi |
| 143 | +done |
| 144 | + |
| 145 | +time=$(echo "$time_n_date" | cut -f 1 -d \ ) |
| 146 | +date=$(echo "$time_n_date" | cut -f 2 -d \ ) |
| 147 | + |
| 148 | +cat uni_u_db | while read db userdb; do |
| 149 | + grep -w $userdb user_password_db | while read user end_user_pass; do |
| 150 | + # default cpanel user has all database privileges |
| 151 | + # if you use default user in your config files to connect with database |
| 152 | + # you will need remove && [ "$userdb" != "$sk_cp_user" ] to restore main user, but |
| 153 | + # this will cause database duplication in db.conf and will interfer with hestiacp backups |
| 154 | + if [ "$userdb" == "$user" ] && [ "$userdb" != "$new_user" ] && [ "$userdb" != "$sk_real_cp_user" ]; then |
| 155 | + echo "DB='$db' DBUSER='$userdb' MD5='$end_user_pass' HOST='localhost' TYPE='mysql' CHARSET='UTF8' U_DISK='0' SUSPENDED='no' TIME='$time' DATE='$data'" >> /usr/local/hestia/data/users/$new_user/db.conf |
| 156 | + fi |
| 157 | + done |
| 158 | +done |
| 159 | + |
| 160 | +# Leave hestia restore passwords and create users |
| 161 | +tput setaf 2 |
| 162 | +echo "Rebuild databases files for $new_user" |
| 163 | +tput sgr0 |
| 164 | +$BIN/v-rebuild-databases $new_user |
| 165 | +## end mysql |
| 166 | + |
| 167 | +addon_domains=$(cat addons | cut -d "=" -f1) |
| 168 | +sed -i 's/_/./g; s/=/ /g' addons |
| 169 | +echo "Converting addons domains, subdomains and some other fun" |
| 170 | +cp sds hst_sds |
| 171 | +cp sds2 hst_sds2 |
| 172 | +sed -i 's/_/./g' hst_sds |
| 173 | +sed -i 's/public_html/public@html/g; s/_/./g; s/public@html/public_html/g; s/=/ /g' hst_sds2 |
| 174 | + |
| 175 | +tput setaf 2 |
| 176 | +echo "Start restoring domains" |
| 177 | +tput sgr0 |
| 178 | +function get_domain_path() { |
| 179 | + while read cp_domain path; do |
| 180 | + echo "Import $cp_domain" |
| 181 | + if [ -e userdata/$cp_domain ]; then |
| 182 | + $BIN/v-add-domain "$new_user" "$cp_domain" |
| 183 | + rm -f /home/$new_user/web/$cp_domain/public_html/index.html |
| 184 | + rm -f /home/$new_user/web/$cp_domain/public_html/robots.txt |
| 185 | + sync_count=0 |
| 186 | + rsync -av homedir/$path/ /home/$new_user/web/$cp_domain/public_html 2>&1 \ |
| 187 | + | while read file_dm; do |
| 188 | + sync_count=$(($sync_count + 1)) |
| 189 | + echo -en "-- $sync_count restored files\r" |
| 190 | + done |
| 191 | + chown $new_user:$new_user -R /home/$new_user/web/$cp_domain/public_html |
| 192 | + chmod 751 /home/$new_user/web/$cp_domain/public_html |
| 193 | + fi |
| 194 | + done |
| 195 | +} |
| 196 | +get_domain_path < hst_sds2 |
| 197 | + |
| 198 | +/usr/local/hestia/bin/v-add-domain $new_user $main_domain1 |
| 199 | +# need it for restore main domain |
| 200 | +if [ ! -e exclude_path ]; then |
| 201 | + touch exclude_path |
| 202 | +fi |
| 203 | +echo "Restore main domain: $main_domain1" |
| 204 | +rm -f /home/$new_user/web/$main_domain1/public_html/index.html |
| 205 | +rm -f /home/$new_user/web/$main_domain1/public_html/robots.txt |
| 206 | + |
| 207 | +rsync -av --exclude-from='exclude_path' homedir/public_html/ /home/$new_user/web/$main_domain1/public_html 2>&1 \ |
| 208 | + | while read file_dm; do |
| 209 | + sync_count=$(($sync_count + 1)) |
| 210 | + echo -en "-- $sync_count restored files\r" |
| 211 | + done |
| 212 | + |
| 213 | +chown $new_user:$new_user -R /home/$new_user/web/$main_domain1/public_html |
| 214 | +chmod 751 /home/$new_user/web/$main_domain1/public_html |
| 215 | + |
| 216 | +################## |
| 217 | +# mail |
| 218 | +tput setaf 2 |
| 219 | +echo "" |
| 220 | +echo "Start Restoring Mails" |
| 221 | +tput sgr0 |
| 222 | +cd homedir/mail |
| 223 | + |
| 224 | +for folder in *; do |
| 225 | + if [ -d "$folder" ]; then |
| 226 | + if [[ "$folder" != "cur" && "$folder" != "new" && "$folder" != "tmp" ]]; then |
| 227 | + echo "Domain: $folder" |
| 228 | + |
| 229 | + for mail_account in $folder/*; do |
| 230 | + if [ "$mail_account" != "$folder/*" ]; then |
| 231 | + echo "Import mail account: $mail_account@#$folder" |
| 232 | + # Doesn't really matter but we don't know the unhashed one |
| 233 | + tmp_pass=$(generate_password) |
| 234 | + $BIN/v-add-mail-account $new_user $folder $mail_account $tmp_pass |
| 235 | + mv $folder/$mail_account /home/$new_user/mail/$folder/ |
| 236 | + chown $new_user:mail /home/$new_user/mail/$folder/ |
| 237 | + find /home/$new_user/mail/$folder -type f -name 'dovecot*' -delete |
| 238 | + |
| 239 | + pass=$(grep "^$mail_account:" ../etc/${folder}/shadow | awk -F ":" '{print $2}') |
| 240 | + fi |
| 241 | + done |
| 242 | + fi |
| 243 | + fi |
| 244 | +done |
| 245 | +echo "All mail accounts restored" |
| 246 | + |
| 247 | +cd ../ssl/ |
| 248 | +mv ./keys/* ./certs/ |
| 249 | +ls ./certs/ |
| 250 | + |
| 251 | +cat ssl.db |
| 252 | +domains=$(/usr/local/hestia/bin/v-list-web-domains $new_user plain | awk '{ print $1 }') |
| 253 | + |
| 254 | +for domain in $domains; do |
| 255 | + if [ -e ./sslcerts/$domain.key ]; then |
| 256 | + v-add-web-domain-ssl $user $domain $(pwd)/sslcerts/ |
| 257 | + fi |
| 258 | +done |
| 259 | + |
| 260 | +rm -rf "$tmpdir" |
| 261 | + |
| 262 | +echo "##############################" |
| 263 | +echo "cPanel Backup restored" |
| 264 | +echo "Review your content and report any fail" |
| 265 | +exit |
0 commit comments