Skip to content

Commit 0374e17

Browse files
jaapmarcusKristan Kenney
andauthored
v-import-cpanel (hestiacp#3232)
* Initial commit: v-restore-user-cpanel Thanks to @Skamasle and contributors for their hard work on this which was originally for VestaCP. * Update small things * Update Cpanel * Finish up v-import-cpanel --------- Co-authored-by: Kristan Kenney <40798553+kristankenney@users.noreply.github.com>
1 parent a2971df commit 0374e17

File tree

1 file changed

+265
-0
lines changed

1 file changed

+265
-0
lines changed

bin/v-import-cpanel

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

Comments
 (0)