#!/usr/bin/env python3 """Summarise /tmp/utas_server.log since the last MARKER line: one row per request (verb, path, status), plus the squad/massinfo detail lines. Keeps the transcript small instead of dumping the raw log.""" import re, sys, collections LOG = "/tmp/utas_server.log" raw = open(LOG, errors="replace").read().splitlines() # start after the last marker (or the last server banner) start = 0 for i, l in enumerate(raw): if "=== MARKER" in l or "=== utas_server" in l: start = i lines = raw[start:] REQ = re.compile(r"^\[[\d:]+\] (GET|PUT|POST|DELETE|HEAD|PATCH) (\S+)") RESP = re.compile(r"^\[[\d:]+\] -> (\d+) (.*)") rows, counts, pending = [], collections.Counter(), None notes = [] for l in lines: m = REQ.match(l) if m: pending = (m.group(1), m.group(2).split("?")[0], m.group(2)) continue m = RESP.match(l) if m and pending: rows.append((pending[0], pending[1], m.group(1), len(m.group(2)))) counts[(pending[0], pending[1])] += 1 pending = None continue if "UNMAPPED" in l or "SQUAD:" in l or "STORE:" in l or "MARKET:" in l or "ITEM:" in l: notes.append(l.strip()) print(f"{len(rows)} requests since marker\n") print("verb path n") for (v, p), n in counts.most_common(): print(f"{v:6} {p:48} {n}") squad = [r for r in rows if "/squad" in r[1]] print(f"\n--- squad family ({len(squad)}) ---") for r in squad: print(" ", r[0], r[1], "->", r[2], f"({r[3]}b)") # the live URL is /squad/ (e.g. /squad/0), not a bare /squad -- match on the # segment, not endswith, or the headline result reads as a false negative. print("\nPUT /squad seen:", any(r[0] == "PUT" and "/squad" in r[1] for r in rows)) mi = [r for r in rows if "userMassInfo" in r[1]] print("userMassInfo requests:", len(mi), [r[2] for r in mi]) if notes: print("\n--- notes ---") for n in notes[-25:]: print(" ", n) last = rows[-6:] print("\n--- last 6 requests (where it stopped) ---") for r in last: print(" ", r[0], r[1], "->", r[2])