Mail-to-Ticket and Web-to-Ticket メールまたはWEBからチケット簡単自動作成
問い合わせフォームなどからの入力を自動でTracのチケットにあげたいので、Trac をハックしてみたら、簡単なプログラムを書けばいけそうなことがわかった。
とりあえず、PerlでTicketを登録するプログラムを書いてみた。うーん、すごく汚い。
URLなどは、自分の環境に置き換えること。
CentOS4.5上で実行したら、動作しないことが判明。
LWP::UserAgent で、default_headers が使えない模様。 というわけで、CentOS5.0以降にバンドルされているLWP::UserAgentでないと使えない。以下を実行して、エラーにならなければ動作すると思われる。
# perl -MLWP::UserAgent -e 'my $ua = LWP::UserAgent->new; print $ua->default_headers;'
main関数のソース
#!/usr/bin/perl package main; use TracTicket; # for Basic Authentication my $ticket = TracTicket->new('https://trac.rukatan.com/newticket', 'yoshifumi', 'yoshifumi'); # for Trac demo site #my $ticket = TracTicket->new('http://www.hosted-projects.com/trac/TracDemo/Demo/newticket'); $ticket->set_formdata( 'reporter'=>'yoshifumi' ); $ticket->set_formdata( 'owner'=>'yoshifumi' ); $ticket->set_formdata( 'summary'=>'SUMMARY サマリー' ); $ticket->set_formdata( 'type'=>'defect' ); $ticket->set_formdata( 'description'=>'BODY 本文' ); $ticket->set_formdata( 'priority'=>'major' ); $ticket->set_formdata( 'component'=>'demo' ); $ticket->submit();
TracTicket.pm のソース
package TracTicket; use warnings; use strict; use LWP::UserAgent; use HTTP::Headers; use HTTP::Request::Common; use MIME::Base64; use Data::Dumper; sub new { my $classname = shift; my $url = shift; my $username = shift; my $password = shift; my $ua = LWP::UserAgent->new; $ua->default_headers->push_header('Authorization' => 'Basic ' . encode_base64($username . ":" . $password)); my $res = $ua->get($url); my @setcookie = $res->header('Set-Cookie'); my $trac_form_token; my $trac_session; foreach (@setcookie) { if( /trac_form_token=([0-9A-z]+);/ ) { $trac_form_token = $1; } elsif( /trac_session=([0-9A-z]+);/ ) { $trac_session = $1; } } if( $trac_session ) { $ua->default_headers->push_header('Cookie' => "trac_form_token=$trac_form_token; trac_session=$trac_session"); } else { $ua->default_headers->push_header('Cookie' => "trac_form_token=$trac_form_token"); } my $formdata = { __FORM_TOKEN => $trac_form_token, reporter => ($username)?$username:'TracTicket', summary => 'none', type => 'defect', description => 'none', priority => 'major', owner => ($username)?$username:'', status => 'new', action => 'create', }; bless { url => $url, trac_form_token => $trac_form_token, trac_session => $trac_session, username => $username, password => $password, ua => $ua, formdata => $formdata, }, $classname; } sub set_formdata { my $self = shift; my $key = shift; my $value = shift; $self->{formdata}->{ $key } = $value; } sub submit { my $self = shift; my $request = POST( $self->{url}, $self->{formdata} ); my $res = $self->{ua}->request($request); } 1; __END__
これを改造すれば、WEBのフォームからやメールからも登録できる。
追加
- Web-to-Ticket
Web-to-Ticketの続き にサンプルを書いた。
- Mail-to-Ticket
今度書く。
- CentOS4.x 対応版