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>
This commit is contained in:
75
snmp_test.py
Normal file
75
snmp_test.py
Normal file
@@ -0,0 +1,75 @@
|
||||
#!/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()
|
||||
Reference in New Issue
Block a user