#!/usr/bin/php
<?


$rsynchost="backup1.anywherehost.net";
$rsyncuser="`hostname`";
$rsyncpath="/home/`hostname`/*.current";


if (sizeof($argv) == 1){
  exit;
}

echo "Ensimrestore-rsync-direct version 1.0\n";


switch($argv[1]){

case "-a":                     
   $list=trim(`ssh $rsyncuser@$rsynchost "(ls $rsyncpath)"`);
   $list=explode("\n",$list);
   foreach($list as $site){
   restore("$site");
   }
   break; 

case "-d":
   if(isset($argv[2])){
      $savepath="/home/data/$argv[2]";
      exec("mkdir -p /home/data/$argv[2]");
      restore($argv[2]);
   }else{
   echo"You need to specify a file\n";
   }
   break;
default:
   echo "usage $argv[0]\n";
   echo "-d domain to restore\n";
   echo "-a [full path to dir] dir restore\n";
   break;
}
exit;


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

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

function check($domain){
if (file_exists("/etc/virtualhosting/mappings/domainmap")){
   $check=trim(`awk '{ if (/^$domain /) print "domain exists"; }' /etc/virtualhosting/mappings/domainmap`);
}
if($check != "domain exists"){
return 0;
}
else{
return 1;
}
}


function extractfiles($domain){
global $subdomains,$savepath,$rsyncuser,$rsynchost,$rsyncpath;
if($domain==""){
echo "domain is empty exiting";
exit;
}

echo "Extracting files..     ";
`rsync -rlptD -e ssh --exclude=etc/shadow $rsyncuser@$rsynchost:$rsyncpath/$domain/ /home/virtual/$domain/`;
echo "done\n";
echo "Chowning 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]!="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")){
if(($domain!="")AND ($parts[0]!=""))
#echo "chown -R $parts[2]\:$parts[3] /home/virtual/$domain/home/$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]*`;
}
}

$group=trim(`sitelookup -d $domain site_admin`);
foreach($subdomains as $subdomain){
  preg_match("/document_root = (.*)/",$subdomain,$matches);
  preg_match("/owner = (.*)/",$subdomain,$owner);
  $document_root=$matches[1];
  $owner=$owner[1];
  if($document_root!="/"){
  `chroot /home/virtual/$domain chown -R $owner:$group $document_root`;
   }
}

$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/interpreters"))
`chown -R $parts[2]:$parts[3] /home/virtual/$domain/var/www/interpreters`;

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]:apache /home/virtual/$domain/var/www/squirrelmail-attachments`;

if(file_exists("/home/virtual/$domain/var/www/squirrelmail-data"))
`chown -R $parts[2]: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/access_log.1"))
`chown $parts[2]:$parts[3] /home/virtual/$domain/var/log/httpd/*_log.*`;

if(file_exists("/home/virtual/$domain/var/spool/mqueue"))
`chown root:$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 delxml($domain){
global $savepath;


@unlink("$savepath/dump.xml");
@unlink("/home/virtual/$domain/dump.xml");

}

function extractxml($domain){
global $savepath,$rsynchost,$rsyncuser,$rsyncpath;
`rsync -rlptD -e ssh $rsyncuser@$rsynchost:$rsyncpath/$domain/dump.xml $savepath/dump.xml`;
}

function passwords($domain){
global $savepath,$passwords,$rsynchost,$rsyncuser,$rsyncpath;
`rsync -rlptD -e ssh $rsyncuser@$rsynchost:$rsyncpath/$domain/etc/shadow $savepath/shadow`;

  $passwordlines=file("$savepath/shadow");
  foreach($passwordlines as $passwordline){
  $passwordline = split (':', $passwordline);
  $user=$passwordline[0];
  $pw=$passwordline[1];
  $passwords[$user]=$pw;
  } 
`rm -f $savepath/shadow`;
}

function delsql($domain){
if(file_exists("/home/virtual/$domain/mysql/"))
`rm -rf /home/virtual/$domain/mysql/`;
}

function createsite($domain,$addvirtdomain){
echo "Creating $domain..     ";
`$addvirtdomain`;
echo "done\n";
}

function createusers($addusers){
echo "Adding users..     ";
`$addusers`;
echo "done\n";
}

function mysqlrestore($domain,$db,$mysqluser){
$pw=getpw();

if(file_exists("/home/virtual/$domain/mysql/")){
   $info=file("/home/virtual/$domain/mysql/mysql");
   $password=trim($info[1]);
   $mysqldbs=trim(`cd /home/virtual/$domain/mysql/;ls *.sql`);
}else{
  $mysqldbs=false;
}
if($mysqldbs){
$mysqldbs=explode("\n",$mysqldbs);

foreach($mysqldbs as $mysqldb){
	$database=str_replace(".sql","",$mysqldb);
	echo "Importing database $database..     ";
	`/usr/bin/ensim-python /usr/lib/opcenter/mysql/create_db.pyc -d $database -n $domain`;
	`mysql -u root --password=$pw $database < /home/virtual/$domain/mysql/$mysqldb`;
	if(!preg_match("/^$domain$/m",$database)){
	`/usr/bin/ensim-python /usr/lib/opcenter/mysql/grant_db.pyc -u $mysqluser -d $database`;
	}
	echo "done\n";
}

`/usr/bin/ensim-python /usr/lib/opcenter/mysql/grant_db.pyc -u $mysqluser -d $db`;
`mysql -e 'update user set password="$password" where user="$mysqluser"' mysql -u root --password=$pw`;
`mysql -e 'flush privileges' -u root --password=$pw`;
}
else
echo "$domain has no databases\n";
}

function htaccess($domain,$oldadmin){
echo "Adjusting .htaccess..     ";
$site=trim(`awk '{ if (/^$domain /) print $3; }' /etc/virtualhosting/mappings/domainmap`);
#$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 checkreseller($reseller){
global $ary_parsed_file;
$ary_parsed_file['CONFIG']['RESELLER']['RESELLER_ID']="0";


}

function deleteindex($domain){
if($domain!=""){
unlink("/home/virtual/$domain/var/www/html/index.html");
`rm -rf /home/virtual/$domain/var/www/html/images`;
}
}

function addsubdomains($domain){
global $savepath,$subdomains,$rsynchost,$rsyncuser,$rsyncpath;

`rsync -rlptD -e ssh $rsyncuser@$rsynchost:$rsyncpath/$domain/subdomain $savepath/subdomain`;
if(file_exists("$savepath/subdomain")){

$subdomainfile = trim(implode ('', file ("$savepath/subdomain")));
$subdomains= split ("\n\n", $subdomainfile);

foreach($subdomains as $subdomain){
  preg_match("/document_root = (.*)/",$subdomain,$matches);
  $document_root=$matches[1];
  $subdomain = explode ("\n", $subdomain);
  $name=str_replace("[","",$subdomain[0]);
  $name=trim(str_replace("]","",$name));
  unset($subdomain[0]);

  if($name=="DEFAULT")
  continue;

  $subdomaincommand="/usr/lib/opcenter/subdomain/AddSubDomain -d $domain";
  foreach($subdomain as $option){
    $option=str_replace(" = ",",",$option);
    $subdomaincommand.=" -c $option";
  }
  $subdomaincommand.=" $name";
  echo "Adding subdomain $name...";
  `$subdomaincommand`;
  `rm -f /home/virtual/$domain/$document_root/index.html`;
  echo "done\n";
}

`rm -f $savepath/subdomain`;
}

}

function check_mysql_user($user){
 global $ary_parsed_file,$mysqlusercount,$mysqluser;
 if (file_exists("/etc/virtualhosting/mappings/mysql.usermap")){
   $mysqlmap=file_get_contents("/etc/virtualhosting/mappings/mysql.usermap");
   preg_match("/$user = /", $mysqlmap, $matches);
//    if($matches[0]!=""){
   if($matches){
      $mysqlusercount++;
      $new="$mysqluser$mysqlusercount";
      $user=check_mysql_user($new);
   }
 }
 return $user;
}

function check_mysql_prefix($prefix){
 global $ary_parsed_file,$mysqlprefixcount,$mysqlprefix;
 if (file_exists("/etc/virtualhosting/mappings/mysql.prefixmap")){
  $mysqlprefixmap=file_get_contents("/etc/virtualhosting/mappings/mysql.prefixmap");
  preg_match("/$prefix = /", $mysqlprefixmap, $matches);
  if($matches){
    $mysqlprefixcount++;
    $new=$mysqlprefix.$mysqlprefixcount."_";
    $prefix=check_mysql_prefix($new);
  }
 }
 return $prefix;
}


function restore($domain){
global $ary_parsed_file,$savepath;
extractxml($domain);
if(check($domain) == false){
echo "!! Restoring $domain !!\n";
passwords($domain);
$xml="$savepath/dump.xml";
makearray($xml);
$ary_parsed_file['CONFIG']['RESELLER']['RESELLER_ID']="0";
$ary_parsed_file['CONFIG']['FRONTPAGE']['ENABLED']="0";
if (is_string($ary_parsed_file['CONFIG']['SITEINFO']['DOMAIN'])){

    $domain=$ary_parsed_file['CONFIG']['SITEINFO']['DOMAIN'];
    $oldadmin=$ary_parsed_file['CONFIG']['SITEINFO']['ADMIN'];
    $db=str_replace(".","_",$domain);
    $addvirtdomain=addvirtdomain();
    $addusers=addusers();


} else {
   // missing dump.xml or corrupt, use defaults
   echo "!! Using defaults !!\n";
   $ary_parsed_file['CONFIG']['SITEINFO']['DOMAIN']=$domain;
   $ary_parsed_file['CONFIG']['SITEINFO']['ADMIN']="admin";

   $addvirtdomain=addvirtdomain();
}
createsite($domain,$addvirtdomain);
if(check($domain)){
deleteindex($domain);
createusers($addusers);
addsubdomains($domain);
extractfiles($domain);
$mysqluser=$ary_parsed_file['CONFIG']['MYSQL']['DBASEADMIN'];
mysqlrestore($domain,$db,$mysqluser);
htaccess($domain,$oldadmin);
delsql($domain);
delxml($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();

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($fp, 4096)) {
if (!($data = utf8_encode($data))) {
echo 'ERROR'."\n";
}
$data=str_replace("users::get_services_defaults examining ssh\n","",$data);
$data=str_replace("users::get_services_defaults examining proftpd\n","",$data);
$data=str_replace("users::get_services_defaults examining cgi\n","",$data);
$data=str_replace("users::get_services_defaults examining telnet\n","",$data);

if (!xml_parse($xml_parser, $data, feof($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);
}

function addvirtdomain(){
global $ary_parsed_file,$passwords,$mysqlusercount,$mysqluser,$mysqlprefixcount,$mysqlprefix;
//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']);

###mysql username check
if (is_string($ary_parsed_file['CONFIG']['MYSQL']['DBASEADMIN'])){
   $mysqluser=$ary_parsed_file['CONFIG']['MYSQL']['DBASEADMIN'];
   $mysqlusercount=1;
   $ary_parsed_file['CONFIG']['MYSQL']['DBASEADMIN']=check_mysql_user($mysqluser);
   if($mysqluser!=$ary_parsed_file['CONFIG']['MYSQL']['DBASEADMIN']){
   echo "!! Changed mysql user to ".$ary_parsed_file['CONFIG']['MYSQL']['DBASEADMIN']." !!\n";
   }
}

###mysql prefix check
if (is_string($ary_parsed_file['CONFIG']['MYSQL']['DBASEPREFIX'])){

   $mysqlprefix=$ary_parsed_file['CONFIG']['MYSQL']['DBASEPREFIX'];
   $mysqlprefixcount=1;
   $ary_parsed_file['CONFIG']['MYSQL']['DBASEPREFIX']=check_mysql_prefix($mysqlprefix);
   if($mysqlprefix!=$ary_parsed_file['CONFIG']['MYSQL']['DBASEPREFIX']){
      echo "!! Changed mysql prefix to ".$ary_parsed_file['CONFIG']['MYSQL']['DBASEPREFIX']." !!\n";
   }
}


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


if(@is_array($ary_parsed_file['CONFIG']['IPINFO']['IPADDRS'])){
$ips="[";
$add2="";
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="[";
$add="";
foreach($ary_parsed_file['CONFIG']['ALIASES']['ALIASES'] as $alias){
$aliases.="$alias$add";
$add=",";
}
$aliases.="]";
$ary_parsed_file['CONFIG']['ALIASES']['ALIASES']=$aliases;
}
$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") AND ($option!="cpasswd")){
$value=strtolower($value);
}

$command.=",$option=$value";
}

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


function addusers(){
global $userarray,$passwords,$domain;
global $savepath,$rsynchost,$rsyncuser,$rsyncpath;
global $ary_parsed_file;

if (is_string($ary_parsed_file['CONFIG']['SITEINFO']['DOMAIN'])){

    $domain=$ary_parsed_file['CONFIG']['SITEINFO']['DOMAIN'];
}

$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!="mysql")AND($username!="ensimrootmail")AND($username!="tomcat4")AND($username!="apache")AND($username!="smmsp")AND($username!="sshd")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";

}



// 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);

} 

}

?>

