| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| """ |
| Prints out journal entries with no or bad catalog explanations. |
| """ |
| |
| import re |
| from systemd import journal, id128 |
| |
| j = journal.Reader() |
| |
| logged = set() |
| pattern = re.compile('@[A-Z0-9_]+@') |
| |
| mids = {v:k for k,v in id128.__dict__.items() |
| if k.startswith('SD_MESSAGE')} |
| |
| freq = 1000 |
| |
| def log_entry(x): |
| if 'CODE_FILE' in x: |
| |
| print('{}:{} {}'.format(x.get('CODE_FILE', '???'), |
| x.get('CODE_LINE', '???'), |
| x.get('CODE_FUNC', None) or x.get('CODE_FUNCTION', '???'))) |
| print(' {}'.format(x.get('MESSAGE', 'no message!'))) |
| for k, v in x.items(): |
| if k.startswith('CODE_') or k in {'MESSAGE_ID', 'MESSAGE'}: |
| continue |
| print(' {}={}'.format(k, v)) |
| print() |
| |
| for i, x in enumerate(j): |
| if i % freq == 0: |
| print(i, end='\r') |
| |
| try: |
| mid = x['MESSAGE_ID'] |
| except KeyError: |
| continue |
| name = mids.get(mid, 'unknown') |
| |
| try: |
| desc = journal.get_catalog(mid) |
| except FileNotFoundError: |
| if mid in logged: |
| continue |
| |
| print('{} {.hex}: no catalog entry'.format(name, mid)) |
| log_entry(x) |
| logged.add(mid) |
| continue |
| |
| fields = [field[1:-1] for field in pattern.findall(desc)] |
| for field in fields: |
| index = (mid, field) |
| if field in x or index in logged: |
| continue |
| print('{} {.hex}: no field {}'.format(name, mid, field)) |
| log_entry(x) |
| logged.add(index) |