forked from osmocom/wireshark
Update WiresharkXML.py to work with Python 2.7.
svn path=/trunk/; revision=47259
This commit is contained in:
parent
10dd94fa0b
commit
413e04d2b8
|
@ -14,6 +14,10 @@ working on Analyzer. The specification can be found at:
|
||||||
|
|
||||||
http://analyzer.polito.it/30alpha/docs/dissectors/PDMLSpec.htm
|
http://analyzer.polito.it/30alpha/docs/dissectors/PDMLSpec.htm
|
||||||
|
|
||||||
|
That URL is not functioning any more, but a copy can be found at:
|
||||||
|
|
||||||
|
http://gd.tuwien.ac.at/.vhost/analyzer.polito.it/docs/dissectors/PDMLSpec.htm
|
||||||
|
|
||||||
A related XML format, the Packet Summary Markup Language (PSML), is
|
A related XML format, the Packet Summary Markup Language (PSML), is
|
||||||
also defined by the Analyzer group to provide packet summary information.
|
also defined by the Analyzer group to provide packet summary information.
|
||||||
The PSML format is not documented in a publicly-available HTML document,
|
The PSML format is not documented in a publicly-available HTML document,
|
||||||
|
@ -151,9 +155,13 @@ import WiresharkXML
|
||||||
def my_callback(packet):
|
def my_callback(packet):
|
||||||
# do something
|
# do something
|
||||||
|
|
||||||
|
# If the PDML is stored in a file, you can:
|
||||||
fh = open(xml_filename)
|
fh = open(xml_filename)
|
||||||
WiresharkXML.parse_fh(fh, my_callback)
|
WiresharkXML.parse_fh(fh, my_callback)
|
||||||
|
|
||||||
|
# or, if the PDML is contained within a string, you can:
|
||||||
|
WiresharkXML.parse_string(my_string, my_callback)
|
||||||
|
|
||||||
# Now that the script has the packet data, do something.
|
# Now that the script has the packet data, do something.
|
||||||
------------------------------------------------------------
|
------------------------------------------------------------
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
"""
|
"""
|
||||||
Baseclass for reading PDML produced from TShark.
|
Routines for reading PDML produced from TShark.
|
||||||
|
|
||||||
Copyright (c) 2003 by Gilbert Ramirez <gram@alumni.rice.edu>
|
Copyright (c) 2003, 2013 by Gilbert Ramirez <gram@alumni.rice.edu>
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or
|
This program is free software; you can redistribute it and/or
|
||||||
modify it under the terms of the GNU General Public License
|
modify it under the terms of the GNU General Public License
|
||||||
|
@ -19,14 +19,15 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import sys
|
import sys
|
||||||
from xml.sax import saxlib
|
import xml.sax
|
||||||
from xml.sax import saxexts
|
from xml.sax.saxutils import quoteattr
|
||||||
from xml.sax import saxutils
|
import cStringIO as StringIO
|
||||||
|
|
||||||
class CaptureFile:
|
class CaptureFile:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
class FoundItException(Exception):
|
class FoundItException(Exception):
|
||||||
|
"""Used internally for exiting a tree search"""
|
||||||
pass
|
pass
|
||||||
|
|
||||||
class PacketList:
|
class PacketList:
|
||||||
|
@ -43,22 +44,24 @@ class PacketList:
|
||||||
"""We act like a list."""
|
"""We act like a list."""
|
||||||
return self.children[index]
|
return self.children[index]
|
||||||
|
|
||||||
|
def __len__(self):
|
||||||
|
return len(self.children)
|
||||||
|
|
||||||
def item_exists(self, name):
|
def item_exists(self, name):
|
||||||
"""Does an item with name 'name' exist in this
|
"""Does an item with name 'name' exist in this
|
||||||
PacketList?"""
|
PacketList? Returns True or False."""
|
||||||
for child in self.children:
|
for child in self.children:
|
||||||
if child.name == name:
|
if child.name == name:
|
||||||
return 1
|
return True
|
||||||
|
|
||||||
try:
|
try:
|
||||||
for child in self.children:
|
for child in self.children:
|
||||||
child._item_exists(name)
|
child._item_exists(name)
|
||||||
|
|
||||||
except FoundItException:
|
except FoundItException:
|
||||||
return 1
|
return True
|
||||||
|
|
||||||
return 0
|
return False
|
||||||
|
|
||||||
def _item_exists(self, name):
|
def _item_exists(self, name):
|
||||||
for child in self.children:
|
for child in self.children:
|
||||||
|
@ -147,30 +150,30 @@ class ProtoTreeItem(PacketList):
|
||||||
def get_hide(self):
|
def get_hide(self):
|
||||||
return self.hide
|
return self.hide
|
||||||
|
|
||||||
def dump(self, fh):
|
def dump(self, fh=sys.stdout):
|
||||||
if self.name:
|
if self.name:
|
||||||
print >> fh, " name=%s" % (saxutils.quoteattr(self.name),),
|
print >> fh, " name=%s" % (quoteattr(self.name),),
|
||||||
|
|
||||||
if self.showname:
|
if self.showname:
|
||||||
print >> fh, "showname=%s" % (saxutils.quoteattr(self.showname),),
|
print >> fh, "showname=%s" % (quoteattr(self.showname),),
|
||||||
|
|
||||||
if self.pos:
|
if self.pos:
|
||||||
print >> fh, "pos=%s" % (saxutils.quoteattr(self.pos),),
|
print >> fh, "pos=%s" % (quoteattr(self.pos),),
|
||||||
|
|
||||||
if self.size:
|
if self.size:
|
||||||
print >> fh, "size=%s" % (saxutils.quoteattr(self.size),),
|
print >> fh, "size=%s" % (quoteattr(self.size),),
|
||||||
|
|
||||||
if self.value:
|
if self.value:
|
||||||
print >> fh, "value=%s" % (saxutils.quoteattr(self.value),),
|
print >> fh, "value=%s" % (quoteattr(self.value),),
|
||||||
|
|
||||||
if self.show:
|
if self.show:
|
||||||
print >> fh, "show=%s" % (saxutils.quoteattr(self.show),),
|
print >> fh, "show=%s" % (quoteattr(self.show),),
|
||||||
|
|
||||||
if self.hide:
|
if self.hide:
|
||||||
print >> fh, "hide=%s" % (saxutils.quoteattr(self.hide),),
|
print >> fh, "hide=%s" % (quoteattr(self.hide),),
|
||||||
|
|
||||||
class Packet(ProtoTreeItem, PacketList):
|
class Packet(ProtoTreeItem, PacketList):
|
||||||
def dump(self, fh, indent=0):
|
def dump(self, fh=sys.stdout, indent=0):
|
||||||
print >> fh, " " * indent, "<packet>"
|
print >> fh, " " * indent, "<packet>"
|
||||||
indent += 1
|
indent += 1
|
||||||
for child in self.children:
|
for child in self.children:
|
||||||
|
@ -180,7 +183,7 @@ class Packet(ProtoTreeItem, PacketList):
|
||||||
|
|
||||||
class Protocol(ProtoTreeItem):
|
class Protocol(ProtoTreeItem):
|
||||||
|
|
||||||
def dump(self, fh, indent=0):
|
def dump(self, fh=sys.stdout, indent=0):
|
||||||
print >> fh, "%s<proto " % (" " * indent,),
|
print >> fh, "%s<proto " % (" " * indent,),
|
||||||
|
|
||||||
ProtoTreeItem.dump(self, fh)
|
ProtoTreeItem.dump(self, fh)
|
||||||
|
@ -195,14 +198,11 @@ class Protocol(ProtoTreeItem):
|
||||||
|
|
||||||
class Field(ProtoTreeItem):
|
class Field(ProtoTreeItem):
|
||||||
|
|
||||||
def dump(self, fh, indent=0):
|
def dump(self, fh=sys.stdout, indent=0):
|
||||||
print >> fh, "%s<field " % (" " * indent,),
|
print >> fh, "%s<field " % (" " * indent,),
|
||||||
|
|
||||||
ProtoTreeItem.dump(self, fh)
|
ProtoTreeItem.dump(self, fh)
|
||||||
|
|
||||||
if self.label:
|
|
||||||
print >> fh, "label=%s" % (saxutils.quoteattr(self.label),),
|
|
||||||
|
|
||||||
if self.children:
|
if self.children:
|
||||||
print >> fh, ">"
|
print >> fh, ">"
|
||||||
indent += 1
|
indent += 1
|
||||||
|
@ -214,7 +214,7 @@ class Field(ProtoTreeItem):
|
||||||
print >> fh, "/>"
|
print >> fh, "/>"
|
||||||
|
|
||||||
|
|
||||||
class ParseXML(saxlib.HandlerBase):
|
class ParseXML(xml.sax.handler.ContentHandler):
|
||||||
|
|
||||||
ELEMENT_FILE = "pdml"
|
ELEMENT_FILE = "pdml"
|
||||||
ELEMENT_FRAME = "packet"
|
ELEMENT_FRAME = "packet"
|
||||||
|
@ -272,26 +272,43 @@ class ParseXML(saxlib.HandlerBase):
|
||||||
if isinstance(elem, Packet):
|
if isinstance(elem, Packet):
|
||||||
self.cb(elem)
|
self.cb(elem)
|
||||||
|
|
||||||
def characters(self, chars, start, length):
|
def characters(self, chars):
|
||||||
self.chars = self.chars + chars[start:start+length]
|
self.chars = self.chars + chars
|
||||||
|
|
||||||
|
|
||||||
def parse_fh(fh, cb):
|
def _create_parser(cb):
|
||||||
|
"""Internal function for setting up the SAX parser."""
|
||||||
|
|
||||||
# Create a parser
|
# Create a parser
|
||||||
parser = saxexts.make_parser()
|
parser = xml.sax.make_parser()
|
||||||
|
|
||||||
# Create the handler
|
# Create the handler
|
||||||
ch = ParseXML(cb)
|
handler = ParseXML(cb)
|
||||||
|
|
||||||
# Tell the parser to use our handler
|
# Tell the parser to use our handler
|
||||||
parser.setDocumentHandler(ch)
|
parser.setContentHandler(handler)
|
||||||
|
|
||||||
|
# Don't fetch the DTD, in case it is listed
|
||||||
|
parser.setFeature(xml.sax.handler.feature_external_ges, False)
|
||||||
|
|
||||||
|
return parser
|
||||||
|
|
||||||
|
def parse_fh(fh, cb):
|
||||||
|
"""Parse a PDML file, given filehandle, and call the callback function (cb),
|
||||||
|
once for each Packet object."""
|
||||||
|
|
||||||
|
parser = _create_parser(cb)
|
||||||
|
|
||||||
# Parse the file
|
# Parse the file
|
||||||
parser.parseFile(fh)
|
parser.parse(fh)
|
||||||
|
|
||||||
# Close the parser
|
# Close the parser ; this is erroring out, but I'm not sure why.
|
||||||
parser.close()
|
#parser.close()
|
||||||
|
|
||||||
|
def parse_string(text, cb):
|
||||||
|
"""Parse the PDML contained in a string."""
|
||||||
|
stream = StringIO.StringIO(text)
|
||||||
|
parse_fh(stream, cb)
|
||||||
|
|
||||||
def _test():
|
def _test():
|
||||||
import sys
|
import sys
|
||||||
|
|
Loading…
Reference in New Issue