2013-08-08 11 views
8

私はカスタムSNMP Mibで作業していましたが、適切なデータを返すようにエージェントを取得しようとしている間に壁に立ちました。net-snmp perlサブエージェントがsnmpgetによってトリガーされていない

MIB(smilint -l 6を実行することによって検証):

IDB-MIB DEFINITIONS ::= BEGIN 

IMPORTS 
     MODULE-IDENTITY, OBJECT-TYPE, Integer32, enterprises 
      FROM SNMPv2-SMI 
     MODULE-COMPLIANCE, OBJECT-GROUP FROM SNMPv2-CONF; 

idb MODULE-IDENTITY 
    LAST-UPDATED "201307300000Z" -- Midnight 30 July 2013 
    ORGANIZATION "*********" 
    CONTACT-INFO "email: *******" 
    DESCRIPTION "description" 
    REVISION "201307300000Z" -- Midnight 29 July 2013 
    DESCRIPTION "First Draft" 
::= { enterprises 42134 } 

iDBCompliance MODULE-COMPLIANCE 
    STATUS current 
    DESCRIPTION 
     "Compliance statement for iDB" 
    MODULE 
     GROUP testGroup 
     DESCRIPTION 
      "This group is a test group" 
::= {idb 1} 

test2 OBJECT-TYPE 
SYNTAX   Integer32 
UNITS   "tests" 
MAX-ACCESS  read-write 
STATUS   current 
DESCRIPTION 
     "A test object" 
DEFVAL { 5 } 
::= { idb 3 } 

testGroup OBJECT-GROUP 
     OBJECTS { 
      test2 
     } 
     STATUS current 
     DESCRIPTION "all test objects" 
::= { idb 2 } 

END 

エージェントファイル:私はエージェントを実行すると

#!/usr/bin/perl 

use NetSNMP::OID(':all'); 
use NetSNMP::agent(':all'); 
use NetSNMP::ASN(':all'); 

sub myhandler { 
    my ($handler, $registration_info, $request_info, $requests) = @_; 
    print "Handling request\n"; 
    for ($request = $requests; $request; $request = $request->next()) { 
     # 
     # Work through the list of varbinds 
     # 
     my $oid = $request->getOID(); 
     print "Got request for oid $oi\n"; 
     if ($request_info->getMode() == MODE_GET) { 
      if ($oid == new NetSNMP::OID($rootOID . ".3")) { 
       $request->setValue(ASN_INTEGER, 2); 
      } 
     } 
    } 
} 

{ 
    $subagent = 0; 

    print "Running new agent\n"; 
    my $rootOID = ".1.3.6.1.4.1.42134"; 
    my $regoid = new NetSNMP::OID($rootOID); 
    if (!$agent) { 
     $agent = new NetSNMP::agent('Name'=>'my_agent_name','AgentX' => 1); 
     $subagent = 1; 
     print "Starting subagent\n"; 
    } 
    print "Registering agent\n"; 
    $agent->register("my_agent_name", $regoid, \&myhandler); 
    print "Agent registered\n"; 

    if ($subagent) { 
     $SIG{'INT'} = \&shut_it_down; 
     $SIG{'QUIT'} = \&shut_it_down; 
     $running = 1; 

     while ($running) { 
      $agent->agent_check_and_process(1); 
     } 

     $agent->shutdown(); 
    } 
} 

sub shut_it_down() { 
    $running = 0; 
    print "Shutting down agent\n"; 
} 

私は、次を得る:

Running new agent 
Starting subagent! 
Registering agent with oid idb 
Agent registered 

だから私はことを知っています多くは働いている。私は、次のコマンドを実行したときしかし:

snmpget -v 1 -c mycommunity localhost:161 test2.0 

を私は、このエラーメッセージが表示されます:

Error in packet 
Reason: (noSuchName) There is no such variable name in this MIB. 
Failed object: IDB-MIB::test2.0 

私はMIBファイルが正しく設定されていることsnmptranslateから知っています。私はsnmpget(-DALLを使って)のデバッグを見て、MIBがロードされ、正しく解析されていることを確認しました。

私の質問は次のとおりです。なぜ、私のサブエージェントはリクエストを受け付けないのですか?

更新:

私は、しかしsmilintはすべての問題を報告し、snmpget -v 2c -c mycommunity localhost:161 .1.3.6.1.4.1.42134.3.0を実行すると、オブジェクト(IDB-MIBの名前を報告していない私のMIBファイルが有効でないことを@EhevuTovで言われてきました。 :test2.0)は正しく検索されますが、データは見つかりません。

私はIDB-MIB::test2 = No Such Object available on this agent at this OIDを取得しています。私のエージェントは正しく登録されていないと思われますが、エラーは発生しません。

アップデート2:

私は、エージェントコードで周りのビットをいじってきました。 CPANのドキュメント(http://metacpan.org/pod/NetSNMP::agent)に基づいて、$agent->registerファンクションコールは、成功した場合は0を返すように見えます。だから私は、リターンコードをチェックして、この得た:

Agent registered. Result: NetSNMP::agent::netsnmp_handler_registration=SCALAR(0x201e688) 

Data::Dumper結果を使用して、それをプリントアウト:私は漠然とし祝福を理解、しかし、そうであっても、私は全く分からないものを、この結果を持って

$VAR1 = bless(do{\(my $o = 34434624)}, 'NetSNMP::agent::netsnmp_handler_registration'); 

を意味するはずです。だから私はエージェントが何とか間違っていると思っています。誰もがこれらのエージェントをデバッグする方法を知っていますか?マスターのsnmpdに正しくロードされているかどうかを調べることができますか?

+0

適切なMIBがないようです。 – EhevuTov

+0

ああ、タイプミス。それを修正してもまだ動作していないようです(他の問題がないことを確認するには、mib checkerを使って実行しました。http://www.simpleweb.org/ietf/mibs/validate/) –

+2

* nix OSを使っているなら、ライブラリとソフトウェアスイートである 'libsmi'をインストールし、' smilint' MIBチェッカーを使うことをお勧めします。私は新しいMIBに変更したり書き込んだりするたびに私のためにチェックする.shスクリプトを書いています。 – EhevuTov

答えて

2

そして、私はこの問題を解決しました。それはMIBではなく、エージェントと一緒でした(私が思っていたのは、いつもうまく働いていたので、私はそれをチェックすることに悩まされませんでした)。

エージェントがスタンドアロンで実行されていたのは、正常に動作していたように見えました(ハンドラの登録時にエラーが発生したことはありません)。明らかに、snmpdによって直接実行される必要があります。

私は(それがルートとして実行しているにもかかわらず、/ルートからスクリプトを実行することはできませんも明らかにsnmpdのため)缶のアクセスをsnmpdのディレクトリに移動し、snmpd.confファイルに次の行を追加:

perl print "\nRunning agents now\n"; 
perl do "/usr/share/snmp/agent.pl" || print "Problem running agent script: $!\n"; 
perl print "Agents run\n"; 
この2行がすでに存在していることが

注:

disablePerl false 
perlInitFile /usr/share/snmp/snmp_perl.pl 

私は今、snmpgetコマンドを実行すると予想される応答を得ることができます。

> snmpget -v 2c -c mycommunity localhost:161 .1.3.6.1.4.1.42134.3 
IDB-MIB::test2 = INTEGER: 2 tests 
関連する問題