# -*- coding: utf-8 -*- # vim: set fileencoding=utf-8 : from jinja2 import Markup from operator import itemgetter import re class Base(object): def __init__(self, section, key, header=None): self.section = section self.key = key if header is None: self.header = key else: self.header = header if re.search(r"[^a-zA-Z0-9_-]", key): raise ValueError("Invalid key: {}".format(key)) def body_class(self, record): return ["key_{}".format(self.key)] def head_html(self): return Markup('%s') % (self.key, self.header) def body_html(self, record): return Markup('%s') % (" ".join(self.body_class(record)), self.value_html(record)) def value_html(self, record): return self.value(record) def head_csv(self): return self.header def body_csv(self, record): return self.value_csv(record) def value_csv(self, record): return self.value(record) def value(self, record): return record[self.section].get(self.key, None) or "" class Boolean(Base): def body_class(self, record): return super(Boolean, self).body_class(record) \ + [("true" if self.value(record) else "false")] def value_html(self, record): return u"✔︎" if self.value(record) else "" def value_csv(self, record): return "Y" if self.value(record) else "N" class List(Base): def value_html(self, record): items = [self.item_html(i) for i in self.value(record)] return Markup("
    %s
") % Markup("\n").join(items) def item_html(self, item): return Markup("
  • %s
  • ") % item def value_csv(self, record): return "\n".join([self.item_csv(i) for i in self.value(record)]) def item_csv(self, item): return item class Set(Base): def value_html(self, record): items = [self.item_html(i) for i in self.value(record)] # set() is used here to dedupe things that can't be put into a set in # value(), like a list of dicts() return Markup("") % Markup("\n").join(set(items)) def item_html(self, item): return Markup("
  • %s
  • ") % item def value_csv(self, record): return "\n".join(set([self.item_csv(i) for i in self.value(record)])) def item_csv(self, item): return item def value(self, record): return sorted(set(record[self.section].get(self.key, []))) class Roles(Set): def item_html(self, role): return Markup('
  • %s
  • ') % (role, role) class Services(Set): def value(self, record): profile_metadata = record["facts"].get("profile_metadata", dict()) return sorted(profile_metadata.get("services", list()), key=itemgetter("human_name")) def item_html(self, service): return Markup('
  • %s
  • ') % ( service["class_name"], service["human_name"]) def item_csv(self, service): return service["class_name"] class Owners(Services): def item_html(self, service): if service["owner_uid"] == ":undef": return "" else: return Markup('
  • %s
  • ') % service["owner_uid"] def item_csv(self, service): if service["owner_uid"] == ":undef": return "" else: return service["owner_uid"] class Teams(Services): def item_html(self, service): if service["team"] == ":undef": return "" else: return Markup('
  • %s
  • ') % service["team"] def item_csv(self, service): if service["team"] == ":undef": return "" else: return service["team"] class Fqdn(Base): def body_html(self, record): # Use th instead of td: return Markup('%s') % ( " ".join(self.body_class(record)), self.value_html(record)) def value_html(self, record): return Markup( '%s.%s') % ( record["certname"], record["facts"]["hostname"], record["facts"]["domain"]) class Os(Base): def value(self, record): os_fact = super(Os, self).value(record) os = [os_fact["name"]] try: os.append(os_fact["release"]["full"]) except KeyError: pass return " ".join(os)