From: Michael Tremer Date: Wed, 29 Jul 2009 16:45:58 +0000 (+0200) Subject: Initial import of "Uriel". X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=1bd2ced1dce878eb1e10c38c2035b416281e01a0;p=ipfire.org.git Initial import of "Uriel". --- diff --git a/www/include/style.css b/www/include/style.css index 7334d65c..fcdc13e7 100644 --- a/www/include/style.css +++ b/www/include/style.css @@ -661,3 +661,30 @@ left: 60px; /*position where enlarged image should offset horizontally */ position: relative; width: 100%; } + +.ui-tabs .ui-tabs-hide { + display: none; +} + +table.uriel { + width: 100%; + border: 1px solid #880400; +} + +table.uriel td { + padding: 4px; +} + +table.uriel td.item { + font-weight: bold; +} + +table.uriel td.value { + text-align: right; +} + +table.uriel td.footer { + text-align: right; + background-color: #ddd; + border-top: 1px solid #666; +} diff --git a/www/pages/uriel.py b/www/pages/uriel.py new file mode 100644 index 00000000..42a0db70 --- /dev/null +++ b/www/pages/uriel.py @@ -0,0 +1,150 @@ +#!/bin/bash + +import web +import web.elements +from web.javascript import Javascript +from web.urieldb import Urieldb + +from web.info import Info +info = Info() + +class Content(web.Content): + def __init__(self): + web.Content.__init__(self) + + # ID, function, lang tuple + self.tabs = [ ("tab-os", self.tab_os, { "en" : "OS", "de" : "System",},), + ("tab-arch", self.tab_arch, { "en" : "Architecture", "de": "Architektur",},), + ("tab-lang", self.tab_lang, { "en" : "Languages", "de" : "Spracheinstellung",},), + ("tab-cpu", self.tab_cpu, { "en" : "CPU", "de" : "Prozessor",},), + ("tab-ram", self.tab_ram, { "en" : "RAM", "de" : "Hauptspeicher",},), + ("tab-vendor", self.tab_vendor, { "en" : "Vendor", "de" : "Hersteller",},), + ("tab-model", self.tab_model, { "en" : "Model", "de" : "Modell",},), + ("tab-formfactor", self.tab_formfactor, { "en" : "Formfactor", "de" : "Formfaktor",},), + ("tab-storage", self.tab_storage, { "en" : "Storage", "de" : "Datenspeicher",},),] + + self.db = Urieldb() + + def __call__(self, lang): + ret = """

IPFire Uriel

+ + + + + +
Total hosts:""" + "%s" % self.db.count() + """
""" + + ret += """
+ " + + # Do the div containers + for tab, function, langs in self.tabs: + ret += """
%s
""" % (tab, function(lang),) + + ret += "
" + + return ret + + def table(self, item, lang): + ret = """""" + + results, total = self.db.table(item, sort=1, consolidate=1) + + if not total: + ret += """""" + + else: + for result, value in results: + ret += """""" % \ + (result, int(value * 100 / total)) + + ret += """ + + """ % (total, self.db.count(), total * 100 / int(self.db.count())) + + return ret + "
There is no data available.
%s%d%%
" + + def table_range(self, item, lang, unit, ranges): + ret = """""" + + ranges2 = {} + i = 0 + for min, max in ranges: + ranges2[i] = { "min" : min, + "max" : max, + "count" : 0, } + i += 1 + ranges = ranges2 + + results, total = self.db.table(item) + + if not total: + ret += """""" + + else: + for i in results: + for range in ranges.keys(): + if i >= ranges[range]["min"] and i <= ranges[range]["max"]: + ranges[range]["count"] += 1 + break + + for range in ranges.keys(): + ret += """""" % \ + ("in between %s and %s %s" % (ranges[range]["min"], ranges[range]["max"], unit), + ranges[range]["count"] * 100 / total) + + ret += """ + + """ % (total, self.db.count(), total * 100 / int(self.db.count())) + + return ret + "
There is no data available.
%s%d%%
" + + def tab_os(self, lang): + return self.table("system", lang) + + def tab_arch(self, lang): + return self.table("arch", lang) + + def tab_lang(self, lang): + return self.table("lang", lang) + + def tab_cpu(self, lang): + return self.table("cpu_model", lang) + \ + self.table_range("cpu_mhz", lang, unit="MHz", ranges=((1, 132), (133, 265), + (266, 511), (512, 1023), (1024, 1535), (1536, 2047), (2048, 2559), + (2560, 3071), (3072, 4096))) + + def tab_ram(self, lang): + return self.table_range("ram_mb", lang, unit="MBytes", + ranges=((1,63), (64, 127), (128, 255), (256, 511), (512, 1023), + (1024, 4095), (4096, 16383)),) + + def tab_vendor(self, lang): + return self.table("vendor", lang) + + def tab_model(self, lang): + return self.table("model", lang) + + def tab_formfactor(self, lang): + return self.table("formfactor", lang) + + def tab_storage(self, lang): + return self.table("storage", lang) + + +page = web.Page() +page.content = Content() +page.sidebar = web.elements.DevelopmentSidebar() +page.javascript = Javascript(1, 1) +page.javascript.write(""" + +""") diff --git a/www/rpc.py b/www/rpc.py index 059f56cb..407b228d 100644 --- a/www/rpc.py +++ b/www/rpc.py @@ -8,9 +8,14 @@ from rpc_functions import * form = cgi.FieldStorage() method = form.getfirst("method") id = form.getfirst("id") -params = form.getlist("params") -methods = { "cluster_get_info" : cluster_get_info } +params = None +param_string = form.getfirst("params") +if param_string: + params = json.loads(param_string) + +methods = { "cluster_get_info" : cluster_get_info, + "uriel_send_info" : uriel_send_info, } if method and methods.has_key(method): print json.dumps({ "version": "1.1", diff --git a/www/rpc_functions.py b/www/rpc_functions.py index ca5614f0..02f87f72 100644 --- a/www/rpc_functions.py +++ b/www/rpc_functions.py @@ -1,5 +1,7 @@ #!/usr/bin/python +import time + import web.info info = web.info.Info() @@ -8,3 +10,26 @@ def cluster_get_info(params): import web.cluster cluster = web.cluster.Cluster(info["hosting"]["cluster"]) return cluster.json + +def uriel_send_info(params): + import web.urieldb + db = web.urieldb.Urieldb() + + id = None + items = {} + for (item, value) in params.items(): + if item == "id": + id = value + if item not in web.urieldb.allowed_items: + continue + items[item] = value + + # We need an id + if not id: + return + + for item, value in items.items(): + db.set(id, item, value) + + # Save date of last modification + db.set(id, "date", "%s" % int(time.time())) diff --git a/www/uriel_test.py b/www/uriel_test.py new file mode 100644 index 00000000..c95f8551 --- /dev/null +++ b/www/uriel_test.py @@ -0,0 +1,36 @@ +#!/usr/bin/python + +import sys +import urlgrabber +import urllib +import simplejson as json + +data = {} +id = None + +for arg in sys.argv[1:]: + if not id: + id = data["id"] = arg + continue + + try: + item, value = arg.split("=") + except: + print "Cannot split arg: ", arg + continue + + value = value.strip("\"") + + data[item] = value + +if not data: + print "No data to send." + sys.exit(0) + +request = { "id" : "null", + "method" : "uriel_send_info", + "params" : json.dumps(data), } + +g = urllib.urlopen("http://www.ipfire.org/rpc.py", data=urllib.urlencode(request)) +print g.read() +g.close() diff --git a/www/web/urieldb.py b/www/web/urieldb.py new file mode 100644 index 00000000..d44d5b51 --- /dev/null +++ b/www/web/urieldb.py @@ -0,0 +1,87 @@ +#!/usr/bin/python + +import operator +import MySQLdb as sql + +allowed_items = [ "cpu_mhz", "cpu_model", "formfactor", "lang", "model", + "ram_mb", "storage_mb", "system", "vendor", ] + +class Urieldb(object): + _name = "uriel" + _table = "hosts" + + def __init__(self): + self.connection = sql.connect(user="uriel", db=self._name) + + self._count = None + + def cursor(self): + return self.connection.cursor() + + def table(self, item, sort=0, consolidate=0): + c = self.cursor() + c.execute("SELECT value FROM %s WHERE item = '%s'" % (self._table, item,)) + + count = 0 + results = {} + ret = [] + + if consolidate: + result = c.fetchone() + while result: + count += 1 + result = "%s" % result + + if results.has_key(result): + results[result] += 1 + else: + results[result] = 1 + + result = c.fetchone() + + for i in results.items(): + ret.append(i) + + if sort: + ret = sorted(ret, key=operator.itemgetter(1)) + ret.reverse() + + else: + result = c.fetchone() + while result: + ret.append(int("%s" % result)) + result = c.fetchone() + + if sort: + ret.sort() + + count = len(ret) + + c.close() + return (ret, count) + + def count(self): + if not self._count: + c = self.cursor() + c.execute("SELECT COUNT(DISTINCT(id)) FROM %s" % self._table) + self._count = int("%s" % c.fetchone()) + c.close() + return self._count + + def get(self, id, item): + c = self.cursor() + c.execute("SELECT value FROM %s WHERE id = '%s' AND item = '%s'" % \ + (self._table, id, item,)) + ret = c.fetchall() or None + c.close() + return ret + + def set(self, id, item, value): + c = self.cursor() + if self.get(id, item): + c.execute("UPDATE %s SET value = '%s' WHERE id = '%s' AND item = '%s'" % \ + (self._table, value, id, item,)) + else: + c.execute("INSERT INTO %s(id, item, value) VALUES('%s', '%s', '%s')" % \ + (self._table, id, item, value)) + c.close()