Quantcast
Channel: VMware Communities : Popular Discussions - VMware Server Archives
Viewing all articles
Browse latest Browse all 69891

Perl bindings to Vix API

$
0
0

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

 

/code


Viewing all articles
Browse latest Browse all 69891

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>