#!/usr/bin/php
<?

/* Global Vars */

$savepath="/root/backup"//path where the backup files are
$ary_parsed_file '';
$ary_path '';

/* Main */

echo "Ensimrestore version 1.4\n";
switch(
$argv[1]) {
case 
"-a":
    if(isset(
$argv[2])) {
        
$list=trim(`ls $argv[2]/*.tar`); /**/
        
$list=explode("\n",$list);
        foreach(
$list as $site){
            
restore("$site");
        }
    } else {
        echo 
"You need to specify a directory\n";
    }
    break;
case 
"-f":
    if(isset(
$argv[2])) {
        
restore($argv[2]);
    } else {
        echo 
"You need to specify a file\n";
    }
    break;
default:
    echo 
"usage $argv[0]\n";
    echo 
"-f [full path to file] file restore\n";
    echo 
"-a [full path to dir] dir restore\n";
    break;
}
exit;

/* Specific Functions */

function checkfile($file){
    if(!
file_exists("$file")) {
        echo 
"file $file doesn't exist.\n";
        exit;
    }
}

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

function 
passwords($file) {
    global 
$savepath;
    `
cd $savepath; tar -zxvf $file etc/shadow`;
    
$passwordlines=file("$savepath/etc/shadow");
    foreach(
$passwordlines as $passwordline){
        
$passwordline split (':'$passwordline);
        
$user=$passwordline[0];
        
$pw=$passwordline[1];
        
$passwords[$user]=$pw;
    }
    `
cd $savepath;rm -f etc/shadow;rmdir etc`;
    return 
$passwords;
}

function 
check($domain) {
    
$check=trim(`/usr/local/bin/sitelookup -d $domain domain`);
    if(
$domain!=$check) {
        echo 
"\nError creating the $domain, skipping...\n";
        return 
0;
    } else {
        return 
1;
    }
}

function 
stdin() {
    
$handle=fopen("/dev/stdin","r");
    while((
$char=fgetc($handle)) != "\n")
        
$in.=$char;
    
fclose($handle);
    return 
$in;
}

function 
checkreseller($reseller) {
    global 
$ary_parsed_file;
    
$dbconn pg_connect("dbname=appldb user=root");
    
$result pg_query($dbconn,"SELECT count(reseller_id) FROM reseller_users where reseller_id=$reseller");
    
$arr pg_fetch_array ($result0PGSQL_NUM);
    if(
$arr[0]==0) {
        echo 
"Reseller id $reseller doesn't exist!!\n";
        echo 
"Please enter new reseller id (0 is none):  ";
        
$input=stdin();
        echo 
"\n";
        
$ary_parsed_file['CONFIG']['RESELLER']['RESELLER_ID']=$input;
    }
}

function 
addvirtdomain($passwords) {

    global 
$ary_parsed_file;

    
//trim unneeded things out
    
unset($ary_parsed_file['CONFIG']['SITEINFO']['PASSWD1']);
    unset(
$ary_parsed_file['CONFIG']['SITEINFO']['PASSWD2']);
    unset(
$ary_parsed_file['CONFIG']['IPINFO']['NBADDRS']);

    if(
is_array($ary_parsed_file['CONFIG']['IPINFO']['IPADDRS'])) {
        
$ips="[";
        foreach(
$ary_parsed_file['CONFIG']['IPINFO']['IPADDRS'] as $ip) {
            
$ips.="$ip$add2";
            
$add2=",";
        }
        
$ips.="]";
        
$ary_parsed_file['CONFIG']['IPINFO']['IPADDRS']=$ips;
    }

    if(
is_array($ary_parsed_file['CONFIG']['ALIASES']['ALIASES'])) {
        
$aliases="[";
        foreach(
$ary_parsed_file['CONFIG']['ALIASES']['ALIASES'] as $alias) {
            
$aliases=$aliases."$alias$add";
            
$add=",";
        }
        
$aliases.="]";
        
$ary_parsed_file['CONFIG']['ALIASES']['ALIASES']=$aliases;
    }

    
$adminuser=$ary_parsed_file['CONFIG']['SITEINFO']['ADMIN_USER'];
    
$ary_parsed_file['CONFIG']['SITEINFO']['CPASSWD']=$passwords[$adminuser];

    
$command="/usr/local/bin/AddVirtDomain";

    foreach(
$ary_parsed_file['CONFIG'] as $service =>$options) {
        
$service=strtolower($service);
        
//trim versions out
        
unset($options['VERSION']);
        
$command.=" -c $service";
        foreach(
$options as $option=> $value) {
            
$option=strtolower($option);
            
//make strings lowercase except for units
            
if($option!="units") {
                
$value=strtolower($value);
            }
        
$command.=",$option=$value";
        }
    }

    
$command=trim($command);
    return 
$command;
}

function 
addusers($passwords,$domain) {

    global 
$ary_parsed_file;

    
$addusers="";

    foreach(
$ary_parsed_file['VIRTUSERS'] as $user) {
        foreach(
$user as $name => $value) {

            
//make strings lowercase
            
$name=strtolower($name);
            
$value=strtolower($value);

            
//get values
            
if($name=="username") {
                
$username=$value;
                unset(
$user['USERNAME']);
            }
            if(
$name=="fullname") {
                
$fullname=$value;
                unset(
$user['FULLNAME']);
            }
            if(
$name=="diskquota") {
                
$diskquota=$value/1024/1024;
                unset(
$user['DISKQUOTA']);
            }
        }


        
//check if the user isn't default added
        
if(($username!="ftp")AND($username!="mail")AND($username!="root")AND($username!="majordomo")AND($username!=$ary_parsed_file['CONFIG']['SITEINFO']['ADMIN_USER'])) {
            
$addusers.="/usr/local/bin/AddVirtUser cpasswd='$passwords[$username]' '$domain' '$username' '$fullname' $diskquota";
            
//loop through other settings
            
foreach($user as $name => $value) {
                
$name=strtolower($name);
                
$value=strtolower($value);
                
$addusers.=" $name=$value";
            }
            
$addusers.=";\n";
        }
    }

    return 
"$addusers";
}

function 
precheck($domain) {
    
$check=trim(`/usr/local/bin/sitelookup -d $domain domain`);
    if(
$domain==$check) {
        echo 
"Site already exists. Only replacing files and database.\n";
        return 
0;
    } else {
        return 
1;
    }
}

function 
fixpassword($domain,$pw) {
    echo 
"Fixing main password...";
    
$site trim(`/usr/local/bin/sitelookup -d $domain site_handle`);
    
$filename "/home/virtual/$site/info/current/siteinfo";
    
$file fopen($filename"r");
    
$filecontentfread($filefilesize($filename));
    
fclose($file);
    
$pw=quotemeta($pw);
    
$filecontent=preg_replace("/passwd = .*/""passwd = $pw"$filecontent);
    
$filecontent=stripslashes($filecontent);
    
$file fopen($filename"w");
    
fwrite($file,$filecontent);
    
fclose($file);
    echo 
"done\n";
}

function 
extractfiles($domain,$archive) {

    global 
$savepath;
    if(
$domain=="") {
        echo 
"domain is an empty, exiting...";
        exit;
    }

    echo 
"Extracting files..     ";
    `
cd /home/virtual/$domain/;tar zxf $archive`;
    
# Erase archive
    
unlink("$archive");
    echo 
"done\n";

    echo 
"Chowning home and mail files...     ";
    
$users=file("/home/virtual/$domain/etc/passwd");
    foreach(
$users as $user) {
        
$parts=explode(":",$user);
        if((
$parts[0]!="root")AND($parts[0]!="majordomo")AND($parts[0]!="ftp")AND($parts[0]!="mail")) {
            if((
$domain!="")AND ($parts[0]!=""))
                `
chown -R $parts[2]:$parts[3] /home/virtual/$domain/home/$parts[0]/`;
            `
chown $parts[2]:$parts[3] /home/virtual/$domain/var/spool/mail/$parts[0]*`;
        }
    }
    echo 
"done\n";

    echo 
"Chowning site admin files...     ";
    
$parts=explode(":",$users[0]);
    if(
$domain!="") {

        if(
file_exists("/home/virtual/$domain/var/ftp"))
            `
chown $parts[2]:$parts[3] /home/virtual/$domain/var/ftp`;

        if(
file_exists("/home/virtual/$domain/var/ftp/pub"))
            `
chown -R $parts[2]:$parts[3] /home/virtual/$domain/var/ftp/pub`;

        if(
file_exists("/home/virtual/$domain/var/www/html"))
            `
chown -R $parts[2]:$parts[3] /home/virtual/$domain/var/www/html`;

        if(
file_exists("/home/virtual/$domain/var/www/cgi-bin"))
            `
chown -R $parts[2]:$parts[3] /home/virtual/$domain/var/www/cgi-bin`;

        if(
file_exists("/home/virtual/$domain/var/www/perl"))
            `
chown -R $parts[2]:$parts[3] /home/virtual/$domain/var/www/perl`;

        if(
file_exists("/home/virtual/$domain/var/www/squirrelmail"))
            `
chown -R $parts[2]:$parts[3] /home/virtual/$domain/var/www/squirrelmail`;

        if(
file_exists("/home/virtual/$domain/var/www/squirrelmail-attachments"))
            `
chown -R $parts[2]:$parts[3] /home/virtual/$domain/var/www/squirrelmail-attachments`;
            `
chown :apache /home/virtual/$domain/var/www/squirrelmail-attachments`;

        if(
file_exists("/home/virtual/$domain/var/www/squirrelmail-data")) {
            `
chown -R $parts[2]:$parts[3] /home/virtual/$domain/var/www/squirrelmail-data`;
            `
chown :apache /home/virtual/$domain/var/www/squirrelmail-data`;
        }

        if(
file_exists("/home/virtual/$domain/var/lib/majordomo"))
            `
chown -R $parts[2]:$parts[3] /home/virtual/$domain/var/lib/majordomo`;

        if(
file_exists("/home/virtual/$domain/var/log/httpd"))
            `
chown $parts[2]:$parts[3] /home/virtual/$domain/var/log/httpd/*_log*`; /**/

        
if(file_exists("/home/virtual/$domain/var/spool/mqueue"))
            `
chown :$parts[3] /home/virtual/$domain/var/spool/mqueue`;

        if(
file_exists("/home/virtual/$domain/var/www/.htgroup"))
            `
chown $parts[2]:$parts[3] /home/virtual/$domain/var/www/.htgroup`;

        if(
file_exists("/home/virtual/$domain/var/www/.htpasswd"))
            `
chown $parts[2]:$parts[3] /home/virtual/$domain/var/www/.htpasswd`;
    }
    echo 
"done\n";

}

function 
mysqlrestore($domain,$db) {

    
# Get mysql root password
    
$pw=getpw();

    
# We only update databases if 'mysql' file exists
    
if(file_exists("/home/virtual/$domain/mysql")) {

        
# Get mysql site admin password
        
$info=file("/home/virtual/$domain/mysql");
        
$user=trim($info[0]);
        
$password=trim($info[1]);

        
$connect mysql_connect("localhost""root"$pw);
        
mysql_select_db("mysql",$connect);
        
mysql_query("update user set password='$password' where user='$user'");
        
$mysqldbs=trim(`cd /home/virtual/$domain;ls *.sql`);
        if(
$mysqldbs) {
            
$mysqldbs=explode("\n",$mysqldbs);
            foreach(
$mysqldbs as $mysqldb) {
                
$database=str_replace(".sql","",$mysqldb);
                echo 
"Importing database $database...     ";
                `
chown mysql.mysql /var/lib/mysql/`;
                `
mysql -e 'create database $database' -u root --password=$pw`;
                `
mysql -u root --password=$pw $database < /home/virtual/$domain/$mysqldb`;
                `
mysql -e 'grant select,insert,update,delete,create,drop,index,alter on \`$database\`.* to \`$user\`@localhost' -u root --password=$pw`;
                `
mysql -e 'flush privileges' -u root --password=$pw`;
                `
chown root.mysql /var/lib/mysql/`;
                echo 
"done\n";
            }
            
mysql_close($connect);
        } else {
            echo 
"$domain has no databases\n";
        }

        
# Migrating MySQL databases to the site’s file system (3.1 to 3.5 post-requisites)

        
$mysqldbs=trim(`cd /home/virtual/$domain;ls *.sql`);
        if(
$mysqldbs) {
            
$mysqldbs=explode("\n",$mysqldbs);
            foreach(
$mysqldbs as $mysqldb) {
                
$database=str_replace(".sql","",$mysqldb);
                echo 
"Migrating database $database...     ";
                `
ensim-python /usr/lib/opcenter/mysql/mysqlmig.pyc -f $database $domain`;
                `
ensim-python /usr/lib/opcenter/mysql/mysqlmig.pyc -m $database $domain`;
                `
/etc/rc.d/init.d/mysqld stop`;
                `
ensim-python /usr/lib/opcenter/mysql/mysqlmig.pyc -m $database $domain`;
                `
/etc/rc.d/init.d/mysqld start`;
                `
ensim-python /usr/lib/opcenter/mysql/mysqlmig.pyc -u $database $domain`;
                echo 
"done\n";
            }
        }

        
# Delete sql files
        
`rm -f /home/virtual/$domain/*.sql`; /**/

        # Delete mysql file
        
`rm -f /home/virtual/$domain/mysql`;

    } else {
        echo 
"$domain has no databases\n";
    }

}

function 
htaccess($domain,$oldadmin) {
    echo 
"Adjusting .htaccess files...     ";
    
$site=trim(`sitelookup -d $domain | awk -F\, {'print $3'}`);
    
$oldsite=str_replace("admin","site",$oldadmin);
    
$htfiles=`find /home/virtual/$domain/var/www/html/ -name .htaccess`;
    
$htfiles=explode("\n",$htfiles);
    foreach(
$htfiles as $htfile) {
        
$htfile=trim($htfile);
        if(
$htfile!="") {
            `
/usr/bin/perl -pi -e 's/$oldsite/$site/' $htfile`;
        }
    }
    echo 
"done\n";
}

function 
squirremail()
{
    echo 
"Resetting squirremail configuration...     ";
    if (
file_exists("/home/virtual/$domain/var/www/squirrelmail/config/config.php")) {
        `
echo y | cp -i /etc/virtualhosting/templates/sqmail/var/www/squirrelmail/config/config.php /home/virtual/$domain/var/www/squirrelmail/config/config.php`;
    }
    echo 
"done\n";
}

function 
analog($domain)
{
    echo 
"Deleting old analog configuration...     ";
    `
rm -fR /home/virtual/$domain/var/analog-5.1`;
    echo 
"done\n";
}

/*  Main Functions  */

function restore($file) {

    global 
$ary_parsed_file;
    global 
$savepath;

    
# Check if file exists
    
checkfile($savepath.'/'.$file);

    
# Untar file
    
`cd $savepath; tar vxf $file`;

    
# Set xmlgz, xml and archive variables
    
$tmpfilename explode('.',$file);
    
array_pop($tmpfilename);
    
$xmlgz $savepath.'/'.implode('.',$tmpfilename).'.xml.gz';
    
$archive $savepath.'/'.implode('.',$tmpfilename).'.tgz';
    
$xml $savepath.'/'.implode('.',$tmpfilename).'.xml';

    
# Unzip xmlgz
    
global $savepath;
    `
gunzip -f $xmlgz`;

    
# Read passwords from 'shadow' file
    
$passwords passwords($archive);

    
# Extract information from xml file
    
makearray($xml);

    
# Get and ser domain, oldadmin, and db name
    
$domain $ary_parsed_file['CONFIG']['SITEINFO']['DOMAIN'];
    
$oldadmin $ary_parsed_file['CONFIG']['SITEINFO']['ADMIN'];
    
$db str_replace(".","_",$domain);

    
# Check if site is added to an reseller
    
if(isset($ary_parsed_file['CONFIG']['RESELLER'])) {
        
# Check or asks for a reseller id
        
checkreseller($ary_parsed_file['CONFIG']['RESELLER']['RESELLER_ID']);
    }

    
# Get addvirtdomain command
    
$addvirtdomain=addvirtdomain($passwords);
    
# Get addvirtuser command
    
$addusers=addusers($passwords,$domain);
    
# Erase xml file
    
if(!@unlink("$xml")) {
        echo 
"Couldn't delete $xml file \n";
    }

    
# Checks if a site already exists
    
if(precheck($domain)) {
        echo 
"Creating $domain..     ";
        `
$addvirtdomain`;
        echo 
"done\n";
        if(
check($domain)) {
            
# Fix main site admin password
            
fixpassword($domain,$ary_parsed_file['CONFIG']['SITEINFO']['CPASSWD']);
            
# Delete default index page
            
if($domain!="") {
                
unlink("/home/virtual/$domain/var/www/html/index.html");
                `
rm -fR /home/virtual/$domain/var/www/html/images`;
            }
            
# Create Users
            
echo "Adding users..     ";
            `
$addusers`;
            echo 
"done\n";
        }
    }

    
# Check if the domain is/was created, and (re)creates the client area
    
if(check($domain)) {
        
# Extract files and correct chown information
        
extractfiles($domain,$archive);
        
# Restore databases, if any
        
mysqlrestore($domain,$db);
        
# Correct htaccess files
        
htaccess($domain,$oldadmin);
        
# Reset squirremail config
        
squirremail($domain);
        
# Delete old analog directory
        
analog($domain);
    }

}

/* xml parse functions */

function makearray($xml_file){
global 
$ary_parsed_file,$ary_path;
$ary_path = array();
$ary_parsed_file = array();
$xml_parser xml_parser_create();

echo 
"$xml";
xml_set_element_handler($xml_parser'startElement','endElement');
xml_set_character_data_handler($xml_parser'characterData');

if (!(
$fp fopen($xml_file'r'))) {
die(
"Could not open $xml_file for parsing!\n");
}

while (
$data fread($fp4096)) {
if (!(
$data utf8_encode($data))) {
echo 
'ERROR'."\n";
}
if (!
xml_parse($xml_parser$datafeof($fp))) {
die(
sprintf"XML error: %s at line %d\n\n",
xml_error_string(xml_get_error_code($xml_parser)),
xml_get_current_line_number($xml_parser)));
}
}

xml_parser_free($xml_parser);
}

// This function is called for every opening XML tag.
function startElement($parser$name$attr=''){
global 
$ary_path$i;

//don't overwrite multiple users
if($name=="USER"){
$name="$name$i";
$i++;
}

array_push($ary_path$name);
}

// This function is called for every closing XML tag.
function endElement($parser$name$attr=''){
global 
$ary_path;

array_pop($ary_path);

}

// This function is called for every data portion found between
// opening and closing tags.
function characterData($parser$data){
global 
$ary_parsed_file$ary_path;
$str_trimmed_data trim($data);

if (
$str_trimmed_data!=""){
$str_array_define '$ary_parsed_file';
for (
$i 2$i count($ary_path); $i++) {
$str_array_define .= '[\'' $ary_path[$i] . '\']';
}

$str_array_define .= " = '" $str_trimmed_data "';";

eval(
$str_array_define);



}

?>