Categories: ports, ccache, Java, MySQL, Perl, PHP
ユーザごとにAUTH先のSMTPサーバを切替えてメール送信
February 16th, 2008前置き
今まで頻繁に来ていたトラックバックがあったことを知らせる通知メールが最近は来ていないな、と思っていたら、どうやら、現在利用しているISP*1でも本格的にOB25Bの制限が始まっていたらしい…。
メールのログに、
stat=Deferred: Operation timed out with XXX.XXX.XXX
と延々と記録されている。
といっても、OB25Bの初期の何年か前、こちらのサーバから携帯電話のメールサーバに宛ててメールが送信できなくなってしまったので、その頃、開始したGoogleのホスティングサービスを利用して、独自ドメインのメールはGMail上で送受信するように切替えていたので、通常使用の分には問題なかったんだけど。
ただ例外として、ブログのトラックバックやコメント等があった時の通知メールは、こちらのサーバから外部に出すようにしていた(大抵、海外からのトラックバックスパムやコメントスパムが発生原因で、あまり好ましいものとは言えないんだけど、一応…)。
しかし、放っておいても問題の解決にはならないので、調べてみたところ、
に、SMTP-AUTHの設定を解説されているサイトがあった。
ただ、プロバイダの制約上、一つのアカウントに登録できるメールアドレスは、5つまでだそうなので、プロバイダ固有のものを除くと、独自ドメインのものは最大で4つまでとなってしまう(全部、それに割り当てても良ければの話。しかも、どのメールも同一ユーザでの認証が必要)。
ちょっと、これでは都合が悪いので、あれこれ模索してみていたところ、上記GMailのメールサーバでも、独自ドメインのアドレスで送受信できる事が判明*2。Googleの解説の
では、Gmail のユーザー名 (@gmail.com を含む)
と記述されていたから、今まで、メールアドレスは、gmail.comのドメインのものじゃないと駄目だと思っていたけど。
以下、Googleのサービスを利用して、ユーザごとに認証を切替えて、メールを送信する方法について書いてみました。
- *1 現在、Yahoo!BBの回線を使用しています。
- *2 Googleでは、一つのドメインに対し、25個までのアカウントを作成することができる(無料版の場合)
SMTP AUTH対応のSendmailの構築
というわけで、外部に向けて送信するため、SMTP-AUTH対応のsendmailを構築。
まず、portsからsecurity/cyrus-sasl2をインストールして、/etc/make.confに、
SENDMAIL_CFLAGS=-I/usr/local/include -DSASL=2 SENDMAIL_LDFLAGS=-L/usr/local/lib SENDMAIL_LDADD=-lsasl2
を記述し、
# cd /usr/src/lib/libsm # make obj && make depend && make # cd /usr/src/lib/libsmutil # make obj && make depend && make # cd /usr/src/usr.sbin/sendmail # make obj && make depend && make && make install
でsendmailを再構築。
設定
次に、/etc/mail/以下の設定ファイルの記述。
通常、SMART_HOSTを使うと思うけど、そうすると送信サーバが固定されてしまうので、複数のアカウントを使い分けている場合には不便。
smarttabe.m4の利用
そこで、ここでは、ユーザごとに送信先を選べるように、smarttableを使うことにする。
まず、SorceForge.netから、open-sendmailのソースファイルを取ってきて、
# tar zxf open-sendmail-2007-09-25.tar.gz # cp -p ./cf/feature/anfi/smarttable.m4 /usr/share/sendmail/cf/feature/
と展開し、smarttable.m4をコピー。
FQDN.mcの作成
/etc/mail/内で、makeを実行して作成される/etc/mail/[FQDN].mcに、
FEATURE(`smarttable')dnl define(`RELAY_MAILER_ARGS', `TCP $h 587')dnl FEATURE(`authinfo', DATABASE_MAP_TYPE MAIL_SETTINGS_DIR`authinfo')dnl MASQUERADE_AS(`_domain_name')dnl FEATURE(masquerade_envelope)dnl
を記述する(GMailの場合、587番ポートはSTARTTSLでTSL接続、465番ポートを使用した場合は最初からSSL接続。後段は、FromとReturn-Pathの記述)。
認証ファイルの作成
次にSMTP AUTHを行うための設定。/etc/mail/authinfoを作成し、
AuthInfo:user1.smtp-gmail "U:Acount1@example.com" "P:Password1" "M:LOGIN PLAIN" AuthInfo:user2.smtp-gmail "U:Acount2@example.com" "P:Password2" "M:LOGIN PLAIN"
等と各SMTPサーバ*3に対応するユーザ名とパスワード等を記述*4した後、
# cd /etc/mail # makemap hash authinfo.db < authinfo # chmod 640 authinfo* # chgrp smmsp authinfo.db
を実行して、ハッシュのデータベースを作成し、パーミッション等を適切なものに変える。
- *3 同一の送信先に、複数のアカウントを割り当てて認証データベースを作成できないので、ここではアカウントごとに架空の送信サーバを指定して、ローカルのDNSで名前解決させることにしています。
- *4 Sendmail cf/README - SMTP AUTH参照。
ユーザごとの送信先
/etc/mail/smarttableを作成し、
localuser1@host.local.domain user1.smtp-gmail localuser2@host.local.domain user2.smtp-gmail
等と記述し、ローカルのユーザと送信先を対応させて、
# makemap hash /etc/mail/smarttable.db < /etc/mail/smarttable
とデータベースファイルを作成。
DNSの設定
ローカルのDNSのzoneファイルには、
*.smtp-gmail IN CNAME smtp.gmail.com.
を追加して、名前解決できるようにし、namedを再起動。
設定の終了、sendmailの再起動
ローカル宛てのメールは、上記の設定を反映させる必要もないので、[FQDN].submit.mcに、
dnl If you use IPv6 only, change [127.0.0.1] to [IPv6:::1]
DAEMON_OPTIONS(`Name=NoMTA, Addr=127.0.0.1, M=EA')dnl
FEATURE(`msp', `[127.0.0.1]')dnl
を追加。
# make install restart
で、/etc/mail/sendmail*.cfを構築して、sendmailを再起動。
備考
以上の設定で、目的は果たせたようです。
なお、上記の設定は、ほとんど、
を参考にしたものです。
portupgrade-devel - PortDirError
January 30th, 2008先日、ports-mgmt/portupgrade-develが2.3.1から2.4.0のバージョンに更新されていた。
しかし、前バージョンportupgradeを使って、新しいものに更新しようとしても何故か失敗する。
結局、pkg_deleteで古いものを一旦削除し、make installで新しいportupgradeをインストールし直すという方法を取った。
ところが、新しく導入したportupgradeを使って、
portupgrade -aRr
と他のportsを更新しようとしても、最初の
[Gathering depends for portdir/portname ....done]
の後、失敗する。
/usr/ports/INDEX-*.db/var/db/pkg/pkgdb.db
のデータベースファイルを作り直してみても、症状は同じ。
ログをよく見てみると、
** Port directory not found: databases/grass-i18n /usr/local/sbin/portupgrade:1349:in `get_pkgname': port directory error (PortDirError)
という風にエラーが開始している。
確かだいぶ前にjapanese/ipa-ttfontsのTrueTypeフォントを入れた時、依存関係から、databases/grass-i18nも一緒に入って来た。
調べてみると、ipa-ttfontsは、現在もう、grass-i18nには依存してないようなので、grass-i18nの方をアンインストール(grass-i18nは、databases/grassにマージされて現在、portsディレクトリには存在していない)
今度は、新しいportupgradeでも、他のportsを更新できるようになりました。
[追記] これを書き終わった頃に、portupgrade-develが2.4.1のバージョンに更新されていました。A bugs fix release
だそうです。
Apache 2.2.6
September 23rd, 2007www/apache22のportが、Apache 2.2.6のバージョンのものにアップデートされていたので更新。
ビルド前、make configが実行されるようで、OPTIONS メニューが立ち上がるようになったらしい。
こちらの環境では、pkgtools.conf内に、
MAKE_ARGS = {
'www/apache22' => [
'WITH_MPM=worker',
],
}
といったように記述してある。
workerでは、デフォルトでONになっているmod_cgiが構築されないので、メニューの最後の方にあるmod_cgidの方を有効にしてビルドした。
PHP 5.2.1
February 11th, 2007portsの方のlang/php5が、PHP 5.2.1になっていた(今まで、5.2.0を使用していた)。
その他のportsも含めて更新したかったので、
# portupgrade -aRr
としたところ、途中、なぜか、
cd: can't cd to /usr/ports/databases/pecl-PDO
と表示され、php5-extensions等のいくつかのportsの更新に失敗。
どうやら、
にあるように、こちらの方で以前からインストールしてあったpecl-PDO
が、php5-pdoに変更された事が原因らしい(typo?)。
そこで、一旦、
# pkg_delete -f /var/db/pkg/pecl-PDO-1.0.3
と古いのを削除してから、再度、
# portupgrade -aRr
を実行したところ、うまく行った。
追記
修正されました。
New ports category was created - /usr/ports/ports-mgmt
February 5th, 2007いつものように、
# portsnap fetch update && portsdb -u
とportsツリーを更新し、
# portversion -l '<'
と更新されたportsを確認しようとしたら、
cd: can't cd to /usr/ports/sysutils/portupgrade
と警告された。
を見たところ、
20070205: AFFECTS: everybody AUTHOR: pav@FreeBSD.org New ports category was created - /usr/ports/ports-mgmt Most significant port moved to this new category is portupgrade. So don't be alarmed, it was not deleted. You can find it now in /usr/ports/ports-mgmt/portupgrade
と、portupgradeが、ports-mgmtというディレクトリに移動したらしい。
MySQL 4.1.22に更新
November 28th, 2006Java 1.5 文字化け
November 16th, 2006先ほど、マインドマッピングの話題を聞いて面白そうだったので、使ってみようと思った。
FreeBSDの方でも、探してみたところ、deskutils/freemindのportに用意されていたので、早速インストール。
しかし、立ち上げてみたものの、日本語環境だとメニューが文字化け(豆腐になる)する。
どうやら、先日、インストールしたJava 1.5の方で、日本語の設定をしてなかったらしい。
- /usr/local/bin/freemind
にインストールされるシェルスクリプトを
JAVA_VERSION="1.4+" "/usr/local/bin/java" -cp "${CLASSPATH}" freemind.main.FreeMind "${FILE}"JAVA_VERSION="1.4" "/usr/local/bin/java" -cp "${CLASSPATH}" freemind.main.FreeMind "${FILE}"
のように書き換えれば、javawrapperの方で、以前からインストールしてあるJava 1.4の方を使ってくれるので文字化けはしなくなるけど、その場しのぎだし、あまり面白くない。
調べてみたところ、
に掲載されている設定ファイルを、
- /usr/local/jdk1.5.0/jre/lib/fontconfig.FreeBSD.properties
の場所にコピペして保存してみたら、問題は解決した。
ちゃんと、1.5でも日本語が表示されます。
関連情報
PHP 5.2.0
November 7th, 2006portsnap(8)したら、lang/php5のportが、5.1.6のバージョンから5.2.0に更新されていた。
ということで、依存するものを含めてportupgrade(8)した*1。
以前のバージョンのphp.iniは使い回せなかったので、後はこれを修正した程度。
- *1 普段は、癖で、バージョンに変更があったportsだけを更新するため、「
portupgrade -aRr」のようにして更新している。www/eacceleratorを使っている場合、上記のようなやり方では、通常、eacceleratorの方は更新してくれない。
PHPをApache moduleとして使っていて、PHPに大きな変更があったのに、eacceleratorの方を再構築し直さないと、Apacheが起動できなくなる。
(自分がたまに忘れる)
関連情報
Eclipse 3.2.1
November 5th, 2006java/eclipseのportが、3.1.2のバージョンから、3.2.1に更新されていたので、アップグレードしてみた。
今回、JAVA_VERSIONの方も、1.4+から1.5+へと変更があった。
したがって、1.5以上のバージョンのJavaが必要になる。
今まで、私は、Javaの方は、1.4のバージョンだけを使用していたけど、この機会に、1.5の方もインストールすることにした。
インストールに使用したportは、java/jdk15の方。ただ、これのblowser plugin
は、現在のところ、www/mozillaのportにしか対応してない様だったので、これは無効とした。
(私は、Firefoxを使っているので)
Firefoxのプラグイン用に、古いバージョンのJavaも残しておくことにする。
Firefox 2.0
November 2nd, 2006昨日、www/firefoxのportが、1.5.0.7のバージョンから、2.0に更新されたようなので、アップグレードしようとしたら、portaudit(1)のdatabaseに脆弱性が登録されていたようで、ソースをfetchできなかった。
DISABLE_VULNERABILITIES=yesとしてまで、インストールはしたくなかったんだけど、何げに、
# portaudit -F
と定時のcronに任せるのでなく、手動で更新したら、ちょうど修正されてたようで、うまくfetchできるようになった。
ちなみに、データベースの日付は、
# portaudit -d Database created: Thu Nov 2 20:10:19 JST 2006
しばらくのビルド作業の後
GNOME 2.16
October 14th, 2006/usr/ports/UPDATINGの20061014によると、GNOMEとGTK+2のコンポーネントが全て、X11BASEから、LOCALBASEに移動したらしい。
私は、デスクトップ環境にはGNOMEは使ってないけど、関連するportsも多々インストールされているので、上記を参考に、
# pkgdb -Ff # portupgrade -rf glib-2\* cairo gnome-mime-data dbus
としておいた。
追記 2006/10/17上記ような更新で、こちらの環境では、特に不具合*1は見当たらなかったけど、/usr/ports/UPDATINGの該当箇所が修正されて、より安全に、
# pkgdb -Ff # portupgrade -rf pkg-config\*
とアップグレードした方が良いとのこと。
- *1 misc/gnomehierの古いバージョンが残り、さらに新しいバージョンがインストールされてしまったこと以外は。
(と思ってたら、/usr/X11R6/以下には、結構、残骸が残ってますね・・)
MySQL 4.1.21に更新
August 7th, 2006databases/mysql41-{server,client}のportsを4.1.20から4.1.21に更新。
バージョン間の変更点は、
参照。
あと、余談になるけど、私の環境では、MySQLサーバに限らず、個々のデーモンはなるべくjail環境下において切り分けることにしている。
そして、portsに更新等があれば、ホスト側の/usr/portsを、jail環境下の/usr/portsに、mount_nullfsを利用して使い回し、portupgrade等を使って、jail内で再構築することにしている。
しかし、Apache等のjail環境では問題はないのに、なぜか、MySQLサーバのjail環境だけ、MySQLサーバを更新した後、マウントした/usr/portsを解除しようとしても、
umount: unmount of /usr/home/jail/db1/usr/ports failed: Device busy
と怒られていた。
どうやら、/usr/local/etc/pkgtools.conf内の
- BEFOREINSTALL
- AFTERINSTALL
の記述で、インストール前後に、自動的にデーモンを停止・起動し直すようにしていると、MySQLサーバが、jail側の/usr/ports以下をworking directoryとして使用してしまうらしい。
もしやと思って、今回、
AFTERINSTALL = {
# Automatically start MySQL server
- 'databases/mysql41-server' => '/bin/sh ' + localbase() + '/etc/rc.d/mysql-server start',
+ 'databases/mysql41-server' => '/bin/sh -c "cd && ' + localbase() + '/etc/rc.d/mysql-server start"',
}
のように、サーバを起動する際、一旦、作業ディレクトリをデフォルトのものに戻してから、起動するように設定してみたら、上記のようなマウント解除できないという問題は発生しなくなりました。
自動的にportsが追加するUserとGroup
July 27th, 2006ちょっと前から、
なるファイルが出来てきた。
特定のportsで、自動的に追加されるUIDやGIDの番号の一覧を提供するらしい。
- UIDs and GIDs - FreeBSD Porter's Handbook
もし、ローカルで、50から999の番号のUIDもしくはGIDを利用する際は、重複するものがないかどうか、確認した方が良さそう。
PHP4からPHP5に乗り換えた
July 23rd, 2006先日、www/mediawikiのportを更新して、MediaWikiを1.7のバージョンのものにしようとしたが、MediaWiki 1.7はPHP4には対応していなかったため、やむを得ず、www/mediawiki16のportに切替えた。
この間、更新したb2evolution 1.8-betaは、PHP5には対応しているようだし、そろそろ全面的にPHP5の環境に乗り換えるのも悪くないと考え、今回、思い切って、www/php4からwww/php5のportに移行してみました。
portupgrade等を使って置き換える方法もあると思うけど、今回は、一旦、全部PHP関係のportsを削除し、新しいバージョンを新たにインストールするという手法を選びました。
まず、備忘のため、一応、
# cp /var/db/pkg/php4-4.4.2_2/+REQUIRED_BY /var/tmp/
とインストール済みのPHP4に依存するportsを控えておく。
続いて、
# cat /var/db/pkg/php4-4.4.2_2/+REQUIRED_BY | xargs pkg_delete -f # pkg_delete php4-4.4.2_2
とPHP4とそれに依存するportsを削除。
そして、
# portinstall lang/php5
と、PHP5のportをインストールし*1、先ほどバックアップした情報を参考に、
# portinstall lang/php5-extensions
を利用して、(必要な)主だった拡張モジュールをインストール。
後は、先ほど削除したそれ以外のportsを、インストールし直し、サーバを再起動する*2だけです。
- *1 以前にも書いたように、PHPのportsは標準では、CLI版とCGI版がビルドされて、Apacheモジュールは標準ではコンパイルされないので注意。
- *2 その前に、
/usr/local/etc/php.iniを新たに作成するのも忘れずに(新しくインストールされた/usr/local/etc/php.ini-recommendedをテンプレートとして使った)。
ただ、従来、.htaccessなどで、
<Files "FreeBSD"> SetHandler php-script </Files>
と記述し、PHPスクリプトとしてハンドルしていたものは、
<Files "FreeBSD"> SetHandler php5-script </Files>
のように、書き直さなければ駄目でした(でないと、ソース丸見えになった)。
MediaWiki の port を www/mediawiki16 に変更
July 18th, 2006/usr/ports/UPDATINGの20060714によると、
www/mediawiki version is 1.7 now. 1.6 version was preserved on www/mediawiki16 port.
と、www/mediawikiのportは、1.7系列のバージョンのものに切り替わったらしい。
一応、このサーバにもMediaWikiはインストールしてあるんだけど、
私の環境で、更新しようとしても、
cannot install: doesn't work with PHP version : 4 (Doesn't support PHP 4)
と怒られてしまう。
どうやら、1.7系列ではPHP4は、サポートされていないらしい・・。
でも、弱ったことに、PHP4でしか動かないアプリもいくつか、このサーバには存在する。
身動きが取れないけど、そのまま放置しておくのも何なので、とりあえず、
# portupgrade -o www/mediawiki16 -f mediawiki
のように、www/mediawiki16のportに変更しておいた。
そろそろ、PHP5に乗り換える準備に取り掛からねば・・。
