34 lines
1.0 KiB
Python
34 lines
1.0 KiB
Python
import socket
|
|
import os
|
|
|
|
LISTEN_PORT = int(os.environ.get("STATS_FILTER_LISTEN", "5006"))
|
|
FORWARD_PORT = int(os.environ.get("STATS_FILTER_FORWARD", "5005"))
|
|
FORWARD_ADDR = os.environ.get("STATS_FILTER_ADDR", "127.0.0.1")
|
|
BUF_SIZE = 65535
|
|
|
|
# Byte patterns to match (avoids decode overhead on spam lines)
|
|
PASS_PATTERNS = (
|
|
b"receiver-stats",
|
|
b"[CLEANUP]",
|
|
b"has timed out",
|
|
b"flow_cumulative_stats",
|
|
)
|
|
|
|
def main():
|
|
sock_in = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
|
sock_out = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
|
|
|
sock_in.bind(("0.0.0.0", LISTEN_PORT))
|
|
print(f"stats_filter: listening on UDP :{LISTEN_PORT}, forwarding to {FORWARD_ADDR}:{FORWARD_PORT}")
|
|
|
|
while True:
|
|
data, _ = sock_in.recvfrom(BUF_SIZE)
|
|
|
|
# Fast byte-level check — no decode unless it matches
|
|
for pattern in PASS_PATTERNS:
|
|
if pattern in data:
|
|
sock_out.sendto(data, (FORWARD_ADDR, FORWARD_PORT))
|
|
break
|
|
|
|
if __name__ == "__main__":
|
|
main() |