FreeBSDで運用する(その13)

今度はWWWユーザの設定である。
先ず、/etc/groupを変更して、WWWユーザを影舞ユーザグループにも追加する。

kagemai:*:1002:
    ↓
kagemai:*:1002:www

ちなみに、FreeBSD 5.4では/etc/passwdにWWWユーザが既に登録されている(実際には、apacheをインストールしたときに追加される)。

www:*:80:80:World Wide Web Owner:/usr/local/www:/usr/sbin/nologin

qmail上でWWWユーザがメールを受信したときに、指定したプログラムを実行するためには~www/.qmailを次のように記述する。

#↓これはデバッグ用
#|cat >> ~/mail.txt
#↓これはプログラム実行用
|ruby ~/mailrcv.rb

そして、WWWユーザがメールを受信したときに実行するrubyスクリプトの~www/mailrcv.rbを以下のように記述する。

#!/usr/bin/env ruby

=begin
    kagemai@KAGEMAI.LOCALDOMAIN.co.jp から
    www@KAGEMAI.LOCALDOMAIN.co.jp に転送されたバグ報告メールを投稿する。
    詳細は mailtrn.rb を参照のこと。
=end

$magic_guid = "{322A5CD3-8A74-4c2a-A988-18B65C57CE6B}"
$kagemai_dir = "/usr/local/www/htdocs/kagemai"
$project_dir = "#{$kagemai_dir}/project"
$kagemai_mail = "/usr/local/bin/ruby #{$kagemai_dir}/bin/mailif.rb"

=begin
    nameに一致するプロジェクトを検索する。
=end
def match_project(name)
    Dir["#{$project_dir}/*"].each do |dir|
        dir.gsub!("#{$project_dir}/", "")
        if (name == dir)
            return true
        end
    end
    return false
end

=begin
    メールの X-Kagemai-Mail-Transfer が影舞ユーザか?
    Subject が "[PROJECT[:<BTS#>]]"(例:"[test:263]")に一致するか?
    をチェックする。
=end
def check_kagemai(lines)
    project = ""
    lines.each do |line|
        if (line =~ /^X-Kagemai-Mail-Transfer: /)
            if ($' != $magic_guid)
                return ""
            end
        elsif (line =~ /^Subject: /)
            if ($' =~ /^.*?\[(.*?)[:\]]/)
                if (match_project($1))
                    project = $1
                else
                    return ""
                end
            else
                return ""
            end
        elsif (line == "")
            return project
        end
    end
    return project
end

=begin
    linesで指定された報告をprojectに投稿する。
=end
def call_kagemai(lines, project)
    IO.popen("#{$kagemai_mail} #{project}", "w") do |kagemai|
        in_header = true
        lines.each do |line|
            if (in_header)
                if (line =~ /^Subject: /)
                    if ($' =~ /^.*?\[.*?\]\s*?/)
                        line = "Subject: #{$'}"
                    end
                elsif (line == "")
                    in_header = false
                end
            end
            kagemai.puts "#{line}\n"
        end
    end
end

#ここ↓からメイン
lines = STDIN.read.split(/\n/) # メールを文字列配列に読み込む
project = check_kagemai(lines) # メールの内容をチェック
if (project != "")
    call_kagemai(lines, project) # エラーがなかったら影舞に投稿
end

exit 0

qmailのセキュリティでは、以下のようにファイルのパーミッションを変更して置かないと、正常に動作しないので注意する必要がある。

# cd ~www
# chown www:www .qmail mailrcv.rb
# chmod 600 .qmail mailrcv.rb

これで、WWWユーザの設定は完了である。