Package: fwbuilder Version: 2.0.3-2 Severity: normal
attached is a joyously useful program that makes up for the lack of print reporting in fwbuilder. it's a dog, it's hacked, it works. i wouldn't recommend making python a dependency because of it, but i _would_ recommend dumping it in the /usr/share/doc/fwbuilder/examples directory and referencing it in the README. or makin a separate apt-get install package for it (with a dep on python) l. #!/usr/bin/env python from xml.dom.minidom import parseString, parse class fw: def __init__(self): self.hosts = {} self.descriptions = {} def print_comment(self, c): print '<pre>' for l in c.split("\\n"): while l: bp = l.find(' ', 50) if bp < 50: bp = 50 if len(l) >= 50: end = l.rfind(' ') if end <= 50: bp = end print "%s" % l[:bp] l = l[bp:] print '</pre>' def decode_address_ranges(self, i): adrs = [] print '<table class="tabledataindent">' for a in i: print '<tr class="tablerow" valign="top">' self.descriptions[a.getAttribute('id')] = a.getAttribute('name') print """ <td> %s: </td> <td> %s </td> <td> %s </td> """ % \ (a.getAttribute('name'), a.getAttribute('start_address'), a.getAttribute('end_address')) comment = a.getAttribute('comment') if comment: print '</tr>' print '<tr class="tablerow" valign="top">' print '<td> </td>' print '<td colspan="2">' self.print_comment(comment) print '</td>' print '</tr>' print '</table>' def decode_ipv4(self, i): adrs = [] print '<table class="tabledataindent">' for a in i: self.descriptions[a.getAttribute('id')] = a.getAttribute('name') print '<tr class="tablerow" valign="top">' print "<td>%s: </td> <td>%s/%s</td>" % \ (a.getAttribute('name'), a.getAttribute('address'), a.getAttribute('netmask')) print "</tr>" comment = a.getAttribute('comment') if comment: print '</tr>' print '<tr class="tablerow" valign="top">' print '<td> </td>' print '<td colspan="2">' self.print_comment(comment) print '</td>' print '</tr>' print '</table>' def decode_interface(self, i): self.descriptions[i.getAttribute('id')] = i.getAttribute('name') print '<tr class="tablerow" valign="top">' print "<td>Interface: %-8s </td> <td> %s </td>" % \ (i.getAttribute('name'), i.getAttribute('label')) print "<td>" self.decode_ipv4(i.getElementsByTagName('IPv4')) print "</td>" print "</tr>" def get_desc(self, id): if type(id) is not list: id = [id] l = [] for i in id: l.append(self.descriptions.get(i, "<unknown: %s>" % str(i))) return '<br />'.join(l) def decode_host(self, h): self.descriptions[h.getAttribute('id')] = h.getAttribute('name') print "<td>" print '<table class="tabledata">' print '<tr class="tablerow" valign="top"><td>' print "Hostname: <br /> %s" % h.getAttribute('name') print "</td></tr>" print '</table>' print "</td>" print "<td>" print '<table class="tabledata">' for i in h.getElementsByTagName('Interface'): self.decode_interface(i) print '</table>' print "</td>" def decode_hosts(self, o): print '<table class="tabledataindent">' hl = o.getElementsByTagName('Host') for h in hl: print '<tr class="tablerow" valign="top">' self.decode_host(h) print '</tr>' print '</table>' def decode_svc_icmp(self, t): self.descriptions[t.getAttribute('id')] = t.getAttribute('name') print """ <tr class="section"> <td class="name"> Name: %-10s </td> <td class="item"> Code: %s </td> <td class="item"> Type: %s </td> </tr> """ % \ (t.getAttribute('name'), t.getAttribute('code'), t.getAttribute('type')) def decode_svc_tcp(self, t): self.descriptions[t.getAttribute('id')] = t.getAttribute('name') start = int(t.getAttribute('dst_range_start')) end = int(t.getAttribute('dst_range_end')) if start == end: dest = '%d' % start else: dest = '%d-%d' % (start, end) print """ <tr class="section"> <td class="name"> Name: %-10s </td> <td class="item"> Dest: %s </td> </tr> """ % \ (t.getAttribute('name'), dest) def print_heading(self, sh): print '<table class="heading">' print '<tr><td>' print sh print '</td></tr>' print '</table>' def print_subheading(self, sh, comment=''): print '<table>' print '<tr><td>' print '<table class="subheading">' print '<tr><td>' print sh print '</td></tr>' print '</table>' print '</td></tr>' print '<tr>' print '<td>' print '<div class="subindented">' self.print_comment(comment) print '</div>' print '</td>' print '</tr>' print '</table>' def decode_svc_group_members(self, i): print '<table class="tabledataindent">' for a in i: print '<tr class="tablerow" valign="top">' print """ <td> %s </td> """ % self.descriptions[a] print '</tr>' print '</table>' def decode_svc_grp(self, h): self.descriptions[h.getAttribute('id')] = h.getAttribute('name') self.print_subheading("Service Group: %s" % h.getAttribute('name'), h.getAttribute('comment')) print '<div class="indented">' l = [] for n in h.getElementsByTagName('ServiceRef'): l.append(n.getAttribute('ref')) self.decode_svc_group_members(l) print '</div>' def decode_service_groups(self, o): ts = o.getElementsByTagName('ServiceGroup') self.print_subheading("Service Groups") print '<div class="subindented">' for t in ts: n = t.getAttribute('name') if n == 'Groups': for g in t.getElementsByTagName('ServiceGroup'): self.decode_svc_grp(g) print '</div>' def decode_services(self, o): ts = o.getElementsByTagName('UDPService') self.print_subheading("UDP Services") print '<table class="tabledataindent">' for t in ts: self.decode_svc_tcp(t) print '</table>' ts = o.getElementsByTagName('TCPService') self.print_subheading("TCP Services") print '<table class="tabledataindent">' for t in ts: self.decode_svc_tcp(t) print '</table>' ts = o.getElementsByTagName('ICMPService') self.print_subheading("ICMP Services") print '<table class="tabledataindent">' for t in ts: self.decode_svc_icmp(t) print '</table>' def get_srvref(self, c, ref): r = c.getElementsByTagName(ref) ans = [] for n in r[0].getElementsByTagName('ServiceRef'): ans.append(n.getAttribute('ref')) return ans def get_ref(self, c, ref): r = c.getElementsByTagName(ref) ans = [] for n in r[0].getElementsByTagName('ObjectRef'): ans.append(n.getAttribute('ref')) return ans def decode_policyrule(self, nr): print '<tr class="tablerow" valign="top">' print '<td> %s </td>' % nr.getAttribute('action') comment = nr.getAttribute('comment') print '<td>' self.print_comment(comment) print '</td>' src = self.get_ref(nr, 'Src') dst = self.get_ref(nr, 'Dst') srv = self.get_srvref(nr, 'Srv') print """<td> <table class="tabledata"> <tr class="tablerow" valign="top"> <td> Src: </td> <td> %s </td> </tr> <tr class="tablerow" valign="top"> <td> Dest: </td> <td> %s </td> </tr> <tr class="tablerow" valign="top"> <td> Service: </td> <td> %s </td> </tr> </table> </td> """ % \ (self.get_desc(src), self.get_desc(dst), self.get_desc(srv)) print '</tr>' def decode_natrule(self, nr): print '<tr class="tablerow" valign="top">' comment = nr.getAttribute('comment') print '<td>' self.print_comment(comment) print '</td>' osrc = self.get_ref(nr, 'OSrc') odst = self.get_ref(nr, 'ODst') osrv = self.get_srvref(nr, 'OSrv') tsrc = self.get_ref(nr, 'TSrc') tdst = self.get_ref(nr, 'TDst') tsrv = self.get_srvref(nr, 'TSrv') print """ <td> <table class="tabledata"> <tr class="tablerow" valign="top"> <td> Original Src: </td> <td> %s </td> </tr> <tr class="tablerow" valign="top"> <td> Original Dest: </td> <td> %s </td> </tr> <tr class="tablerow" valign="top"> <td> Original Service: </td> <td> %s </td> </tr> </table> </td> """ % \ (self.get_desc(osrc), self.get_desc(odst), self.get_desc(osrv)) print """ <td> <table class="tabledata"> <tr class="tablerow" valign="top"> <td> Target Src: </td> <td> %s </td> </tr> <tr class="tablerow" valign="top"> <td> Target Dest: </td> <td> %s </td> </tr> <tr class="tablerow" valign="top"> <td> Target Service: </td> <td> %s </td> </tr> </table> </td> """ % \ (self.get_desc(tsrc), self.get_desc(tdst), self.get_desc(tsrv)) print '</tr>' def decode_fw_interface(self, n): self.print_subheading("Interface: %s" % n.getAttribute('name'), n.getAttribute('comment')) print '<table class="tabledataindent">' for pr in n.getElementsByTagName('PolicyRule'): self.decode_policyrule(pr) print '</table>' def decode_policy(self, n): self.print_subheading("Policy:") print '<table class="tabledataindent">' for nr in n.getElementsByTagName('PolicyRule'): self.decode_policyrule(nr) print '</table>' def decode_nat(self, n): self.print_subheading("NAT:") print '<table class="tabledataindent">' for nr in n.getElementsByTagName('NATRule'): self.decode_natrule(nr) print '</table>' def decode_group_members(self, i): print '<table class="tabledataindent">' for a in i: print '<tr class="tablerow" valign="top">' print """ <td> %s </td> """ % self.descriptions[a] print '</tr>' print '</table>' def decode_group(self, h): self.descriptions[h.getAttribute('id')] = h.getAttribute('name') self.print_subheading("Group: %s" % h.getAttribute('name'), h.getAttribute('comment')) print '<div class="indented">' l = [] for n in h.getElementsByTagName('ObjectRef'): l.append(n.getAttribute('ref')) self.decode_group_members(l) print '</div>' def decode_groups(self, h): print '<div class="indented">' for n in h.getElementsByTagName('ObjectGroup'): self.decode_group(n) print '</div>' def decode_firewall(self, h): self.print_subheading("Firewall: %s" % h.getAttribute('name')) print '<div class="indented">' for n in h.getElementsByTagName('Interface'): self.decode_interface(n) for n in h.getElementsByTagName('Policy'): self.decode_policy(n) for n in h.getElementsByTagName('NAT'): self.decode_nat(n) for n in h.getElementsByTagName('Interface'): self.decode_fw_interface(n) print '</div>' def decode_firewalls(self, o): hl = o.getElementsByTagName('Firewall') for fw in hl: self.decode_firewall(fw) if __name__ == '__main__': from sys import argv fd = open(argv[1], "r") doc = parse(fd) f = fw() print "<html>" print """ <style type="text/css"> .tabledataindent { color: #000000; background: #aaffaa; border-color: #000000 #999999 #999999 #000000; border-style: solid; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; margin-left: 40px; } .tablerow { color: #000000; background: #ccffcc; border-color: #000000 #999999 #999999 #000000; border-style: solid; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; } .tabledata { color: #000000; background: #ccffcc; } .heading { font-size: 20; font-family: Verdana, Arial, Helvetica, sans-serif; color: #000000; background: #aaaaff; margin-top: 40px; margin-bottom: 10px; border-style: solid; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; } .subheading { font-size: 15; font-family: Verdana, Arial, Helvetica, sans-serif; color: #000000; background: #ccccff; margin-top: 15px; margin-left: 20px; margin-right: 20px; border-style: solid; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; } .indented { margin-left: 40px; } .subindented { margin-left: 20px; margin-bottom: 10px; } </style> """ print "<body>" lib = doc.getElementsByTagName('Library') f.descriptions['sysid0'] = 'Any Network' f.descriptions['sysid1'] = 'Any IP Service' svcs = doc.getElementsByTagName('ServiceGroup') for o in svcs: n = o.getAttribute('name') if n == 'Services': f.print_heading(n) f.decode_services(o) for o in svcs: n = o.getAttribute('name') if n == 'Services': f.decode_service_groups(o) objs = doc.getElementsByTagName('ObjectGroup') for o in objs: n = o.getAttribute('name') if n == 'Hosts': f.print_heading(n) f.decode_hosts(o) if n == 'Address Ranges': f.print_heading(n) f.decode_address_ranges(o.getElementsByTagName('AddressRange')) if n == 'Addresses': f.print_heading(n) f.decode_ipv4(o.getElementsByTagName('IPv4')) print for o in objs: n = o.getAttribute('name') if n == 'Groups': f.print_heading(n) f.decode_groups(o) print for o in objs: n = o.getAttribute('name') if n == 'Firewalls': f.print_heading(n) f.decode_firewalls(o) print print "</body>" print "</html>" -- System Information: Debian Release: testing/unstable Architecture: i386 Kernel: Linux highfield 2.6.11-1-686 #1 Fri May 20 07:34:54 UTC 2005 i686 Locale: LANG=C, LC_CTYPE=C Versions of packages fwbuilder depends on: ii fwbuilder-common 2.0.3-2 Firewall administration tool GUI ( ii fwbuilder-linux [fwbuild 2.0.3-2 Firewall Builder policy compiler(s ii libc6 2.3.2.ds1-21 GNU C Library: Shared libraries an ii libfwbuilder6 2.0.3-1 Firewall Builder API library ii libgcc1 1:3.5-0pre1 GCC support library ii libqt3c102-mt 3:3.3.4-3 Qt GUI Library (Threaded runtime v ii libsnmp5 5.1.2-6 NET SNMP (Simple Network Managemen ii libssl0.9.7 0.9.7c-5 SSL shared libraries ii libstdc++5 1:3.3.4-11 The GNU Standard C++ Library v3 ii libwrap0 7.6-ipv6.1-3 Wietse Venema's TCP wrappers libra ii libx11-6 4.3.0.dfsg.1-6 X Window System protocol client li ii libxext6 4.3.0.dfsg.1-6 X Window System miscellaneous exte ii libxml2 2.6.16-7 GNOME XML library ii libxslt1.1 1.1.12-8 XSLT processing library - runtime ii xlibs 4.3.0.dfsg.1-11 X Keyboard Extension (XKB) configu ii zlib1g 1:1.2.1-3 compression library - runtime -- no debconf information -- To UNSUBSCRIBE, email to [EMAIL PROTECTED] with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]