2015-06-05 20 views
1

我想開發一個SNMP代理以獲取/設置請求,這個請求可以與使用協議的複雜python程序「交談」。pysnmp命令responder - 使用外部數據處理get/set請求(不是mib)

這是相當難以解釋,所以我儘量做出了榜樣:

SNMP接收PARAM X 它要求我的節目x 的當前值的GET請求它發送的答案,客戶

我想提示一下,如何在一個可以製作decodeMsg-sendToPython-receiveFromPython-encodeMsg-sendToClient進程的單一方法中「攔截」get/set請求。

+0

還有......是什麼問題?見http://stackoverflow.com/help/how-to-ask – kebs

+0

對不起,我忘了最重要的部分 –

回答

1

這樣的應用程序的各種設計可能與pysnmp,都是基於CommandResponder類。也許最簡單的方法是create your own MibInstrumentationController class將接收同步GET/SET/GETNEXT查詢,並有望恢復響應​​變量綁定:

class EchoMibInstrumController(instrum.AbstractMibInstrumController): 
    def readVars(self, vars, acInfo=(None, None)): 
     return vars 
    def readNextVars(self, vars, acInfo=(None, None)): 
     return vars 
    def writeVars(self, vars, acInfo=(None, None)): 
     return vars 

另一種解決辦法是編譯MIB到pysnmp格式(與PySMI編譯器)和specialize MIB variables(AKA管理對象實例),這樣他們會通過某種協議,談談你的後端數據存儲(程序)。

但是,兩種方法都是同步工作的,這意味着您將阻止SNMP引擎,直到您從後端檢索數據並從請求處理函數返回。如果您希望在高的併發負載和/或慢數據存儲,您可能需要使用的異步運行CommandResponder類的低級別API。

也可以通過在SNMP消息處理代碼的重要位置放置鉤子集合tap on SNMP engine workflow。但該功能主要是爲了從SNMP引擎內部獲取非常具體的數據,而不是指導其操作。

+0

謝謝你,伊利亞,我想發展自己的定製MibInstrumentationController。這似乎是最簡單的方式:) –