ほかからゲットねた
さまざまなRelayコントローラがありますが、ここでは導入が比較的簡単なrelay-ctrlを使用します。http://untroubled.org/relay-ctrl/からrelay-ctrl-2.5.tar.gzをダウンロードして展開します。
$ tar xvfz .relay-ctrl-2.5.tar.gz $ cd relay-ctrl-2.5/
インストール先を変更する場合はdefines.hを編集します。ここではデフォルトのままにし、引き続きmakeとインストールを行います。
$ make # make root-install
続いて設定ファイルを作成します。
# mkdir /etc/relay-ctrl # mkdir /var/qmail/relay-ctrl # mkdir /var/qmail/relay-ctrl/spool # cd /etc/relay-ctrl/ # echo '900' > expiry # echo ":allow,RELAYCLIENT=''" > rule (*) # echo '/etc' > rulesdir # echo 'tcp.smtp.cdb' > smtpcdb # echo 'tcp.smtp' > smtprules # echo '/var/qmail/relay-ctrl/spool' > spooldir # echo '/usr/local/bin/tcprules' > tcprules ダブルクオートを使用している点に注意
/etc/relay-ctrl下に生成されたファイルには、次のような意味があります。
- expiry
- RealyをオープンにしたIPアドレスを記録したファイルの寿命。デフォルトは900秒。
- rule
- POPで接続してきたIPアドレスに付加するルール。当然Relayを許可しなくてはいけないので「:allow,RELAYCLIENT=''」となります。
- rulesdir
- cdbファイルとその基になるテキストファイルが収められているディレクトリ。デフォルトは「/etc/tcpcontrol」。
- smtpcdb
- 更新するcdbファイル名。デフォルトは「smtp.cdb」。
- spooldir
- Relayを許可したIPアドレスを記録しておくスプール。デフォルトは/var/spool/relay-ctrl」。
- tcprules
- tcprulesコマンドのパス。デフォルトは「/usr/bin/tcprules」。
次に、spoolにたまったIPアドレスの記録を定期的に削除する指示をcrontabに追加します。
# crontab -e
として、下記の行を追加します。
* * * * * /usr/sbin/relay-ctrl-age
これで、記録を整理するプログラムを毎分起動するようになります。このプログラムにより、expiryで指定された保存期間を過ぎた記録を消去できます。
start) 〓省略〓 tcpserver -v 0 pop3 /var/qmail/bin/qmail-popup [サーバのFQDN] [認証プログラム] /usr/sbin/relay-ctrl-allow /var/qmail/bin/qmail-pop3d Maildir 2>&1 | /var/qmail/bin/splogger pop3d 3 & echo touch /var/lock/qmail ;; stop) 〓省略〓
注:[認証プログラム]には、ここで紹介した /bin/checkpassword /bin/checkpw /bin/checkapoppw /bin/selectcheckpw を用途によって指定します。
また、ここでは/usr/sbin/relay-ctrl-allowがroot権限で起動されていますが、さらにセキュリティを高めるため、専用のユーザーを使用することをお勧めします。その場合は下記の作業を行います。
/var/qmail/relay-ctrlをホームディレクトリに持つユーザーrelay-ctrlを作成し、ホームディレクトリのオーナーを変更します。
# adduser -d /var/qmail/relay-ctrl -s /bin/false relay-ctrl # chown -R relay-ctrl /var/qmail/relay-ctrl
relay-ctrl-allowコマンドの所有者を変更し、もう一度setuidします。
# chown relay-ctrl /usr/sbin/relay-ctrl-allow # chmod u+s /usr/sbin/relay-ctrl-allow
cdbファイルもユーザーrelay-ctrlによって上書きできる必要があるため、/etc/tcp.cdbから書き込み可能な/var/qmail/relay-ctrl/tcp.smtp.cdbに変更します。
# cp /etc/tcp.smtp /var/qmail/relay-ctrl/. # echo '/var/qmail/relay-ctrl' > /etc/relay-ctrl/rulesdir
cdbファイルのパスが変更になるため、qmail-smtpを起動するtcpserverの起動方法も変更する必要があります。
start) 〓省略〓 tcpserver -v -u[qmaildのUID] -g[nofilesのGID] -x /var/qmail/relay-ctrl/tcp.smtp.cdb 0 smtp /var/qmail/bin/qmail-smtpd 2>&1 | /var/qmail/bin/splogger smtpd 3 & tcpserver -v 0 pop3 /var/qmail/bin/qmail-popup [サーバのFQDN] [認証プログラム] /usr/sbin/relay-ctrl-allow /var/qmail/bin/qmail-pop3d Maildir 2>&1 | /var/qmail/bin/splogger pop3d 3 & echo touch /var/lock/qmail ;; stop) 〓省略〓
require 'ftools' とすると、ファイルのコピーや削除などのメソッドが追加される。 to は新たなファイル名かディレクトリ名。 verbose が真のとき、標準エラー出力に処理の経過が出る。
File.makedirs(dirs[, ...][, verbose = false]) File.mkpath(dirs[, ...][, verbose = false])
(複数の)ディレクトリを作成する。多階層のパスを一度に作成することも可能。 mkdir -p(mkdir(1))に相当。
今月の日記
#calendar(日記-$today$)
来月の日記
#calendar(日記-$today>>1$)
今週の日記
#calendarw(日記-$today$)
新アルゴリズム(適当)
#!/usr/bin/ruby -Ke require "date" class Calendar Days=[0,31,28,31,30,31,30,31,31,30,31,30,31] Week=['日','月','火','水','木','金','土'] def initialize(date="2002/10/10") @date=Date.new($1.to_i,$2.to_i,$3.to_i) if /([0-9]+)\/([0-9]+)\/([0-9]+)/.match(date) end def to_s # @date end def month # fday=Date.new(@date.year,@date.mon,1) eday=Date.new(@date.year,@date.mon,Days[@date.mon]) r="|#{Week.join('|')}|\n|#{' |'*(fday.wday)}" fday.upto(eday){|d| r+="#{sprintf("%2d",d.day)}|#{"\n" if d.wday==6}#{'|' if d.wday==6 && d!=eday}" } "#{r}#{' |'*(6-eday.wday)}" end def week # fday=@date-@date.wday eday=fday+6 r="" fday.upto(eday){|d| r+="|#{d.mon}/#{d.day}(#{Week[d.wday]})|#{d.to_s}|\n" } r end end if __FILE__ == $0 puts Calendar.new('2002/10/24').week end
若干修正
#!/usr/bin/ruby -Ke require "date" class Calendar Days=[0,31,28,31,30,31,30,31,31,30,31,30,31] Week=['日','月','火','水','木','金','土'] def initialize(date="2002/10/10") @date=Date.new($1.to_i,$2.to_i,$3.to_i) if /([0-9]+)\/([0-9]+)\/([0-9]+)/.match(date) end def self.month(date="2002/10/10") new(date).month end def self.week(date="2002/10/10") new(date).week end def month # eday=((fday=@date-@date.day+1)>>1)-1 r="|#{Week.join('|')}|\n|#{' |'*(fday.wday)}" (fday).upto(eday){|d|r+="#{sprintf("%2d",d.day)}|#{"\n" if d.wday==6}#{'|' if d.wday==6 && d!=eday}"} "#{r}#{' |'*(6-eday.wday)}" end def week # r="" (@date-@date.wday).upto(@date-@date.wday+6){|d| r+="|#{d.mon}/#{d.day}(#{Week[d.wday]})|#{d.to_s}|\n" } r end end if __FILE__ == $0 puts Calendar.new('2002/10/24').week puts Calendar.new('2002/10/24').month puts Calendar.week('2002/10/24') puts Calendar.month('2002/10/24') end #contents *[課題] 未解決課題 ++ツリー構造表示をつける。 ++パン屑ナビをつける http://japan.internet.com/webtutorial/20011031/1.html ++一覧に 数字・記号・日本語・英語 の大分類を導入する。 ++Wiki2htmlのオーバライド部分をブロック渡しにする。 -これによって可搬性がますだろう・・・ ++#commentlの引用モードに対応する -#commentl(前のコメントのURLエンコード)を張り込んでおく ++保存時のファイルのロック -ちょっとしか人が来ないのにそんな必要があるのか?(笑) -とりあえずかなり保留とする。 ++履歴ファイルの整理モードを作成する -安全のために別プログラムにすべきであろう -いまさらユーザ認証したくない・・・ ++ブックマーク登録用の#bookmarkを作成する -ジャンルとソート機能を付加する ++csv機能を追加する -wikiページ内に@で始まるデータエリアを形成する(emacsのバッファのイメージ) ++#search(wikiページ名)に対応する -ページ内でSearchPagesの結果をincludeする ++#include(wikiページ名)に対応する -#include(/日記-10*/)で日記のページがインクルードされるようにする -無限ループになるかもしれないので被インクルードファイル中の#includeは無視 -インクルードしたページをすべてスタックすれば無限ループは避けられる。 ++#imgに対応する ++#midiに対応する ++#wavに対応する ++ファイルアップロード機能に対応する -セキュリティーホールになる可能性があるので拡張子は限定しよう。 ++・・・(1コード)が「ゥ」に変換されてしまう。 -隣の文字も引き連れてくるんだよなゥ -http://216.239.33.100/search?q=cache:Qrr5euYm4NIC:switch.vivian.jp/html/kinsokumoji_hensyuu.htm+%E3%82%A5+%E6%96%87%E5%AD%97%E5%8C%96%E3%81%91&hl=ja&ie=UTF-8 -どうも禁則文字周りみたい。 ++macroのためにモジュールを外界から隔離する [[remove_const:http://www.ruby-lang.org/ja/man-1.6/?cmd=view;name=Module#remove_const]]は組込みクラスには適用できない。 >|| Module.constants.each{|a| eval("#{a}=nil")}
- これで全ての定数を無効化できる。
Module.instance_methods
- スレッド+セーフレベルで対応か?
def safe(level) result = nil Thread.start { $SAFE = level result = yield }.join result end a=safe(4) { eval("1+1") } # $SAFEなので例外 puts a