2004/12/15

dumpファイル取得用phpスクリプト

subversionのレポジトリをダンプしてダウンロードするんにいちいちサーバを操作するんがめんどくさかったんで、phpでダンプを取るためのスクリプトを書いてみた。
ブラウザで、/path/to/script.php/repositoryName.dmp のように、このスクリプトのURLの後に「/レポジトリ名.dmp」と入れてやると、ダンプファイルをダウンロードする。
ちょっと思いのほか便利。
<?php

define("REPOS_HOME", "/home/svn/repos");
define("SVN_ADMIN", "/usr/local/bin/svnadmin");

dumpRepository(getRepositoryName($_SERVER["PATH_INFO"]));

function getRepositoryName($pathInfo) {

   $fileName = substr($pathInfo, 1);
   list($repository) = split("\.", $fileName, 2);
   $repository = escapeshellcmd($repository);

   return $repository;
}

function dumpRepository($repository) {
   header("Content-type: application/svndump");
   header("Content-Disposition: attachement; filename=${repository}.dmp");
   passthru(SVN_ADMIN . " dump " . REPOS_HOME . "/${repository}");
}
?>
どうせやったらRubyで書いた方がかっこよかったかな?勉強にもなったはずやし...

2004/12/14

自動起動設定

書いてなかったがおとといJBossの3と4を両方ともインストールした。 こいつは/usr/ports/java/jboss-n.n.n> make install一発で入るんやけど、自動起動までしてくれる。
基本的に便利やけど2つ入れるとまずいな、って事で自動起動設定を切ることに。

FreeBSDの自動起動設定てどうなってるんやろうと思ってぐぐると、トップでそれっぽいのが叫んでた。ふむふむ...
rc.d/は/usr/local/etc/の下にあるって事らしい。で、こいつの中の020jboss3.shをリネームして丁寧にパーミッションまで変えてやったら無事起動しなくなりました。よしよし。

subversionでの自動ビルド

今日仕事帰りに「Subversion解説書」を何気に立ち読みしてたら これまでずっと調べててわかんなかった自動ビルドの設定法をあっさり発見。
これにのってるって事は当然「Subversionによるバージョン管理」にものってるわけで...
5. リポジトリの管理 > リポジトリの作成と設定 > フックスクリプト に書いたあるやん。普通に。
まあ、やりたいことベースとかCVSからの移行イメージで、とかで 「subversion 自動ビルド」とか「subversion 自動テスト」とか「subversion commitinfo」とか、 そんな検索ワードを使ってたから見つからんかったんやろなぁ。
一通り読み込んでたつもりでまだまだ読めてない部分も多いんでしょう。

で、やり方やけど、リポジトリを作ったらその中にhooksてディレクトリがあるので そこに決められた名前のファイルを作っておけばそいつか実行される。
UNIX系ならまさしくの名前のものを、winなら拡張子は無視して実行ファイルなら 実行してくれるそうなので、けっこうなんでも置けそう。
自動ビルドならantをキックするスクリプトをpost-commitてな名前で追いとけばよさげ。
管理しやすいようにリポジトリディレクトリ内にautobuildという名前でtrunkをチェックアウトして、 そいつを自動ビルドする。てかコミットのたびに自動でテストしてレポートを吐きたかったんだ。
とりあえずwinノートで試したんやけどBSDのblog(じゃぁ無いよな、このメモ) なのでBSDベースでかきます。
まず、そのpost-commitの内容。

#!/bin/sh
cd ../autobuild
PATH = /usr/local/bin
export PATH

svn update
ant -l build.log test
てな感じで書いて、chmod +xすればよし。
そんだけでコミットするたんびに更新してくれる。なんて解りやすい...解っちゃえばこんなもんですな。
こんだけじゃなんなんで、ついでにbuild.xmlの内容なんかも。
<?xml version="1.0" encoding="UTF-8"?>
<project name="triggertest"  default="build"  basedir=".">

 
   <target name="build">
       <javac destdir="bin" debug="true">
             <src>
               <pathelement path="src"/>
             </src>
           <include name="**/*.java"/>
       </javac>
   </target>

 
   <target name="test" depends="build">

       <delete dir="test-result" />
       <mkdir dir="test-result"/>

       <junit>
           <formatter type="xml"/>
           <classpath path="bin"/>
           <batchtest todir="test-result">
               <fileset dir="bin">
                   <include name="**/*Test.class"/>
               </fileset>
           </batchtest>
       </junit>

       <junitreport todir="test-result">
           <fileset dir="test-result"/>
       </junitreport>

   </target>
</project>
こんな感じでした。まる。

2004/12/13

気を取り直してJDK1.4

JDKのインストールをいまさらながら行う。
てかJDKが入ってなかったことの方が驚きやけど。SVNのJavaサポートとか入れてるくせに。

これもなかなかはまった。まず/usr/ports/jdk14を試したんやけど、こいつに必要なpachsetというの野ダウンロードがなぜかうまくいかない。
Java 2 on FreeBSDのサイトでダウンロードページからボタンを押すと何もいわずに戻されてしまう。 仕方が無いので半日の格闘後あきらめました。
気を取り直して、やっぱ今からやったら1.5やんね、とlinux-sun-jdk15をmakeしたらBad System Callが出てインストールできない。で、linux-sun-jdk14をインストールすることにした。

まずはダウンロード

と りあえず/usr/ports/java/linux-sun-jdk1.4/でmakeしてみると、j2sdk-1_4_2_06-linux- i586.binを/usr/ports/distfilesに入れてくれといわれる。こいつは、なぜか自分でfetchしてくれへんのです、ports のくせに。ていうかライセンスの承諾がいるんやね、きっと。
で、自力でSunのJDCからダウンロードページへ行って、self-extracting file (j2sdk-1_4_2_06-linux-i586.bin)を取ってくる。
こいつを指定された/usr/ports/distfiles/にいれて、再度makeすると、今度はgettextのバージョンが古いと文句を言われてしまった。

gettextは0.13ですか。

甘やかしちゃいかんと思いつつもついつい/usr/ports/devel/gettext/でmake deinstall; make install(無茶は承知)。
で、再度/usr/ports/java/linux-sun-jdk1.4/に戻り、makeすると今度はlibintl.so.5が無いと止まってしまう。

libintl.so.5を作ってやる

ぐぐって調べるとなにやらlibintl.so.n(nは5以上の任意の整数)にシンボリックリンクを貼れば良い模様。(これは無茶ではない。んじゃ無いかとおもう)
/usr/local/lib/ でln -s libintl.so.6 libintl.so.5として、再度/usr/ports/java/linux-sun-jdk1.4/でmake すると、ようやくmake 完了。で、make install して晴れてインストールできました。再起動してjava --versionと ...したらエラーがTT。

続きは飯の後にしよう...

linuxバイナリ互換を入れないとね...

で。とりあえず、「FreeBSD jdk14 インストール」でぐぐって再度インストール法を確認。
そこで見つけたページで、こんなことが書いてある...
また、linux版には、Linuxバイナリ互換機能が必要です。 ...(略)... 実際にLinuxバイナリ互換機能を使用するには、/etc/rc.confに linux_enable="YES" の1行を追加します。
もちろん、そうですな。インストールだけして動かしてない。そら効いて無いわって話で。
やりました、rebootしました、動きました。しょうもな。ってrebootまでせんでもいいやん、UNIXやのに。win癖がついちゃって...

そんなわけで無茶をしつつもインストール完了です。無茶しすぎ。
サーバ管理の仕事は出来ひんなぁ、と改めて実感した半日*2でした。

いまさらXfree86設定

実は今までtextオンリーで使って来たんである。
いや、最初はちゃんとがんばってXFree86設定を完了させててんけど。 HDが逝ってしまわれて再セットアップせなあかんくなたらめんどくさくて。

で、さすがにGUI無しがなにやらもの悲しゅうてXFree86の設定に再挑戦する。 何がまずくて設定できなかったかと言うと、グラフィックカード。
サーバマシンにはATI Rage XLが入っているんやけど、 こいつとBSDの相性が悪いらしい。
ちなみになぜ今更かというと、たまたまネットを手繰っていてHPのサポートページに 同一構成の設定法がのってたから。HPではいないんやけど、参考になりそう。

その上ディスプレイはLCDで、ちょっと周波数がリストに無いんではまっていたらしい。

で、どんな設定をしたかというと。
まずキーボードとマウスは普通にデフォルトのままでうまくいった。
問題はまずディスプレイである。こいつはスペックを見て 水平はリスト上のHigh Frequency SVGA 1024*768@70 Hzを選択、 垂直は直入力で55 - 75とする。
後はグラフィックカード。リストに無いので正直にUnlisted cardとし、 メーカーのatiを選択。
で、次がポイントで、ディスプレイは16bitで1024*のみを設定しておく。 これでXFree86は動くようになった。
が、なぜかKDEが起動してくれないTT。 まだまだ苦難が続きそうです...

2004/12/09

おまけ:winにsubversion

基本的に今のところBSDはsubversion用にしか使ってない。のでここに置いたんやが...
普段サーバに置いとけばなんなとなるし、 subversion+apache+2、とかやとセキュリティ付きでインターネット経由のアクセス、なんかも (比較的)容易なんやけど、
けどサーバを持ち運べるわけじゃないんで、接続できない場面なんかも 当然発生する。
そんな場合でもPC持込、なんて場合が多いんで、開発用ノートPCにsubversionをセットアップしておけば 持ち出しも可能。
んで、そのノートPC側の設定を行ったんでその記録を。

まず、apache2をインストールする。まあ、deltavでアクセスせずに使うならいらんし、ファイアウォールでLAN内だけ許可しとけばsvnservで充分な気もするけど...
基本的にはインストーラを取ってきてインストールするだけ、何やけどうまいこといかなかった。
あとでわかっんやけどskypeが悪さをしていたらしい。
今回は仕事の変わり目でPCの中身をサラにしてから入れたのでここでは問題なし。
問題があったときはさっきのページとかそっから飛べる@ITの記事とかを参考に犯人を突き止めるべし。
場合によってはapache2のポートを変えるよりほかに無いかも。
まあ、今回はすんなり行ってよかった。

で、subversionのインストールやけど、これは簡単。
別に普通に使うのみならTortiseSVNで充分だが、サーバから移行して別サイトで使用したり、戻ってきてサーバに戻したり、なんて事をしたいんで、svnadminのついた本物のsuvbersionがいる。
で、どうするかっていうと、windows版のフォルダからインストーラをインストールして入れるだけ。.zipを取ってきて解凍してパスを通すだけでもいけるみたいやけど。

で、ここからが本番です。mod_dav_svnをApache2にインストールしないといけない。
基本的にはインストーラがやってくれて、後はmod_dav_svn.soとmod_authz_svn.soをApache2のmodulesにコピーすれば良い、はずなんやけど、うまくいかない。
ちなみにLoadModulesとかの修正はBSDの時とおんなじ。
でもおんなじにしても動かない。モジュールが見つかりません、と言うメッセージを丁寧に\xでエスケープして出してくれる。
このメッセージを読み解く為に、


public class UnescapeFilter extends FilterReader {

   public static void main(String[] args) {
       BufferedReader r = new BufferedReader(
               new UnescapeFilter(
               new InputStreamReader(System.in)));
      
       try {
           String line;
           while((line = r.readLine()) != null) {
               System.out.println(new String(line.getBytes("ISO-8859-1"),
                       "JisAutoDetect"));
               if (line.length() == 0) {
                   break;
               }
           }
       } catch (IOException e) {
           e.printStackTrace();
       }
       try {
           r.close();
       } catch (IOException e) {
           e.printStackTrace();
       }
   }
  
   public UnescapeFilter(Reader in) {
       super(in);
   }
  
   public int read(char[] buf, int ofset, int len) throws IOException {
       char[] myBuf = new char[buf.length - ofset];
       int count = super.read(myBuf, 0, len);
       int pos = ofset;
      
       for (int i = 0; i < count;) {
           char ch = myBuf[i++];
           if (ch == '\\') {
               ch = myBuf[i++];
               if (ch == 'x') {
                   ch = (char)toByte(myBuf[i++], myBuf[i++]);
               } else {
                   buf[pos++] = '\\';
               }
           }
           buf[pos++] = ch;
       }
      
       return pos - ofset;
   }

   private byte toByte(char upper, char lowwer) {
       return (byte)Integer.parseInt(
               new String(new char[]{upper, lowwer}), 16);
   }
}

みたいにしてJavaで変換して読んだ。このコード、前はごめんなさいな程汚かったんで書き直した。 で、この件、W32notes.txtを見る限り、パスを通したりすると直るらしいんやけど、うまくいかず。
結局どうやったかというと、subversionのbinから全部のdllをapache2のmodulesに移すと、動いた。 (また無茶を...)
あまりに無茶なんで1つずつ消して要らんやつをはずして見たら、libaprutil.dllとintl.dllとlibdb42.dllが必要だったらしい。今回は。でも常にこれで充分かは疑問。
んで、ようやく動きました。後はapache2の設定しだいなんでBSDの時とおんなじでいい。
以上。

subversion1.1.1登場

日本にいない間にsubversionが1.1.1になってた。 今回はPortsが対応してくれているので、そっちでインストール。
Lev Serebryakov氏に感謝!

さすがにportsは楽ちん。cvsupしてからmake; make installで終わる。 といってもMakeFileを調べてプションをつける必要はあったのだけれど。
やったのは以下の通り。


> cd  /usr/local/etc/cvsup
> cvsup ports-supfile

> cd /usr/ports/devel/subversion
> make clean
> make -DWITH_PYTHON -DWITH_JAVA -DWITH_MOD_DAV_SVN
基本的に最初に入れたときの準備完了後と同じなのだが、 subversion-pythonを使う代わりに-DWITH_PYTHONとしたのと、 なんとなく気分でWITH_JAVAしたら入ったので使っている。
しかしやっぱりportsは便利だなぁ、などと思ったりしたのでした。 いじょ。

2004/10/07

websvnの導入

ViewCVSの出力がいまいち気に入らなかったのでwebsvnを導入してみることにした.
こいつ自体のインストールは問題ないのだがphpを入れなおす必要がありそこでちょっとはまる.

websvnのインストール

これは非常に簡単.
websvnのサイトからtar.gzをダウンロードしてきて、web公開しているディレクトリに解凍するだけでいい.

websvnの設定

設定ファイルは解凍してできたディレクトリの下のinclude/にconfig.incというファイル名で置く.
distconfig.incというファイルがあるので、そいつをコピーして後は適当に設定を書き換えていく.
もう少ししっかり設定したほうが良いのかも...やけど.

phpではまる

phpのデフォルト構成に含まれない、gzopen()という関数を使っているらしく、そのままでは落ちた.
もしかしたら設定の問題かもしれないけど...
で、phpを入れなおそうとしたのだが.../usr/ports/lang/php5に入ってmake してみると落ちてしまってうまくいかない...
どうやらXMLサポートがうまく入れられていないよう.
結局Makefileを開いて、--with-xmlの行を消したらうまくいった.
さらに--with-zlibも書き足して、make cleanでいったんさらにしてから make; make install.
apachectl restartして確認してみるとエラーが「パーミッションがないよー」というものに変わり、とりあえずgzopenが呼べることは確認. 
が、まだpreg_replase()が無いと怒っている...そいつは標準やぞ.何で入んないんだか.
別にwithoutしているわけではなさそうだが、とりあえずphp5のMakefileに--with-pcre-regexも追加してmake clean; make; make deinstall; make installしてみる.
で、再度apachectl restart.
ようやく動いた...けどログが変..(TT)
後は設定次第か.

apacheの設定修正

今はわざわざindex.phpまで書かないとみれない.DirectoryIndexにindex.phpも追加すべきだわな.
というわけで書き加えてapachectl restart.

どうすればログが合うの???

いろいろ調べてみるとsvnlook自体が文字化けを起こしているらしい...涙涙.
バージョンあがるまで待つしかないのか...?

2004/10/06

pkgsrcによるsubversionのインストール

pkgsrcを導入し終えたので、めあてのsubversion1.1.0のインストールを行ってみる.

bmakeに注意

portsと基本的な使い方は同じだろうとおもい、make -D WITH_MOD_DAV_SVNとしてみたらぜんぜんうまくいかない.
makeじゃなくbmakeを使う必要があるんですな.
で、みてみるとDAVとかpythonとか使うように設定されているようなので、単にbmakeとしてみる.
なんだかpython2.3.4とかapache2とか、実物があるはずなのにtgzを落としてきているのが気になる...
たんにビルドに必要ならわかる話なので、とりあえずこのまま進めてみる.
普通に終了したので、bmake install.
バイナリがどこにできるのかと思えば/usr/pkg/以下にできていた。

バイナリの移動

/usr/pkg/binとかのパスは今のところrootのみで当てているので,移す必要あり.
svn関係の生成ファイルを全部cpしてしまう.無茶だけど.
/usr/pkg/binでcp *svn /usr/local/bin,
/usr/pkg/libでcp libsvn* /usr/local/lib, /usr/pkg/lib/httpdでmv mod*,
/usr/local/libexec/apache2/.
これでapachectl restartしたらちゃんとsubversion1.1.0で動くようになった.

pkg-srcの導入

subversionのページのダウンロードからたどってみると、pkg_srcではsubversionが1.1.0になっている模様.
なので、subversionのためにpkg_srcを導入してみることにした.

入手

pkgsrcのトップページにダウンロード用リンクがある.
これをとってくる.

インストール

/でtar -xzfをすれば/usr/pkgが入る.この下のbinとsbinにパスを通して完了.

pkgsrcの取得

cvsで取得する. まず/usrに行き、
cvs -d :pserver:anoncvs@anoncvs.NetBSD.org:/cvsroot login
してNetBSDのcvsにログインした後、
cvs -d :pserver:anoncvs@anoncvs.NetBSD.org:/cvsroot co pkgsrc
とするとcvsがどんどん取得してくれる.
これで/usr/pkgsrcでcvs updateすればいつでも最新にできるようになる.

2004/10/05

ソースからsubversionを 1.1にアップグレード失敗記

注:インストールは結局失敗してます。 (多分apache2を探し損ねているせい)
いつの間にやら1.1が安定版らしい。
まだ良く読んでいないがDeltaVへの準拠が含まれているっぽいので 更新する.
ただし、portsにはまだきていないのでtar.gzを開いてのインストールになる.
portsができたらやり直してみようかと思っている.はまることもないだろうし.

ファイルの入手

subversionのダウンロードページからソースコードのディレクトリに入り、ダウンロードする.
こいつを/usr/local/srcでtar -xzf subversion-1.1.0.tar.gzして準備完了.

バックアップ

レポジトリを片っ端からsvnadmin dump /repos/path > repos.dmpみたいにバックアップしていく.
/repos/pathとかreposとかはもちろんレポジトリごとに変えていく.

1.0.8 の削除

/usr/ports/devel/subversion-python/にいってmake deinstall. 楽だ.
再起動するならapacheの設定を直さないといけないことに注意. viでhttp.confを開いて、/svnで片っ端から検索して#でコメントアウト、でいいはず.
Locationとかはちゃんと意味が通じるようにしないといけないけど.

インストール

まずは./configureでmakeファイルを作る.
単に./configureとすると、aprにリンクしたバークレイが古いからバークレイサポートは作らないよ、とのたまうので、aprを指定する必要がある模様.
./configure --help | less としてオプションを確認する. (先にしろよ)
--with-aprと--with-apr-utilが必要そう.それぞれのツリーかconfigファイルのパスをおしえてね、と言っているのでどちらも/usr/local/lib/apache2を指定する.
あと、with-swigもいりそうかな...とも思うが、勝手に見つけているようなので省略.
./configure --with-apr=/usr/local/lib/apache2 --with-apr-util=/usr/local/lib/apache2
ひとまず通るのでmakeといってみる
基本的にオプションはportsでのmakeの時と同じでいいはず...なので, -D WITH_MOD_DAV_SVN と -D WITH_PYTHON を入れてみる.
make -D WITH_MOD_DAV_SVN -D WITH_PYTHON 
これも通ったのでmake install.>ってmake checkくらいしろよ...

移行

古いレポジトリが残っていたのでsvn coしてみた. ラッキーにも問題なく取れたので、以降作業は必要なさそう.
別にrm; mkdir; svnadmin load /repos/path < repos.dmpくらいなんでもないけど.量が量だけにね.
ここで、mod_dav_svn.soができていないことに気づく.
2時間の格闘の後断念. unix系のインストールってうまくいけばめんどくさいだけだけどうまくいかないときは難しい.
まあ、portsに乗るまで我慢することにした.