X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?p=hippotat.git;a=blobdiff_plain;f=hippotat%2F__init__.py;h=6de4d14c33e659b1bc91daa236ab86096c7b323d;hp=6286f49bdeae63b1d3a4c1a50b3b95b6de934048;hb=3297cac10f5726598246c6db6cf0efc4c51f355d;hpb=e8fcf3b7494f214242f8a0a8fe9c72fe7f7a27b1 diff --git a/hippotat/__init__.py b/hippotat/__init__.py index 6286f49..6de4d14 100644 --- a/hippotat/__init__.py +++ b/hippotat/__init__.py @@ -23,6 +23,7 @@ from configparser import NoOptionError import collections import time import codecs +import traceback import re as regexp @@ -38,6 +39,7 @@ class DBG(twisted.python.constants.Names): QUEUE = NamedConstant() QUEUE_CTRL = NamedConstant() HTTP_FULL = NamedConstant() + SLIP_FULL = NamedConstant() _hex_codec = codecs.getencoder('hex_codec') @@ -155,31 +157,39 @@ def ipnetwork(input): #---------- ipif (SLIP) subprocess ---------- class SlipStreamDecoder(): - def __init__(self, on_packet): - # we will call packet() + def __init__(self, desc, on_packet): self._buffer = b'' self._on_packet = on_packet + self._desc = desc + self._log('__init__') + + def _log(self, msg, **kwargs): + log_debug(DBG.SLIP_FULL, 'slip %s: %s' % (self._desc, msg), **kwargs) def inputdata(self, data): - #print('SLIP-GOT ', repr(data)) - self._buffer += data - packets = slip.decode(self._buffer) + self._log('inputdata', d=data) + data = self._buffer + data + self._buffer = b'' + packets = slip.decode(data) self._buffer = packets.pop() for packet in packets: self._maybe_packet(packet) + self._log('inputdata bufremain', d=self._buffer) def _maybe_packet(self, packet): - if len(packet): - self._on_packet(packet) + self._log('inputdata maybepacket', d=packet) + if len(packet): + self._on_packet(packet) def flush(self): + self._log('inputdata flush') self._maybe_packet(self._buffer) self._buffer = b'' class _IpifProcessProtocol(twisted.internet.protocol.ProcessProtocol): def __init__(self, router): self._router = router - self._decoder = SlipStreamDecoder(self.slip_on_packet) + self._decoder = SlipStreamDecoder('ipif', self.slip_on_packet) def connectionMade(self): pass def outReceived(self, data): self._decoder.inputdata(data) @@ -201,6 +211,7 @@ def start_ipif(command, router): env=None) def queue_inbound(packet): + log_debug(DBG.FLOW, "queue_inbound", d=packet) ipif.transport.write(slip.delimiter) ipif.transport.write(slip.encode(packet)) ipif.transport.write(slip.delimiter)