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>
76 lines
2.6 KiB
Python
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()
|