CVS サーバの構築

FreeBSD で標準で使える CVS をサーバとして動かすメモ。

前提

  • inetd 経由ではなく、 daemontools + tcpserver で起動
  • daemontools はすでにインストール済み

アクセス方法

  • 内部アクセス
    • tcpserver でプライベートネットワーク内のアクセスのみ許可
  • 外部アクセス
    • SSH を使用

サービス名の確認

/etc/services でサービス名とポートを関連付けられているかどうか確認します。

# grep cvspserver /etc/services
cvspserver	2401/tcp   #CVS network server
cvspserver	2401/udp   #CVS network server

ユーザの作成

CVS サーバのグループとユーザを作成します。

# pw groupadd -n cvsps
# pw useradd -n cvsps -c "CVS network server" -d /nonexistent -g cvsps -h - -s /sbin/nologin
# pw useradd -n cvspslog -c "CVS network server logging" -d /nonexistent -g cvsps -h - -s /sbin/nologin

リポジトリの作成

リポジトリを格納するディレクトリの作成と初期設定を行います。

# mkdir -p /usr/local/var/cvsroot
# cvs -d /usr/local/var/cvsroot init
# chmod g+w /usr/local/var/cvsroot
# chgrp -R cvsps /usr/local/var/cvsroot

起動ディレクトリの作成

/usr/local/var/cvs 以下に必要ディレクトリとファイルを作成します。

# mkdir -p /usr/local/var/cvspserver/log/main
# touch /usr/local/var/cvspserver/log/status
# chown cvspslog:cvsps /usr/local/var/cvspserver/log/status
# chown cvspslog:cvsps /usr/local/var/cvspserver/log/main
# chmod +t /usr/local/var/cvspserver

アクセス権限の設定

passwd ファイルを用いる事によって、リポジトリにアクセス権限を設定できます。
passwd ファイルを作成するには、 Apache をインストールする時に付属している htpasswd で作成する事ができます。

初回作成時には -c オプションを付けて実行します。

# htpasswd -c /usr/local/var/cvsroot/CVSROOT/passwd ユーザ名

次回以降は -c 付けないで実行します。

# htpasswd /usr/local/var/cvsroot/CVSROOT/passwd ユーザ名

ユーザを作成したら、リポジトリを操作するユーザと関連付ける為 passwd ファイルを編集します。
今回は cvsps ユーザを作成したので ユーザ名:パスワード:cvsps のように、 :cvsps を追記します。

# vi /usr/local/var/cvsroot/CVSROOT/passwd

user:pass:cvsps
anonymous::cvsps

また、 anonymous ユーザは読み取り専用でチェックアウトできるようにします。

# vi /usr/local/var/cvsroot/CVSROOT/readers

anonymous

アクセス制御データベースの作成

tcpserver 経由でプライベートネットワーク内のアクセスのみ許可する場合に必要となるのがアクセス制御データベースです。
アクセス制御データベースを作成するには tcprules を使用します。

下記の設定は 127.0.0.1192.168.1.0/24 のアクセスは許可し、それ以外からのアクセスは拒否する設定になります。

# mkdir -p /usr/local/etc/tcpserver/cvspserver
# cd /usr/local/etc/tcpserver/cvspserver
# vi rules

192.168.1.:allow
127.0.0.1:allow
:deny

# tcprules cvspserver.cdb cvspserver.tmp < rules

シェルスクリプトの作成

起動用シェルスクリプトを作成します。

# vi /usr/local/var/cvspserver/run

#!/bin/sh
ulimit -c 0
exec env - \
setuidgid cvsps \
/usr/local/bin/tcpserver -vHRD -l0 -c 10 \
	-x /usr/local/etc/tcpserver/cvspserver/cvspserver.cdb \
	0 cvspserver /usr/bin/cvs -f \
	--allow-root=/usr/local/var/cvsroot \
	pserver 2>&1

ログ管理用シェルスクリプトを作成します。

# vi /usr/local/var/cvspserver/log/run

#!/bin/sh
exec setuidgid cvspslog multilog t ./main

実行権限を付与します。

# chmod 755 /usr/local/var/cvspserver/run
# chmod 755 /usr/local/var/cvspserver/log/run

CVS サーバの起動

シンボリックリンクを張ります。

# ln -s /usr/local/var/cvspserver /var/service/.

svcstat で CVS サーバが起動しているか確認します。

# svstat /var/service/cvspserver
/var/service/cvspserver: up (pid 577) 131 seconds
# svstat /var/service/cvspserver/log
/var/service/cvspserver/log: up (pid 580) 149 seconds

ps で CVS サーバが起動しているか確認します。

# ps -auxww | grep cvs

root     67452  0.0  0.0  1324   500  ??  I    11:14PM   0:00.00 supervise cvspserver
cvsps    67454  0.0  0.1  3064   760  ??  I    11:14PM   0:00.01 tcpserver -vHRD -l0 -c 10 -x /usr/local/etc/tcpserver/cvspserver/cvspserver.cdb 0 cvspserver cvs -f --allow-root=/usr/local/var/cvsroot pserver
cvspslog 67455  0.0  0.0  1332   500  ??  I    11:14PM   0:00.00 multilog t ./main

チェックアウトとコミット

CVS リポジトリからチェックアウト、ファイルを編集してコミットしてみます。

# mkdir work && cd work
# setenv CVSROOT :pserver:ユーザ名@localhost:/usr/local/var/cvsroot
# cvs login
# cvs co .
# cat CVSROOT/config | sed -e s/#SystemAuth=no/SystemAuth=no/ > CVSROOT/config.tmp
# mv CVSROOT/config.tmp CVSROOT/config
# cvs ci -m "Disable system authentication"
# cvs logout

anonymous でチェックアウト

anonymous でチェックアウトしてみます。

# setenv CVSROOT :pserver:anonymous@localhost:/usr/local/var/cvsroot
# cvs login
# cvs co .
# cvs logout

ログの確認

ログファイルをチェックしてみます。

# cat /var/service/cvspserver/log/main/current | tai64nlocal

リンク