ども、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 のクライアントっぽいのを作っているメモ」