Current File : //root/panel/modules/migration/code/controller.ext.php
<?php

/**
 * @copyright 2014-2015 Sentora Project (http://www.sentora.org/) 
 * Sentora is a GPL fork of the ZPanel Project whose original header follows:
 *
 * ZPanel - A Cross-Platform Open-Source Web Hosting Control panel.
 *
 * @package ZPanel
 * @version $Id$
 * @author Bobby Allen - ballen@bobbyallen.me
 * @copyright (c) 2008-2014 ZPanel Group - http://www.zpanelcp.com/
 * @license http://opensource.org/licenses/gpl-3.0.html GNU Public License v3
 *
 * This program (ZPanel) is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 */
 
 
class module_controller extends ctrl_module
{	
    	static $ok;
    	static $cpanel_ip_blank;
    	static $cpanel_username_blank;
    	static $cpanel_password_blank;
        static $cpanel_Port_Number_blank;
    	static $cpanel_invalid;
    	static $server_busy;
    	static $backup_not_found;
    	static $auth_fail;
    	static $fail_output;
    	static $backup_file_name;
	static function get_client_ip() 
	{
		$ipaddress = '';
		if (getenv('HTTP_CLIENT_IP'))
		$ipaddress = getenv('HTTP_CLIENT_IP');
		else if(getenv('HTTP_X_FORWARDED_FOR'))
		$ipaddress = getenv('HTTP_X_FORWARDED_FOR');
		else if(getenv('HTTP_X_FORWARDED'))
		$ipaddress = getenv('HTTP_X_FORWARDED');
		else if(getenv('HTTP_FORWARDED_FOR'))
		$ipaddress = getenv('HTTP_FORWARDED_FOR');
		else if(getenv('HTTP_FORWARDED'))
		$ipaddress = getenv('HTTP_FORWARDED');
		else if(getenv('REMOTE_ADDR'))
		$ipaddress = getenv('REMOTE_ADDR');
		else
		$ipaddress = 'UNKNOWN';
		return $ipaddress;
	}
	 static function gethelpicon()
     	{
	     global $zdbh;
		 global $controller;
		 $temp=$controller->GetControllerRequest('URL','module') ;
		 $val = '/assets/one.txt';
		 $val1 = '/modules/';
		 $name=file_get_contents("modules/$temp/assets/helpicon.txt");
		 return $name;
	 }
    	static function dodownloadmigrate()
    	{
		global $controller;
		// runtime_csfr::Protect();
		// $currentuser = ctrl_users::GetUserDetail();
		$formvars = $controller->GetAllControllerRequests('FORM');
		$cpanel_ip_address=trim($formvars['cpanel_ip_address']);
		$cpanel_username=trim($formvars['cpanel_username']);
		$cpanel_password=trim($formvars['cpanel_password']);
		$cpanel_Port_Number=trim($formvars['cpanel_Port_Number']);	
		$cpanel_flag="";
		if(isset($formvars['cpanel_download']))
		$cpanel_flag="download";	
		else if(isset($formvars['cpanel_migrate']))
		$cpanel_flag="migrate";        
		if (self::ExecuteMigration($cpanel_ip_address,$cpanel_Port_Number,$cpanel_username,$cpanel_password,$cpanel_flag))
		{
		 	self::$ok = true;
		} 
		else
		{}
		return true;	
    	}
	static function ExecuteMigration($cpanel_ip_address, $cpanel_Port_Number, $cpanel_username, $cpanel_password,$module_flag)
	{
		 
		global $zdbh;
		global $controller;
		$currentuser = ctrl_users::GetUserDetail($uid);
		$uid = $currentuser['userid'];
		$username = $currentuser['username'];
		$email=$currentuser['email'];
		
		if(self::CheckCreateForErrors($cpanel_ip_address, $cpanel_Port_Number, $cpanel_username, $cpanel_password))
		{
			/* $ip_create_by =self::get_client_ip();
			if($cpanel_flag == "download")
			$in="command cpanel_download $cpanel_ip_address $cpanel_username $cpanel_password $ip_create_by $uid $username $email";	
			else if($cpanel_flag == "migrate")
			$in="command cpanel_migrate $cpanel_ip_address $cpanel_username $cpanel_password $ip_create_by $uid $username $email";  
			$service_port = 4444 ;
			$address = gethostbyname('localhost');
			$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
			if ($socket === false) {
			return false;
			} 
			$result = socket_connect($socket, $address, $service_port);
			if ($result === false) {
			return false;  
			}
			
			socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, array("sec" => 2000, "usec" =>0));
			$out = '';
			socket_write($socket, $in, strlen($in));
			socket_close($socket); 
			$cpanel_ip_address = $arr[2];
		 	$cpanel_username = $arr[3]; 
		 	$cpanel_password = $arr[4]; 
		 	$ip_create_by = $arr[5];
		 	$uid=$arr[6];
		 	$username=$arr[7];
		 	$email=$arr[8]; */
			
		 	$Current_IP_Addr =  ctrl_options::GetSystemOption('server_ip');
			$ftp_username=$cpanel_username."_".time();
			$letters = 'abcefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890';
			$ftp_passwd=substr(str_shuffle($letters), 0, 16);
			
			$homedir=ctrl_options::GetSystemOption('hosted_dir').$username."/backups/";
		        /////////////////// Create FTP user process starting ///////////////////
			include('/etc/sentora/panel/cnf/db.php');
			$z_db_user = $user;
			$z_db_pass = $pass;
			$ftp_db_name=ctrl_options::GetSystemOption('ftp_db');
			try {
				$ftp_db = new db_driver("mysql:host=" . $host . ";dbname=$ftp_db_name", $z_db_user, $z_db_pass);
			} catch (PDOException $e) {
			}
			$sql = $ftp_db->prepare("INSERT INTO ftpquotalimits (name, quota_type, per_session, limit_type, bytes_in_avail, bytes_out_avail, bytes_xfer_avail, files_in_avail, files_out_avail, files_xfer_avail) VALUES (:username, 'user', 'true', 'hard', 0, 0, 0, 0, 0, 0);");
			$sql->bindParam(':username', $ftp_username);
			$sql->execute();
			$sql = $ftp_db->prepare("INSERT INTO ftpuser (id, userid, passwd, homedir, shell, count, accessed, modified) VALUES ('', :username, :password, :homedir, '/sbin/nologin', 0, '', '');");
			$sql->bindParam(':username', $ftp_username);
			$sql->bindParam(':password', $ftp_passwd);
			$sql->bindParam(':homedir', $homedir);
			$sql->execute();
			
			$source_server_ip=$cpanel_ip_address;
			$cpanel_account=$cpanel_username;
			$cpanel_password=$cpanel_password;
			$server_ip_address=$Current_IP_Addr;
			$ftp_username=$ftp_username;
			$ftp_password=$ftp_passwd;
			include "/etc/sentora/panel/modules/migration/code/xmlapi.php";
			$xmlapi = new xmlapi($source_server_ip);
			// Credentials for FTP to Backup Box
			$ftp_server_ip = $server_ip_address;
			$ftpacct = $ftp_username; // FTP account
			$ftppass = $ftp_password; // FTP password
			$email_notify =$email;  // Email address for backup notification

			$xmlapi->password_auth($cpanel_account,$cpanel_password);
			$xmlapi->set_port($cpanel_Port_Number);
			
			$xmlapi->set_debug(1);
			// nandhini only bz this line migration module show blank page
			try
			{
			$report_diskusage = $xmlapi->api2_query(
				$cpanel_account, 'DiskUsage', 'fetchdiskusage'
			);   
			}
			catch(Exception $e)
			{
			 	self::$auth_fail='CPANEL_AUTH_FAILED';
                                self::removeFTPUser($ftpacct);
                                return false;	
			}
			// nandhini
			$report_disk	= json_decode($report_diskusage);
			$result	= $report_disk->cpanelresult->event->result;
			
			if($result == 1) 
			{
				$api_args = array(
						   'ftp',
						   $ftp_server_ip,
						   $ftpacct,
						   $ftppass,
						   $email_notify,
						   '21',
						   $homedir
						 );
				$xmlapi->set_output('json');
				$xml_result = $xmlapi->api1_query($cpanel_account,'Fileman','fullbackup',$api_args);
				$xml_result = json_decode($xml_result);
				$api_result = $xml_result->event->result;
				
				if($api_result == 1)
				{	
					
					
					$backup_filename = self::getBackupFileName($cpanel_account, $xmlapi);
					self::$backup_file_name=$backup_filename;
					if($backup_filename && $backup_filename != 'No')
    	        			{
					
						$ssl_conf_query="INSERT INTO vps_migration_process(flag,username,password,user_registered_email_id,ip_address,backup_file_name,ftp_user,ftp_pass,backup_status,create_user)VALUES('".$module_flag."','".$cpanel_account."','".$cpanel_password."','".$email_notify."','".$source_server_ip."','".$backup_filename."','".$ftpacct."','".$ftppass."','0','".$username."')";
						$ssl_conf = $zdbh->prepare($ssl_conf_query);
						$ssl_conf->execute();
					  
						self::$ok=TRUE;
						return true; 
					}
					else
					{
						 
						self::$backup_not_found=TRUE;
						self::removeFTPUser($ftpacct);
						return false;
					}
				}
				else 
				{
					 
					$api_result_error =  $xml_result->data->result;
					self::$fail_output='CPANEL_BACKUP_INITIATE_FAILED'." ".$api_result_error;
					self::removeFTPUser($ftpacct);
					return false;
				}
			}
			else 
			{
				 
				
				//return CPANEL_AUTH_FAILED;
				self::$auth_fail='CPANEL_AUTH_FAILED';
				
				self::removeFTPUser($ftpacct);
				return false;
			}
			
		}
        	return true;
	}
	
	
	
		
	static function getBackupFileName($cpanel_account, $xmlapi)
	{
        	$list_backups   = $xmlapi->api1_query($cpanel_account ,'Fileman', 'listfullbackups');
	        $backup_list    = json_decode($list_backups);
        	$backup_lists   = trim($backup_list->data->result);
	        $backup_list_arr= array_filter(explode('</div>', $backup_lists));
        	$backup_filename="";
	        foreach($backup_list_arr as $backup)
        	{
	            $backup = trim(strip_tags($backup));
        	    if(stristr($backup, "in progress"))
	            {
        	        $backup_file    = explode(' ', $backup);
	                $backup_file    = $backup_file[0];
        	        if($backup_file != null)
	                {
        	            $backup_filename=$backup_file;
                	}
	                else
        	        {
                	    $backup_filename=null;
		                }
	            }
	        }
        	if($backup_filename == null)
	        {
        	    $backup_filename = self::getBackupFileName($cpanel_account);
	        }
	        return $backup_filename;
	    }
	
	static function is_valid_domain_name($cpanel_ip_address)
{
   /* return (preg_match("/^([a-z\d](-*[a-z\d])*)(\.([a-z\d](-*[a-z\d])*))*$/i", $domain_name) //valid chars check
            && preg_match("/^.{1,253}$/", $domain_name) //overall length check
            && preg_match("/^[^\.]{1,63}(\.[^\.]{1,63})*$/", $domain_name)   );
        //length of each label */
   
         return(preg_match("/^[a-zA-Z0-9][a-zA-Z0-9-]{1,61}[a-zA-Z0-9]\.[a-zA-Z]{2,}(\.[a-zA-Z]{2,})$/i",$cpanel_ip_address) || preg_match("/^[a-zA-Z0-9][a-zA-Z0-9-]{1,61}[a-zA-Z0-9]\.[a-zA-Z]{2,}$/i",$cpanel_ip_address) );
}

	
	

	static function CheckCreateForErrors($cpanel_ip_address, $cpanel_Port_Number, $cpanel_username, $cpanel_password)
    	{	
		if (trim($cpanel_ip_address) == '') 
		{
		    self::$cpanel_ip_blank = TRUE;
		    return FALSE;
		}

		if (trim($cpanel_username) == '') 
		{

		    self::$cpanel_username_blank = TRUE;
		    return FALSE;
		}

		if (trim($cpanel_password) == '') 
		{
		    self::$cpanel_password_blank = TRUE;
		    return FALSE;
		}
		
			
		if (trim($cpanel_Port_Number) == '') 
		{ 
			 
		    self::$cpanel_Port_Number_blank = TRUE;
		    return FALSE;
		}
        if(!(self::is_valid_domain_name($cpanel_ip_address)) && $cpanel_ip_address != ''){
         
		if(!filter_var($cpanel_ip_address, FILTER_VALIDATE_IP)) 
			 
		{
		    self::$cpanel_invalid = TRUE;
		    return FALSE;
		}
		  }
		return TRUE;
    	}
 	static function removeFTPUser($F_username)
	{
		include('/etc/sentora/panel/cnf/db.php');
		$z_db_user = $user;
		$z_db_pass = $pass;
		$ftp_db_name=ctrl_options::GetSystemOption('ftp_db');
		try {
			$ftp_db = new db_driver("mysql:host=" . $host . ";dbname=$ftp_db_name", $z_db_user, $z_db_pass);
		} catch (PDOException $e) {
		}
		$sql = $ftp_db->prepare("DELETE FROM ftpquotalimits where name='".$F_username."'");
		$sql->execute();
		$sql = $ftp_db->prepare("DELETE FROM ftpuser where userid='".$F_username."'");
		$sql->execute();	
	}	
   	static function ListMigration($username)
   	{
		global $zdbh;
		$sql = "SELECT * FROM vps_migration_process where create_user='$username'";
		    
		$numrows = $zdbh->prepare($sql);
		$numrows->execute();
		if ($numrows->fetchColumn() <> 0) {
			$sql = $zdbh->prepare($sql);
		    	$res = array();
		    	$sql->execute();
		    	while ($rowdomains = $sql->fetch()) {
				$backup_status="";
				$restore_status="";
				if($rowdomains['flag']=="download")
				{
					if($rowdomains['backup_status']==0)
					$backup_status="In-Progress";
					else 
					$backup_status="Status-Completed";
					$restore_status="N/A";
				}else
				{
					if($rowdomains['backup_status']==0)
					{
						$backup_status="In-Progress";
						$restore_status="Not yet started";
					}
					else
					{
						$backup_status="Status-Completed";
						if($rowdomains['restore_status']=="-1")
						$restore_status="Process Going On";
						if($rowdomains['restore_status']=="1")
						$restore_status="Status-Completed";
						if($rowdomains['restore_status']=="0")
						$restore_status="Need to start";

					}

				}	
				array_push($res, array(
				    'flag' => $rowdomains['flag'],
				    'backup_file_name' => $rowdomains['backup_file_name'],
				    'backup_status' => $backup_status,
				    'restore_status' => $restore_status,
				));
		    	}
		    	return $res;
		} else {
			return false;
		}	
   	}
     	static function getMigrationList()
    	{	
		global $controller;
		$currentuser = ctrl_users::GetUserDetail();
		$res = array();
		$domains = self::ListMigration($currentuser['username']);
		if (!fs_director::CheckForEmptyValue($domains)) {
		    	foreach ($domains as $row) {
		       		//  $status = self::getDomainStatusHTML($row['active'], $row['id']);
			
			      	$res[] = array('flag' => $row['flag'],
			    		'backup_file_name' => $row['backup_file_name'],
			    		'backup_status' => $row['backup_status'],
			    		'restore_status' => $row['restore_status']); 
		    	}
		    	return $res;
		} else {
		    return false;
		}
    	}

   	static function getResult()
    	{
		if (!fs_director::CheckForEmptyValue(self::$cpanel_ip_blank)) {
		    return ui_sysmessage::shout(ui_language::translate("Your IP Address/Domain Name can't be empty. Please enter a valid IP Address/Domain Name."), "Error");
		}
		if (!fs_director::CheckForEmptyValue(self::$cpanel_invalid)) {
		    return ui_sysmessage::shout(ui_language::translate(" Please enter a valid Domaina name or IP address: i.e. '12.345.678.001'"), "Error");
		}
		if (!fs_director::CheckForEmptyValue(self::$cpanel_username_blank)) {
		    return ui_sysmessage::shout(ui_language::translate("Please enter the cpanel username"), "Error");
		}
		if (!fs_director::CheckForEmptyValue(self::$cpanel_Port_Number_blank)) {
		    return ui_sysmessage::shout(ui_language::translate("Please enter the cpanel port number"), "Error");
		}
		if (!fs_director::CheckForEmptyValue(self::$cpanel_password_blank)) {
		    return ui_sysmessage::shout(ui_language::translate("Please enter the cpanel password"), "Error");
		}
		if (!fs_director::CheckForEmptyValue(self::$server_busy)) {
		    return ui_sysmessage::shout(ui_language::translate("Server is busy. Kindly check after 5 minutes"), "Error");
		}
		if (!fs_director::CheckForEmptyValue(self::$ok)) {
		    return ui_sysmessage::shout(ui_language::translate("Process was stared. Kindly wait for sometimes"), "Success");
		}
		if (!fs_director::CheckForEmptyValue(self::$auth_fail)) {
		    return ui_sysmessage::shout(ui_language::translate("Cpanel Authentication Failed. Kindly check it."), "Error");
		}
		
		if (!fs_director::CheckForEmptyValue(self::$backup_not_found)) {
		    return ui_sysmessage::shout(ui_language::translate("Backup File not found"), "Error");
		}
		if (!fs_director::CheckForEmptyValue(self::$fail_output)) {
		    return ui_sysmessage::shout(ui_language::translate("Cpanel Failed - ".self::$fail_output), "Error");
		}
		return "";
    	} 	
}