Hexaの日記 このページをアンテナに追加 RSSフィード

2011-10-27

Bootstrap

Bootstrap を使ってみました. Bootstrap

こんな感じになりました.

f:id:Hexa:20111027225111p:image

レイアウトを考えるときはいつも class 名や id 名で悩むので, (container や span4 等々で)固定される点は楽できてありがたいですね.

あと,jQuery で modal や Tooltips も簡単に組み込めるし,Example もあるので,視覚的に全体の構成を考えやすいです.


%div{ :class => "container" }
  %div{ :class => "hero-unit "}
    %h1= "PEM to Text"
  %div{ :class => "row" }
    %div{ :class => "span4" }  
    %div{ :class => "span4" }
      %textarea{ :class => "xxlarge", :id => "pem", :name => "pem", :rows => "25" }
      %div{ :id => "modal-from-dom", :class => "modal hide fade", :style => "display: none;" }
        %div{ :class => "modal-header" }
          %a{ :href => "#", :class => "close" } ×
          %h3 Text format
        %div{ :class => "modal-body" }
          %div{ :id => "view" }
      %p{ :class => "xxlarge" }
        %button{ :class => "btn primary", :id => "submit", :'data-controls-modal' => "modal-from-dom", :'data-backdrop' => "static" } text
  %div{ :class => "footer" }
    #version{ :align => "right" }
      %p= h @version

:javascript

  $('#submit').click(function() {
    $.ajax({
      type: 'POST',
      url: '/to_text',
      data: {'pem': $('#pem').attr('value')},
      success: function(data) {
        $("#view > ul").remove();
        var elements = [
          "version",
          "serial",
          "not_before",
          "not_after",
          "issuer",
          "subject",
          "signature_algorithm",
          "extensions",
          "public_key"
        ]
        var ul = $("<ul>");
        ul.attr("style", "list-style:none");
        $.each(elements, function(i, value) {
          var li = $("<li>");
          switch(value) {
          case "not_before":
            li.text(value + ": " + data["validity"][value]);
            ul.append(li);
            break;
          case "not_after":
            li.text(value + ": " + data["validity"][value]);
            ul.append(li);
            break;
          case "extensions":
            li.text(value + ": ");
            var extension = $("<ul>");
            extension.attr("style", "list-style:none");
            $.each(data[value], function(i, v) {
              extension.append($("<li>").text(v));});
            li.append(extension);
            ul.append(li);
            break;
          case "public_key":
            var pre = $("<pre>");
            pre.text(data["public_key"]);
            li.append(pre);
            ul.append(li);
            break;
          default:
            li.text(value + ": " + data[value]);
            ul.append(li);
            break;
          }
        });
        $("#view").append(ul);
      },
      error: function(data, text_status) {
        alert(text_status);
      },
      dataType: 'json'
    })
   });

2011-07-30

2011-07-21

github のリポジトリのミラー

下記の条件に合う運用環境を検討していたので,そのメモです.

  • github 上の private/public のリポジトリを扱う
  • git は常に異なる環境(端末)で使用する
    • git clone, git pull 等をおこなう
    • git push はおこなわない
  • 鍵の管理は最小限にする
    • 作業環境を変えるたびに公開鍵の登録/削除はしたくない

検討した結果(もっといい方法があると思う …)

対象となるリポジトリを適当なサーバでミラーします.

1. ssh-keygen で鍵を作成し,github に追加します. *1

2. Web サーバを立ち上げます.

3. サーバ上で対象となるリポジトリを clone してきます.

  $ git --mirror clone ...

4. git update-server-info を実行させるための post-update の準備*2

$ cp post-update.sample post-update

5. github 上のリポジトリの更新情報の取得

3 で clone してきたリポジトリで git fetch を実行して,github に push された更新情報を取得します.

手動で実行するのは面倒なので,cron で定期的に更新情報を取得します.

6. 作業端末で git clone を実行してサーバからリポジトリの複製を取得します.

  $ git clone http://example.com/...

f:id:Hexa:20110721221356j:image


これで,リポジトリをミラーしているサーバの鍵を管理するだけで,実際に作業する端末の鍵は不要になります.*3 *4

*1: パスフレーズは keychain で回避します

*2: fetch なので git update-server-info を cron に仕込まないとダメでした

*3: 更新を push したい場合は,作業端末の鍵を github に登録して,github 上のリポジトリへ push します

*4: git remote add ...

2011-06-19

Chef のメモ

  • Chef Server: Ubuntu 11.04 sever 64-bit
  • Chef Client: Ubuntu 11.04 server 64-bit, CentOS 5.6

理解力が足りないため,一旦書き出して整理します.

Chef Server

no title

基本的に上記のページに書いてあるとおりにインストールします.

1. Opscode APT Repository の追加

2. GPG Key の追加とインデックスのアップデート

3. サーバのインストール

  $ sudo apt-get install chef chef-server

4. 証明書のコピーと設定

  $ knife configure -i

Chef Client

Ubuntu

no title

Chef Client も Chef Server と同様に、基本的に上記のページに書いてある手順でインストール/設定します.

1. Opscode APT Repository の追加

2. GPG Key の追加とインデックスのアップデート

3. Chef Client のインストール

4. Chef Clientの作成: Chef Serverにログインして作成します.

5. 4 で作成したクライアントの秘密鍵を ~/.chef 以下にコピー

6. Knife の設定

*1

7. Cookbook のアップロード

  • 今回は,GitHub で公開されている cookbooks を使用します.
  • GitHub から cookbooks を clone して,chef-server へアップロードします.
  $ git clone git://github.com/opscode/cookbooks
  $ knife cookbook upload -c ~/.chef/knife.rb -a -o cookbooks/

*2


8. cookbook を作成する場合

  • knife cookbook create を実行すると cookbook のひな形が作成されますので,ここに必要な設定を書いていきます.
  $ knife cookbook create ruby -o .
  $ cd ruby/
  $ ls
  attributes   files      metadata.rb  README.rdoc  resources
  definitions  libraries  providers    recipes      templates

*3

*4

9. Role の作成

  • Role はブラウザから http://example.com:4000 にアクセスすることで設定することが可能です.
  • Role にはあらかじめ,Recipe を指定しておきます.

10. chef-client の実行

  • chef-client を実行すると,Recipe の内容でインストール/設定がおこなわれます.
  • 何も考えずに chef-client を実行してみます.
  $ sudo chef-client -c ~/.chef/knife.rb
  [Sun, 12 Jun 2011 11:19:05 +0900] INFO: *** Chef 0.10.0 ***
  [Sun, 12 Jun 2011 11:19:06 +0900] INFO: HTTP Request Returned 404 Not Found: Cannot load node chef-client1
  [Sun, 12 Jun 2011 11:19:06 +0900] INFO: Run List is []
  [Sun, 12 Jun 2011 11:19:06 +0900] INFO: Run List expands to []
  [Sun, 12 Jun 2011 11:19:06 +0900] INFO: Starting Chef Run for chef-client101
  [Sun, 12 Jun 2011 11:19:06 +0900] INFO: Loading cookbooks []
  [Sun, 12 Jun 2011 11:19:06 +0900] WARN: Node chef-client1 has an empty run list.
  [Sun, 12 Jun 2011 11:19:07 +0900] INFO: Chef Run complete in 0.303051 seconds
  [Sun, 12 Jun 2011 11:19:07 +0900] INFO: Running report handlers
  [Sun, 12 Jun 2011 11:19:07 +0900] INFO: Report handlers complete

11. Node を作成して Run List へ登録

実行結果を見ると,リクエストで指定された Node を読み込めないことが原因であるようなので,Node (Client) を作成して,Node に割り当てる Role と Recipe を実行させるかを指定します (Run List).

12. Cookbook の Run List への登録

WebUI を使用して Cookbook を RunList へ登録します.


13. 再度,chef-client を実行

    $ sudo chef-client -c ~/.chef/knife.rb
    [Sun, 12 Jun 2011 11:22:28 +0900] INFO: *** Chef 0.10.0 ***
    [Sun, 12 Jun 2011 11:22:29 +0900] INFO: Run List is [role[example01]]
    [Sun, 12 Jun 2011 11:22:29 +0900] INFO: Run List expands to [sqlite, zsh]
    [Sun, 12 Jun 2011 11:22:29 +0900] INFO: Starting Chef Run for chef-client1
    [Sun, 12 Jun 2011 11:22:29 +0900] INFO: Loading cookbooks [sqlite, zsh]
    [Sun, 12 Jun 2011 11:22:29 +0900] INFO: Storing updated cookbooks/zsh/recipes/default.rb in the cache.
    [Sun, 12 Jun 2011 11:22:29 +0900] INFO: Storing updated cookbooks/zsh/metadata.rb in the cache.
    [Sun, 12 Jun 2011 11:22:29 +0900] INFO: Storing updated cookbooks/sqlite/recipes/default.rb in the cache.
    [Sun, 12 Jun 2011 11:22:29 +0900] INFO: Storing updated cookbooks/sqlite/metadata.rb in the cache.
    [Sun, 12 Jun 2011 11:22:29 +0900] INFO: Processing package[sqlite3] action upgrade (sqlite::default line 20)
    [Sun, 12 Jun 2011 11:22:38 +0900] INFO: package[sqlite3] upgraded from uninstalled to 3.7.4-2ubuntu5
    [Sun, 12 Jun 2011 11:22:38 +0900] INFO: Processing package[sqlite3-doc] action upgrade (sqlite::default line 24)
    [Sun, 12 Jun 2011 11:22:47 +0900] INFO: package[sqlite3-doc] upgraded from uninstalled to 3.7.4-2ubuntu5
    [Sun, 12 Jun 2011 11:22:47 +0900] INFO: Processing package[zsh] action install (zsh::default line 20)
    [Sun, 12 Jun 2011 11:22:54 +0900] INFO: package[zsh] installed version 4.3.11-4ubuntu2.is.3ubuntu1
    [Sun, 12 Jun 2011 11:22:54 +0900] INFO: Processing package[zsh-doc] action install (zsh::default line 26)
    [Sun, 12 Jun 2011 11:22:59 +0900] INFO: package[zsh-doc] installed version 4.3.11-4ubuntu2.is.3ubuntu1
    [Sun, 12 Jun 2011 11:22:59 +0900] INFO: Chef Run complete in 30.122576 seconds
    [Sun, 12 Jun 2011 11:22:59 +0900] INFO: Running report handlers
    [Sun, 12 Jun 2011 11:22:59 +0900] INFO: Report handlers complete

14. 確認

  $ zsh --version
  zsh 4.3.11 (x86_64-unknown-linux-gnu)
  $ sqlite3 --version
  3.7.4
  • インストールされているようです.

CentOS 5.6

yum の Ruby は古いため,Ruby はソースからインストールします.

Chef Client のインストール以外は Ubuntu の場合と手順は同じです.

1. Ruby のインストール

  • Ruby をソースからインストールします
  $ cd /tmp
  $ wget ftp://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.7-p334.tar.gz
  $ tar zxvf ruby-1.8.7-p334.tar.gz
  $ cd ruby-1.8.7-p334
  $ ./configure
  $ make && make install

2. Rubygems のインストール

  • Chef Client をインストールするために Rubygems をインストールします.
  $ cd /tmp
  $ wget http://production.cf.rubygems.org/rubygems/rubygems-1.8.5.tgz
  $ tar zxvf rubygems-1.8.5.tgz
  $ cd rubygems-1.8.5
  $ ruby setup.rb install

4. chef のインストール

  $ gem install chef

5. knife の設定

Ubuntu の場合と同様に,knife configure で設定

  $ knife configure
  • 設定ファイル knife.rb を置く場所を指定する
  • chef server の URL を指定する
  • ユーザ名を指定する

6. Chef Server に Client と Node を作成し,Node に Role を追加します.

  • Client 作成時の Private Key を knife.rb で指定してあるファイルにコピーします

7. chef-client を実行します.

*1:サーバとクライアントの時間がずれていると認証に失敗します

*2:knife cookbook upload -c PATH(knife.rb の PATH) -a(全ての cookbook をアップロード) -o PATH(cookbook の PATH)

*3: knife cookbook create cookbook_name -o PATH (cookbook の PATH)

*4: recipe 等を設定した後は knife cookbook upload でアップロードします.

2011-05-21

SNMP のメモ 3

セキュリティについてはまだ書いてない..

Page not found · GitHub

2011-05-08

2011-05-03

気仙沼に行ってきた

一応,宮城県気仙沼市出身なので,気仙沼に戻って,学生の頃によく遊んでいた場所を歩いてみました.

気仙沼市

  • ぱっと見た感じでは,高台の方の被害はほぼ無いです
  • 津波と火災のため鹿折地区の被害が大きい

IMG_1276

  • かもめ通りの辺りはまだ危険そうなので行くのを断念しました

IMG_1373

  • リアスシャークミュージアムの方から、宮脇書店の方へ歩いて行くと,景色が一変します

IMG_1417

  • 宮脇書店,ブックハウス大信等の書店は全て被害にあっているため,気仙沼の書店はほぼ全滅です・・・

IMG_1414


すれ違った人

ニュースを見た限りでは,自衛隊やボランティアの人が多いような印象がありましたが,実際に 2, 3 時間歩いてみて,すれ違った自衛隊員は 4 名,ボランティアの方は 4 名でした.

観光客

陸に乗り上げている船を見学するために来ている人たちが多かったです.

田舎なうえに道が無くなっているので,道を知らないと危ない場所が多いのに・・・.


唐桑 大沢地区

祖母の家があったため,様子を見てきました.

この辺りの家はほとんど倒壊していました.

IMG_1243

気仙沼市民会館付近

避難所付近です.

IMG_1423

気がついたこと等

  • 被害が大きい所は車が通れるようにしてあるけど,片付けは進んでいないようなだった
  • 被害の小さい所では,水や電気,ガスは使えるようになっている所が多いが,まだ,完全ではない(水道水が止まるときがある等)
  • 借家を探している人をよく見かけた

現地で聞いた話

  • 被害が小さい所では,震災直後から普段と同じような生活ができたようですが,ガソリンと食料が手に入らなくなったため,被害が大きい場所を通って,食料がある場所に移動しなければいけなくなったらしい
  • 結局,不足していても物資が届かなかった場所もある

2011-04-18

SNMP のメモ 2

Page not found · GitHub と同じメモです.


=============
SNMP のメモ 2
=============

:Date:  2011/04/15
:Author:  Hexa


SNMPv2
======

SNMPv2 には,SNMPv2 や SNMPv2u 等がありますが,SNMPv2c がデファクトスタンダードになりました.

追加機能
--------

- GetBulkRequest-PDU

  - SNMP エージェントへ送ったインスタンスの次のインスタンスに対応する値を問い合わせます.
  - GetNextRequest とは異なり,複数の値の問い合わせが可能です.
- InformRequest-PDU

  - 状態の変化やトラブルが起きたことを送信します.
  - Trap とは異なり,受信者は応答を帰します.
- Response-PDU
  
  - SNMPv1 の GetResponse です.
- VarBind に下記の 3 つの **例外** を指定できるようになりました.

  - noSuchObject
  - noSuchInstance
  - endOfMibView


シーケンス
----------

情報の取得の場合
^^^^^^^^^^^^^^^^

GetBulkRequest の例::

    -----------   GerBulkRequest  -----------
    |         | ----------------> |         |
    | Manager |                   |  Agent  |
    |         | <---------------- |         |
    -----------     Response      -----------


情報の通知の場合
^^^^^^^^^^^^^^^^

InformRequest の例::


    -----------   InformRequest   -----------
    |         | <---------------- |         |
    | Manager |                   |  Agent  |
    |         | ----------------> |         |
    -----------     Response      -----------


パケットフォーマット
--------------------

SNMPv1 と同様で, パケットは下記で構成されてます.

- version (INTEGER): SNMP のバージョン番号
- community (OCTET STRING): コミュニティ名
- data (ANY):

フォーマット::

  | version | community | data (PDU) |


data
----

GetBulkRequest-PDU
^^^^^^^^^^^^^^^^^^

フォーマット::

  | GetBulkRequest-PDU | RequestID | NonRepeaters | MaxRepetitions |         VarBindList               |
                                                                   |    VarBind   |    VarBind   |...  |
                                                                   | name | value | name | value |...  |


NonRepeaters は,VarBindList の先頭から指定したインスタンス数分の問い合わせは単一であることを表しています.

MaxRepetitions は,NonRepeaters で指定されているインスタンス以降のインスタンスの問い合わせ数を指定します.

例えば,VarBind が 4 つ指定されてあり,NonRepeaters が 1,MaxRepetitions が 2 の場合は,先頭の VarBind のインスタンスの次のインスタンスの値を返し,それ以降の VarBind のインスタンスは,次のインスタンスの値と,さらに次のインスタンスの値の 2 つを返します.


実際のパケットをみてみます.AirMac Express へ GetBulkRequest (NonRepeaters: 0, MaxRepetitions: 2, VarBind1:  1.3.6.1.2.1.1.1.0, VarBind2: 1.3.6.1.2.1.1.5.0) を 送りました.

GetBulkRequest::

  303a0201010409636f6d6d756e697479a52a020424fac762020100020102301c300c06082b060102010101000500300c06082b060102010105000500

- message

  - SEQUENCE: 30
  - Length: 3a
  - version

    - INTEGER: 02
    - Length: 01
    - Value: 01 (version: 2)
  - community

    - OCTET STRING: 04
    - Length: 09
    - Value: 636f6d6d756e697479 (community: community)
  - getbulkrequest

    - GetBulkRequest: a5
    - Length: 2a
    - request-id

      - INTEGER: 02
      - Length: 04
      - Value: 24fac762 (620414818)
    - non-repeaters

      - INTEGER: 02
      - Length: 01
      - Value: 00
    - max-repetitions

      - INTEGER: 02
      - Length: 01
      - Value: 02
    - variable-bindings

      - SEQUENCE: 30
      - Length: 1c
      - varbind

        - SEQUENCE: 30
        - Length: 0c
        - oid

          - OBJECT IDENTIFIER: 06
          - Length: 08
          - Value: 2b06010201010100 (OID: 1.3.6.1.2.1.1.1.0")
        - value

          - NULL: 05
          - Length: 00

        - SEQUENCE: 30
        - Length: 0c
        - oid

          - OBJECT IDENTIFIER: 06
          - Length: 08
          - Value: 2b06010201010500 (OID: 1.3.6.1.2.1.1.5.0)
        - value

          - NULL: 05
          - Value: 00


上記に対する応答の Response-PDU
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

OID: 1.3.6.1.2.1.1.1.0 に対応する応答として,OID: 1.3.6.1.2.1.1.2.0 と OID: 1.3.6.1.2.1.1.3.0 が,OID: 1.3.6.1.2.1.1.5.0 に対応する応答として,OID: 1.3.6.1.2.1.1.6.0 と OID: 1.3.6.1.2.1.1.7.0 が返されています.

- message

  - SEQUENCE: 30
  - Length: 75
  - version

    - INTEGER: 02
    - Length: 01
    - Value: 01 (version: 2)
  - community

    - OCTET STRING: 04
    - Length: 09
    - Value: 636f6d6d756e697479 (community: community)
  - get-response

    - GetResponse: a2
    - Length: 65
    - request-id

      - INTEGER: 02
      - Length: 04
      - Value: 24fac762 (620414818)
    - error-status

      - INTEGER: 02
      - Length: 01
      - Value: 00
    - error-index

      - INTEGER: 02
      - Length: 01
      - Value: 00
    - variable-bindings

      - SEQUSENCE: 30
      - Length: 57
      - varbind

        - SEQUENCE: 30
        - Length: 17
        - oid

          - OBJECT IDENTIFIER: 06
          - Length: 08
          - Value: 2b06010201010200 (OID: 1.3.6.1.2.1.1.2.0)
        - value

          - OBJECT IDENTIFIER: 06
          - Length: 0b
          - Value: 2b06010401bf080302817f (sysObjectID: 1.3.6.1.4.1.191.8.3.2.129.127)
      - varbind

        - SEQUENCE: 30
        - Length: 1b
        - oid

          - OBJECT IDENTIFIER: 06
          - Length: 08
          - Value: 2b06010201010600 (OID: 1.3.6.1.2.1.1.6.0)
        - value

          - OCTET STRING: 04
          - Length: 0f
          - Value: 64656661756c746c6f636174696f6e (sysLocation: defaultlocation)
      - varbind

        - SEQUENCE: 30
        - Length: 10
        - oid

          - OBJECT IDENTIFIER: 06
          - Length: 08
          - Value: 2b06010201010300 (OID: 1.3.6.1.2.1.1.3.0)
        - value

          - Timeticks: 43
          - Length: 04
          - Value: 3f9f9cb6 (sysUpTime: 1067424950)

      - varbind

        - SEQUENCE: 30
        - Length: 0d
        - oid

          - OBJECT IDENTIFIER: 06
          - Length: 08
          - Value: 2b06010201010700 (OID: 1.3.6.1.2.1.1.7.0)

        - value

          - INTEGER: 02
          - Length: 01
          - Value: 0c (sysServices: 12)


InformRequest-PDU
^^^^^^^^^^^^^^^^^

フォーマット::

  | InformRequest-PDU | RequestID | ErrorStatus | ErrorIndex |         VarBindList               |
                                                             |    VarBind   |    VarBind   |...  |
                                                             | name | value | name | value |...  |


参考文献
========

- 緒方亮,鈴木暢,矢野ミチル 共著,『マスタリングTCP/IP SNMP編』,株式会社 オーム社,2005/09

2011-04-17

クラスメソッドの mock

class A で class B のクラスメソッド b が呼ばれるとき

class A
  def initialize
  end

  def a
    :a
  end

  def b
    B.b
  end
end

RSpec で,下記のように B の mock をかく.

describe do
  context do
    before do
      @a = A.new
    end

    context do
      it do
        @a.a.should == :a
      end
    end

    context do
      before do
        B = double('B')
        B.should_receive('b').and_return(:b)
      end

      it do
        @a.b.should == :b
      end

      it do
        @a.b.should_not == :c
      end
    end
  end
end

実行すると warning になる.

$ rspec -fn  --color a_spec.rb 


  
    
      should == :a
    
      should == :b
/home/hexa/a_spec.rb:19: warning: already initialized constant B
      should not == :c

Finished in 0.00152 seconds
3 examples, 0 failures

before の際に,定数 B を再定義しているため warninig なる.

テストの数が多くなると warning が邪魔になってくるので,

class B をでっち上げて,partial mock してみました.

describe do
  context do
    before do
      @a = A.new
    end

    context do
      it do
        @a.a.should == :a
      end
    end

    context do
      before do
        class B; end
        B.should_receive('b').and_return(:b)
      end

      it do
        @a.b.should == :b
      end

      it do
        @a.b.should_not == :c
      end
    end
  end
end

warning は表示されなくなりましたが,この対応でいいかは分からないです.

$ rspec -fn  --color a_spec.rb 


  
    
      should == :a
    
      should == :b
      should not == :c

Finished in 0.00766 seconds
3 examples, 0 failures

2011-04-13

SNMP のメモ

===========
SNMP のメモ
===========

:Date:  2011/04/13
:Author:  Hexa

.. warning::
  - 勉強したことのメモです.
  - SNMPv3 は後で


SNMP とは
=========

ネットワーク機器を管理するためのプロトコルです.

下記の操作が可能です.

- ネットワーク機器の情報の取得
- ネットワーク機器の設定の変更
- トラブル発生時の通知


情報を問い合わせる時に,ネットワーク機器に代わって,SNMP エージェントがネットワーク機器の情報を教えてくれます.

問い合わせするのは,SNMP マネージャです.
問い合わせと,その返信は UDP でおこなわれます.

.. note::
  - Trap は UDP ポート 162 で受信する
  - Trap 以外のメッセージは UDP ポート 161 で受信する


データベース
------------

ネットワーク機器の情報は,MIB で定義されている構造で SNMP エージェントが保持しています.

MIB は管理オブジェクトと,値で構成されれています.
MIB で定義するための形式は SMI で定義されています.

SMI は ASN.1 の BER 形式です.

MIB はツリー構造として構成されます.

.. note::
  - 日頃良く目にする **.1.3.6.1.2.1.1 ...** という OID であらわされます.::

  iso(1).org(3).dod(6).internet(1).mgmt(2).mib(1).system(1).sysDescr(1)

.. note::
  - BER に関しては,参考文献にあげている「マスタリングTCP/IP SNMP編」に丁寧な説明が記載されています.


MIB
---

OBJECT-TYPE マクロと TRAP-TYPE マクロがあり,管理オブジェクトは OBJECT-TYPE で,トラップは TRAP-TYPE で定義します. 

OBJECT-TYPE マクロでは,データ型や ACL,状態,MIB ツリー上の位置と番号を割り振ります.

管理オブジェクトは,単一の情報を持つオブジェクトと,テーブルで情報を持つオブジェクトがあります.

指定した管理オブジェクトの指定した情報を取得するために,インスタンスを指定します.

インスタンスは **オブジェクトクラス.インスタンスサブ識別子** で表現されます.
単一の情報を持つオブジェクトの場合は,インスタンスサブ識別子は **0** です.

例えば,sysName の場合は,オブジェクトクラス **iso(1).org(3).dod(6).internet(1).mgmt(2).mib(1).system(1).sysName(1)** とインスタンスサブ識別子 **0** で .1.3.6.1.2.1.1.1.0 と表されます.


シーケンス
----------

情報の取得の場合
^^^^^^^^^^^^^^^^

GetRequest の例::

    -----------     GerRequest    -----------
    |         | ----------------> |         |
    | Manager |                   |  Agent  |
    |         | <---------------- |         |
    -----------     GetResponse   -----------


情報の通知の場合
^^^^^^^^^^^^^^^^

Trap の例::


    -----------                   -----------
    |         |                   |         |
    | Manager | <---------------- |  Agent  |
    |         |       Trap        |         |
    -----------                   -----------


コミュニティ名
--------------

複数のネットワーク機器を区別する際に **SNMP コミュニティ名** を使用します.

.. note::
  - パスワードのように使用されます.
  - 平文です.


PDU
---

SNMP の実装では,下記の 5 つの PDU をサポートなければなりません.

- GetRequest

  - SNMP エージェントへ送ったインスタンスに対応する値を問い合わせます.
- GetNextRequest

  - SNMP エージェントへ送ったインスタンスの次のインスタンスに対応する値を問い合わせます.
- GetResponse

  - GetRequest や GetNextRequest,SetRequest に対する応答です.
- SetRequest

  - SNMP エージェントへ送ったインスタンスの値に変更します.
- Trap-PDU

  - 状態の変化やトラブルをマネージャに通知します.


パケットフォーマット
--------------------

SNMP パケットは,下記で構成されてます.

- version (INTEGER): SNMP のバージョン番号
- community (OCTET STRING): コミュニティ名
- data (ANY):

フォーマット::

  | version | community | data (PDU) |


data
----

GetRequest-PDU / GetNextRequest-PDU / SetRequest-PDU / GetResponse-PDU
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

フォーマット::

  | GetRequest-PDU | RequestID | ErrorStatus | ErrorIndex |         VarBindList               |
                                                          |    VarBind   |    VarBind   |...  |
                                                          | name | value | name | value |...  |


実際のパケットをみてみます.

GetRequest (VarBind1: sysDescr.0, VarBind2: sysName.0)::

  303a0201010409636f6d6d756e697479a02a02044ca07c01020100020100301c300c06082b060102010101000500300c06082b060102010105000500

少しだけデコードしてみます.


- Message

  - SEQUENCE: 30
  - Length: 3a
  - version

    - INTEGER: 02
    - Length: 01
    - Value: 01 (Version: 2)
  - community

    - OCTET STRING: 04
    - Length: 09
    - Value: 636f6d6d756e697479 (community: community)
  - PDU

    - GetRequest-PDU: a0 (get-request: 10100000)
    - Length: 2a
    - request-id
 
      - INTEGER: 02
      - Length: 04
      - Value: 4ca07c01 (request-id: 1285585921)
    - error-status
 
      - INTEGER: 02
      - Length: 01
      - Value: 00 (error-status: noError)
    - error-index
 
      - INTEGER: 02
      - Length: 01
      - Value: 00 (error-index: 0)
    - variable-bindings

      - SEQUENCE: 30
      - Length: 1c

        - SEQUENCE: 30
        - Length: 0c

          - OID

            - OBJECT IDENTIFIER:06
            - Length: 08
            - Value: 2b06010201010100 (OID: 1.3.6.1.2.1.1.1.0)

          - Value

            - NULL: 05
            - Length: 00
        - SEQUENCE: 30
        - Length: 0c

          - OID

            - OBJECT IDENTIFIER:06
            - Length: 08
            - Value: 2b06010201010500 (OID: 1.3.6.1.2.1.1.5.0)

          - Value

            - NULL: 05
            - Length: 00


まとめ
======

- SNMP はネットワーク機器の管理に使用される.
- メッセージの送受信はマネージャとエージェントがおこなう.
- データベースは MIB で構造が定義されている.
- 問い合わせのルールとしてインスタンスやコミュニティがある.


参考文献
========

- 緒方亮,鈴木暢,矢野ミチル 共著,『マスタリングTCP/IP SNMP編』,株式会社 オーム社,2005/09