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

0 件のコメント:

コメントを投稿

お気軽にコメントをお寄せください m(_ _)m♪
"コメントの記入者"欄から[名前/URL]を選ぶと、登録なしでコメント投稿していただけます。