#!/usr/bin/php
<?php
//ini_set('display_errors', 1);
//ini_set('display_startup_errors', 1);
//error_reporting(E_ALL);

include_once dirname(realpath(__FILE__)) . '/../' . "config.php";
include_once dirname(realpath(__FILE__)) . '/../' . "XenAPI.php";
include_once dirname(realpath(__FILE__)) . '/../' . "XenVm.php";
include_once dirname(realpath(__FILE__)) . '/../' . "XenVIF.php";
include_once dirname(realpath(__FILE__)) . '/../' . "XenFunctions.php";
include_once dirname(realpath(__FILE__)) . '/../' . "XenExceptions.php";

//Reading command args (parameters)
log_and_show("[".date('d/m/y:H.i.s')."] \n");

$argv = $_SERVER['argv'];
if (empty($argv[1]) ){
    log_and_show( "error ! you must specify a valid csv filename : \nexample : ./Xenica VMsData.csv");
    exit;
} 
// log_and_show( "args : ".print_r($argv,true));
$filename = $argv[1];
$whmcs_data = false;
if (count((array)$argv)>2)
    for ($i=2;$i<=count((array)$argv)-1;$i++)
        if (!empty(trim($argv[$i]))){
            //log_and_show( "array {$i} val = {$argv[$i]}");
            if (strtolower($argv[$i])=="-whmcs")
                $whmcs_data = true;
        }
        ;
/*
$args = getopt("a:b:c:"); // in case of using flags: testphp -a valu1 -b valu2 -c valu3
log_and_show( "args : ".print_r($args,true));
*/


// reading csv file :
$file = fopen($filename, 'r');
if($file !== FALSE) {
    $firstline = fgetcsv($file,5000,';');  // the captions Line
    if ((!empty($firstline)) && ($firstline[0] !== "VMs List"))
        $lines[] = $firstline;

    while (!feof($file)) {
        $lines[] = fgetcsv($file,50000,';');
    }
    fclose($file);
}

//print_r($firstline);
//print_r($lines);

//assigning basic variables
$params = array();
if (empty($lines)){
    log_and_show( "Warning ! your csv file is EMPTY! \n");
    exit;    
}

foreach ($lines as $vm_params){
    if (!empty($vm_params)){ 
        $params['username'] = trim($vm_params[0]);
        if (! $whmcs_data) {
            $params['configoption1'] = $vm_params[1] * 1024; //Bandwidth (GB)
            $params['configoption2'] = $vm_params[2]; //CPUs
            $params['configoption3'] = $vm_params[3] * 1024; //Disk (GB)
            $params['configoption4'] = $vm_params[4]; //Memory (MB)
            $params["configoptions"]['Operating System'] =  $vm_params[5] ;
            $params['password'] = $vm_params[6];
            $params['IP'] = $vm_params[7];
            $params['SubMask'] = $vm_params[8];
            $params['Broadcast'] = $vm_params[9];
            $params['GateWay'] = $vm_params[10];
            $params['serverip'] = $vm_params[11];
            $params['serverusername'] = $vm_params[12];
            $params['serverpassword'] = $vm_params[13] ;
            $params['serverhttpprefix'] = $vm_params[14];
        } else {
$result = Xenica_DB_Query("SELECT h.id,h.password,h.dedicatedip,ip.submask,ip.broadcast,ip.gw, s.ipaddress,s.username,s.password as spassword,s.secure , p.configoption1,p.configoption2,p.configoption3,p.configoption4 FROM `tblhosting` as h , tblservers as s , `tblproducts` as p, `xenica_ip_assigned` as ip where h.`username` = '%s' AND h.`server` = s.id AND h.`packageid` = p.id AND `dedicatedip`=ip.`ipaddress`",array($params['username']),"DB Error!",false);
//log_and_show( "tblhosting data : ".print_r($result[0],true));
    if (!$result) 
    log_and_show( "Can't get ALL [{$params['username']}] DATA from whmcs DB !  ");
    else{  
            $params['configoption1'] = $result[0]['configoption1']; //Bandwidth (GB)
            $params['configoption2'] = $result[0]['configoption2']; //CPUs
            $params['configoption3'] = $result[0]['configoption3']; //Disk (GB)
            $params['configoption4'] = $result[0]['configoption4']; //Memory (MB)
            $params['password'] = Xenica_decrypt($result[0]['password']);
            $params['IP'] = $result[0]['dedicatedip'];
            $params['SubMask'] = $result[0]['submask'];
            $params['Broadcast'] = $result[0]['broadcast'];
            $params['GateWay'] = $result[0]['gw'];
            $params['serverip'] = $result[0]['ipaddress'];
            $params['serverusername'] = $result[0]['username'];
            $params['serverpassword'] = Xenica_decrypt($result[0]['spassword']) ;
            
            if ($result[0]['secure']=="on")
            $params['serverhttpprefix'] = "https";
            else
            $params['serverhttpprefix'] = "http";
            
            $result = Xenica_DB_Query("SELECT pcos.optionname FROM `tblhostingconfigoptions` as hco ,`tblproductconfigoptions` as pco ,`tblproductconfigoptionssub` as pcos where (hco.relid={$result[0]['id']} AND pco.optionname = 'Operating System' AND hco.configid=pco.id AND hco.optionid= pcos.id AND pcos.configid=hco.configid )",null,"DB Error!",false);
    if ($result)
    $params["configoptions"]['Operating System'] =  $result[0]['optionname'] ;
    }
        }
       // print_r($params); 
        if (empty($params['IP']))
        log_and_show( "Error! Data is not completed \n");
        else
        Xenica_CreateAccount($params); 
      
    } //if !empty
}
//print_r($params);


function Xenica_CreateAccount($params) {
    if (!Xenica_Server_checkLicense())
    return;

    //print_r($params);

    $username = $params['username'];
    $os = $params["configoptions"]['Operating System'];
    $vcpus = $params['configoption2'];
    $HDsizeinMB = $params['configoption3'];
    $memoryinMB = $params['configoption4'];


    log_and_show( "\n\n Start Creating {$username} . . .");

    try {
        $IpMySqlResult = array(0=>array("ipaddress"=>$params['IP'],"submask"=>$params['SubMask'],"broadcast"=>$params['Broadcast'],"gw"=>$params['GateWay']),);


        $server = new Xenica_Server_XenAPI($params['serverhttpprefix'] . "://" . $params['serverip'], $params['serverusername'], $params['serverpassword']);
        if ($server->isConnected()){
            if ($server->isLoggedIn()) {

                //delete the old vm
                $vm = new Xenica_Server_XenVm($server, $params['username']);

                // destry the VM
                 $vm->destroy();



                $vm = new Xenica_Server_XenVm($server, $os);

                //$vm->setXenStoreData($IpMySqlResult);
                //echo "Xenica_Server_XenVm create with os : $os";
                // create a new VM from VMtemplate VM
                // auto interface=eth0 hostname=$name domain=$domain  netcfg/get_hostname=$name netcfg/get_domain=$domain netcfg/disable_dhcp=true netcfg/dhcp_failed netcfg/get_nameservers=$dns netcfg/get_ipaddress=$ip netcfg/get_netmask=$netmask netcfg/get_gateway=$gateway netcfg/confirm_static=true netcfg/choose_interface=eth0
                $dns = SERVARICA_DNS;



                $IpMySqlResult["dns"] = $dns;
                $IpMySqlResult["hostname"] = clean_hostname($params['domain']);
                $IpMySqlResult["serviceid"] = $params['serviceid'];
                $IpMySqlResult["passwd"] = $params['password'];

                $request = $vm->cloneVM(null,$IpMySqlResult, $username, $vcpus, $HDsizeinMB, $memoryinMB,$params);

                if ($request === false) {
                    log_and_show( "couldnt create VM, clonning of template didnt success ," . trim($request));
                    return "install Operation Failed! clonning of template didnt success <br/>You need to let Support know." . trim($request);
                }


                log_and_show( " success \n");
		
                return "success";
		
            }else // server is logged in
                log_and_show( "Authentication failure with Xen server ! ");
        }else //  server is connected
        log_and_show(  "Can't Connect the Xen Server {$params['serverip']} ! ");



    } catch (Exception $e) {
        log_and_show( "re/install failed:" . print_r($e->getMessage()));
        return "UnIdentified erro occured" . $e->getMessage();
    }

    return "failed";
}


function log_and_show($s) {
echo $s."\n";
    try {
        file_put_contents("log.txt",  $s."\n" , FILE_APPEND );
    } catch (Exception $e) { }
}

log_and_show("______________________________________________\n\n");