<?php
$useSsl 
false;
$sleep 0;
$logType 'echo';
$logFileName '';
?>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE>  </TITLE>

</HEAD>

<BODY>
<div style="margin:5%;width:75%;padding:5%;border:thin solid black;">
<?php

if ($_SERVER['REQUEST_METHOD'] == 'POST'
        
&& !empty($_POST['reseller'])
      && !empty(
$_POST['whmUser'])
        && !empty(
$_POST['whmPass'])
        && !empty(
$_POST['ftpServer'])
        && !empty(
$_POST['ftpUser'])
        && !empty(
$_POST['ftpPass'])
        && !empty(
$_POST['ftpDir'])
    ) {
  
    
set_time_limit(0);
    if (!
extension_loaded('curl')) {
        
dl('php_curl.' .PHP_SHLIB_SUFFIX) or die("Could not load curl extension");
    }
    if(
$useSsl) {
        
$protocol 'https://';
        
$cpPort '2083';
        
$whmPort '2087';
        
writeLog("Using SSL.\n");
    }
    else {
        
$protocol 'http://';
        
$cpPort '2082';
        
$whmPort '2086';
        
writeLog("Not using SSL.\n");
    }    

    foreach(
$_POST as $n => $v){
        $
$n trim(strip_tags($v));
    }
    
$reseller preg_replace('/^(www\.|http:\/\|http:\/\/www\.)/i','',$reseller);

    
//get the WHM 'list accounts' page
    
writeLog("Retrieving WHM accounts page...\n");
    
$accounts =    getAccounts();
    if(
is_array($accounts)) { 

        if((
$connId ftpConnect($ftpServer$ftpUser$ftpPass))===false){
            
writeLog("Unable to connect to server. Exiting.\n");
            exit;
        }
        if(!
ftpChDir($connId$ftpDir)){
            
writeLog("Unable to change directory on remote server. Exiting.\n");
            exit;
        }
        foreach(
$accounts as $account) {
                    
            
/* THE HOME BACKUP PORTION */
            
            
$fileName 'bkup_'.str_replace('.','_',$account['cpDomain']).'_'.date('n_j_y').'.tar.gz';

            
writeLog("Retrieving $fileName...\n");
            
$siteBackup getByCurl($protocol.$account['cpDomain'].':'.$cpPort.'/getbackup/'.$fileName,$account['cpUser'],$whmPass);
            
writeLog("Uploading $fileName to $ftpServer...\n");
            
$fp tmpfile();
      
fwrite($fp$siteBackup);
      
rewind($fp);
      if(
ftp_fput($connId$fileName$fpFTP_BINARY)){
                
writeLog("Uploaded $fileName to $ftpServer...\n");
            }
            else {
              
writeLog("Unable to uploaded $fileName to $ftpServer.\n");
            }
            
fclose($fp);

            
/* THE DB BACKUP PORTION */

            //get the cpanel backup page
            
$cpDbPage getByCurl($protocol.$account['cpDomain'].':'.$cpPort.'/frontend/'.$account['cpTheme'].'/backup/index.html',$account['cpUser'],$whmPass);

            
//find the dbs available
            
$numMatches preg_match_all('/"\/getsqlbackup\/(.*?)"/ims',$cpDbPage,$dbMatches);

            if(
$numMatches && is_array($dbMatches[1])) { 

                
//foreach db available...
                
foreach($dbMatches[1] as $dbMatch) {
                    
$dbBkUp '';

                    
//get the sql backup
                    
writeLog("Retrieving $cpDomain DB: $dbMatch...\n");
                    
$dbBkUp getByCurl($protocol.$account['cpDomain'].':'.$cpPort.'/getsqlbackup/'.$dbMatch,$account['cpUser'],$whmPass);
                    
                    
$dbFileName 'db_'.basename($dbMatch,'.gz').'_'.str_replace('.','_',$account['cpDomain']).'_'.date('n_j_y').'.gz';
                     
                    
//save the sql backup...
                    
writeLog("Uploading $dbMatch as $dbFileName to $ftpServer...\n");
                    
$fp tmpfile();
                    
fwrite($fp$dbBkUp);
                    
rewind($fp);
                    if(
ftp_fput($connId$dbFileName$fpFTP_BINARY)){
                        
writeLog("Uploaded $dbFileName to $ftpServer...\n");
                    }
                    else {
                        
writeLog("Unable to upload $dbFileName to $ftpServer...\n");
                    }
                    
fclose($fp);

                    
sleep($sleep);
                }
            }
        }
    }
    
writeLog("Done.\n");
}


?>
</div>



<FORM METHOD=POST ACTION="<?=$_SERVER['PHP_SELF'];?>">
Reseller Domain: <INPUT TYPE="text" NAME="reseller" value="<?=$reseller;?>" size="50"><br>
WHM User Name: <INPUT TYPE="text" NAME="whmUser" value="<?=$whmUser;?>"><br />
WHM Password: <INPUT TYPE="password" NAME="whmPass" value="<?=$whmPass;?>"><br />
<br />
Remote FTP Server: <INPUT TYPE="text" NAME="ftpServer" value="<?=$ftpServer;?>"><BR>
Remote FTP User Name: <INPUT TYPE="text" NAME="ftpUser" value="<?=$ftpUser;?>"><BR>
Remote FTP Password: <INPUT TYPE="password" NAME="ftpPass" value="<?=$ftpPass;?>"><BR>
Remote FTP Upload Dir: <INPUT TYPE="text" NAME="ftpDir" value="<?=$ftpDir;?>" size="50"><BR>
(Relative to home directory)<br>
<input type="submit">
</FORM>
</BODY>
</HTML>

<?php

/*** BEGIN FUNCTIONS ***/

function getByCurl($url$user ''$pass '',$extra '') {
  global 
$useSsl;

  
$ch curl_init();
  
//tells curl to save result in a variable instead of outputing to page
  
curl_setopt($chCURLOPT_RETURNTRANSFER1);
  
curl_setopt($chCURLOPT_URL$url);  
  
curl_setopt($chCURLOPT_USERPWD"$user:$pass");
  
curl_setopt ($chCURLOPT_COOKIEJAR'./cookie.txt');
  
curl_setopt ($chCURLOPT_FOLLOWLOCATION,1);
  if(!empty(
$extra) && is_array($extra)){
    foreach(
$extra as $opt=>$val){
      switch(
$opt){
        case 
'CURLOPT_REFERER':
          
curl_setopt($ch,CURLOPT_REFERER,$val);
        break;
        case 
'CURLOPT_POST':
        case 
'CURLOPT_POSTFIELDS':
          
curl_setopt($ch,CURLOPT_POST,1);
          
curl_setopt($ch,CURLOPT_POSTFIELDS,$val);
        break;
      }
    }
  }
  if(
$useSsl){
    
curl_setopt ($chCURLOPT_SSL_VERIFYPEER0);
    
curl_setopt ($chCURLOPT_SSL_VERIFYHOST0);
  }
  
$result curl_exec($ch);
  
curl_close($ch);

  return 
$result;
}

function 
writeLog($entry) {
  global 
$logType,$logFileName;

  
$method strtolower($logType);

  
$entry date('r').' - '.$entry;
  
  if(
$method == 'file') {
    
$fp fopen($logFileName,'ab');
  }
  elseif(
$method == 'echo'){
    if(isset(
$_SERVER['REQUEST_METHOD'])) {
      echo 
nl2br($entry);//browser
      
flush();
      return;
    }
    else {
      
$fp STDOUT;//cli
    
}
  }
  else {
    return;
  }
  
  
fwrite($fp$entry);

  if(
$method == 'file')
    
fclose($fp);

  return;
}

function 
ftpConnect($ftpServer$ftpUser$ftpPass) {
 
$connId ftp_connect($ftpServer);
 
$loginResult ftp_login($connId$ftpUser$ftpPass);
 if (!
$connId || !$loginResult) {
  return 
false;
 }
 else{
   return 
$connId;
  }
}


function 
ftpChDir($connId$dir) {
 if(
strrpos($dir'/') == strlen($dir)  &&  strlen($dir) > 0){
  
$dir substr($dir,0,strrpos($dir'/')-1);
 }
 if(
ftp_pwd($connId) == $dir) return true;

 
$tree explode('/'$dir);

 for(
$i=0$i<count($tree); $i++) {
   if(
$tree[$i] != '' && $tree[$i] != '/'){
     if(
$i == 1)
      
$base '/';
     else
      
$base '';
     if(@
ftp_chdir($connId$base.$tree[$i]) === false){
       if(
ftp_mkdir($connId$tree[$i]) === false){
                 return 
false;
             }
       if(@
ftp_chdir($connId$tree[$i])===false){
                 return 
false;
             }
      }
    }
  }
    return 
true;
}

function 
getAccounts(){
    global 
$protocol,$reseller,$whmPort,$whmUser,$whmPass;
    
    
$accounts = array();
    
$acctsPage getByCurl($protocol.$reseller.':'.$whmPort.'/scripts2/listaccts?viewall=1',$whmUser,$whmPass);
    
$int2 preg_match_all("/<tr class=(?:tdshade2|tdshade1)>(.*?)<\/tr>/is"$acctsPage$matches);
    if(
$int2 && is_array($matches[1])) { 
        
$i 0;
        foreach(
$matches[1] as $match) {
            
$account = array();
            
$account explode('</td><td>',$match);
            
$accounts[$i]['cpDomain'] = strip_tags(trim($account[0]));//domain
            
$accounts[$i]['cpUser'] = strip_tags(trim($account[2]));//username
            
$accounts[$i]['cpTheme'] = strip_tags(trim($account[9]));//cpanel theme
            
$i++;
        }
    }
    return 
$accounts;
}
?>