blob: a29f14918477a9cd39f5c3a9c2662cdc90d1b72a [file] [log] [blame]
Alexander Couzens9b207412019-05-27 03:44:39 +02001#!/usr/bin/env python
2#
3# License: MIT
4# Copyright 2019 by Sysmocom s.f.m.c. GmbH
5# Author: Alexander Couzens <lynxis@fe80.eu>
6
7import logging
8import socket
9
10from gsmtap import GSMTAP_TYPE_OSMOCORE_LOG, gsmtap_hdr, gsmtap_log, TooSmall
11
12LOG = logging.getLogger("gsmlogreader")
13
14def parse_gsm(packet):
15 hdr = None
16
17 try:
18 hdr = gsmtap_hdr(packet)
19 except TooSmall:
20 return None
21
22 if hdr.type != GSMTAP_TYPE_OSMOCORE_LOG:
23 return None
24
25 if len(packet) <= hdr.hdr_len:
26 return None
27
28 try:
29 return gsmtap_log(packet[hdr.hdr_len:])
30 except TooSmall:
31 return None
32
33def gsmtaplevel_to_loglevel(level):
34 """ convert a gsmtap log level into a python log level """
35 if level <= 1:
36 return logging.DEBUG
37 if level <= 3:
38 return logging.INFO
39 if level <= 5:
40 return logging.WARNING
41
42 return logging.ERROR
43
44def convert_gsmtap_log(gsmtap):
45 level = gsmtaplevel_to_loglevel(gsmtap.level)
46
47 attr = {
48 "name": "gsmtap",
49 "levelno": level,
50 "levelname": gsmtap_get_logname(gsmtap.level),
51 "pathname": gsmtap.filename,
52 "lineno": gsmtap.fileline_nr,
53 "processName": gsmtap.proc_name,
54 "process": gsmtap.pid,
55 "module": gsmtap.subsys,
56 "created": float(gsmtap.sec + gsmtap.usec / 1000000.0),
57 "msec": int(gsmtap.usec / 1000),
58 "msg": gsmtap.message.replace('\n', ' '),
59 }
60 return attr
61
62def gsmtap_get_logname(level):
63 names = {
64 1: "DEBUG",
65 3: "INFO",
66 5: "NOTICE",
67 7: "ERROR",
68 8: "FATAL",
69 }
70 if level in names:
71 return names[level]
72 return "UNKNOWN"
73
74if __name__ == "__main__":
75 # Create a UDP socket
76 sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
77 server_address = ('0.0.0.0', 4729)
78 sock.bind(server_address)
79
80 logger = logging.getLogger("gsmtap")
81 logformat = "%(asctime)s %(message)s"
82 logging.basicConfig(format=logformat, level=logging.DEBUG)
83
84
85 while True:
86 data, address = sock.recvfrom(4096)
87 log = parse_gsm(data)
88 if not log:
89 continue
90
91 record = logging.makeLogRecord(convert_gsmtap_log(log))
92 logger.handle(record)