WebDAV( apache 2.0.64,2.2.17 )のディスク容量制限パッチ

サタケ <satake@goodcrew.ne.jp> 2010/11/09

・前書き

WebDAV の欠点のひとつにディスク容量制限がかけられないということがあります。 WebDAV Resource JP( http://webdav.todo.gr.jp/download/ )で公開されている Disk Quota を 使用したパッチが公開されていますが、 ・使用者ごとにOS上でのアカウントを発行しなければならない ・apache の実行ユーザー権限問題 といったちと面倒な欠点を持っているので、ならば・・ということで全然別の方法で 実現させるようアパッチのソースを書き換えて自作してみました。 Apach-Users ML で疑問点を聞いた経緯もあるのでここで公開します。 『このパッチと同じアイディアのものはあるよ』とか『こっちのパッチのほうがいいよ』といった 情報がありましたら、サタケまで連絡を下さるとうれしいです。

Version: 2.5

・小林氏から「2GB超のファイルがある場合、正常に容量判定していない」という指摘をいただきました。(ありがとうございました) ⇒2GB超対応 ・システム依存版の容量判定時のクラスタ計算にミスがあったのを修正 ※apache の 2GB超 の対応について apache 2.2.x で 2GB超 のファイルを扱えるようにするためにはコンパイル時にオプションとして -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 を指定する必要があるようです。 指定する方法はいろいろとあるかと思いますが、環境変数 CFLAGS に上記文字列をセットして make する方法が簡単かと思います。 スクリプト例: === #! /bin/bash CFLAGS="${CFLAGS} -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64" export CFLAGS buildconf && configure [オプション] && make ===

Version: 2.4

・Sebastian氏から「apache2.2.xで apr_lstat()が undefine」という指摘をいただきました。  んで apr_lstat() -> apr_stat() に変更

Version: 2.3

・eduardoh氏から「.htaccess内でDAVSATMaxAreaSizeを指定してぇ」とメールでリクエストが  来たので、対応。・・・でもあまりお勧めできませんが・・。 ・大野氏(http://atwiki.jp/)より「<Directory> のなかで '*' 付きのディレクトリを指定した場合、容量制限が  効かない」という指摘をいただきました。(ありがとうございました)  んでそのバグ対応。

Version: 2.2

./buildconf を行うと configure が書き換えられてこのパッチであてた修正がチャラになってしまう不具合を修正。 この不具合を指摘してくれた Marco Gobenich 氏が 2.0.50 のSPRMパッケージにこのパッチを当てる方法や そのときのスペックファイルを公開してくれてます。 http://www.needful.de/docs/projekte/webdav-quota/ 感謝感謝! パッチのダウンロードパッチの処理の説明パッチをあてたapacheのmake方法WebDAVの設定(ディスク容量制限の設定)

・WebDAVパッチのダウンロード

WebDAV容量制限パッチ(システム依存版): [latest]
http://dirkschneider.o.oo7.jp/webdav/files/webdav-2.2.17-quota-2.5.txt [latest]http://dirkschneider.o.oo7.jp/webdav/files/webdav-2.0.64-quota-2.5.txt http://dirkschneider.o.oo7.jp/webdav/files/webdav-2.2.16-quota-2.5.txt http://dirkschneider.o.oo7.jp/webdav/files/webdav-2.2.15-quota-2.5.txt http://dirkschneider.o.oo7.jp/webdav/files/webdav-2.2.14-quota-2.5.txt http://dirkschneider.o.oo7.jp/webdav/files/webdav-2.2.13-quota-2.5.txt http://dirkschneider.o.oo7.jp/webdav/files/webdav-2.2.12-quota-2.5.txt http://dirkschneider.o.oo7.jp/webdav/files/webdav-2.2.3-quota-2.5.txt http://dirkschneider.o.oo7.jp/webdav/files/webdav-2.0.63-quota-2.5.txt WebDAVパッチアーカイブファイル(システム非依存版): [latest]http://dirkschneider.o.oo7.jp/webdav/files/webdav-2.2.17-quota-2.5any.txt [latest]http://dirkschneider.o.oo7.jp/webdav/files/webdav-2.0.64-quota-2.3any.txt http://dirkschneider.o.oo7.jp/webdav/files/webdav-2.2.16-quota-2.5any.txt http://dirkschneider.o.oo7.jp/webdav/files/webdav-2.2.15-quota-2.5any.txt http://dirkschneider.o.oo7.jp/webdav/files/webdav-2.2.14-quota-2.5any.txt http://dirkschneider.o.oo7.jp/webdav/files/webdav-2.2.13-quota-2.5any.txt http://dirkschneider.o.oo7.jp/webdav/files/webdav-2.2.12-quota-2.5any.txt http://dirkschneider.o.oo7.jp/webdav/files/webdav-2.2.3-quota-2.5any.txt http://dirkschneider.o.oo7.jp/webdav/files/webdav-2.0.63-quota-2.3any.txt

・パッチの処理の説明

webdav-2.0.55-quota-2.3.txt システム依存型パッチ webdav-2.0.55-quota-2.3any.txt システム非依存型パッチ webdav-2.0.55-quota-2.3.txt はシステムに依存します 具体的には lstat() 関数を使用してストレージ上のデータ占有サイズを計算しています。 一応、算出するサイズは "du -sk" の出力とあわせてあるつもりです。 ただし、ハードリンクは考慮していません。重複してサイズを計算しますが、WebDAV上での 使用ということであまり問題は無いかな・・と勝手に判断して入れ込みませんでした。 大抵の Unix系OSには lstat() 関数が実装されていると思いますが、もし無い場合は ある関数に変更するか、システム非依存バージョンのパッチをあててください。 ただしシステム非依存のパッチは lstat() を使用せずにアパッチの内部関数でファイルサイズを 合算するだけですので、実際にストレージを占有しているサイズと合致しません。 一応クラスタサイズを quota.h 内で定義(デフォルトで 4k )し、クラスタサイズに変換してから 合算していますので、小さいファイルが大量にあっても激しく違う値が出るということは ないとは思います・・・たぶん。 このクラスタサイズは、quota.h 内で #define DAV_CLUSTER_SIZE 4096 としている部分を書き換えるか、コンパイラオプションに -DDAV_CLUSTER_SIZE=xxx 等と指定して ご自分のストレージのものに書き換えればより近い値で使用量が出てくると思います。 設定の方法は
WebDAVの設定(ディスク容量制限の設定)を参照していただくとして、 それに関連してちとわからない点が・・。 ※1参照 思うに追加した DAVSATAreaPath ディレクティブは内部処理をうまくすることで 必要なくなるかと想像するのですが、 ・uri -> fullpath 変換 ・module 内で <Directory>なのか <Location>なのかの判別 ( request_rec->filename と dir の違いで判別? でも↑だとリクエストごとに毎回処理しないと・・) のしかたが良くわからなかったので、それならば・・ってことで追加したディレクティブな もんですんで。 この辺の情報をお持ちの方も、もしよかったら教えてはくれませんでしょうか・・。

・apache アーカイブの解凍

下記のように解凍します。 #gtar xvfz httpd-2.0.55.tar.gz

・パッチをあてる

#cd httpd-2.0.55 としてディレクトリ内に入り、その場所にパッチファイル webdav-2.0.55-quota-2.3.txt を置く。 #patch -p2 < webdav-2.0.55-quota-2.3.txt として apache にパッチをあてる webdav-2.0.55-quota-2.3.txt: このパッチで次の3つのファイル modules/dav/main/mod_dav.c, configure, modules/dav/main/config5.m4 を変更し、 次の2つのファイル modules/dav/main/quotachk.h, modules/dav/main/quotachk.c を 新たに追加します。

・apache の make

あとは mod_dav , mod_davfs が on になるように configure & make してください。 configure は私の場合は以下のようにしました。 #./buildconf #./configure \ --enable-modules=most \ --enable-mods-shared=all \ --enable-ssl \ --with-ssl=/usr/local/ssl #make #su #make install

・WebDAVの設定

WebDAV の各種設定に関しては、さまざまなWebページや書籍を参考にしてください。 ※参考URL
WebDAV Resources (http://www.webdav.org/)(本家) WebDAV Resources JP (http://webdav.todo.gr.jp/)(日本版) ここではサタケが作成したディスクの容量制限に関する部分についての設定について説明します。 設定の追加 (1)DAVSATMaxAreaSize ディレクティブを追加しました このディレクティブで各ディレクトリ以下の容量を制限できます。 WebDAV はこのディレクティブで示されたディレクトリ以下の合計容量が指定された サイズ以下になるように書き込み時に監視するようになります。 指定するMAXサイズはKB単位の数字のみ(計算式は不可)で指定してください このDavMaxAreaSizeディレクティブを指定しないか、0を指定すれば容量チェックは行いません。 ※1参照 注1: このディレクティブを<Directory>以下に配置せず、<Location>以下に配置する場合は、 次の説明するDAVSATAreaPathディレクティブの指定も必ず行ってください。 <Location>以下に配置した場合はDAVSATAreaPathの指定をしないと容量チェックは行われません。 注2: シンボリックリンクは追いかけません。容量算出ルーチンの出力は du -sk コマンドにあわせました。 (このシンボリックリンクに未対応なのもWebDAVの欠点・・なんとかならんかなぁ〜) ただし、du コマンドはハードリンクを考慮しますが、このルーチンは考慮しません。 同じ Directory 以下にハードリンクされたファイルはそれぞれ容量を持っているものとして 算出します。 設定例) DAVLockDB /usr/local/apache2/logs/DAVLock Alias /dav-test-one "/var/NAS/00001" <Directory "/var/NAS/00001"> DAV on # # このディレクトリ以下の容量を100MBに制限 # DAVSATMaxAreaSize 102400 Options FollowSymLinks AllowOverride All Order allow,deny Allow from all </Directory> Alias /dav-test-two "/var/NAS/00002" <Directory "/var/NAS/00002"> DAV on # # このディレクトリ以下の容量を100KBに制限 # DAVSATMaxAreaSize 100 Options FollowSymLinks AllowOverride All Order allow,deny Allow from all </Directory> この例では /dav-test-one は 100MB , /dav-test-two は 100KB に 容量制限されます。 ※1参照 (2)DAVSATAreaPath ディレクティブを追加しました DAVSATMaxAreaSize の項で記したとおりapacheでは<Directory>,<Location>を 解析順序の違い以外、あまり区別していない(ように思う・・んだけど)ので、<Location>以下で 指定した場合に必須のものになります。 このディレクティブでは<Directory>だった場合のパラメータをそのまま指定します。 上記の設定例を<Location>でした場合の例を示せば、すぐにわかると思います。 例) DAVLockDB /usr/local/apache2/logs/DAVLock Alias /dav-test-one "/var/NAS/00001" <Location "/dav-test-one"> DAV on # # このディレクトリ以下の容量を100MBに制限 # DAVSATMaxAreaSize 102400 DAVSATAreaPath /var/NAS/00001 Options FollowSymLinks AllowOverride All Order allow,deny Allow from all </Location> Alias /dav-test-two "/var/NAS/00002" <Location "/dav-test-two"> DAV on # # このディレクトリ以下の容量を100KBに制限 # DAVSATMaxAreaSize 100 DAVSATAreapath /var/NAS/00002 Options FollowSymLinks AllowOverride All Order allow,deny Allow from all </Location> 上記のように容量チェックを行うディレクトリを指定してください。 モジュール内では、書き込もうとしているファイルのフルパスとこのディレクトリ名を 比較して正当性をチェックしていますので、このディレクティブで素っ頓狂なパスを 指定しても容量チェックは行われませんので、typoなどに注意してください。

・その他

・容量制限は階層化できます。例えば /dav-one/pub は 10KB 、/dav-one/etc は 20KB 、 その他のディレクトリをあわせて /dav-one 全体で 50KB ・・のような指定です。 ・version 2.3 からは容量制限DAVSATMaxAreaSizeは .htaccess 等で上書き設定できます。 警告メッセージが error_log に出る場合は、.htaccess 内に DAV On を入れておくと 出なくなります。・・・でもあまりこの方法はお勧めしませんが・・・。
※1 2.0 からは DAVSATAreaPath の定義を削除しています。 逆に conf ファイル内にあるとエラーを起こします。 佐竹輝之