summaryrefslogtreecommitdiffstats
path: root/ilo.py
diff options
context:
space:
mode:
authorjekader <jekader@gmail.com>2014-05-03 17:27:57 +0200
committerjekader <jekader@gmail.com>2014-05-03 17:27:57 +0200
commit26393db20b023950e1c97718c562befab346c6e9 (patch)
tree00752e453a746bd98fb12fe644a78431f5bb3b0e /ilo.py
parentd9fc72281ca38f77d6031a3e64bbcf0c1ffaaddc (diff)
downloadfake_ilo-26393db20b023950e1c97718c562befab346c6e9.tar.gz
the emulator itself
Diffstat (limited to 'ilo.py')
-rw-r--r--ilo.py129
1 files changed, 129 insertions, 0 deletions
diff --git a/ilo.py b/ilo.py
new file mode 100644
index 0000000..9a90697
--- /dev/null
+++ b/ilo.py
@@ -0,0 +1,129 @@
+#!/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='<RIBCL VERSION="2.0"></RIBCL>'
+ data_out=response.encode()
+ connection.send(data_out)
+# return firmware version
+ if message.find('GET_FW_VERSION') > 1:
+ response='<GET_FW_VERSION\r\n FIRMWARE_VERSION="1.91"\r\n MANAGEMENT_PROCESSOR="2.22"\r\n />'
+ 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()