95 lines
2.8 KiB
Python
95 lines
2.8 KiB
Python
#!/usr/bin/python
|
|
|
|
import sys, os
|
|
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(sys.argv[0]), '..', '..', '..', '..')))
|
|
|
|
from optparse import OptionParser
|
|
import binascii
|
|
from pyogp.lib.base.message.udpdeserializer import UDPPacketDeserializer
|
|
from logging import getLogger, StreamHandler, Formatter, CRITICAL, ERROR, WARNING, INFO, DEBUG
|
|
|
|
logger = getLogger('parse_packet')
|
|
log = logger.log
|
|
|
|
|
|
def main():
|
|
|
|
(options) = parse_options()
|
|
|
|
if options.verbose: enable_logging()
|
|
|
|
data = options.data
|
|
datatype = options.datatype
|
|
|
|
msg_buff = gen_message_buffer(data, datatype)
|
|
|
|
deserializer = UDPPacketDeserializer(msg_buff)
|
|
packet = deserializer.deserialize()
|
|
|
|
#print packet.__dict__
|
|
display_packet(packet)
|
|
|
|
def parse_options():
|
|
|
|
parser = OptionParser()
|
|
|
|
parser.add_option("-t", "--type", dest="datatype", default="hex", help="datatype to parse, default = hex")
|
|
parser.add_option("-d", "--data", dest="data", help="data to parse")
|
|
parser.add_option("-v", "--verbose", dest="verbose", default=True, action="store_false")
|
|
|
|
(options, args) = parser.parse_args()
|
|
|
|
return options
|
|
|
|
def gen_message_buffer(data, datatype):
|
|
|
|
if datatype == 'hex':
|
|
return message_buff_from_hex(data)
|
|
|
|
return
|
|
|
|
def message_buff_from_hex(data):
|
|
|
|
return binascii.unhexlify(''.join(data.split()))
|
|
|
|
def display_packet(packet):
|
|
|
|
delim = " "
|
|
print 'Packet Name:%s%s' % (delim, packet.name)
|
|
|
|
for k in packet.__dict__:
|
|
if k == 'name': pass
|
|
if k == 'message_data':
|
|
print k
|
|
for ablock in packet.message_data.blocks:
|
|
print "%sBlock Name:%s%s" % (delim, delim, ablock)
|
|
|
|
for somevars in packet.message_data.blocks[ablock]:
|
|
for avar in somevars.var_list:
|
|
zvar = somevars.get_variable(avar)
|
|
print "%s%s%s:%s%s" % (delim, delim, zvar.name, delim, zvar.get_data_as_string())
|
|
#print '%s:\t%s' % (k, packet.__dict__[k])
|
|
#print '%s:\t%s (%s)' (k, packet.__dict__[k], type(packet.__dict__[k]))
|
|
|
|
'''
|
|
for k,v in packet.__dict__:
|
|
if type(v) == type(object)
|
|
print 'Block Name:\t%s' % (v.name)
|
|
for k, v in getattr(packet, k):
|
|
'''
|
|
|
|
def enable_logging():
|
|
|
|
console = StreamHandler()
|
|
console.setLevel(DEBUG) # seems to be a no op, set it for the logger
|
|
formatter = Formatter('%(name)-30s: %(levelname)-8s %(message)s')
|
|
console.setFormatter(formatter)
|
|
getLogger('').addHandler(console)
|
|
|
|
# setting the level for the handler above seems to be a no-op
|
|
# it needs to be set for the logger, here the root logger
|
|
# otherwise it is NOTSET(=0) which means to log nothing.
|
|
getLogger('').setLevel(DEBUG)
|
|
|
|
if __name__ == "__main__":
|
|
main() |