X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?p=hippotat.git;a=blobdiff_plain;f=hippotat%2F__init__.py;h=1e8a23f11e7b717f0a17534835b65f1debe4eb33;hp=064909100fbe409fe30ee67b772c902140060443;hb=ba5630fdc8ae56885fb3d9ba5dd05a7f0806f86f;hpb=a8827d595150e75f3fcd7353e08032ca5aa0135f diff --git a/hippotat/__init__.py b/hippotat/__init__.py index 0649091..1e8a23f 100644 --- a/hippotat/__init__.py +++ b/hippotat/__init__.py @@ -20,9 +20,12 @@ from optparse import OptionParser from configparser import ConfigParser from configparser import NoOptionError +from functools import partial + import collections import time import codecs +import traceback import re as regexp @@ -37,16 +40,20 @@ class DBG(twisted.python.constants.Names): INIT = NamedConstant() QUEUE = NamedConstant() QUEUE_CTRL = NamedConstant() + HTTP_FULL = NamedConstant() + SLIP_FULL = NamedConstant() + CTRL_DUMP = NamedConstant() _hex_codec = codecs.getencoder('hex_codec') log = twisted.logger.Logger() def log_debug(dflag, msg, idof=None, d=None): + #print('---------------->',repr((dflag, msg, idof, d)), file=sys.stderr) if idof is not None: - msg = '[%d] %s' % (id(idof), msg) + msg = '[%#x] %s' % (id(idof), msg) if d is not None: - d = d[0:64] + #d = d[0:64] d = _hex_codec(d)[0].decode('ascii') msg += ' ' + d log.info('{dflag} {msgcore}', dflag=dflag, msgcore=msg) @@ -56,11 +63,11 @@ defcfg = ''' #[] overrides max_batch_down = 65536 # used by server, subject to [limits] max_queue_time = 10 # used by server, subject to [limits] -max_request_time = 54 # used by server, subject to [limits] target_requests_outstanding = 3 # must match; subject to [limits] on server +http_timeout = 30 # used by both } must be +http_timeout_grace = 5 # used by both } compatible max_requests_outstanding = 4 # used by client max_batch_up = 4000 # used by client -http_timeout = 30 # used by client http_retry = 5 # used by client #[server] or [] overrides @@ -89,7 +96,7 @@ port = 80 # used by server [limits] max_batch_down = 262144 # used by server max_queue_time = 121 # used by server -max_request_time = 121 # used by server +http_timeout = 121 # used by server target_requests_outstanding = 10 # used by server ''' @@ -153,31 +160,38 @@ 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) + packets = slip.decode(data) + packets[0] = self._buffer + packets[0] self._buffer = packets.pop() for packet in packets: self._maybe_packet(packet) + self._log('bufremain', d=self._buffer) def _maybe_packet(self, packet): - if len(packet): - self._on_packet(packet) + self._log('maybepacket', d=packet) + if len(packet): + self._on_packet(packet) def flush(self): + self._log('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) @@ -199,6 +213,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) @@ -208,6 +223,7 @@ def queue_inbound(packet): class PacketQueue(): def __init__(self, desc, max_queue_time): self._desc = desc + assert(desc + '') self._max_queue_time = max_queue_time self._pq = collections.deque() # packets @@ -271,7 +287,8 @@ _crashing = False def crash(err): global _crashing _crashing = True - print('CRASH ', err, file=sys.stderr) + print('========== CRASH ==========', err, + '===========================', file=sys.stderr) try: reactor.stop() except twisted.internet.error.ReactorNotRunning: pass