Files
Yodmon/snmp_test.py
Christoph Gasser 9fc3e97546 Initial commit: Yodmon Yodeck→Zabbix bridge
- Yodeck API poller (every 10 min, paginated, 310 players)
- SQLite persistence (players + activity logs)
- SNMP v2c agent via net-snmp pass_persist
- Zabbix API auto host creation/update (6.0+)
- Flask web dashboard with live player status and log
- Docker deployment with persistent volume
- dev_server.py for local testing without Docker

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-17 09:31:00 +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()