システム運用で使う簡易的なWebアプリをSinatraで作る

サーバ上にあるXMLを簡易的なWebアプリから、参照したり、変更したり、したいと。
簡易って言ったらsinatraが一番かな、と。
XMLをオブジェクトにしたりシリアライズしたりするのもRubyなら楽そうだし。
ってことで、、
 
■ Sinatraの環境設定
自分の開発マシンにはRuby1.8.7が入ってるのでソレ使います。

$ ruby -v
ruby 1.8.7 (2010-06-23 patchlevel 299) [i686-linux]

gemすら入ってなかったのでapt-get installで入れます。

sudo apt-get install rubygems1.8

gemは外にアクセスしにいくのでプロキシの設定をします。

vi ~/.gemrc
http_proxy: http://サーバ:ポート

Sinatraをインストールします。

$ sudo gem install sinatra
Successfully installed tilt-1.1
Successfully installed sinatra-1.1.0
2 gems installed
Installing ri documentation for tilt-1.1...
Installing ri documentation for sinatra-1.1.0...
Installing RDoc documentation for tilt-1.1...
Installing RDoc documentation for sinatra-1.1.0...

HelloWorldするためのコードを書きます。

vi hello.rb
require 'sinatra'
get '/' do
  'Hello world!'
end

フォアグランドで起動してブラウザからアクセスしてみます。見事画面上にHello worldが表示されます。
ログにアクセスの形跡も残っています。fabicon無いよ的なログも残ってますねw
ポートはデフォルトだと4567になっていますが、指定したい場合は-pオプションでポート番号を指定します。

$ ruby -rubygems hellp.rb
== Sinatra/1.1.0 has taken the stage on 4567 for development with backup from WEBrick
[2010-11-25 11:27:40] INFO  WEBrick 1.3.1
[2010-11-25 11:27:40] INFO  ruby 1.8.7 (2010-06-23) [i686-linux]
[2010-11-25 11:27:45] INFO  WEBrick::HTTPServer#start: pid=19635 port=4567
127.0.0.1 - - [25/Nov/2010 11:27:59] "GET / HTTP/1.1" 200 12 0.0018
localhost.localdomain - - [25/Nov/2010:11:27:59 JST] "GET / HTTP/1.1" 200 12
- -> /
127.0.0.1 - - [25/Nov/2010 11:27:59] "GET /favicon.ico HTTP/1.1" 404 420 0.0007
localhost.localdomain - - [25/Nov/2010:11:27:59 JST] "GET /favicon.ico HTTP/1.1" 404 420
- -> /favicon.ico

 
■ REXMLでXML読み込み
XMLファイルを作ります。

$ vi hoge.xml
<?xml version="1.0"?>
<hage>
 <front>danger</front>
 <back>safe</back>
</hage>

REXMLを使ってパース&XPathを使って中身をみてみます。
先ほど作ったSinatra用のRubyでXPathを使ってXMLの中身を取り出してみます。

vi aaa.rb
require "rexml/document"
xml_file = "hoge.xml"
file = File.new(xml_file)
doc = REXML::Document.new(file)
puts doc.elements['/hage/back'].text

叩いてみると値が取り出せました。

$ ruby aaa.rb
safe

 
■ sinatraから参照&変更してみる
とりあえずsinatraでWeb画面から先ほどの要素が取れるようにします。
以下のコードでブラウザから取得することができました。
ちなみにsinatraはコード変更するとサーバを再起動しないと変更が反映されません。
が、gemでshotgunってコマンド入れて、それ叩くと反映されます。

equire 'sinatra'
require "rexml/document"
xml_file = "hoge.xml"
get '/' do
 file = File.new(xml_file)
 doc = REXML::Document.new(file)
 doc.elements['/hage/back'].text
end

 
引き続き、値を変更してみます。
全然RESTっぽくないですが、、getで/back_dangerっていうアクセスで
先ほどの”safe”を”danger”に変更してみます。

get '/back_danger' do
 file = File.new(xml_file)
 doc = REXML::Document.new(file)
 file.close
 doc.elements['/hage/back'].text = "danger"
 File.open(xml_file, "w") {|xml|
  xml.write(doc)
 }
 "modified"
end

http://localhost:4567/back_dangerで画面からアクセスすると、
modified が表示されて、サーバ上のファイルを開くと以下のように
backもdangerになっとります。ゲーハーっす。

vi hoge.xml
<?xml version='1.0'?>
<hage>
 <front>danger</front>
 <back>danger</back>
</hage>

 
後はボタン押したらOSコマンド発行できたりとか、ログをtailさせたの画面から見れたりとか、
ボンボン追加してって運用で楽出来るようになりたいな、と。
 
あ、、認証とかどうすんべ。。。@daipresentsに相談かな。。w

コメント

タイトルとURLをコピーしました