#!/bin/sh
# This script is written by Martynas Bendorius and DirectAdmin
# It is used to move domain from one user to another
# Official DirectAdmin webpage: http://www.directadmin.com
# Usage:
# ./move_domain.sh <domain> <olduser> <newuser>

VERSION=0.1-beta

if [ $UID != 0 ]; then
        echo "You require Root Access to run this script.";
        exit 0;
fi

if [ $# != 3 ]; then
	echo "Move Domain to User - v. $VERSION";
	echo "";
        echo "Usage:";
        echo "$0 <domain> <olduser> <newuser>";
        echo "you gave #$#: $0 $1 $2 $3";
        exit 0;
fi

DOMAIN=$1
OLD_USER=$2
NEW_USER=$3


TEMP="grep -e '^$OLD_USER:' /etc/passwd | cut -d: -f6"
OLD_HOME=`eval $TEMP`
TEMP="grep -e '^$NEW_USER:' /etc/passwd | cut -d: -f6"
NEW_HOME=`eval $TEMP`

OLD_DOMAIN_DIR=${OLD_HOME}/domains/${DOMAIN}
NEW_DOMAIN_DIR=${NEW_HOME}/domains/${DOMAIN}

USER_OLD=/usr/local/directadmin/data/users/${OLD_USER}/domains.list
USER_NEW=/usr/local/directadmin/data/users/${NEW_USER}/domains.list

PERL=/usr/bin/perl

update_email_domain_dir()
{
	#/etc/virtual/domain.com
	DMNDIR=/etc/virtual/${DOMAIN}
	if [ ! -e ${DMNDIR} ] && [ -e ${DMNDIR}_off ]; then
		DMNDIR=${DMNDIR}_off
		echo "domain ${DOMAIN} is suspended using ${DMNDIR}";
	fi
	if [ ! -e ${DMNDIR} ]; then
		echo "Cannot find ${DMNDIR}, aborting swap of ${DMNDIR}."
		return;
	fi
	
	#passwd (doveoct)
	#aliases
	#filter (home path)
	#usage.cache
	#majordomo/list.aliases:	$OLD_USER@$DOMAIN
	#majordomo/lists/*:  		$OLD_USER@$DOMAIN
	
	
	#TEMP="$PERL -pi -e 's#${OLD_HOME}#${NEW_HOME}#' ${DMNDIR}/passwd"
	#eval $TEMP;
	
	OLD_GID=`/usr/bin/id -g mail`
	OLD_UID=`/usr/bin/id -u $OLD_USER`
	NEW_GID=`/usr/bin/id -g mail`
	NEW_UID=`/usr/bin/id -u $NEW_USER`

	#Firt find the uid/gid swap them.
	TEMP="perl -pi -e 's#:${OLD_UID}:${OLD_GID}::${OLD_HOME}/#:${NEW_UID}:${NEW_GID}::${NEW_HOME}/#' ${DMNDIR}/passwd"
	eval $TEMP;
	
	#/etc/virtual/domain.com/aliases
	
	TEMP="$PERL -pi -e 's/(^|\s|:)${OLD_USER}(:|\$|,)/\${1}${NEW_USER}\${2}/g' ${DMNDIR}/aliases"
	eval $TEMP;

	TMEP="$PERL -pi -e 's#${OLD_HOME}#${NEW_HOME}#' ${DMNDIR}/filter"
	eval $TEMP;

	if [ -e ${DMNDIR}/usage.cache ]; then
		TEMP="$PERL -pi -e 's/^${OLD_USER}:/${NEW_USER}/' ${DMNDIR}/usage.cache"
		eval $TEMP;
	fi

	OLD_EMAIL=${OLD_USER}@${DOMAIN}
	NEW_EMAIL=${NEW_USER}@${DOMAIN}

	if [ -e ${DMNDIR}/majordomo ]; then
		TEMP="$PERL -pi -e 's/${OLD_EMAIL}/${NEW_EMAIL}/' ${DMNDIR}/majordomo/list.aliases";
		eval $TEMP
		TEMP="$PERL -pi -e 's/${OLD_EMAIL}/${NEW_EMAIL}/' ${DMNDIR}/majordomo/lists/*";
		eval $TEMP
	fi
}

update_email_settings()
{
	echo "Updating email settings."
	
	#/etc/virtual/domainowners
	#/etc/virtual/domain.com(_off) (this will be large)
	#/home/username/.spamassassin/user_spam/user@domain.com
	#/home/username/imap/domain.com
	#/var/spool/virtual/domain.com (permissions only)
	
	#domainowners
	TEMP="$PERL -pi -e 's/^${DOMAIN}: ${OLD_USER}\$/${DOMAIN}: ${NEW_USER}/' /etc/virtual/domainowners"
	eval $TEMP
	
	#/etc/virtual/domain.com
	update_email_domain_dir
	
	#/home/username/.spamassassin/user_spam/user@domain.com
	OLD_SADIR=${OLD_HOME}/.spamassassin/user_spam
	NEW_SADIR=${NEW_HOME}/.spamassassin/user_spam
	#if it doesnt exist, dont bother
	if [ -e ${OLD_SADIR} ]; then
		mkdir -p $NEW_SADIR
		mv ${OLD_SADIR}/*@${DOMAIN} ${NEW_SADIR}/
		chown -R ${NEW_USER}:mail ${NEW_SADIR}
		chmod 771 ${NEW_SADIR}
		chmod 660 ${NEW_SADIR}/*		
	fi
	
	#/home/username/imap/domain.com
	OLD_IMAP=${OLD_HOME}/imap/${DOMAIN}
	NEW_IMAP=${NEW_HOME}/imap/${DOMAIN}
	if [ -e ${OLD_IMAP} ]; then
		if [ -e ${NEW_IMAP} ]; then
			echo "$NEW_IMAP already exists.. merging as best we can.";
			mv -f ${OLD_IMAP}/* ${NEW_IMAP}/
		else
			mv -f ${OLD_IMAP} ${NEW_IMAP}
		fi
		
		chown -R ${NEW_USER}:mail ${NEW_IMAP}
		chmod -R 770 ${NEW_IMAP}
	fi

	#/var/spool/virtual/domain.com (permissions only)
	VPV=/var/spool/virtual/${DOMAIN}
	if [ -e ${VPV} ]; then
		chown -R ${NEW_USER}:mail $VPV
	fi
}

update_ftp_settings()
{
	echo "Updating ftp settings."

	#/etc/proftpd.passwd
	#/usr/local/directadmin/data/users/user/ftp.passwd
	#/etc/proftpd.vhosts.conf	
	
	#for the password files, we only chagne the user@domain.com accounts.
	#the system account isn't touched.
	
	OLD_GID=`/usr/bin/id -g $OLD_USER`
	OLD_UID=`/usr/bin/id -u $OLD_USER`
	NEW_GID=`/usr/bin/id -g $NEW_USER`
	NEW_UID=`/usr/bin/id -u $NEW_USER`

	#proftpd.passwd.  Firt find the uid/gid and homedir matchup and swap them.
	TEMP="perl -pi -e 's#:${OLD_UID}:${OLD_GID}:(domain|user|custom):${OLD_DOMAIN_DIR}#:${NEW_UID}:${NEW_GID}:\${1}:${NEW_DOMAIN_DIR}#' /etc/proftpd.passwd"
	eval $TEMP;
	
	#proftpd.passwd ... then whatever is leftover (eg, anonymous)
	TEMP="$PERL -pi -e 's#:${OLD_DOMAIN_DIR}#:${NEW_DOMAIN_DIR}#' /etc/proftpd.passwd"
	eval $TEMP
	
	
	
	#ftp.passwd ... this one is messier..
	#take all accounts with /home/user/domain/doamin.com in them, and move them to the new ftp.passwd, with the new home.
	
	OLD_FTP=/usr/local/directadmin/data/users/${OLD_USER}/ftp.passwd
	NEW_FTP=/usr/local/directadmin/data/users/${NEW_USER}/ftp.passwd
	TEMP_FTP=/usr/local/directadmin/data/users/${OLD_USER}/ftp.passwd.temp
	
	grep ":$OLD_DOMAIN_DIR" $OLD_FTP > $TEMP_FTP
	TEMP="$PERL -pi -e 's#:${OLD_DOMAIN_DIR}#:${NEW_DOMAIN_DIR}#' $TEMP_FTP"
	eval $TEMP
	
	cat $TEMP_FTP >> $NEW_FTP
	
	#now, take out the old paths
	grep -v ":$OLD_DOMAIN_DIR" $OLD_FTP > $TEMP_FTP
	mv -f $TEMP_FTP $OLD_FTP
	chown root:ftp $OLD_FTP
}

update_da_settings()
{
	echo "Moving domain data to the ${NEW_USER} user."
	mv -f ${OLD_DOMAIN_DIR} ${NEW_DOMAIN_DIR}
	mv -f /usr/local/directadmin/data/users/${OLD_USER}/domains/${DOMAIN}.* /usr/local/directadmin/data/users/${NEW_USER}/domains/

	echo "Setting ownership for ${DOMAIN} domain."
	chown -R ${NEW_USER}:${NEW_USER} ${NEW_DOMAIN_DIR}

	echo "Removing domain from ${OLD_USER} user."
	$PERL -pi -e "s#${DOMAIN}\n##g" ${USER_OLD}

	echo "Adding domain to ${NEW_USER} user."
	echo "${DOMAIN}" >> ${USER_NEW}
	$PERL -pi -e "s#/usr/local/directadmin/data/users/${OLD_USER}/#/usr/local/directadmin/data/users/${NEW_USER}/#g" /usr/local/directadmin/data/users/${NEW_USER}/domains/${DOMAIN}.*
	$PERL -pi -e "s#${OLD_HOME}/#${NEW_HOME}/#g" /usr/local/directadmin/data/users/${NEW_USER}/domains/${DOMAIN}.*

	echo "Changing domain owner."
	for i in `ls /usr/local/directadmin/data/users/${NEW_USER}/domains/${DOMAIN}.conf`; do { $PERL -pi -e "s/username=${OLD_USER}/username=${NEW_USER}/g" $i; }; done;


	#if this is an owned IP, we have to update all IP related files.
	#/usr/local/directadmin/data/admin/ips/*, check for value=username, then we have the ip.
	echo "implement ip swap";


	#this is needed to update "show all users" cache.
	echo "action=cache&value=showallusers" >> /usr/local/directadmin/data/task.queue
	#this is needed to rewrite /usr/local/directadmin/data/users/USERS/httpd.conf
	echo "action=rewrite&value=httpd" >> /usr/local/directadmin/data/task.queue
	/usr/local/directadmin/dataskq d

}

doChecks()
{
	if [ ! -e ${USER_OLD} ]; then
		echo "File ${USER_OLD} does not exist. Can not continue."
		exit 1;
	fi
	
	if [ "${DOMAIN}" = "" ]; then
		echo "The domain is blank";
		exit 1;
	fi
	
	if [ "${OLD_HOME}" = "" ]; then
		echo "the old home is blank";
		exit 1;
	fi
	
	if [ "${NEW_HOME}" = "" ]; then
		echo "the new home is blank";
		exit 1;
	fi 

	if [ ! -e ${USER_NEW} ]; then
		echo "File ${USER_NEW} does not exist. Can not continue."
		exit 1;
	fi

	if [ "`grep -wc ${DOMAIN} $USER_OLD`" = "0" ]; then
		echo "Domain ${DOMAIN} is not owned by ${OLD_USER} user."
		exit 1;
	fi

	if [ ! -d ${OLD_DOMAIN_DIR} ]; then
		echo "Direcory ${OLD_DOMAIN_DIR} does not exist. Can not continue."
		exit 1;
	fi

	if [ -d ${NEW_DOMAIN_DIR} ]; then
		echo "Direcory ${NEW_DOMAIN_DIR} exists. Can not continue."
		exit 1;
	fi

	if [ ! -e $PERL ]; then
		echo "$PERL does not exist.";
		exit 1;
	fi
}

doChecks
update_da_settings
update_email_settings
update_ftp_settings

echo "Domain has been moved to ${NEW_USER} user."

exit 0;

