Tracのノウハウ

少しずつTracのノウハウをまとめて行きたいと思います。

LDAP/Active Directoryとの連携

ある程度のユーザ数以上の企業では、LDAPもしくはActive Directoryを利用して、社員のユーザ情報を管理していることが多いと思います。このような会社の中でTracをLDAPやActive Directoryと連携させて利用すると、Trac上で煩わしいユーザの管理を行う必要がなくなります。ここでは、LDAP/Active DirectoryとTracを連携させるノウハウを提供します。

LDAP/Active DirectoryのユーザでTracの認証をするには、次のようにします。

ScriptAlias /trac /usr/share/trac/cgi-bin/trac.fcgi
<Location "/trac">
   AuthType Basic
   AuthName "Enter your ID"
   AuthBasicProvider ldap
   Order Allow,Deny
   Allow from All
   AuthLDAPBindDN "CN=okamototk,OU=person,DC=trac,DC=example,DC=com"
   AuthLDAPBindPassword "BindDNで指定したユーザのパスワード"
# LDAPのURLを指定Active Directoryのアカウント名にしたい場合はsAMAccountNameを利用
   AuthLDAPURL "ldap://<LDAPのサーバ>/?uid?sub?"
   Require ldap-attribute objectClass=person                              
</Location>
Active DirectoryやLDAPの構造によっては、アカウントIDとして社員番号などのIDを利用し、メールアドレス等で利用するユーザ識別子が別の属性に格納していることがあります。例えば、わたしの会社の例では、Active DirectoryのアカウントID(sAMAccountName属性)として、4738292というIDが振られており、ユーザ識別子のokamototkはCN属性に格納されています。通常、社内システムにログインする際には、4738292のIDを利用しているので、Tracの認証にもそちらのIDを利用したくなります。しかし、Trac認証後のユーザIDが4738292ではTrac上でだれが操作したのか分らないので、Trac上ではokamototkをユーザIDとして利用したいでしょう。そのような場合は、次のようにAuthLDAPRemoteUserAttributeを利用します。
ScriptAlias /trac /usr/share/trac/cgi-bin/trac.fcgi
<Location "/trac">
   AuthType Basic
   AuthName "Enter your ID"
   AuthBasicProvider ldap
   Order Allow,Deny
   Allow from All
   AuthLDAPBindDN "CN=okamototk,OU=person,DC=trac,DC=example,DC=com"
   AuthLDAPBindPassword "BindDNで指定したユーザのパスワード"
   AuthLDAPRemoteUserAttribute CN      # Trac認証後のユーザID
# Apache認証持にsAMAccountNameのIDを入力
   AuthLDAPURL "ldap://<LDAPのサーバ>/?sAMAccountName,CN?sub?"  
   Require ldap-attribute objectClass=person                              
</Location>

Apache2.0.59(Windows)付属のmod_auth_ldapについて

Windows版Apache2.0.59のmod_auth_ldapを使用した場合、設定は問題ないはずなのに認証が通らない場合があります。
その場合は、『Apache2でLDAP認証が失敗する - ほんわかうぃき』を参考にmod_auth_ldapをApache2.0.59のものと入れ替えると上手くいくかもしれません。

TracLightningのコマンドプロンプトを好きなディレクトリで起動する方法

エクスプローラの右クリックで好きなディレクトリでコマンドプロンプトを起動できると便利ですよね
レジストリエディタで以下のキーを作成します。

  • キー名:HKEY_CLASSES_ROOT\Folder\shell\trac\command
  • 値:cmd.exe /e:on /K "cd "%L"&&"C:\TracLight\bin\setenv.bat"

ダブルクリックで設定できるファイルも添付しておきます。 trac-cmd.reg

DB(sqlite3)のrevisionからticketへの関連付けを行うpyスクリプト

svnリポジトリを別の場所で更新し、それを元のsvnリポジトリに適用するには、 リポジトリのdbフォルダにあるファイル「current」、 その下のrevpropsフォルダにある新しくコミットしたリビジョン番号ファイル、 revフォルダにある新しくコミットしたリビジョン番号ファイル の3つのファイルをコピーし、 更新するリポジトリに上書きすればいいです。 (但しリポジトリのファイル形式がFSFSである時)

tracで管理してるsvnリポジトリでも同じことができます。 tracを起動しなおしただけで、DBのrevisionには追加されます(TracLightningではそうだった)。

しかしこのままでは、コミットログは、チケットのコメントにならないままとなります。

そこで、sqlite3データベースのrevisionテーブルの情報を元にチケットのコメントを追加する pythonスクリプト(svnlogadd.py)を pythonの勉強がてらに作成しました。 中途半端な出来ですがのせておきます。TracLightning用です。 上記のようにリポジトリ更新した後に python svnlogadd.py tracenv のように実行すると、 input revision: と表示されますのでリビジョンの数字を入力してください。 一つのリビジョンの分が更新されます。

csv2trac日本語対応

csvから複数のチケットを作成するスクリプトcsv2trac.py
http://trac.edgewall.org/attachment/wiki/TracSynchronize/csv2trac.2.py
は日本語対応ではありませんが、簡単に日本語対応にすることが出来ます。 修正したもの(csv2tracj.py)を添付してます。 また、サンプルのcsvファイル(newticket.csv)も添付してます。

python csv2tracj.py newticket.csv C:\TracLight\projects\trac\tracenv
のようにすればチケットが登録されます。

tracにDigest認証でXML-RPC接続する方法

tracにXML-RPCプラグインを適用している場合、 PythonMatrixJpのXML-RPCクライアントヘルパー http://python.matrix.jp/web/xmlrpc_client.html を使うと、Digest認証でも(Basic認証でも使えると思います) pythonでtracと接続できます。 (TracHttpAuthPluginを使うとうまく動きません。)

例えば以下のようなスクリプトではlist(XML-RPC exported functions)をとることが出来ます。 (urlやユーザID、パスワードは適宜書き換え、 local=Trueはプロキシを使う場合は不要です。)

  1. #!/usr/local/bin/python
  2. # -*- encoding: utf-8 -*-
  3. import xml_rpc
  4. url = 'http://localhost/trac/tracenv/login/xmlrpc'
  5. user, password = 'userid', 'userpassword'
  6. server = xml_rpc.XmlRpcServer(url, user, password, local=True)
  7. print server.system.listMethods()
接続した後はxmlrpclibで作業します。例えば
multicall = xmlrpclib.MultiCall(server)
のように。xmlrpclibを使う時は
import xmlrpclib
が必要です。

TracLightning用hook

windows用のバッチファイルを添付してます。下記のような使い方をしたい人はどうぞ。
pre-commit.bat
 コミットログに"refs #xxx"(xxxは数値)が含まれていなければコミット不可とする。
pre-revprop-change.bat
 USERがadminであれば、logまたはauthorを変更可能、それ以外は不可とする。
post-revprop-change.bat
 USERがadmin、かつACTIONがM、かつlogまたはauthorを変更してるならresyncし、それ以外は何もしない。

XMLRPCプラグインをつかいWebブラウザからJSONでチケット情報を取得

jQueryを使った場合、次のようにして取得できる。 <script type="text/javascript" src="jquery.js"></script> ...

$.ajax({
  url: '/trac/SampleProject/jsonrpc',
  contentType: 'application/json',
  dataType: 'json',
  type: 'post',
  data: JSON.stringify(
    {method:'ticket.query', params:['status!=closed'], id: 12}
  ),
  /* 実行が成功した場合 */
  success: function(data){
    alert(data['result']);
    alert(data['error']);
    alert(data['id']);
  },
  /* エラーの場合 */
  error: function(result) {
     alert("error:"+result);
  }
});

  • 認証が必要な場合は、/trac/SampleProject/login/jsonrpcとする。
  • 別のサイトのチケットは取ってこれない(同じWebサーバ内でだけ有効

ticket.getのサンプル

$.ajax({
  url: '/trac/agile/jsonrpc',
  contentType: 'application/json',
  dataType: 'json',
  type:'post',
  data: JSON.stringify(
    {method:'ticket.get', params:[1], id: 12}
  ), 
  success: function(res){
    alert("success");
      alert(res['result'][3]['component']);
  },
  error: function(result) {
     alert("error:"+result);
  }
});

次のようなメッセージが返却される。datetime型やunicodeは自動的に変換されるので考慮する必要はない。

{"id": 12,
 "result": [
     1,
     {"__jsonclass__": ["datetime", "2011-01-02T11:58:31"]},
     {"__jsonclass__": ["datetime", "2011-01-07T13:21:51"]},
     {"status": "new",
      "changetime": {"__jsonclass__": ["datetime", "2011-01-07T13:21:51"]},
      "totalhours": "18.0",
      "hours": "0",
      "description": "test",
      "reporter": "admin",
      "cc": "",
      "resolution": "",
      "time": {"__jsonclass__": ["datetime", "2011-01-02T11:58:31"]},
      "component": "\u30c1\u30fc\u30e0B",
      "summary": "test",
      "priority": "\u6700\u91cd\u8981",
      "keywords": "",
      "billable": "1",
      "parents": "",
      "milestone": "\u30b9\u30d7\u30ea\u30f3\u30c80(\u6e96\u5099)",
      "owner": "admin",
      "estimatedhours": "20.0",
      "type": "\uff7d\uff8c\uff9f\uff98\uff9d\uff84\uff8a\uff9e\uff6f\uff78\uff9b\uff78\uff9e"}],
  "error": null}