"sname" : "ipfire",
"slogan" : "Security now!",
"releases" : { "stable" : "IPFire 2.5 - Core 28",
- "testing" : "IPFire 3.0 alpha 1" }
+ "testing" : "IPFire 3.0 alpha 1" },
+ "hosting" : { "cluster" : "minerva.ipfire.org" }
}
def __call__(self, lang):
ret = """<h3>Icecream Cluster Monitoring</h4>
- <p>Cluster's load: <span id="loadbar"></span> - Number of nodes: <span id="count">-</span></p>
+ <p>Cluster's load: <span id="loadbar"></span> <span id="jobbar"></span> -
+ Number of nodes: <span id="count">-</span></p>
<table id="nodes">
<thead>
<tr>
page.javascript.jquery_plugin("progressbar")
page.javascript.write("""<script type="text/javascript">
nodes = new Array();
+ id = 0;
update = function() {
- $.getJSON("/rpc.py", { type: "cluster" },
+ $.getJSON("/rpc.py", { method: "cluster_get_info", id : id++ },
function(data) {
var count = 0;
- $.each(data.nodes, function(i, node) {
+
+ if (data.error != "null") return;
+
+ $.each(data.result.nodes, function(i, node) {
var nodeid = node.hostname.replace(/\./g, "");
count++;
$("#" + nodeid + "_loadbar").progressBar(node.load, {showText: false});
$("#" + nodeid + "_jobs").progressBar(node.jobs.split("/")[0], { max: node.jobs.split("/")[1], textFormat: 'fraction'});
});
- $("#loadbar").progressBar(data.cluster.load);
+
+ $("#loadbar").progressBar(data.result.cluster.load);
+ $("#jobbar").progressBar(data.result.cluster.jobs.split("/")[0], { max: data.result.cluster.jobs.split("/")[1], textFormat: 'fraction'});
for (var nodeid in nodes) {
if (nodes[nodeid] == false) {
$("#" + nodeid).remove();
import cgi
import simplejson as json
-import web.cluster
-
+from rpc_functions import *
form = cgi.FieldStorage()
+method = form.getfirst("method")
+id = form.getfirst("id")
+params = form.getlist("params")
-if form.getfirst("type") == "cluster":
- nodes = []
- ret = {}
- cluster = web.cluster.Cluster("minerva.ipfire.org")
- for node in cluster.nodes:
- tmp = { "hostname" : node.hostname,
- "address" : node.address,
- "arch" : node.arch,
- "jobs" : node.jobs,
- "load" : node.load,
- "speed" : node.speed, }
-
- nodes.append(tmp)
- ret["nodes"] = nodes
- ret["cluster"] = { "load" : cluster.load, }
- print json.dumps(ret, sort_keys=True, indent=4)
+methods = { "cluster_get_info" : cluster_get_info }
+if method and methods.has_key(method):
+ print json.dumps({ "version": "1.1",
+ "id": id or "null",
+ "result" : methods[method](params),
+ "error" : "null", },
+ sort_keys=True, indent=4)
--- /dev/null
+#!/usr/bin/python
+
+import web.info
+
+info = web.info.Info()
+
+def cluster_get_info(params):
+ import web.cluster
+ cluster = web.cluster.Cluster(info["hosting"]["cluster"])
+ return cluster.json
import telnetlib
+import simplejson as json
+
class Node(object):
def __init__(self, hostname, address, arch, speed, jobs, load):
self.hostname = hostname
load += node.load
load /= len(self.nodes)
return load
+
+ @property
+ def jobs(self):
+ jobs_cur = jobs_max = 0
+ for node in self.nodes:
+ jobs_cur += int(node.jobs.split("/")[0])
+ jobs_max += int(node.jobs.split("/")[1])
+ return "%s/%s" % (jobs_cur, jobs_max)
@property
def nodes(self):
self._nodes = ret
return ret
+ @property
+ def json(self, *args):
+ nodes = []
+ ret = {}
+ for node in self.nodes:
+ tmp = { "hostname" : node.hostname,
+ "address" : node.address,
+ "arch" : node.arch,
+ "jobs" : node.jobs,
+ "load" : node.load,
+ "speed" : node.speed, }
+ nodes.append(tmp)
+ ret["nodes"] = nodes
+ ret["cluster"] = { "load" : self.load,
+ "jobs" : self.jobs, }
+ #return json.dumps(ret)
+ return ret
+
+
if __name__ == "__main__":
cluster = Cluster("minerva.ipfire.org")
print cluster.command("listcs")