[ SEA-GHOST MINI SHELL]
#!/usr/bin/python
# -*- encoding: utf-8; py-indent-offset: 4 -*-
import httplib, pprint, sys, os, getopt, socket, time, datetime, re
telegram_list = {
"systeminfo":
'<ns1:RetrieveServiceContent xsi:type="ns1:RetrieveServiceContentRequestType">'\
'<ns1:_this type="ServiceInstance">ServiceInstance</ns1:_this></ns1:RetrieveServiceContent>',
"login":
'<ns1:Login xsi:type="ns1:LoginRequestType"><ns1:_this type="SessionManager">%(sessionManager)s</ns1:_this>'\
'<ns1:userName>%(username)s</ns1:userName><ns1:password>%(password)s</ns1:password></ns1:Login>',
"hostsystems":
'<ns1:RetrievePropertiesEx xsi:type="ns1:RetrievePropertiesExRequestType">'\
'<ns1:_this type="PropertyCollector">%(propertyCollector)s</ns1:_this><ns1:specSet>'\
'<ns1:propSet><ns1:type>HostSystem</ns1:type><ns1:pathSet>name</ns1:pathSet></ns1:propSet>'\
'<ns1:objectSet><ns1:obj type="Folder">%(rootFolder)s</ns1:obj><ns1:skip>false</ns1:skip>'\
'<ns1:selectSet xsi:type="ns1:TraversalSpec"><ns1:name>visitFolders</ns1:name>'\
'<ns1:type>Folder</ns1:type><ns1:path>childEntity</ns1:path><ns1:skip>false</ns1:skip>'\
'<ns1:selectSet><ns1:name>visitFolders</ns1:name></ns1:selectSet>'\
'<ns1:selectSet><ns1:name>dcToHf</ns1:name></ns1:selectSet>'\
'<ns1:selectSet><ns1:name>dcToVmf</ns1:name></ns1:selectSet>'\
'<ns1:selectSet><ns1:name>crToH</ns1:name></ns1:selectSet>'\
'<ns1:selectSet><ns1:name>crToRp</ns1:name></ns1:selectSet>'\
'<ns1:selectSet><ns1:name>dcToDs</ns1:name></ns1:selectSet>'\
'<ns1:selectSet><ns1:name>hToVm</ns1:name></ns1:selectSet>'\
'<ns1:selectSet><ns1:name>rpToVm</ns1:name></ns1:selectSet></ns1:selectSet>'\
'<ns1:selectSet xsi:type="ns1:TraversalSpec"><ns1:name>dcToVmf</ns1:name><ns1:type>Datacenter</ns1:type>'\
'<ns1:path>vmFolder</ns1:path><ns1:skip>false</ns1:skip>'\
'<ns1:selectSet><ns1:name>visitFolders</ns1:name></ns1:selectSet></ns1:selectSet>'\
'<ns1:selectSet xsi:type="ns1:TraversalSpec"><ns1:name>dcToDs</ns1:name><ns1:type>Datacenter</ns1:type>'\
'<ns1:path>datastore</ns1:path><ns1:skip>false</ns1:skip>'\
'<ns1:selectSet><ns1:name>visitFolders</ns1:name></ns1:selectSet></ns1:selectSet>'\
'<ns1:selectSet xsi:type="ns1:TraversalSpec"><ns1:name>dcToHf</ns1:name><ns1:type>Datacenter</ns1:type>'\
'<ns1:path>hostFolder</ns1:path><ns1:skip>false</ns1:skip>'\
'<ns1:selectSet><ns1:name>visitFolders</ns1:name></ns1:selectSet></ns1:selectSet>'\
'<ns1:selectSet xsi:type="ns1:TraversalSpec"><ns1:name>crToH</ns1:name><ns1:type>ComputeResource</ns1:type>'\
'<ns1:path>host</ns1:path><ns1:skip>false</ns1:skip></ns1:selectSet>'\
'<ns1:selectSet xsi:type="ns1:TraversalSpec"><ns1:name>crToRp</ns1:name><ns1:type>ComputeResource</ns1:type>'\
'<ns1:path>resourcePool</ns1:path><ns1:skip>false</ns1:skip>'\
'<ns1:selectSet><ns1:name>rpToRp</ns1:name></ns1:selectSet>'\
'<ns1:selectSet><ns1:name>rpToVm</ns1:name></ns1:selectSet></ns1:selectSet>'\
'<ns1:selectSet xsi:type="ns1:TraversalSpec"><ns1:name>rpToRp</ns1:name><ns1:type>ResourcePool</ns1:type>'\
'<ns1:path>resourcePool</ns1:path><ns1:skip>false</ns1:skip>'\
'<ns1:selectSet><ns1:name>rpToRp</ns1:name></ns1:selectSet>'\
'<ns1:selectSet><ns1:name>rpToVm</ns1:name></ns1:selectSet></ns1:selectSet>'\
'<ns1:selectSet xsi:type="ns1:TraversalSpec"><ns1:name>hToVm</ns1:name><ns1:type>HostSystem</ns1:type>'\
'<ns1:path>vm</ns1:path><ns1:skip>false</ns1:skip>'\
'<ns1:selectSet><ns1:name>visitFolders</ns1:name></ns1:selectSet></ns1:selectSet>'\
'<ns1:selectSet xsi:type="ns1:TraversalSpec"><ns1:name>rpToVm</ns1:name><ns1:type>ResourcePool</ns1:type>'\
'<ns1:path>vm</ns1:path><ns1:skip>false</ns1:skip></ns1:selectSet>'\
'</ns1:objectSet></ns1:specSet><ns1:options></ns1:options></ns1:RetrievePropertiesEx>',
"esxhostdetails":
'<ns1:RetrievePropertiesEx xsi:type="ns1:RetrievePropertiesExRequestType">'
'<ns1:_this type="PropertyCollector">%(propertyCollector)s</ns1:_this><ns1:specSet><ns1:propSet>'\
'<ns1:type>HostSystem</ns1:type>'\
# '<ns1:pathSet>summary.quickStats.overallMemoryUsage</ns1:pathSet>'\
# '<ns1:pathSet>hardware.cpuPkg</ns1:pathSet>'\
# '<ns1:pathSet>summary.quickStats.overallCpuUsage</ns1:pathSet>'\
'<ns1:pathSet>config.multipathState.path</ns1:pathSet>'\
'<ns1:pathSet>name</ns1:pathSet>'\
# '<ns1:pathSet>overallStatus</ns1:pathSet>'\
# '<ns1:pathSet>runtime.healthSystemRuntime.systemHealthInfo.numericSensorInfo</ns1:pathSet>'\
# '<ns1:pathSet>runtime.healthSystemRuntime.hardwareStatusInfo.storageStatusInfo</ns1:pathSet>'\
# '<ns1:pathSet>runtime.healthSystemRuntime.hardwareStatusInfo.cpuStatusInfo</ns1:pathSet>'\
# '<ns1:pathSet>runtime.healthSystemRuntime.hardwareStatusInfo.memoryStatusInfo</ns1:pathSet>'\
# '<ns1:pathSet>runtime.inMaintenanceMode</ns1:pathSet>'\
'<ns1:pathSet>hardware.memorySize</ns1:pathSet></ns1:propSet>'\
'<ns1:objectSet><ns1:obj type="Folder">%(rootFolder)s</ns1:obj><ns1:skip>false</ns1:skip>'\
'<ns1:selectSet xsi:type="ns1:TraversalSpec"><ns1:name>visitFolders</ns1:name>'\
'<ns1:type>Folder</ns1:type><ns1:path>childEntity</ns1:path><ns1:skip>false</ns1:skip>'\
'<ns1:selectSet><ns1:name>visitFolders</ns1:name></ns1:selectSet>'\
'<ns1:selectSet><ns1:name>dcToHf</ns1:name></ns1:selectSet>'\
'<ns1:selectSet><ns1:name>dcToVmf</ns1:name></ns1:selectSet>'\
'<ns1:selectSet><ns1:name>crToH</ns1:name></ns1:selectSet>'\
'<ns1:selectSet><ns1:name>crToRp</ns1:name></ns1:selectSet>'\
'<ns1:selectSet><ns1:name>dcToDs</ns1:name></ns1:selectSet>'\
'<ns1:selectSet><ns1:name>hToVm</ns1:name></ns1:selectSet>'\
'<ns1:selectSet><ns1:name>rpToVm</ns1:name></ns1:selectSet></ns1:selectSet>'\
'<ns1:selectSet xsi:type="ns1:TraversalSpec"><ns1:name>dcToVmf</ns1:name><ns1:type>Datacenter</ns1:type>'\
'<ns1:path>vmFolder</ns1:path><ns1:skip>false</ns1:skip>'\
'<ns1:selectSet><ns1:name>visitFolders</ns1:name></ns1:selectSet></ns1:selectSet>'\
'<ns1:selectSet xsi:type="ns1:TraversalSpec"><ns1:name>dcToDs</ns1:name><ns1:type>Datacenter</ns1:type>'\
'<ns1:path>datastore</ns1:path><ns1:skip>false</ns1:skip>'\
'<ns1:selectSet><ns1:name>visitFolders</ns1:name></ns1:selectSet></ns1:selectSet>'\
'<ns1:selectSet xsi:type="ns1:TraversalSpec"><ns1:name>dcToHf</ns1:name><ns1:type>Datacenter</ns1:type>'\
'<ns1:path>hostFolder</ns1:path><ns1:skip>false</ns1:skip>'\
'<ns1:selectSet><ns1:name>visitFolders</ns1:name></ns1:selectSet></ns1:selectSet>'\
'<ns1:selectSet xsi:type="ns1:TraversalSpec"><ns1:name>crToH</ns1:name><ns1:type>ComputeResource</ns1:type>'\
'<ns1:path>host</ns1:path><ns1:skip>false</ns1:skip></ns1:selectSet>'\
'<ns1:selectSet xsi:type="ns1:TraversalSpec"><ns1:name>crToRp</ns1:name><ns1:type>ComputeResource</ns1:type>'\
'<ns1:path>resourcePool</ns1:path><ns1:skip>false</ns1:skip>'\
'<ns1:selectSet><ns1:name>rpToRp</ns1:name></ns1:selectSet>'\
'<ns1:selectSet><ns1:name>rpToVm</ns1:name></ns1:selectSet></ns1:selectSet>'\
'<ns1:selectSet xsi:type="ns1:TraversalSpec"><ns1:name>rpToRp</ns1:name><ns1:type>ResourcePool</ns1:type>'\
'<ns1:path>resourcePool</ns1:path><ns1:skip>false</ns1:skip>'\
'<ns1:selectSet><ns1:name>rpToRp</ns1:name></ns1:selectSet>'\
'<ns1:selectSet><ns1:name>rpToVm</ns1:name></ns1:selectSet></ns1:selectSet>'\
'<ns1:selectSet xsi:type="ns1:TraversalSpec"><ns1:name>hToVm</ns1:name><ns1:type>HostSystem</ns1:type>'\
'<ns1:path>vm</ns1:path><ns1:skip>false</ns1:skip>'\
'<ns1:selectSet><ns1:name>visitFolders</ns1:name></ns1:selectSet></ns1:selectSet>'\
'<ns1:selectSet xsi:type="ns1:TraversalSpec"><ns1:name>rpToVm</ns1:name><ns1:type>ResourcePool</ns1:type>'\
'<ns1:path>vm</ns1:path><ns1:skip>false</ns1:skip></ns1:selectSet>'\
'</ns1:objectSet></ns1:specSet><ns1:options></ns1:options></ns1:RetrievePropertiesEx>',
"logout":
'<ns1:Logout xsi:type="ns1:LogoutRequestType">'\
'<ns1:_this type="SessionManager">%(sessionManager)s</ns1:_this></ns1:Logout>',
"continuetoken":
'<ns1:ContinueRetrievePropertiesEx xsi:type="ns1:ContinueRetrievePropertiesExRequestType">'\
'<ns1:_this type="PropertyCollector">propertyCollector</ns1:_this><ns1:token>%(token)s</ns1:token></ns1:ContinueRetrievePropertiesEx>'
}
def put_in_envelope(payload):
return '<SOAP-ENV:Envelope xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" '\
'xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ZSI="http://www.zolera.com/schemas/ZSI/" '\
'xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" '\
'xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">'\
'<SOAP-ENV:Header></SOAP-ENV:Header><SOAP-ENV:Body xmlns:ns1="urn:vim25">' + payload + '</SOAP-ENV:Body></SOAP-ENV:Envelope>'
def convert_hostname(h):
if opt_spaces == "cut":
return h.split()[0]
else:
return h.replace(" ", "_")
def get_counters(esx_version_num):
needed_ids = [
# sys.uptime
262144,
# mem.*
# 65635, 65537, 65577, 65625, 65545, 65611, 65573, 65615, 65582,
# 65549, 65630, 65622, 65618, 65621, 65561, 65623, 65632, 65557,
# 65628, 65633, 65541, 65643, 65586, 65553, 65569, 65589, 65639,
# 65620, 65599, 65580, 65619, 65603,
# 'disk.deviceLatency': 131091,
# 'disk.deviceReadLatency': 131083,
# 'disk.deviceWriteLatency': 131087,
# 'disk.kernelLatency': 131092,
# 'disk.kernelReadLatency': 131084,
# 'disk.kernelWriteLatency': 131088,
# 'disk.maxQueueDepth': 131096,
# 'disk.maxTotalLatency': 131095,
# 'disk.numberRead': 131076,
# 'disk.numberReadAveraged': 131097,
# 'disk.numberWrite': 131077,
# 'disk.numberWriteAveraged': 131098,
# 'disk.queueLatency': 131094,
# 'disk.queueReadLatency': 131086,
# 'disk.queueWriteLatency': 131090,
# 'disk.read': 131078,
# 'disk.totalLatency': 131093,
# 'disk.totalReadLatency': 131085,
# 'disk.totalWriteLatency': 131089,
# 'disk.usage': 131073,
# disk.read/write/deviceLatency/numberRead/numberWrite
131078, 131079, 131091, 131076, 131077,
]
#needed_ids = [
# # sys.resourceMem*
# 262151, 262155, 262169, 262152, 262154, 262153, 262157, 262156, 262168,
#]
# Seems as this is not available in ESX 5.0 but we saw it on 5.1
if esx_version_num > 5.0:
# sys.resourceMemConsumed
needed_ids += [
262171,
]
if esx_version_num > 4.1:
needed_ids += [
# net.*
196616, 196621, 196617, 196625, 196619, 196623, 196609, 196614,
196620, 196624, 196615, 196622, 196618, 196612, 196613, 196626,
]
return needed_ids
def usage():
sys.stderr.write("""USAGE: agent_vsphere [OPTIONS] HOST
agent_vsphere -h
ARGUMENTS:
HOST Host name or IP address of VMWare HostSystem
OPTIONS:
-h, --help Show this help message and exit
-u USER, --user USER Username for vSphere login
-s SECRET, --secret SECRET Secret/Password for vSphere login
-D, --direct Assume a directly queried host system (no vCenter). In
This we expect data about only one HostSystem to be
found and do not create piggy host data for that host.
-P Skip placeholder virtualmachines. These backup vms are created
by the Site Recovery Manager (SRM) and are identified by not
having any assigned virtual disks.
-p, --port port Alternative port number (default is 443 for the https connection)
--no-cert-check Disables the checking of the servers ssl certificate
--pysphere Fallback to old pysphere based special agent. It supports
ESX 4.1 but is very slow.
-H, --hostname Specify a hostname. This is neccessary if this is
different from HOST. It is being used when outputting
the hosts power state.
-a, --agent Also retrieve data from the normal Check_MK Agent.
This makes sense if you query a vCenter that is
Installed on a Windows host that you also want to
Monitor with Check_MK.
-t, --timeout SECS Set the network timeout to vSphere to SECS seconds.
This is also used when connecting the agent (option -a).
Default is 60 seconds. Note: the timeout is not only
applied to the connection, but also to each individual
subquery.
--debug Debug mode: let Python exceptions come through
--tracefile FILENAME Log all outgoing and incoming data into the given tracefile
-i MODULES, --modules MODULES Modules to query. This is a comma separated list of
hostsystem, virtualmachine and storage. Default is to
query all modules.
-c, --dump-counters Simply dumping out all available counters and their values.
This mode is meant for debugging and diagnostic purposes.
-S, --spaces HOW How to handle spaces in hostnames. "cut": cut everyting
after the first space, "underscore": replace with
underscores. Default is "underscore".
--vm_pwr_display WHERE Specifies where the virtual machines power state should be shown
Default (no option) is on the queried vCenter or ESX-Host
Possible WHERE options: * esxhost : show on ESX host
* vm : show on virtual machine
--host_pwr_display WHERE Specifies where the ESX hosts power state should be shown
Default (no option) is on the queried vCenter or ESX-Host
Possible WHERE options: * esxhost : show on ESX host
* vm : show on virtual machine
""")
short_options = 'hi:u:s:Dat:H:Pp:S:'
long_options = [
'help', 'user=', 'secret=', 'direct', 'agent', 'debug', 'modules=', 'timeout=', 'no-cert-check',
'hostname=', 'tracefile=', "pysphere", "port=", "spaces=", "host_pwr_display=", "vm_pwr_display="
]
opt_debug = False
opt_direct = False
opt_agent = False
opt_timeout = 60
opt_port = 443
opt_hostname = None
opt_skip_placeholder_vm = False
opt_pysphere = False
opt_tracefile = None
opt_host_pwr_display = None
opt_vm_pwr_display = None
opt_tracefile = None
opt_spaces = "underscore"
opt_no_cert = False
error = None
error_exit = 1
host_address = None
user = None
secret = None
tracefile = None
query_objects = [ 'hostsystem', 'virtualmachine', 'datastore', 'counters', 'licenses' ]
try:
opts, args = getopt.getopt(sys.argv[1:], short_options, long_options)
except getopt.GetoptError, err:
sys.stderr.write("%s\n" % err)
sys.exit(1)
for o,a in opts:
if o in [ '--debug' ]:
opt_debug = True
elif o in [ '--tracefile' ]:
opt_tracefile = a
elif o in [ '-D', '--direct' ]:
opt_direct = True
elif o in [ '-a', '--agent' ]:
opt_agent = True
elif o == '-P':
opt_skip_placeholder_vm = True
elif o in [ '-p', '--port' ]:
opt_port = a
elif o in [ '--no-cert-check' ]:
opt_no_cert = True
elif o == '--pysphere':
opt_pysphere = True
elif o in [ '-u', '--user' ]:
user = a
elif o in [ '-s', '--secret' ]:
secret = a
elif o in [ '-i', '--modules' ]:
query_objects = a.split(',')
elif o in [ '-t', '--timeout' ]:
opt_timeout = int(a)
elif o in [ '-H', '--hostname' ]:
opt_hostname = a
elif o in [ '--vm_pwr_display' ]:
opt_vm_pwr_display = a
elif o in [ '--host_pwr_display' ]:
opt_host_pwr_display = a
elif o in [ '-S', '--spaces']:
if a not in [ "cut", "underscore" ]:
usage()
sys.exit(1)
opt_spaces = a
elif o in [ '-h', '--help' ]:
usage()
sys.exit(0)
if len(args) == 1:
host_address = args[0]
elif not args:
sys.stderr.write("ERROR: No host given.\n")
sys.exit(1)
else:
sys.stderr.write("ERROR: Please specify exactly one host.\n")
sys.exit(1)
socket.setdefaulttimeout(opt_timeout)
def get_agent_info_tcp(hostname):
output = ""
try:
# TODO: gethostbyname() automatically detects IP addresses and does
# *not* contact any nameserver in that case. So the following two
# lines of code should not be neccessary:
if hostname[0] in "123456789":
ipaddress = hostname
else:
ipaddress = socket.gethostbyname(hostname)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
s.settimeout(opt_timeout)
except:
pass # some old Python versions lack settimeout(). Better ignore than fail
s.connect((ipaddress, 6556))
try:
s.setblocking(1)
except:
pass
output = ""
while True:
out = s.recv(4096, socket.MSG_WAITALL)
if out and len(out) > 0:
output += out
else:
break
s.close()
return output
except Exception, e:
if opt_debug:
raise
return output
# Globals of ESX System. These settings are available after the first "systeminfo" query
systemfields = [
("apiVersion", str),
("name", None),
("rootFolder", None),
("perfManager", None),
("sessionManager", None),
("licenseManager", None),
("propertyCollector", None),
("version", None),
("build", None),
("vendor", None),
("osType", None),
]
systeminfo = {}
if opt_tracefile:
tracefile_dir = os.path.dirname(opt_tracefile) or "."
if os.path.exists(tracefile_dir):
tracefile = file(opt_tracefile, "w")
elif opt_debug:
sys.stderr.write("Path for tracefile %s does not exist" % opt_tracefile)
sys.stderr.flush()
def get_pattern(pattern, line):
if not line:
return []
p = re.compile(pattern)
return p.findall(line)
if tracefile:
tracefile.write("Tracefile %s Host address: %s\n" %
(datetime.datetime.now().strftime("%Y-%m-%d %H:%M"), host_address))
my_cookie = None
server_handle = None
def query_server(payload, payload_params = {}):
# Finalize payload
payload_params.update(systeminfo)
soapdata = put_in_envelope(payload)
soapdata = soapdata % payload_params
def init_headers(soapdata):
server_handle.putrequest("POST", "/sdk")
server_handle.putheader("Content-Length", "%d" % len(soapdata))
server_handle.putheader("Content-Type", 'text/xml; charset="utf-8"')
server_handle.putheader("SOAPAction", "urn:vim25/5.0")
server_handle.putheader("User-Agent", "VMware VI Client/5.0.0") # TODO: set client version?
if my_cookie:
server_handle.putheader("Cookie", my_cookie)
server_handle.endheaders()
init_headers(soapdata)
response_data = []
time_sent = time.time()
server_handle.send(soapdata)
response = server_handle.getresponse()
response_data.append(response.read())
while True:
# Look for a <token>0</token> field.
# If it exists not all data was transmitted and we need to start a
# ContinueRetrievePropertiesExResponse query...
token = re.findall("<token>(.*)</token>", response_data[-1][:512])
if token:
soapdata = put_in_envelope(telegram_list["continuetoken"] % {"token": token[0]})
init_headers(soapdata)
server_handle.send(soapdata)
response = server_handle.getresponse()
response_data.append(response.read())
else:
break
time_response = time.time()
if tracefile:
tracefile.write("#### Sent ####\n%s" % soapdata)
timing_info = "Response took: %f" % (time_response - time_sent)
tracefile.write("\n#### Received #### %s\n%s\n" % (timing_info, "".join(response_data)))
return response.status, response.reason, response.msg, "".join(response_data)
def encode_url(text):
for char, replacement in [ ( "&", "&"),
( ">", ">" ),
( "<", "<"),
( "'", "'"),
( "\"", """) ]:
text = text.replace(char, replacement)
return text
# Initialize server connection
try:
netloc = host_address + ":" + str(opt_port)
if opt_no_cert:
try:
import ssl
server_handle = httplib.HTTPSConnection(netloc, context = ssl._create_unverified_context())
except:
server_handle = httplib.HTTPSConnection(netloc)
else:
server_handle = httplib.HTTPSConnection(netloc)
if opt_debug:
sys.stderr.write("Connecting to %s..." % netloc)
sys.stderr.flush()
server_handle.connect()
# Retrieve basic data, like systeminfo and session cookie
for name in [ "systeminfo", "login" ]:
payload = telegram_list[name]
if name == "login":
reply_code, repy_msg, reply_headers, reply_data = query_server(payload, payload_params = { "username": encode_url(user),
"password": encode_url(secret)})
else:
reply_code, reply_msg, reply_headers, reply_data = query_server(payload)
if name == "systeminfo":
for entry, function in systemfields:
element = get_pattern("<%(entry)s.*>(.*)</%(entry)s>" % { "entry": entry }, reply_data)
systeminfo[entry] = function and function(element[0]) or element[0]
elif name == "login":
my_cookie = reply_headers.get("Set-Cookie")
if "InvalidLogin" in reply_data:
raise Exception("Login response is not 'OK'. Please check the credentials")
except Exception, e:
if opt_debug:
raise
error = "Cannot connect to vSphere Server. Maybe you provided wrong " \
"credentials. Please check your connection settings and try " \
"again. Error message: %r" % e
if not error:
try:
#############################
# Determine available host systems
#############################
hostsystems = {}
reply_code, reply_msg, reply_headers, hostsystems_response = query_server(telegram_list["hostsystems"])
elements = get_pattern('<obj type="HostSystem">(.*?)</obj>.*?<val xsi:type="xsd:string">(.*?)</val>', hostsystems_response)
for hostsystem, name in elements:
hostsystems[hostsystem] = name
###########################
# Hostsystem
###########################
if "hostsystem" in query_objects:
hostsystems_properties = {}
hostsystems_sensors = {}
# Propsets
reply_code, reply_msg, reply_headers, esxhostdetails_response = query_server(telegram_list["esxhostdetails"])
hostsystems_objects = get_pattern('<objects>(.*?)</objects>', esxhostdetails_response)
for entry in hostsystems_objects:
hostname = get_pattern('<obj type="HostSystem">(.*)</obj>', entry[:512])[0]
hostsystems_properties[hostname] = {}
hostsystems_sensors[hostname] = {}
current_propname = ""
def eval_multipath_state(multipath_propset):
multipaths = get_pattern("<name>(.*?)</name><pathState>(.*?)</pathState>", value)
for mp_name, mp_state in multipaths:
hostsystems_properties[hostname].setdefault(current_propname, []).append("%s %s" % (mp_name, mp_state))
eval_functions = {
"config.multipathState.path" : eval_multipath_state,
}
elements = get_pattern('<propSet><name>(.*?)</name><val.*?>(.*?)</val></propSet>', entry)
for current_propname, value in elements:
if eval_functions.get(current_propname):
eval_functions[current_propname](value)
else:
hostsystems_properties[hostname].setdefault(current_propname, []).append(value)
# TODO: improve error handling: check if multiple results and opt_direct
for hostname, properties in hostsystems_properties.items():
if not opt_direct:
print "<<<<%s>>>>" % convert_hostname(properties["name"][0])
print "<<<esx_vsphere_hostsystem>>>"
for key in sorted(properties.keys()):
print "%s %s" % (key, " ".join(properties[key]))
query_server(telegram_list["logout"])
except Exception, e:
if opt_debug:
raise
error = "Error while processing received data"
if opt_agent:
sys.stdout.write(get_agent_info_tcp(host_address))
sys.stdout.flush()
error_exit = 0
if tracefile:
tracefile.close()
if error:
sys.stderr.write(error + "\n")
sys.exit(error_exit)
SEA-GHOST - SHELL CODING BY SEA-GHOST