From 522fd8a47200795d02f5d284781cbf2eb2696c52 Mon Sep 17 00:00:00 2001 From: Alexander UR6LKW Date: Sat, 24 May 2025 12:20:27 +0300 Subject: [PATCH] [proxy] Update proxy logger to show l2 --- relog.py | 26 ++++++++++++++++++++++++++ udpproxylogger.py | 34 +++++++++++++++++++++++++++------- 2 files changed, 53 insertions(+), 7 deletions(-) create mode 100755 relog.py diff --git a/relog.py b/relog.py new file mode 100755 index 0000000..c71052b --- /dev/null +++ b/relog.py @@ -0,0 +1,26 @@ +import argparse + +from udpproxylogger import log_packet, setup_logger + + +def parse_arguments(): + parser = argparse.ArgumentParser(description='ReLog') + parser.add_argument('infilename', type=str, help='input log filename') + parser.add_argument('-l', '--log-file', type=str, help='Log filename') + return parser.parse_args() + + +def main(): + args = parse_arguments() + setup_logger(args.log_file) + + with open(args.infilename, "r") as file: + for line in file: + line = line.strip() + if line.startswith("HD: "): + pdata = bytes.fromhex(line[4:]) + log_packet("DIR", pdata, ('', '')) + + +if __name__ == "__main__": + main() diff --git a/udpproxylogger.py b/udpproxylogger.py index e76a037..7a561c8 100755 --- a/udpproxylogger.py +++ b/udpproxylogger.py @@ -3,8 +3,13 @@ import asyncio import logging import traceback +from bitarray import bitarray + from dmrtools import DMRPPacketFactory from dmrtools import hexdump +from dmrtools.dmrproto import DMRPL2FullLC, DMRPL2VoiceBurst +from dmrtools.dmrproto import DMRPPacketData +from dmrtools.dmrproto import EmbLCAssembler, LCFactory def setup_logger(log_file=None): @@ -13,21 +18,36 @@ def setup_logger(log_file=None): handlers.append(logging.FileHandler(log_file)) logging.basicConfig( - level=logging.INFO, + # level=logging.INFO, + level=logging.DEBUG, format='%(asctime)s [%(levelname)s] %(message)s', datefmt='%Y-%m-%d %H:%M:%S', handlers=handlers ) +elca: dict[int, EmbLCAssembler] = dict() + def get_packet_details(data): - if not hasattr(get_packet_details, 'pf'): - get_packet_details.pf = DMRPPacketFactory() try: - p = get_packet_details.pf.from_data(data) - if p.pkt_type == 'DMRD': - return f"{p:ext}\n" - return f"{str(p)}\n" + p = DMRPPacketFactory.fd(data) + if type(p) is DMRPPacketData: + emblcinfo = "" + if (full_lc := p.get_full_lc()) is not None: + lcdec = LCFactory.fd(full_lc) + emblcinfo = f"FullLC:{hexdump(full_lc)}\n{lcdec}\n" + return f"{p:l2}\n" + emblcinfo + if p.stream_id not in elca: + elca[p.stream_id] = EmbLCAssembler() + if elca[p.stream_id].process_voicedata(p): + emblcdata = elca[p.stream_id].decode() + lcdec = LCFactory.fd(emblcdata) + emblcinfo = f"EmbLC:{hexdump(emblcdata)}\n{lcdec}\n" + del elca[p.stream_id] + if p.is_voice_term: + del elca[p.stream_id] + return f"{p:l2}\n" + emblcinfo + return f"{p}\n" except: return f"Exception while decoding packet:\n{traceback.format_exc()}"