--- /dev/null
+#!/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 = """<h3>IPFire Uriel</h3>
+ <table class="uriel">
+ <tr>
+ <td>Total hosts:</td>
+ <td>""" + "%s" % self.db.count() + """</td>
+ </tr>
+ </table>"""
+
+ ret += """<div id="tabs">
+ <ul>"""
+
+ # Create the links
+ for tab, function, langs in self.tabs:
+ ret += """<li><a href="#%s">%s</a></li>""" % (tab, langs[lang],)
+ ret += "</ul>"
+
+ # Do the div containers
+ for tab, function, langs in self.tabs:
+ ret += """<div id="%s">%s</div>""" % (tab, function(lang),)
+
+ ret += "</div>"
+
+ return ret
+
+ def table(self, item, lang):
+ ret = """<table class="uriel">"""
+
+ results, total = self.db.table(item, sort=1, consolidate=1)
+
+ if not total:
+ ret += """<tr><td class="item" colspan="2">There is no data available.</td></tr>"""
+
+ else:
+ for result, value in results:
+ ret += """<tr><td class="item">%s</td><td class="value">%d%%</td></tr>""" % \
+ (result, int(value * 100 / total))
+
+ ret += """<tr>
+ <td class="footer" colspan="2">%s/%s (%d%%) of the known hosts provide this information</td>
+ </tr>""" % (total, self.db.count(), total * 100 / int(self.db.count()))
+
+ return ret + "</table>"
+
+ def table_range(self, item, lang, unit, ranges):
+ ret = """<table class="uriel">"""
+
+ 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 += """<tr><td class="item" colspan="2">There is no data available.</td></tr>"""
+
+ 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 += """<tr><td class="item">%s</td><td class="value">%d%%</td></tr>""" % \
+ ("in between %s and %s %s" % (ranges[range]["min"], ranges[range]["max"], unit),
+ ranges[range]["count"] * 100 / total)
+
+ ret += """<tr>
+ <td class="footer" colspan="2">%s/%s (%d%%) of the known hosts provide this information</td>
+ </tr>""" % (total, self.db.count(), total * 100 / int(self.db.count()))
+
+ return ret + "</table>"
+
+ 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("""
+ <script type="text/javascript">
+ $(function() {
+ $("#tabs").tabs();
+ });
+ </script>
+""")
--- /dev/null
+#!/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()