|
| 1 | +#!/bin/bash |
| 2 | +# info: Import DirectAdmin backup to a new user |
| 3 | +# |
| 4 | +# example: v-import-directadmin /backup/backup.tar.gz |
| 5 | +# |
| 6 | +# Based on sk-da-importer |
| 7 | +# Credits: Maks Usmanov (skamasle), Jaap Marcus (jaapmarcus) and contributors: |
| 8 | +# Thanks to <https://github.com/Skamasle/sk_da_importer/graphs/contributors> |
| 9 | + |
| 10 | +# This script is provided whitout any warranty |
| 11 | +# Run at your own risk |
| 12 | +# Version 0.1 |
| 13 | +# This script restore backups from DA to Hestiacp |
| 14 | + |
| 15 | +# shellcheck source=/usr/local/hestia/func/main.sh |
| 16 | +source $HESTIA/func/main.sh |
| 17 | +# shellcheck source=/etc/hestiacp/hestia.conf |
| 18 | +source /etc/hestiacp/hestia.conf |
| 19 | +# load config file |
| 20 | +source_conf "$HESTIA/conf/hestia.conf" |
| 21 | + |
| 22 | +if [ ! -e /usr/bin/rsync ] || [ ! -e /usr/bin/file ]; then |
| 23 | + echo "#######################################" |
| 24 | + echo "rsync not installed, try install it" |
| 25 | + echo "This script need: rsync, file" |
| 26 | + echo "#######################################" |
| 27 | + if [ -e /etc/redhat-release ]; then |
| 28 | + echo "Run: yum install rync file" |
| 29 | + else |
| 30 | + echo "Run: apt-get install rsync file" |
| 31 | + fi |
| 32 | + exit 3 |
| 33 | +fi |
| 34 | +# Put this to 0 if you want use bash -x to debug it |
| 35 | +debug=1 |
| 36 | +hestia_package=default |
| 37 | +tmp_dir='tmp_dir_da_backup' |
| 38 | +time=$(echo "$time_n_date" | cut -f 1 -d \ ) |
| 39 | +date=$(echo "$time_n_date" | cut -f 2 -d \ ) |
| 40 | + |
| 41 | +if [ -f "$1" ]; then |
| 42 | + backup_file="$1" |
| 43 | +fi |
| 44 | + |
| 45 | +if [ -z "$BACKUP_TEMP" ]; then |
| 46 | + BACKUP_TEMP=$BACKUP |
| 47 | +else |
| 48 | + echo "File does not exists" |
| 49 | + exit 1 |
| 50 | +fi |
| 51 | + |
| 52 | +delete_tmp() { |
| 53 | + echo "Removing tmp files" |
| 54 | + rm -rf /backup/${tmp_dir} |
| 55 | +} |
| 56 | + |
| 57 | +tput setaf 3 |
| 58 | +echo "#######################################" |
| 59 | +echo "# START WITH IMPORT " |
| 60 | +echo "#######################################" |
| 61 | +tput sgr0 |
| 62 | + |
| 63 | +tput setaf 2 |
| 64 | +echo "Checking provided file..." |
| 65 | +tput sgr0 |
| 66 | +if file $backup_file | grep -q -c "gzip compressed data,"; then |
| 67 | + tput setaf 2 |
| 68 | + echo "OK - Gziped File" |
| 69 | + tput sgr0 |
| 70 | + if [ ! -d /backup/${tmp_dir} ]; then |
| 71 | + echo "Creating tmp.." |
| 72 | + mkdir /backup/${tmp_dir} |
| 73 | + fi |
| 74 | + echo "Extracting backup..." |
| 75 | + if [ "$debug" != 0 ]; then |
| 76 | + tar xzvf $backup_file -C /backup/${tmp_dir} 2>&1 \ |
| 77 | + | while read extracted_file; do |
| 78 | + ex=$((ex + 1)) |
| 79 | + echo -en "wait... $ex files extracted\r" |
| 80 | + done |
| 81 | + else |
| 82 | + tar xzf $backup_file -C /backup/${tmp_dir} |
| 83 | + fi |
| 84 | + if [ $? -eq 0 ]; then |
| 85 | + tput setaf 2 |
| 86 | + echo "Backup extracted whitout errors..." |
| 87 | + tput sgr0 |
| 88 | + else |
| 89 | + tput setaf 1 |
| 90 | + echo "Error on backup extraction, check your file, try extract it manually" |
| 91 | + tput sgr0 |
| 92 | + delete_tmp |
| 93 | + exit 1 |
| 94 | + fi |
| 95 | +else |
| 96 | + tput setaf 1 |
| 97 | + echo "Error 3 not-gzip - no standard gziped backup provided of file not installed ( Try yum install file, or apt-get install file )" |
| 98 | + tput sgr0 |
| 99 | + delete_tmp |
| 100 | + exit 3 |
| 101 | +fi |
| 102 | +cd /backup/${tmp_dir}/ |
| 103 | +main_dir=$(pwd) |
| 104 | +echo "Access tmp directory $main_dir" |
| 105 | +directadmin_user=$(grep username backup/user.conf | cut -d "=" -f 2) |
| 106 | +directadmin_usermail=$(grep email backup/user.conf | cut -d "=" -f 2 | grep @) |
| 107 | +echo "Get User: $directadmin_user" |
| 108 | +if [ -z $directadmin_usermail ]; then |
| 109 | + directadmin_usermail=$(grep domain backup/user.conf | cut -d "=" -f 2 | head -n 1) |
| 110 | +fi |
| 111 | + |
| 112 | +check_sysuser=$(cut -f 1 -d : /etc/passwd | grep "^$directadmin_user$") |
| 113 | +if [ -n "$check_sysuser" ] || [ -e "$HESTIA/data/users/$directadmin_user" ]; then |
| 114 | + delete_tmp |
| 115 | + check_result "$E_EXISTS" "user $directadmin_user exists" |
| 116 | +fi |
| 117 | + |
| 118 | +echo "Generate random password for $directadmin_user and create Hestiacp Account ..." |
| 119 | +new_password=$(generate_password) |
| 120 | +$BIN/v-add-user $directadmin_user $new_password $directadmin_usermail $hestia_package |
| 121 | +if [ "$?" -ne 0 ]; then |
| 122 | + tput setaf 1 |
| 123 | + echo "Error: Unable to create user" |
| 124 | + tput sgr0 |
| 125 | + exit 1 |
| 126 | +fi |
| 127 | + |
| 128 | +tput setaf 3 |
| 129 | +echo "#######################################" |
| 130 | +echo "# DATABASE " |
| 131 | +echo "#######################################" |
| 132 | +tput sgr0 |
| 133 | + |
| 134 | +# Restore databases |
| 135 | +mysql -e "SET GLOBAL max_allowed_packet=1073741824;" |
| 136 | +# start with databases |
| 137 | +tput setaf 2 |
| 138 | +echo "Start with databases" |
| 139 | +tput sgr0 |
| 140 | + |
| 141 | +echo "Get local databases" |
| 142 | +mysql -e "SHOW DATABASES" > server_dbs |
| 143 | +da_db_list=$(ls -1 backup/ | grep ".conf") |
| 144 | +function run_da_db() { |
| 145 | + for da_db in $da_db_list; do |
| 146 | + |
| 147 | + database_name=${da_db::-5} |
| 148 | + grep -w $database_name server_dbs |
| 149 | + if [ $? == "1" ]; then |
| 150 | + if [ -e "backup/${database_name}.sql" ]; then |
| 151 | + |
| 152 | + #Get the database name |
| 153 | + db=$(grep db_collation backup/${da_db} | tr '&' '\n ' | grep SCHEMA_NAME | cut -d "=" -f 2) |
| 154 | + |
| 155 | + tput setaf 2 |
| 156 | + echo " Create and restore ${db} " |
| 157 | + tput sgr0 |
| 158 | + mysql -e "CREATE DATABASE $db" |
| 159 | + mysql ${db} < backup/${db}.sql |
| 160 | + #Get all the users of the database |
| 161 | + while IFS= read -r line; do |
| 162 | + |
| 163 | + selectdb_line=$(echo $line | grep passwd) |
| 164 | + if [ ! -z "$selectdb_line" ]; then |
| 165 | + |
| 166 | + db_user=$(echo $selectdb_line | tr '&' '\n ' | grep ${directadmin_user} | cut -d "=" -f 1) |
| 167 | + md5=$(echo $selectdb_line | tr '&' '\n ' | grep passwd | cut -d "=" -f 2) |
| 168 | + |
| 169 | + echo "DB: $db" |
| 170 | + echo "udb: $db_user" |
| 171 | + echo "Password: ${md5}" |
| 172 | + |
| 173 | + echo "DB='$db' DBUSER='$db_user' MD5='$md5' HOST='localhost' TYPE='mysql' CHARSET='UTF8' U_DISK='0' SUSPENDED='no' TIME='$time' DATE='$data'" >> /usr/local/hestia/data/users/$directadmin_user/db.conf |
| 174 | + fi |
| 175 | + |
| 176 | + done < "backup/${da_db}" |
| 177 | + |
| 178 | + # Leave hestia restore passwords and create users |
| 179 | + tput setaf 2 |
| 180 | + echo "Rebuild databases files for $directadmin_user" |
| 181 | + tput sgr0 |
| 182 | + $BIN/v-rebuild-databases $directadmin_user |
| 183 | + fi |
| 184 | + else |
| 185 | + tput setaf 1 |
| 186 | + echo "Error: Cant restore database $db alredy exists in mysql server" |
| 187 | + tput sgr0 |
| 188 | + fi |
| 189 | + done |
| 190 | +} |
| 191 | + |
| 192 | +if [[ -z $da_db_list ]]; then |
| 193 | + echo "No database found" |
| 194 | +else |
| 195 | + run_da_db |
| 196 | + echo "Run" |
| 197 | +fi |
| 198 | + |
| 199 | +tput setaf 3 |
| 200 | +echo "#######################################" |
| 201 | +echo "# DOMAINS " |
| 202 | +echo "#######################################" |
| 203 | +tput sgr0 |
| 204 | + |
| 205 | +# Start with domains |
| 206 | +tput setaf 2 |
| 207 | +echo "Start with domains" |
| 208 | +tput sgr0 |
| 209 | +directadmin_domain_list=$(ls -1 domains/) |
| 210 | +for directadmin_domain in $directadmin_domain_list; do |
| 211 | + tput setaf 2 |
| 212 | + echo "Add $directadmin_domain if not exists" |
| 213 | + tput sgr0 |
| 214 | + $BIN/v-add-domain ${directadmin_user} $directadmin_domain |
| 215 | + if [ $? -ne 0 ]; then |
| 216 | + tput setaf 4 |
| 217 | + echo "Domain $directadmin_domain already added in some account, skip..." |
| 218 | + tput sgr0 |
| 219 | + elif [ -d /home/${directadmin_user}/web/${directadmin_domain} ]; then |
| 220 | + echo "Domain $directadmin_domain added, restoring files" |
| 221 | + echo $directadmin_domain >> restored_domains |
| 222 | + rm -f /home/$directadmin_user/web/$directadmin_domain/public_html/index.html |
| 223 | + rm -f /home/$directadmin_user/web/$directadmin_domain/public_html/robots.txt |
| 224 | + |
| 225 | + public_sync_count=0 |
| 226 | + rsync -av domains/${directadmin_domain}/public_html/ /home/$directadmin_user/web/$directadmin_domain/public_html 2>&1 \ |
| 227 | + | while read file_dm; do |
| 228 | + public_sync_count=$(($public_sync_count + 1)) |
| 229 | + echo -en "-- $public_sync_count restored files\r" |
| 230 | + done |
| 231 | + |
| 232 | + chown ${directadmin_user}:${directadmin_user} -R /home/${directadmin_user}/web/${directadmin_domain}/public_html |
| 233 | + chmod 751 /home/${directadmin_user}/web/${directadmin_domain}/public_html |
| 234 | + |
| 235 | + if [[ -L "domains/${directadmin_domain}/private_html" && -d "domains/${directadmin_domain}/private_html" ]]; then |
| 236 | + echo "private_html is a symlink to public_html so we don't need to copy it." |
| 237 | + else |
| 238 | + private_sync_count=0 |
| 239 | + |
| 240 | + rsync -av domains/${directadmin_domain}/private_html/ /home/$directadmin_user/web/$directadmin_domain/private 2>&1 \ |
| 241 | + | while read file_dm; do |
| 242 | + private_sync_count=$(($private_sync_count + 1)) |
| 243 | + echo -en "-- $private_sync_count restored files\r" |
| 244 | + done |
| 245 | + chown ${directadmin_user}:${directadmin_user} -R /home/${directadmin_user}/web/${directadmin_domain}/private |
| 246 | + chmod 751 /home/${directadmin_user}/web/${directadmin_domain}/private |
| 247 | + fi |
| 248 | + else |
| 249 | + echo "Ups.. cant restore or add domain: $directadmin_domain" |
| 250 | + fi |
| 251 | +done |
| 252 | +echo "Domains restored!" |
| 253 | + |
| 254 | +tput setaf 3 |
| 255 | +echo "#######################################" |
| 256 | +echo "# E-MAIL " |
| 257 | +echo "#######################################" |
| 258 | +tput sgr0 |
| 259 | +tput setaf 2 |
| 260 | +echo "Start restoring mails" |
| 261 | +tput sgr0 |
| 262 | +function da_restore_imap_pass() { |
| 263 | + #DirectAdmin passw is SHA512-CRYPT |
| 264 | + da_orig_pass=$(grep -w $1 backup/$2/email/passwd | tr ':' ' ' | cut -d " " -f2) |
| 265 | + echo ${da_orig_pass} |
| 266 | + USER_DATA=$HESTIA/data/users/${3}/ |
| 267 | + update_object_value "mail/${2}" 'ACCOUNT' "${1}" '$MD5' "{SHA512-CRYPT}$da_orig_pass" |
| 268 | + echo "Password for $1@$2 restored" |
| 269 | +} |
| 270 | +echo cat restored_domains |
| 271 | +if [ -e restored_domains ]; then |
| 272 | + cat restored_domains | while read da_mail_domain; do |
| 273 | + if [ "$(ls -A imap/${da_mail_domain}/)" ]; then |
| 274 | + tput setaf 2 |
| 275 | + echo "Found Imap for ${da_mail_domain}" |
| 276 | + tput sgr0 |
| 277 | + ls -1 imap/${da_mail_domain}/ | while read da_imap; do |
| 278 | + tmp_pass=$(generate_password) |
| 279 | + $BIN/v-add-mail-account $directadmin_user $da_mail_domain $da_imap tmp_pass |
| 280 | + if [ "$debug" != 0 ]; then |
| 281 | + rsync -av imap/${da_mail_domain}/${da_imap}/Maildir/ /home/${directadmin_user}/mail/${da_mail_domain}/${da_imap} 2>&1 \ |
| 282 | + | while read backup_file_dm; do |
| 283 | + sk_sync=$((sk_sync + 1)) |
| 284 | + echo -en "-- $sk_sync restored files\r" |
| 285 | + done |
| 286 | + echo " " |
| 287 | + else |
| 288 | + rsync imap/${da_mail_domain}/${da_imap}/Maildir/ /home/${directadmin_user}/mail/${da_mail_domain}/${da_imap} |
| 289 | + fi |
| 290 | + chown ${directadmin_user}:mail -R /home/${directadmin_user}/mail/${da_mail_domain}/${da_imap} |
| 291 | + find /home/$directadmin_user/mail/$da_mail_domain -type f -name 'dovecot*' -delete |
| 292 | + da_restore_imap_pass $da_imap $da_mail_domain $directadmin_user |
| 293 | + done |
| 294 | + |
| 295 | + $BIN/v-rebuild-mail-domain $directadmin_user $da_mail_domain |
| 296 | + fi |
| 297 | + done |
| 298 | +fi |
| 299 | +delete_tmp |
| 300 | +tput sgr0 |
| 301 | +tput setaf 2 |
| 302 | +echo "#######################################" |
| 303 | +echo "DirectAdmin account $directadmin_user restored" |
| 304 | +echo "Review your content and report any fail" |
| 305 | +tput sgr0 |
| 306 | +exit |
0 commit comments