phpESXibak - php script for ESXi backup

ESXi Hypervisor
Post Reply
thockman
Site Admin
Posts: 104
Joined: Thu Dec 15, 2005 5:51 pm
Location: Kansas City
Contact:

phpESXibak - php script for ESXi backup

Post by thockman » Wed Oct 01, 2008 7:31 am

Code: Select all

<?php
// ******************************************************************
// Author:	Troy Hockman - Afewteks
// Description:	Backup vms using vmware remote cli and viperl.
// Todo:	Error checking and auto find datastore
// ******************************************************************

// Setup vars
$usr = "root";
$pass = "pass";
$host = "host.domain.com";
$rcli = "/usr/bin";
$vcli = "/usr/lib/vmware-viperl/apps/vm";
$snapn = "VMBak";
$snapd = "VMBak";
$dest = "/mnt/backups/VMs";
$ds = "[datastore1]";
$mailto = "email@domain.com";

// Start script. Change at own risk.
$mess = "Starting.  Getting list of vms.\n\n";
$result = array();
exec("$rcli/vmware-cmd -H $host -U $usr -P $pass -l", &$result);
foreach ($result as $v){
  if ($v){
    // ** Get vmname **
    $n = explode('/',$v);
    $i = 1;
    while ($n[$i]){
      $vmname = $n[$i];
      $i++;
    }
    $vmname = str_replace(".vmx","",$vmname);
    $mess = $mess."Starting on $vmname.  Please wait...\n";
    $on = exec("$rcli/vmware-cmd -H $host -U $usr -P $pass $v getstate");
    if ($on=="getstate() = on"){
      // ** Create snapshots **
      // ** Create vm directory if needed **
      if (!file_exists("$dest/$vmname")) { mkdir("$dest/$vmname"); }
      $mess = $mess."Coping vmx before snapshot..\n";
      exec("$rcli/vifs --url https://$host/sdk/vimService --username $usr --password $pass --get \"$ds $vmname/$vmname.vmx\" \"$dest/$vmname/$f\"");
      $mess = $mess."Creating snapshots...\n";
      exec("$rcli/vmware-cmd -H $host -U $usr -P $pass $v createsnapshot $snapn $snapd 0 0");
    }
    // ** Get file list **
    $mess = $mess."Geting list of files...\n";
    $files = array();
    exec("$rcli/vifs --url https://$host/sdk/vimService --username $usr --password $pass --dir \"$ds $vmname\"", &$files);
    foreach ($files as $f){
      $ext = strrchr($f,'.');
      if ($ext!=".log" && $ext!=".vswp" && $ext!=".vmsn" && $ext!=".vmx" &&strpos($f,"delta") === false){
        trim($f);
        // ** Copy files **
        $mess = $mess."Copying file $f...\n";
        exec("$rcli/vifs --url https://$host/sdk/vimService --username $usr --password $pass --get \"$ds $vmname/$f\" \"$dest/$vmname/$f\"");
      }
    }
    // ** Remove snapshots **
    $mess = $mess."Removing snapshots...\n";
    exec("$vcli/snapshotmanager.pl --url https://$host/sdk/vimService --username $usr --password $pass --operation remove --powerstatus poweredOn --snapshotname $snapn --children 1");
    // ** tar files **
    $mess = $mess."Taring Files...\n";
    exec("tar --remove-files -czf $dest/$vmname/`date +%m%d%Y`_$vmname.tar.gz $dest/$vmname/* --exclude *.tar.gz");
  }
}
$mess = $mess."Thanks.\n";
mail( "$mailto", "Backup for host $host", $mess, "From: backups@domain.com" );


Post Reply

Who is online

Users browsing this forum: No registered users and 0 guests