ushidayの日記

主に「IBMi」のメモに・・・

IBM iにSubversionサーバーを設定 その2

前回の続きで、IBMi(AS/400)のSVNデーモンの起動とチェックアウト&コミットをします。

SVNデーモンの起動

インストールの際に、「OPENLIB/OPENSYS」(※適宜 QGPL/QBATCHなどに置き換えて下さい)というサブシステムで、自動実行される様にしたので、”ENDSBS”でサブシステムを落として、”STRSBS”で再起動をします。


しかし、再起動してもSVNデーモンが上がらない。:-(
サブシステムの自動実行ジョブを確認すると、ジョブ記述が”SUBVERSION/SVNSERVE”にあるので確認すると...。
JOBDのジョブ待ち行列が「QGPL/QPGMR」になってる!インストールの時に指定した、”OPENLIB/OPENSYS”は、一体何だったんだ?夢か幻か?ADDAJEだけは、やってくれたけど、肝心のジョブ記述が、存在しないジョブ待ち行列じゃ意味が無いですハイ。


CHGJOBDで「OPENLIB/OPENSYS」に変更します。

しかし、JOBDの値変えて、STRSBSしても上手くいかない??
どうも”SUBVERSION(インストールライブラリ)/STRSVNSVR”が動いているようなので、次のように手動で実行してみると...
SUBVERSION/STRSVNSVR PATH('/Subversion/repositories') PORT(3690) 」
「バッチジョブでやりなさい!」とお叱り受けたので、SBMJOBでやってみると動くではないですか!
もう考えるのは面倒臭くなったので、起動用のCLPを以下の様に1本作ります。

/*********************************************************************/
/*  OPNELIB/STRSVND  :  SVN  デーモン開始                       */
/*                                 2009/11/25 WRITE  BY ushida       */
/*********************************************************************/
/*   変数定義                                                        */
/*********************************************************************/
             PGM                                                       
                                                                       
           DCL VAR(&CCSID ) TYPE(*DEC)     LEN(5 0)  /* 元 CCSID     */
                                                                       
             RTVJOBA    CCSID(&CCSID)                                  
             CHGJOB     CCSID(5035)                                    
                                                                       
             RMVLIBLE   LIB(SUBVERSION)                                
             MONMSG     MSGID(CPF0000)                                 
             ADDLIBLE   LIB(SUBVERSION)                                
             MONMSG     MSGID(CPF0000)                                  
             RMVLIBLE   LIB(QTEMP)                                      
             MONMSG     MSGID(CPF0000)                                  
             ADDLIBLE   LIB(QTEMP)                                      
             MONMSG     MSGID(CPF0000)                                  
                                                                         
   /* デーモン開始 */                                                   
             SUBVERSION/STRSVNSVR PATH('/Subversion/repositories') +    
                          PORT(3690)                                    
                                                                         
              CHGJOB     CCSID(&CCSID)                                   
                                                                         
   END:       RETURN                                                     
              ENDPGM                                                     
                                                                                                                                                

SUBVERSION/SVNSERVE”のジョブ記述をコピーして、”要求データまたはコマンド”を「CALL さっき作ったプログラム」にします。
作ったジョブ記述をADDAJEで、サブシステムの自動実行ジョブに登録します。


これでどうだ!とやったら上手く動きました。

(※後で気づいたのですが、自動で作られた、”SVNOWNER”と”SVNGROUP”のユーザーCCSIDが”*SYSVAL(5026)”だからか駄目だったのかな?自分は、オープン系の時には、CLPでお決まりのように、”5035”のCHGJOBを入れてあるから?上手くいった?)

メニューの<3>のインポート機能は、途中でコケます。Cのプログラムを見る元気は、流石にないので、スルーします。
クライアントソフトでも出来るから、必要ないかもしれません。

アクセス許可の設定

とりあえず動作確認の意味で、「svn://」では無く、IFSをファイル共有で試しました。

直ぐ忘れるので、余分ですが、

    • 「file:///」=ローカルファイル
    • 「file://」=ネットワークファイル
    • svn://」=SVN
    • svn+ssh://」=SSHトンネル&SVN

になります。
まずは、適当なディレクトリをインポートします。


「file://192.168.xxx.xxx/TestRepos」で、何事も無く普通にインポート&チェックアウト&コミット出来ました。

サーバー運用で、流石にこれは、まずいので、Basic認証から順にトライします。
リポジトリ/conf/svnserve.conf」を以下の様に変更します。

#「リポジトリ/conf/svnserve.conf」

[general]
# anon-access :匿名アクセス ,auth-access:権限アクセス
# (read ) :読取可能
# (write) :読取書込み可能
# (none)  :アクセス拒否
# anon-access = read
# auth-access = write
anon-access = none
auth-access = write
# password-db :パスワードファイル「絶対パス」又は「相対パス」
# password-db = passwd
password-db = userlist

ユーザーファイル「リポジトリ/conf/userlist」(省略はpasswd)を以下の様に作成します。

#「リポジトリ/conf/userlist」
[users]
# harry = harryssecret
# sally = sallyssecret
username = password

これで、クライアント側でユーザーパスワードを聞いてくるようになります。
ただこれだと、Basic認証を通過したユーザー全てが、Write権限になってしまうので、次にパスベース認証をやってみました。

authzを使って、ユーザ別にアクセスを制御します。「リポジトリ/conf/svnserve.conf」を以下の様に変更します。

#「リポジトリ/conf/svnserve.conf」
[general]
-- 省略 --
# anon-access :匿名アクセス権,auth-access:認証者のアクセス権
anon-access = none
# auth-access = write

# authz-db :ユーザー毎のアクセス権
authz-db = authz

「authz」を使う時点で、「auth-access」は無効になっているようですが、一応コメントに。

ユーザーリスト(「リポジトリ/conf/userlist」)はこんな感じに変更。

#「リポジトリ/conf/userlist」
[users]
admin = password
user = password
poweruser = password

でもって以下が、「authz(「リポジトリ/conf/authz」)」。リポジトリ毎やディレクトリ毎の設定も出来ます。

[groups]
#グループ定義。複数ユーザーはカンマ区切
admins = admin,poweruser
users = user

#ユーザー毎許可(r:read | w:write)
[/project1/trunk]
# admin = rw
# poweruser = rw
# user = r
# * =

#グループ許可
[/]
@admins = rw
@users = r
* =

# リポジトリ指定で許可
# [repository:/project/trunk]
# @admins = rw
# * = r
チェックアウト&コミット




これで、チェックアウト&コミットのユーザー毎のアクセス制御が出来ました。ログもちゃんと表示できました。

でここまできたら、「svn+ssh」でやりたくて、挑戦しましたが、結果は今のところ駄目でした。
方法としては、以下の様な感じなのかな?と思いつつも...。

1.グループユーザープロファイルの「SVNGROUP」を、SSHのユーザーに設定。
2.PASEシェルで以下を実行
# cd /Subversion/repositories/TestSSHRepos(リポジトリ名)
# chmod -R g+s .
# umask 002
3.認証鍵のペア作って。「~/.ssh/authorized_keys」に”svnserveコマンド”と”公開鍵”を追記。
4.cygwinかputtyを使って、連携?

考えていたのですが、”3”の”svnserve”コマンドが、AS/400Subversionは、
「command="/QSYS.LIB/SUBVERSION.LIB/SVNSERVE.PGM -t -r /Subversion/repositories” ssh-rsa(公開鍵)」
これって、*PGMだから、PASEシェルからは動かない?QSHからは動きそうだけど、SSHはPASE環境だしのジレンマで諦めました。
また何か良い方法を考えます。

とりあえずは、SSHでつないで、SVNのポートフォワードという事で...。:-p