I am currently working on the 2.0.9 packaging of fwbuilder. If you want to make sure that the script supports atleast 2.0.7 which is currently in testing I would be willing to consider including in the examples directory and adding a note in the README.Debian regarding it with the 2.0.9 upload if you can get back in time. I did find that when I ran it against a couple of my .fwb files it failed to complete properly and threw a traceback.

Also include as an attachment rather than inline next time so I can just download rather than cut and paste.

   Regards,
   Jeremy

Luke Kenneth Casson Leighton wrote:

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]

Reply via email to