Skip to content

Commit 7bda00d

Browse files
AartsieRubenjaapmarcus
authored
Feature: DirectAdmin import (hestiacp#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>
1 parent 1990f2d commit 7bda00d

File tree

2 files changed

+330
-0
lines changed

2 files changed

+330
-0
lines changed

bin/v-import-directadmin

Lines changed: 306 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,306 @@
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

docs/docs/reference/cli.md

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4057,6 +4057,30 @@ Based on sk-import-cpanel-backup-to-vestacp
40574057
Credits: Maks Usmanov (skamasle) and contributors:
40584058
Thanks to <https://github.com/Skamasle/sk-import-cpanel-backup-to-vestacp/graphs/contributors>
40594059

4060+
## v-import-directadmin
4061+
4062+
[Source](https://github.com/hestiacp/hestiacp/blob/release/bin/v-import-directadmin)
4063+
4064+
Import DirectAdmin backup to a new user
4065+
4066+
**Examples**:
4067+
4068+
```bash
4069+
v-import-directadmin /backup/backup.tar.gz
4070+
```
4071+
4072+
What will be imported from DirectAdmin backups:
4073+
4074+
1. The user account information
4075+
2. The domains structure included all the files from `public_html` and/or `private_html`
4076+
3. All databases
4077+
- **WARNING**: Only the first user with password will be imported because of HestiCP limits.
4078+
4. All the e-mail accounts including the e-mails.
4079+
4080+
Based on sk-da-importer and v-import-cpanel
4081+
Credits: Maks Usmanov (skamasle), Jaap Marcus (jaapmarcus) and contributors:
4082+
Thanks to <https://github.com/Skamasle/sk-import-cpanel-backup-to-vestacp/graphs/contributors>
4083+
40604084
## v-insert-dns-domain
40614085

40624086
[Source](https://github.com/hestiacp/hestiacp/blob/release/bin/v-insert-dns-domain)

0 commit comments

Comments
 (0)