#!/usr/bin/env python3 """ Print the full SNMP OID tree that would be served by the SNMP agent. Useful for verifying player data and OID mapping without running snmpd. Run this after dev_server.py has done at least one Yodeck poll. Usage: python snmp_test.py [--filter ] Examples: python snmp_test.py # all players python snmp_test.py --filter TRN_FRONT # only matching names python snmp_test.py --filter 54239 # by Yodeck ID """ import os import sys import argparse _HERE = os.path.dirname(os.path.abspath(__file__)) os.environ.setdefault('DB_PATH', os.path.join(_HERE, 'data', 'yodmon.db')) os.environ.setdefault('ENTERPRISE_OID', '.1.3.6.1.4.1.99999') from app.config import DB_PATH, ENTERPRISE_OID from app.database import get_all_players, get_player_counts COLUMNS = [ (1, 'STRING', 'hostname', lambda p: f"yodeck-{p['id']}"), (2, 'STRING', 'name', lambda p: p.get('name') or ''), (3, 'INTEGER', 'online', lambda p: str(p.get('online', 0))), (4, 'STRING', 'last_seen', lambda p: p.get('last_seen') or ''), (5, 'INTEGER', 'updating', lambda p: str(p.get('updating', 0))), (6, 'INTEGER', 'registered', lambda p: str(p.get('registered', 0))), ] def main(): parser = argparse.ArgumentParser(description='Show Yodmon SNMP OID tree') parser.add_argument('--filter', metavar='TEXT', default='', help='Only show players whose name or ID contains TEXT') args = parser.parse_args() players = get_all_players() total, online = get_player_counts() base = ENTERPRISE_OID.lstrip('.') + '.1.1' if args.filter: players = [p for p in players if args.filter.lower() in p['name'].lower() or args.filter in str(p['id'])] print(f"DB : {DB_PATH}") print(f"Enterprise OID : {ENTERPRISE_OID}") print(f"Base OID : .{base}..") print(f"Players : {total} total, {online} online") if args.filter: print(f"Filter : '{args.filter}' -> {len(players)} match(es)") print() col_header = f"{'OID':<52} {'TYPE':<10} {'VALUE'}" print(col_header) print('-' * len(col_header)) for p in players: pid = p['id'] print(f" -- yodeck-{pid} ({p['name']})") for col, typ, label, getter in COLUMNS: oid = f".{base}.{col}.{pid}" val = getter(p) print(f" {oid:<50} {typ:<10} {val}") print() print(f"Total OIDs: {len(players) * len(COLUMNS)}") if __name__ == '__main__': main()