ほかからゲットねた

さまざまな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」。
  • smtprules
    • cdbの基になるテキストファイル。前回tcpserverのインストール時に使用したtcp.smtpに当たります。デフォルトは「smtp.rules」。
  • spooldir
    • Relayを許可したIPアドレスを記録しておくスプール。デフォルトは/var/spool/relay-ctrl」。
  • tcprules
    • tcprulesコマンドのパス。デフォルトは「/usr/bin/tcprules」。

次に、spoolにたまったIPアドレスの記録を定期的に削除する指示をcrontabに追加します。

 # crontab -e 

として、下記の行を追加します。

 * * * * * /usr/sbin/relay-ctrl-age 

これで、記録を整理するプログラムを毎分起動するようになります。このプログラムにより、expiryで指定された保存期間を過ぎた記録を消去できます。

次にqmailスクリプトを変更します。

   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) 
     〓省略〓 

Debian

qmailのインストール

require 'ftools' とすると、ファイルのコピーや削除などのメソッドが追加される。 to は新たなファイル名かディレクトリ名。 verbose が真のとき、標準エラー出力に処理の経過が出る。

 File.makedirs(dirs[, ...][, verbose = false]) 
 File.mkpath(dirs[, ...][, verbose = false]) 

(複数の)ディレクトリを作成する。多階層のパスを一度に作成することも可能。 mkdir -p(mkdir(1))に相当。

今日の日記:日記-$today$

今月の日記
#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