#!/bin/bash
#Version: 0.1 ALPHA (use at your own risk!)
#Script is used to change the IP of all Users owned by Reseller on a DA server (including the Reseller himself).
#Written by DirectAdmin and Martynas Bendorius (smtalk)
#Usage: $0 <oldip> <newip> <reseller>

LOG=/var/log/directadmin/ipswap_reseller.log

MYUID=`/usr/bin/id -u`
if [ "$MYUID" != 0 ]; then
	echo "You require Root Access to run this script";
	exit 1;
fi

if [ $# != 2 ] && [ $# != 3 ] && [ $# != 4 ]; then
	echo "Usage:";
	echo "$0 <oldip> <newip> <reseller>";
	echo "you gave #$#: $0 $1 $2 $3";
	echo "";
	echo "New IP must exist and be set as shared.";
	exit 2;
fi

OLD_IP=$1
NEW_IP=$2
RESELLER=$3

HAVE_HTTPD=1
HAVE_NGINX=0
if [ -s ${DIRECTADMIN} ]; then
	if [ "`${DIRECTADMIN} c | grep ^nginx= | cut -d= -f2`" -eq 1 ]; then
		HAVE_HTTPD=0
		HAVE_NGINX=1
	fi
	if [ "`${DIRECTADMIN} c | grep ^nginx_proxy= | cut -d= -f2`" -eq 1 ]; then
		HAVE_HTTPD=1
		HAVE_NGINX=1
	fi
fi


log()
{
	echo -e "$1";
	echo -e "$1" >> $LOG;
}

swapfile()
{
	if [ ! -e $1 ]; then
		log "Cannot Find $1 to change the IPs. Skipping...";
		return;
	fi
	
	TEMP="perl -pi -e 's/(^|[\s.=\/:])${OLD_IP}([\s.>:])/\${1}${NEW_IP}\${2}/g' $1"
        eval $TEMP;

	log "$1\t: $OLD_IP -> $NEW_IP";
}

IPFILE_OLD=/usr/local/directadmin/data/admin/ips/$OLD_IP
IPFILE_NEW=/usr/local/directadmin/data/admin/ips/$NEW_IP
if [ ! -e $IPFILE_NEW ]; then
	echo -n "$IPFILE_NEW does not exist.  Exiting... ";
	exit 3;
fi
IP_STATUS=`grep status ${IPFILE_NEW} | cut -d= -f2`
if [ "${IP_STATUS}" = "free" ] || [ "${IP_STATUS}" = "owned" ]; then
    echo "Please make the IP (${NEW_IP}) shared on reseller level."
	exit 4;
fi

ULDDU=/usr/local/directadmin/data/users
if [ ! -e ${ULDDU}/${RESELLER}/users.list ]; then
	echo "Reseller ${RESELLER} does not exist.  Exiting... ";
	exit 5;
fi

IP_LIST=${ULDDU}/${RESELLER}/ip.list
COUNT_IP=`grep -c ${NEW_IP} ${IP_LIST}`
if [ ${COUNT_IP} -eq 0 ]; then
	echo "${NEW_IP} does not belong to ${RESELLER}. Please assign it to reseller and start the script again. Exiting."
	exit 6;
fi

if [ -e /etc/debian_version ]; then
	DB_PATH=/etc/bind
else
	DB_PATH=/var/named
fi

for i in `cat ${ULDDU}/${RESELLER}/users.list && echo "${RESELLER}"`; do
{
	if [ ! -d $ULDDU/$i ]; then
		continue;
	fi
	
	swapfile $ULDDU/$i/user.conf
	if [ "${HAVE_HTTPD}" -eq 1 ]; then
		swapfile $ULDDU/$i/httpd.conf
	fi
	if [ "${HAVE_NGINX}" -eq 1 ]; then
		swapfile $ULDDU/$i/nginx.conf
	fi
	
	if [ -e $ULDDU/$i/ip.list ]; then
		swapfile $ULDDU/$i/ip.list
	fi

	swapfile $ULDDU/$i/user_ip.list	

	for j in `ls $ULDDU/$i/domains/*.conf; ls $ULDDU/$i/domains/*.ftp; ls $ULDDU/$i/domains/*.ip_list`; do
	{
		swapfile $j
	};
	done;
	
	for d in `cat ${ULDDU}/$i/domains.list`; do
	{
		swapfile ${DB_PATH}/$d.db
		echo "action=rewrite&value=named&domain=$d" >> /usr/local/directadmin/data/task.queue

		for p in `cat ${ULDDU}/$i/domains/$d.pointers | cut -d= -f1 2>/dev/null`; do
		{
			swapfile ${DB_PATH}/$p.db
			echo "action=rewrite&value=named&domain=$p" >> /usr/local/directadmin/data/task.queue
		}
		done;
	};
	done;
};
done;

echo "action=rewrite&value=ipcount" >> /usr/local/directadmin/data/task.queue
echo "action=rewrite&value=ips" >> /usr/local/directadmin/data/task.queue
echo "action=cache&value=showallusers" >> /usr/local/directadmin/data/task.queue
echo "action=rewrite&value=httpd" >> /usr/local/directadmin/data/task.queue
echo "Runing dataskq..."
/usr/local/directadmin/dataskq d

log "\n*** Done swapping $OLD_IP to $NEW_IP ***\n";
exit 0;
