March 2017  |  01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31

スポンサーサイト

一定期間更新がないため広告を表示しています

CentOS 5.xに mercurial と hgweb のインストール

JUGEMテーマ:コンピュータ

最近使っていて、ローカルコミットができて便利な mercurial(Hg)
(チュートリアルはこちら
http://mercurial.selenic.com/wiki/JapaneseTutorial )

自分の管理するサーバにもインストールしてみようと思い、Web検索をすると、「Mercurial/TortoiseHGの使い方・リポジトリサーバの立て方」なんて、TortoiseHGというWindowsクライアントからも使えて便利そうなタイトルのサイトがみつかった。

さっそくインストールをしてみたわけだが、/var/hg/test/repos にレポジットリを作成して、Webアクセスインターフェースを/var/hg/test/index.cgiで設定するという感じ。

うーむ。複数のレポジットリを簡単に扱えないかなあと、再びWeb検索してみると、「Publishing Mercurial Repositories」になんかありそう、結局mercurialのソースアーカイブにhgwebdir.wsgiなるものが含まれているということわかり、「Apacheとmod_wsgiでMercurialのリポジトリを提供する」というmod_wsgiの文書が見つかった。
mod_wsgiを使えばApache httpdのモジュールとして実行できるので、処理も少し速くなりそうと、hgweb.cgi から hgwebdir.wsgiに変更してみた。こちらの設定は、バーチャルホストにしてhgwebdir.wsgiの設定ファイルでリポジトリの親ディレクトリを指定するだけ。あとは、そのディレクトリの下に複数のレポジットリを作成できて、アクセスもできるというので簡単。はいおしまいなのだが、さて、認証をどうしようかと立ち往生ってしまった。
考えてみると、おやつ程度に借りているVPSサーバではメモリーが少なくて、デーモンにメモリを捧げてしまうと、返って処理が遅くなりそうな感じ。最近、端末アクセス中にハングアップしたのかと思うくらいしばらく停止してしまう。


そんなわけで、結局、cgiに戻すことにした。最初に試したサイトに紹介されていたように、ベーシック認証なら、htpasswd.php (http://www.nurs.or.jp/~sho/scripts/php/htpasswd/)でパスワード管理もできるので便利である。
ついでに、cgiでディレクトリを扱えるdayflowerさんのスクリプトも発見。
http://d.hatena.ne.jp/dayflower/20080226/1204013008


そんなわけで、最終的には以下のようなインストール手順になったはず。



 まず、pythonは少し新し目の2.6が用意されていたのでpython26 python26-develをインストール。easy_install はpython26-distributeにあるらしい。gccもない場合はインストールする。

$sudo yum install gcc python26 python26-devel python26-distribute

最近は便利になって、スクリプト系言語のパッケージがコマンド一発でインストールできる。mercurialも例外ではない。

$sudo easy_install-2.6 mercurial

mercurialのインストールは以上。

さっそくレポジットリを作って、Webインターフェースをセットアップするのだが、うちのは、 /var/lib/hg/repos/の下にレポジットリをつくり、Webインターフェースは、/var/www/hg/repos/の下に同名の名前のサブディレクトリを作ることにした。


レポジットリの作成。ここでは、reposという名前を使っている。

$sudo mkdir -p  /var/lib/hg/repos

$sudo hg init  /var/lib/hg/repos


そして、Webインターフェースのためのhgrcの設定。

$sudo cat>/var/lib/hg/repos/.hg/hgrc<<EOF
[web]
push_ssl = false
allow_push = *
EOF

$sudo chown -R apache /var/lib/hg/repos


本当は、SSLを有効のままにしておくべきなのだが、ここでは割愛。


つぎに、Webインターフェースを設定。無駄なようだが、レポジットリの独立性を高めるためにレポジットリ毎に index.cgi を設置する。


$sudo mkdir -p  /var/www/hg/repos

$sudo cat >/var/www/hg/repos/index.cgi<<EOF
#!/usr/bin/python2.6
import os
os.environ["HGENCODING"] = "UTF-8"
import cgitb
cgitb.enable()
from mercurial import demandimport; demandimport.enable()
from mercurial.hgweb.hgweb_mod import hgweb
import mercurial.hgweb.wsgicgi as wsgicgi
wsgicgi.launch(hgweb("/var/lib/hg/repos", "my repository"))
EOF

$sudo chmod 755 /var/www/hg/repos/index.cgi



Apache httpdの設定

$sudo cat >/etc/httpd/conf.d/hg.conf<<EOF
Alias /hg /var/www/hg
<Directory "/var/www/hg">
    AllowOverride All
    Options -Indexes +ExecCGI
    AddType application/x-httpd-cgi .cgi .pl
    DirectoryIndex index.html index.cgi index.php
</Directory>
EOF



Webインターフェースのアクセス制御

$sudo cat >/var/www/hg/repos/.htaccess<<EOF
Order deny,allow
Deny from all
Allow from all
#SSLRequireSSL
AuthType        Basic
AuthName        "Login for Hg"
AuthUserFile    "/var/www/hg/.htpasswd"
Require user user1 user2
EOF




管理用インターフェースへのアクセス制御

$sudo cat >/var/www/hg/.htaccess<<EOF
Order deny,allow
Deny from all
Allow from all
#SSLRequireSSL
AuthType        Basic
AuthName        "Login Admin"
AuthUserFile    "/var/www/hg/.htpasswd"
Require  user   admin
EOF



管理用パスワードの設定

$sudo echo secret | htpasswd -c /var/www/hg/.htpasswd admin

$sudo chown apache /var/www/hg/.ht*


パスワード管理インターフェースのインストール

$ wget -O htpasswd.zip  http://www.nurs.or.jp/~sho/scripts/download.php¥?htpasswd.zip
$ unzip htpasswd.zip
$sudo nkf -wd htpasswd.php | sed -e 's/<?=/<?php echo/' -e 's/charset=shift_jis/charset=utf-8/' > /var/www/hg/htpasswd.php
$ rm htpasswd.zip


ついでに、dayflowerさんのディレクトリを扱えるスクリプトも管理者向けに設置。

$sudo cat >/var/www/hg/index.cgi<<EOF
#!/usr/bin/python2.6
# ref. http://d.hatena.ne.jp/dayflower/20080226/1204013008
import os
os.environ['HGENCODING'] = 'UTF-8'

import mercurial.hg as hg
from mercurial.ui import ui
from mercurial.hgweb.hgweb_mod import hgweb
from mercurial.hgweb.hgwebdir_mod import hgwebdir
from mercurial.hgweb.request import wsgiapplication

def listdir_dironly(base_dir):
    results = []    # prepare for failure
    for root, dirs, files in os.walk(base_dir):
        results = map(lambda d: os.path.join(root, d), dirs)
        dirs[:] = []
    results.sort()
    return results

def get_repo_for_path(path):
    return hg.repository(ui(interactive=False,
                            report_untrusted=False),
                         path=path)

def isrepo(path):
    if False:   # too redundant
        try:
            get_repo_for_path(path)
            return True
        except hg.RepoError:
            return False
    else:
        return os.path.isdir(os.path.join(path, '.hg'))

def make_hgweb_maker(path):
    return lambda: hgweb(path, os.path.split(path)[1])
    #return lambda: hgweb(get_repo_for_path(path))

def make_hgwebdir_maker(path):
    dirs = listdir_dironly(path)
    repos = [(os.path.split(dir)[1], dir) for dir in dirs]
    return lambda: hgwebdir(repos)

def hgweb_wsgiapp(path):
    if isrepo(path):
        return wsgiapplication(make_hgweb_maker(path))
    else:
        return wsgiapplication(make_hgwebdir_maker(path))

# for CGI
if os.environ.get('GATEWAY_INTERFACE', '').startswith('CGI/'):
    import cgitb
    cgitb.enable()

    import mercurial.hgweb.wsgicgi as wsgicgi
    wsgicgi.launch(hgweb_wsgiapp('/var/lib/hg'))
EOF

$sudo chmod +x /var/www/hg/index.cgi

スポンサーサイト

pagetop