ども、cloudpackかっぱ (@inokara) です。

はじめに

福岡で生活をはじめて気付いたことの一つに福岡は Ruby の街(mruby の街)であるということでした。

詳しいことはこれから調べたいと思いますがとにかく興奮しました…というわけではありませんが、mruby で sensu-api のクライアントを作ってみました(つくっている最中です)。

作ってます

やってること

  • sensu-api の各エンドポイントにリクエストを投げます
  • 認証が必要な場合には認証も通ります

github

詳しくは README を御覧ください。

デモ

build_config.rb に以下を記述して make します。

MRuby::Build.new do |conf|
  conf.gem :git => 'https://github.com/inokappa/mruby-sensu.git'
end

以下のようなスクリプトを用意します。

config = {
  :host  => "http://xxx.xxx.xxx.xxx",
  :port => "4567",
  :ua   => "mruby-sensu",
  :user => "",
  :pass => "",
}

s = Sensu::Client.new(config)

req = {
  :endpoint => "clients"
}

JSON::parse(s.post(req)["body"]).each do |res|
  puts res["name"]
end

デモでも認証情報は設定していませんが、認証が設定されている sensu-api の場合には :user:pass を設定することで認証を行うことが出来ます。

以下のように実行します。

./bin/mruby ./bin/test.rb

以下のように sensu で監視しているクライアントの一覧を取得することが出来ます。

raspi01
localhost

ちなみに sensu-api のログには以下のように記録されます。

{"timestamp":"2014-12-07T06:21:00.050159+0000","level":"info","message":"GET /clients","remote_address":"xxx.xxx.xxx.xxx","user_agent":"mruby-sensu","request_method":"GET","request_uri":"/clients","request_body":""}

作る過程で覚えたこと

mruby で HTTP リクエストを処理する

mruby で HTTP リクエストを処理するには mruby-httprequest を利用するとお手軽でした。

> http = HttpRequest.new()
 => #<HttpRequest:0x21169a0>
> http.get("http://yahoo.co.jp/")

例えば、yahoo.co.jp にアクセスしたい場合には上記のように書けます。また、ヘッダを指定してリクエストを送りたい場合には以下のように書きます。

> http.get("http://yahoo.co.jp/", nil, 'User-Agent' => "mruby-http-client")

nil となっている部分には Request Body を入れることが出来ます。

Basic 認証の処理

これは mruby に限ったことではないですが Basic 認証はリクエストヘッダに以下のように付加されます。

> Authorization: Basic xxxxxxxxxxxxx

xxxxxxxxxxxxx には user:pass の文字列を Base64 でエンコードした値が入ります。

これを mruby で処理しようとした場合には以下のように書きました。

    def auth
      auth_data = [ @user, ":" , @pass ]
      Base64.encode(auth_data.join)
    end

mruby で Base64 を扱う場合には mruby-base64 を利用すると良さそうです。

引続き…

現在は GET メソッドで情報を取得することしか出来ないですが、DELETE 等でデータの操作が出来るようにしたいと思います。

元記事はこちらです。
mruby で sensu-api のクライアントっぽいのを作っているメモ