Просмотр исходного кода

Feature: DirectAdmin import (#4177)

* Created v-directadmin-import script to import directadmin backups in HestiaCP

* Fix linting

---------

Co-authored-by: Ruben <ruben@web-spot.nl>
Co-authored-by: Jaap Marcus <9754650+jaapmarcus@users.noreply.github.com>
Aartsie 2 лет назад
Родитель
Сommit
7bda00de20
2 измененных файлов с 330 добавлено и 0 удалено
  1. 306 0
      bin/v-import-directadmin
  2. 24 0
      docs/docs/reference/cli.md

+ 306 - 0
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 <https://github.com/Skamasle/sk_da_importer/graphs/contributors>
+
+# 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

+ 24 - 0
docs/docs/reference/cli.md

@@ -4057,6 +4057,30 @@ Based on sk-import-cpanel-backup-to-vestacp
 Credits: Maks Usmanov (skamasle) and contributors:
 Credits: Maks Usmanov (skamasle) and contributors:
 Thanks to <https://github.com/Skamasle/sk-import-cpanel-backup-to-vestacp/graphs/contributors>
 Thanks to <https://github.com/Skamasle/sk-import-cpanel-backup-to-vestacp/graphs/contributors>
 
 
+## 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 <https://github.com/Skamasle/sk-import-cpanel-backup-to-vestacp/graphs/contributors>
+
 ## v-insert-dns-domain
 ## v-insert-dns-domain
 
 
 [Source](https://github.com/hestiacp/hestiacp/blob/release/bin/v-insert-dns-domain)
 [Source](https://github.com/hestiacp/hestiacp/blob/release/bin/v-insert-dns-domain)