2012/01/15

USVNにTracインストール機能を無理やりつけてみる


結局、Subversionのウェブ管理インターフェースは、
方針を変え、USVN(http://www.usvn.info/)を利用することにしました。
(インストールしたバージョンは最新版の1.0.5。)
私以外...複数人でのソフトウェア開発に利用したいと考えているので、
SVNについてもWebブラウザから利用できるインターフェースは必須なのです。

で・・・今回は、そこにTracも使いたいというお話です。
(SubminはTracとの連携に対応していますが、
USVNはTracに関しては特に連携などは一切考えられていないようです。)


結果から出すとこんな感じになりました。
プロジェクト管理画面のアクション欄に、ボタンが一つ増えています。
(プラスマークのボタンを押すと、Tracプロジェクトを作成。
 既にプロジェクトがある場合は、フォルダアイコンが表示されます。)
USVN 1.0.5 (なんちゃってTracインストール機能追加版w)
Tracは、インタアクトによる日本語版を導入させていただきました。
(執筆時点の最新版は、Trac-0.12.2.ja1)
http://www.i-act.co.jp/project/products/products.html
$ wget http://www.i-act.co.jp/project/products/downloads/Trac-0.12.2.ja1.zip
$ unzip Trac-0.12.2.ja1.zip
$ cd Trac-0.12.2.ja1
$ python ./setup.py install
こういう変更をした...という備忘録のために...
以下の通り、記録しておきます。
(今回は、記録が一番の目的のため、詳しいコメントなどは記載していません m(__)m)


念の為、言い訳と前置きを(><;)
  • 今回、思いっきり(<適当に手当り次第に>)、USVNのPHPスクリプトを弄っています。
    (USVNのバージョン:1.0.5)
  • 環境:
    • USVNのパス: /var/usvn
    • Subversionリポジトリのパス: /var/svn
  • 弄るにあたって、APIドキュメントなど資料はサーバが落ちているのかアクセスできず、情報を得られませんでした。
  • 幸い、モデル化がきちんと行われており構造がわかりやすく、拡張を考えた作りになっていました。
  • 但し、PHPは未だ...まともにコードを書いたことがなく、
    当然...使われているフレームワーク(有名なZend...)も殆ど知識がなく、
    さらに悪いことに...作業を急いでいるために、(おっと...言い訳ばっかりだwww)
    今回はじっくり時間をかけてソースコードを読んで...とは行けず
    ...ある意味"やっつけ"です。
  • モデルに...全然なってません。パラメータ...ベタ打ちラララ♪ですww(笑)
  • 文字列のローカライズ...やってません(といってもリンクくらいだけど)
  • 以上の点の理由もふくめて、このページのコードの動作や、記載内容を実行した結果について、
    一切保証できません。(責任も負えません。あしからず。)
  • そういうわけで、恐らく・・・随分ひどい書き換えになっていますww今回については...どうか目をつぶってやってください(^^;)) (←←
    (また機会があれば...もっとちゃんとTracと連携する機能もつけてみたいな...と思ったりしてます。(お?←)

では...USVNのプロジェクト管理画面に
Tracプロジェクトを作成するためのリンクを設けていきます。

<USVNのディレクトリ>/library/USVN/Project.php:
getTracPath、getTracURL、installTracというメソッドを追加しています。

        public static function getTracPath($project_name)
        {
                $tracdir = Zend_Registry::get('config')->trac->path.DIRECTORY_SEPARATOR.$project_name;
                if(is_dir($tracdir)){
                        return $tracdir;
                }else{
                        return NULL;
                }
        }

        public static function getTracURL($project_name)
        {
                $tracdir = Zend_Registry::get('config')->trac->path.DIRECTORY_SEPARATOR.$project_name;
                if(is_dir($tracdir)){
                        return Zend_Registry::get('config')->trac->url.$project_name;
                }else{
                        return NULL;
                }
        }

        public static function installTrac($project_name)
        {
                $table = new USVN_Db_Table_Projects();
                $project = $table->fetchRow(array('projects_name = ?' => $project_name));
                if ($project === null) {
                        throw new USVN_Exception(T_("Project %s doesn't exist."), $project_name);
                }
                if (!is_null(USVN_Project::getTracPath($project_name))) {
                        throw new USVN_Exception(T_("Trac was already installed in project %s ."), $project_name);
                }
                $arg = "";
                $res = 0;
                $cmd = 'sudo ' . Zend_Registry::get('config')->trac->tracadminscriptpath . " '".$project_name."'";
                exec($cmd, $arg, $res);
                return $res;
        }

<USVNのディレクトリ>/app/controllers/ProjectadminController.php:
installtracActionメソッドを追加しています。

        public function installtracAction()
        {
                USVN_Project::installTrac(str_replace(USVN_URL_SEP, '/', $this->getRequest()->getParam('name')));
                $this->_redirect("/admin/project/");
        }

<USVNのディレクトリ>/app/views/scripts/projectadmin/index.phtml:
プロジェクト管理画面に、Tracのインストールリンクを追加します。(尚、インストール済みなら、Tracを表示させるリンクに切り替わります。)
<?= $this->ACLLink($project->name) ?>
という記述がありますので、これの下あたりにでも、
<?= $this->tracLink('name', $project->name, $tracLinkText) ?>
を記述します。

<USVNのディレクトリ>/app/helpers/TracLink.php:
リンクを出力するコードです。
<?php
class USVN_View_Helper_TracLink {
    public function tracLink($param, $name, $confirmText)
    {
        $tracURL = USVN_Project::getTracURL($name);
        $front = Zend_Controller_Front::getInstance();
        $view = Zend_Controller_Action_HelperBroker::getExistingHelper('viewRenderer')->view;
        if(is_null($tracURL)){
                $confirmText = "Do you really install the Trac for this project?";
                $img = $view->img("add.png", 'Install Trac');
                return $view->urlConfirm(array('action' => 'installTrac', $param => $name),  $img, sprintf($confirmText, $name));
        }else{
                $img = $view->img("folder.png", "Access to trac.");
                return '<a href="' . $tracURL. '">' . $img .'</a>';
}
    }
}
<USVNのディレクトリ>/config/config.ini:
一応、Tracのパス、URLなどの設定をconfig.iniで行うようにしています。
trac.path = "/var/trac/"
trac.url = "http://example.com/trac/"
trac.tracadminscriptpath = "/var/usvn/trac-project-make.sh"
書き換えはこんなところです。
(1画面にボタンをつけたくらいで、何か他に画面をつけたわけでもないので・・・少ないです。)

ところで・・・trac-adminでプロジェクトを作成するのって、
sudoしないといけないんですね(汗;)

Apacheの実行権限だけで行けるんじゃないかと思ってたのですが、ダメでしたw
...ということで・・・
Apacheを動作させているユーザアカウントから
sudoをできるようにしてみたいと思います。
つまり、PHPスクリプトなどからsudoを実行できるようにします。
(もちろん、sudoをApacheから実行できることについて、セキュリティ上の懸念は大いにあります。
今回、最低限対策はしますが、sudoをできてしまうことは当然、少なからず安全性が下がります
実際に同じようなことをされる場合は、十分理解している場合にのみ行なってください。
もちろん、私は一切の責任を負えません。あしからず。)


ということで・・・Tracプロジェクトを作成するための
シェルスクリプトを作成します。
(これをUSVNからsudoをつけて実行させます。USVNと同じディレクトリに保存しておきます。)
# cd /var/usvn/
# touch trac-project-make.sh
# vi trac-project-make.sh   
#! /bin/sh
PROJECTNAME=`echo $1 | sed -e "s/[^0-9a-zA-Z\-\_]*//g"`
/usr/local/bin/trac-admin /var/trac/$PROJECTNAME initenv $PROJECTNAME sqlite:db/trac.db svn /var/svn/$PROJECTNAME
chown apache:apache /var/trac/$PROJECTNAME/ -R 
(1行目はシェルのパス、2行目がパラメータの処理、
3行目でtrac-adminを実行してプロジェクトを作り、
4行目でそのパーミッションを調整しています。)


作成したスクリプトは所有者を変更してApache用のユーザに。実行権限もつけます。
# chown apache:apache trac-project-make.sh
# chmod apache u+x
 次にvisudoコマンドを実行して、sudoを実行できるユーザの定義を追加します。
# visudo
具体的には末尾に以下のような行を追加します:

apache ALL = NOPASSWD: /var/usvn/trac-project-make.sh
Defaults:apache !requiretty
(こうすることで、端末を持たないApache向けユーザ"apache"にパスワード無しでのsudoを許すものの、
先程作成したスクリプト以外にはsudoが使えないようになります。これは最低限の安全策です。)

Tracの認証は、Apacheへの設定ファイルによりこんな感じに。
(ちょうど、USVNがhtpasswdファイルを作ってくれますのでそれを利用。)
<Location /trac>
   SetHandler mod_python
   PythonHandler trac.web.modpython_frontend
   PythonOption TracEnvParentDir /***/
   SetEnv PYTHON_EGG_CACHE /var/www/.egg-cache
</Location>
<locationMatch "/[[:alnum:]]+/login">
   AuthType Basic
   AuthName "Trac authorization."
   AuthUserFile /****/.htpasswd
   Require valid-user
</locationMatch>
以上となります。

追記: USVNでsvnコマンドのパスが通っていない問題は
(CentOSの場合) /etc/sysconfig/httpd に
PATHを記述する。http://d.hatena.ne.jp/masahi6/20090720/1248081907

2012/01/08

さくらのVPSへSubversion1.7.2+Submin2.0.2を導入


さくらのVPS(CentOS 5.7 final)に、
Subversion1.7.2と、Submin2.0.2を導入してみました。

■この記事の内容は、Masanoriのメモ帳へまとめました:
さくらインターネット/さくらのVPSのメモ - Masanoriのメモ帳

以下は右往左往しながら試した結果です(^^;)
ライブラリなどのパスはそれぞれ環境によって異なる場合もあるかと思いますので
参考程度にしてください。
また、細かいところ、もっと色々つまづいたのですが...それは端折ってます((>ω<;)

[補足]
  • Apache: 2.2.21
  • さくらのVPSにはデフォルトでPython 2.4がインストールされていますが、
    これでは古いので、こちらのとおり Python 2.7をソースからビルドし、
    /usr/local/bin/python2.7/ へインストールして共存させている環境です。
まず、前準備としてライブラリをyumでインストール。
$ sudo yum install swig openssl-devel libtool python-devel
SQLiteも入れておく。記事執筆時の最新版です。
$ cd ~
$ wget  http://www.sqlite.org/sqlite-autoconf-3070900.tar.gz
$ tar vxf sqlite-autoconf-3070900.tar.gz
$ cd sqlite-autoconf-3070900
$ ./configure
$ make
$ sudo make install
$ cd ..
Subversionをインストールします。(2011/12/29 現在最新版:1.7.2)
尚、Subversionの古いバージョンがインストールされている場合は、yum eraseで削除しておきます。
$ cd ~
$ wget http://ftp.kddilabs.jp/infosystems/apache/subversion/subversion-1.7.2.tar.bz2
$ tar vxf subversion-1.7.2.tar.bz2
$ cd subversion-1.7.2
$ ./configure  \
> --prefix=/usr/local/svn \
> --with-apxs=/usr/sbin/apxs \
> --with-apr=/usr/bin/apr-1-config \
> --with-apr-util=/usr/bin/apu-1-config \
> --with-neon=/usr/include/neon \
> --with-swig=/usr/bin/swig --without-jdk
$ make
$ make install
次に、SubversionのPython用モジュールをビルドしてインストールします。
$ make swig-py
$ sudo make install-swig-py
これに、Python2.7のライブラリディレクトリ上へシンボリックリンクを張ります。
$ sudo ln -s /usr/local/lib/svn-python /usr/local/lib/python2.7/site-packages/svn-python
$ sudo ln -s /usr/local/lib/svn-python/svn /usr/local/lib/python2.7/site-packages/svn
$ sudo ln -s /usr/local/lib/svn-python/libsvn /usr/local/lib/python2.7/site-packages/libsvn
次に、Subversionの初期設定。
リポジトリ用のディレクトリを作成し、リポジトリを作ります。
ディレクトリの権限の設定も。

$ sudo mkdir /var/svn
$ sudo chown -R apache:apache /var/svn
$ svnadmin create /var/svn/test

次に、WSGI(mod_wsgi)のインストール。
ここではmod_wsgi 3.3をインストールします。
$ cd ~
$ wget http://modwsgi.googlecode.com/files/mod_wsgi-3.3.tar.gz
$ tar vxf mod_wsgi-3.3.tar.gz
$ cd mod_wsgi-3.3
$ ./configure --with-apxs=/usr/sbin/apxs --with-python=/usr/local/bin/python2.7
$ make
$ sudo make install

次に、共有ライブラリのパスを設定
$ sudo vi /etc/ld.so.conf
”/usr/local/lib ”を追加しておきます。記述しました。
include ld.so.conf.d/*.conf
/usr/local/lib
次に、mod_pythonのインストール
mod_pythonが既に2.4に向けて入っていたのですが、これをインストールし直します。
$ wget http://archive.apache.org/dist/httpd/modpython/mod_python-3.3.1.tgz
$ tar vxf mod_python-3.3.1.tgz
$ cd mod_python-3.3.1
$ ./configure --with-apxs=/usr/sbin/apxs
$ make
$ sudo make install
そして、Submin2のインストール。最新版のSubmin2.0.2。
$ wget http://supermind.nl/submin/current/submin-2.0.2.tar.gz
$ tar zxvf submin-2.0.2.tar.gz
$ cd submin-2.0.2
$ sudo python setup.py install
続いて、Submin2の初期設定を行ないます
submin2-adminを用いて、/var/lib/subminに対して環境を作成します。
このとき入力するメールアドレスは、パスワードリセットに使うらしく、
後から変更もできるのでとりあえず正しいものを。
$ sudo python submin2-admin /var/lib/submin initenv your@email.address
 Please provide a location for the Subversion repositories. For new Subversion
repositories, the default setting is ok. If the path is not absolute, it will
be relative to the submin environment. If you want to use an existing
repository, please provide the full pathname to the Subversion parent
directory (ie. /var/lib/svn).
Path to the repository? [svn]> /var/svn //Subversionのリポジトリパスを入力
Please provide a location for the git repositories. For new git repositories,
the default setting is ok. If the path is not absolute, it will be relative to
the submin environment. If you want to use an existing repository, please
provide the full pathname to the git parent directory (ie. /var/lib/git).
Path to the git repositories? [git]>
Please provide a location for the parent dir of Trac environments. For a new
installation, the default setting is ok. If you don't want to use Trac, the
default setting is also ok. For existing Trac environments, please provide
the full path.
Path to trac environment? [trac]>
Please provide a hostname that can be used to reach the web interface. This
hostname will be used in communication to the user (a link in email, links
in the web interface).
Hostname? [~~]> example.com //ホスト名を入力
The HTTP path tells Submin where the website is located relative to the root.
This is needed for proper working of the website. Submin will be accesible
from <http base>/submin, Subversion will be accessible from <http base>/svn.
If you use Trac, it will be accessible from <http base>/trac.
HTTP base? [/]>
Apache file created: /var/lib/submin/conf/apache.cgi.conf
   Please include this in your apache config. Also make sure that you have
   the appropriate modules installed and enabled. Depending on your choices,
   these may include: mod_dav_svn, mod_authz_svn, mod_wsgi, mod_dbd,
   mod_authn_dbd and mod_python

Apache file created: /var/lib/submin/conf/apache.wsgi.conf
   Please include this in your apache config. Also make sure that you have
   the appropriate modules installed and enabled. Depending on your  choices,
   these may include: mod_dav_svn, mod_authz_svn, mod_wsgi, mod_dbd,
   mod_authn_dbd and mod_python 

さらに、Apacheの設定(httpd.conf)で...
次のモジュールをLoadModuleさせます:
mod_dav_svn, mod_authz_svn, mod_wsgi, mod_dbd, mod_authn_dbd and mod_python

これで準備完了か・・・ということで、
http://****/submin/submin.cgi へブラウザからアクセス・・・。

が、500エラー
Apacheのエラーログ:

 [Fri Dec 30 01:41:45 2011] [error] [client ***.***.**.**] ImportError: No module named submin.dispatch.cgirunner
 [Fri Dec 30 01:41:45 2011] [error] [client ***.***.**.**] Premature end of script headers: submin.cgi
submin.dispatch.cgirunnerがロードできていないそうで。

確認のため、
/var/lib/submin/cgi-bin/submin.cgi
直接実行すると、ちゃんと実行される。(エラー画面のHTMLが出力される)

となると...Apache側で実行している設定がおかしいのか。
/var/lib/submin/cgi-bin/submin.cgiを書き換える。

# vi /var/lib/submin/cgi-bin/submin.cgi

もう・・・この際なんで適当にw
#!/usr/bin/env python
import sys
print print "Content-Type:text/html; charset=UTF-8\n\n"
print sys.path
sys.exit()
としてしまう。

そして、再度アクセス・・・

['/usr/lib/python2.4/site-packages/Genshi-0.6-py2.4.egg',
 '/usr/lib/python2.4/site-packages/Trac-0.11.6.ja1-py2.4.egg', '/usr/lib64/python24.zip', '/usr/lib64/python2.4', '/usr/lib64/python2.4/plat-linux2',
 '/usr/lib64/python2.4/lib-tk', '/usr/lib64/python2.4/lib-dynload', '/usr/lib64/python2.4/site-packages',
 '/usr/lib64/python2.4/site-packages/Numeric', '/usr/lib64/python2.4/site-packages/gtk-2.0', '/usr/lib/python2.4/site-packages']
・・・はい。そうですか...そうですか...www
python2.4のほうを・・・。PATHも設定したはずなのにね。

というわけで、Apacheが渡す環境変数の値(env)をどうにかすべきなんだろうけども...
(ちなみにApacheは、suからservice httpd startで実行させてる)
...面倒くさいので、とりあえず、
# vi /var/lib/submin/cgi-bin/submin.cgi
submin.cgiを次のように書きかえてしまう。pythonのパスを直接指定。
#!/usr/local/bin/python2.7
from submin.dispatch.cgirunner import run
run() 
そして、http://****/submin/submin.cgi へ再度、ブラウザからアクセス・・・。

・・・お。

Wordpressから移行しました

このたび、「Masanoriのプログラミング日誌」を
Wordpressから、こちらのBloggerへ移行し、
同時にタイトルも「Masanoriのプログラミング日誌++」と変更しました(^^)/
(ちなみにその前は、NINJAブログに置いていました。(2007年開設)
今回の移転の理由は、以前の記事からかなりブランクが開いてしまっていたこと、
あらためて日誌を書く動機ができたこと、Bloggerを本格的に使いたかったこと...などなどですw
さすがに3回目...そろそろ落ち着かなければ(笑))

旧ブログ: http://masanoriprog.wordpress.com
(その前: http://masanoriprog.blog.shinobi.jp/ )

尚、このブログへ投稿した内容は、
まとめた上で、Masanoriのメモ帳へ掲載することがあることを断っておきます。

以前の開発中心の記事から、Windows、CentOSによるサーバ管理などにも
記事の範囲を広げていき、しっかりと投稿していきたいと思っています。
このブログが、私と同じく勉強中の方のお役に少しでも立つことができたら幸いです。
また、アドバイス等々いただけましたら大変有り難いです m(_ _)m