File: user_migrate.sh

package info (click to toggle)
dtc 0.35.5-1
  • links: PTS, VCS
  • area: main
  • in suites: experimental
  • size: 18,824 kB
  • sloc: php: 50,739; sh: 8,596; makefile: 572; perl: 148; xml: 25
file content (177 lines) | stat: -rwxr-xr-x 7,868 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
#!/bin/sh

set -e
#set -x

usage (){
	echo "Usage: $0 <destination-host> <username>"
}

get_my_opt () {
	if ! [ "${#}" = 2 ] ; then
		usage
		exit 1
	fi

	DST_HOST=$1
	DTC_USER=$2
}

get_remote_credentials () {
	echo "===> Getting login and password on remote"
	# Get a super user login / pass
	DST_ADM_LIST=`ssh ${DST_HOST} '/usr/share/dtc/admin/dtcpassadm -l | head -n 2 | tail -n1'`
	DST_LOGIN=`echo ${DST_ADM_LIST} | awk '{print $1}'`
	DST_PASS=`echo ${DST_ADM_LIST} | awk '{print $2}'`
}

copy_adm_login_and_client () {
	echo "===> Creating admin and client in remote server"

	admin_props="adm_pass path max_email max_ftp max_ssh quota bandwidth_per_month_mb expire prod_id allow_add_domain max_domain restricted_ftp_path allow_dns_and_mx_change allow_mailing_list_edit allow_subdomain_edit allow_cronjob_edit nbrdb resseller_flag ssh_login_flag ftp_login_flag pkg_install_flag last_used_lang"
	client_props="is_company company_name vat_num familyname christname addr1 addr2 addr3 city zipcode state country phone fax email special_note dollar disk_quota_mb bw_quota_per_month_gb expire customfld"

	# Get the client info
	CLIENT_ID=`mysql --defaults-file=/etc/mysql/debian.cnf -Ddtc --execute="SELECT id_client FROM admin WHERE adm_login='${DTC_USER}'" | tail -n 1`
	Q="INSERT INTO clients ("
	V=") VALUES ("
	for i in ${client_props} ; do
		VAL=`mysql --defaults-file=/etc/mysql/debian.cnf -Ddtc --execute="SELECT replace(${i} , '\'', ' ') FROM clients WHERE id='${CLIENT_ID}'" | tail -n 1`
		if ! [ "${i}" = "is_company" ] ; then
			Q=${Q}","
			V=${V}","
		fi
		Q=${Q}${i}
		V=${V}"'"${VAL}"'"
	done
	QUERY=${Q}${V}"); SELECT LAST_INSERT_ID();"

	# Insert that new record in the remote server and get the new client ID
	TMP=`mktemp`
	BASE_TMP=`basename ${TMP}`
	echo ${QUERY} >${TMP}
	# FIXME: we should use mktemp on the destination as well to avoid already existing files
	scp -q ${TMP} ${DST_HOST}:/tmp
	NEW_CLIENT_ID=`ssh ${DST_HOST} "mysql --defaults-file=/etc/mysql/debian.cnf -Ddtc </tmp/${BASE_TMP}"`
	NEW_CLIENT_ID=`echo ${NEW_CLIENT_ID} | cut -d" " -f2`

	# Add the admin, linked to the client file
	Q="INSERT INTO admin (id_client,adm_login,shared_hosting_security"
	V=") VALUES ('${NEW_CLIENT_ID}','${DTC_USER}','sbox_aufs'"
	for i in ${admin_props} ; do
		VAL=`mysql --defaults-file=/etc/mysql/debian.cnf -Ddtc --execute="SELECT ${i} FROM admin WHERE adm_login='${DTC_USER}'" | tail -n 1`	
		Q=${Q}","${i}
		V=${V}",'"${VAL}"'"
	done
	QUERY=${Q}${V}")"
	echo ${QUERY} >${TMP}
	scp -q ${TMP} ${DST_HOST}:/tmp
	ssh ${DST_HOST} "mysql --defaults-file=/etc/mysql/debian.cnf -Ddtc </tmp/${BASE_TMP}"

	# Delete temp file on local and remote host and create the user folder.
	ssh ${DST_HOST} "rm /tmp/${BASE_TMP}"
	ssh ${DST_HOST} "mkdir -p /var/www/sites/${DTC_USER}"
	ssh ${DST_HOST} "chown dtc:dtcgrp /var/www/sites/${DTC_USER}"
	rm ${TMP}
}

export_adm_local_conf () {
	echo "===> Exporting admin config to remote server"
	# Get local web address for the DTC panel
	LOCAL_URL=`mysql --defaults-file=/etc/mysql/debian.cnf -Ddtc --execute="SELECT administrative_site FROM config" | tail -n 1`
	# Get the export config of the admin
	LOCAL_adm_pass=`mysql --defaults-file=/etc/mysql/debian.cnf -Ddtc --execute="SELECT adm_pass FROM admin WHERE adm_login='${DTC_USER}'" | tail -n 1`
	TMP=`mktemp`
	curl "https://${LOCAL_URL}/dtc/?adm_login=${DTC_USER}&adm_pass=${LOCAL_adm_pass}&action=export_my_account&addrlink=myaccount" >${TMP}

	# Now, send it to destination
	curl --silent --insecure -o /dev/null -F domain_import_file=@${TMP} -F MAX_FILE_SIZE=30000000 -F rub=adminedit -F action=import_domain -F adm_login=${DTC_USER} -F adm_pass=${LOCAL_adm_pass} \
		--user ${DST_LOGIN}:${DST_PASS} https://${DST_HOST}/dtcadmin/
	rm ${TMP}
}

export_adm_dbs () {
	echo "===> Exporting MySQL databases"
	NBR_USERS=`mysql --defaults-file=/etc/mysql/debian.cnf -Dmysql --execute="SELECT DISTINCT(User) FROM user WHERE dtcowner='${DTC_USER}'" | wc -l`
	NBR_USERS=$((${NBR_USERS} - 1 ))
	SQL_USERS=`mysql --defaults-file=/etc/mysql/debian.cnf -Dmysql --execute="SELECT DISTINCT(User) FROM user WHERE dtcowner='${DTC_USER}'" | tail -n ${NBR_USERS}`
	for i in ${SQL_USERS} ; do
		NBR_DBS=`mysql --defaults-file=/etc/mysql/debian.cnf -Dmysql --execute="SELECT DISTINCT(Db) FROM db WHERE User='${i}'" | wc -l`
		NBR_DBS=$((${NBR_DBS} - 1 ))
		SQL_DBS=`mysql --defaults-file=/etc/mysql/debian.cnf -Dmysql --execute="SELECT DISTINCT(Db) FROM db WHERE User='${i}'" | tail -n ${NBR_DBS}`
		for j in ${SQL_DBS} ; do
			echo "-> Exporting db: ${j}"
			TMP=`mktemp`
			mysqldump --defaults-file=/etc/mysql/debian.cnf -c --add-drop-table --databases ${j} >${TMP}
			echo "-> SCP to destination"
			scp ${TMP} ${DST_HOST}:/tmp
			echo "-> Importing"
			# FIXME: we should use mktemp on the destination as well
			ssh ${DST_HOST} "mysql --defaults-file=/etc/mysql/debian.cnf <${TMP}"
			rm ${TMP}
			ssh ${DST_HOST} "rm ${TMP}"
		done
	done
}

rsync_all_files () {
	NBR_ENTRY=`mysql --defaults-file=/etc/mysql/debian.cnf -Ddtc --execute="SELECT name FROM domain WHERE owner='${DTC_USER}'" | wc -l`
	NBR_ENTRY=$(($NBR_ENTRY - 1 ))
	DOMAINS=`mysql --defaults-file=/etc/mysql/debian.cnf -Ddtc --execute="SELECT name FROM domain WHERE owner='${DTC_USER}'" | tail -n ${NBR_ENTRY} | tr \\\r\\\n ,\ `
	echo "Domains are: ${DOMAINS}"
	for D in ${DOMAINS} ; do
		echo "===> Doing rsync of ${D}"
		ssh ${DST_HOST} "mkdir -p /var/www/sites/${DTC_USER}/${D}/Mailboxs /var/www/sites/${DTC_USER}/${D}/subdomains"

		# Copy of all mailboxes
		if [ -d /var/www/sites/${DTC_USER}/${D}/Mailboxs ] ; then
			nice rsync -e ssh -azvp /var/www/sites/${DTC_USER}/${D}/Mailboxs/ ${DST_HOST}:/var/www/sites/${DTC_USER}/${D}/Mailboxs
		fi

		# Copy of all subdomains
		for i in /var/www/sites/${DTC_USER}/${D}/subdomains/* ; do
			S=`basename ${i}`
			ssh ${DST_HOST} "mkdir -p /var/www/sites/${DTC_USER}/${D}/subdomains/${S}/html /var/www/sites/${DTC_USER}/${D}/subdomains/${S}/logs"
			if [ -d /var/www/sites/${DTC_USER}/${D}/subdomains/${S}/html ] ; then
				nice rsync --delete -e ssh -azvp /var/www/sites/${DTC_USER}/${D}/subdomains/${S}/html/ ${DST_HOST}:/var/www/sites/${DTC_USER}/${D}/subdomains/${S}/html
			fi
			if [ -d /var/www/sites/${DTC_USER}/${D}/subdomains/${S}/logs ] ; then
				nice rsync -e ssh -azvp /var/www/sites/${DTC_USER}/${D}/subdomains/${S}/logs/ ${DST_HOST}:/var/www/sites/${DTC_USER}/${D}/subdomains/${S}/logs
			fi
		done

		# Copy of all lists
		if [ -d /var/www/sites/${DTC_USER}/${D}/lists ] ; then
			ssh ${DST_HOST} "mkdir -p /var/www/sites/${DTC_USER}/${D}/lists"
			nice rsync -e ssh -azvp /var/www/sites/${DTC_USER}/${D}/lists/ ${DST_HOST}:/var/www/sites/${DTC_USER}/${D}/lists
		fi
	done
}




fix_php_rights_cleanup_and_db_to_localhost () {
	NBR_ENTRY=`mysql --defaults-file=/etc/mysql/debian.cnf -Ddtc --execute="SELECT name FROM domain WHERE owner='${DTC_USER}'" | wc -l`
	NBR_ENTRY=$(($NBR_ENTRY - 1 ))
	DOMAINS=`mysql --defaults-file=/etc/mysql/debian.cnf -Ddtc --execute="SELECT name FROM domain WHERE owner='${DTC_USER}'" | tail -n ${NBR_ENTRY} | tr \\\r\\\n ,\ `
	for D in ${DOMAINS} ; do
		echo "===> Fixing .php unix rights"
		ssh ${DST_HOST} "find /var/www/sites/${DTC_USER}/${D}/subdomains -iname '*.php' -exec chmod +x {} \;"
		echo "===> Switching from localhost to 127.0.0.1"
		ssh ${DST_HOST} "find /var/www/sites/${DTC_USER}/${D}/subdomains -iname '*.php' -exec sed -i s/localhost/127.0.0.1/ {} \;"
		echo "===> Cleaning old chroot copy"
		CLEANUP_FOLDERS="boot home media mnt opt proc root selinux srv sys usr bin dev etc lib lib64 libexec sbin var"
		ssh ${DST_HOST} "for i in /var/www/sites/${DTC_USER}/${D}/subdomains/* ; do cd \$i ; rm -rf ${CLEANUP_FOLDERS} ; done"
	done
}

get_my_opt $@
get_remote_credentials
copy_adm_login_and_client
export_adm_local_conf
export_adm_dbs
rsync_all_files
fix_php_rights_cleanup_and_db_to_localhost

exit 0