ソースコードの生成
7.5 ソースコードの生成
MIBファイルから拡張MIB対応のソースコードを自動生成します。mib2c
コマンドを利用します。
mib2c
コマンドはソースファイルを自動生成しますが、変数共有型もしくはイベント駆動型、テーブル、Trap送信用それぞれのプログラムをC言語形式で単体で出力します。しかし各関数はsnmpdから単体で呼ばれるため、変数を静的に確保した方が便利です。
% mkdir ~/agent_sample % cd ~/agent_sample % export MIBS=ALL; mib2c matsutest ・・・ You requested mib2c to be run on the following part of the MIB tree: OID: matsutest numeric translation: .1.3.6.1.4.1.12345 number of scalars within: 4 number of tables within: 0 number of notifications within: 2 First, do you want to generate code that is compatible with the ucd-snmp 4.X line of code, or code for the newer Net-SNMP 5.X code base (which provides a much greater choice of APIs to pick from): 1) ucd-snmp style code 2) Net-SNMP style code Select your choice : 2 ← "2"と入力
ucd-snmpスタイルはucd-snmpの時代と互換性のあるコードで、イベント駆動型のコードを出力します。net-snmpスタイルは変数共有型とイベント駆動型のコード出力を選択できます。
今回はnet-snmpスタイルでイベント駆動型を選択します。
************************************************************ GENERATING CODE FOR SCALAR OBJECTS: ************************************************************** It looks like you have some scalars in the mib you requested, so I will now generate code for them if you wish. You have two choices for scalar API styles currently. Pick between them, or choose not to generate any code for the scalars: 1) If you're writing code for some generic scalars (by hand use: "mib2c -c mib2c.scalar.conf matsutest") 2) If you want to magically "tie" integer variables to integer scalars (by hand use: "mib2c -c mib2c.int_watch.conf matsutest") 3) Don't generate any code for the scalars Select your choice:1 ← "1"と入力 using the mib2c.scalar.conf configuration file to generate your code. writing to matsutest.h writing to matsutest.c ************************************************************ GENERATING CODE FOR NOTIFICATIONS: ************************************************************ Would you like to generate code for sending notifications from within the agent? "y" or "n":
拡張MIBにTrap送信用コードを含めるかを聞いています。ここで"y"を押すとTrap送信用コードだけを作ってしまうのでここでは作りません。"n"を押下しますが、後でもう一度mib2c
を実行し、その際にここで"y"を押下します。
"y" or "n": n # GENERATING HEADER FILE DEFINITIONS # # To generate just a header with a define for each column number in # your table: # # mib2c -c mib2c.column_defines.conf matsutest # # To generate just a header with a define for each enum for any # column containing enums: # # mib2c -c mib2c.column_enums.conf matsutest ********************************************************************** * NOTE WELL: The code generated by mib2c is only a template. *YOU* * * must fill in the code before it'll work most of the time. In many * * cases, spots that MUST be edited within the files are marked with * * /* XXX */ or /* TODO */ comments. * ********************************************************************** running indent on matsutest.c running indent on matsutest.h % % rm -fr *~
% mv *.c matsu_object.c
% mv *.h matsu_object.h
%
同様の方法でTrap用のソースコードも作成します。
% export MIBS=ALL; mib2c matsutest
Select your choice : 2
Select your choice: 1
"y" or "n": y <- Trap用のソースファイル作成
%
% rm -fr *~
% mv *.c matsu_trap.c
% mv *.h matsu_trap.h
%
「matsu_object.h」を見ると、初期化関数と4つのOIが呼ばれたときに呼ばれる関数、全部で5つの関数ができています。初期化関数(init_matsutest)はエージェントデーモンが起動する時にだけ、一回しか呼ばれません。
何らかの初期起動ファイルを参照する場合などは初期化関数にコードを記述し静的変数に確保するなどに利用します。それ以外の関数は、呼ばれたときに適切に情報を取得・編集し、応答する値を引数に設定します。
「matsu_trap.h」を見ると、こちらは関数が2つだけ。どちらもTrapを送信する関数です。具体的にどんな値を返すのか編集する必要があります。
mib2c
によって生成されたソースファイルは、それだけでは使用はおろか、Makeも通りません。get-requestに対してどんな情報を出力するか、set-requestに対して、どんなチェックをして、どんな値の時に何をするか、仕様を決めてプログラムに落とし込む必要があります。
次回は今回生成したソースファイルの編集ポイント、そしてソースファイルをsnmpdに組み込み、独自監視項目を操作する方法などについて説明する予定です。