ページのトップに戻る
Systemwalker Centric Manager/Systemwalker Event Agent Q&A集

7.12 Q:MIB拡張操作がコンパイルエラーで失敗する理由

対象バージョンレベル

A

エラーメッセージ1

line nnn: syntax error
last token read was "XXX"
コンパイルに失敗しました

確認ポイント1: 識別子の記述は正しいですか

識別子には、以下の規約があります。

  • 任意の文字、数字、またはハイフン(-)が使用できます。

  • 始まりの文字は小文字です。

  • 最後の文字に、ハイフン(-)は使用できません。

  • ハイフン(-)を続けて使用することはできません。

【例】

《誤》SampleObject OBJECT IDENTIFIER ::= { fujitsu 4 }
《正》sampleObject OBJECT IDENTIFIER ::= { fujitsu 4 }

確認ポイント2: 型の記述は正しいですか

型は、以下の規約があります。

  • 任意(1個以上)の文字、数字、およびハイフン(-)が使用できます。

  • 始まりの文字は大文字です。

  • 最後の文字に、ハイフン(-)は使用できません。

  • ハイフン(-)を続けて使用することはできません。

【例】

《誤》sampleStatsEntry OBJECT-TYPE
        SYNTAX sampleStatsTableEntry
《正》sampleStatsEntry OBJECT-TYPE
        SYNTAX SampleStatsTableEntry

確認ポイント3: 1つのファイルに複数のMIB定義が存在していませんか

[DEFINITIONS ::= BEGIN ・・・ END]で囲まれた構文が、1つのファイル中に複数存在する場合、複数のファイルに分割し、[DEFINITIONS ::= BEGIN]の前に記述された文字列(MIB定義)をファイル名として保存(MIB定義.my)後、拡張する必要があります。

【例】

《修正前》
<sample.txt>
MIB定義1 DEFINITIONS ::= BEGIN
・・・・
END
MIB定義2 DEFINITIONS ::= BEGIN
・・・・
END
《修正後》
<MIB定義1.my>
MIB定義1 DEFINITIONS ::= BEGIN
・・・・
END

<MIB定義2.my>
MIB定義2 DEFINITIONS ::= BEGIN
・・・・
END

確認ポイント4: SNMPv2形式のMIB拡張ファイルが、MIBコンパイラでSNMPv1形式として認識されていませんか

MIBコンパイラでは、コンパイル対象のMIB拡張ファイルが、SNMPv1形式であるかSNMPv2形式であるかを自動で判断し、それぞれの文法に合わせてコンパイルを行います。

そのため、SNMPv2形式のMIB拡張ファイルであるにも関わらず、SNMPv1形式であるとMIBコンパイラによって判断された場合、コンパイルエラーとなってしまいます。

MIBコンパイラでは、MIB拡張ファイル内のIMPORT句でSNMPv2-SMIがインポートされている場合、そのMIB拡張ファイルはSNMPv2形式であると判断し、そうでない場合はSNMPv1形式であると判断します。

コンパイル対象のMIB拡張ファイルがSNMPv2で記述されている場合、IMPORTS句でSNMPv2-SMIが指定されていることを確認し、指定がなければ追加の上、MIB拡張を再度行う必要があります。

エラーメッセージ2

line 999: MODULE-IDENTITY must be invoked at beginning of module
last token read was "END"
コンパイルに失敗しました

確認ポイント: SNMPv2形式のMIB拡張ファイル内の最初のオブジェクト定義は、MODULE-IDENTITY句で行われていますか

SNMPv2形式の拡張MIBファイルの場合、必ず、対象となる拡張MIBファイル内で一番初めに定義されるオブジェクトは、MODULE-IDENTITY句で定義する必要があります。

【例】

<オブジェクト> OBJECT IDENTIFIER ::= { enterprises 10480 }

<オブジェクト> MODULE-IDENTITY
LAST-UPDATED "TEST LAST-UPDATE"
ORGANIZATION "TEST ORGANIZATION"
CONTACT-INFO "TEST CONTACT-INFO"
DESCRIPTION
"TEST DESCRIPTION"
::= { enterprises 10480 }

エラーメッセージ3

line nnn: unknown token: "_"
last token read was "_"
コンパイルに失敗しました

確認ポイント: nnn行目の変数名に'_'が含まれていませんか

変数名に'_'は使用できません。

変数名から'_'を取り除いてください。

エラーメッセージ4

拡張MIBをコンパイルしています。
Fail to make the MIB file. code = -4 detail = 2 line = 134
コンパイルに失敗しました。

拡張MIBをコンパイルしています。
Fail to make the MIB file. code = -4 detail = 0 line = 613
コンパイルに失敗しました。

拡張MIBをコンパイルしています。
Fail to make the MIB file. code = -4 detail = 0 line = 613Fail to make the MIB file. code = -4 detail = 0 line = 613
コンパイルに失敗しました。

拡張MIBをコンパイルしています。
Fail to make the MIB file. code = -4 detail = 0 line = 613Fail to make the MIB file. code = -4 detail = 2 line = 134
コンパイルに失敗しました。

確認ポイント1: コンパイル対象の拡張MIBファイルで、オブジェクトの型定義で「Counter64」および「BITS」を使用していませんか

MIBコンパイラは、V13.0.0以前では、Counter64型およびBITS型を正しく認識することができません。

SNMPv2形式の場合は、バージョンにかかわらずBITSをサポートしていません。

あらかじめ、コンパイル対象となるMIB拡張ファイル内で、「Counter64」を「Counter32」に、「BITS」を「INTEGER」に、それぞれ置換えを行った後でコンパイルを行ってください。

確認ポイント2: コンパイル対象の拡張MIBファイルで使用しているオブジェクトは正しく定義されていますか

コンパイル対象の拡張MIBファイルで使用しているオブジェクトの参照に失敗した場合、これらのメッセージが出力されます。

エラーメッセージに、"code = -4 detail = 2 line = 134"が含まれている場合は、IMPORTS文で参照先としている拡張MIBファイルが見つからないケースが考えられます。

このときの確認事項は、

  • IMPORTS文で指定されている拡張MIBファイルがコンパイル済みで、かつ、Systemwalkerインストールディレクトリ¥mpwalker.dm¥mib配下に"拡張MIBファイル名.DEF"というファイルが存在するか

  • IMPORTS文で指定されている拡張MIBファイルの名前が拡張MIB名と一致しているか(コンパイルするときに、ファイル名を"拡張MIB名.my"にしたか)

エラーメッセージに、"code = -4 detail = 0 line = 613"が含まれている場合は、参照先が明示されていないオブジェクトが参照されているケースが考えられます。

【例】

testB.myの中にtestB OBJECT IDENTIFIER ::= { enterprises testA }というtestBの定義がある場合、事前にtestAが定義されていない場合、"code = -4 detail = 0 line = 613"となります。

なお、"Fail to make the MIB file. code = -4 ・・・"のときの、lineの値は、実際のエラー発生行と異なりますので、注意してください。

エラーメッセージ5

object <オブジェクト名>:
value of ACCESS clause isn't a valid keyword
コンパイルに失敗しました。

確認ポイント: ACCESS句の属性として、無効なキーワードが指定されていませんか

ACCESS句の属性には、次のどれかを指定してください。

"read-only" "read-write" "write-only" "not-accessible"

上記の説明はSMI-v1形式のときのみの対応です。

SMI-v2形式では、ACCESSというキーワードが使われず、代わりにMAX-ACCESSキーワードが使用されます。

MAX-ACCESS句の属性を設定する場合は、次のどれかを使用してください。

"not-accessible" "accessible-for-notify" "read-only" "read-write" "read-create"

エラーメッセージ6

object <オブジェクト名>:
value of STATUS clause isn't a valid keyword
コンパイルに失敗しました。

確認ポイント: STATUS句の属性として、無効なキーワードが指定されていませんか

STATUS句の属性には、次のどれかを指定してください。

"mandatory" "optinal" "obsolete"

上記の説明はSMI-v1形式のときのみの対応です。

SMI-v2形式では、次のどれかを指定してください。

"current" "deprecated" "obsolete"

エラーメッセージ7

line nnn: use MAX-ACCESS not ACCESS
コンパイルに失敗しました。

確認ポイント: SNMPv2形式でオブジェクト定義をする場合にACCESSが使用されていませんか

SNMPv2形式でオブジェクトを定義する場合のアクセス権限の指定は、ACCESS句の代わりにMAX-ACCESS句を使用してください。

エラーメッセージ8

object <オブジェクト名>:
INTEGER requires either upper-lower bounds or named-number enumerations
コンパイルに失敗しました。

確認ポイント: OBJECT-TYPEのSYNTAX句でINTEGER型を指定している場合に、そのオブジェクトがとり得る値の範囲を指定していますか

SYNTAX句に"INTEGER"を指定する際はとり得るサイズを明示的に指定する必要があります。

【例】

≪誤≫ SYNTAX INTEGER
-> とり得る値の範囲を指定する必要があります ->
≪正≫ SYNTAX INTEGER(0..65535)

エラーメッセージ9

エラーメッセージ1.
object XXXTable:
INDEX clause should not be present
エラーメッセージ2.
object XXXEntry:
missing INDEX clause
コンパイルに失敗しました。

確認ポイント: 列要素オブジェクトの定義以外でINDEX句が指定されていませんか

INDEX句は列要素オブジェクトの定義のみで使用されることが許されます。

【例】

XXXXTable OBJECT-TYPE
  SYNTAX  SEQUENCE OF XXXEntry
  MAX-ACCESS    not-accessible
  STATUS        current
  DESCRIPTION    ""
  INDEX { Index }
::= { XXXInfo 0 }

XXXEntry  OBJECT-TYPE
  SYNTAX XXXEntry
  MAX-ACCESS    not-accessible
  STATUS        current
  DESCRIPTION    ""
::= {XXXTable 1}

この場合、XXXTableはテーブルオブジェクトとなり、XXXEntryが列要素オブジェクトとなります。

上記例ではテーブルオブジェクトXXXTableにINDEX句がありますので、次のコンパイルエラーが発生します。

object XXXTable:
INDEX clause should not be present

また、列要素オブジェクトであるXXXEntryオブジェクトにはINDEX句か、もしくは、AUGMENTS句が必ず指定されなければなりません。

そのため、次のコンパイルエラーが発生します。

object XXXEntry:
missing INDEX clause

対処方法としては、INDEX句は列要素オブジェクトでのみ定義するようにし、それ以外のオブジェクトではINDEX句を指定しないようにします。

また、列要素オブジェクトには必ずINDEX句か、もしくは、AUGMENTS句を指定します。

修正例は以下のようになります。

  XXXXTable OBJECT-TYPE
    SYNTAX  SEQUENCE OF XXXEntry
    MAX-ACCESS  not-accessible
    STATUS      current
    DESCRIPTION    ""
    ::= { XXXInfo 0 }

  XXXEntry  OBJECT-TYPE
  SYNTAX XXXEntry
    MAX-ACCESS  not-accessible
    STATUS      current
    DESCRIPTION    ""
    INDEX { Index }
    ::= {XXXTable 1

コメントを追加した行でコンパイルエラーが発生する場合は、以下のポイントを確認してください。

  • 確認ポイント: コメントを追加した行に、すでにコメントがありませんか

    すでにコメントのある行にコメントを追加するとコンパイルエラーが発生する場合があります。

    次の場合にコメントをつけると、コメント追加後でコンパイルエラーが発生します。

    コメント追加前: MAX-ACCESS    not-accessible  -- Comment1
    コメント追加後: -- MAX-ACCESS not-accessible  -- Comment1

    これは、コメントの文法が

    • --と--で囲まれた範囲をコメントとする

    • --から行末までをコメントとする

    という仕様であるためです。

    上記例ですと、行末に"-- Comment1"とすでにコメントがあるため、コメントアウトを行いますと-- MAX-ACCESS not-accessible -- をコメントとみなしComment1 が本文となってしまいますので、"Commnent1"というオブジェクトがないと判断され、コンパイルエラーが発生します。

    コメントアウトを行いたい行にすでにコメントがある場合は、以下のようにコメントを付加してください。

    修正例1:  -- MAX-ACCESS    not-accessible  -- -- Comment1
    修正例2:  -- MAX-ACCESS    not-accessible  Comment1

エラーメッセージ10

定義されたタイプが解決できません

確認ポイント: 以下の問題が発生している可能性があります。

問題が発生していることが確認された場合は、対処方法に従って対処を行ってください。

  • [問題]

    MIBコンパイラとして、SNMPv1、SNMPv2の2種類のコンパイラを使用しています。

    MIB拡張時には、まず、SNMPv2でコンパイルを行い、コンパイルに失敗した場合、SNMP-V1でのコンパイルを行います。

    本現象は、SNMPv2 コンパイラでのコンパイルが正常に終了するにも関わらず、正しくコンパイルされていないために発生しています。なお、SNMPv1 コンパイラでのコンパイルは正しくコンパイルされます。

    *:ASN.1とは、通信プロトコルなどのデータ構造を抽象的にするための規格です。CCITT(ITU-T) 勧告のX.208で定義されています。

  • [対処方法]

    以下の手順を実施して対処してください。

    Systemwalkerインストールディレクトリ¥mpwalker.dm¥mpnetmgr¥bin配下のmosy_v1.exeとmosy.exeのファイルに対して以下の操作をします。

    1. mosy_v1 .exeを任意の名前に変更します。

      例:mv mosy_v1.exe → mosy_v1_bak.exe

    2. mosy.ex eをmosy_v1.exeに変更します。

      例:mv mosy.exe → mosy_v1.exe

    3. 1.で変名した任意の名前をmosy.exeに変更します。

      例:mv mosy_v1_bak.exe → mosy.exe

    4. MIB拡張画面よりMIB拡張を実行します。

    5. MIB拡張後は、ファイル名を元に戻してください。