Hatena::ブログ(Diary)

Lazy Technology

2008-02-12

[]リンクするaprのバージョンを0.9xから1.2xに

WebDAV(=Apache)でリポジトリにアクセスすると、500が返ってきてログにも何も残らないと言う現象に遭遇する。で、色々調べていくうちのSubversionApacheのaprのバージョンの不整合が原因と言う事が分かった。

なお、Apache HTTP Server 2.0系で利用されているAPR 0.9系と、Apache HTTP Server 2.2系で利用されているAPR 1.2系では、互換性がないことに注意されたい。

http://builder.japan.zdnet.com/news/story/0,3800079086,20361867,00.htm

トラブルシューティングの手順を残しておく。


まず、Apacheのログに何も残っていないので、telnetから直接WebDAVのリクエストを投げる。参考: Subversionによるバージョン管理 (2/3):Apache 2.0でWebDAV(後編) - @IT

$ telnet localhost 80
OPTIONS /svn/ HTTP/1.1
Host: hostname
Authorization: Basic ===============

すると、xmlでエラーの詳細が返ってくる。

HTTP/1.1 500 Internal Server Error
Date: Fri, 08 Feb 2008 02:43:28 GMT
Server: Apache
Content-Length: 290
Connection: close
Content-Type: text/xml; charset="utf-8"

<?xml version="1.0" encoding="utf-8"?>
<D:error xmlns:D="DAV:" xmlns:m="http://apache.org/dav/xmlns" xmlns:C="svn:">
<C:error/>
<m:human-readable errcode="22">
Can't set position pointer in file '/path/to/repos/db/revs/2406': Invalid argument
</m:human-readable>
</D:error>
Connection closed by foreign host.

ポイントは以下。

Can't set position pointer in file '/path/to/repos/db/revs/2406': Invalid argument

これでググる401 Unauthorizedでaprのバージョンが原因と書いてある。

Subversionはそのままだと同梱のAPR(0.9.7)を使ってしまうので、Apache 2.2.0に同梱のAPR(1.0)を使わせるため「--with-apr」と「--with-apr-util」を指定する。

指定しなくてもコンパイルもできてApacheもしっかり起動するが、アクセスするときに

Can't set position pointer in file '/var/lib/svn-repos/db/revs/0': Invalid argument

みたいなこと言われてハマる

http://saikyoline.jp/wiki/index.php?%A5%E1%A5%E2%2FWebDAV%A4%C7Subversion


aprのバージョンを確認するにはlddを使う。まずはSubversion(mod_dav_svn)。

$ ldd /usr/local/apache2/modules/mod_dav_svn.so
        libaprutil-0.so.0 => /usr/lib/libaprutil-0.so.0 (0x008f9000)
        libapr-0.so.0 => /usr/lib/libapr-0.so.0 (0x00270000)
        (snip)

$ ll /usr/lib/libapr*.0
lrwxrwxrwx  1 root root 18  1月 25 14:57 /usr/lib/libapr-0.so.0 -> libapr-0.so.0.9.17
lrwxrwxrwx  1 root root 22  1月 25 14:57 /usr/lib/libaprutil-0.so.0 -> libaprutil-0.so.0.9.17


恐らく0.9.17。次にApache

$ ldd /usr/local/apache2/bin/httpd
        libaprutil-1.so.0 => /usr/local/apache228/lib/libaprutil-1.so.0 (0x0078a000)
        libapr-1.so.0 => /usr/local/apache228/lib/libapr-1.so.0 (0x00b5d000)


$ ll /usr/local/apache228/lib/libapr*.0
lrwxrwxrwx  1 root root 18  2月  6 16:03 /usr/local/apache228/lib/libapr-1.so.0 -> libapr-1.so.0.2.12
lrwxrwxrwx  1 root root 22  2月  6 16:03 /usr/local/apache228/lib/libaprutil-1.so.0 -> libaprutil-1.so.0.2.12


恐らく1.2.12。確かにバージョンが違う。

と言うわけで、再々度Subversionコンパイル。この際なので色々オプションを調べて自分なりのconfigureを作る事に。

./configure \
--with-apr=/usr/local/apache2 \
--with-apr-util=/usr/local/apache2 \
--with-apxs=/usr/local/apache2/bin/apxs \
--with-swig=/usr/local/bin/swig \
--with-neon=/usr/local/ \
PERL=/usr/local/bin/perl \
PYTHON=/usr/local/bin/python \
RUBY=/usr/local/bin/ruby \
--with-ssl \
--without-berkeley-db

これでインストールしたらWebDAVで無事アクセスできた。いい加減これで全部かなー。

2008-01-24

[] Subversionでhttp(s)のURLスキームを認識しない問題を解決する。

RetrospectivaのtrunkをGoogle Codeからcoしようとしたらエラーが出る。

$ svn co -q http://retrospectiva.googlecode.com/svn/trunk/ retrospectiva
svn: 'http://retrospectiva.googlecode.com/svn/trunk' 用の URL スキームを認識できません

色々調べてみたものの分からなかったので、エラーメッセージググるとあっさり原因が見つかった。svnコマンドでhttp(s)系のリポジトリにアクセスする場合には、neonと言うライブラリが必要になるらしい。subversionのINSTALLファイルには以下のように書かれている。

4.  Neon library 0.25.x or 0.26.x (http://www.webdav.org/neon/)

The Neon library allows a Subversion client to interact with remote
repositories over the Internet via a WebDAV based protocol.  If you
want to use Subversion to connect to a server over ra_dav (via a
http:// or https:// url), you will require Neon.  (See also section
I.11 for information about "serf", an experimental alternative to
Neon for accessing servers over WebDAV.)

まず既存環境にNeonがあるか確認する。

$ rpm -qa | grep -i neon
neon-0.24.7-4

あった。でも要件を満たしていないようだ。と言うわけでNeonを含めてSubversionを再コンパイルする。NeonNeon公式からダウンロードするか、Subversionの依存ファイルを一括してパッケージしたtarファイルに含まれている。今回は後者を利用する。インストール方法も同様にINSTALLファイルに書かれているのでこれを参考に。

The source code is included with the Subversion dependencies package,
and it can also be obtained from:

  http://www.webdav.org/neon/neon-0.25.5.tar.gz
    -or-
  http://www.webdav.org/neon/neon-0.26.1.tar.gz

Building Neon inside the subversion build:

The Neon library source code can be placed in "./neon" if you
want Subversion to build it as part of the Subversion build process.

Unpack the archive using tar/gunzip.  Rename the resulting
directory from ./neon-0.XX.Y to just "./neon", inside the top
level of your Subversion source tree.  (This is what unpacking the
Subversion dependencies package does, too.)

手順は以下の通り。

$ wget http://subversion.tigris.org/downloads/subversion-1.4.6.tar.gz
$ tar zxf subversion-1.4.6.tar.gz
$ wget http://subversion.tigris.org/downloads/subversion-deps-1.4.6.tar.gz
$ tar zxf subversion-deps-1.4.6.tar.gz
$ cd subversion-1.4.6
$ ./configure
$ make
$ sudo make install

特に問題なく終了。configure時には以下の出力を確認した。

#
#configure: Configured to build neon 0.25.5:
#
#  Install prefix:  /usr/local
#  Compiler:        gcc
#  XML Parser:      expat
#  SSL library:     SSL support is not enabled
#  zlib support:    zlib support enabled, using -lz
#  Build libraries: Shared=no, Static=yes

再度チェックアウトし、無事チェックアウト出来る事を確認。


2008/1/29 追記

上記の手順でコンパイルした後、svkが動作しなくなったり、rubySubversionバインディングが動かなくなったりした。バインディングはバージョンが古いだけだったのだけれど、svkは原因がよく分からなかった。

以前とconfigureのオプションが違っていたりする事はあったのだが、Subvresionの依存パッケージにはNeon以外にapr,apr-util,zlibが入っていたので、それが問題になったのかもしれない。復旧した際にはNeon単体のみをソースツリーに含めるようにした。


2008/1/29 追記 その2

configureに--with-sslオプションを追加しないとhttpsでチェックアウトが出来なかったので、再度コンパイルし直し。

$ ./configure \
  PERL=/usr/local/bin/perl \
  PYTHON=/usr/local/bin/python \
  --with-swig=/usr/local/bin/swig \
  --with-ssl
$ make
$ sudo make install

コンパイル前。

$ svn --version
(snip)
以下のリポジトリアクセス (RA) モジュールが利用できます:

* ra_dav : WebDAV (DeltaV) プロトコルを使ってリポジトリにアクセスするモジュール。
  - 'http' スキームを操作します
* ra_svn : svn ネットワークプロトコルを使ってリポジトリにアクセスするモジュール。
  - 'svn' スキームを操作します
* ra_local : ローカルディスク上のリポジトリにアクセスするモジュール。
  - 'file' スキームを操作します

コンパイル後。

$ svn --version
(snip)
以下のリポジトリアクセス (RA) モジュールが利用できます:

* ra_dav : WebDAV (DeltaV) プロトコルを使ってリポジトリにアクセスするモジュール。
  - 'http' スキームを操作します
  - 'https' スキームを操作します
* ra_svn : svn ネットワークプロトコルを使ってリポジトリにアクセスするモジュール。
  - 'svn' スキームを操作します
* ra_local : ローカルディスク上のリポジトリにアクセスするモジュール。
  - 'file' スキームを操作します

2007-05-26

[]Tracインストール成功 & カスタマイズ

Apache2.0.59 + mod_python + 基本認証で動いた。Apache2系+FastCGIはRailsで懲りているので動かす気は起きない。

これだけでもアクセス権限で躓いたりと、結構な時間を食ってしまった。


mod_pythonでTracを動かすhttpd.confの内容。最後にコピペすればOK。

LoadModule python_module modules/mod_python.so

<Location /trac-project>
   SetHandler mod_python
   PythonHandler trac.web.modpython_frontend
   PythonOption TracEnv /path/to/trac
</Location>

<Location "/trac-project/login">
  Require valid-user
  AuthType Basic
  AuthName "認証ダイアログで表示される文字列"
  AuthUserFile /path/to/htpasswd
</Location>

こちらのサイトからほとんど丸パクリさせていただきました。感謝。

インストール - cooldaemonの備忘録


後はカスタマイズ。

チケットタイプ・優先度・重要度のカスタマイズ(日本語化)

優先度priorityコマンド
重要度severityコマンド
チケットタイプticket_typeコマンド

となる。

如何にフレンドリーかつ実用的な名前を付けられるかがTrac導入成功の分水嶺になる可能性が高いので、慎重に考える。

参考例

Trac - 鈍重な開発を俊敏にしていく日記 - agileグループ


ここは定型的なタスクになると思うので後述のWebAdminPluginを入れてブラウザからポチポチやるよりもバッチ化した方が良いと思う。

こんな感じ。

trac-admin /tmp/tractest/test priority change blocker やらないと休めない
trac-admin /tmp/tractest/test priority change critical やらないと帰れない
trac-admin /tmp/tractest/test priority change major ちゃんとやる(期限決定・優先度中)
trac-admin /tmp/tractest/test priority change minor あとでやる(期限決定・優先度低)
trac-admin /tmp/tractest/test priority change trivial いつかやりたい(期限未決定)
trac-admin /tmp/tractest/test severity add 社運にかかわる
trac-admin /tmp/tractest/test severity add サービスにかかわる
trac-admin /tmp/tractest/test severity add 髪の毛にかかわる
trac-admin /tmp/tractest/test severity add ボーナスにかかわる
trac-admin /tmp/tractest/test ticket_type change defect バグ報告
trac-admin /tmp/tractest/test ticket_type change enhancement 機能拡張要求
trac-admin /tmp/tractest/test ticket_type change task タスク

管理者のアカウントにTRAC_ADMIN権限を割り当て

TRAC_ADMIN権限は後述のWebAdminPluginを使う際に必要。

permission add username TRAC_ADMIN

WebAdminPluginをインストール

Trac0.9だとパッケージで提供されているが、0.10系だとsvnからチェックアウトしてセットアップしなければいけないようだ。

しかもPython-Eggと言う形式にしなければならないらしい。(Javaで言うjarのようなもの?)

で、Python-Eggの作成にはsetuptoolsと言うパッケージが必要。

Trac公式に導入手順が書かれていたのでそのままやったら入った。

TracPlugins ? The Trac Project


確認はやっぱりpythonコマンドで。

>>> import setuptools
>>> #=>エラーが起こらない

Python-Eggなパッケージ(ただのZip?)を作るにはsetup.py buildではダメらしい。

setup.pyのオプションをbdist_eggとする必要がある。

python setup.py bdist_egg
python setup.py install

これでインストール完了。ログに

Installed /usr/local/lib/python2.5/site-packages/TracWebAdmin-0.1.2dev_r4429-py2.5.egg

こう書かれていたので安心。2.3の方に入らないでちゃんと2.5の方に入っている。


後はTrac.iniに以下を追記する。

[components]
webadmin.* = enabled

Apacheを再起動してTRAC_ADMIN権限を持つユーザでログインすれば、右端のタブに「Admin」メニューが追加されている。

2007/5/27 追記

環境によってはApacheプロセスがPython-Eggのキャッシュの保存先にアクセスできないと言うエラーが発生するらしい。こちらに対処方が書いてある。

no title

Apacheの該当箇所のディレクティブを引用させていただく。

<Location /projects>

SetHandler mod_python

PythonHandler trac.web.modpython_frontend

PythonOption TracEnvParentDir /home/trac

PythonOption TracUriRoot /projects

SetEnv PYTHON_EGG_CACHE /home/trac/.python-eggs ←--この行を追加

</Location>

http://blog.denden-cafe.com/blog/2006/08/webadmin_c01a.html

Tracのプラグインに関する公式ドキュメントは TracPlugins ? The Trac Project にある。

日本語版のドキュメント、インストールすれば読めるんだけど、どっかネットに公開されてたりしないのかな。

文字コードの設定

Tracは文字コードを自動で識別する機構を備えているためか、Trac.iniのデフォルト文字コードは

default_charset = iso-8859-15

となっている。

これだと自分の環境では文字化けしたのでUTF-8に変更。

default_charset = UTF-8

文字コードの自動判別の技術的な情報については

ヤマロぶろぐ : Tracでファイルの文字コードを自動判定 - livedoor Blog(ブログ)

no title

辺りが参考になる。

Trac Wikiの強化

他のTracなサイトを見ているとほぼ必ずあるのが「Table of Contents」と言う目次っぽい存在。

なんだろうと思って探してみると、TocMacroと言うpluginで実現しているらしい。

no title

インストール手順も上記のサイトで詳しく書かれている。ついでにTracNavも入れる事に。

自分がやった手順は若干違ったのでメモしておく。

TocMacroのインストール
svn co http://trac-hacks.org/svn/tocmacro
cd tocmacro/0.10/
python setup.py bdist_egg
python setup.py install
TracNavのインストール
svn co http://svn.ipd.uka.de/repos/javaparty/JP/trac/plugins/tracnav
cd tracnav/
python setup.py bdist_egg
python setup.py install
Trac.iniの設定
[components]
...
tractoc.* = enabled
tracnav.* = enabled
Apacheの再起動(必須)

希望

  1. 担当者・関係者をユーザ一覧のコンボボックスにしたい。
  2. .rhtmlなファイルがリポジトリブラウザでシンタックスハイライトされない(SilverCityの問題)。ただし、0.11からはPygmentsが推奨されるようだ( SilverCity ? The Trac Project )。

参考

プラグイン webadmin をインストール - cooldaemonの備忘録

TracPlugins ? The Trac Project

WebAdminPlugin - 気の向くままに・・・ - Seesaa Wiki(ウィキ)

ソフト/Bug Tracking/trac/WebAdminPlugin - discypus