]> git.ipfire.org Git - ipfire.org.git/commitdiff
Modified rpc.py to produce valid json-rpc output.
authorMichael Tremer <michael.tremer@ipfire.org>
Thu, 16 Jul 2009 11:59:00 +0000 (13:59 +0200)
committerMichael Tremer <michael.tremer@ipfire.org>
Thu, 16 Jul 2009 11:59:00 +0000 (13:59 +0200)
www/info.json
www/pages/cluster/__init__.py
www/rpc.py
www/rpc_functions.py [new file with mode: 0644]
www/web/cluster.py

index 0ff83a0a5119cc93c37a3a06baf074a5e1ee5a6e..802dceccb2c4dd30cb183af544bba630c32a34d5 100644 (file)
@@ -3,5 +3,6 @@
        "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" }
 }
index f4d5fcf26a1277a1ede3987284460d3535db1619..f877265fbfa18bf1608644d628224234d2dcd341 100644 (file)
@@ -10,7 +10,8 @@ class Content(web.Content):
 
        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>
@@ -35,12 +36,16 @@ page.javascript = Javascript(jquery=1)
 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++;
 
@@ -61,7 +66,9 @@ page.javascript.write("""<script type="text/javascript">
                                                                $("#" + 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();
index 36040b1776c96089e380f22540e9938856ca8df7..059f56cbd1382aeccc749ef17d02b8e1f2ca1197 100644 (file)
@@ -3,25 +3,18 @@
 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)
diff --git a/www/rpc_functions.py b/www/rpc_functions.py
new file mode 100644 (file)
index 0000000..ca5614f
--- /dev/null
@@ -0,0 +1,10 @@
+#!/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
index d95f71df48f75c91b540b65218a245aa6f2c4a36..855a7da92c9e554a2ee04ddcd810f52691fc5b9d 100644 (file)
@@ -2,6 +2,8 @@
 
 import telnetlib
 
+import simplejson as json
+
 class Node(object):
        def __init__(self, hostname, address, arch, speed, jobs, load):
                self.hostname = hostname
@@ -52,6 +54,14 @@ class Cluster(object):
                        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):
@@ -72,6 +82,25 @@ class Cluster(object):
                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")