snmp pass_persist ハンドラーとして機能する小さなスクリプトに取り組んでいます。いくつかの整数だけを含むファイル(「numbers」と呼ばれる、今は同じディレクトリにある)を読み取り、これらをoidツリーとして返すようにします。
私はこれに数日間行き詰まっていましたが、snmpd の仕組みに関する根本的な誤解が原因であることに気付きました。私が使用している snmpd.conf の man ページでは、'get' および 'getnext' 要求の処理方法に違いはありませんが、違いがあると思います。私の人生では、snmpwalk をこのスクリプトで動作させることはできません。
snmp についてもう少し知っている人は、このコードを調べてもらえますか? Python のバージョンも含めて、他のバージョンのパス スクリプトをいくつか見たことがありますが、コードを見て、それらが私のコードとは異なる方法でプロトコルを処理する方法を確認できませんでした。空白のコマンド ( '' ) を処理する 1 つの実装を見ましたが、他の実装は明らかにそうではありませんでした。
基本的に、私はこの時点でかなり混乱しています! - snmpd は私ではなく私のスクリプトを呼び出しているため、snmpd をデバッグするのもかなり難しいことがわかりました。できることをログに記録し、フォアグラウンドで snmpd を実行していますが、それ以外はすべて「ブラックボックス」です。
誰でも光を当てることができますか?
例: 数値ファイル:
101 102 103 私は次のように返したい: .1.3.6.1.4.1..[中略]..1 = 101 .1.3.6.1.4.1..[中略]..2 = 102 .1.3.6.1.4.1..[中略]..3 = 103
私のスクリプト(整数以外を返すことについて心配していません。ファイルを閉じることは決してないことはわかっていますが、気分が良くなります):
#!/bin/python -u
import os,sys, syslog
def getLine():
return sys.stdin.readline().strip()
def getFileLine(sub_oid, lines):
sub_oid = int(sub_oid)
if sub_oid >= len(lines):
return 'NONE'
else:
return lines[sub_oid]
def printOutput(oid, var_type, varbind_value):
if varbind_value == 'NONE':
print 'NONE'
else:
print oid
print var_type
print varbind_value
######################################################
sub_oid = 0
FH = open('numbers','r')
lines = FH.readlines()
while True:
command = getLine()
syslog.syslog("command: %s" % command)
if command == 'PING':
syslog.syslog('got a ping')
print 'PONG'
elif command == 'get':
given_oid = getLine()
sub_oid = int(given_oid.split('.')[-1])
varbind_value = getFileLine(sub_oid, lines)
printOutput(given_oid, 'integer', varbind_value.strip())
elif command == 'getnext':
given_oid = getLine()
syslog.syslog("got a requested oid of: %s" % given_oid)
sub_oid = int(given_oid.split('.')[-1])
varbind_value = getFileLine(sub_oid, lines)
printOutput(given_oid, 'integer', varbind_value.strip())
else:
syslog.syslog("Unknown command: %s" % command)
FH.close()