TracWebAdmin を日本語化する

  ブラウザ経由で Trac の設定を行う TracWebAdmin プラグインを日本語するパッチを作りました.

- パッチ: webadmin-r4429-ja.patch
  http://pocari.org/tools/trac/webadmin/webadmin-r4429-ja.patch

- 日本語化した egg ファイル
  egg ファイルは python のバージョンにあわせて作るものらしいです.
  python 2.3 で作ったものをおいておきます (でも,これで動くかどうか分かりません).

- python 2.3 で作った egg ファイル
  http://pocari.org/tools/trac/webadmin/TracWebAdmin-0.1.2dev-py2.3.egg

- 動作確認環境
o Trac 10.2
o Python 2.3
o Solaris 10

  パッチの適用方法は以下のようになります.

1. TracWebAdmin の最新版を取得する

  http://trac.edgewall.org/browser/sandbox を見てみたところ最新リビジョンは 4429 のようですので,このリビジョンを取得します.

$ svn export -r 4429 http://svn.edgewall.com/repos/trac/sandbox/webadmin/
A    webadmin
A    webadmin/webadmin
A    webadmin/webadmin/web_ui.py
A    webadmin/webadmin/htdocs
A    webadmin/webadmin/htdocs/css
A    webadmin/webadmin/htdocs/css/admin.css
A    webadmin/webadmin/htdocs/img
A    webadmin/webadmin/htdocs/img/collapsed.png
A    webadmin/webadmin/htdocs/img/expanded.png
A    webadmin/webadmin/htdocs/js
A    webadmin/webadmin/htdocs/js/admin.js
A    webadmin/webadmin/plugin.py
A    webadmin/webadmin/__init__.py
A    webadmin/webadmin/perm.py
A    webadmin/webadmin/ticket.py
A    webadmin/webadmin/basics.py
A    webadmin/webadmin/logging.py
A    webadmin/webadmin/templates
A    webadmin/webadmin/templates/admin_perm.cs
A    webadmin/webadmin/templates/admin_basics.cs
A    webadmin/webadmin/templates/admin_enum.cs
A    webadmin/webadmin/templates/admin_version.cs
A    webadmin/webadmin/templates/admin_plugin.cs
A    webadmin/webadmin/templates/admin_milestone.cs
A    webadmin/webadmin/templates/admin.cs
A    webadmin/webadmin/templates/admin_log.cs
A    webadmin/webadmin/templates/admin_component.cs
A    webadmin/setup.py
A    webadmin/COPYING
A    webadmin/setup.cfg
Exported revision 4429.

2. パッチを当てる

$ cd webadmin
$ patch -p0 < ../webadmin-r4429-ja.patch

  これで日本語化されます.

3. egg を作る

$ python ./setup.py bdist_egg

  これで,dist の中に TracWebAdmin-0.1.2dev-py2.3.egg のような egg ファイルが出来上がります.

4. プラグインをインストールする

  /usr/lib/share/trac/plugins とか /path/to/project/plugins とかにコピーして,trac.ini に以下のように記述します.

[components]
webadmin.* = enabled


- スクリーンショット



- 注意事項
  日本語化といっても,説明の文章は翻訳していませんので,ご注意ください.
  あと,私は python については全くの素人ですので,egg ってなに?とか聞かれてもよく分かりません.

Solaris に swap 領域を増やす方法

  Solaris では,普通のファイルを swap として使用することができます.
  これを利用して,swap 領域を増やす方法.

1. まず,現状の swap の確認

# swap -l
swapfile             dev  swaplo blocks   free
/dev/md/dsk/d3      85,3       8 1060280 1060280

2. mkfile でファイルを作成して,swap 領域に割り当てる

# mkfile 256m /usr/swap
# swap -a /usr/swap

3. 再度確認

# swap -l
swapfile             dev  swaplo blocks   free
/dev/md/dsk/d3      85,3       8 1060280 1060280
/usr/swap             -        8 524280 524280

  無事 swap 領域が増えていることがわかります.

4. 次回ブート時にも有効にする場合

# vi /etc/vfstab
/usr/swap   -   -   swap   -   no   -

  /etc/vfstab にこのように追記します.

- ref.: WARNING: /tmp: File system full, swap space limit exceeded
  http://docs.sun.com/app/docs/doc/805-5837/6j5gpcgb5?l=ja&a=view#msgs-880

- ref.: Not enough space
  http://docs.sun.com/app/docs/doc/805-5837/6j5gpcgas?l=ja&a=view#msgs-631

smpatch が Response code was 403 で終了する

  Solaris 10 で smpatch でアップデートしようとしても,Failure: Response code was 403 のメッセージを出力して終了してしまう件.

# smpatch analyze
Failure: Response code was 403

1. まず登録情報を一度削除する.

# cacaoadm stop
# cacaoadm status
# /usr/lib/cc-ccr/bin/eraseCCRRepository
# rm /var/scn/persistence/SCN*
# reboot

2. その後,再登録.

# cp /usr/lib/breg/data/RegistrationProfile.properties .
# vi RegistrationProfile.properties

userName=Sun Online のユーザ名
password=同パスワード

# sconadm register -a -r /tmp/RegistrationProfile.properties
sconadm is running
Authenticating user ...
Collecting asset ...
Registering asset ...
sconadm has been completed successfully

  以上で smpatch が再度使用可能になるはず.

- ref.: update tools: Response code 403 errors
  http://forum.java.sun.com/thread.jspa?threadID=5118256

PHP 4 の --enable-versioning はトラブルの元か?

  PHP 3 と PHP 4 を共存させる場合に,configure オプションに --enable-versioning を指定します.
  実はこれが思わぬ落とし穴になる場合があります.

  それは,DSO で拡張モジュールが動的にロードできないというものです.
  PHP 4.4.4 + Apache 1.3.37 on Solaris 10 x86 の環境なので,もしかしたら環境依存かもしれません.

  コンパイル・インストールはうまくいきますが,Apache を再起動すると以下のようなエラーが出ます.

- SQLite の場合

PHP Warning:  Unknown(): Unable to load dynamic library '/usr/local/lib/php/extensions/no-debug-non-zts-20020429/sqlite.so' - ld.so.1: httpd: fatal: relocation error: file /usr/local/lib/php/extensions/no-debug-non-zts-20020429/sqlite.so: symbol executor_globals: referenced symbol not found in Unknown on line 0

- Xdebug の場合

Failed loading /usr/local/lib/php/extensions/no-debug-non-zts-20020429/xdebug.so:  ld.so.1: httpd: fatal: relocation error: file /usr/local/lib/php/extensions/no-debug-non-zts-20020429/xdebug.so: symbol zend_compile_file: referenced symbol not found

  CLI 版では,全く問題なくロードできるので,原因が全然分かりませんでした.
  これらのエラーが出る場合は,--enable-versioning を外して PHP 4 を再コンパイルするとうまくいくと思います.

  もはや,PHP 3 を共存させることは皆無に等しいと思うので,--enable-versioning のことは忘れてしまったほうがよさそうです.

  参考までに --enable-versioning をマニュアルを見てみると,

--enable-versioning

   要求されるシンボルのみをエクスポートします。 詳細な情報は INSTALL を参照ください。
--enable-versioning

   Solaris 2.x および Linux が提供するバージョン管理機能を 有効にします。PHP 3 限定です!

  とあります.

- Configure オプション
  http://www.php.net/manual/ja/configure.php

- ref.: Blog::koyhoge - [PHP] --enable-versioningを止めるの巻
  http://d.hatena.ne.jp/koyhoge/20061213/1165999933

プロセスツリーを可視化する pstree

  http://d.hatena.ne.jp/lurker/20060927/1159329290

  これはいいかも.
  
  オプションが Linux にインストールされているのとは少し違うみたいです.
  PID はオプションをつけなくても表示されています.FreeBSD の ports でインストールされるのも同じもの.

- 出力例

-+= 00000 root sched
 \-+- 00001 root /sbin/init
   |--- 00114 daemon /usr/lib/crypto/kcfd
   |-+- 00486 root /usr/local/apache2/bin/httpd -k start
   | |--- 00646 httpd /usr/local/apache2/bin/httpd -k start
   | |--- 00647 httpd /usr/local/apache2/bin/httpd -k start
   | |--- 00564 httpd /usr/local/apache2/bin/httpd -k start
   | |--- 00563 httpd /usr/local/apache2/bin/httpd -k start
   | |--- 00565 httpd /usr/local/apache2/bin/httpd -k start
   | |--- 00566 httpd /usr/local/apache2/bin/httpd -k start
   | \--- 00567 httpd /usr/local/apache2/bin/httpd -k start
   |-+- 00422 root /usr/local/apache/bin/httpd
   | |--- 00446 httpd /usr/local/apache/bin/httpd
   | |--- 00444 httpd /usr/local/apache/bin/httpd
   | |--- 00445 httpd /usr/local/apache/bin/httpd
   | |--- 00447 httpd /usr/local/apache/bin/httpd
   | \--- 00448 httpd /usr/local/apache/bin/httpd
   |-+- 00328 root /usr/lib/ssh/sshd
   | \-+- 00650 root /usr/lib/ssh/sshd
   |   \-+- 00653 sunaoka /usr/lib/ssh/sshd
   |     \-+- 00655 sunaoka -zsh
   |       |--- 00826 sunaoka vim /home/sunaoka/ChangeLog
   |       \-+- 00827 sunaoka pstree -U
   |         \-+- 00828 sunaoka sh -c ps -ef
   |           \--- 00829 sunaoka ps -ef
   |--- 00333 smmsp /usr/lib/sendmail -Ac -q15m
   |-+- 00492 root /bin/sh /usr/local/mysql/3.23/bin/safe_mysqld --log --datadi
   | \--- 00556 mysqld /usr/local/mysql/3.23/libexec/mysqld --basedir=/usr/loca
   \-+- 00510 root /bin/sh /usr/local/mysql/4.1/bin/mysqld_safe --log --datadir
     \--- 00555 mysqld /usr/local/mysql/4.1/libexec/mysqld --basedir=/usr/local

- インストール

$ wget ftp://ftp.thp.uni-duisburg.de/pub/source/pstree-2.27.tar.gz
$ mkdir pstree-2.27
$ tar -zxvf pstree-2.27.tar.gz -C pstree-2.27
$ cd pstree-2.27
$ gcc -O2 -o pstree pstree.c
# cp -p pstree /usr/local/bin

Sun SSH では ServerAliveInterval が設定できない件

  NAT などの影響で一定時間通信がないと ssh 接続が固まったり,切れたりすることがあります.

  この対処法として OpenSSH の場合は,$HOME/.ssh/config などに

Host *
    ServerAliveInterval 60


  のようにして,60 秒ごとに無害なパケットを送信するようにします.

  さて,Solaris 9 あたりからバンドルされている Sun SSH も OpenSSH をベースにしているので,
  ServerAliveInterval が使える……と思ったのですがが,man ssh_config を見てもオプションは出てきませんし,
  実際に設定してみても,

/home/sunaoka/.ssh/config: line 35: Bad configuration option: ServerAliveInterval
/home/sunaoka/.ssh/config: terminating, 1 bad configuration options

  このようにエラーが出て起動できません.strings `which ssh` | grep -i ServerAliveInterval をしてみても,
  表示されませんので多分,実装されていないと思われます.

  対処法として,サーバ側で設定することができるのであれば ClientAliveInterval を sshd_config に設定してあげればいいようです.

ClientAliveInterval 60


  これで 60 秒ごとにサーバから確認用のパケットが送られてきます.
  とりあえず問題は解決したのですが,サーバ側の設定をできない場合は困りますね……

  また,参考までにベースとなった OpenSSH のバージョンを調べてみようとすると,

$ strings `which ssh` | grep OpenSSH
OpenSSH*
OpenSSH_3.6*,OpenSSH_3.7*,OpenSSH_3.8*
OpenSSH_3.2*,OpenSSH_3.3*,OpenSSH_3.4*,OpenSSH_3.5*
OpenSSH_2.*,OpenSSH_3.0*,OpenSSH_3.1*
OpenSSH_2.9p*
OpenSSH_2.5.3*
OpenSSH_2.5.0*,OpenSSH_2.5.1*,OpenSSH_2.5.2*
OpenSSH_2.5.0p1*,OpenSSH_2.5.1p1*
OpenSSH_2.3.*
OpenSSH_2.3.0*
OpenSSH-2.0*,OpenSSH-2.1*,OpenSSH_2.1*,OpenSSH_2.2*

  以上の結果からおそらく OpenSSH 3.8 ではないかと思われます.

Apache のログに大量の Network is unreachable が発生する

  Apache 2.2.3 on Solaris 10 で

[Fri Aug 11 16:05:35 2006] [warn] (128)Network is unreachable: connect to listener on [::]:80

  以上のようなエラーログが大量に発生する.

  原因は,IPv6 を有効にしていて (Solaris 10 のデフォルト) IPv6 のアドレスを設定していないこと.

  対策として,httpd.conf の Listend ディレクティブに IP アドレスを指定してあげる.

Listen 192.168.1.2:80


  これだけ.

  または,configure オプションに以下のように --disable-ipv6 を指定してあげても OK.

$ ./configure --disable-ipv6

syslog のプライオリティについて

  syslog のプライオリティは以下の図のようになっている.

  Syslog priority

  つまり,あるプライオリティを指定するとそれ以上のプライオリティがすべて記録される.
  例えば,err を指定すると,err,crit,alert,emerg が記録されることになる.

  ちなみに,Solaris にはすべてのプライオリティを指す `*' はないので注意.
  mail.* などと指定しても「unknown priority name "*"」と怒られます.

sodo のログを分離して保存する方法

  sudoers(4) を見ると,以下のような記述が見つかる.

    syslog      Syslog facility if syslog is being used for
                logging (negate to disable syslog logging).
                Defaults to local2.

  すなわち sodo のログはデフォルトで syslog のファシリティ local2 に送られるということ.

  また,プライオリティはというと,これも sudoers(4) には以下のように書いてある.

    syslog_goodpri
                Syslog priority to use when user authenticates
                successfully.  Defaults to notice.

    syslog_badpri
                Syslog priority to use when user authenticates
                unsuccessfully.  Defaults to alert.

  つまり,ユーザの認証が成功した場合は notice,失敗した場合は alert である.

  これを syslog.conf に設定してあげればいい.以下 Solaris 10 での例.

local2.notice        ifdef(`LOGHOST', /var/adm/sudolog, @loghost)


  ここでは,/var/adm/sudolog にログを出力するようにした.
  あとは,

# touch /var/adm/sudolog
# pkill -HUP syslogd

  で無事ログが出力される.

リバースプロキシを使って複数のバージョンの PHP,MySQL,Apache を共存させる方法

  PHP 3.x と PHP 4.x は --enable-versioning を configure オプションに加えるだけで,何も考えずに共存できました.
  ただ,PHP 5.x になってから PHP 4.x と共存するのは難しくなっています.

  サーバが一台しかないテスト環境などでは,これでは困る場合もあるわけです.

  そこで,Apache のリバースプロキシを使って複数のバージョンの PHP を共存させます.
  ついでに,複数の MySQL も共存させることにします.

  検証環境は Solaris 10 です.

  今回は php5.example.com にクライアントからアクセスがあったら

- Apache 2.2.2
- PHP 5.1.4
- MySQL 4.1.19

  の環境で動かすとこと,また,php4.example.com にクライアントからアクセスがあったら

- Apache 1.3.36
- PHP 4.2.2
- MySQL 3.23.58

  で動かすということにします.
  MySQL 3.23.58 という古い環境を使うのは,この環境が必要だからなので,適時違うバージョンに読み替えていただけるといいです.

  図にすると以下のようになります.

  共存

  まず,php4.example.com の環境から作ります.インストールはすべてソースから行っています.
  configure のオプションは最低限しかつけていないので,適時環境に合わせてオプションを設定してください.

- Apache 1.3.36

% ./configure --enable-module=most \
              --enable-shared=max
% make
# make install

  でインストールします.ServerRoot は /usr/local/apache になります.
  主な設定は,以下のようですが,ポイントはこの Apache はポート 81 番で動かすことです.

Listen 81
Port 80
ServerName php4.example.com


  Apache 1.3.x の場合は Listen ディレクティブが指定されている場合は,Port ディレクティブはサーバが listen するポートには影響しません.
  ただし,ここで 80 と指定するのは,サーバが自分自身を参照する URL を生成する時に Port ディレクティブを参照するからです.

  この設定をしないで Port 81 などとしてしまうと,http://php4.example.com/foo のように URL の最後に / を付け忘れた場合,サーバは,

http://php4.example.com:81/foo/

  このようににリダイレクト先を返してくるので,リダイレクトの処理がうまくいかないことになります.

- Listen ディレクティブ
  http://httpd.apache.org/docs/1.3/mod/core.html#listen

- Port ディレクティブ
  http://httpd.apache.org/docs/1.3/mod/core.html#port

  また,Apache 2.x の場合は,Port ディレクディブは ServerName ディレクティブに吸収されたので

Listen 81
ServerName php4.example.com:80


  のように指定してあげればいいと思います.

- MySQL 3.23.58

% ./configure --prefix=/usr/local/mysql/3.23
% make
# make install
# ln -s /usr/local/mysql/3.23/bin/mysql /usr/local/bin/mysql3

  MySQL のインストールのポイントは,prefix を /usr/local/mysql/3.23 のようにバージョンをつけていることです.
  これで,他のバージョンをインストールする場合は,/usr/local/mysql/x.x のように分けることができます.
  設定ファイルは,/usr/local/mysql/3.23/var/my.cnf に置くことができます.

  最後に,シンボリックリンクを張っているのは,mysql3 と楽にコマンドを打てるようにです.

- PHP 4.4.2

% ./configure --prefix=/usr/local/php/4.4 \
              --with-apxs=/usr/local/apache/bin/apxs \
              --with-mysql=/usr/local/mysql/3.23
% make
# make install
# ln -s /usr/local/php/4.4/bin/php /usr/local/bin/php4

  PHP も MySQL と同じように prefix をバージョンごとに指定しています.
  使用する MySQL のパスも忘れずに指定します.
  シンボリックリンクも MySQL と同じ理由で /usr/local/bin に張ることにします.

  この場合,php.ini は /usr/local/php/4.4/lib/php.ini になります.

  これで,まず一つ目の環境が完成です.


  次に二つ目の環境を作ります.

- Apache 2.2.2

% ./configure --enable-mods-shared=all \
              --enable-proxy
% make
# make install

  Apache 2.2.2 はこのようにインストールします.ServerRoot は /usr/local/apache2 になります.
  リバースプロキシを利用するので --enable-proxy が必要になります.
  もし,また違うバージョンの Apache が必要な場合は prefix で適当なパスを指定すればいいです.

  設定のポイントは,まずこの Apache はポート 80 番で動かすことです.

Listen 80
ServerName php5.example.com:80


  そして,重要なのは,名前ベースのバーチャルホストとリバースプロキシの設定をすることです.

NameVirtualHost *

<VirtualHost *>
    ServerName php5.example.com
</VirtualHost>

<VirtualHost *>
    ProxyPreserveHost On
    ProxyPass         / http://localhost:81/
    ProxyPassReverse  / http://localhost:81/
    ServerName        php4.example.com
</VirtualHost>


  これで,php5.example.com でアクセスされた場合は,Apache 2.x が処理をして,
  php4.example.com でアクセスされた場合は 81 番ポートで動いている Apache 1.x にわたして処理をさせることができます.

- MySQL 4.1.19

% ./configure --prefix=/usr/local/mysql/4.1 \
              --with-unix-socket-path=/tmp/mysql-4.1.sock \
              --with-tcp-port=3308
% make
# make install
# ln -s /usr/local/mysql/4.1/bin/mysql /usr/local/bin/mysql4

  MySQL のインストールのポイントは,3.23.58 と同様に prefix にバージョンをつけていることです.
  また,UNIX Socket のファイルも /tmp/mysql-4.1.sock のように変更していて,ポート番号も 3308 に変更しています.
  設定ファイルは /usr/local/mysql/4.1/var/my.cnf になります.
  mysql4 としてシンボリックリンクも張っています.

- PHP 5.1.4

% ./configure --prefix=/usr/local/php/5.1 \
              --with-apxs2=/usr/local/apache2/bin/apxs \
              --with-mysql=/usr/local/mysql/4.1 \
              --with-pdo-mysql=/usr/local/mysql/4.1 \
% make
# make install
# ln -s /usr/local/php/5.1/bin/php /usr/local/bin/php5

  これまでと同様に prefix にバージョンに指定しています.
  使用する MySQL のパスも忘れずに指定します.シンボリックリンクも張っています.
  php.ini は /usr/local/php/5.1/lib/php.ini になります.


  テストするためにわざわざ DNS に登録する必要はなく,hosts ファイルに書いてしまえばいいです.
  例えば,サーバの IP アドレスが 192.168.1.2 ならば,クライアントの hosts ファイルに

192.168.1.2    php4.example.com    php5.example.com

  このように書いてあげればすぐ使えるようになります.


  以上のようにして,PHP,MySQL の複数のバージョンが共存する環境を手に入れることができます.
  ちょっと面倒ですが,ひとつのサーバしかなくて困っている場合は有効な手段だと思います.

- <VirtualHost> ディレクティブ
  http://httpd.apache.org/docs/2.2/ja/mod/core.html#virtualhost

- バーチャルホストの例 - Apache HTTP サーバ
  http://httpd.apache.org/docs/2.2/ja/vhosts/examples.html