In beta3, a new Perl binding was added for the Vix C API. It got left out
of the Release Notes, so I wanted to point it out in this forum. Here's
a sample app to get you started. Note that this has minimal testing, etc,
but it worked for me.
The binding can be found in a tarball in /usr/lib/vmware or \Program Files\VMWare\VMWare Vix
#!/usr/bin/perl
#
\# perl implementation of vmrun
#
\# Copyright 2006. VMware, Inc. The use of this code is subject to
\# your agreement to the terms of an applicable VMware license.
#
\# find stuff in blib so we can be run from the build area:
\# .../bora/build/obj/apps/foundryPerl/5.008001/vix-perl
#use lib qw\{ blib/lib blib/auto };
#
\# the vix-perl release can be found in vix-perl.tar in
\# /usr/lib/vmware (default) or \Program Files\VMWare\VMWware Vix
#
use strict;
use VMware::Vix::Simple;
\# all constants are exported
use VMware::Vix::API::Constants;
my $hostname = undef;
my $port = 0;
my $username = undef;
my $password = undef;
my $hosthandle = VIX_INVALID_HANDLE;
my $vmpath = undef;
my $vmhandle = VIX_INVALID_HANDLE;
my $command = undef;
my @arglist;
sub usage() {
print "Usage: $0 \[authentication flags] COMMAND \[PARAMETERS]\n";
print "authentication flags:\n";
print "\t-host \n";
print "COMMAND PARAMETERS DESCRIPTION\n";
print "start path to vmx Start a VM\n";
print "stop path to vmx Stop a VM\n";
print "reset path to vmx Reset a VM\n";
print "suspend path to vmx Suspend a VM\n";
print "upgrade path to vmx Upgrade VM file format a
nd virtual hardware\n";
print "installtools path to vmx Install Tools in Guest O
S\n";
print "listSnapshot path to vmx List snapshots in a VM\n
";
print "snapshot path to vmx Takes a snapshot of a VM
\n";
print "deleteSnapshot path to vmx Remove a snapshot from a
VM\n";
print "revertToSnapshot path to vmx Revert to a snapshot fro
m a VM\n";
print "list List all running VMs\n";
exit 0;
}
sub mydie($$) {
my ($errstring, $err) = @_;
die "$errstring: ", GetErrorText($err), "($err)\n";
}
sub listhosts() {
}
sub listvms($) {
my ($hh) = @_;
my @vmlist = FindRunningVMs($hh, 300);
my $err = shift @vmlist;
foreach (@vmlist) {
print "VM: $_\n";
}
}
sub startvm($) {
my ($vh) = @_;
my $err = VMPowerOn($vh, 0, VIX_INVALID_HANDLE);
mydie("Failed to power on VM", $err) if $err != VIX_OK;
}
sub stopvm($) {
my ($vh) = @_;
my $err = VMPowerOff($vh, 0);
mydie("Failed to power off VM", $err) if $err != VIX_OK;
}
sub resetvm($) {
my ($vh) = @_;
my $err = VMReset($vh, 0);
mydie("Failed to reset VM", $err) if $err != VIX_OK;
}
sub suspendvm($) {
my ($vh) = @_;
my $err = VMSuspend($vh, 0);
mydie("Failed to suspend VM", $err) if $err != VIX_OK;
}
sub upgradevm($) {
my ($vh) = @_;
my $err = VMUpgradeVirtualHardware($vh, 0);
mydie("Failed to upgrade virtual hardware", $err) if $err != VIX_OK;
}
sub installtools($) {
my ($vh) = @_;
my $err = VMInstallTools($vh, 0, undef);
mydie("Failed to install tools", $err) if $err != VIX_OK;
}
\# XXX only one now, and nothing interesting
sub listsnapshots($) {
my ($vm) = @_;
my $err;
my $numSnapShots;
($err, $numSnapShots) = VMGetNumRootSnapshots($vm);
mydie("Getting snapshots", $err) if $err != VIX_OK;
print "$numSnapShots snapshots found\n";
\# XXX get its name, etc, when that's meaningful
}
\# XXX expose name/description when its meaningful
sub createsnapshot($) {
my ($vm) = @_;
my $err;
my $ss;
($err, $ss) = VMCreateSnapshot($vm, "Snapshot", "Snapshot from $0", 0, VIX_IN
VALID_HANDLE);
mydie("Creating snapshot", $err) if $err != VIX_OK;
ReleaseHandle($ss);
}
sub deletesnapshot($) {
my ($vm) = @_;
my $err;
my $ss;
my $num;
($err, $num) = VMGetNumRootSnapshots($vm);
mydie("Getting snapshots", $err) if $err != VIX_OK;
return if ($num == 0);
($err, $ss) = VMGetRootSnapshot($vm, 0);
mydie("Getting snapshot handle", $err) if $err != VIX_OK;
$err = VMRemoveSnapshot($vm, $ss, 0);
mydie("Removing snapshot", $err) if $err != VIX_OK;
ReleaseHandle($ss);
}
sub revertsnapshot($) {
my ($vm) = @_;
my $err;
my $ss;
my $num;
($err, $num) = VMGetNumRootSnapshots($vm);
mydie("Getting snapshots", $err) if $err != VIX_OK;
return if ($num == 0);
($err, $ss) = VMGetRootSnapshot($vm, 0);
mydie("Getting snapshot handle", $err) if $err != VIX_OK;
$err = VMRevertToSnapshot($vm, $ss, 0, VIX_INVALID_HANDLE);
mydie("Reverting to snapshot", $err) if $err != VIX_OK;
ReleaseHandle($ss);
}
sub openvm($$) {
my ($hh, $vmpath) = @_;
my $err;
my $handle;
($err, $handle) = VMOpen($hh, $vmpath);
mydie("Failed to open VM $vmpath", $err) if $err != VIX_OK;
return $handle;
}
sub host_connect($$$$) {
my ($hostname, $port, $username, $password) = @_;
my $err;
my $handle;
($err, $handle) = HostConnect(VIX_API_VERSION,
VIX_SERVICEPROVIDER_VMWARE_SERVER,
$hostname, $port, $username, $password,
0, VIX_INVALID_HANDLE);
mydie("Connect Failed", $err) if $err != VIX_OK;
return $handle;
}
sub docommand($@) {
my ($command, @arglist) = @_;
if (lc($command) eq "start") {
$vmpath = shift(@arglist);
$vmhandle = openvm($hosthandle, $vmpath);
startvm($vmhandle);
} elsif (lc($command) eq "stop") {
$vmpath = shift(@arglist);
$vmhandle = openvm($hosthandle, $vmpath);
stopvm($vmhandle);
} elsif (lc($command) eq "reset") {
$vmpath = shift(@arglist);
$vmhandle = openvm($hosthandle, $vmpath);
resetvm($vmhandle);
} elsif (lc($command) eq "suspend") {
$vmpath = shift(@arglist);
$vmhandle = openvm($hosthandle, $vmpath);
suspendvm($vmhandle);
} elsif (lc($command) eq "upgrade") {
$vmpath = shift(@arglist);
$vmhandle = openvm($hosthandle, $vmpath);
upgradevm($vmhandle);
} elsif (lc($command) eq "installtools") {
$vmpath = shift(@arglist);
$vmhandle = openvm($hosthandle, $vmpath);
installtools($vmhandle);
} elsif (lc($command) eq "listsnapshots") {
$vmpath = shift(@arglist);
$vmhandle = openvm($hosthandle, $vmpath);
listsnapshots($vmhandle);
} elsif (lc($command) eq "snapshot") {
$vmpath = shift(@arglist);
$vmhandle = openvm($hosthandle, $vmpath);
createsnapshot($vmhandle);
} elsif (lc($command) eq "deletesnapshot") {
$vmpath = shift(@arglist);
$vmhandle = openvm($hosthandle, $vmpath);
deletesnapshot($vmhandle);
} elsif (lc($command) eq "reverttosnapshot") {
$vmpath = shift(@arglist);
$vmhandle = openvm($hosthandle, $vmpath);
revertsnapshot($vmhandle);
} elsif (lc($command) eq "list") {
listvms($hosthandle);
} else {
print "Unrecognized command \"$command\"\n";
usage();
}
}
my $arg;
@arglist = @ARGV;
while ($#arglist != -1) {
$arg = shift(@arglist);
if (!($arg =~ /^-/)) {
$command = $arg;
last;
}
if ($arg =~ /^-h(ost)?$/) {
$hostname = shift(@arglist);
} elsif ($arg =~ /^-P(ort)?$/) {
$port = shift(@arglist);
} elsif ($arg =~ /^-u(sername)?$/) {
$username = shift(@arglist);
} elsif ($arg =~ /^-p(assword)?$/) {
$password = shift(@arglist);
} else {
print "Unrecognized switch \"$arg\"\n";
usage();
}
}
$hosthandle = host_connect($hostname, $port, $username, $password);
if (defined($command)) {
docommand($command, @arglist);
}
\# EOF