As we're moving towards virtualisation in our datacentre, we decided to go with KVM.
Sadly, there was no web interface to view them, so I created one in python. This runs in the background.
An example would be this in PHP, where out servers on on the subnet 10.3.117.101 to 114. It also highlights all servers with the name 'testweb'
Sadly, there was no web interface to view them, so I created one in python. This runs in the background.
#!/usr/bin/env pythonAll you have to do is surf to port 80 (or modify the script so that it points to your port of choice) then you could run from your central monitoring machine etc a script which grabs all the KVM hosts info and display it in one whole page.
#
# Starts up webserver and runs forever
# lists domains running and defined
# pks - 20130405
# pks - add console
import re, os, sys, string, optparse
import xml.etree.ElementTree as ElementTree
import libvirt
import socket
import commands
from BaseHTTPServer import BaseHTTPRequestHandler,HTTPServer
Port_Number=80
conn = libvirt.openReadOnly(None)
assert conn, 'Failed to open connection'
names = conn.listDefinedDomains()
domains = map(conn.lookupByName, names)
ids = conn.listDomainsID()
running = map(conn.lookupByID, ids)
columns = 3
states = {
libvirt.VIR_DOMAIN_NOSTATE: 'no state',
libvirt.VIR_DOMAIN_RUNNING: 'running',
libvirt.VIR_DOMAIN_BLOCKED: 'blocked on resource',
libvirt.VIR_DOMAIN_PAUSED: 'paused by user',
libvirt.VIR_DOMAIN_SHUTDOWN: 'being shut down',
libvirt.VIR_DOMAIN_SHUTOFF: 'shut off',
libvirt.VIR_DOMAIN_CRASHED: 'crashed',
}
def info(dom):
[state, maxmem, mem, ncpu, cputime] = dom.info()
return '%s is %s,' % (dom.name(), states.get(state, state))
class myHandler(BaseHTTPRequestHandler):
def do_GET(self):
self.send_response(200)
self.send_header('Content-type','text/html')
self.end_headers()
print 'Defined domains:'
self.wfile.write ('<b>Defined domains:</b>')
self.wfile.write ('</br>')
for row in map(None, *[iter(domains)] * columns):
for domain in row:
if domain:
print info(domain),
self.wfile.write (info(domain))
self.wfile.write ('</br>')
print 'Running domains:'
self.wfile.write ('<b>Running domains:</b>')
self.wfile.write ('</br>')
for row in map(None, *[iter(running)] * columns):
for domain in row:
if domain:
server=info(domain).partition(" ")
execstring="/usr/local/bin/vm.sh vnc %s" % server[0]
output=commands.getstatusoutput(execstring)
vnc=output[1].split(" ")
vncport=vnc[5]
print info(domain)
print vncport
nic=socket.gethostbyname(socket.gethostname())
self.wfile.write ("<a href=\"vnc://%s:%s\"> %s </a>" % (nic, vncport ,info(domain)))
self.wfile.write ('</br>')
try:
server = HTTPServer(('',Port_Number), myHandler)
print "Started HTTP server on port", Port_Number
server.serve_forever()
except KeyboardInterrupt:
print 'CTRL+C received. Shutting down webserver'
server.socket.close()
An example would be this in PHP, where out servers on on the subnet 10.3.117.101 to 114. It also highlights all servers with the name 'testweb'
<html>
<head>
</head>
<body>
<h1>LN1</h1>
<table border=1>
<tr>
<?
for ($i=1 ; $i <15 ; $i++)
{
echo "<td>";
echo "<a href=\"http://10.3.117.".($i+100)."\">KVM".($i)."</a>";
echo "</td><td>";
$ip=100+$i;
#$test=exec("curl -s http://10.3.117.$ip | awk 'gsub(/ *<[^>]*> */,\" \")'");
$test=exec("curl -s http://10.3.117.$ip");
$test=str_replace("Running domains:","<b>Running domains:</b>",$test);
$test=str_replace("Defined domains:","<b>Defined domains:</b>",$test);
$test=str_replace("</br>","",$test);
#$test=str_replace("testweb","<font color=6666ff>testweb</font>",$test);
$test=str_replace("is running","",$test);
echo $test;
echo "</td></tr><tr>";
echo "\n\r";
}
?>
</tr>
</table>
</body>
</html>
No comments:
Post a Comment