From 7bda00de20850ee6d59f2d8fb917f88cc899b9a1 Mon Sep 17 00:00:00 2001 From: Aartsie Date: Sat, 9 Dec 2023 14:25:04 +0100 Subject: [PATCH] Feature: DirectAdmin import (#4177) * Created v-directadmin-import script to import directadmin backups in HestiaCP * Fix linting --------- Co-authored-by: Ruben Co-authored-by: Jaap Marcus <9754650+jaapmarcus@users.noreply.github.com> --- bin/v-import-directadmin | 306 +++++++++++++++++++++++++++++++++++++ docs/docs/reference/cli.md | 24 +++ 2 files changed, 330 insertions(+) create mode 100755 bin/v-import-directadmin diff --git a/bin/v-import-directadmin b/bin/v-import-directadmin new file mode 100755 index 0000000000..ab98af2802 --- /dev/null +++ b/bin/v-import-directadmin @@ -0,0 +1,306 @@ +#!/bin/bash +# info: Import DirectAdmin backup to a new user +# +# example: v-import-directadmin /backup/backup.tar.gz +# +# Based on sk-da-importer +# Credits: Maks Usmanov (skamasle), Jaap Marcus (jaapmarcus) and contributors: +# Thanks to + +# This script is provided whitout any warranty +# Run at your own risk +# Version 0.1 +# This script restore backups from DA to Hestiacp + +# shellcheck source=/usr/local/hestia/func/main.sh +source $HESTIA/func/main.sh +# shellcheck source=/etc/hestiacp/hestia.conf +source /etc/hestiacp/hestia.conf +# load config file +source_conf "$HESTIA/conf/hestia.conf" + +if [ ! -e /usr/bin/rsync ] || [ ! -e /usr/bin/file ]; then + echo "#######################################" + echo "rsync not installed, try install it" + echo "This script need: rsync, file" + echo "#######################################" + if [ -e /etc/redhat-release ]; then + echo "Run: yum install rync 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 +debug=1 +hestia_package=default +tmp_dir='tmp_dir_da_backup' +time=$(echo "$time_n_date" | cut -f 1 -d \ ) +date=$(echo "$time_n_date" | cut -f 2 -d \ ) + +if [ -f "$1" ]; then + backup_file="$1" +fi + +if [ -z "$BACKUP_TEMP" ]; then + BACKUP_TEMP=$BACKUP +else + echo "File does not exists" + exit 1 +fi + +delete_tmp() { + echo "Removing tmp files" + rm -rf /backup/${tmp_dir} +} + +tput setaf 3 +echo "#######################################" +echo "# START WITH IMPORT " +echo "#######################################" +tput sgr0 + +tput setaf 2 +echo "Checking provided file..." +tput sgr0 +if file $backup_file | grep -q -c "gzip compressed data,"; then + tput setaf 2 + echo "OK - Gziped File" + tput sgr0 + if [ ! -d /backup/${tmp_dir} ]; then + echo "Creating tmp.." + mkdir /backup/${tmp_dir} + fi + echo "Extracting backup..." + if [ "$debug" != 0 ]; then + tar xzvf $backup_file -C /backup/${tmp_dir} 2>&1 \ + | while read extracted_file; do + ex=$((ex + 1)) + echo -en "wait... $ex files extracted\r" + done + else + tar xzf $backup_file -C /backup/${tmp_dir} + fi + if [ $? -eq 0 ]; then + tput setaf 2 + echo "Backup extracted whitout errors..." + tput sgr0 + else + tput setaf 1 + echo "Error on backup extraction, check your file, try extract it manually" + tput sgr0 + delete_tmp + exit 1 + fi +else + tput setaf 1 + echo "Error 3 not-gzip - no standard gziped backup provided of file not installed ( Try yum install file, or apt-get install file )" + tput sgr0 + delete_tmp + exit 3 +fi +cd /backup/${tmp_dir}/ +main_dir=$(pwd) +echo "Access tmp directory $main_dir" +directadmin_user=$(grep username backup/user.conf | cut -d "=" -f 2) +directadmin_usermail=$(grep email backup/user.conf | cut -d "=" -f 2 | grep @) +echo "Get User: $directadmin_user" +if [ -z $directadmin_usermail ]; then + directadmin_usermail=$(grep domain backup/user.conf | cut -d "=" -f 2 | head -n 1) +fi + +check_sysuser=$(cut -f 1 -d : /etc/passwd | grep "^$directadmin_user$") +if [ -n "$check_sysuser" ] || [ -e "$HESTIA/data/users/$directadmin_user" ]; then + delete_tmp + check_result "$E_EXISTS" "user $directadmin_user exists" +fi + +echo "Generate random password for $directadmin_user and create Hestiacp Account ..." +new_password=$(generate_password) +$BIN/v-add-user $directadmin_user $new_password $directadmin_usermail $hestia_package +if [ "$?" -ne 0 ]; then + tput setaf 1 + echo "Error: Unable to create user" + tput sgr0 + exit 1 +fi + +tput setaf 3 +echo "#######################################" +echo "# DATABASE " +echo "#######################################" +tput sgr0 + +# Restore databases +mysql -e "SET GLOBAL max_allowed_packet=1073741824;" +# start with databases +tput setaf 2 +echo "Start with databases" +tput sgr0 + +echo "Get local databases" +mysql -e "SHOW DATABASES" > server_dbs +da_db_list=$(ls -1 backup/ | grep ".conf") +function run_da_db() { + for da_db in $da_db_list; do + + database_name=${da_db::-5} + grep -w $database_name server_dbs + if [ $? == "1" ]; then + if [ -e "backup/${database_name}.sql" ]; then + + #Get the database name + db=$(grep db_collation backup/${da_db} | tr '&' '\n ' | grep SCHEMA_NAME | cut -d "=" -f 2) + + tput setaf 2 + echo " Create and restore ${db} " + tput sgr0 + mysql -e "CREATE DATABASE $db" + mysql ${db} < backup/${db}.sql + #Get all the users of the database + while IFS= read -r line; do + + selectdb_line=$(echo $line | grep passwd) + if [ ! -z "$selectdb_line" ]; then + + db_user=$(echo $selectdb_line | tr '&' '\n ' | grep ${directadmin_user} | cut -d "=" -f 1) + md5=$(echo $selectdb_line | tr '&' '\n ' | grep passwd | cut -d "=" -f 2) + + echo "DB: $db" + echo "udb: $db_user" + echo "Password: ${md5}" + + 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 + fi + + done < "backup/${da_db}" + + # Leave hestia restore passwords and create users + tput setaf 2 + echo "Rebuild databases files for $directadmin_user" + tput sgr0 + $BIN/v-rebuild-databases $directadmin_user + fi + else + tput setaf 1 + echo "Error: Cant restore database $db alredy exists in mysql server" + tput sgr0 + fi + done +} + +if [[ -z $da_db_list ]]; then + echo "No database found" +else + run_da_db + echo "Run" +fi + +tput setaf 3 +echo "#######################################" +echo "# DOMAINS " +echo "#######################################" +tput sgr0 + +# Start with domains +tput setaf 2 +echo "Start with domains" +tput sgr0 +directadmin_domain_list=$(ls -1 domains/) +for directadmin_domain in $directadmin_domain_list; do + tput setaf 2 + echo "Add $directadmin_domain if not exists" + tput sgr0 + $BIN/v-add-domain ${directadmin_user} $directadmin_domain + if [ $? -ne 0 ]; then + tput setaf 4 + echo "Domain $directadmin_domain already added in some account, skip..." + tput sgr0 + elif [ -d /home/${directadmin_user}/web/${directadmin_domain} ]; then + echo "Domain $directadmin_domain added, restoring files" + echo $directadmin_domain >> restored_domains + rm -f /home/$directadmin_user/web/$directadmin_domain/public_html/index.html + rm -f /home/$directadmin_user/web/$directadmin_domain/public_html/robots.txt + + public_sync_count=0 + rsync -av domains/${directadmin_domain}/public_html/ /home/$directadmin_user/web/$directadmin_domain/public_html 2>&1 \ + | while read file_dm; do + public_sync_count=$(($public_sync_count + 1)) + echo -en "-- $public_sync_count restored files\r" + done + + chown ${directadmin_user}:${directadmin_user} -R /home/${directadmin_user}/web/${directadmin_domain}/public_html + chmod 751 /home/${directadmin_user}/web/${directadmin_domain}/public_html + + if [[ -L "domains/${directadmin_domain}/private_html" && -d "domains/${directadmin_domain}/private_html" ]]; then + echo "private_html is a symlink to public_html so we don't need to copy it." + else + private_sync_count=0 + + rsync -av domains/${directadmin_domain}/private_html/ /home/$directadmin_user/web/$directadmin_domain/private 2>&1 \ + | while read file_dm; do + private_sync_count=$(($private_sync_count + 1)) + echo -en "-- $private_sync_count restored files\r" + done + chown ${directadmin_user}:${directadmin_user} -R /home/${directadmin_user}/web/${directadmin_domain}/private + chmod 751 /home/${directadmin_user}/web/${directadmin_domain}/private + fi + else + echo "Ups.. cant restore or add domain: $directadmin_domain" + fi +done +echo "Domains restored!" + +tput setaf 3 +echo "#######################################" +echo "# E-MAIL " +echo "#######################################" +tput sgr0 +tput setaf 2 +echo "Start restoring mails" +tput sgr0 +function da_restore_imap_pass() { + #DirectAdmin passw is SHA512-CRYPT + da_orig_pass=$(grep -w $1 backup/$2/email/passwd | tr ':' ' ' | cut -d " " -f2) + echo ${da_orig_pass} + USER_DATA=$HESTIA/data/users/${3}/ + update_object_value "mail/${2}" 'ACCOUNT' "${1}" '$MD5' "{SHA512-CRYPT}$da_orig_pass" + echo "Password for $1@$2 restored" +} +echo cat restored_domains +if [ -e restored_domains ]; then + cat restored_domains | while read da_mail_domain; do + if [ "$(ls -A imap/${da_mail_domain}/)" ]; then + tput setaf 2 + echo "Found Imap for ${da_mail_domain}" + tput sgr0 + ls -1 imap/${da_mail_domain}/ | while read da_imap; do + tmp_pass=$(generate_password) + $BIN/v-add-mail-account $directadmin_user $da_mail_domain $da_imap tmp_pass + if [ "$debug" != 0 ]; then + rsync -av imap/${da_mail_domain}/${da_imap}/Maildir/ /home/${directadmin_user}/mail/${da_mail_domain}/${da_imap} 2>&1 \ + | while read backup_file_dm; do + sk_sync=$((sk_sync + 1)) + echo -en "-- $sk_sync restored files\r" + done + echo " " + else + rsync imap/${da_mail_domain}/${da_imap}/Maildir/ /home/${directadmin_user}/mail/${da_mail_domain}/${da_imap} + fi + chown ${directadmin_user}:mail -R /home/${directadmin_user}/mail/${da_mail_domain}/${da_imap} + find /home/$directadmin_user/mail/$da_mail_domain -type f -name 'dovecot*' -delete + da_restore_imap_pass $da_imap $da_mail_domain $directadmin_user + done + + $BIN/v-rebuild-mail-domain $directadmin_user $da_mail_domain + fi + done +fi +delete_tmp +tput sgr0 +tput setaf 2 +echo "#######################################" +echo "DirectAdmin account $directadmin_user restored" +echo "Review your content and report any fail" +tput sgr0 +exit diff --git a/docs/docs/reference/cli.md b/docs/docs/reference/cli.md index 84233b3373..94673031da 100644 --- a/docs/docs/reference/cli.md +++ b/docs/docs/reference/cli.md @@ -4057,6 +4057,30 @@ Based on sk-import-cpanel-backup-to-vestacp Credits: Maks Usmanov (skamasle) and contributors: Thanks to +## v-import-directadmin + +[Source](https://github.com/hestiacp/hestiacp/blob/release/bin/v-import-directadmin) + +Import DirectAdmin backup to a new user + +**Examples**: + +```bash +v-import-directadmin /backup/backup.tar.gz +``` + +What will be imported from DirectAdmin backups: + +1. The user account information +2. The domains structure included all the files from `public_html` and/or `private_html` +3. All databases + - **WARNING**: Only the first user with password will be imported because of HestiCP limits. +4. All the e-mail accounts including the e-mails. + +Based on sk-da-importer and v-import-cpanel +Credits: Maks Usmanov (skamasle), Jaap Marcus (jaapmarcus) and contributors: +Thanks to + ## v-insert-dns-domain [Source](https://github.com/hestiacp/hestiacp/blob/release/bin/v-insert-dns-domain)