<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>ダメ出し日記 &#187; Samba</title>
	<atom:link href="http://www.sfo.jp/blog/archives/category/software/samba/feed" rel="self" type="application/rss+xml" />
	<link>http://www.sfo.jp/blog</link>
	<description>自称・独立&#38;OSS系(?) SE、さとうふみやすの日記。OSS テクノロジ(株)に勤務。</description>
	<lastBuildDate>Fri, 23 Oct 2009 08:10:06 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>ksh: パイプライン前段のプロセスを看取るタイミング</title>
		<link>http://www.sfo.jp/blog/archives/2009/06/ksh-pipeline.html</link>
		<comments>http://www.sfo.jp/blog/archives/2009/06/ksh-pipeline.html#comments</comments>
		<pubDate>Thu, 04 Jun 2009 00:51:40 +0000</pubDate>
		<dc:creator>fumiyas</dc:creator>
				<category><![CDATA[Samba]]></category>
		<category><![CDATA[UNIX]]></category>
		<category><![CDATA[shell]]></category>
		<category><![CDATA[仕事]]></category>

		<guid isPermaLink="false">http://www.sfo.jp/blog/?p=449</guid>
		<description><![CDATA[会社のソフトウェア製品のうち、
Samba 等のデーモン類は、
daemontools (supervise)
で管理するようにしている (一部例外あり)。

Samba の smbd 用の /service/smbd/ [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.osstech.co.jp/">会社</a>のソフトウェア製品のうち、
Samba 等のデーモン類は、
<a href="http://cr.yp.to/daemontools.html">daemontools</a> (<code>supervise</code>)
で管理するようにしている (一部例外あり)。</p>

<p>Samba の <code>smbd</code> 用の <code>/service/smbd/run</code> スクリプトは、
当初は次のようになっていた。
Linux, Solaris ではこれで何も問題なかった:</p>

<pre class="brush: shell; auto-links: false;">
#!/bin/sh
exec 2&gt;&amp;1
exec envdir ./env sh -c &#039;
  echo &quot;PID: $$&quot;
  env |sort |sed &quot;s/^/Environment: /&quot;
  set -- \
    argv0 \
    &quot;$COMMAND&quot; \
    &quot;${ARGV0:-sv:`pwd`}&quot; \
    --daemon \
    --foreground \
    ${CONFIGFILE:+&quot;--configfile=$CONFIGFILE&quot;} \
    ${PORT:+&quot;--port=$PORT&quot;} \
    ${LOGLEVEL:+&quot;--debuglevel=$LOGLEVEL&quot;} \
    ${LOGDIR:+&quot;--log-basename=$LOGDIR&quot;} \
    ;
  echo &quot;Execute: $@&quot;
  exec &quot;$@&quot;
&#039;
</pre>

<p>ところが、某お客さんから、
AIX 6 上で smbd の子プロセスが defunct (ゾンビ) 化するという問題が報告された。
会社の AIX 環境で試したところ、数回に一回程度しか発生しないが、
<code>smbd</code> を起動した直後に発生することがわかった。
発生したときの状態は次のような感じ:</p>

<pre><code># /opt/osstech/sbin/service osstech-smb status
/opt/osstech/etc/svscan/smbd (pid 270496) is running...
# ps -ef |grep 270496 |grep -v grep
    root 270496 258182   0 13:07:27      -  0:00 sv:/var/opt/osstech/lib/sv/smbd --daemon --foreground
    root 282806 270496   0 13:07:27      -  0:00 sv:/var/opt/osstech/lib/sv/smbd --daemon --foreground
    root 295074 270496   0                  0:00 &lt;defunct&gt;
</code></pre>

<p><code>smbd</code> は起動直後にプリンタキュー監視用の子プロセスを生成するので、
これ関連のバグかと思ったが、
<code>ps</code> で見たときちゃんと 2つの <code>smbd</code> が存在するので問題ないように見えた。
<code>smbd</code> を手動で直接起動すると発生しないし、
<code>truss</code> でシステムコールを見たところ、ほかに子プロセスを生成している様子はない。</p>

<p><code>suerpvise</code> か <code>run</code> スクリプトが怪しいと思い、<code>run</code> スクリプトを色々変更してみたところ、
「<code>env |sort |sed 's/^/Environment: /'</code>」
の行をコメントアウトすると再現しないことがわかった。
ということは、パイプライン中のプロセスのいずれかが看取られずに残っているらしい。</p>

<p>また、/bin/sh ではなく bash, zsh, zsh の ksh 互換モードでは再現しないことがわかった。
ちなみに、AIX 6 の <code>/bin/sh</code> は AT&amp;T 由来の Korn Shell (ksh93)。</p>

<p>パイプラインの実行後にそのプロセスが残るのが問題であると推測し、
試行錯誤した結果、次のようなスクリプトで再現することに成功した。
これで、パイプライン実行後に、
実行中の ksh の子プロセスがゾンビ化していることが確認できる:</p>

<pre><code>$ while :;do /bin/ksh -c '/bin/true|/bin/true; ps -f -u $LOGNAME"';done |grep '[d]efunct'
    root 688354 712836   0                  0:00 &lt;defunct&gt;
    ...
</code></pre>

<p>Linux の /bin/ksh (ksh93)、Solaris 10 の /bin/ksh (ksh88) でも再現した。
bash, zsh, ash はもちろん、Linux 上の pdksh (バブリックドメイン版の ksh 実装)
でも再現しなかった。AT&amp;T ksh の仕様らしい。</p>

<p>つまり、こういうこと:</p>

<ol>
<li>ksh は「<code>env |sort |sed "s/^/Environment: /"</code>」を実行したとき、
 パイプラインの最後のプロセス (<code>sed</code>) が終了した時点で以降のスクリプトの実行に進む。
 パイプライン前段のプロセス (<code>env</code>, <code>sort</code>) の終了は待たない。</li>
<li>その後のスクリプト実行中、以前実行したパイプライン前段のプロセスが終了した場合、
 ksh はそれを wait(2) して看取る。</li>
<li>ksh は <code>smbd</code> に exec(2) する。</li>
<li><code>smbd</code> になった時点で以前実行したパイプライン前段のプロセスが残っていた場合、
 それが終了したとき、wait(2) で看取るのは親プロセスである
 <code>smbd</code> プロセスの役目となる。
 しかし <code>smbd</code> はそのことを知らないので wait(2) することはなく、
 結果、子プロセスはゾンビ化する。</li>
</ol>

<p>ksh がパイプライン前段のプロセス終了をどのようなタイミングで、
どのように処理するかまでは確認していないけど、だいたいこんな感じだと思う。</p>

<p>というわけで、<code>run</code> スクリプトは次のようになった。
違いは <code>exec</code> の前に <code>wait</code> を挿入しただけ:</p>

<pre class="brush: shell; auto-links: false;">
#!/bin/sh
exec 2&gt;&amp;1
exec envdir ./env sh -c &#039;
  echo &quot;PID: $$&quot;
  env |sort |sed &quot;s/^/Environment: /&quot;
  set -- \
    argv0 \
    &quot;$COMMAND&quot; \
    &quot;${ARGV0:-sv:`pwd`}&quot; \
    --daemon \
    --foreground \
    ${CONFIGFILE:+&quot;--configfile=$CONFIGFILE&quot;} \
    ${PORT:+&quot;--port=$PORT&quot;} \
    ${LOGLEVEL:+&quot;--debuglevel=$LOGLEVEL&quot;} \
    ${LOGDIR:+&quot;--log-basename=$LOGDIR&quot;} \
    ;
  ## ksh: Ensure that all commands in the pipeline are terminated
  wait
  echo &quot;Execute: $@&quot;
  exec &quot;$@&quot;
&#039;
</pre>

<p>これで無事に問題解決。</p>

<p>シェルスクリプト中ではパイプラインはもちろん、
<code>exec</code> も常用するたちなので、これは困った仕様だなぁ。
<code>exec</code> 前に <code>wait</code> すべし…なんて、バッドノウハウもいいところ。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sfo.jp/blog/archives/2009/06/ksh-pipeline.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Windows: Samba 共有上で sparse file 作成</title>
		<link>http://www.sfo.jp/blog/archives/2009/06/windows-sparse-file-on-samba.html</link>
		<comments>http://www.sfo.jp/blog/archives/2009/06/windows-sparse-file-on-samba.html#comments</comments>
		<pubDate>Wed, 03 Jun 2009 13:01:57 +0000</pubDate>
		<dc:creator>fumiyas</dc:creator>
				<category><![CDATA[Samba]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[仕事]]></category>

		<guid isPermaLink="false">http://www.sfo.jp/blog/?p=441</guid>
		<description><![CDATA[Windows では、fsutil コマンドで sparse file を作れるということを知ったので、
Samba による CIFS 共有上で試してみた。

まずは Windows 上での操作。試したのは Window [...]]]></description>
			<content:encoded><![CDATA[<p>Windows では、fsutil コマンドで sparse file を作れるということを知ったので、
Samba による CIFS 共有上で試してみた。</p>

<p>まずは Windows 上での操作。試したのは Windows Server 2003R2 と Windows 3.2.8。</p>

<pre><code>C:\&gt; net use \\samba\share /user:fumiyas
...
C:\&gt; fsutil file createnew \\samba\share\file.txt 1000000000
ファイル \\samba\share\file.txt が作成されました
</code></pre>

<p>Samba ホスト上で確認してみる。見た目のサイズは 1GB だが、実際のサイズは 0。</p>

<pre><code>$ ls -l /srv/share/file.txt
-rw-rw-r-- 1 fumiyas Domain Users 1000000000 2009-06-03 20:52 /srv/share/file.txt
$ du -sk /srv/share/file.txt
0       /srv/share/file.txt
</code></pre>

<p>Windows からファイルに追記してみる。</p>

<pre><code>C:\&gt; echo foo &gt;&gt;\\samba\share\file.txt
</code></pre>

<p>再び Samba ホスト上で確認してみる。</p>

<pre><code>$ ls -l /srv/share/file.txt
-rw-rw-r-- 1 fumiyas Domain Users 1000000006 2009-06-03 20:52 /srv/share/file.txt
$ du -sk /srv/share/file.txt
12      /srv/share/file.txt
</code></pre>

<p>2009-06-11 追記:
smb.conf で strict allocate = yes (デフォルト: no) を設定して追試したところ、
sparse file にならなかった。うーん。
fsutil の sparse サブコマンドでどうにかするのだろうか?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sfo.jp/blog/archives/2009/06/windows-sparse-file-on-samba.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Samba: pstring よ、安らかに…</title>
		<link>http://www.sfo.jp/blog/archives/2007/12/samba-goodbye-pstring.html</link>
		<comments>http://www.sfo.jp/blog/archives/2007/12/samba-goodbye-pstring.html#comments</comments>
		<pubDate>Sat, 08 Dec 2007 01:12:31 +0000</pubDate>
		<dc:creator>fumiyas</dc:creator>
				<category><![CDATA[Samba]]></category>

		<guid isPermaLink="false">http://www.sfo.jp/blog/archives/2007/12/samba-goodbye-pstring.html</guid>
		<description><![CDATA[
悪名高き(?) pstring が Samba から撲滅されたらしい。



http://gitweb.samba.org/?p=samba.git;a=commit;h=bca371bff8e1dd5099eda1 [...]]]></description>
			<content:encoded><![CDATA[<p>
悪名高き(?) pstring が Samba から撲滅されたらしい。
</p>

<p><blockquote>
<a href="http://gitweb.samba.org/?p=samba.git;a=commit;h=bca371bff8e1dd5099eda1774e5bb0fdbd6a1a77">http://gitweb.samba.org/?p=samba.git;a=commit;h=bca371bff8e1dd5099eda1774e5bb0fdbd6a1a77</a>
</blockquote>
<p>
これで Samba のハックがしやすくなるかな?
Samba 3.0 との差分が多くなってしまったので、
Samba 3.0.24 向けに作成した <a href="http://www.osstech.co.jp/">OSSTech</a> ローカルパッチを Samba 3.2 向けに直すのが大変そうな予感もする…。
</p></p>
]]></content:encoded>
			<wfw:commentRss>http://www.sfo.jp/blog/archives/2007/12/samba-goodbye-pstring.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Perl: SID のバイナリ→テキスト変換</title>
		<link>http://www.sfo.jp/blog/archives/2007/07/perl-sid-binary-to-text.html</link>
		<comments>http://www.sfo.jp/blog/archives/2007/07/perl-sid-binary-to-text.html#comments</comments>
		<pubDate>Fri, 20 Jul 2007 13:09:16 +0000</pubDate>
		<dc:creator>fumiyas</dc:creator>
				<category><![CDATA[Perl]]></category>
		<category><![CDATA[Samba]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[仕事]]></category>

		<guid isPermaLink="false">http://www.sfo.jp/blog/archives/2007/07/perl-sid-binary-to-text.html</guid>
		<description><![CDATA[Active Directory から取得したバイナリ形式の SID をテキスト形式に変換する方法。
下記の $entry は Net::LDAP::Entry オブジェクト。

2009-07-10:
コードを修正。
 [...]]]></description>
			<content:encoded><![CDATA[<p>Active Directory から取得したバイナリ形式の SID をテキスト形式に変換する方法。
下記の <code>$entry</code> は <code>Net::LDAP::Entry</code> オブジェクト。</p>

<pre class="brush: perl; auto-links: false;">
my $sid_bin = $entry-&amp;gt;get_value(&#039;objectSid&#039;);
my ($sid_rev, $sid_sub_auths_num, $sid_reserved, $sid_id_auth, @sid_sub_auths) =
  unpack(&#039;C2nNV*&#039;, $sid_bin);
my $sid = sprintf(
  &#039;S-%u-%u&#039; . &#039;-%u&#039; x $sid_sub_auths_num,
  $sid_rev, $sid_id_auth, @sid_sub_auths
);
</pre>

<p><ins>2009-07-10:
コードを修正。
SID テキストの 3 番目の文字は
subauthority の数 (<code>$sid_sub_auths_num</code>) ではなく
identifiter-authority (<code>$sid_id_auth</code>) だった。
</ins></p>
]]></content:encoded>
			<wfw:commentRss>http://www.sfo.jp/blog/archives/2007/07/perl-sid-binary-to-text.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ソフトウェア使えばバグが出る</title>
		<link>http://www.sfo.jp/blog/archives/2007/06/softwares-have-bugs.html</link>
		<comments>http://www.sfo.jp/blog/archives/2007/06/softwares-have-bugs.html#comments</comments>
		<pubDate>Wed, 27 Jun 2007 17:40:35 +0000</pubDate>
		<dc:creator>fumiyas</dc:creator>
				<category><![CDATA[Samba]]></category>
		<category><![CDATA[ダメ出し]]></category>
		<category><![CDATA[仕事]]></category>

		<guid isPermaLink="false">http://www.sfo.jp/blog/archives/2007/06/softwares-have-bugs.html</guid>
		<description><![CDATA[
…語呂が悪い。
犬もあるけば棒にあたる じゃないけど、
私がソフトウェアを使うと、ほぼ確実にバグにあたってるような気がする。
特にここ最近は酷いような気がする。
自分は多少凝った利用方法をする傾向にあると思っているが、 [...]]]></description>
			<content:encoded><![CDATA[<p>
…語呂が悪い。
<q>犬もあるけば棒にあたる</q> じゃないけど、
私がソフトウェアを使うと、ほぼ確実にバグにあたってるような気がする。
特にここ最近は酷いような気がする。
自分は多少凝った利用方法をする傾向にあると思っているが、そのせいか?
それとも他人が使わないような機能を使う傾向にあるからだろうか?
ともかく、バグのせいで仕事が進まないよ…。
</p>

<p><p>
今日のバグは
<a href=" https://bugzilla.samba.org/show_bug.cgi?id=4750"><code>libsmbclient の smbc<em>telldir</em>ctx()</code> が出鱈目なオフセット値を返す</a>、でした。
</p></p>
]]></content:encoded>
			<wfw:commentRss>http://www.sfo.jp/blog/archives/2007/06/softwares-have-bugs.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ruby: 外部コマンドとの IPC</title>
		<link>http://www.sfo.jp/blog/archives/2007/06/ruby-cmdipc.html</link>
		<comments>http://www.sfo.jp/blog/archives/2007/06/ruby-cmdipc.html#comments</comments>
		<pubDate>Sun, 10 Jun 2007 17:03:22 +0000</pubDate>
		<dc:creator>fumiyas</dc:creator>
				<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Samba]]></category>
		<category><![CDATA[ダメ出し]]></category>
		<category><![CDATA[仕事]]></category>

		<guid isPermaLink="false">http://www.sfo.jp/blog/archives/2007/06/ruby-cmdipc.html</guid>
		<description><![CDATA[
ある Samba のバグ
を回避する方法を探っている。
Samba をアップグレードできないことが想定されるため、
クライアント側 (今回は Ruby スクリプト) で対処しなければならない。
そこで、
Ruby スク [...]]]></description>
			<content:encoded><![CDATA[<p>
<a href="https://bugzilla.samba.org/show_bug.cgi?id=4683">ある Samba のバグ</a>
を回避する方法を探っている。
Samba をアップグレードできないことが想定されるため、
クライアント側 (今回は Ruby スクリプト) で対処しなければならない。
そこで、
Ruby スクリプトから Samba の rpcclient コマンドを利用して SID の名前解決を実行すべく、
外部コマンドと <acronym title="Inter-Process Communication">IPC</acronym> するクラスを書いてみた。
</p>

<p><pre class="code"><code>#!/usr/bin/ruby -w</p>

<h2>IPC class with external command</h2>

<p>class CmdIPC
attr<em>reader :reader, :writer
def initialize(command, *args, &amp;ipcproc)
if command.class == Array
@command, @arg0 = command
else
@command = @arg0 = command
end
@args = args
@ipcproc = ipcproc
@pid = nil
start</em>command
end
def start<em>command
@reader, c</em>writer = IO.pipe
c_reader, @writer = IO.pipe</p>

<h2>Parent process returns here</h2>

<p>return if @pid = fork</p>

<h2>Child process</h2>

<p>begin
@reader.close
@writer.close
STDIN.reopen(c<em>reader)
STDOUT.reopen(c</em>writer)
c<em>reader.close
c</em>writer.close
exec([@command, @arg0], <em>@args)
rescue =&gt; e
raise "cannot execute external command: #{@command}: #{e}"
end
end
def stop<em>command
if @pid
@reader.close
@writer.close
Process.kill('TERM', @pid)
Process.waitpid(@pid)
end
@pid = nil
end
def restart</em>command
stop<em>command
start</em>command
end
def ipc(input)
@ipcproc.call(self, input)
end
end
if <strong>FILE</strong> == $0
lookupsid = CmdIPC.new('/usr/bin/rpcclient', '-U%', '-d0', '127.0.0.1') {
|sid, reader, writer|
writer.puts("lookupsids #{sid}")
next unless line = reader.gets
next unless match = line.match(/^S(?:-\d+)+\s(.</em>)\s+&#40;\d+&#41;$/)
next match[1]
}
puts lookupsid.ipc('S-1-1-0')
puts lookupsid.ipc('S-1-3-0')
puts lookupsid.ipc('S-1-3-1')
end
</code></pre>
<p>
注意: この実装では、出力をバッファリングするコマンドに対しては利用できない。
</p>
<p>
(まだ素人なので)この実装がオブジェクト指向的 (Ruby 的) に美しいかどうかはよくわからないが、
参考書を片手に数分でそれっぽいのが完成してしまった。
ちょっと感動した。
Ruby だとより直感的に書けるということかな。
ソフトウェア関係で感動したことは、過去、両手で足りる回数しか経験がないので、
貴重な体験だった。
</p>
<p>
一点気になるのは、<code>CmdIPC.new</code>
に渡しているコードブロックには <code>return</code> 文が書けないこと。
Ruby のリファレンスを読めば理由は納得できるのだが、
<code>next</code> は違和感ありすぎ。
せめて <code>break</code> ならいいのだけど、
それだと LocalJumpError 例外が発生して
<q><code>break from proc-closure</code></q> と文句を言われる。
何か間違っているのかなぁ?
</p></p>
]]></content:encoded>
			<wfw:commentRss>http://www.sfo.jp/blog/archives/2007/06/ruby-cmdipc.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ruby: SMB/CIFS 共有をブラウズ</title>
		<link>http://www.sfo.jp/blog/archives/2007/06/my-first-ruby.html</link>
		<comments>http://www.sfo.jp/blog/archives/2007/06/my-first-ruby.html#comments</comments>
		<pubDate>Tue, 05 Jun 2007 15:41:25 +0000</pubDate>
		<dc:creator>fumiyas</dc:creator>
				<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Samba]]></category>
		<category><![CDATA[仕事]]></category>

		<guid isPermaLink="false">http://www.sfo.jp/blog/archives/2007/06/my-first-ruby.html</guid>
		<description><![CDATA[Post Perl は Ruby に決定。
た〜だ〜い〜ま〜勉強中〜♪ 本日 4日目。
久しぶりの勉強のためか脳疲労が激しいけど、楽しい〜♪
当然のように特有のクセがあって苦労しているけど、
どのクセも何故そのようになっ [...]]]></description>
			<content:encoded><![CDATA[<p>Post Perl は Ruby に決定。
た〜だ〜い〜ま〜勉強中〜♪ 本日 4日目。
久しぶりの勉強のためか脳疲労が激しいけど、楽しい〜♪
当然のように特有のクセがあって苦労しているけど、
どのクセも何故そのようになっているかの理由が感じられるし、
何より違和感や不快感がない!
慣れれば慣れるほど、さらに気持ちよくコーディングできそう。
Perl や PHP や Python やシェルでコーディングしていると、
違和感・不快感を感じることしきりだもんなぁ。</p>

<p>実は Ruby の勉強と平行して Samba 共有内のファイル検索ツールを今月中に作らねばならないのだけど、間に合うかしら!? いや、間に合わせねば。
Ruby の素晴しさを引き出すには時間が足りないかもしれないけど、
そこそこは使い熟せそうな感触を得ている。</p>

<p>初 Ruby スクリプトは以下のような感じ。突っ込み歓迎。
<a href="http://rubysmb.sourceforge.net/">Ruby/SMB</a> を利用して
SMB 共有内の特定の拡張子のファイルを一覧表示する Ruby スクリプト:</p>

<pre><code>#!/usr/bin/ruby -w

require "smb"

## Override SMB::Dir::Entry#url to hide "user:password" in URL
class SMB::Dir::Entry
  alias original_url url
  private <img src='http://www.sfo.jp/blog/wp-includes/images/smilies/icon_surprised.gif' alt=':o' class='wp-smiley' /> riginal_url
  def url
    return original_url.sub(%r#^([^/:]+://)(?:[^/]+@)?#, '\1')
  end
end

$ext = %w(odt ods odp doc xls ppt pdf txt htm html)
$server = "127.0.0.1"
$user = "testuser"
$password = "testuserpassword"
$server.downcase!
$auth = [nil, $user, $password]
$ext_re = Regexp.new("\\.(#{$ext.join("|")})$", Regexp::IGNORECASE)

def crawl(dir)
  dir.direntries.each do |entry|
    next if entry.name =~ /^\.\.?$/
    ## FIXME: SIGSEGV protector (libsmbclient's bug?)
    next if entry.url.length &gt; 1000
    if entry.file?
      if entry.url =~ $ext_re
        puts entry.url
      end
    elsif entry.dir?
      begin
        entry_dir = entry.open
        crawl(entry_dir)
      rescue =&amp;gt; e
        e_message = e.to_s.sub(/ - smb:\/\/.*/, '')
        STDERR.puts "#{$0}: cannot open directory: #{entry.url}: #{e_message}"
      ensure
        entry_dir.close if entry_dir
      end
    end
  end
end

SMB.on_authentication do |server, share, workgroup, user, password|
  $auth
end

begin
  server = SMB.open("smb://#{$server}/")
  #server = SMB.open("smb://#{$user}:#{$password}@#{$server}/")
rescue =&gt; e
  STDERR.puts "#{$0}: cannot connect to server: #{$server}: #{e}"
  exit 1
end
server.direntries.each do |entry|
  if entry.file_share?
    begin
      entry_share = entry.open
      crawl(entry_share)
    rescue =&gt; e
      STDERR.puts "#{$0}: cannot connect to share: #{entry.name}: #{e}"
    ensure
      entry_share.close if entry_share
    end
  end
end

exit 0
</code></pre>

<p>以下は Ruby/SMB beta3 用のパッチで、
SMB.on_authentication のバグ修正とログレベルを 0 に変更する修正:</p>

<pre><code>--- rubysmb-beta-3/rubysmb.c.dist   2002-10-17 20:13:48.000000000 +0900
+++ rubysmb-beta-3/rubysmb.c    2007-06-05 23:52:11.698527382 +0900
@@ -112,9 +112,9 @@ static void auth_fn(const char *server,
 if (RARRAY(ary)-&gt;len != 3) {
   rb_raise(eSmbError, "array should contain workgroup, username and password to use as authentication");
 }
-
-  wg = RARRAY(ary)-&gt;ptr[1];
-  un = RARRAY(ary)-&gt;ptr[0];
+
+  wg = RARRAY(ary)-&gt;ptr[0];
+  un = RARRAY(ary)-&gt;ptr[1];
   pw = RARRAY(ary)-&gt;ptr[2];
   if (!NIL_P(wg)) {
@@ -167,7 +167,7 @@ void Init_smb()
 {
   int err;
-  err = smbc_init(auth_fn, 1);
+  err = smbc_init(auth_fn, 0);
   if (err &lt; 0) {
     rb_raise(rb_eRuntimeError, "Error loading libsmbclient: %s\n", strerror(errno));
   }
</code></pre>
]]></content:encoded>
			<wfw:commentRss>http://www.sfo.jp/blog/archives/2007/06/my-first-ruby.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mac OS X Server から CentOS 4 + Samba への移行作業</title>
		<link>http://www.sfo.jp/blog/archives/2007/04/macosx-to-centos.html</link>
		<comments>http://www.sfo.jp/blog/archives/2007/04/macosx-to-centos.html#comments</comments>
		<pubDate>Tue, 24 Apr 2007 14:05:40 +0000</pubDate>
		<dc:creator>fumiyas</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Mac OS]]></category>
		<category><![CDATA[Samba]]></category>
		<category><![CDATA[UNIX]]></category>
		<category><![CDATA[仕事]]></category>

		<guid isPermaLink="false">http://www.sfo.jp/blog/archives/2007/04/macosx-to-centos.html</guid>
		<description><![CDATA[
仕事で
Mac OS X Server で実装されたファイルサーバー (SMB, AFP) を
CentOS 4.4 + Samba 3.0 (SMB) に移行する作業を行なった。
何故かは知らないが、移行対象の Ma [...]]]></description>
			<content:encoded><![CDATA[<p>
仕事で
Mac OS X Server で実装されたファイルサーバー (SMB, AFP) を
CentOS 4.4 + Samba 3.0 (SMB) に移行する作業を行なった。
何故かは知らないが、移行対象の Mac OS X Server マシンはやたら不安定で、
頻繁にリブートしたりファイルが消えたりと散々とのこと。
何かが壊れてしまったか、Mac OS X はそんなものなのか…?!
</p>

<p><p>
移行対象のファイルはおよそ 3TB あった。
移行元の OS が UNIX 系の場合、
Windows クライアントを介さずに直接 UNIX to UNIX でやったほうが絶対に楽。
何かと融通が効くし、
クライアントを介さない分速いし、
ファイル属性を完全にコピーするのが簡単だし、
トラブルが発生しても解明するのが簡単だし、
rsync で差分同期可能といいことずくめ。
ただし、ファイル名の変換が必要な場合は難しい。
</p>
<p>
Mac OS X 上のファイル名は Decomposed UTF-8 (いわゆる <q>UTF-8-MAC</q>) だが、
一般的な UNIX なら Composed UTF-8 が通例。
いつも通りファイル移行には rsync を利用したが、
現在の rsync には残念ながらファイル名の変換機能がないので
(<a href="http://rsync.samba.org/">rsync 3.0</a> で実装されるらしい)、
CentOS にコピーした後に Composed UTF-8 に変換する必要がある。
移行対象のファイルの数は膨大なので変換に結構な時間がかかるし、
rsync で最終同期をかけた後にしか実行できない。
そこで今回は、Samba の smb.conf で
<q><code>unix charset = UTF-8-MAC</code></q>
と設定することにした。
</p>
<p>
結果、別のところでトラブったが、ファイルのほうは問題なく移行できた。
ふつうの iconv(3) は UTF-8-MAC に対応していないので、
Mac OS X 上の Samba や
<a href="http://www.osstech.co.jp/">OSS テクノロジ</a>製の
Samba と libiconv (UTF-8-MAC 対応) 以外では
<q><code>unix charset = UTF-8-MAC</code></q>
は使えないのでご注意を。
</p>
<p>
そのほかに、
Mac OS X クライアントが SMB 共有上に特殊な名前のファイルを作成するという問題がある。
<q><code>veto files = /.DS<em>Store/.</em>*/</code></q>
を設定すれば抑制できるが、Mac OS X からの通常の操作でエラーが発生してしまう。
ということで、Windows クライアントに対してのみ <code>veto files</code> を適用するようにして対処。
</p></p>
]]></content:encoded>
			<wfw:commentRss>http://www.sfo.jp/blog/archives/2007/04/macosx-to-centos.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Samba: VFS recycle:minsize parameter</title>
		<link>http://www.sfo.jp/blog/archives/2007/03/samba-vfs-recyc.html</link>
		<comments>http://www.sfo.jp/blog/archives/2007/03/samba-vfs-recyc.html#comments</comments>
		<pubDate>Fri, 02 Mar 2007 02:17:47 +0000</pubDate>
		<dc:creator>fumiyas</dc:creator>
				<category><![CDATA[Samba]]></category>

		<guid isPermaLink="false">http://www.sfo.jp/blog/archives/2007/03/samba-vfs-recyc.html</guid>
		<description><![CDATA[
ようやく Samba の VFS モジュール
recycle に
recycle:minsize パラメータが追加された。



samba-technical メーリングリスト
に投稿するだけでは無視されるか放置され [...]]]></description>
			<content:encoded><![CDATA[<p>
ようやく Samba の VFS モジュール
recycle に
<a href="https://bugzilla.samba.org/show_bug.cgi?id=4409">recycle:minsize パラメータが追加された</a>。
</p>

<p><p>
<a href="https://lists.samba.org/mailman/listinfo/samba-technical">samba-technical メーリングリスト</a>
に投稿するだけでは無視されるか放置されてしまうことが多いので、
<a href="https://bugzilla.samba.org/">Bugzilla</a> に登録するほうが確実みたい。
</p></p>
]]></content:encoded>
			<wfw:commentRss>http://www.sfo.jp/blog/archives/2007/03/samba-vfs-recyc.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

