class SCCPClientProtocol(IntNStringReceiver): """ The protocol is based on twisted.protocols.basic IntNStringReceiver, with little-endian 32-bit length prefix. """ structFormat = "<L" prefixLength = struct.calcsize(structFormat) trailingNbOfBytes = 4 messageFactory = MessageFactory() def dataReceived(self, recd): """ Convert int prefixed strings into calls to stringReceived. """ self.recvd = self.recvd + recd while len(self.recvd) >= self.prefixLength and not self.paused: length, = struct.unpack(self.structFormat, self.recvd[:self.prefixLength]) length = length + self.trailingNbOfBytes if length > self.MAX_LENGTH: self.lengthLimitExceeded(length) return if len(self.recvd) < length + self.prefixLength: break packet = self.recvd[self.prefixLength:length + self.prefixLength] self.recvd = self.recvd[length + self.prefixLength:] self.stringReceived(packet) def stringReceived(self, s): message = self.messageFactory.create(s) message.unPack(s[8:]) self.factory.handleMessage(message) def connectionMade(self): self.factory.clientReady(self) def sendString(self, data): self.transport.write( struct.pack(self.structFormat, len(data)) + data + "\x00\x00\x00\x00")
def run(filter=None): engine = create_engine(sccpreplay.DB_URL) metadata = MetaData(engine) tbl_packets = Table('packets', metadata, *model.packets_columns) tbl_messages = Table('messages', metadata, *model.messages_columns) tbl_session_counter = Table('session_counter', metadata, *model.session_counter_columns) metadata.create_all() tbl_messages.delete().execute() packets = tbl_packets.select().execute() messages = [] i = 1 j = 1 messages = [] message_factory = MessageFactory() channels_assemblers = defaultdict(MessageAssembler) for packet in packets: channel = (packet['session'], packet['side']) assembler = channels_assemblers[channel] packets_data = assembler.feed(packet.data) for packet_data in packets_data: # if packet_data[4] == '\x03': # print 'button' message = packet_to_message(dict(packet)) message['data'] = packet_data m = sccpclientprotocol.deserialize(packet_data, message_factory) message['type'] = m.sccpmessageType # print packet['number'], message['session'], message['side'], m, '%04X' % m.sccpmessageType messages.append(message) tbl_messages.insert().execute(messages)
class TestMessageFactory(unittest.TestCase): def setUp(self): self.messageFactory = MessageFactory() def testCreateRegisterAck(self): receivedBuffer = "\x00\x00\x00\x00\x81\x00\x00\x00\x00\x0b\x00\x00" msg = self.messageFactory.create(receivedBuffer) self.assertTrue(isinstance(msg, SCCPRegisterAck)) def testCreateCapabilitiesReq(self): receivedBuffer = "\x00\x00\x00\x00\x9b\x00\x00\x00\x00\x0b\x00\x00" msg = self.messageFactory.create(receivedBuffer) self.assertTrue(isinstance(msg, SCCPCapabilitiesReq)) def testCreateKeepAliveAck(self): receivedBuffer = "\x00\x00\x00\x00\x00\x01\x00\x00\x00\x0b\x00\x00" msg = self.messageFactory.create(receivedBuffer) self.assertTrue(isinstance(msg, SCCPKeepAliveAck)) def testCreateDefineTimeDate(self): receivedBuffer = "\x00\x00\x00\x00\x94\x00\x00\x00\x00\x0b\x00\x00" msg = self.messageFactory.create(receivedBuffer) self.assertTrue(isinstance(msg, SCCPDefineTimeDate)) def testCreateLineStat(self): receivedBuffer = "\x00\x00\x00\x00\x92\x00\x00\x00\x00\x0b\x00\x00" msg = self.messageFactory.create(receivedBuffer) self.assertTrue(isinstance(msg, SCCPLineStat)) def testCreateUnkownType(self): receivedBuffer = "\x00\x00\x00\x00\xFF\xFF\x00\x00\x00\x0b\x00\x00" msg = self.messageFactory.create(receivedBuffer) self.assertEquals(0xFFFF,msg.sccpmessageType)
class TestMessageFactory(unittest.TestCase): def setUp(self): self.messageFactory = MessageFactory() def testCreateRegisterAck(self): receivedBuffer = "\x00\x00\x00\x00\x81\x00\x00\x00\x00\x0b\x00\x00" msg = self.messageFactory.create(receivedBuffer) self.assertTrue(isinstance(msg, SCCPRegisterAck)) def testCreateCapabilitiesReq(self): receivedBuffer = "\x00\x00\x00\x00\x9b\x00\x00\x00\x00\x0b\x00\x00" msg = self.messageFactory.create(receivedBuffer) self.assertTrue(isinstance(msg, SCCPCapabilitiesReq)) def testCreateKeepAliveAck(self): receivedBuffer = "\x00\x00\x00\x00\x00\x01\x00\x00\x00\x0b\x00\x00" msg = self.messageFactory.create(receivedBuffer) self.assertTrue(isinstance(msg, SCCPKeepAliveAck)) def testCreateDefineTimeDate(self): receivedBuffer = "\x00\x00\x00\x00\x94\x00\x00\x00\x00\x0b\x00\x00" msg = self.messageFactory.create(receivedBuffer) self.assertTrue(isinstance(msg, SCCPDefineTimeDate)) def testCreateLineStat(self): receivedBuffer = "\x00\x00\x00\x00\x92\x00\x00\x00\x00\x0b\x00\x00" msg = self.messageFactory.create(receivedBuffer) self.assertTrue(isinstance(msg, SCCPLineStat)) def testCreateUnkownType(self): receivedBuffer = "\x00\x00\x00\x00\xFF\xFF\x00\x00\x00\x0b\x00\x00" msg = self.messageFactory.create(receivedBuffer) self.assertEquals(0xFFFF, msg.sccpmessageType)
def __init__(self): self.messageFactory = MessageFactory() self.recvd = ""
def setUp(self): self.messageFactory = MessageFactory()