#!/usr/bin/python
import libvirt,time
from socket import *
from ssl import *
def print_vm_status(vmname):
# connect to ovirt
domains = { }
conn = libvirt.open('qemu:///system')
#active domains
active_ids = conn.listDomainsID()
for id in active_ids:
dom = conn.lookupByID(id)
id_str = str(id)
name = dom.name()
domains[name] = dom
# inactive domains
for name in conn.listDefinedDomains():
dom = conn.lookupByName(name)
domains[name] = dom
if vmname in domains:
if domains[vmname].isActive():
return "on"
else:
return "off"
else:
return "NaN"
def set_vm_status(vmname,vmstatus):
# check if VM is already in desired status, just return result if yes
if print_vm_status(vmname).lower() == vmstatus.lower():
return vmstatus
else:
#do actual fencing here
if print_vm_status(vmname) in ('on','off'):
conn = libvirt.open('qemu:///system')
dom = conn.lookupByName(vmname)
if vmstatus == "off":
dom.destroy()
return "off"
if vmstatus == "on":
dom.create()
return "on"
else:
#return error if VM not present
return "NaN"
def logprint(msg):
logfile = open('/var/log/fake_ilo.log','a')
logline = time.strftime("[%Y-%m-%d %H:%M:%S] - ") + msg + "\n"
logfile.write(logline)
logfile.close()
#create socket
server_socket=socket(AF_INET, SOCK_STREAM)
username = ''
#Bind to an unused port on the local machine
server_socket.bind(('',1234))
#listen for connection
server_socket.listen (1)
tls_server = wrap_socket(server_socket, ssl_version=PROTOCOL_SSLv23, cert_reqs=CERT_NONE, server_side=True, keyfile='/etc/fake_ilo/server.key', certfile='/etc/fake_ilo/server.crt')
logprint('server started')
while True:
#accept connection
connection, client_address= tls_server.accept()
#server is not finished
finnished =False
emptyresponse=0
#while not finished
while not finnished:
#send and receive data from the client socket
data_in=connection.recv(1024)
message=data_in.decode()
if message=='quit':
finnished= True
else:
#login = VM name
if message.find('USER_LOGIN') > 1:
username=message.split()[3].replace('"', '')
if message.find('xml') > 1:
response=''
data_out=response.encode()
connection.send(data_out)
# return firmware version
if message.find('GET_FW_VERSION') > 1:
response=''
data_out=response.encode()
connection.send(data_out)
# get power status
if message.find('GET_HOST_POWER_STATUS') > 1:
response='HOST_POWER="' + print_vm_status(username) + '"'
logprint('received status request for '+username+' from '+client_address[0]+':'+str(client_address[1])+' - responding with: ' + print_vm_status(username))
data_out=response.encode()
connection.send(data_out)
# set power status
if message.find('SET_HOST_POWER') > 1:
power=message.split()[6].replace('"', '')
response='HOST_POWER="' + set_vm_status(username,power) + '"'
logprint('received fencing command for '+username+' from '+client_address[0]+':'+str(client_address[1])+' - requested status: '+power+ ', status after fencing is: ' + print_vm_status(username))
data_out=response.encode()
connection.send(data_out)
# filter out the rest
else:
if len(message) > 0:
do_nothing = 0
else:
emptyresponse+=1
if emptyresponse > 30:
finnished=True
#close the connection
connection.shutdown(SHUT_RDWR)
connection.close()
#close the server socket
server_socket.shutdown(SHUT_RDWR)
server_socket.close()