Files
Yodmon/snmp_test.py
Christoph Gasser 5db8beb847 Replace # with - in Zabbix host names (Zabbix 7.x compatibility)
Zabbix 7.x rejects '#' in host names. Changed hostname format from
'yodeck#<id>' to 'yodeck-<id>' (e.g. yodeck-54239).
Updated SNMP col 1 value and docs for consistency.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-17 10:21:05 +02:00

76 lines
2.6 KiB
Python

#!/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 <name_substring>]
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}.<column>.<yodeck_id>")
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()