#!/usr/bin/php
<?

#####################Customize############################
$host="backup1.anywherehost.net";
$user="`hostname`";
$dir="/home/`hostname`";
$rotate="/usr/local/ersyback-1.1/rotate";


$maxlogs="3";
$excludelogs=1; //exclude logs from backup. (0 disable, 1 enable)
$excludeext=""; //extensions (without a dot) seperated with a space excluded from backup

$chrootdir="/";
$homedir="/home/virtual";


## Don't change these unless you know what they do!!

// $chrootdir="/mnt";
// $homedir="/mnt/home/virtual";

$date=date("m-d-Y");
##########################################################

if (file_exists('/usr/bin/ensim-python')){
   $PYTHON="/usr/bin/ensim-python";
}else{
   $PYTHON="/usr/bin/python2.1";
}

echo "Ensimrsync version 1.1\n";
switch($argv[1]){
case "-d":
   if(isset($argv[2])){
   rotate();
   $regexp='\'{ if (/^'.$argv[2].'\ \=\ .+/) print $3}\'';
   $site=trim(` awk $regexp $chrootdir/etc/virtualhosting/mappings/domainmap`);
      if ((strlen($site) > 0) && ($site != null)) {
          backup($site);
      }else{
       echo "Domain \"$argv[2]\" is not on this server.\n";
      }
   }
   else
   echo"You need to specify a domain\n";
   break;
case "-n":
   if(isset($argv[2])){
      rotate();


      if (file_exists("$homedir/$argv[2]/info/current/siteinfo")) {
         backup($argv[2]);
      }else{
         echo "Site $argv[2] does not exist\n";
      }
   }
   else
   echo"You need to specify a site\n";
   break;
case "-a":
   rotate();
   backupall();
   break;
case "-l":
   rotate();
   backuplist($argv[2]);
   break;
default:
   echo "usage $argv[0]\n";
   echo "-d [domain] domain backup\n";
   echo "-n [site#] site backup\n";
   echo "-a all sites\n";
   echo "-l [/path/file] list file (one domain each line)\n";
   break;
}

exit;

function rotate(){
global $user,$host,$dir,$maxlogs,$date,$rotate;
`/usr/bin/ssh $user@$host $rotate $dir $maxlogs $date`;
}

function getpw(){
global $PYTHON,$chrootdir;
if ($chrootdir == "/"){
     // if this is on alternate root, no chance of db info out of ensim
     $pw=trim(`cd /usr/lib/opcenter/mysql/;
     $PYTHON -c 'from mysqlbe import *; print read_mysqlpass();'`);
     return $pw;
  }
}

function subdomain($site){
global $homedir,$configdir,$chrootdir;
if(file_exists("$chrootdir/etc/virtualhosting/subdomain/$site")){
   `cp $chrootdir/etc/virtualhosting/subdomain/$site $homedir/$site/fst/subdomain`;
}else{
   `touch $homedir/$site/fst/subdomain`;
}
}

function xmldump($domain,$site){
global $PYTHON,$homedir,$configdir,$chrootdir;

echo "Dumping account details..     ";
if ($chrootdir == "/"){
`$PYTHON -c "
import sys;
from vh3 import virthost;
xml_dict = {'doctype':'backup','author':'appliance','type':'site','site':'$site'}
xml_list=virthost.create_site_xml(xml_dict)
print (xml_list)

" > $homedir/$site/fst/dump.xml`;

}else{

 $config_xml=	'<backup author="appliance" type="site" version="4.0.2" release="7" format="1.0">'."\n".
		"<site>\n".
		"<config>\n";
 if (is_dir ("$homedir/$site/info/current")){

  $d = dir("$homedir/$site/info/current");
  while (false !== ($entry = $d->read())) {
    if (is_file("$homedir/$site/info/current/$entry")){ 
      $lines = file("$homedir/$site/info/current/$entry");
      $svc="<$entry>\n";      
      foreach ($lines as $line_num => $line) {
	  if (strpos($line,'=')){
	      $item=explode('=',$line,2);
              $sv_name=trim($item[0]);
              $sv_flags=trim($item[1]);
	      if (preg_match("/\['.+'\]/",$sv_flags)){
		 preg_match_all('/\'(.*?)\'/',$sv_flags, $members, PREG_PATTERN_ORDER);
		 if (is_array($members[1])){
		    $svc=$svc."<$sv_name type=\"list\">\n";
			 foreach ($members[1] as $p_record){
			    $svc=$svc."<item>$p_record</item>\n";
			 }
		    $svc=$svc."</$sv_name>\n";	    
                 }
              }else{
                  $svc=$svc."<$sv_name>$sv_flags</$sv_name>\n";
              }
          }         
      }
      $svc=$svc."</$entry>\n";
      $config_xml=$config_xml.$svc;
    }
   }
   $d->close();
   $config_xml=$config_xml."</config>\n";

   $users=file("$homedir/$site/fst/etc/passwd");
   $vusergroup_xml="<virtusers>\n";
   foreach($users as $user){
      $parts=explode(":",$user);   
       if(($parts[0]!="root")AND($parts[0]!="majordomo")AND($parts[0]!="apache")AND($parts[0]!="tomcat4")AND($parts[0]!="majordomo")AND($parts[0]!="ftp") AND ($parts[0]!="mail")AND($parts[0]!="mysql")AND($parts[0]!="ensimrootmail")){
          $vuser_xml="<user>\n".
		     "<username>$parts[0]</username>\n".
		     "<fullname>$parts[0]</fullname>\n".
		     "<domain>$domain</domain>\n".
		     "<diskquota>10000000</diskquota>\n".
		     "<cgi>0</cgi>\n".
		     "<proftpd>0</proftpd>\n".
		     "<ssh>0</ssh>\n".
		     "<privileged>1</privileged>\n".
	             "<telnet>0</telnet>\n".
		     "</user>\n";
          $vusergroup_xml=$vusergroup_xml.$vuser_xml;
       }
   }
   $vusergroup_xml=$vusergroup_xml."</virtusers>\n";
   $config_xml=$config_xml.$vusergroup_xml."</site>\n</backup>";
   echo "\nAlternative XML Generated\n";
   $fp = fopen("$homedir/$site/fst/dump.xml",'w+');
   if(!$fp) {
     trigger_error('file_put_contents cannot write in file.', E_USER_ERROR);
     return;
   }
   fputs($fp, $config_xml);
   fclose($fp);

  }

 }
echo "done\n";

}



function checkmysql($site){
global $addmysql,$homedir,$configdir;
$addmysql="";
$check = file ("$homedir/$site/info/current/mysql");
$check[1]=trim($check[1]);
if($check[1]=="enabled = 1"){
return 1;
}
else{
return 0;
}
}


function mysqlbackup($site,$domain){
global $addmysql,$PYTHON,$homedir,$configdir,$chrootdir;
$pw=getpw();
if(file_exists("$homedir/$domain/mysql")){
   `rm -f $homedir/$domain/mysql/*`;
}
else{
    mkdirr("$homedir/$domain/mysql");
}
$check = file ("$homedir/$site/info/current/mysql");
$dbadmin=str_replace("dbaseadmin = ","",trim($check[2]));
$connect = mysql_connect("localhost", "root", $pw);
mysql_select_db("mysql",$connect);
$result=mysql_query("select password from user where user='$dbadmin'");
$line=mysql_fetch_object($result);
`echo '$dbadmin\n$line->password' > $homedir/$domain/mysql/mysql`;


if (file_exists("$chrootdir/etc/virtualhosting/mappings/mysql.dbmap")){
   $dblist=trim(`awk '{ if (/\<$site$/) print $1}' /etc/virtualhosting/mappings/mysql.dbmap`);
   $databases=explode("\n", $dblist);
}

// Handle 3.1 generation
$defdb=str_replace('.','_',$domain);
if (file_exists("/var/lib/mysql/$defdb")){
      echo "Legacy database found\n";
      $databases[] = $defdb;
}

foreach($databases as $database){
	echo "Dumping database $database..     ";
	`mysqldump -u root --password=$pw --add-drop-table --add-locks --quote-names --extended-insert $database > $homedir/$domain/mysql/$database.sql`;
	echo "done\n";
}	


$addmysql="mysql";
}


function rsync($domain,$site){
global $excludelogs,$excludeext,$addmysql,$user,$host,$dir,$date,$homedir,$configdir;
echo "Rsynching...     ";
$exts=explode(" ",$excludeext);
$extline="";
foreach($exts as $ext){
$extline.="--exclude=*.$ext ";
}

$excludelog="";
if($excludelogs){
$excludelog="--exclude=var/log";
}
if(is_dir("$homedir/$site/fst")){
`/usr/bin/ssh $user@$host mkdir -p $dir/$date.current`;
`cd $homedir/$site/fst; rsync -a --delete -e ssh --include=etc/httpd --include=etc/mail --include=etc/shadow --include=etc/aliases --include=etc/aliases.db --exclude=etc/* --exclude=var/lib/mysql --exclude=var/www/squirrelmail $excludelog $extline etc home var dump.xml subdomain $addmysql $user@$host:$dir/$date.current/$domain/`; echo "done\n";
`cd $homedir/$site/fst; rsync -a --delete -e ssh etc/passwd $user@$host:$dir/$date.current/$domain/`;
}
else{
echo "Aborting can't change to directory, exiting for danger \n";
}

}



function backup($site){
global $PYTHON,$homedir,$configdir,$chrootdir;
$domain=trim(` awk '{ if (/^domain\ \=\ .+\..+/) print $3}' $homedir/$site/info/current/siteinfo`);
echo "backing up $domain\n";
if($site!=""){
$mysqlcheck=checkmysql($site);
#copy subdomain file
subdomain($site);
if($mysqlcheck)
  if ($chrootdir == "/"){
     mysqlbackup($site,$domain);
  }
else
echo "$domain has no database\n";

#xml dump
xmldump($domain,$site);

#rsync dirs
rsync($domain,$site);
echo "done\n\n";
}
}



function backupall(){
global $homedir,$configdir,$chrootdir;
if (file_exists("$chrootdir/etc/virtualhosting/mappings/domainmap")){
   $sites=trim(`/usr/bin/uniq -f2 $chrootdir/etc/virtualhosting/mappings/domainmap | awk '{ if (/^.+\..+\ /) print $3; }'`);
   $sites=explode("\n", $sites);
}else{
   $dh  = opendir($homedir);
   while (false !== ($filename = readdir($dh))) {
      if (preg_match('/site[1-9].*/',$filename)){
         $sites[] = $filename;
      }
   }
}
foreach($sites as $site){
// $p_domain=trim(` awk '{ if (/^domain\ \=\ .+\..+/) print $3}' $homedir/$site/info/current/siteinfo`);
backup($site);
}
}

function backuplist($listfile){
global $homedir,$configdir;
$sites = file ("$listfile");
foreach($sites as $domain){
   $domain=trim($domain);
   if (file_exists("$homedir/$domain")){
       $site=trim(` awk '{ if (/^$domain\ \=\ .+/) print $3}' $homedir/$site/info/current/siteinfo`);
       backup($site);
   }
}
}
/**
 * Create a directory structure recursively
 *
 * @author      Aidan Lister <aidan@php.net>
 * @version     1.0.0
 * @param       string   $pathname    The directory structure to create
 * @return      bool     Returns TRUE on success, FALSE on failure
 */
 

function mkdirr($pathname, $mode = 0755)
{
    // Check if directory already exists
    if (is_dir($pathname) || empty($pathname)) {
        return true;
    }
 
    // Ensure a file does not already exist with the same name
    if (is_file($pathname)) {
        trigger_error('mkdirr() File exists', E_USER_WARNING);
        return false;
    }
 
    // Crawl up the directory tree
    $next_pathname = substr($pathname, 0, strrpos($pathname, DIRECTORY_SEPARATOR));
    if (mkdirr($next_pathname, $mode)) {
        if (!file_exists($pathname)) {
            return mkdir($pathname, $mode);
        }
    }
 
    return false;
}

if(!function_exists('file_put_contents')) {
  function file_put_contents($filename, $data, $file_append = false) {
   $fp = fopen($filename, (!$file_append ? 'w+' : 'a+'));
   if(!$fp) {
     trigger_error('file_put_contents cannot write in file.', E_USER_ERROR);
     return;
   }
   fputs($fp, $data);
   fclose($fp);
  }
} 

?>



