diff --git a/scapy/scapypipes.py b/scapy/scapypipes.py index c4685d5c6e01d72ef8e610350255daf8d42e60f3..5664f19dd40e046448d7a8af3faefdcc8985febf 100644 --- a/scapy/scapypipes.py +++ b/scapy/scapypipes.py @@ -196,3 +196,41 @@ class TCPListenPipe(TCPConnectPipe): self.fd.close() self.fd = fd self.connected = True + +class TriggeredMessage(Drain): + """Send a preloaded message when triggered and trigger in chain + +------^------+ + >>-| | /----|->> + | |/ | + >-|-[ message ]-|-> + +------^------+ +""" + def __init__(self, msg, name=None): + Drain.__init__(self, name=name) + self.msg = msg + def on_trigger(self, trigmsg): + self._send(self.msg) + self._high_send(self.msg) + self._trigger(trigmsg) + +class TriggerDrain(Drain): + """Pass messages and trigger when a condition is met + +------^------+ + >>-|-[condition]-|->> + | | | + >-|-[condition]-|-> + +-------------+ +""" + def __init__(self, f, name=None): + Drain.__init__(self, name=name) + self.f = f + def push(self, msg): + v = self.f(msg) + if v: + self._trigger(v) + self._send(msg) + def high_push(self, msg): + v = self.f(msg) + if v: + self._trigger(v) + self._high_send(msg)