BLOGTIMES
2009/06/01

XML-RPCを使ってTracのチケットに添付ファイルを投げ込む(Perl編)

  trac  perl 
このエントリーをはてなブックマークに追加

仕事場に導入したTracはかなり活用されてきていて、導入した自分としては嬉しい限りです。僕はコンソール作業の記録をしばしばTracに転記しているのですが、そうするとコンソールとウェブブラウザを行ったり来たりしなければならないので、それがちょっと面倒になってきました。

ということで、ブラウザを開かずに、Linux上のコンソールのコマンドで特定のチケットに添付ファイルを投げ込むスクリプトを書いてみました。Tracには他のシステムと連携するためにXML-RPCというインタフェイスが用意されているので、これをPerlから叩いてみます。XML-RPCについてはNucleus関連の開発でも散々いじったので自分としてはPHPで書くのが一番得意なのですが、今回はPerlで開発することにします。

チケットに添付ファイルを投げ込むスクリプト

ということでサクッと書いてみました。
本当はもうちょっとちゃんと引数のバリデーションしたりとか、チケットの存在確認とかした方がいいと思うんですが、プライベート用なのでこれで十分です。

tracAttachmentPost.pl

#!/usr/bin/perl use strict; use warnings; use XMLRPC::Lite; use Data::Dumper; use File::Basename; my $debug = 1; ($ARGV[0] && $ARGV[1]) || die 'usage: tracAttachmentPost.pl ##TicketID## ##AttachmentFile##'; my $ticketid = int($ARGV[0]); my $attachmentName = $ARGV[1]; my $attachmentContents; open(FILE, $attachmentName) or die "$!"; read(FILE, $attachmentContents, (-s $attachmentName)); close(FILE); my @params = ( $ticketid, basename($attachmentName), 'Uploaded by tracAttachmentPost.pl', XMLRPC::Data->type('base64', $attachmentContents ), ); print Dumper(@params) if $debug; my $result = XMLRPC::Lite->proxy('http://testserver.example.com:80/trac/(プロジェクト名)/login/xmlrpc', credentials => [ 'testserver.example.com:80', # host:port 'trac', # realm '(ユーザー名)' => '(パスワード)', # user, password ] ) ->call("ticket.putAttachment", @params ) ->result; print Dumper($result);

# 使うときには()の部分とか、testserver.example.comを環境に合わせて書き替える必要があります。。。。

使い方は下記のようにチケットID(ここでは100)とファイル名(ここではexample.txt)を指定すると、チケットにファイルが添付されます。処理が成功した場合には、ファイル名が表示されるはずです。

./tracAttachmentPost.pl 100 example.txt

XML-RPCを投げるにあたってBasic/Digest認証をパスする必要があるので、URLをhttp://user:password@testserver:80/・・・・というようにしてリクエストを投げてみたものの「401 Authorization Required. 」で弾かれてしまって少しハマりましたが、XMLRPC::Liteのソースを追いかけていってproxy()の第2引数以降はLWP::UserAgentへの引数になるらしいということがわかったので、credentialsを使う事で認証をパスすることができるようになりました。

2009/12/13追記

Ruby編も書きました。


    トラックバックについて
    Trackback URL:
    お気軽にどうぞ。トラックバック前にポリシーをお読みください。[policy]
    このエントリへのTrackbackにはこのURLが必要です→https://blog.cles.jp/item/3065
    Trackbacks
    このエントリにトラックバックはありません
    Comments
    愛のあるツッコミをお気軽にどうぞ。[policy]
    古いエントリについてはコメント制御しているため、即時に反映されないことがあります。
    コメントはありません
    Comments Form

    コメントは承認後の表示となります。
    OpenIDでログインすると、即時に公開されます。

    OpenID を使ってログインすることができます。

    Identity URL: Yahoo! JAPAN IDでログイン