Scripting API
Scripting API
Scripting API
User’s Manual
Version 2.0
Please note that you will always find the most up-to-date technical docu-
mentation on our Web site at http://www.vmware.com/support/.
VMware, Inc.
The VMware Web site also provides the latest product updates.
3145 Porter Drive
Copyright © 2002-2003 VMware, Inc. All rights reserved. Protected by one or more of U.S. Patent Nos. 6,397,242
Palo Alto, CA 94304
and 6.496.847; patents pending. VMware, the VMware “boxes” logo, GSX Server and ESX Server are trademarks
www.vmware.com of VMware, Inc. Microsoft, Windows, Windows NT, Visual C++, Visual Basic, JScript, and ActiveX are registered
trademarks of Microsoft Corporation. Linux is a registered trademark of Linus Torvalds. All other marks and
names mentioned herein may be trademarks of their respective companies.
Table of Contents
Introduction __________________________________________________ 7
VMware Scripting APIs ___________________________________________ 8
Supported Products ___________________________________________ 9
Intended Audience ___________________________________________ 9
Getting Support from VMware __________________________________ 9
Using the VMware Scripting APIs ___________________________________ 9
Installing the VMware Scripting API _________________________________ 9
Installing the VMware Scripting API on a Windows Machine ___________ 10
Installing VmPerl Scripting API on a Linux Machine __________________ 11
www.vmware.com 3
Using Sample VmCOM Programs ________________________________ 29
Sample VmCOM Programs _______________________________________ 30
Copyright Information ________________________________________ 30
MiniMUI Visual Basic Sample Program ____________________________ 31
JScript and VBScript Sample Programs ___________________________ 31
4 www.vmware.com
Error Codes and Event Logging _________________________________ 81
Error Codes and Event Logging ___________________________________ 82
Error Codes ___________________________________________________ 82
Error Handling for the VmCOM Library ___________________________ 82
Error Handling for the VmPerl Library ____________________________ 82
Common VmCOM and VmPerl Errors ____________________________ 83
Event Logging ________________________________________________ 84
Using the Event Viewer _______________________________________ 85
Reading the Event Log ________________________________________ 86
Index _______________________________________________________ 97
www.vmware.com 5
1
Introduction
Introduction
VmCOM
VmPerl
GSX Server on a Windows host
VmPerl
Although the interfaces for VmCOM and VmPerl are different, both components are functionally
equivalent. Depending on your operating system, you can either use VmCOM or VmPerl to
accomplish the same tasks.
VMware has designed VmCOM and VmPerl to provide task automation and simple, single-purpose
user interfaces. The Scripting APIs are not intended for building advanced interactive user interfaces.
For example, you can use the VMware Scripting APIs to perform power operations (start, stop,
suspend or reset) on VMware servers and virtual machines, locally and remotely across servers. You
can also use the API to register and unregister virtual machines and gather information about them,
including sending and receiving configuration to a virtual machine. You can also send properties you
define, from the host or a script, into a virtual machine's guest operating system and vice versa.
We provide example scripts and applications demonstrating possible uses for the Scripting APIs. The
directory in which you installed VmCOM contains two subdirectories; MiniMUI, that contains a
sample Visual Basic project that uses VmCOM, and SampleScripts, that contains sample VmCOM
4 www.vmware.com
Introduction
scripts. Similarly, the directory in which you installed VmPerl contains a subdirectory, SampleScripts,
that contains sample VmPerl scripts.
Supported Products
We support the installation of the VmCOM and VmPerl Scripting APIs on VMware™ GSX Server™ 2.x.
Refer to the VMware GSX Server User's Manual for complete information on system requirements at
www.vmware.com/support/gsx25/doc.
Intended Audience
This manual is written for programmers that are familiar with either the Perl language or the
Component Object Model (COM) interface for programming languages. Readers of this manual
should be comfortable with developing system administration and system monitoring programs and
general debugging techniques. In addition, developers who use this manual should be familiar with
the operation and management of VMware GSX Server and the host operating system used for this
application. For more information on VMware GSX Server refer to the VMware GSX Server User's Manual
at www.vmware.com/support/gsx25/doc.
www.vmware.com 5
Introduction
script or executable file, or ask you to download it from the VMware Management Interface (requires
customization).
6 www.vmware.com
Introduction
www.vmware.com 7
2
Using VmCOM
Using VmCOM
What is VmCOM?
The VmCOM component exposes VmServerCtl and VmCtl as the primary objects for
communicating with VMware components. VmConnectParams, VmCollection and
VmQuestion are support objects used as inputs or outputs to the methods and properties of the
primary objects.
A VmServerCtl object represents a server and exports server-level services, such as virtual
machine enumeration and registration. A VmCtl object represents a virtual machine on a particular
server and provides virtual machine specific methods such as power operations. You must first
activate the VmServerCtl or VmCtl object by calling its Connect() method before accessing
any other method.
The Connect() method requires a VmConnectParams input parameter containing the host
identifier and user credentials supplied for authentication. If the host identifier is not supplied or is
undefined, the authentication is performed on the local system. If the user name and password are
also not supplied, the current user is authenticated on the local machine. Otherwise, you may supply
the user name and password for authentication as that user.
Unlike the VmServerCtl object, VmCtl.Connect() also takes a string specifying the
configuration file name of the virtual machine that will be connected.
Once a VmServerCtl object is connected, you can enumerate the virtual machines on the server,
and register or unregister the virtual machines. You can obtain a list of virtual machines on a
particular server from the VmServerCtl.RegisteredVmNames property. This property returns
a collection object named VmCollection. The collection’s elements comprise virtual machine
configuration file names and you can enumerate these elements using, for example, the for each
syntax in Visual Basic. If you know the configuration file name of a specific virtual machine, you can
connect the VmCtl object directly without using a VmServerCtl object.
You can use languages such as Visual Basic or Visual C++ to access VmCOM components. For
example, to use VmCOM from Visual Basic, choose Project > References, and enable the check box
for VMware VmCOM <version> Type Library. If this entry is not present, verify that the VMware
product is installed correctly.
To use VmCOM from another language, refer to the documentation for that language. Look for the
section in the documentation that describes ActiveX® components or the COM interface for that
language.
10 www.vmware.com
Using VmCOM
VmCOM Objects
The VmCOM component provides the following objects:
• VmConnectParams
• VmServerCtl
• VmCollection
• VmCtl
• VmQuestion
VmConnectParams
This object supplies connection information and user credentials to VmServerCtl.Connect()
or VmCtl.Connect() and exposes the properties listed in the following table. All
VmConnectParams properties allow you to retrieve (GET) and modify (PUT) these properties.
The security for your connection depends upon the security configuration of your VMware server. If
you’re connecting to a VMware server or a virtual machine on a host with GSX Server, then the
connections is encrypted as long as the VMware server is configured to encrypt connections.
www.vmware.com 11
Using VmCOM
VmServerCtl
The VmServerCtl object represents a VMware server running on a particular machine.
Property
The RegisteredVmNames read-only (GET) property returns a VmCollection of strings
specifying the configuration file names of the virtual machines currently registered on the server. The
server must be connected using Connect(), or this property throws an error.
Methods
The VmServerCtl object also exposes the methods listed in the following table. Except where
noted otherwise, these methods are synchronous; the method does not return until it finishes its
operation, fails, or times out. Most operations time out after 2 minutes.
Method Description
object.Connect(<params>) The Connect() method connects the object to a VMware GSX Server or a VMware
ESX Server where params is a VmConnectParams object that specifies the
system and user information.
There is no method to disconnect from a server. To reconnect to a different server,
destroy the VmServerCtl object, create a new one, then call its Connect()
method.
The total number of connected VmCtl and VmServerCtl objects cannot
exceed 62. The Connect() method fails with error code
vmErr_INSUFFICIENT_RESOURCES if this limit is reached. In order to connect new
objects, destroy one or more connected VmCtl or VmServerCtl objects. For
example, you can do this by setting an object to Nothing in Visual Basic.
object.RegisterVm(<vmName>) The RegisterVm method registers a virtual machine on a server where vmName
is a string specifying the virtual machine’s configuration file name.
object.UnregisterVm(<vmName>) The UnRegisterVm method unregisters a virtual machine from a server where
vmName is a string specifying the virtual machine’s configuration file name.
VmCollection
The VmCollection object is a collection of variants that are typically strings. You can enumerate
its elements by using the for each syntax in Visual Basic. You can individually access each element
by passing its index to the Item property, or by using the
VmCollection(<index_as_integer>) array syntax in Visual Basic. The first element's index
is always the integer 1 (one).
12 www.vmware.com
Using VmCOM
VmCtl
The VmCtl object represents a virtual machine running on a particular server machine and exposes
symbolic constant enumerations, properties and methods.
Properties
The VmCtl object includes the properties listed in the following table. All of the properties can be
retrieved (GET); some of these properties can also be modified (PUT).
www.vmware.com 13
Using VmCOM
14 www.vmware.com
Using VmCOM
Methods
The VmCtl object includes the methods listed in the following table.
You can connect to a virtual machine, start, stop, suspend and resume virtual machines, query and
modify the configuration file settings, and connect and disconnect devices.
Except where noted otherwise, these methods are synchronous; the method does not return until it
finishes its operation, fails or times out. Most operations time out after 2 minutes, except for power
operations, which time out after 4 minutes.
www.vmware.com 15
Using VmCOM
Method Description
object.Connect(<params>, <vmName>) The Connect() method establishes a connection with a virtual machine
where params is a VmConnectParams object that specifies the
system and user information and vmName is a string specifying the virtual
machine’s configuration file name.
You should use this as the first method invoked on a VmCtl object. You
must first activate the VmCtl object by calling its Connect() method
before accessing any other method or property.
There is no method to disconnect from a virtual machine. To reconnect to a
different virtual machine, destroy the VmCtl object, create a new one, then
call its Connect() method.
The total number of connected VmCtl and VmServerCtl objects
cannot exceed 62. The Connect() method fails with error code
vmErr_INSUFFICIENT_RESOURCES if this limit is reached. In order to connect
new objects, destroy one or more connected VmCtl or VmServerCtl
objects. For example, you can do this by setting an object to Nothing in
Visual Basic.
object.Start(<mode>) The Start() method powers on a previously powered-off virtual
machine or resumes a suspended virtual machine, where mode is a
VmPowerOpMode object that specifies the Start operation’s behavior. For
more information, see VmPowerOpMode on page 19.
If the virtual machine is powered off, then it is powered on. If it is suspended,
this method resumes the virtual machine. If the virtual machine is in any
other state, the Start() method fails and throws an error.
object.Stop(<mode>) The Stop() method shuts down and powers off a virtual machine where
mode is a VmPowerOpMode object that specifies the Stop operation’s
behavior. For more information, see VmPowerOpMode on page 19.
This method always fails if the virtual machine is not in the
vmExecutionState_On state.
object.Reset(<mode>) The Reset() method shuts down, then reboots a virtual machine where
mode is a VmPowerOpMode object that specifies the operation’s
behavior. For more information, see VmPowerOpMode on page 19.
This method always fails if the virtual machine is not in the
vmExecutionState_On state.
16 www.vmware.com
Using VmCOM
Method Description
object.Suspend(<mode>) The Suspend() method suspends a virtual machine where mode is a
VmPowerOpMode object that specifies the Suspend operation’s behavior.
It saves the current state of the virtual machine to a suspend file. For more
information, see VmPowerOpMode on page 19.
This method always fails if the virtual machine is not in the
vmExecutionState_On state. If you attempt to suspend a virtual
machine with more the 2GB of memory, the suspend operation will time fail
after a time-out period.
object.AnswerQuestion(<question>, <choice>) The AnswerQuestion() method replies to a question where
question is a VmQuestion object that represents the question that
requires an answer and choice represents the index of the selected
answer to the question. The index is an integer and the first choice’s index is
always 1 (one). The second choice’s index is 2, and so on.
When a virtual machine is in the vmExecutionState_Stuck state
and requires user input to continue, use this method to answer the current
question or dismiss the current error message.
First, get a VmQuestion object from VmCtl.PendingQuestion.
You can retrieve the possible choices and their respective indices from the
VmQuestion.Choices property. Then, use the AnswerQuestion
method to answer the question.
object.ConnectDevice(<devName>) The ConnectDevice() method sets a virtual device to the connected
state where devName is a string that identifies the virtual device you want
to connect. The virtual machine must be powered on for this method to
succeed, otherwise a vmErr_BADSTATE error is returned.
Use the Config() property to set configuration parameters relevant to
the virtual device before calling the ConnectDevice() method. The
following code example illustrates connecting a virtual drive to a CD image
file:
vm.Config("ide1:0.devicetype") = "cdrom-image"
vm.Config("ide1:0.filename") = "/iso/foo.iso"
vm.ConnectDevice("ide1:0")
object.DisconnectDevice(devName) The DisconnectDevice() method sets a virtual device to the
disconnected state where devName is a string that identifies the virtual
device you want to disconnect. The virtual machine must be powered on for
this method to succeed, otherwise a vmErr_BADSTATE error is returned.
www.vmware.com 17
Using VmCOM
VmQuestion
The VmQuestion object is created and returned by VmCtl.PendingQuestion(). It describes
a question or error condition requiring user input. Once the script selects one of the possible answers,
it passes the object and the selected answer as inputs to VmCtl.AnswerQuestion().
The VmQuestion object includes the read-only (GET) properties listed in the following table:
VmExecutionState
The VmExecutionState symbolic constant enumeration specifies the state (or condition) of a
virtual machine. The possible values are listed in the following table:
18 www.vmware.com
Using VmCOM
VmPowerOpMode
The VmPowerOpMode symbolic constant enumeration specifies the behavior of a power transition
(start, stop, reset, or suspend) method.
During a soft power transition, the VMware Tools service runs a script inside the guest operating
system. For example, the default scripts that run during suspend and resume operations, respectively
release and renew DHCP leases, for graceful integration into most corporate LANs. You may also
customize these scripts. For more information on these scripts, see www.vmware.com/support/gsx25/
doc/tools_gsx.html. Refer to the section on executing scripts.
The following table includes the possible values for a VmPowerOpMode symbolic constant
enumeration.
www.vmware.com 19
Using VmCOM
VmProdInfoType
VmProdInfoType symbolic constant enumeration specifies the type of product information
when reading the ProductInfo property.
VmProduct
The VmProduct symbolic constant enumeration denotes a VMware product type. The
ProductInfo property returns this information when the requested product information type is
vmProdInfo_Product.
VmPlatform
The VmPlatform symbolic constant enumeration denotes a VMware machine’s platform type. The
ProductInfo property returns this information when the requested product information type is
vmProdInfo_Platform.
20 www.vmware.com
Using VmCOM
GuestInfo Variables
You pass to the virtual machine variables you define yourself. What you pass is up to you, but you
might find it useful to pass items like the virtual machine’s IP address, Windows system ID (SID, for
Windows guest operating systems) or machine name.
This is useful in situations where you want to deploy virtual machines on a network using a common
configuration file, while providing each machine with its own unique identity. By providing each
virtual machine with a unique identifying string, you can use the same configuration file to launch
the same nonpersistent virtual disk multiple times in a training or testing environment, where each
virtual machine would be unique on the network. Note that in the case of persistent or undoable
disks, each virtual disk file must be copied into its own directory if it shares its file name with another
virtual disk file.
When a virtual machine process is created on the server, all GuestInfo variables are initially undefined.
A GuestInfo variable is created the first time it is written.
www.vmware.com 21
Using VmCOM
You identify a GuestInfo variable with a key name. You can define and create any number of
GuestInfo variable key names. The information you pass is temporary, lasting until the virtual machine
is powered off and all consoles connected to the virtual machine are closed.
22 www.vmware.com
Using VmCOM
www.vmware.com 23
3
Using Sample VmCOM Programs
Using Sample VmCOM Programs
Copyright Information
Each sample script and sample program included with the VmCOM Scripting API includes a
copyright. However, for brevity, we do not include this copyright in its entirety with each sample
script and sample program in this manual. Instead, we include the first line of the copyright followed
by ellipses, to indicate its placement. The complete copyright is as follows:
Copyright (c) 1999-2003 VMware, Inc.
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
The names "VMware" and "VMware, Inc." must not be used to endorse or promote
products derived from the Software without the prior written permission of
VMware, Inc.
Products derived from the Software may not be called "VMware", nor may
"VMware" appear in their name, without the prior written permission of
VMware, Inc.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
VMWARE,INC. BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
26 www.vmware.com
Using Sample VmCOM Programs
www.vmware.com 27
Using Sample VmCOM Programs
compatible operating systems. To run a script under a different environment, such as an ASP or HTML
page, refer to that environment’s documentation.
Each sample program comprises two files: a script, with a .js (JScript) or .vbs (VBScript) extension,
and the accompanying Windows Script File with the same name and the .wsf extension. For
example, the first sample program consists of the files sample1.js and sample1.wsf. Both the
script and the associated .wsf file must be in the same directory when you execute the sample
program.
To execute a sample program, type the following in a command line window:
cscript //nologo sample<n>.wsf
where <n> is the sample program number.
Note: The cscript command loads the Windows Script Host environment and is included with
the supported operating system. The .js or .vbs script contains the program’s actual logic. The
associated .wsf file defines and initializes an execution environment for the script. In this example,
the .wsf file loads VmCOM’s type library to allow the script to use VmCOM’s symbolic constants. For
more information on symbolic constants, see Properties on page 13.
//
// VmCOM JScript Sample Script (sample1)
// Copyright (c) 1999-2003 VMware, Inc.
// .
// .
// .
// This program is for educational purposes only.
// It is not to be used in production environments.
//
// Description:
//
// This script displays the virtual machines on the local server.
// It prints the configuration file path and current execution
// state of each VM. If a VM is in the stuck state, the current
// question and its choices are also printed.
28 www.vmware.com
Using Sample VmCOM Programs
//
// Instructions for Windows 2000 and later operating systems:
//
// - save the contents of this file to a file named 'sample1.js'
// unless it's already named that way
//
// - there should be an accompanying file named 'sample1.wsf'
// It is placed in the same directory as this file during
// product installation. This file is responsible for setting
// up the Windows Script Host environment and loading the
// VmCOM type library, thereby enabling this script to
// reference symbolic constants such as vmExecutionState_On
//
// - in a command line window, type:
// cscript //nologo sample1.wsf
//
cp = WScript.CreateObject("VmCOM.VmConnectParams");
server = WScript.CreateObject("VmCOM.VmServerCtl");
server.Connect(cp)
vmCollection = server.RegisteredVmNames
vmName = vmCollection(j);
vm = WScript.CreateObject("VmCOM.VmCtl");
vm.Connect(cp, vmName);
if (execStateString == "STUCK") {
question = vm.PendingQuestion;
str += " pending question='" + question.text + "' choices=";
choices = question.choices
for (i = 1; i <= choices.count; i ++) {
str += "[" + choices(i) + "] ";
}
}
WScript.Echo(str);
}
function State2Str(vm) {
www.vmware.com 29
Using Sample VmCOM Programs
switch (vm.ExecutionState) {
case vmExecutionState_On:
return "ON";
break;
case vmExecutionState_Off:
return "OFF";
break;
case vmExecutionState_Suspended:
return "SUSPENDED";
break;
case vmExecutionState_Stuck:
return "STUCK";
break;
default:
return "UNKNOWN";
break;
}
}
The source for the sample program 1 accompanying Windows Script File is in the SampleScripts
folder in the VmCOM Scripting API directory.
You can also find it on the VMware Web site, saved with a .TXT extension for online viewing, at
www.vmware.com/support/developer/scripting-API/doc/sample1.wsf.txt.
Note: If you are using Microsoft® Internet Explorer as your browser, select View > Source to view the
file. Alternately, right-click this link and download this file.
<job id="Sample1">
<reference object="VmCOM.VmCtl" />
<script language="JScript" src="sample1.js" />
</job>
30 www.vmware.com
Using Sample VmCOM Programs
the server product or different language version of the VMware server product. This sample program
is for example purposes only and is written for VMware GSX Server 2.x.
The source for the sample program 2 script is in the SampleScripts folder in the VmCOM Scripting API
directory.
You can also find it on the VMware Web site, saved with a .TXT extension for online viewing, at
www.vmware.com/support/developer/scripting-API/doc/sample2.vbs.txt.
'
' VmCOM VBScript Sample Script (sample2)
' Copyright (c) 1999-2003 VMware, Inc.
' .
' .
' .
' This program is for educational purposes only.
' It is not to be used in production environments.
'
' Description:
'
' This script displays the virtual machines on the local server.
' It prints the configuration file path and current execution
' state of each VM. If a VM is in the stuck state, the current
' question and its choices are also printed.
' Additionally, if a VM is stuck on an undoable disk related
' question, the script automatically answers 'Keep' on a power-off
' and 'Append' on a power-on.
'
' NOTE: the question-answering logic used is language and product
' dependent, and is only provided for illustration purposes only!
'
' Instructions for Windows 2000 and later operating systems:
'
' - save the contents of this file to a file named 'sample2.vbs'
' unless it's already named that way
'
' - there should be an accompanying file named 'sample2.wsf'
' It is placed in the same directory as this file during
' product installation. This file is responsible for setting
' up the Windows Script Host environment and loading the
' VmCOM type library, thereby enabling this script to
' reference symbolic constants such as vmExecutionState_On
'
' - in a command line window, type:
' cscript //nologo sample2.wsf
'
www.vmware.com 31
Using Sample VmCOM Programs
Set cp = CreateObject("VmCOM.VmConnectParams")
Set server = CreateObject("VmCOM.VmServerCtl")
server.Connect cp
Set vmCollection = server.RegisteredVmNames
end if
32 www.vmware.com
Using Sample VmCOM Programs
WScript.Echo(s)
next
function State2Str(vm)
select case vm.ExecutionState
case vmExecutionState_On
State2Str = "ON"
case vmExecutionState_Off
State2Str = "OFF"
case vmExecutionState_Suspended
State2Str = "SUSPENDED"
case vmExecutionState_Stuck
State2Str = "STUCK"
case else
State2Str = "UNKNOWN"
end select
end function
The source for the sample program 2 accompanying Windows Script File is in the SampleScripts
folder in the VmCOM Scripting API directory.
You can also find it on the VMware Web site, saved with a .TXT extension for online viewing, at
www.vmware.com/support/developer/scripting-API/doc/sample2.wsf.txt.
Note: If you are using Microsoft Internet Explorer as your browser, select View > Source to view the
file. Alternately, right-click this link and download this file.
<job id="Sample2">
<reference object="VmCOM.VmCtl" />
<script language="VBScript" src="sample2.vbs" />
</job>
www.vmware.com 33
Using Sample VmCOM Programs
Set the program’s argument to the path of the script’s .wsf file. Refer to the Microsoft Windows 2000
Resource Kit documentation for more details. If you choose to use a different tool, then refer to your
specific tool’s documentation to configure the script to run as a service.
The source for the sample program 3 script is in the SampleScripts folder in the VmCOM Scripting API
directory.
You can also find it on the VMware Web site, saved with a .TXT extension for online viewing, at
www.vmware.com/support/developer/scripting-API/doc/sample3.vbs.txt.
'
' VmCOM VBScript Sample Program 3
' Copyright (c) 1999-2003 VMware, Inc.
' .
' .
' .
' This program is for educational purposes only.
' It is not to be used in production environments.
'
' Description:
'
' This script gets a list of virtual machines registered on
' the local server. It attempts to power-on each VM that
' is not already running and has a line in the config file:
'
' autostart=true
'
'
' Instructions for Windows 2000 and Windows XP host:
'
' - save the contents of this file to a file named 'sample3.vbs'
'
' - there should be an accompanying file named 'sample3.wsf'
' It is placed in the same directory as this file during
' product installation. This file is responsible for setting
' up the Windows Script Host environment and loading the
' VmCOM type library, thereby enabling this script to
' reference symbolic constants such as vmExecutionState_On
'
' - in a command line window, type:
' cscript //nologo sample3.wsf
'
34 www.vmware.com
Using Sample VmCOM Programs
'
' Try connecting to server a few times. It's possible the VMware services
' are still in the process of starting up. We'll wait a maximum of
' 12 * 10 = 120 seconds = 2 minutes
'
connected = false
for tries = 1 to 12
vm_server.Connect connect_params
if Err.number = 0 then
connected = true
exit for
end if
WScript.Echo "Could not connect to server: " & Err.Description
WScript.Echo "Retrying in 10 seconds ..."
WScript.Sleep 10000
Err.clear
next
www.vmware.com 35
Using Sample VmCOM Programs
power_state = vm.ExecutionState
if Err.Number <> 0 then
WScript.Echo "Error getting execution state: " &
Err.Number & ": " & Err.Description
Err.Clear
else
if power_state = vmExecutionState_Off or power_state =
vmExecutionState_Suspended then
WScript.Echo "Powering on " & config
vm.Start(vmPowerOpMode_Soft)
if Err.Number <> 0 then
WScript.Echo "Error powering on " & config & ": " &
Err.Description
Err.Clear
else
' Wait between starting up VMs to smooth out the load
on the server
WScript.Sleep 5000
end if
end if
end if
end if
end if
end if
next
36 www.vmware.com
Using Sample VmCOM Programs
The source for the sample program 3 accompanying Windows Script File is in the SampleScripts
folder in the VmCOM Scripting API directory.
You can also find it on the VMware Web site, saved with a .TXT extension for online viewing, at
www.vmware.com/support/developer/scripting-API/doc/sample3.wsf.txt.
Note: If you are using Microsoft Internet Explorer as your browser, select View > Source to view the
file. Alternately, right-click this link and download this file.
<job id="sample3">
<reference object="VmCOM.VmCtl" />
<script language="VBScript" src="sample3.vbs" />
</job>
www.vmware.com 37
4
Using VmPerl
Using VmPerl
VmPerl Modules
The VmPerl interface provides controlled access to VMware servers and virtual machines. You can
incorporate VmPerl function calls in a Perl script you write to automate the day-to-day functioning of
your server and virtual machines.
The VmPerl API consists of four modules or packages:
• VMware::VmPerl::ConnectParams — that provides connection information and authentication
(user credentials) when connecting to a server.
• VMware::VmPerl::Server — that controls interaction with a GSX Server or ESX Server machine.
• VMware::VmPerl::VM — that controls interaction with a particular virtual machine on a GSX
Server or ESX Server.
• VMware::VmPerl::Question — that provides for user interaction when there is a question or error
condition requiring a response.
VMware::VmPerl::Server and VMware::VmPerl::VM are the primary modules for communicating with
VMware components. VMware::VmPerl::ConnectParams and VMware::VmPerl::Question are support
modules used as inputs or outputs to the methods and properties of the primary modules.
A VMware::VmPerl::Server object represents a server and exports server-level services, such as virtual
machine enumeration and registration. A VMware::VmPerl::VM object represents a virtual machine on
a particular server and provides virtual machine specific methods including power operations. You
activate the VMware::VmPerl::Server or VMware::VmPerl::VM object by calling its connect()
method before accessing any other method.
The connect() method requires a $connectparams input parameter containing the host
identifier and user credentials supplied for authentication. If the host identifier is not supplied or is
undefined, the authentication is performed on the local system. If the user name and password are
also not supplied, the current user is authenticated on the local machine. Otherwise, you may supply
the user name and password for authentication as that user.
Unlike a VMware::VmPerl::Server object, $vm->connect() also takes the string $vm_name
specifying the configuration file name of the virtual machine that will be connected.
Once a VMware::VmPerl::Server object is connected, you can enumerate the virtual machines on the
server, and register or unregister the virtual machines. You can obtain a list of virtual machines on a
particular server by using the $server->registered_vm_names() method. This method
returns an array of strings specifying the configuration file names of the virtual machines currently
registered on the server. If you know the configuration file name of a specific virtual machine, you can
connect the VMware::VmPerl::VM object directly without using a VMware::VmPerl::Server object.
40 www.vmware.com
Using VmPerl
VMware::VmPerl::ConnectParams
VMware::VmPerl::ConnectParams::new($hostname, $port, $username, $password) connects to the
given hostname and network port and authenticates the connection with the supplied user name
and password.
The VMware::VmPerl::ConnectParams module supplies connection information and user credentials
to the $server->connect() or $vm->connect() methods and exposes the methods listed
in the following table. All VMware::VmPerl::ConnectParams methods have both read and write
permissions, allowing you to retrieve (GET) and set (PUT) the values.
The security for your connection depends upon the security configuration of your VMware server. If
you’re connecting to a VMware server or a virtual machine on a host with GSX Server, then the
connections is encrypted as long as the VMware server is configured to encrypt connections.
Method Description
$connectparams->get_hostname() Gets or sets the name of a server, where $hostname is the server’s
Returns the defined value on success or undef hostname or IP address. If $hostname is not given or undefined,
(undefined value) on failure or if the value is not set. Set the authentication is performed on the local system. The C library
the value and retry the API call. connects to the local host and uses current user information when it
connects. However, this user information is not passed back to
$connectparams->set_hostname($hostname)
$connectparams.
Otherwise, you may supply the user name and password for
authentication as that user.
$connectparams->get_port() Gets or set the TCP port to use when connecting to the server. Its
Returns the defined value on success or undef default value is 0 (zero), indicating the default port number (902)
(undefined value) on failure or if the value is not set. Set should be used. Otherwise, enter the correct port number.
the value and retry the API call. A port number set to a negative value is treated as an incorrect value
$connectparams->set_port($port) and the default port number is used instead.
www.vmware.com 41
Using VmPerl
VMware::VmPerl::Server
The VMware::VmPerl::Server module represents a VMware server running on a particular machine.
Method Description
$server->connect($connectparams) Connects the object to a VMware GSX Server or a VMware ESX Server
Returns the defined value on success or undef where $connectparams specifies the system and user
(undefined value) on failure. information.
The total number of connected VMware::VmPerl::VM and
VMware::VmPerl::Server objects cannot exceed 62. The
connect() method fails with error code
VM_E_INSUFFICIENT_RESOURCES if this limit is reached. In order to
connect new objects, destroy one or more connected
VMware::VmPerl::VM or VMware::VmPerl::Server objects.
$server->get_last_error() Gets details about the last error that occurred in an array of form
Returns the error code and descriptive string. [$error_num, $error_string].
The remaining methods only work after you connect to the server with $server->connect().
Method Description
$server->registered_vm_names() Gets an array of strings specifying the configuration file names of the
Returns a list of virtual machine configuration file virtual machines currently registered on the server. The array is indexed
names, an empty list (if no virtual machines are beginning at 0 (zero). The server must be connected using the
registered or if there is a failure). You can use connect() method, or this method throws an error.
$vm->get_last_error to determine if an
error occurred or there are no registered virtual
machines.
$server->register_vm($vm_name) Registers a virtual machine on a server where $vm_name is a string
Returns the defined value on success or undef specifying the virtual machine’s configuration file name.
(undefined value) on failure.
$server->unregister_vm($vm_name) Unregisters a virtual machine from a server where $vm_name is a string
Returns the defined value on success or undef specifying the virtual machine’s configuration file name.
(undefined value) on failure.
42 www.vmware.com
Using VmPerl
VMware::VmPerl::VM
The VMware::VmPerl::VM object represents a virtual machine running on a particular server.
You can connect to a virtual machine, start, stop, suspend and resume virtual machines, query and
modify the configuration file settings, and connect and disconnect devices.
Except where noted otherwise, these methods are synchronous; the method does not return until it
finishes its operation, fails or times out. Most operations time out after 2 minutes, except for power
operations, which time out after 4 minutes.
Method Description
$vm->connect($connectparams, $vm_name) Establishes a connection with a virtual machine using the specified
Returns the defined value on success or undef parameters where $connectparams specifies the system and
(undefined value) on failure. user information and $vm_name is a string specifying the virtual
machine’s configuration file name.
The total number of connected VMware::VmPerl::VM and
VMware::VmPerl::Server objects cannot exceed 62. The
connect() method fails with error code
VM_E_INSUFFICIENT_RESOURCES if this limit is reached. In order to
connect new objects, destroy one or more connected
VMware::VmPerl::VM or VMware::VmPerl::Server objects.
$vm->get_last_error() Gets details about the last error that occurred in an array of form
Returns the error code and descriptive string. [$error_num, $error_string].
The remaining methods only work after you connect to the virtual machine with
$vm->connect().
www.vmware.com 43
Using VmPerl
Method Description
$vm->start($mode) Powers on a previously powered-off virtual machine or resumes a suspended
Returns the defined value on success or virtual machine where $mode specifies the operation’s behavior based on
undef (undefined value) on failure. the value of the VMware::VmPerl::VM_POWEROP_MODE_<XXX> where
<XXX> is HARD, SOFT, or TRYSOFT. If $mode is not specified, the default
mode is VM_POWEROP_MODE_SOFT. For more information, see
VM_POWEROP_MODE_<XXX> Values on page 49.
Note: If you are connecting to GSX Server 1.x or ESX Server 1.x, then you
must specify VMware::VmPerl::VM_POWEROP_MODE_HARD as the mode or
the operation will fail.
f the virtual machine is powered off, then it is powered on. If it is suspended,
this method resumes the virtual machine. If the virtual machine is in any other
state, the start() method fails and throws an error.
$vm->stop($mode) Shuts down and powers off a virtual machine where $mode specifies the
Returns the defined value on success or operation’s behavior based on the value of the
undef (undefined value) on failure. VMware::VmPerl::VM_POWEROP_MODE_<XXX> where <XXX> is HARD, SOFT,
or TRYSOFT. If $mode is not specified, the default mode is
VM_POWEROP_MODE_SOFT. For more information, see
VM_POWEROP_MODE_<XXX> Values on page 49.
Note: If you are connecting to GSX Server 1.x or ESX Server 1.x, then you
must specify VMware::VmPerl::VM_POWEROP_MODE_HARD as the mode or
the operation will fail.
This method always fails if the virtual machine is not in the
VM_EXECUTION_STATE_ON state.
$vm->reset($mode) Shuts down, then reboots a virtual machine where $mode specifies the
Returns the defined value on success or operation’s behavior based on the value of the
undef (undefined value) on failure. VMware::VmPerl::VM_POWEROP_MODE_<XXX> where <XXX> is HARD, SOFT,
or TRYSOFT. If $mode is not specified, the default mode is
VM_POWEROP_MODE_SOFT. See VM_POWEROP_MODE_<XXX> Values on
page 49.
Note: If you are connecting to GSX Server 1.x or ESX Server 1.x, then you
must specify VMware::VmPerl::VM_POWEROP_MODE_HARD as the mode or
the operation will fail.
This method always fails if the virtual machine is not in the
VM_EXECUTION_STATE_ON state.
44 www.vmware.com
Using VmPerl
Method Description
$vm->suspend($mode) Suspends a virtual machine where $mode specifies the operation’s behavior
Returns the defined value on success or based on the value of the VMware::VmPerl::VM_POWEROP_MODE_<XXX>
undef (undefined value) on failure. where <XXX> is HARD, SOFT, or TRYSOFT. It saves the current state of the
virtual machine to a suspend file. If $mode is not specified, the default mode
is VM_POWEROP_MODE_SOFT. For more information, see
VM_POWEROP_MODE_<XXX> Values on page 49.
Note: If you are connecting to GSX Server 1.x or ESX Server 1.x, then you
must specify VMware::VmPerl::VM_POWEROP_MODE_HARD as the mode or
the operation will fail.
This method always fails if the virtual machine is not in the
VMware::VmPerl::VM_EXECUTION_STATE_ON state. If you attempt to suspend
a virtual machine with more the 2GB of memory, the suspend operation will
time fail after a time-out period.
$vm->get_execution_state() Returns the virtual machine’s current state: powered on, powered off,
Returns the defined value on success or suspended, or stuck. For a list of the execution states, see
undef (undefined value) on failure. VM_EXECUTION_STATE_<XXX> Values on page 48.
$vm->set_guest_info($key_name, $value) For additional information, see Using VmPerl to Pass User-Defined
Information Between a Running Guest Operating System and a Script on
Returns the defined value on success or
page 51.
undef (undefined value) on failure.
$vm->get_config_file_name() Returns a string containing the configuration file name for the virtual
Returns the defined value on success or machine. This method fails if the VMware::VmPerl::VM object is not
undef (undefined value) on failure. connected.
www.vmware.com 45
Using VmPerl
Method Description
$vm->get_product_info($infotype) Gets information about the product. For additional information, see Infotype
Returns the defined value on success or Values on page 50.
undef (undefined value) on failure.
$vm->get_heartbeat() Returns the current heartbeat count generated by the VMware Tools service
Returns the defined value on success or running in the guest operating system. The count is initialized to zero when
undef (undefined value) on failure. the virtual machine is powered on.
The heartbeat count is typically incremented at least once per second when
the VMware Tools service is running under light load conditions. The count
stays constant if the service is not running.
$vm->get_tools_last_active() Returns an integer indicating how much time has passed, in seconds, since
Returns the defined value on success or the last heartbeat was detected from the VMware Tools service.
undef (undefined value) on failure. This value is initialized to zero when the virtual machine powers on. It stays at
zero until the first heartbeat is detected, after which the value is always
greater than zero until the virtual machine is power-cycled again.
For additional information, see Additional Information on
get_tools_last_active on page 47.
$vm->get_pending_question() Returns a Vmware::VmPerl::VmQuestion object if the virtual machine is
Returns the defined value on success or currently in the VM_EXECUTION_STATE_STUCK state. Otherwise, an error is
undef (undefined value) on failure. thrown.
$vm->answer_question($question, $choice) Replies to a question where $question represents the question and
Returns the defined value on success or $choice represents the index of the selected answer to the question. The
undef (undefined value) on failure. index is a number associated with an answer. The first choice’s index is always
0. The second choice’s index is 2, and so on.
Use this method to answer the current question or dismiss the current error
message when a virtual machine is in the VM_EXECUTION_STATE_STUCK
state and requires user input to continue.
First, get a VMware::VmPerl::Question object from the VMware::VmPerl::VM
object’s get_pending_question() method. You can retrieve the
possible choices and their respective indices from the
VMware::VmPerl::Question object’s get_choices() method. Then, use
the answer_question() method to answer the question.
$vm->device_is_connected($dev_name) Determines the connection state where $dev_name identifies the virtual
Returns the defined value on success or false device.
on failure (if the device is not connected or if
there is a failure). You can use
$vm->get_last_error to determine if
an error occurred or if the device is not
connected.
46 www.vmware.com
Using VmPerl
Method Description
$vm->connect_device($dev_name) Sets a virtual device to the connected state where $dev_name identifies
Returns the defined value on success or the virtual device you want to connect. The virtual machine must be
undef (undefined value) on failure. powered on for this method to succeed, otherwise a VM_E_BADSTATE error is
returned.
Use the set_config() method to set configuration parameters relevant
to the virtual device before calling the connect_device() method.
The following code example illustrates connecting a virtual drive to a CD
image file:
$vm->set_config("ide1:0.devicetype") = "cdrom-image"
$vm->set_config("ide1:0.filename") = "/iso/foo.iso"
$vm->connect_device("ide1:0")
$vm->disconnect_device ($dev_name) Sets a virtual device to the disconnected state where $dev_name is a string
Returns the defined value on success or identifying the virtual device you want to disconnect. The virtual machine
undef (undefined value) on failure. must be powered on for this method to succeed, otherwise a
VM_E_BADSTATE error is returned.
www.vmware.com 47
Using VmPerl
VMware::VmPerl::Question
The VMware::VmPerl::Question method describes a question or error condition requiring input. The
script selects one from the list of possible answers.
Method Description
$question->get_text() Gets the question text.
Returns the defined value on success or undef
(undefined value) on failure.
$question->get_choices() Gets an array of strings representing a list of possible answers to the
Returns the defined value on success or undef question.
(undefined value) on failure.
$question->get_id() Gets an integer used internally by VmPerl to identify the question.
Returns the defined value on success or undef
(undefined value) on failure.
Symbolic Constants
The VMware::VmPerl::VM object exposes the following symbolic constants:
• VM_EXECUTION_STATE_<XXX> Values
• VM_POWEROP_MODE_<XXX> Values
• Infotype Values
• VM_PRODINFO_PRODUCT_<XXX> Values
• VM_PRODINFO_PLATFORM_<XXX> Values
VM_EXECUTION_STATE_<XXX> Values
VM_EXECUTION_STATE_<XXX> values specify the state (or condition) of a virtual machine. The
possible values are listed in the following table:
48 www.vmware.com
Using VmPerl
VM_POWEROP_MODE_<XXX> Values
VMware::VmPerl::VM_POWEROP_MODE_<XXX> specifies the behavior of a power transition (start,
stop, reset, or suspend) method. If $mode is not specified, the default mode is
VM_POWEROP_MODE_SOFT. However, if you are connecting to GSX Server 1.x or ESX Server 1.x, then
you must specify VMware::VmPerl::VM_POWEROP_MODE_HARD as the mode or the operation will
fail.
During a soft power transition, the VMware Tools service runs a script inside the guest operating
system. For example, the default scripts that run during suspend and resume operations, respectively
release and renew DHCP leases, for graceful integration into most corporate LANs. You may also
customize these scripts. For more information on these scripts, see www.vmware.com/support/gsx25/
doc/tools_gsx.html. Refer to the section on executing scripts.
The possible values are listed in the following table:
www.vmware.com 49
Using VmPerl
Infotype Values
$infotype specifies the product information for the get_product_info() method.
VM_PRODINFO_PRODUCT_<XXX> Values
The get_product_info method returns the VMware product when the requested $infotype
is VM_PRODINFO_PRODUCT_<XXX>.
VM_PRODINFO_PLATFORM_<XXX> Values
The get_product_info method returns the host’s platform when the requested $infotype is
VM_PRODINFO_PLATFORM_<XXX>.
50 www.vmware.com
Using VmPerl
GuestInfo Variables
You pass to the virtual machine variables you define yourself. What you pass is up to you, but you
might find it useful to pass items like the virtual machine’s IP address, Windows system ID (SID, for
Windows guest operating systems) or machine name.
This is useful in situations where you want to deploy virtual machines on a network using a common
configuration file, while providing each machine with its own unique identity. By providing each
virtual machine with a unique identifying string, you can use the same configuration file to launch
the same nonpersistent virtual disk multiple times in a training or testing environment, where each
virtual machine would be unique on the network. Note that in the case of persistent or undoable
disks, each virtual disk file must be copied into its own directory if it shares its file name with another
virtual disk file.
When a virtual machine process is created on the server, all GuestInfo variables are initially undefined.
A GuestInfo variable is created the first time it is written.
www.vmware.com 51
Using VmPerl
You identify a GuestInfo variable with a key name. You can define and create any number of
GuestInfo variable key names. The information you pass is temporary, lasting until the virtual machine
is powered off and all consoles connected to the virtual machine are closed.
For an example showing how the VMware guest service can be invoked in a Perl script, see the
sample Perl script to get the IP address of a guest operating system on Setting a Virtual Machine’s IP
Address Configuration Variable on page 71.
52 www.vmware.com
Using VmPerl
www.vmware.com 53
5
Using Sample VmPerl Scripts
Using Sample VmPerl Scripts
Copyright Information
Each sample script and sample program included with the VmPerl Scripting API includes a copyright.
However, for brevity, we do not include this copyright in its entirety with each sample script and
sample program in this manual. Instead, we include the first line of the copyright followed by ellipses,
to indicate its placement. The complete copyright is as follows:
Copyright (c) 1999-2003 VMware, Inc.
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
56 www.vmware.com
Using Sample VmPerl Scripts
The names "VMware" and "VMware, Inc." must not be used to endorse or promote
products derived from the Software without the prior written permission of
VMware, Inc.
Products derived from the Software may not be called "VMware", nor may
"VMware" appear in their name, without the prior written permission of
VMware, Inc.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
VMWARE,INC. BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#!/usr/bin/perl -w
#
# Copyright (C) 1999-2003 VMware, Inc.
# .
# .
# .
#
# enumerate.pl
#
# This script lists all of the registered virtual machines
# on the server specified by hostname.
#
# usage:
# enumerate.pl <hostname> <user> <password>
#
BEGIN {
if ($^O eq "MSWin32") {
@INC = (
# Set the path to your VmPerl Scripting directory if different
'C:\Program Files\VMware\VMware VmPerl Scripting API\perl5\site_perl\5.005',
www.vmware.com 57
Using Sample VmPerl Scripts
use VMware::VmPerl;
use VMware::VmPerl::Server;
use VMware::VmPerl::ConnectParams;
use strict;
# Use the default port of 902. Change this if your port is different.
my $port = 902;
# To connect to a local server as the current user, you would use the
# following line:
# my $connect_params = VMware::VmPerl::ConnectParams::new();
# Obtain a list containing every config file path registered with the server.
my @list = $server->registered_vm_names();
if (!defined($list[0])) {
my ($error_number, $error_string) = $server->get_last_error();
die "Could not get list of VMs from server: Error $error_number: ".
"$error_string\n";
}
58 www.vmware.com
Using Sample VmPerl Scripts
#!/usr/bin/perl -w
#
# Copyright (C) 1999-2003 VMware, Inc.
# .
# .
# .
#
# startallvms.pl
#
# This script powers on all VMs on the system that are not
# already running.
#
# usage:
# startallvms.pl <hostname> <user> <password>
#
BEGIN {
if ($^O eq "MSWin32") {
@INC = (
# Set the path to your VmPerl Scripting directory if different
'C:\Program Files\VMware\VMware VmPerl Scripting API\perl5\site_perl\5.005',
'C:\Program Files\VMware\VMware VmPerl Scripting API\perl5\site_perl\5.005\MSWin32-x86');
}
}
use VMware::VmPerl;
use VMware::VmPerl::VM;
use VMware::VmPerl::Server;
use VMware::VmPerl::ConnectParams;
use strict;
www.vmware.com 59
Using Sample VmPerl Scripts
if(!defined($list[0])) {
my ($error_number, $error_string) = $server->get_last_error();
die "Could not get list of VMs: Error $error_number: $error_string\n";
}
my $config;
my $vm = VMware::VmPerl::VM::new();
# Only try this for VMs that are powered off or suspended.
60 www.vmware.com
Using Sample VmPerl Scripts
my $power_state = $vm->get_execution_state();
if (!defined($power_state)) {
my ($error_number, $error_string) = $server->get_last_error();
print STDERR "Could not get execution state of VM $config: Error ".
"$error_number: $error_string\n";
} elsif ($power_state == VM_EXECUTION_STATE_OFF ||
$power_state == VM_EXECUTION_STATE_SUSPENDED) {
sleep 5;
}
}
}
# Destroys the virtual machine object, thus disconnecting from the virtual machine.
undef $vm;
}
}
www.vmware.com 61
Using Sample VmPerl Scripts
#!/usr/bin/perl -w
#
# Copyright (C) 1999-2003 VMware, Inc.
# .
# .
# .
#
# status.pl
#
# This script returns the current power status (on, off, suspended) of the
# virtual machine specified by config on the server defined by hostname.
#
# usage:
# status.pl <path_to_config_file> [<server> <user> <password>]
#
# If server, user and password are not given, connect to the local server
# as the current user.
#
BEGIN {
if ($^O eq "MSWin32") {
@INC = (
# Set the path to your VmPerl Scripting directory if different
'C:\Program Files\VMware\VMware VmPerl Scripting API\perl5\site_perl\5.005',
'C:\Program Files\VMware\VMware VmPerl Scripting API\perl5\site_perl\5.005\MSWin32-x86');
}
}
use VMware::VmPerl;
use VMware::VmPerl::VM;
use VMware::VmPerl::ConnectParams;
use strict;
if (@ARGV < 1) {
print "Usage $0: <path_to_config_file> [<server> <user> <password>]\n";
exit(1);
}
my $state_string_map = {};
my @state_strings = (
"VM_EXECUTION_STATE_ON",
62 www.vmware.com
Using Sample VmPerl Scripts
"VM_EXECUTION_STATE_OFF",
"VM_EXECUTION_STATE_SUSPENDED",
"VM_EXECUTION_STATE_STUCK",
"VM_EXECUTION_STATE_UNKNOWN"
);
# Read in parameters.
my ($cfg_path, $server_name, $user, $passwd) = @ARGV;
# Use the default port of 902. Change this if your port is different.
my $port = 902;
my $connect_params = VMware::VmPerl::ConnectParams::new($server_name,$port,$user,$passwd);
my $vm = VMware::VmPerl::VM::new();
if (!$vm->connect($connect_params, $cfg_path)) {
my ($error_number, $error_string) = $vm->get_last_error();
die "Could not connect to vm: Error $error_number: $error_string\n";
}
# Destroys the virtual machine object, thus disconnecting from the virtual machine.
undef $vm;
www.vmware.com 63
Using Sample VmPerl Scripts
#!/usr/bin/perl -w
#
# Copyright (C) 1999-2003 VMware, Inc.
# .
# .
# .
#
# hbcheck.pl
#
# You can use this script to check the virtual machine specified by
# ConfigToCheck for a heartbeat within a certain interval in seconds.
# If no heartbeat is received within the specified Interval, then this
# script will forcefully shutdown ConfigToCheck, and start ConfigToStart.
#
# usage:
# hbcheck.pl <ConfigToCheck> <ConfigToStart> [Interval]
#
BEGIN {
if ($^O eq "MSWin32") {
@INC = (
# Set the path to your VmPerl Scripting directory if different
'C:\Program Files\VMware\VMware VmPerl Scripting API\perl5\site_perl\5.005',
'C:\Program Files\VMware\VMware VmPerl Scripting API\perl5\site_perl\5.005\MSWin32-x86');
}
}
64 www.vmware.com
Using Sample VmPerl Scripts
my $cfg_to_check = shift;
my $cfg_to_start = shift;
my $interval = shift;
# Connect to the local host on the default port as the current user.
# Change the port number if it is different.
my $connect_params = VMware::VmPerl::ConnectParams::new(undef, 902, undef, undef);
while ($vm->is_connected()) {
if ($hb == $last_hb) {
# Since we don't have a heartbeat, we need to do something
# about it. Let's shut this virtual machine down, and then start
# the backup virtual machine (specified by vm_to_start).
www.vmware.com 65
Using Sample VmPerl Scripts
66 www.vmware.com
Using Sample VmPerl Scripts
#!/usr/bin/perl -w
#
# Copyright (C) 1999-2003 VMware, Inc.
# .
# .
# .
#
# answerquestion.pl
#
# You can use this script to check if the virtual machine specified by
# config is stuck. If it's stuck, you can answer any question posed by this
# virtual machine to allow it to continue.
#
# usage:
# answerquestion.pl <config-file>
BEGIN {
if ($^O eq "MSWin32") {
@INC = (
# Set the path to your VmPerl Scripting directory if different
'C:\Program Files\VMware\VMware VmPerl Scripting API\perl5\site_perl\5.005',
'C:\Program Files\VMware\VMware VmPerl Scripting API\perl5\site_perl\5.005\MSWin32-x86');
}
}
www.vmware.com 67
Using Sample VmPerl Scripts
# Check the power state of the virtual machine. If it's stuck, get the
# question and list the possible responses.
my $state = $vm->get_execution_state();
if (!defined($state)) {
my ($err, $errstr) = $vm->get_last_error();
# Destroys the virtual machine object, thus disconnecting from the virtual machine
undef $vm;
die "Could not get execution state of vm; error $err: $errstr\n";
}
if ($state ne VM_EXECUTION_STATE_STUCK) {
print "There is no question to answer.\n";
} else {
my $q = $vm->get_pending_question();
unless (defined($q)) {
undef $vm;
die "Could not get the pending question.\n";
}
my $text = $q->get_text();
unless (defined($text)) {
undef $vm;
die "Could not get the text of the pending question.\n";
}
my @choices = $q->get_choices();
unless (defined($choices[0])) {
undef $vm;
die "Could not get the choices to answer the pending question.\n";
}
# Print question and choices for user:
print "\n" . $q->get_text() . "\n";
my $answer;
do {
prompt(@choices);
$answer = get_answer();
}
until (valid_answer($answer,@choices));
my $op_ok;
$op_ok = $vm->answer_question($q, $answer-1);
unless ($op_ok) {
my ($err, $errstr) = $vm->get_last_error();
undef $vm;
die "Could not answer pending question; error $err: $errstr\n";
}
}
68 www.vmware.com
Using Sample VmPerl Scripts
# Destroys the virtual machine object, thus disconnecting from the virtual machine.
undef $vm;
#------------------------------------------------
# Prints answer choices, prompts user for an answer number.
sub prompt {
my @choices = shift;
print "To answer the question, type the number that corresponds to\n";
print "one of the answers below:\n";
for (my $i = 0; $i <= $#choices; $i++) {
print "\t" . ($i + 1) . ". $choices[$i]\n";
}
print "Final answer? ";
}
www.vmware.com 69
Using Sample VmPerl Scripts
#!/usr/bin/perl -w
#
# Copyright (C) 1999-2003 VMware, Inc.
# .
# .
# .
#
# suspend.pl
#
# This script suspends to disk the virtual machine specified by config on
# the server defined by hostname.
#
# usage:
# suspend.pl hostname user password config
BEGIN {
if ($^O eq "MSWin32") {
@INC = (
# Set the path to your VmPerl Scripting directory if different
'C:\Program Files\VMware\VMware VmPerl Scripting API\perl5\site_perl\5.005',
'C:\Program Files\VMware\VMware VmPerl Scripting API\perl5\site_perl\5.005\MSWin32-x86');
}
}
use VMware::VmPerl;
use VMware::VmPerl::VM;
use VMware::VmPerl::ConnectParams;
use strict;
if (@ARGV < 1) {
print "Usage $0: <path_to_config_file> [<server> [<user> <password>]]\n";
exit(1);
}
70 www.vmware.com
Using Sample VmPerl Scripts
# Destroys the virtual machine object, thus disconnecting from the virtual machine.
undef $vm;
www.vmware.com 71
Using Sample VmPerl Scripts
#!/usr/bin/perl -w
#
# Copyright (C) 1999-2003 VMware, Inc.
# .
# .
# .
#
# saveguestip.pl
#
# This script demonstrates the use of the VMware guest service to set
# a configuration variable from within a running virtual machine's guest
# operating system. It stores the guest operating system's IP address.
# The host can retrieve the IP address with a corresponding script.
#
# usage:
# saveguestip.pl
#
# NOTE:
# This script should be run from within a running virtual machine's guest
# operating system. The corresponding script getguestip.pl can be run
# from the host operating system.
if (@ARGV != 0) {
print "Usage: $0\n";
exit(1);
}
my($err);
if(!defined($ip)) {
die "$0: Could not get guest ip\n";
}
else {
print "$0: guest ip is $ip\n";
}
72 www.vmware.com
Using Sample VmPerl Scripts
sub get_ip {
my ($myip, @iparr) = (undef, []);
$myip = $iparr[0];
}
# For Linux Guest OS.
# Please ensure that ifconfig is in your path. The root user has it by default.
else {
$_ = `ifconfig`;
@iparr = /inet addr:(\d+\.\d+\.\d+\.\d+)/ig;
$myip = $iparr[0];
}
return $myip;
}
www.vmware.com 73
Using Sample VmPerl Scripts
For more information on passing information between a script and a guest operating system, see
Using VmPerl to Pass User-Defined Information Between a Running Guest Operating System and a
Script on page 51.
This script (getguestip.pl), saved with a .TXT extension for online viewing, can be found on the
VMware Web site at www.vmware.com/support/developer/scripting-API/doc/getguestip.pl.txt.
#!/usr/bin/perl -w
#
# Copyright (C) 1999-2003 VMware, Inc.
# .
# .
# .
#
# getguestip.pl
#
# This script returns the value of the guest_info variable 'ip' set by
# the guest OS in a virtual machine on a given server.
#
# usage:
# getguestip.pl <path_to_config_file> [<server> <user> <password>]
#
BEGIN {
if ($^O eq "MSWin32") {
@INC = (
# Set the path to your VmPerl Scripting directory if different
'C:\Program Files\VMware\VMware VmPerl Scripting API\perl5\site_perl\5.005',
'C:\Program Files\VMware\VMware VmPerl Scripting API\perl5\site_perl\5.005\MSWin32-x86');
}
}
use VMware::VmPerl;
use VMware::VmPerl::VM;
use VMware::VmPerl::ConnectParams;
use strict;
# Read in parameters.
my ($cfg_path, $server_name, $user, $passwd) = @ARGV;
74 www.vmware.com
Using Sample VmPerl Scripts
# Use the default port of 902. Change this if your port is different.
my $port = 902;
# If $server_name, $user, and $passwd are missing, connect to localhost as current user.
my $connect_params = VMware::VmPerl::ConnectParams::new($server_name,$port,$user,$passwd);
my $vm = VMware::VmPerl::VM::new();
if (!$vm->connect($connect_params, $cfg_path)) {
my ($error_number, $error_string) = $vm->get_last_error();
undef $vm;
die "Could not connect to vm: Error $error_number: $error_string\n";
}
# Destroys the virtual machine object, thus disconnecting from the virtual machine.
undef $vm;
www.vmware.com 75
6
Error Codes and Event Logging
Error Codes and Event Logging
Error Codes
The following sections describe error handling in the VMware Scripting APIs.
78 www.vmware.com
Error Codes and Event Logging
For example, to return an error code and a description of the error in your scripts, use:
my ($ret, $string) = $vm->get_last_error();
Alternately, to return only the error code, in your scripts, use:
my $ret = $vm->get_last_error();
www.vmware.com 79
Error Codes and Event Logging
Event Logging
If you are running GSX Server on a Windows machine, you can use Event Viewer to view the following
types of events for virtual machines:
• Power transitions
By default, Event Viewer logs an event whenever the virtual machine changes power state (on,
off, or suspended).
• Messages
80 www.vmware.com
Error Codes and Event Logging
Messages occur whenever an error condition exists in a virtual machine. The Event Viewer logs a
message with its type (hint, warning, error, or question), the text of the message, and the
choices to acknowledge a message.
• Message answers
When a message is acknowledged, the answer is logged with the message that is answered and
the choice that was selected as the answer for that message.
By default, the Event Viewer logs all three types of events. However, you may turn off logging for one
or more of these event types by editing the config.ini file.
1. Change directories to the VMware GSX Server program directory. The default location is
C:\Program Files\VMware\VMware GSX Server.
2. Edit the config.ini file with a text editor of your choice. Add one or more of the following
configuration variables. Each configuration variable turns off event logging for that event type.
eventlog.win.power = "FALSE"
eventlog.win.message = "FALSE"
eventlog.win.answer = "FALSE"
You can use the filtering feature in Event Viewer to see selected events on a virtual machine. All
virtual machine events are stored in the “Virtual Machines” category. By contrast, all serverd and
authd events are stored in the default “None” category.
www.vmware.com 81
Error Codes and Event Logging
Each event type has an event ID. For example, all virtual machine power transition events share the
event ID 1100. You may use this event ID to filter virtual machine events. The event IDs for virtual
machines are listed in the following table.
Right-click on a single event log and select Properties. The Event Properties window is displayed with
additional details about the event as shown in the following image.
Power Transitions
The Event Viewer logs virtual machine power transitions as Windows information type events
(EVENTLOG_INFORMATION_TYPE). Each power transition event log begins with a simple string
indicating the new power state of the virtual machine. Power transition event log strings follow. In
these examples, D:\foo.vmx is the path to the configuration file for the virtual machine.
Virtual machine powered on (was powered off): D:\foo.vmx.
Virtual machine powered off (was powered on): D:\foo.vmx.
Virtual machine suspended (was powered on): D:\foo.vmx.
82 www.vmware.com
Error Codes and Event Logging
Messages
The Event Viewer logs messages with a severity appropriate for the message:
• VMware hints have an “info” type and are logged as a Windows information type event
(EVENTLOG_INFORMATION_TYPE).
• VMware warnings have a “warning” type and are logged as a Windows warning type event
(EVENTLOG_WARNING_TYPE).
• VMware errors have a “error” type and are logged as a Windows error type event
(EVENTLOG_ERROR_TYPE).
• VMware questions have a “question” type and are logged as a Windows information type event
(EVENTLOG_INFORMATION_TYPE).
Each message event log begins with a simple string indicating that a message was received. The
message event log includes the type of message and the message text. Example message event log
strings follow.
This first example is for a message hint.
Virtual machine received hint: D:\foo.vmx.
Don't forget to install VMware Tools inside this virtual machine.
Wait until your guest operating system finishes booting, then choose
'VMware Tools Install...' from the Settings menu in VMware GSX
Server. Then follow the instructions that are provided.
[Ok]
This second example is for an error message.
Virtual machine received error: D:\foo.vmx
Failed to resume disk ide0:0. The disk was modified since the virtual
machine was suspended.
Error encountered while trying to restore ide0:0 state from file
.\foo.vmss.
[OK]
This third example is for a question.
Virtual machine received question: D:\foo.vmdk.
Select an action for the redo log of undoable disk D:\foo.vmdk.
[Commit, Discard, Keep]
Message Answers
The Event Viewer logs message answers as Windows information type events
(EVENTLOG_INFORMATION_TYPE). Each message answer event log begins with a simple string
www.vmware.com 83
Error Codes and Event Logging
indicating that an answer to a message was received. The message answer event log includes the
type of message, the message text, and the answer.
An example message answer event log string follows.
Virtual machine received answer "Discard": D:\foo.vmdk.
Select an action for the redo log of undoable disk D:\foo.vmdk.
84 www.vmware.com
A
Appendix A: vmware-cmd Utility
Appendix A: vmware-cmd Utility
Options
The vmware-cmd utility takes the following options.
Option Description
-H Specifies an alternate host other than the local host. If the -H option is used, then the -U
and -P options must also be specified.
-O Specifies an alternative port. The default port number is 902.
-U Specifies the username.
-P Specifies the user’s password.
-h Prints a help message, listing the options for this utility.
-q Turns on the quiet option with minimal output. The specified operation and arguments
are not specified in the output.
-v Turns on the verbose option.
86 www.vmware.com
Appendix A: vmware-cmd Utility
www.vmware.com 87
Appendix A: vmware-cmd Utility
88 www.vmware.com
Appendix A: vmware-cmd Utility
<powerop_mode> Values
The following table describes hard, soft and trysoft power operations.
www.vmware.com 89
Appendix A: vmware-cmd Utility
Connecting a Device
The following example illustrates connecting a virtual IDE device in a Windows guest operating
system.
Change directories to the directory (folder) containing the vmware-cmd utility or include the full
path to the utility when typing the following on a command line. Note that you must use double
90 www.vmware.com
Appendix A: vmware-cmd Utility
www.vmware.com 91
Index
Symbols to a device 21, 51, 92 vmErr_NETFAIL 83
$choice 50 to a server 14, 16, 20, 44, 46, vmErr_NOACCESS 84
47 vmErr_NOMEM 84
$connectparams 44, 46, 47
to a virtual machine 20, 47, vmErr_NOPROPERTY 84
$dev_name 50, 51 84 vmErr_NOTCONNECTED 82,
$infotype 50, 54 connection parameters 14, 15, 84
$key_name 49, 56–57 16, 20, 46, 47 vmErr_NOTSUPPORTED 84
$mode 48 vmErr_PROXYFAIL 84
connection security 15, 45
vmErr_TIMEOUT 84
$question 50 connections, total number of
vmErr_UNSPECIFIED 84
$vm_name 47 simultaneous 16, 20, 46, 47 vmErr_VMBUSY 84
A Count property 17 vmErr_VMEXISTS 84
answer_question() method 50 cscript 32, 37 vmErr_VMINITFAILED 84
answering a question 22, 44, D error, VmPerl 83–84
50, 52, 70–73, 85, 87–88, 92 device, connecting to 21, 51, VM_E_BADSTATE 51, 83
AnswerQuestion() method 21, 92 VM_E_BADVERSION 83
22, 82 VM_E_DISCONNECT 83
device, disconnecting from 21,
VM_E_INSUFFICIENT_RESOU
API incompatible with server 83 51, 92
RCES 83
authd 85 device_is_connected() method VM_E_INVALIDARGS 83
C 50 VM_E_INVALIDVM 83
choice 21 DeviceIsConnected property 18 VM_E_NEEDINPUT 83
devName 21 VM_E_NETFAIL 83
Choices property 17, 21, 22
DHCP lease 23, 53 VM_E_NOACCESS 84
collection object 14 VM_E_NOMEM 84
command, cscript 32, 37 disconnect_device() method
VM_E_NOPROPERTY 84
51
concepts VM_E_NOTCONNECTED 84
VmCOM 14 DisconnectDevice() method 21 VM_E_NOTSUPPORTED 84
VmPerl 44 disconnected virtual machine VM_E_PROXYFAIL 84
Config property 18, 21 84 VM_E_TIMEOUT 84
disconnecting from a device 21, VM_E_UNSPECIFIED 84
config.ini file 85
51, 92 VM_E_VMBUSY 84
ConfigFileName property 18
E VM_E_VMEXISTS 84
configuration file for virtual VM_E_VMINITFAILED 84
machine 14, 16, 18, 20, 44, 46, error condition requiring user
event ID 86
47, 49, 83, 92 input 22, 44, 50, 52, 85, 87–88
Event Viewer 84–88
configuration variable 18, 49, error handling 82
ExecutionState property 17
75–77, 77–79, 92 error, VmCOM 83–84
Connect() method 14, 15, 16, vmErr_BADSTATE 21, 83 G
20, 82, 83 vmErr_BADVERSION 83 get_choices() method 50, 52
vmErr_DISCONNECT 82, 83 get_config() method 49
connect() method 44, 46, 47,
83 vmErr_INSUFFICIENT_RESOU
get_config_file_name()
RCES 83
connect_device() method 51 method 49
vmErr_INVALIDARGS 83
ConnectDevice() method 21 vmErr_INVALIDVM 83 get_execution_state() method
connecting vmErr_NEEDINPUT 82, 83 49
www.vmware.com 97
Index
98 www.vmware.com
Index
www.vmware.com 99
Index
100 www.vmware.com
Index
www.vmware.com 101
Index
102 www.vmware.com