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 対応版

TracTicket.pm のCentOS4.x対応版