#!/usr/bin/php
<?

##################### init Customize ############################
//mysql settings
$illegaldatabases=1//backup illegal ensim databases (0 disable, 1 enable)
$userdatabases=1//backup all databases user has rights to (0 disable, 1 enable)

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

/* Global Vars */

$savepath="/root/backup/"//path to store files locally
$tmppath="/root/backup/tmp"//temporary store directory

/* Main */

echo "Ensimbackup version 1.4\n\n";
switch(
$argv[1]) {
case 
"-d":
    if(isset(
$argv[2])) {
        
backup($argv[2]);
    } else {
        echo 
"You need to specify a domain\n";
    }
    break;
case 
"-n":
    if(isset(
$argv[2])) {
        
# Get domain name from site name
        
$domain=trim(`/usr/local/bin/sitelookup -s $argv[2]|awk -F\, {'print $1'}`);
        
backup($domain);
    } else {
        echo 
"You need to specify a site\n";
    }
    break;
case 
"-a":
    
backupall();
    break;
case 
"-l":
    
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 per line)\n";
    break;
}
exit;

/* Specific Functions */

function getpw() {
    
$pw=trim(`cd /usr/lib/opcenter/mysql/;python2.1 -c 'from mysqlbe import *; print read_mysqlpass();'`);
    return 
$pw;
}

function 
xmldump($domain,$site,$path) {
    global 
$tmppath;
    echo 
"Dumping account details...     ";
`
python2.1 -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)

" > $tmppath/$domain.xml
`;
    `
cd $tmppath; gzip $domain.xml`;
    echo 
"done\n";
}

function 
checkmysql($site) {
    
$check file("/home/virtual/$site/info/current/mysql");
    
$check[1]=trim($check[1]);
    if(
$check[1]=="enabled = 1"){
        return 
1;
    } else {
        return 
0;
    }
}

function 
mysqlbackup($path,$db,$site,$domain) {

    global 
$illegaldatabases,$userdatabases;

    
# Get mysql password
    
$pw=getpw();

    
# Get site mysql admin username and password
    
$check=file("/home/virtual/$site/info/current/mysql");
    
$dbadmin=str_replace("dbaseadmin = ","",trim($check[3]));
    
$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);
    
# Write it to 'mysql' file into site
    
`echo '$dbadmin\n$line->password' > $path/mysql`;

    
# Dump all user databases
    
if($userdatabases) {
        unset(
$databases);
        
$grants=trim(`mysql -e 'SHOW GRANTS FOR \`$dbadmin\`@localhost' -u root --password=$pw`);
        
preg_match_all("/ON `?(.*?)`?\.\* TO/",$grants$databases);
        foreach(
$databases[1] as $database) {
            if(
$database!=$db AND $database!="*") {
                
$database=str_replace('\_','_',$database);
                echo 
"Dumping database $database...     ";
                `
mysqldump -u root --password=$pw --add-drop-table --add-locks --quote-names --extended-insert $database > $path/$database.sql`;
                echo 
"done\n";
            }
        }
    }

    if(
$illegaldatabases) {
        unset(
$databases);
        
$list=trim(`mysql -e 'show databases' -u root --password=$pw`);
        
preg_match_all("/^$domain$/m"$list,$databases);
        foreach(
$databases[0] as $database) {
            echo 
"Dumping database $database...     ";
            `
mysqldump -u root --password=$pw --add-drop-table --add-locks --quote-names --extended-insert $database > $path/$database.sql`;
            echo 
"done\n";
        }
    } else {
        echo 
"Dumping database $db...     ";
        `
mysqldump -u root --password=$pw --add-drop-table --add-locks --quote-names --extended-insert $db > $path/$db.sql`;
        echo 
"done\n";
    }

    
# Return data indicator to include
    
return "*.sql mysql";
}

function 
delmysqlbackup($path,$db) {
    if(
$path!="") {
        `
rm -f $path/*.sql`; /**/
        
if(!@unlink("$path/mysql")) {
            echo 
"Couldn't delete mysql";
        }
    }
}

function 
tarsite($path,$domain,$site,$tarinclude) {
    global 
$tmppath,$excludelogs,$excludeext,$savepath;
    echo 
"Tarring $path...     ";

    
# Tar parameters
    
$exts=explode(" ",$excludeext);
    
$extline="";
    foreach(
$exts as $ext){
        
$extline.="--exclude=*.$ext ";
    }
    
$excludelog="";
    if(
$excludelogs){
        
$excludelog="--exclude=var/log/*"/**/
    
}

    `
cd $path; tar -zcf $tmppath/$domain.tgz $excludelog $extline etc/httpd etc/mail etc/shadow etc/aliases etc/aliases.db home var $tarinclude`;
    `
cd $tmppath; tar -cf $domain.tar $domain.tgz $domain.xml.gz`;
    
# Create .list file
    
`tar tvfz $tmppath/$domain.tgz > $savepath/$domain.list`;
    
unlink("$tmppath/$domain.tgz");
    
unlink("$tmppath/$domain.xml.gz");
    echo 
"done\n";

    
# Copy $domain backup
    
echo "copying file $domain.tar...    ";
    `
cp $tmppath/$domain.tar $savepath/$domain.tar`;
    echo 
"done\n";

    
# Erase backup from temp dir
    
unlink("$tmppath/$domain.tar");
}

/*  Main Functions  */

function backup($domain) {

    global 
$tmppath;

    echo 
"Backing up $domain...\n";

    
# Get Variables
    
$path=trim(`/usr/local/bin/sitelookup -d $domain | awk -F\, {'print $4'}`);
    
$site=trim(`/usr/local/bin/sitelookup -d $domain | awk -F\, {'print $3'}`);
    
$db=str_replace(".","_",$domain);

    
# Test if PATH exists
    
if($path=="") {
        print 
"Can't do nothing, path for $domain not found.\n";
        exit;
    }

    
# Dump mysql database
    
$mysqlcheck=checkmysql($site);
    if (
$mysqlcheck) {
        
$tarinclude mysqlbackup($path,$db,$site,$domain);
    } else {
        
$tarinclude '';
        echo 
"$domain have no database.\n";
    }

    
# Xml dump
    
xmldump($domain,$site,$path);

    
# Backup dirs
    
tarsite($path,$domain,$site,$tarinclude);

    
# Remove database back-ups
    
if($mysqlcheck) {
        
delmysqlbackup($path,$db);
    }

    
# Suspend client
    
echo "disabling $domain...    ";
    `
/usr/local/bin/DisableVirtDomain $domain`;
    echo 
"done\n";

    echo 
"\n";
}

function 
backupall() {
    
# Get the list of all hosted sites
    
$sites=trim(`/usr/local/bin/sitelookup -a | awk -F\, {'print $1'}`);
    
$sites=explode("\n"$sites);
    foreach(
$sites as $site) {
        
backup($site);
    }
}

function 
backuplist($listfile) {
    
$sites file("$listfile");
    foreach(
$sites as $site) {
        
$site=trim($site);
        
backup($site);
    }
}

?>