Tracでマルチプロジェクトの運用

わりとちゃんとTracを使い出したので、複数プロジェクトの管理についてちゃんと考えてみた。
ガイドをみるとTracEnvParentDirを使えと書いてある。


  SetHandler mod_python
  PythonHandler trac.web.modpython_frontend 
  PythonOption TracEnvParentDir /var/trac
  PythonOption TracUriRoot /projects

こうしておいて/projectsにアクセスするとAvailable Projectsが見れる。
じゃあ、認証はどうするんだと言えば、LocationMatchで共通の認証ファイルを見るようにする例しか書いてない。


  AuthType Basic
  AuthName "Trac"
  AuthUserFile /var/trac/.htaccess
  Require valid-user

全プロジェクトで共通の認証ファイルというのはさすがにありえないし、Tracプロジェクトを追加するごとにconfに追記してapacheをリスタートとか、そういう運用設計はいやだったので、以下のように試行錯誤。

1. LocationMatchで後方参照

まず、LocationMatchで正規表現が使えてるんだから、後方参照が使えないかと期待して、公式のドキュメントをあたってみるも何も記述無し。
書いてないだけかと前向きに捉えてGで調べてみたら、404 Not Foundで後方参照が使える旨の記述があったので試してみる。


  AuthType Basic
  AuthName "Trac"
  AuthUserFile /var/trac/$1/.htaccess
  Require valid-user

結果は失敗。$1は展開されず、そのままの文字列でパスを探しにいってしまう。stackasteriskには一応フィードバックしておいた。

2. SetEnvIfでゴニョゴニョ

で、さらにApacheのドキュメントを読んでいるとSetEnvIfは正規表現が使えて、後方参照も使えて、さらに環境変数にも入れられるということだったので、次はSetEnvIfを試してみる。

SetEnvIf Request_URI "/trac/([^/]+)/login" TRAC_EACH_PJ_NAME=$1

    AuthType Basic
    AuthName "Trac Authentication"
    AuthUserFile /home/trac/%{TRAC_EACH_PJ_NAME}e/trac.htpasswd
    Require valid-user

が、これも失敗。LocationMatchのAuthUserFileのなかでは環境変数は展開してくれない。そもそも展開方法を書いてなくて、LogFormatでの書式でムリクリ"%{TRAC_EACH_PJ_NAME}e"って書いてみてただけだし。
ということで、結局ムリということでした。

結果

悲しいけど、できないのは仕方ないので今は以下のようなかたちで運用中。


  SetHandler mod_python
  PythonHandler trac.web.modpython_frontend 
  PythonOption TracEnvParentDir /var/trac
  PythonOption TracUriRoot /projects


# 以下、プロジェクトが増えるごとに追記

  AuthType Basic
  AuthName "foo project"
  AuthUserFile /var/trac/foo/.htaccess
  Require valid-user


  AuthType Basic
  AuthName "bar project"
  AuthUserFile /var/trac/bar/.htaccess
  Require valid-user

まー、Tracプロジェクト構築スクリプト作ってて、それに、自動で追記させてapacheのリスタートまでさせるようにしてるから手間はかわらないんだけど、精神衛生上イヤだなと。
あとは自前でLocationMatchをパクったようなモジュール書くとかかー。Cはまったくわからないけど。