def render(self, data): r = [] i = 0 notpresent = T.td(_class="notpresent")[T.acronym( title="Unable to get IP from ARP tables")["N/A"]] for row in data: mac = T.td[T.span(data=row[0], render=T.directive("mac"))] if row[1] is not None: r.append( T.tr(_class=(i % 2) and "odd" or "even") [mac, T.td[T.invisible(data=row[1], render=T.directive("ip"))]]) else: r.append( T.tr(_class=(i % 2) and "odd" or "even")[mac, notpresent]) i += 1 if len(r) == 1: return [('FDB', [ T.span(data=data[0][0], render=T.directive("mac")), data[0][1] and [", ", T.span(data=data[0][1], render=T.directive("ip"))] or "" ], 1)] return [('FDB', [ len(r) == 20 and "20+" or len(r), T.span(render=T.directive("tooltip"), data=T.table(_class="mac")[T.thead[T.td["MAC"], T.td["IP"]], r]) ], len(r) == 20 and 21 or len(r))]
def format_desc_list(singular, descs, plural=None): if plural is None: plural = singular + 's' if not descs: return '' if len(descs) > 1: label = plural else: label = singular r = [] first = True for d in descs: if first: row = tags.tr(class_="fieldStart") row[tags.td(class_="fieldName")[label]] first = False else: row = tags.tr() row[tags.td()] if d.name is None: row[tags.td(colspan=2)[d.format()]] else: row[tags.td(class_="fieldArg")[d.name], tags.td[d.format()]] r.append(row) return r
def render(self, data): r = [] i = 0 vlanlist = [] notpresent = T.td(_class="notpresent")[T.acronym( title="Not present or no information from remote")["N/A"]] for row in data: if row[1] is not None: vlanlist.append(str(row[0])) vid = T.td[T.span(data=row[0], render=T.directive("vlan"))] if row[1] is None: r.append( T.tr(_class=(i % 2) and "odd" or "even")[vid, notpresent, T.td[row[2]]]) elif row[2] is None: r.append( T.tr(_class=(i % 2) and "odd" or "even")[vid, T.td[row[1]], notpresent]) elif row[1] == row[2]: r.append( T.tr(_class=(i % 2) and "odd" or "even")[ vid, T.td(colspan=2)[row[1]]]) else: r.append( T.tr(_class=(i % 2) and "odd" or "even")[vid, T.td[row[1]], T.td[row[2]]]) i += 1 vlantable = T.table(_class="vlan")[T.thead[T.td["VID"], T.td["Local"], T.td["Remote"]], r] return [('VLAN', [[[T.span(data=v, render=T.directive("vlan")), " "] for v in vlanlist], T.span(render=T.directive("tooltip"), data=vlantable)], ", ".join(vlanlist))]
def render(self, data): r = [] i = 0 notpresent = T.td(_class="notpresent")[ T.acronym(title="Unable to get IP from ARP tables")["N/A"]] for row in data: mac = T.td[T.span(data=row[0], render=T.directive("mac"))] if row[1] is not None: r.append(T.tr(_class=(i%2) and "odd" or "even") [mac, T.td[T.invisible(data=row[1], render=T.directive("ip"))]]) else: r.append(T.tr(_class=(i%2) and "odd" or "even") [mac, notpresent]) i += 1 if len(r) == 1: return [('FDB', [T.span(data=data[0][0], render=T.directive("mac")), data[0][1] and [", ", T.span(data=data[0][1], render=T.directive("ip"))] or ""], 1)] return [('FDB', [len(r) == 20 and "20+" or len(r), T.span(render=T.directive("tooltip"), data=T.table(_class="mac")[ T.thead[T.td["MAC"], T.td["IP"]], r])], len(r) == 20 and 21 or len(r))]
def render(self, data): r = [] i = 0 vlanlist = [] notpresent = T.td(_class="notpresent")[ T.acronym(title="Not present or no information from remote")["N/A"]] for row in data: if row[1] is not None: vlanlist.append(str(row[0])) vid = T.td[T.span(data=row[0], render=T.directive("vlan"))] if row[1] is None: r.append(T.tr(_class=(i%2) and "odd" or "even")[ vid, notpresent, T.td[row[2]]]) elif row[2] is None: r.append(T.tr(_class=(i%2) and "odd" or "even") [vid, T.td[row[1]], notpresent]) elif row[1] == row[2]: r.append(T.tr(_class=(i%2) and "odd" or "even") [vid, T.td(colspan=2)[row[1]]]) else: r.append(T.tr(_class=(i%2) and "odd" or "even") [vid, T.td[row[1]], T.td[row[2]]]) i += 1 vlantable = T.table(_class="vlan")[ T.thead[T.td["VID"], T.td["Local"], T.td["Remote"]], r] return [('VLAN', [[ [T.span(data=v, render=T.directive("vlan")), " "] for v in vlanlist ], T.span(render=T.directive("tooltip"), data=vlantable)], ", ".join(vlanlist))]
def render_roster(self, ctx, data): request = inevow.IRequest(ctx) username = request.getUser() ret = tags.table(border=0, cellspacing=5, cellpadding=2) row = tags.tr(height=25)[ tags.th["UIN/Screen Name"], tags.th["Nickname"], tags.th["Network"], tags.th["Avatar"], tags.th["Status"] ] ret[row] roster = self.pytrans.xdb.getList("roster", username) if not roster: return ret for item in roster: if item[0][0].isdigit(): network = "ICQ" else: network = "AIM" avatar = "-" if not config.disableAvatars and item[1].has_key("shahash"): avatar = tags.a(href=("/avatars/%s" % item[1]["shahash"]))[ tags.img( border=0, height=25, src=("/avatars/%s" % item[1]["shahash"])) ] nickname = "-" if "nickname" in item[1]: nickname = item[1]["nickname"] else: if username in self.pytrans.sessions and \ self.pytrans.sessions[username].ready: c = self.pytrans.sessions[username].contactList.getContact( "%s@%s" % (item[0], config.jid)) if c.nickname and c.nickname != "": nickname = c.nickname status = "-" if username in self.pytrans.sessions and \ self.pytrans.sessions[username].ready: c = self.pytrans.sessions[username].contactList.getContact( "%s@%s" % (item[0], config.jid)) status = c.ptype if not status: status = c.show if not status: status = "available" row = tags.tr(height=25)[ tags.td(height=25, align="middle")[item[0]], tags.td(height=25, align="middle")[nickname], tags.td(height=25, align="middle")[network], tags.td(height=25, align="middle")[avatar], tags.td(height=25, align="middle")[status] ] ret[row] return ret
def render_bayeux_environments(self): return [ tags.h3()['Bayeux Environmerts'], tags.table()[ tags.tr()[ tags.th()['Port'], tags.td()[lumen.config['port']], ], tags.tr()[ tags.th()['Engine'], tags.td()[lumen.config['engine']], ] ], ]
def render_roster(self, ctx, data): request = inevow.IRequest(ctx) username = request.getUser() ret = T.table(border=0, cellspacing=5, cellpadding=2) row = T.tr(height=25)[T.th["UIN/Screen Name"], T.th["Nickname"], T.th["Network"], T.th["Avatar"], T.th["Status"]] ret[row] roster = self.pytrans.xdb.getList("roster", username) if not roster: return ret for item in roster: if item[0][0].isdigit(): network = "ICQ" else: network = "AIM" avatar = "-" if not config.disableAvatars and item[1].has_key("shahash"): avatar = T.a(href=("/avatars/%s" % item[1]["shahash"]))[T.img( border=0, height=25, src=("/avatars/%s" % item[1]["shahash"]))] nickname = "-" if item[1].has_key("nickname"): nickname = item[1]["nickname"] else: if self.pytrans.sessions.has_key( username) and self.pytrans.sessions[username].ready: c = self.pytrans.sessions[username].contactList.getContact( "%s@%s" % (item[0], config.jid)) if c.nickname and c.nickname != "": nickname = c.nickname status = "-" if self.pytrans.sessions.has_key( username) and self.pytrans.sessions[username].ready: c = self.pytrans.sessions[username].contactList.getContact( "%s@%s" % (item[0], config.jid)) status = c.ptype if not status: status = c.show if not status: status = "available" row = T.tr(height=25)[T.td(height=25, align="middle")[item[0]], T.td(height=25, align="middle")[nickname], T.td(height=25, align="middle")[network], T.td(height=25, align="middle")[avatar], T.td(height=25, align="middle")[status]] ret[row] return ret
def render_menu(self, ctx, data): request = inevow.IRequest(ctx) username = request.getUser() ret = tags.table(border=0, cellspacing=3, cellpadding=3) row = tags.tr(valign="middle") row[tags.td(_class="menuentry", width="150", align="center", onclick="self.location='/account/'", onmouseover="this.className='menuentrypressed';", onmouseout="this.className='menuentry';") [tags.a(_class="menuentry", href="/account/")["Account"]]] if config.admins.count(username) > 0: row[tags.td(_class="menuentry", width="150", align="center", onclick="self.location='/status/'", onmouseover="this.className='menuentrypressed';", onmouseout="this.className='menuentry';") [tags.a(_class="menuentry", href="/status/")["Status"]]] row[tags.td(_class="menuentry", width="150", align="center", onclick="self.location='/config/'", onmouseover="this.className='menuentrypressed';", onmouseout="this.className='menuentry';") [tags.a(_class="menuentry", href="/config/")["Configuration"]]] row[tags.td(_class="menuentry", width="150", align="center", onclick="self.location='/controls/'", onmouseover="this.className='menuentrypressed';", onmouseout="this.className='menuentry';") [tags.a(_class="menuentry", href="/controls/")["Controls"]]] return ret
def render_channels_list(self): result = tags.table() result.children.append( tags.tr()[ tags.th()['id'], tags.th()['subscribers'], ] ) for clientId, c in channel.channels.items(): result.children.append( tags.tr()[ tags.td()[c.id], tags.td()[len(c.subscribers)], ] ) return result
def test_nestedpatterns(self): def data_table(context, data): return [[1,2,3],[4,5,6]] def data_header(context, data): return ['col1', 'col2', 'col3'] tag = tags.html[ tags.body[ tags.table(data=data_table, render=rend.sequence)[ tags.tr(pattern='header', data=data_header, render=rend.sequence)[ tags.td(pattern='item')[str] ], tags.tr(pattern='item', render=rend.sequence)[ tags.td(pattern='item')[str] ] ] ] ] self.assertEquals(self.render(tag), "<html><body><table><tr><td>col1</td><td>col2</td><td>col3</td></tr><tr><td>1</td><td>2</td><td>3</td></tr><tr><td>4</td><td>5</td><td>6</td></tr></table></body></html>")
def render_content(self, ctx, data): if self.db[0] == "FIRSTRUN": return ctx.tag[tags.table( height="100%", width="100%" )[tags.tr(height="100%")[tags.td[tags.div( id="centerBox", valign="middle" )[tags.div(id="blockTop") [""], tags .div(id="centerBlock")[tags.h1( style="color:#fff;font-family:arial;" )["TUMS Installation Wizard"]], tags .div(id="menuBlock")[tags.div( style= "margin-top:-5em; text-align:left; font-family:arial; color:#786D38;" )[tags.h3["Welcome to the TUMS installation wizard."], """This wizard will guide you through an initial configuration of the host system. This should be carried out by a Thusa employee. If your server has arrived unconfigured it is recommended that you contact Thusa support for this to be carried out. """, tags.br, """Click the NEXT button bellow to continue with the installation""", tags.br, tags.br, tags.a(href="Wizard/1/")[tags.img( src='/images/next.png')]]]]]]]] return ctx.tag[tags.a(href="/auth/")["Login"]]
def test_nestedpatterns(self): def data_table(context, data): return [[1,2,3],[4,5,6]] def data_header(context, data): return ['col1', 'col2', 'col3'] tag = tags.html[ tags.body[ tags.table(data=data_table, render=rend.sequence)[ tags.tr(pattern='header', data=data_header, render=rend.sequence)[ tags.td(pattern='item')[str] ], tags.tr(pattern='item', render=rend.sequence)[ tags.td(pattern='item')[str] ] ] ] ] self.assertEqual(self.render(tag), "<html><body><table><tr><td>col1</td><td>col2</td><td>col3</td></tr><tr><td>1</td><td>2</td><td>3</td></tr><tr><td>4</td><td>5</td><td>6</td></tr></table></body></html>")
def formatHeader(self, columns: [str]) -> bytes: self.columns = columns tr = tags.tr()[ [tags.th()[i] for i in self.columns] ] self.header.children.append(tr) return flat.flatten(tr)
def varTable(usedVars): return t.table(_class="variables")[[ t.tr(_class="varRow")[ t.td(_class="varName")[ key ], t.td(_class="varValue")[ htmlrepr(value) ] ] for (key, value) in usedVars ]]
class HeadCells(rend.Page, HeadCellsMixin): def __init__(self, serManager): self.serManager = serManager docFactory = loaders.stan( T.tr(data=T.directive("fielddefs"), render=rend.sequence) [ T.th(pattern="item", render=T.directive("headCell"), class_="thVertical") ])
class R(rend.Page): def data_numbers(context, data): return [ ['one', 'un/une'], ['two', 'deux'], ['three', 'trois'], ] def render_row(context, data): context.fillSlots('english', data[0]) context.fillSlots('french', data[1]) return context.tag tags = table(data=data_numbers, render=directive('sequence'))[ tr(pattern='header')[th['English'], th['French']], tr(pattern='item', render=render_row)[td[slot('english')], td[slot('french')]], ] docFactory = loaders.stan(tags)
def render_clients_list(self): result = tags.table() result.children.append( tags.tr()[ tags.th()['id'], tags.th()['type'], tags.th()['created at'], ] ) for clientId, c in client.clients.items(): result.children.append( tags.tr()[ tags.td()[clientId], tags.td()[c.typename], tags.td()[c.createdAt.strftime("%A, %d. %B %Y %I:%M%p")], ] ) return result
def render_webconsole_environments(self): return [ tags.h3()['Web console Environments'], tags.table()[ tags.tr()[ tags.th()['Port'], tags.td()[lumen.config['webport']], ], ], ]
def format_field_list(obj, singular, fields, plural=None): if plural is None: plural = singular + 's' if not fields: return '' if len(fields) > 1: label = plural else: label = singular rows = [] first = True for field in fields: if first: row = tags.tr(class_="fieldStart") row[tags.td(class_="fieldName")[label]] first = False else: row = tags.tr() row[tags.td()] row[tags.td(colspan=2)[field.body]] rows.append(row) return rows
def format_field_list(obj, singular, fields, plural=None): if plural is None: plural = singular + 's' if not fields: return '' if len(fields) > 1: label = plural else: label = singular rows = [] first = True for field in fields: if first: row = tags.tr(class_="fieldStart") row[tags.td(class_="fieldName")[label]] first=False else: row = tags.tr() row[tags.td()] row[tags.td(colspan=2)[field.body]] rows.append(row) return rows
def render_content(self, ctx, seg): f = open(self.logfile) blob = f.read().split('\n') cnt = 1 entries = [] for l in blob[-1000:]: line = l.strip('\n') if line: #Jan 4 11:05:21 lilith imapd: Disconnected, ip=[::ffff:172.31.0.254], time=0 parts = line.split() date = ' '.join(parts[:3]) host = parts[3] service = parts[4].strip(':') message = ' '.join(parts[5:]) if cnt % 2: back = "#DDDDDD" else: back = "#EEEEEE" if entries and service == entries[-1][1] and date == entries[ -1][0]: entries[-1][2].extend([tags.br, message]) else: cnt += 1 entries.append([date, service, [message], back]) count = int(self.cnt[1]) * -1 pages = len(entries) / 20 thisPage = int(count / -20) print pages, thisPage, count, count - 20 pageSelect = [] for i in range(pages): if i == thisPage: pageSelect.append(tags.strong[str(i + 1)]) else: pageSelect.append( tags.a(href=url.root.child("Logs").child( self.logfile.replace('/', '%2B')).child( str((i * 20) + 1)))[str(i + 1)]) if i < (pages - 1): pageSelect.append(' | ') return ctx.tag[tags.h3["Select Log"], tags.directive('form selectLog'), tags.h3["Viewing %s" % (self.logfile, )], "[ ", pageSelect, " ]", tags.br, tags.table[[ tags.tr(style="background: %s;" % i[3])[tags.td[i[0]], tags.td[i[1]], tags.td[i[2]], ] for i in reversed(entries[count - 20:count]) ]]]
def render_rooms(self, ctx, data): lines = [] data.sort(key=attrgetter('tzid')) for room in data: empty = T.td(_class='empty')[''] tzid = T.td(_class="tzid")[room.tzid, ':'] editlink = T.td(_class="text")[T.a(href="/edit/%s" % room.tzid)[room.name]] name = T.td(_class="text")[room.name] shortline = T.td(_class="text")[room.short] longline = T.td(_class="text")[room.long] xs = room.exits() if not xs: rowcls = 'warn' else: rowcls = 'normal' lines.append(T.tr(_class=rowcls)[tzid, editlink]) if room.short: lines.append(T.tr(_class=rowcls)[empty, shortline]) if room.long: lines.append(T.tr(_class=rowcls)[empty, longline]) if xs: for x in xs: dest = x.destination desttzid = getattr(dest, 'tzid', 'None') destname = getattr(dest, 'name', None) xlink = T.a(href="/edit/%s" % x.tzid)[x.name] if dest is not None: roomlink = T.a(href="/edit/%s" % desttzid)[destname] else: roomlink = 'Broken' xd = T.td(_class="text2")[xlink, ' --> ', roomlink, ' (%s)' % desttzid] lines.append(T.tr(_class=rowcls)[empty, xd]) lines.append(T.tr(_class='normal')[empty, empty]) return T.table[lines]
def format(self): r = [] ivs = [] for iv in self.ivar_descs: attr = zopeinterface.Attribute(self.obj.system, iv.name, iv.body, self.obj) if iv.name is None or attr.isVisible: ivs.append(iv) self.ivar_descs = ivs cvs = [] for cv in self.cvar_descs: attr = zopeinterface.Attribute(self.obj.system, cv.name, cv.body, self.obj) if attr.isVisible: cvs.append(cv) self.cvar_descs = cvs for d, l in (('Parameters', self.parameter_descs), ('Instance Variables', self.ivar_descs), ('Class Variables', self.cvar_descs), ('Variables', self.var_descs)): r.append(format_desc_list(d, l, d)) if self.return_desc: r.append( tags.tr(class_="fieldStart")[ tags.td(class_="fieldName")['Returns'], tags.td(colspan="2")[self.return_desc.format()]]) r.append(format_desc_list("Raises", self.raise_descs, "Raises")) for s, p, l in (('Author', 'Authors', self.authors), ('See Also', 'See Also', self.seealsos), ('Present Since', 'Present Since', self.sinces), ('Note', 'Notes', self.notes)): r.append(format_field_list(self.obj, s, l, p)) unknowns = {} unknownsinorder = [] for fieldinfo in self.unknowns: tag = fieldinfo.kind if tag in unknowns: unknowns[tag].append(fieldinfo) else: unknowns[tag] = [fieldinfo] unknownsinorder.append(unknowns[tag]) for fieldlist in unknownsinorder: label = "Unknown Field: " + fieldlist[0].kind r.append(format_desc_list(label, fieldlist, label)) return tags.table(class_='fieldTable')[r]
def render_index_rooms(self, ctx, data): lines = [] data.sort(key=attrgetter('name')) for room in data: editlink = T.a(href="/edit/%s" % room.tzid)[room.name] tzid = T.td(_class="roomtzid")[room.tzid, ':'] #name = T.td(_class="roomname")[room.name] name = T.td(_class="roomname")[editlink] if not room.exits(): row = T.tr(_class='warn') else: row = T.tr lines.append(row[tzid, name]) return T.table[lines]
def makeDocFactory(self): return loaders.stan([ T.div(render=T.directive("meta"), class_="warning")["_warning"], T.table(class_="keyvalue", render=rend.mapping, data=T.directive("firstrow")) [ [[T.tr[ T.th(data=colDef, render=T.directive("headCell"), class_="thHorizontal"), td], T.tr(class_="keyvaluedesc")[T.td(colspan=2)[ colDef.description]]] for colDef, td in zip(self.serManager.table.tableDef.columns, self.defaultTds)]], T.invisible(render=T.directive("footnotes")), ])
def format(self): r = [] ivs = [] for iv in self.ivar_descs: attr = zopeinterface.Attribute( self.obj.system, iv.name, iv.body, self.obj) if iv.name is None or attr.isVisible: ivs.append(iv) self.ivar_descs = ivs cvs = [] for cv in self.cvar_descs: attr = zopeinterface.Attribute( self.obj.system, cv.name, cv.body, self.obj) if attr.isVisible: cvs.append(cv) self.cvar_descs = cvs for d, l in (('Parameters', self.parameter_descs), ('Instance Variables', self.ivar_descs), ('Class Variables', self.cvar_descs), ('Variables', self.var_descs)): r.append(format_desc_list(d, l, d)) if self.return_desc: r.append(tags.tr(class_="fieldStart")[tags.td(class_="fieldName")['Returns'], tags.td(colspan="2")[self.return_desc.format()]]) r.append(format_desc_list("Raises", self.raise_descs, "Raises")) for s, p, l in (('Author', 'Authors', self.authors), ('See Also', 'See Also', self.seealsos), ('Present Since', 'Present Since', self.sinces), ('Note', 'Notes', self.notes)): r.append(format_field_list(self.obj, s, l, p)) unknowns = {} unknownsinorder = [] for fieldinfo in self.unknowns: tag = fieldinfo.kind if tag in unknowns: unknowns[tag].append(fieldinfo) else: unknowns[tag] = [fieldinfo] unknownsinorder.append(unknowns[tag]) for fieldlist in unknownsinorder: label = "Unknown Field: " + fieldlist[0].kind r.append(format_desc_list(label, fieldlist, label)) return tags.table(class_='fieldTable')[r]
def render_transactions(self, ctx): coll = mongo['heist']['transactions'] rows = reversed(list(coll.find(sort=[("readAt", -1)], limit=6))) now = datetime.datetime.now(tzlocal()) def recentClass(d): if (now - d).total_seconds() < 86400 * 2: return {"class": "recent"} return {} return T.table(class_="transactions")[[ T.tr(**recentClass(row['date']))[T.td( class_="date")[row['date'].date().isoformat()], T.td(class_="to")[row['payee']], T.td(class_="amt")[row['amount']]] for row in rows ]]
def render_transactions(self, ctx): coll = mongo["heist"]["transactions"] rows = reversed(list(coll.find(sort=[("readAt", -1)], limit=6))) now = datetime.datetime.now(tzlocal()) def recentClass(d): if (now - d).total_seconds() < 86400 * 2: return {"class": "recent"} return {} return T.table(class_="transactions")[ [ T.tr(**recentClass(row["date"]))[ T.td(class_="date")[row["date"].date().isoformat()], T.td(class_="to")[row["payee"]], T.td(class_="amt")[row["amount"]], ] for row in rows ] ]
def render_menu(self, ctx, data): request = inevow.IRequest(ctx) username = request.getUser() ret = T.table(border=0, cellspacing=3, cellpadding=3) row = T.tr(valign="middle") row[T.td(_class="menuentry", width="150", align="center", onclick="self.location='/account/'", onmouseover="this.className='menuentrypressed';", onmouseout="this.className='menuentry';")[T.a( _class="menuentry", href="/account/")["Account"]]] if config.admins.count(username) > 0: row[T.td(_class="menuentry", width="150", align="center", onclick="self.location='/status/'", onmouseover="this.className='menuentrypressed';", onmouseout="this.className='menuentry';")[T.a( _class="menuentry", href="/status/")["Status"]]] row[T.td(_class="menuentry", width="150", align="center", onclick="self.location='/config/'", onmouseover="this.className='menuentrypressed';", onmouseout="this.className='menuentry';")[T.a( _class="menuentry", href="/config/")["Configuration"]]] row[T.td(_class="menuentry", width="150", align="center", onclick="self.location='/controls/'", onmouseover="this.className='menuentrypressed';", onmouseout="this.className='menuentry';")[T.a( _class="menuentry", href="/controls/")["Controls"]]] ret[row] return ret
def render_vlans(self, ctx, data): if not data: return ctx.tag["No VLAN information available for this host."] vlans = {} for row in data: if (row[0], row[1]) not in vlans: vlans[row[0], row[1]] = [] vlans[row[0], row[1]].append(row[2]) r = [] i = 0 vlans = list(vlans.iteritems()) vlans.sort() for (vid, name), ports in vlans: r.append(T.tr(_class=(i%2) and "odd" or "even")[ T.td[T.span(data=vid, render=T.directive("vlan"))], T.td[name], T.td(render=T.directive("ports"), data=ports)]) i += 1 return T.table(_class="vlan")[ T.thead[T.td["VID"], T.td["Name"], T.td["Ports"]], r]
def render_vlans(self, ctx, data): if not data: return ctx.tag["No VLAN information available for this host."] vlans = {} for row in data: if (row[0], row[1]) not in vlans: vlans[row[0], row[1]] = [] vlans[row[0], row[1]].append(row[2]) r = [] i = 0 vlans = list(vlans.iteritems()) vlans.sort() for (vid, name), ports in vlans: r.append( T.tr(_class=(i % 2) and "odd" or "even") [T.td[T.span(data=vid, render=T.directive("vlan"))], T.td[name], T.td(render=T.directive("ports"), data=ports)]) i += 1 return T.table(_class="vlan")[T.thead[T.td["VID"], T.td["Name"], T.td["Ports"]], r]
class Tester(livepage.LivePage): addSlash = True child_css = static.File(util.resource_filename('nevow', 'livetest.css')) child_scripts = static.File(util.resource_filename('nevow', 'livetest.js')) child_postscripts = static.File(util.resource_filename('nevow', 'livetest-postscripts.js')) docFactory = loaders.stan(tags.html[ tags.head[ tags.script(src="scripts"), tags.link(rel="stylesheet", type="text/css", href="css")], tags.body[ tags.table(id="testprogress")[ tags.tr[ tags.th["Tests"], tags.th["Pass"], tags.th["Fail"]], tags.tr[ tags.td(id="test-status")["Running"], tags.td(id="test-passes", _class="test-passes")[entities.nbsp], tags.td(id="test-failures", _class="test-failures")[entities.nbsp]]], tags.table(id="testresults", render=tags.directive('sequence'))[ tags.tr(pattern="item", render=tags.directive('test'))[ tags.td(title=tags.slot('action'))[tags.slot('action')], tags.td(title=tags.slot('target'))[tags.slot('target')], tags.td(title=tags.slot('parameter'))[tags.slot('parameter')]]], tags.iframe(id="testframe", src="asdf"), tags.script(src="postscripts"), livepage.glue]]) def beforeRender(self, ctx): self.testId = 0 def render_test(self, ctx, test): ctx.tag(id=("test-", self.testId)) action, target, parameter = test ctx.fillSlots('action', action) ctx.fillSlots('target', str(target)) ctx.fillSlots('parameter', str(parameter)) self.testId += 1 return ctx.tag def goingLive(self, ctx, handle): Driver(handle, self.original)
def render_table(self, ctx, data): if not ctx.arg('dir'): return [] d = URIRef(ctx.arg('dir')) # "http://photo.bigasterisk.com/digicam/dl-2008-09-25") rows = [] for i, (pic, filename) in enumerate(sorted( picsInDirectory(self.graph, d))[:]): img = T.img(src=[localSite(pic), '?size=thumb'], onclick='javascript:photo.showLarge("%s")' % (localSite(pic) + "?size=large")) picCols = [''] * self.brickColumns for fill in range(i, self.brickColumns): picCols[fill] = T.td picCols[i % self.brickColumns] = T.td(rowspan=self.brickColumns)[img] rows.append(T.tr(subj=pic)[ T.td[T.a(href=localSite(pic))[filename]], picCols, ]) return rows
def rend_table(self,ctx,data): return tags.table[ tags.tr[ tags.th["hea'der1"], tags.th["hea'der2"]], tags.tr(id="ro'w1")[ tags.td["va'l1"],tags.td["va'l2"]]]
def render_content(self, ctx, data): routes = [] i = 0 for iface, vals in self.sysconf.EthernetDevices.items(): for ro in vals.get('routes', []): i += 1 routes.append((ro[0], ro[1], iface, tags.a(href="Delete/%s" % i)[tags.img(src="/images/ex.png")])) balances = [] zones = [] num = 0 for bal in self.sysconf.ShorewallBalance: if "-" in bal[1]: gateway = "" # Detect gateway else: gateway = bal[1] zones.append(bal[0]) balances.append([ bal[0], gateway, 'balance' in bal[2], 'track' in bal[2], 'loose' in bal[2], tags.a(href="DeleteBalance/%s" % num)[tags.img(src="/images/ex.png")] ]) num += 1 sourceroutes = [] num = 0 for src in self.sysconf.ShaperRules: rules = src.split() print rules, zones try: zone = zones[int(rules[0].split(':')[0]) - 1] # Read the zone from the mark except: zone = "Mark " + rules[0].split(':')[0] source = rules[1] if rules[2] == "0.0.0.0/0": dest = "any" else: dest = rules[2] protocol = rules[3] port = rules[4] sourceroutes.append([ zone, source, dest, protocol, port, tags.a(href="DeleteSource/%s" % num)[tags.img(src="/images/ex.png")] ]) num += 1 return ctx.tag[ tags.table( width="100%" )[tags.tr[tags.td(align="left")[tags.h3[tags.img( src="/images/netflow.png"), " IP Routing"]], tags.td( align='right' )[tags.a(id="advBtn", href="#", onclick="setAdvanced('routing', true);" )["Advanced"]]]], PageHelpers .TabSwitcher(( ('Static Routes', 'panelStatic'), ('BGP', 'panelBGP'), ('RIP', 'panelRIP'), ( 'Connections', 'panelBalance'), ('Policy Routing', 'panelSource'), ('Proxy ARP', 'panelParp'), ('Routing Table', 'panelTable'), #('IPv6 Tunnel', 'panelTunnel') )), tags.div(id="panelTable", _class="tabPane")[ tags.h3["Routing Table"], tags.invisible( render=tags .directive('routingTable') )], tags.div( id="panelBalance", _class="tabPane" )[tags.h3["Load Balancing"], PageHelpers .dataTable([ 'Zone', 'Gateway', 'Load Balance', 'Tracking', 'Soft Routes', '' ], balances, sortable =True), tags.h3["Add Connection"], tags.directive('form balance' )], tags.div( id="panelSource", _class="tabPane" )[tags.h3["Policy Routes"], PageHelpers .dataTable([ 'Zone', 'Source', 'Destination', 'Protocol', 'Port/SubService', '' ], sourceroutes, sortable =True), tags.h3["Add source route"], tags.directive('form source' )], tags .div(id="panelStatic", _class="tabPane" )[ tags .h3["Static Routes"], PageHelpers .dataTable(['Destination', 'Gateway', 'Device', ''], routes, sortable=True), tags.h3["Add route"], tags .directive('form statroutes' )], tags.div(id="panelParp", _class="tabPane") [tags.h3["Proxy ARP"], tags. p["Proxy ARP allows you to forward external IP addresses to internal machines as ", "if they were routable. This server will respond to ARP requests for all interfaces", "on all interfaces and those listed here. You should use this if your ISP allocates ", "you a subnet of IP addresses and you wish to make use of one on a machine in a DMZ", "or local LAN from this gateway. Use a DNAT block in the firewall if you wish to simply forward ports."], PageHelpers.dataTable(['IP', 'External', 'Internal', ''], [[ i[0], i[2], i[1], tags.a(href="Delparp/%s/" % i[0])[tags.img(src="/images/ex.png")] ] for i in self.sysconf.Shorewall.get('proxyarp', {})], sortable=True), tags.h3["Add Proxy ARP"], tags.directive('form parp')], tags.div(id="panelRIP", _class="tabPane")[ tags.h3["RIP"], tags.strong["Interfaces"], self.ripInterface.applyTable(self), tags.strong["Networks"], self.ripPrefix.applyTable(self)], tags.div(id="panelBGP", _class="tabPane")[[[ tags.h3["AS ", asn], tags.a(href="Delas/%s/%s" % (asn, i))[tags.img(src="/images/ex.png"), " Delete Router AS ", asn], tags.br, tags.br, tags.table(valign="top")[ tags.tr(valign="top")[tags.td["ID: "], tags.td[det['router-id']]], tags.tr(valign="top")[tags.td["Neighbors: "], tags.td[ PageHelpers.dataTable( ['Remote', 'AS', 'Multi-hop', 'Next-Hop', ''], [[ i, negh.get('as', asn), negh.get('multihop', False) and 'Yes' or 'No', negh.get('nexthop', False) or 'Peer', tags.a(href="Delneigh/%s/%s" % (asn, i))[tags.img( src="/images/ex.png")] ] for i, negh in det.get('neighbors', {}).items()], sortable=True), tags.a(href="AddNeigh/%s/" % asn)["Add Neighbor"], tags.br, ]], tags.tr(valign="top")[tags.td["Networks: "], tags.td[ PageHelpers.dataTable(['Netmask', ''], [[ i, tags.a(href="Delnet/%s/%s" % (asn, i.replace('/', '+')))[tags.img( src="/images/ex.png")], ] for i in det.get('networks', [])], sortable=True), tags.a(href="AddNet/%s/" % asn)["Add Network"]]]] ] for asn, det in self.sysconf.BGP.items()], tags.h3["Add AS"], tags.directive('form bgp' )], #tags.div(id="panelTunnel", _class="tabPane")[ # tags.h3["Configure IPv6 Tunnel"], # tags.directive('form tunnelConf') #], PageHelpers.LoadTabSwitcher(), ]
def render_content(self, ctx, seg): if self.logfile in self.vlogs: # Get file size sz = os.stat(self.logfile).st_size f = open(self.logfile) # Don't read more than 1MB if sz > 1024000: # Seek to 1MB quick f.seek(sz - 1024000) # Throw this line away. _ = f.readline() else: return ctx.tag["Invalid log"] cnt = 1 entries = [] for l in f: line = l.strip('\n') if line and 'exim4' in self.logfile: parts = line.split() date = ' '.join(parts[:2]) mid = parts[2] message = ' '.join(parts[2:]) if cnt%2: back = "#DDDDDD" else: back = "#EEEEEE" if entries and 'mailsvr'==entries[-1][1] and date==entries[-1][0]: # Merge items entries[-1][2].extend([tags.br, message]) else: cnt+=1 entries.append([date, 'mailsvr', [message], back]) elif line: if 'tums-audit' in self.logfile: parts = line.split() date = ' '.join(parts[:4]) host = "" service = parts[4] message = ' '.join(parts[5:]) else: parts = line.split() date = ' '.join(parts[:3]) host = parts[3] service = parts[4].strip(':') message = ' '.join(parts[5:]) if cnt%2: back = "#DDDDDD" else: back = "#EEEEEE" if entries and service==entries[-1][1] and date==entries[-1][0]: # Merge line items entries[-1][2].extend([tags.br, message]) else: cnt+=1 entries.append([date, service, [message], back]) # Filter the log if self.cnt[2]: oldEntries = entries entries = [] for i in oldEntries: skip = False messages = i[2] msg = ''.join(messages) if "--" == self.cnt[2][:2]: if self.cnt[2][2:] in msg: # Filter line found skip = True else: if not (self.cnt[2] in msg): # Filter line not found skip = True if not skip: entries.append(i) else: pass #print messages, "SKIPPED" # Paginate the returned log. count = int(self.cnt[1])*-1 pages = len(entries)/20 thisPage = int(count/-20) pageSelect = [] for i in range(pages): if i == thisPage: pageSelect.append(tags.strong[str(i+1)]) else: if self.cnt[2]: childLink = url.root.child("Logs").child(self.logfile.replace('/', '+')).child(str((i*20)+1)).child(self.cnt[2]) else: childLink = url.root.child("Logs").child(self.logfile.replace('/', '+')).child(str((i*20)+1)) pageSelect.append( tags.a( href=childLink )[str(i+1)] ) if i < (pages-1): pageSelect.append(' | ') return ctx.tag[ tags.h3["Select Log"], tags.directive('form selectLog'), tags.h3["Viewing %s"%(self.logfile,)], "[ ", pageSelect, " ]", tags.br, tags.table[ [ tags.tr(style="background: %s;" % i[3])[ tags.td[i[0]], tags.td[i[1]], tags.td[i[2]], ] for i in reversed(entries[count-20:count])] ], tags.br, tags.h3["Apply filter"], tags.directive('form filterLog') ]
class Page(Reports.Page): docFactory = loaders.xmlfile('overview.xml', templateDir=Settings.BaseDir + '/templates') def roundedBlock(self, title, content): return tags.div(_class="roundedBlock")[tags.img( src="/images/network-small.png"), tags.h1[title], tags.div[content]] def yearGraph(self, iface, stat): # This guy generates an image tag which makes a pyCha inset = [] outset = [] lables = [] tmax = max([i[1] for i in stat]) tmaxo = max([i[0] for i in stat]) if tmaxo > tmax: tmax = tmaxo if tmax > 1000: off = 1000 cstart = "/chart?type=line&width=500&height=200&ylab=Data+volume+(GBytes)&legright=y" else: off = 1 cstart = "/chart?type=line&width=500&height=200&ylab=Data+volume+(MBytes)&legright=y" for data in stat: inset.append(data[0] / off) outset.append(data[1] / off) lables.append('%.2d %s' % (data[3], data[2])) cstart += "&set=In&data=%s" % ('+'.join([str(i) for i in inset])) cstart += "&set=Out&data=%s" % ('+'.join([str(i) for i in outset])) for lable in lables: cstart += "&lables=%s" % lable return tags.img(src=cstart) def getStats(self): # Get rolling monthly stats for 12 months on each interface interfaces = Utils.getInterfaces() stat = {} da = datetime.datetime.now() year = da.year stats = os.listdir('/usr/local/tcs/tums/rrd/') for n in stats: if not ((str(year) in n) or (str(year - 1) in n)): # Ditch superflous years without hesitation continue if not 'total' in n: continue if n[-4:] != ".nid": continue # Figure out interface iface = n.split('_')[1] date = n.split('_')[2].replace('total.nid', '') segYear = int(date[-4:]) date = time.localtime( os.stat('/usr/local/tcs/tums/rrd/%s' % n).st_mtime) if segYear == date[0]: # Probably ok segMonth = date[1] else: # Someone has messed with the time stamp on the file :( sm = date[-6:-4] if int(sm) > 12: segMonth = int(sm[1]) else: segMonth = int(sm) # Grab the contents... l = open('/usr/local/tcs/tums/rrd/%s' % n) try: iin, iout = [ int(float(i) / 1000000) for i in l.read().strip('\n').strip().split(':') ] except: inn, iout = (0, 0) if iface not in stat: stat[iface] = {} stamp = "%s%.2d" % (segYear, segMonth) if stamp in stat[iface]: stat[iface][stamp][0] += iin stat[iface][stamp][1] += iout else: stat[iface][stamp] = [iin, iout, segYear, segMonth] newstat = {} for iface, detail in stat.items(): dlist = detail.keys() dlist.sort() # Pick the most recent 12 ourlist = dlist[-12:] newstat[iface] = [] # Reconstruct an ordered set for each interface instead of an unordered dictionary for n in ourlist: newstat[iface].append(detail[n]) return newstat def render_content(self, ctx, seg): interfaces = Utils.getInterfaces() stat = {} da = datetime.datetime.now() month = "%s%s" % (da.month, da.year) lastmonth = "%s%s" % ( (da.month - 1) or 12, # 12th month if current month is 1 (da.month - 1) and da.year or da.year - 1 # Previous year if current month is 1 ) today = "%s%s%s" % (da.day, da.month, da.year) for i in interfaces: if not 'tap' in i and not 'eth' in i and not 'ppp' in i: continue stat[i] = {'24': [0, 0], 'month': [0, 0], 'lastmonth': [0, 0]} # Read the traffic counters try: p = open('/usr/local/tcs/tums/rrd/iface_%s_%stotal.nid' % (i, today)).read().split(':') stat[i]['24'] = (float(p[0]), float(p[1])) # Last 24 Hours # Try figure out the whole day for fi in os.listdir('/usr/local/tcs/tums/rrd/'): if 'iface_%s' % i in fi and "%stotal.nid" % month in fi: p = open('/usr/local/tcs/tums/rrd/' + fi).read().split(':') for j in xrange(2): stat[i]['month'][j] += float(p[j]) if 'iface_%s' % i in fi and "%stotal.nid" % lastmonth in fi: p = open('/usr/local/tcs/tums/rrd/' + fi).read().split(':') for j in xrange(2): stat[i]['lastmonth'][j] += float(p[j]) except Exception, e: stat[i]['24'] = (0, 0) stat[i]['month'] = (0, 0) yearStats = self.getStats() return ctx.tag[ tags.h3[tags.img(src="/images/system.png"), " Interface Statistics"], tags.table(width="95%")[[ tags.tr[[ tags.td[self.roundedBlock(j, [ tags.img(src="/images/graphs/iface-%sFS.png" % j), tags.h3["Traffic"], self.yearGraph(j, yearStats[j]), tags.table(cellpadding=5)[tags.tr(valign="top")[ tags.td[tags.strong["Today: "]], tags.td[tags.table(cellspacing=0, cellpadding=0)[ tags.tr[tags.td["Out: "], tags. td[Utils.intToH(stat[j]['24'][1])], ], tags.tr[tags.td["In: "], tags. td[Utils.intToH(stat[j]['24'][0])]]]]], tags.tr( valign="top" )[tags. td[tags. strong["This Month: "]], tags.td[tags.table( cellspacing=0, cellpadding=0 )[tags.tr[ tags.td["Out: "], tags.td[Utils.intToH( stat[j]['month'][1] )], ], tags. tr[tags.td["In: "], tags.td[Utils.intToH( stat[j]['month'][0] )]]]]], tags.tr( valign="top" )[tags.td[tags.strong[ "Previous Month: "]], tags.td[tags.table( cellspacing=0, cellpadding=0 )[tags.tr[ tags.td["Out: "], tags. td[Utils.intToH(stat[ j]['lastmonth'][1] )], ], tags. tr[tags.td["In: "], tags. td[Utils.intToH(stat[ j]['lastmonth'][0] )]]]]], ] ])] for j in i if j ]] for i in WebUtils.runIter(1, stat.keys()) ]]]
def formatRow(self, row: IReportData) -> bytes: tr = tags.tr()[ [tags.td()[row[i]] for i in self.columns] ] self.body.children.append(tr) return flat.flatten(tr)
def testXbuild_grid(argsdict, request=None): start_time = clock() one_week = 60 * 60 * 24 * 7 one_week_ago = start_time - one_week max_results = (int(argsdict['max_results']) if ('max_results' in argsdict and argsdict['max_results'] != '') else 128) if max_results < 1: print 'Max results must be at least 1' sys.exit(1) countdown = max_results test_cases = (None if ('test_cases' not in argsdict or argsdict['test_cases'] == None or argsdict['test_cases'] == '') else (compile(argsdict['test_cases']) if ('case' in argsdict and argsdict['case']) else compile( argsdict['test_cases'], IGNORECASE))) exclude_cases = (None if ('exclude_cases' not in argsdict or argsdict['exclude_cases'] == None or argsdict['exclude_cases'] == '') else (compile(argsdict['exclude_cases']) if ('case' in argsdict and argsdict['case']) else compile( argsdict['exclude_cases'], IGNORECASE))) results_by_build = {} results = [] tests = set() build_ids = [] mongo = src.bvtlib.mongodb.get_autotest() branch = argsdict['branch'] if 'branch' in argsdict else 'master' builds_query = {'branch': branch} force = 'force' in argsdict and argsdict['force'] sort_columns = argsdict[ 'sort_columns'] if 'sort_columns' in argsdict else 'alphabetic' total_fails_by_test = {} total_passes_by_test = {} day_results = {} latest_year = None latest_yday = None day_fails = 0 day_passes = 0 for build in mongo.builds.find(builds_query).sort([('tag_time', DESCENDING) ]): build_id = build['_id'] build_time = (build['tag_time'] if 'tag_time' in build else (['timestamp'] if 'timestamp' in build else None)) successes_for_build = {} failures_for_build = {} results_query = {'build': build_id} interesting = False for result in mongo.results.find(results_query): if 'infrastructure_problem' not in result or result[ 'infrastructure_problem'] == False: if 'test_case' in result: test_case = result['test_case'] if (test_case != None and (test_cases == None or test_cases.search(test_case)) and (exclude_cases == None or not exclude_cases.search(test_case)) and (force or 'experiments.py' not in test_case)): if 'failure' in result and result['failure'] != '': result_details = result['failure'] interesting = True if test_case in failures_for_build: failures_for_build[test_case].append( result_details) else: failures_for_build[test_case] = [ result_details ] if test_case in total_fails_by_test: total_fails_by_test[test_case] += 1 else: total_fails_by_test[test_case] = 1 day_fails += 1 else: if 'end_time' in result: interesting = True if test_case in successes_for_build: successes_for_build[test_case].append( result) else: successes_for_build[test_case] = [result] if test_case in total_passes_by_test: total_passes_by_test[test_case] += 1 else: total_passes_by_test[test_case] = 1 day_passes += 1 if interesting: results_for_build = (build_time, successes_for_build, failures_for_build) gmt = gmtime(float(build_time)) if ((gmt.tm_year != latest_year) or (gmt.tm_yday != latest_yday)): latest_year = gmt.tm_year latest_yday = gmt.tm_yday date_text = strftime('%Y-%m-%d', gmt) day_results[date_text] = (': ' + repr(day_passes) + ' passed, ' + repr(day_fails) + ' failed') day_fails = 0 day_passes = 0 results.append(results_for_build) results_by_build[build_id] = results_for_build build_ids.append(build_id) countdown -= 1 if countdown == 0: break tests.update(failures_for_build.keys()) tests.update(successes_for_build) if countdown == 0: break # convert from set to list test_names = [test for test in tests] if sort_columns == 'ratio': sort_text = 'Columns are sorted by decreasing ratio of fails.' ratios = {} for test in test_names: passes = total_passes_by_test[ test] if test in total_passes_by_test else 0 fails = total_fails_by_test[ test] if test in total_fails_by_test else 0 ratios[test] = -1 if (passes == 0 and fails == 0) else fails / (passes + fails) test_names = [ name for name, count in sorted( ratios.iteritems(), key=itemgetter(1), reverse=True) ] elif sort_columns == 'frequency': sort_text = 'Columns are sorted by decreasing number of fails.' frequencies = {} for test in test_names: frequencies[test] = total_fails_by_test[ test] if test in total_fails_by_test else 0 test_names = [ name for name, count in sorted( frequencies.iteritems(), key=itemgetter(1), reverse=True) ] elif sort_columns == 'alphabetic': sort_text = 'Columns are sorted alphabetically by test case description.' test_names.sort() else: sort_text = 'Columns are not sorted, as an unknown sort type "' + repr( sort_columns) + '" was specified.' column_number = 1 column_numbers = {} column_names = [th['Test case']] column_keys = [] test_labels = {} for test_name in test_names: test_label = test_name.replace(' ', '_') column_numbers[test_name] = column_number column_heading = th[a(href="#" + test_label, title=test_name)[repr(column_number)]] column_names.append(column_heading) column_keys.append(li[a(name=test_label)[a( href="http://autotest/results?reverse=1&test_case=" + test_name)[test_name]]]) test_labels[test_name] = test_label column_number += 1 rows = [column_names] latest_year = None latest_yday = None column_count = 1 + len(column_names) build_number_pattern = compile('.+-([0-9]+)-.+') day_heading_style = {'colspan': column_count, 'class': 'day_heading'} for build_id in build_ids: (build_time, successes, failures) = results_by_build[build_id] try: build_number_match = build_number_pattern.match(build_id) build_number_string = build_number_match.group( 1) if build_number_match else build_id gmt = gmtime(float(build_time)) if ((gmt.tm_year != latest_year) or (gmt.tm_yday != latest_yday)): latest_year = gmt.tm_year latest_yday = gmt.tm_yday raw_date_text = strftime('%Y-%m-%d', gmt) date_text = raw_date_text if float(build_time) >= one_week_ago: date_text += strftime(' (%A)', gmt) if day_results[raw_date_text] != None: date_text += day_results[raw_date_text] rows.append([tr[th(**day_heading_style)[date_text]]]) cells = [ th(title=(build_id + '\n' + asctime(gmt)))[a(href="http://autotest/build/" + build_id)[build_number_string], br(), strftime('%H:%M:%S', gmt)] ] except TypeError: gmt = None cells = [th[a(href="http://autotest/build/" + build_id)[build_id]]] for test in test_names: success_count = len(successes[test]) if test in successes else 0 this_test_failures = failures[test] if test in failures else None fail_count = len( this_test_failures) if this_test_failures != None else 0 some_passed = success_count > 0 some_failed = fail_count > 0 no_results = not (some_passed or some_failed) if proportionate_colour: colour = white if no_results else rgb_string( fail_count, success_count, 0, intensity=0.5) else: several_failed = fail_count > 1 colour = (amber if some_passed and some_failed else (white if no_results else ((green if success_count > 1 else pale_green ) if not some_failed else (red if several_failed else pale_red)))) cell_hover_text = test + ': ' + repr(success_count) + ( ' pass' if success_count == 1 else ' passes') if some_failed: # collect up identical error messages so we can just give a count instead of repeating them fail_detail_counts = {} for x in this_test_failures: fail_detail_counts[x] = fail_detail_counts[ x] + 1 if x in fail_detail_counts else 1 details = [ repr(count) + ": " + # display commonest error messages first message for message, count in sorted( fail_detail_counts.iteritems(), key=itemgetter(1), reverse=True) if message != None ] cell_hover_text = cell_hover_text + '\nFailures:\n' + ( '\n'.join(details)) cell_text = [ div(align='left')[repr(success_count)], div(align='right')[repr(fail_count)] ] if some_passed or some_failed: cells.append( td(bgcolor=colour)[a(href="results?build=" + build_id + "&test_case=" + test, title=cell_hover_text)[cell_text]]) else: cells.append(td[' ']) rows.append([tr[cells]]) passes_row = [th['Passes']] fails_row = [th['Fails']] for test_name in test_names: pass_count = total_passes_by_test[ test_name] if test_name in total_passes_by_test else 0 fail_count = total_fails_by_test[ test_name] if test_name in total_fails_by_test else 0 total = pass_count + fail_count colour_string = 'white' if total == 0 else rgb_string( fail_count, pass_count, 0, intensity=0.5) passes_row.append(td(bgcolor=colour_string)[repr(pass_count)]) fails_row.append(td(bgcolor=colour_string)[repr(fail_count)]) rows.insert(1, tr[fails_row]) rows.insert(1, tr[passes_row]) column_key = [ol[column_keys]] table_grid = [ table(border='true', style="border-collapse: collapse", align="center", width="96%")[rows] ] title_text = 'BVT results grid for ' + branch if ('test_cases' in argsdict and argsdict['test_cases'] != None and argsdict['test_cases'] != ''): title_text += ' matching "' + argsdict['test_cases'] + '"' if ('exclude_cases' in argsdict and argsdict['exclude_cases'] != None and argsdict['exclude_cases'] != ''): title_text += ' excluding "' + argsdict['exclude_cases'] + '"' if request != None: requery_form = [ table( align="center", width="96%", bgcolor="#f0f0f0" )[tr() [td()['Branch: ', stan_input(name='branch', value=branch)['']], td( )['Test cases: ', stan_input(name='test_cases', value=( argsdict['test_cases'] if 'test_cases' in argsdict else ''))[''], " ", 'Excluded cases: ', stan_input(name='exclude_cases', value=( argsdict['exclude_cases'] if 'exclude_cases' in argsdict else ''))[''], " ", 'Case-significant search', stan_input(type='checkbox', name='case')['']], td()['Include malformed results:', stan_input(type='checkbox', name='force')['']]], tr()[td()['Columns sort order: ', stan_input(type='radio', name='sort_columns', value='alphabetic', **({ 'checked': 1 } if sort_columns == 'alphabetic' else {} ))['alphabetic'], " ", stan_input(type='radio', name='sort_columns', value='frequency', **({ 'checked': 1 } if sort_columns == 'frequency' else {} ))['frequency'], " ", stan_input(type='radio', name='sort_columns', value='ratio', **({ 'checked': 1 } if sort_columns == 'ratio' else {} ))['ratio']], td()['Max results:', stan_input(name='max_results', value=max_results)['']], td()[stan_input(type='submit')]]] ] else: requery_form = None page_contents = [title[title_text], h1[title_text]] page_contents += [ p[key_text], p[sort_text], table_grid, h2['column key'], p[sort_text], column_key ] if not proportionate_colour: page_contents += [h2['cell key'], key_table] page_contents += [hr(), div(align='right')['produced at ', asctime()]] return str(nevow.flat.flatten(page_contents)), str( nevow.flat.flatten(requery_form))
def render_events(self, ctx, data): if not self.download_status.storage_index: return srt = self.short_relative_time l = T.ul() t = T.table(class_="status-download-events") t[T.tr[T.td["serverid"], T.td["sent"], T.td["received"], T.td["shnums"], T.td["RTT"]]] dyhb_events = [] for serverid,requests in self.download_status.dyhb_requests.iteritems(): for req in requests: dyhb_events.append( (serverid,) + req ) dyhb_events.sort(key=lambda req: req[1]) for d_ev in dyhb_events: (serverid, sent, shnums, received) = d_ev serverid_s = idlib.shortnodeid_b2a(serverid) rtt = None if received is not None: rtt = received - sent if not shnums: shnums = [] t[T.tr(style="background: %s" % self.color(serverid))[ [T.td[serverid_s], T.td[srt(sent)], T.td[srt(received)], T.td[",".join([str(shnum) for shnum in shnums])], T.td[self.render_time(None, rtt)], ]]] l["DYHB Requests:", t] t = T.table(class_="status-download-events") t[T.tr[T.td["range"], T.td["start"], T.td["finish"], T.td["got"], T.td["time"], T.td["decrypttime"], T.td["pausedtime"], T.td["speed"]]] for r_ev in self.download_status.read_events: (start, length, requesttime, finishtime, bytes, decrypt, paused) = r_ev if finishtime is not None: rtt = finishtime - requesttime - paused speed = self.render_rate(None, compute_rate(bytes, rtt)) rtt = self.render_time(None, rtt) decrypt = self.render_time(None, decrypt) paused = self.render_time(None, paused) else: speed, rtt, decrypt, paused = "","","","" t[T.tr[T.td["[%d:+%d]" % (start, length)], T.td[srt(requesttime)], T.td[srt(finishtime)], T.td[bytes], T.td[rtt], T.td[decrypt], T.td[paused], T.td[speed], ]] l["Read Events:", t] t = T.table(class_="status-download-events") t[T.tr[T.td["type"], T.td["segnum"], T.td["when"], T.td["range"], T.td["decodetime"], T.td["segtime"], T.td["speed"]]] reqtime = (None, None) for s_ev in self.download_status.segment_events: (etype, segnum, when, segstart, seglen, decodetime) = s_ev if etype == "request": t[T.tr[T.td["request"], T.td["seg%d" % segnum], T.td[srt(when)]]] reqtime = (segnum, when) elif etype == "delivery": if reqtime[0] == segnum: segtime = when - reqtime[1] speed = self.render_rate(None, compute_rate(seglen, segtime)) segtime = self.render_time(None, segtime) else: segtime, speed = "", "" t[T.tr[T.td["delivery"], T.td["seg%d" % segnum], T.td[srt(when)], T.td["[%d:+%d]" % (segstart, seglen)], T.td[self.render_time(None,decodetime)], T.td[segtime], T.td[speed]]] elif etype == "error": t[T.tr[T.td["error"], T.td["seg%d" % segnum]]] l["Segment Events:", t] t = T.table(border="1") t[T.tr[T.td["serverid"], T.td["shnum"], T.td["range"], T.td["txtime"], T.td["rxtime"], T.td["received"], T.td["RTT"]]] reqtime = (None, None) request_events = [] for serverid,requests in self.download_status.requests.iteritems(): for req in requests: request_events.append( (serverid,) + req ) request_events.sort(key=lambda req: (req[4],req[1])) for r_ev in request_events: (peerid, shnum, start, length, sent, receivedlen, received) = r_ev rtt = None if received is not None: rtt = received - sent peerid_s = idlib.shortnodeid_b2a(peerid) t[T.tr(style="background: %s" % self.color(peerid))[ T.td[peerid_s], T.td[shnum], T.td["[%d:+%d]" % (start, length)], T.td[srt(sent)], T.td[srt(received)], T.td[receivedlen], T.td[self.render_time(None, rtt)], ]] l["Requests:", t] return l
def render_events(self, ctx, data): if not self.download_status.storage_index: return srt = self.short_relative_time l = T.div() t = T.table(align="left", class_="status-download-events") t[T.tr[T.th["serverid"], T.th["sent"], T.th["received"], T.th["shnums"], T.th["RTT"]]] for d_ev in self.download_status.dyhb_requests: server = d_ev["server"] sent = d_ev["start_time"] shnums = d_ev["response_shnums"] received = d_ev["finish_time"] rtt = None if received is not None: rtt = received - sent if not shnums: shnums = ["-"] t[T.tr(style="background: %s" % self.color(server))[ [T.td[server.get_name()], T.td[srt(sent)], T.td[srt(received)], T.td[",".join([str(shnum) for shnum in shnums])], T.td[self.render_time(None, rtt)], ]]] l[T.h2["DYHB Requests:"], t] l[T.br(clear="all")] t = T.table(align="left",class_="status-download-events") t[T.tr[T.th["range"], T.th["start"], T.th["finish"], T.th["got"], T.th["time"], T.th["decrypttime"], T.th["pausedtime"], T.th["speed"]]] for r_ev in self.download_status.read_events: start = r_ev["start"] length = r_ev["length"] bytes = r_ev["bytes_returned"] decrypt_time = "" if bytes: decrypt_time = self._rate_and_time(bytes, r_ev["decrypt_time"]) speed, rtt = "","" if r_ev["finish_time"] is not None: rtt = r_ev["finish_time"] - r_ev["start_time"] - r_ev["paused_time"] speed = self.render_rate(None, compute_rate(bytes, rtt)) rtt = self.render_time(None, rtt) paused = self.render_time(None, r_ev["paused_time"]) t[T.tr[T.td["[%d:+%d]" % (start, length)], T.td[srt(r_ev["start_time"])], T.td[srt(r_ev["finish_time"])], T.td[bytes], T.td[rtt], T.td[decrypt_time], T.td[paused], T.td[speed], ]] l[T.h2["Read Events:"], t] l[T.br(clear="all")] t = T.table(align="left",class_="status-download-events") t[T.tr[T.th["segnum"], T.th["start"], T.th["active"], T.th["finish"], T.th["range"], T.th["decodetime"], T.th["segtime"], T.th["speed"]]] for s_ev in self.download_status.segment_events: range_s = "-" segtime_s = "-" speed = "-" decode_time = "-" if s_ev["finish_time"] is not None: if s_ev["success"]: segtime = s_ev["finish_time"] - s_ev["active_time"] segtime_s = self.render_time(None, segtime) seglen = s_ev["segment_length"] range_s = "[%d:+%d]" % (s_ev["segment_start"], seglen) speed = self.render_rate(None, compute_rate(seglen, segtime)) decode_time = self._rate_and_time(seglen, s_ev["decode_time"]) else: # error range_s = "error" else: # not finished yet pass t[T.tr[T.td["seg%d" % s_ev["segment_number"]], T.td[srt(s_ev["start_time"])], T.td[srt(s_ev["active_time"])], T.td[srt(s_ev["finish_time"])], T.td[range_s], T.td[decode_time], T.td[segtime_s], T.td[speed]]] l[T.h2["Segment Events:"], t] l[T.br(clear="all")] t = T.table(align="left",class_="status-download-events") t[T.tr[T.th["serverid"], T.th["shnum"], T.th["range"], T.th["txtime"], T.th["rxtime"], T.th["received"], T.th["RTT"]]] for r_ev in self.download_status.block_requests: server = r_ev["server"] rtt = None if r_ev["finish_time"] is not None: rtt = r_ev["finish_time"] - r_ev["start_time"] color = self.color(server) t[T.tr(style="background: %s" % color)[ T.td[server.get_name()], T.td[r_ev["shnum"]], T.td["[%d:+%d]" % (r_ev["start"], r_ev["length"])], T.td[srt(r_ev["start_time"])], T.td[srt(r_ev["finish_time"])], T.td[r_ev["response_length"] or ""], T.td[self.render_time(None, rtt)], ]] l[T.h2["Requests:"], t] l[T.br(clear="all")] return l
.even-dir { background-color: #efe0ef } .even { background-color: #eee } .odd-dir {background-color: #f0d0ef } .odd { background-color: #dedede } .icon { text-align: center } .listing { margin-left: auto; margin-right: auto; width: 50%; padding: 0.1em; } body { border: 0; padding: 0; margin: 0; background-color: #efefef;} h1 {padding: 0.1em; background-color: #777; color: white; border-bottom: thin white dashed;} ''']], tags.body[tags.div(_class='directory-listing')[ tags.h1(data=tags.directive('header'))[str], tags.table(render=rend.sequence, data=tags.directive('listing'))[ tags.tr(pattern="header")[tags.th["Filename"], tags.th["Size"], tags.th["Content type"], tags.th["Content encoding"], ], tags.tr(_class="even", pattern="item")[ tags.td[tags.a(render=tags.directive("tableLink"))], tags.td(data=tags.directive("filesize"))[str], tags.td(data=tags.directive("type"))[str], tags.td(data=tags.directive("encoding"))[str], ], tags.tr(_class="odd", pattern="item")[ tags.td[tags.a(render=tags.directive("tableLink"))], tags.td(data=tags.directive("filesize"))[str], tags.td(data=tags.directive("type"))[str], tags.td(data=tags.directive("encoding"))[str], ]]]]])
def calendar(self, ctx, data): now = datetime.datetime.now() self.current_date = now month_delta = datetime.timedelta(31) options = itaglibrary.ICalendarOptions(ctx, {}) strftime = options.get('strftime', '%b %d, %Y @ %I:%M %p') width = options.get('width', 2) prev = options.get('prev', None) next = options.get('next', None) base = options.get('base_url', None) calendar_class = options.get('calendar_class', 'calendar') if data is None: d = now current = d.year, d.month elif isinstance(data, tuple): year, month = data d = datetime.date(year, month, 4) current = data elif isinstance(data, (datetime.date, datetime.datetime)): d = data current = d.year, d.month if prev is None or next is None: p = d - month_delta n = d + month_delta prev = p.year, p.month next = n.year, n.month if base is None: u = url.URL.fromContext(ctx) segments = u.pathList() if segments[-1] == '': u = u.up() segments = segments[:-1] if segments[-1].isdigit() and segments[-2].isdigit(): u = u.up().up() prev_url = u next_url = u else: prev_url = base next_url = base add_query_params = False def buildUrl(u, el): if add_query_params: param_name, param_value = el u = u.add(param_name, str(param_value)) else: u = u.child(str(el)) return u for el in prev: if el == '?': add_query_params = True continue prev_url = buildUrl(prev_url, el) add_query_params = False for el in next: if el == '?': add_query_params = True continue next_url = buildUrl(next_url, el) else: if isinstance(prev, (url.URL, url.URLOverlay)) and \ isinstance(next, (url.URL, url.URLOverlay)): next_url = next prev_url = prev return t.table(class_=calendar_class)[ t.thead[ t.tr[ t.th(colspan="7")[ t.a(href=prev_url)[t.xml("←")], t.xml(" "), t.xml('-'.join([str(el) for el in current])), t.xml(" "), t.a(href=next_url)[t.xml("→")] ] ], [ t.tr[[t.td[dayname] for dayname in calendar.weekheader(width).split()]] ] ], t.tbody[ t.invisible(data=self.days(*current), render=rend.sequence)[ t.tr(pattern='item', render=rend.sequence)[ t.td(pattern='item', render=self.render_calendarDay) ] ] ], t.tfoot[ t.tr[ t.td(colspan="7")[ now.strftime(strftime) ] ] ] ]
def render_content(self, ctx, data): Utils.log.msg('%s opened Tools/Firewall' % (self.avatarId.username)) rules = self.rules.read() rows = [] bg = True ### Read SNAT rules snat = self.sysconf.Shorewall.get('snat', []) snatRules = [] n = 0 for ru in snat: l = ru.split() l.append( tags.a( href="Delete/SNAT/%s/" % n, onclick="return confirm('Are you sure you want to delete this SNAT rule?');", title="Delete this SNAT rule." )[tags.img(src="/images/ex.png")] ) snatRules.append(l) n += 1 ### Read MASQ rules masq = self.sysconf.Shorewall.get('masq', {}) natRules = [] for k,mas in masq.items(): runum = 0 for v in mas: if type(v) == list: l = [k] l.extend([i.replace('-', 'Any') for i in v]) l.append( tags.a( href="Delete/NAT/%s/%s/"%(k, runum), onclick="return confirm('Are you sure you want to delete this NAT rule?');", title="Delete this NAT rule." )[tags.img(src="/images/ex.png")] ) natRules.append(l) else: natRules.append([ k, 'Any', v, 'Any', 'Any', 'Any', 'Any', tags.a( href="Delete/NAT/%s/%s/"%(k, runum), onclick="return confirm('Are you sure you want to delete this NAT rule?');", title="Delete this NAT rule." )[tags.img(src="/images/ex.png")] ]) runum += 1 securityViolation = None ### Read firewall rules table try: lastrule = rules['AIP'][0][8] except: lastrule = 0 for i,ru in enumerate(rules['AIP']): bg = not bg this = bg and "#F5F5EB" or "#eee" try: nextrule = rules['AIP'][i+1][8] except: nextrule = ru[8] # Check for security violations print "Port, source", ru[7], ru[2] # SSH and Vulani access violation if ru[7] in ["22", "9682"]: if (ru[2] == "Any") and ((ru[1] in ["net", "Any", "dsl", "ppp", "wan", "net2"]) or (ru[4] == "fw")): securityViolation = "Inbound SSH and/or Vulani administrative access should not be unrestricted! " securityViolation += "Your system security has been seriously compromised. Please remove this " securityViolation += "rule and restrict the source IP or make use of the VPN to administer the server remotely" this = "#ff5555" r = [ tags.tr(style="background: %s" % this)[ tags.td(rowspan=2)[ru[0]], tags.td[tags.strong['Source ']], tags.td[ru[1]], # Source zone tags.td[ru[3].replace('-', 'Any')], # Source port tags.td[ru[2]], # Source IP tags.td(rowspan=2)[ru[6].replace('-', 'Any')], tags.td(rowspan=2)[ tags.a( href="Swap/%s/%s/" % (ru[8], nextrule), title = "Move this rule down" )[tags.img(src="/images/arrowdown.png")], " ", tags.a( href="Swap/%s/%s/" % (ru[8], lastrule), title = "Move this rule up" )[tags.img(src="/images/arrowup.png")], " ", tags.a( href="Delete/AIP/%s/"%(ru[8]), onclick="return confirm('Are you sure you want to delete this rule?');", title="Delete this firewall rule." )[tags.img(src="/images/ex.png")] ] ], tags.tr(style="background: %s" % this)[ tags.td[tags.strong['Destination ']], #tags.td(align='right')[' Zone: '], tags.td[ru[4]], # Zone #tags.td( align='right')[' Port/Type: '], tags.td[ru[7].replace('-', 'Any')], #Port #tags.td( align='right')[' IP: '], tags.td[ru[5]], # IP ], ] rows.append(r) lastrule = ru[8] self.largestRule = lastrule fwtable = tags.table(cellspacing=0, _class='listing')[ tags.thead(background="/images/gradMB.png")[ tags.tr[ tags.th['Rule'], tags.th[''], #tags.th[''], tags.th['Zone'], #tags.th[''], tags.th['Port'], #tags.th[''], tags.th['IP'], tags.th['Protocol'], tags.th[''], ], ], tags.tbody[ rows ] ] toss = { '16':'Minimize Delay', '8':'Maximize Throughput', '4':'Maximize Reliability', '2':'Minimize Cost', '0':'Normal Service' } qosRules = [] l = 0 for port, proto, tos in self.sysconf.Shorewall.get('qos', []): qosRules.append([ port, proto, toss[tos], tags.a(href=url.root.child("Qos").child("Delete").child(l), onclick="return confirm('Are you sure you want to delete this entry?');")[tags.img(src="/images/ex.png")] ]) l += 1 ### Check if shorewall is broken if os.path.exists('/usr/local/tcs/tums/shorewallBroken'): check = tags.div(style="color: #F00")[ tags.br, tags.strong[ "The firewall configuration appears to be broken, please test the settings to see any errors and correct them" ], tags.br ] else: check = "" if securityViolation: secError = [tags.table(width="70%", style="border:2px solid #ff5555")[tags.tr[ tags.td[tags.img(src="/images/securityhz.png")], tags.td[ tags.h1["Security Violation!"], securityViolation ] ]], tags.br, tags.br] else: secError = "" ### Return the page stanza return ctx.tag[ tags.h3[tags.img(src="/images/firewall.png"), " Firewall"], check, secError, tags.img(src="/images/start.png"), " ", tags.a( href="Test", style="font-size:11pt;", title="Test the firewall. (This may take some time!)" )[tags.strong(style="font-family:arial,verdana,helvetica,sans-serif;")["Test Settings"]], tags.br, tags.img(src="/images/refresh.png"), " ", tags.a( href="Restart", style="font-size:11pt;", title="Restart the firewall and apply the changes. Changes are only activated after this is clicked." )[tags.strong(style="font-family:arial,verdana,helvetica,sans-serif")["Apply Changes"]], PageHelpers.TabSwitcher(( ('Rules' , 'panelRules'), #('Allow Ports' , 'panelAllowPort'), ('NAT', 'panelNATTab'), ('QoS', 'panelQos'), ('Policy', 'panelPolicy'), ('Zones' , 'panelZones'), ('Connections', 'panelCurrent'), ), id = "firewall"), tags.div(id="panelNATTab", _class="tabPane")[ PageHelpers.TabSwitcher(( ('Forwarding', 'panelForwardPort'), ('Redirection', 'panelTransparentProxy'), ('NAT', 'panelNAT'), ('Source NAT', 'panelSNAT') ), id ="firewallNAT"), tags.div(id="panelForwardPort", _class="tabPane")[ tags.h3["Port Forwarding"], PageHelpers.dataTable(['Source Zone', 'Source IP', 'Forward To', 'Destination Zone', 'Protocol', 'Port', 'Destination IP', ''], [ r[:-1] + [tags.a( href="Delete/AIP/%s/"%(r[-1]), title="Delete this port forwarding rule", onclick="return confirm('Are you sure you want to delete this entry?');" )[tags.img(src="/images/ex.png")]] for i,r in enumerate(rules['FORWARD'])]), tags.h3["Add Forwarding Rule"], tags.directive('form forwardPort'), ], tags.div(id="panelTransparentProxy", _class="tabPane")[ tags.h3["Destination NAT (Transparent Proxy)"], PageHelpers.dataTable(['Source Zone', 'Source Network', 'Destination Port', 'Source Port', 'Protocol', 'Destination Network', ''], [ r[:-1] + [tags.a( href="Delete/AIP/%s/"%(r[-1]), title="Delete this transparent redirection rule", onclick="return confirm('Are you sure you want to delete this entry?');" )[tags.img(src="/images/ex.png")]] for i,r in enumerate(rules['PROXY'])]), tags.h3["Add DNAT Rule"], tags.directive('form transProxy'), ], tags.div(id="panelNAT", _class="tabPane")[ tags.h3["Nework Address Translation (Masquerading)"], PageHelpers.dataTable( ['Destination Interface', 'Destination Network', 'Source Network', 'Source Interface', 'NAT IP', 'Protocol', 'Port', ''], natRules ), tags.h3['Add NAT Rule'], tags.directive('form addNAT') ], tags.div(id="panelSNAT", _class="tabPane")[ tags.h3["Source NAT"], PageHelpers.dataTable( ['Source IP', 'External Interface', 'Internal IP', 'Any Interface', 'Use Internal'], snatRules ), tags.h3['Add SNAT Rule'], tags.directive('form addSNAT') ], PageHelpers.LoadTabSwitcher(id="firewallNAT") ], tags.div(id="panelPolicy", _class="tabPane")[ tags.h3["General firewall policy"], tags.directive('form inetPol') ], tags.div(id="panelQos", _class="tabPane")[ tags.h3[tags.img(src="/images/compress.png"), "QOS"], PageHelpers.dataTable(['Port', 'Protocol', 'Type of service', ''], qosRules), tags.h3["Add Rule"], tags.directive('form addQos'), ], tags.div(id="panelRules", _class="tabPane")[ tags.h3["Firewall Rules"], #PageHelpers.dataTable( # [ # 'Action', '', 'Protocol','' # ], fwtable, #), tags.a(name="addRule")[''], tags.h3["Add rule"], tags.directive('form allowRange'), ], tags.div(id="panelZones", _class="tabPane")[ tags.h3["Zones"], PageHelpers.dataTable(['Zone Name', 'Policy', 'Log target', 'Interfaces', ''], [ [ zone, zd['policy'], zd['log'], [[i, tags.br] for i in zd['interfaces']], [ tags.a( href="Delete/Zone/%s/"%(zone), title="Delete this firewall zone", onclick="return confirm('Are you sure you want to delete this zone?');" )[tags.img(src="/images/ex.png")], tags.a(href="EditZone/%s/" % zone)[tags.img(src="/images/edit.png")] ] ] for zone, zd in self.sysconf.Shorewall.get('zones', {}).items()] ), tags.h3['Add Firewall Zone'], tags.directive('form addZone') ], tags.div(id="panelCurrent", _class="tabPane")[ tags.h3["Current Connections"], tags.invisible(render=tags.directive('connections')) ], PageHelpers.LoadTabSwitcher(id="firewall") ]
class DirectoryLister(rend.Page): def __init__(self, pathname, dirs=None, contentTypes={}, contentEncodings={}, defaultType='text/html'): self.contentTypes = contentTypes self.contentEncodings = contentEncodings self.defaultType = defaultType # dirs allows usage of the File to specify what gets listed self.dirs = dirs self.path = pathname rend.Page.__init__(self) def data_listing(self, context, data): from nevow.static import getTypeAndEncoding if self.dirs is None: directory = os.listdir(self.path) directory.sort() else: directory = self.dirs files = [] dirs = [] for path in directory: url = quote(path, '/') if os.path.isdir(os.path.join(self.path, path)): url = url + '/' dirs.append({ 'link': url, 'linktext': path + "/", 'type': '[Directory]', 'filesize': '', 'encoding': '', }) else: mimetype, encoding = getTypeAndEncoding( path, self.contentTypes, self.contentEncodings, self.defaultType) try: filesize = os.stat(os.path.join(self.path, path))[stat.ST_SIZE] except OSError as x: if x.errno != 2 and x.errno != 13: raise x else: files.append({ 'link': url, 'linktext': path, 'type': '[%s]' % mimetype, 'filesize': formatFileSize(filesize), 'encoding': (encoding and '[%s]' % encoding or '') }) return dirs + files def data_header(self, context, data): request = context.locate(inevow.IRequest) return "Directory listing for %s" % unquote(request.uri) def render_tableLink(self, context, data): return tags.a(href=data['link'])[data['linktext']] def __repr__(self): return '<DirectoryLister of %r>' % self.path __str__ = __repr__ docFactory = loaders.stan(tags.html[tags.head[tags.title( data=tags.directive('header'))[str], tags.style[''' th, .even td, .odd td { padding-right: 0.5em; } .even-dir { background-color: #efe0ef } .even { background-color: #eee } .odd-dir {background-color: #f0d0ef } .odd { background-color: #dedede } .icon { text-align: center } .listing { margin-left: auto; margin-right: auto; width: 50%; padding: 0.1em; } body { border: 0; padding: 0; margin: 0; background-color: #efefef;} h1 {padding: 0.1em; background-color: #777; color: white; border-bottom: thin white dashed;} ''']], tags.body[tags.div(_class='directory-listing')[ tags.h1(data=tags.directive('header'))[str], tags.table(render=rend.sequence, data=tags.directive('listing'))[ tags.tr(pattern="header")[tags.th["Filename"], tags.th["Size"], tags.th["Content type"], tags.th["Content encoding"], ], tags.tr(_class="even", pattern="item")[ tags.td[tags.a(render=tags.directive("tableLink"))], tags.td(data=tags.directive("filesize"))[str], tags.td(data=tags.directive("type"))[str], tags.td(data=tags.directive("encoding"))[str], ], tags.tr(_class="odd", pattern="item")[ tags.td[tags.a(render=tags.directive("tableLink"))], tags.td(data=tags.directive("filesize"))[str], tags.td(data=tags.directive("type"))[str], tags.td(data=tags.directive("encoding"))[str], ]]]]])
def testXbuild_grid(argsdict, request=None): start_time = clock() one_week = 60 * 60 * 24 * 7 one_week_ago = start_time - one_week max_results = (int(argsdict['max_results']) if ('max_results' in argsdict and argsdict['max_results'] != '') else 128) if max_results < 1: print 'Max results must be at least 1' sys.exit(1) countdown = max_results test_cases = (None if ('test_cases' not in argsdict or argsdict['test_cases'] == None or argsdict['test_cases'] == '') else (compile(argsdict['test_cases']) if ('case' in argsdict and argsdict['case']) else compile(argsdict['test_cases'], IGNORECASE))) exclude_cases = (None if ('exclude_cases' not in argsdict or argsdict['exclude_cases'] == None or argsdict['exclude_cases'] == '') else (compile(argsdict['exclude_cases']) if ('case' in argsdict and argsdict['case']) else compile(argsdict['exclude_cases'], IGNORECASE))) results_by_build = {} results = [] tests = set() build_ids = [] mongo = bvtlib.mongodb.get_autotest() branch = argsdict['branch'] if 'branch' in argsdict else 'master' builds_query = {'branch': branch} force = 'force' in argsdict and argsdict['force'] sort_columns = argsdict['sort_columns'] if 'sort_columns' in argsdict else 'alphabetic' total_fails_by_test = {} total_passes_by_test = {} day_results = {} latest_year = None latest_yday = None day_fails = 0 day_passes = 0 for build in mongo.builds.find(builds_query).sort([('tag_time', DESCENDING)]): build_id = build['_id'] build_time = (build['tag_time'] if 'tag_time' in build else (['timestamp'] if 'timestamp' in build else None)) successes_for_build = {} failures_for_build = {} results_query={'build': build_id} interesting = False for result in mongo.results.find(results_query): if 'infrastructure_problem' not in result or result['infrastructure_problem'] == False: if 'test_case' in result: test_case = result['test_case'] if (test_case != None and (test_cases == None or test_cases.search(test_case)) and (exclude_cases == None or not exclude_cases.search(test_case)) and (force or 'experiments.py' not in test_case)): if 'failure' in result and result['failure'] != '': result_details = result['failure'] interesting = True if test_case in failures_for_build: failures_for_build[test_case].append(result_details) else: failures_for_build[test_case] = [ result_details ] if test_case in total_fails_by_test: total_fails_by_test[test_case] += 1 else: total_fails_by_test[test_case] = 1 day_fails += 1 else: if 'end_time' in result: interesting = True if test_case in successes_for_build: successes_for_build[test_case].append(result) else: successes_for_build[test_case] = [ result ] if test_case in total_passes_by_test: total_passes_by_test[test_case] += 1 else: total_passes_by_test[test_case] = 1 day_passes += 1 if interesting: results_for_build = (build_time, successes_for_build, failures_for_build) gmt = gmtime(float(build_time)) if ((gmt.tm_year != latest_year) or (gmt.tm_yday != latest_yday)): latest_year = gmt.tm_year latest_yday = gmt.tm_yday date_text = strftime('%Y-%m-%d', gmt) day_results[date_text] = (': ' + repr(day_passes) + ' passed, ' + repr(day_fails) + ' failed') day_fails = 0 day_passes = 0 results.append(results_for_build) results_by_build[build_id] = results_for_build build_ids.append(build_id) countdown -= 1 if countdown == 0: break tests.update(failures_for_build.keys()) tests.update(successes_for_build) if countdown == 0: break # convert from set to list test_names = [ test for test in tests ] if sort_columns == 'ratio': sort_text = 'Columns are sorted by decreasing ratio of fails.' ratios = {} for test in test_names: passes = total_passes_by_test[test] if test in total_passes_by_test else 0 fails = total_fails_by_test[test] if test in total_fails_by_test else 0 ratios[test] = -1 if (passes == 0 and fails == 0) else fails / (passes + fails) test_names = [ name for name, count in sorted(ratios.iteritems(), key = itemgetter(1), reverse=True) ] elif sort_columns == 'frequency': sort_text = 'Columns are sorted by decreasing number of fails.' frequencies = {} for test in test_names: frequencies[test] = total_fails_by_test[test] if test in total_fails_by_test else 0 test_names = [ name for name, count in sorted(frequencies.iteritems(), key = itemgetter(1), reverse=True) ] elif sort_columns == 'alphabetic': sort_text = 'Columns are sorted alphabetically by test case description.' test_names.sort() else: sort_text = 'Columns are not sorted, as an unknown sort type "' + repr(sort_columns) + '" was specified.' column_number = 1 column_numbers = {} column_names = [th['Test case']] column_keys = [] test_labels = {} for test_name in test_names: test_label = test_name.replace(' ', '_') column_numbers[test_name] = column_number column_heading = th[a(href="#"+test_label, title=test_name) [repr(column_number)]] column_names.append(column_heading) column_keys.append(li[a(name=test_label) [a(href="http://autotest/results?reverse=1&test_case="+test_name) [test_name]]]) test_labels[test_name] = test_label column_number += 1 rows = [column_names] latest_year = None latest_yday = None column_count = 1 + len(column_names) build_number_pattern = compile('.+-([0-9]+)-.+') day_heading_style = {'colspan':column_count, 'class':'day_heading'} for build_id in build_ids: (build_time, successes, failures) = results_by_build[build_id] try: build_number_match = build_number_pattern.match(build_id) build_number_string = build_number_match.group(1) if build_number_match else build_id gmt = gmtime(float(build_time)) if ((gmt.tm_year != latest_year) or (gmt.tm_yday != latest_yday)): latest_year = gmt.tm_year latest_yday = gmt.tm_yday raw_date_text = strftime('%Y-%m-%d', gmt) date_text = raw_date_text if float(build_time) >= one_week_ago: date_text += strftime(' (%A)', gmt) if day_results[raw_date_text] != None: date_text += day_results[raw_date_text] rows.append([tr[th(**day_heading_style)[date_text]]]) cells = [th(title=(build_id + '\n' + asctime(gmt)))[ a(href="http://autotest/build/"+build_id)[build_number_string], br(), strftime('%H:%M:%S', gmt) ]] except TypeError: gmt = None cells = [th[a(href="http://autotest/build/"+build_id)[build_id]]] for test in test_names: success_count = len(successes[test]) if test in successes else 0 this_test_failures = failures[test] if test in failures else None fail_count = len(this_test_failures) if this_test_failures != None else 0 some_passed = success_count > 0 some_failed = fail_count > 0 no_results = not (some_passed or some_failed) if proportionate_colour: colour = white if no_results else rgb_string(fail_count, success_count, 0, intensity=0.5) else: several_failed = fail_count > 1 colour = (amber if some_passed and some_failed else (white if no_results else ((green if success_count > 1 else pale_green) if not some_failed else (red if several_failed else pale_red)))) cell_hover_text = test + ': ' + repr(success_count) + (' pass' if success_count == 1 else ' passes') if some_failed: # collect up identical error messages so we can just give a count instead of repeating them fail_detail_counts = {} for x in this_test_failures: fail_detail_counts[x] = fail_detail_counts[x] + 1 if x in fail_detail_counts else 1 details = [ repr(count) + ": " + # display commonest error messages first message for message, count in sorted(fail_detail_counts.iteritems(), key = itemgetter(1), reverse=True) if message != None] cell_hover_text = cell_hover_text + '\nFailures:\n' + ('\n'.join(details)) cell_text = [div(align='left')[repr(success_count)], div(align='right')[repr(fail_count)]] if some_passed or some_failed: cells.append(td(bgcolor=colour) [a(href="results?build="+build_id+"&test_case="+test, title=cell_hover_text)[cell_text]]) else: cells.append(td[' ']) rows.append([tr[cells]]) passes_row = [th['Passes']] fails_row = [th['Fails']] for test_name in test_names: pass_count = total_passes_by_test[test_name] if test_name in total_passes_by_test else 0 fail_count = total_fails_by_test[test_name] if test_name in total_fails_by_test else 0 total = pass_count + fail_count colour_string = 'white' if total == 0 else rgb_string(fail_count, pass_count, 0, intensity=0.5) passes_row.append(td(bgcolor=colour_string)[repr(pass_count)]) fails_row.append(td(bgcolor=colour_string)[repr(fail_count)]) rows.insert(1, tr[fails_row]) rows.insert(1, tr[passes_row]) column_key = [ol[column_keys]] table_grid = [table(border='true', style="border-collapse: collapse", align="center", width="96%")[rows]] title_text = 'BVT results grid for '+branch if ('test_cases' in argsdict and argsdict['test_cases'] != None and argsdict['test_cases'] != ''): title_text += ' matching "' + argsdict['test_cases'] + '"' if ('exclude_cases' in argsdict and argsdict['exclude_cases'] != None and argsdict['exclude_cases'] != ''): title_text += ' excluding "' + argsdict['exclude_cases'] + '"' if request != None: requery_form = [ table(align="center", width="96%", bgcolor="#f0f0f0")[ tr()[td()['Branch: ', stan_input(name='branch', value=branch)['']], td()['Test cases: ', stan_input(name='test_cases', value=(argsdict['test_cases'] if 'test_cases' in argsdict else ''))[''], " ", 'Excluded cases: ', stan_input(name='exclude_cases', value=(argsdict['exclude_cases'] if 'exclude_cases' in argsdict else ''))[''], " ", 'Case-significant search', stan_input(type='checkbox', name='case')['']], td()['Include malformed results:', stan_input(type='checkbox', name='force')['']]], tr()[td()['Columns sort order: ', stan_input(type='radio', name='sort_columns', value='alphabetic', ** ({'checked':1} if sort_columns == 'alphabetic' else {}))['alphabetic'], " ", stan_input(type='radio', name='sort_columns', value='frequency', ** ({'checked':1} if sort_columns == 'frequency' else {}))['frequency'], " ", stan_input(type='radio', name='sort_columns', value='ratio', ** ({'checked':1} if sort_columns == 'ratio' else {}))['ratio']], td()['Max results:', stan_input(name='max_results', value=max_results)['']], td()[stan_input(type='submit')]]]] else: requery_form = None page_contents = [title[title_text], h1[title_text]] page_contents += [p[key_text], p[sort_text], table_grid, h2['column key'], p[sort_text], column_key] if not proportionate_colour: page_contents += [h2['cell key'], key_table] page_contents += [hr(), div(align = 'right')['produced at ', asctime()]] return str(nevow.flat.flatten(page_contents)), str(nevow.flat.flatten(requery_form))
def calendar(self, ctx, data): now = datetime.datetime.now() self.current_date = now month_delta = datetime.timedelta(31) options = itaglibrary.ICalendarOptions(ctx, {}) strftime = options.get('strftime', '%b %d, %Y @ %I:%M %p') width = options.get('width', 2) prev = options.get('prev', None) next = options.get('next', None) base = options.get('base_url', None) calendar_class = options.get('calendar_class', 'calendar') if data is None: d = now current = d.year, d.month elif isinstance(data, tuple): year, month = data d = datetime.date(year, month, 4) current = data elif isinstance(data, (datetime.date, datetime.datetime)): d = data current = d.year, d.month if prev is None or next is None: p = d - month_delta n = d + month_delta prev = p.year, p.month next = n.year, n.month if base is None: u = url.URL.fromContext(ctx) segments = u.pathList() if segments[-1] == '': u = u.up() segments = segments[:-1] if segments[-1].isdigit() and segments[-2].isdigit(): u = u.up().up() prev_url = u next_url = u else: prev_url = base next_url = base add_query_params = False def buildUrl(u, el): if add_query_params: param_name, param_value = el u = u.add(param_name, str(param_value)) else: u = u.child(str(el)) return u for el in prev: if el == '?': add_query_params = True continue prev_url = buildUrl(prev_url, el) add_query_params = False for el in next: if el == '?': add_query_params = True continue next_url = buildUrl(next_url, el) else: if isinstance(prev, (url.URL, url.URLOverlay)) and \ isinstance(next, (url.URL, url.URLOverlay)): next_url = next prev_url = prev return t.table( class_=calendar_class )[t.thead[t.tr[t.th( colspan="7")[t.a(href=prev_url)[t.xml("←")], t.xml(" "), t.xml('-'.join([str(el) for el in current])), t.xml(" "), t.a(href=next_url)[t.xml("→")]]], [ t.tr[[ t.td[dayname] for dayname in calendar.weekheader(width).split() ]] ]], t.tbody[t.invisible(data=self.days(*current), render=rend.sequence)[ t.tr(pattern='item', render=rend.sequence )[t.td(pattern='item', render=self.render_calendarDay)]]], t.tfoot[t.tr[t.td(colspan="7")[now.strftime(strftime)]]]]
def render_content(self, ctx, data): interfaces = Utils.getInterfaces() + self.sysconf.EthernetDevices.keys( ) params = Utils.parseNet() d = {} vlans = [] routes = {} types = {} vali = [] traffic = {} da = datetime.datetime.now() today = "%s%s%s" % (da.day, da.month, da.year) for i in interfaces: if 'tap' not in i and 'eth' not in i and 'ppp' not in i and 'vlan' not in i: continue if not "vlan" in i: if i in d.keys(): pass if i in params.keys(): types[i] = params[i]['type'] routes[i] = [params[i].get('network', '')] if params[i]['type'] == 'static': d[i] = params[i]['ip'] if params[i]['type'] == 'manual': d[i] = "Manual" else: d[i] = "DHCP" else: types[i] = "" routes[i] = "" d[i] = "" else: vlans.append((i, params[i]['ip'], tags.a(title="Edit Interface %s" % i, href="Edit/%s" % i)[tags.img(src="/images/edit.png")])) # Read the traffic counters try: p = open('/usr/local/tcs/tums/rrd/iface_%s_%stotal.nid' % (i, today)).read().split(':') traffic[i] = (float(p[0]), float(p[1])) except: traffic[i] = (0, 0) return ctx.tag[ tags.h3[tags.img(src="/images/stock-disconnect.png"), self.text.toolsMenuNetconf], PageHelpers.TabSwitcher(( ('Interface Configuration', 'panelIface'), ('VLAN Configuration', 'panelVlan'), ('IPv6 Tunnel', 'panelTunnel'), ('Advanced', 'panelAdvanced'), )), tags.div(id="panelIface", _class="tabPane")[ tags.h3["Interfaces"], tags.table(width="95%")[[ tags.tr[[ tags.td[self.roundedBlock(j, [ tags.img(src="/images/graphs/iface-%sFS.png" % j), tags. table[tags.tr(valign="top")[ tags.td[tags.strong["Traffic Out (24h): "]], tags.td[Utils.intToH(traffic[j][1])]], tags.tr( valign="top" )[tags.td[tags.strong["Traffic In (24h): "]], tags.td[Utils.intToH(traffic[j][0])]], tags.tr(valign="top")[ tags.td[tags. strong["Configuration Type: "]], tags.td[types[j] == 'dhcp' and 'DHCP' or 'Static']], tags.tr(valign="top")[ tags.td[tags. strong["Associated Routes: "]], tags.td[[[k, tags.br] for k in routes. get(j, ["None"])]]], tags.tr( valign="top" )[tags.td[tags.a(title="Edit Interface %s" % j, href="Edit/%s" % j)[tags.img( src="/images/edit.png"), " Edit Settings"]], tags.td[""]]] ])] for j in i if j ]] for i in WebUtils.runIter(1, d.keys()) ]], tags.br, #tags.h3["Add interface"], #tags.directive('form addInterface') ], tags.div(id="panelVlan", _class="tabPane")[ tags.h3["Configured VLAN Interfaces"], PageHelpers.dataTable(('Interface', 'IP', ''), vlans), tags.br, tags.h3["Add VLAN"], tags.directive('form addVLAN')], tags.div(id="panelTunnel", _class="tabPane")[ tags.h3["Configure IPv6 Tunnel"], tags.directive('form tunnelConf')], tags.div(id="panelAdvanced", _class="tabPane") [tags.h3["Advanced Settings"], tags. p["If you are unsure of any of these settings you should almost certainly not change them"], tags.directive('form advanced')], PageHelpers.LoadTabSwitcher(), ]
def render_events(self, ctx, data): if not self.download_status.storage_index: return srt = self.short_relative_time l = T.div() t = T.table(align="left", class_="status-download-events") t[T.tr[T.th["serverid"], T.th["sent"], T.th["received"], T.th["shnums"], T.th["RTT"]]] for d_ev in self.download_status.dyhb_requests: server = d_ev["server"] sent = d_ev["start_time"] shnums = d_ev["response_shnums"] received = d_ev["finish_time"] rtt = None if received is not None: rtt = received - sent if not shnums: shnums = ["-"] t[T.tr(style="background: %s" % self.color(server))[[ T.td[server.get_name()], T.td[srt(sent)], T.td[srt(received)], T.td[",".join([str(shnum) for shnum in shnums])], T.td[self.render_time(None, rtt)], ]]] l[T.h2["DYHB Requests:"], t] l[T.br(clear="all")] t = T.table(align="left", class_="status-download-events") t[T.tr[T.th["range"], T.th["start"], T.th["finish"], T.th["got"], T.th["time"], T.th["decrypttime"], T.th["pausedtime"], T.th["speed"]]] for r_ev in self.download_status.read_events: start = r_ev["start"] length = r_ev["length"] bytes = r_ev["bytes_returned"] decrypt_time = "" if bytes: decrypt_time = self._rate_and_time(bytes, r_ev["decrypt_time"]) speed, rtt = "", "" if r_ev["finish_time"] is not None: rtt = r_ev["finish_time"] - r_ev["start_time"] - r_ev[ "paused_time"] speed = self.render_rate(None, compute_rate(bytes, rtt)) rtt = self.render_time(None, rtt) paused = self.render_time(None, r_ev["paused_time"]) t[T.tr[T.td["[%d:+%d]" % (start, length)], T.td[srt(r_ev["start_time"])], T.td[srt(r_ev["finish_time"])], T.td[bytes], T.td[rtt], T.td[decrypt_time], T.td[paused], T.td[speed], ]] l[T.h2["Read Events:"], t] l[T.br(clear="all")] t = T.table(align="left", class_="status-download-events") t[T.tr[T.th["segnum"], T.th["start"], T.th["active"], T.th["finish"], T.th["range"], T.th["decodetime"], T.th["segtime"], T.th["speed"]]] for s_ev in self.download_status.segment_events: range_s = "-" segtime_s = "-" speed = "-" decode_time = "-" if s_ev["finish_time"] is not None: if s_ev["success"]: segtime = s_ev["finish_time"] - s_ev["active_time"] segtime_s = self.render_time(None, segtime) seglen = s_ev["segment_length"] range_s = "[%d:+%d]" % (s_ev["segment_start"], seglen) speed = self.render_rate(None, compute_rate(seglen, segtime)) decode_time = self._rate_and_time(seglen, s_ev["decode_time"]) else: # error range_s = "error" else: # not finished yet pass t[T.tr[T.td["seg%d" % s_ev["segment_number"]], T.td[srt(s_ev["start_time"])], T.td[srt(s_ev["active_time"])], T.td[srt(s_ev["finish_time"])], T.td[range_s], T.td[decode_time], T.td[segtime_s], T.td[speed]]] l[T.h2["Segment Events:"], t] l[T.br(clear="all")] t = T.table(align="left", class_="status-download-events") t[T.tr[T.th["serverid"], T.th["shnum"], T.th["range"], T.th["txtime"], T.th["rxtime"], T.th["received"], T.th["RTT"]]] for r_ev in self.download_status.block_requests: server = r_ev["server"] rtt = None if r_ev["finish_time"] is not None: rtt = r_ev["finish_time"] - r_ev["start_time"] color = self.color(server) t[T.tr(style="background: %s" % color)[T.td[server.get_name()], T.td[r_ev["shnum"]], T.td["[%d:+%d]" % (r_ev["start"], r_ev["length"])], T.td[srt(r_ev["start_time"])], T.td[srt(r_ev["finish_time"])], T.td[r_ev["response_length"] or ""], T.td[self.render_time(None, rtt)], ]] l[T.h2["Requests:"], t] l[T.br(clear="all")] return l
margin-left: auto; margin-right: auto; width: 50%; padding: 0.1em; } body { border: 0; padding: 0; margin: 0; background-color: #efefef;} h1 {padding: 0.1em; background-color: #777; color: white; border-bottom: thin white dashed;} '''] ], tags.body[tags.div(_class='directory-listing')[ tags.h1(data=tags.directive('header'))[str], tags.table(render=rend.sequence, data=tags.directive('listing'))[ tags.tr(pattern="header")[ tags.th["Filename"], tags.th["Size"], tags.th["Content type"], tags.th["Content encoding"], ], tags.tr(_class="even", pattern="item")[ tags.td[tags.a(render=tags.directive("tableLink"))], tags.td(data=tags.directive("filesize"))[str], tags.td(data=tags.directive("type"))[str], tags.td(data=tags.directive("encoding"))[str], ], tags.tr(_class="odd", pattern="item")[ tags.td[tags.a(render=tags.directive("tableLink"))], tags.td(data=tags.directive("filesize"))[str], tags.td(data=tags.directive("type"))[str], tags.td(data=tags.directive("encoding"))[str], ] ]