2011年4月26日火曜日

rrdtool について

rrdtool info

最大値を確認するには、
$ rrdtool info ファイル.rrd | grep max

rrdtool tune

最大値を修正するには、
$ rrdtool tune ファイル.rrd -a データソース名:最大値
ただし、最大値制限なしは、「U」を指定。 sysworks 資料庫 rrdtool マニュアル訳 参照

おまけ

グラフをグラデーションにするには、
DEF:a=$rrddir\/$_[0].rrd:ds0:LAST \
CDEF:a2=a,0.8,* \
CDEF:a3=a2,0.8,* \
CDEF:a4=a3,0.8,* \
CDEF:a5=a4,0.8,* \
AREA:a#FF7F00:Active \
AREA:a2#FF8C19:Active \
AREA:a3#FF9933:Active \
AREA:a4#FFA54C:Active \
AREA:a5#FFb266:Active \
こんな感じで指定すると可能

rrd の作成方法

$ rrdtool create ファイル名.rrd \
--step 300 \
DS:ds0:COUNTER:600:0:125000000 \
DS:ds1:COUNTER:600:0:125000000 \
RRA:AVERAGE:0.5:1:600 \
RRA:AVERAGE:0.5:6:700 \
RRA:AVERAGE:0.5:24:775 \
RRA:AVERAGE:0.5:288:797 \
RRA:MAX:0.5:1:600 \
RRA:MAX:0.5:6:700 \
RRA:MAX:0.5:24:775 \
RRA:MAX:0.5:288:797 

$ chmod o+r ファイル名.rrd
でOK。

2011年4月22日金曜日

フルノシステムズのアクセスポイントについて

Web認証のシーケンス

  1. SSIDに対して所定のパスフレーズで接続
  2. 10.0.0.0/8のIPアドレスがAP組み込みのDHCPサーバから一時的に振り出される。リース時間は数秒程度。
  3. ユーザがブラウザを開いてHTTPトラフィックが発生するまで、有線側へのトラフィックは全遮断。
  4. HTTPトラフィックを横取りして、AP組み込みWebサーバportal.unifasへリダイレクト。
  5. APはWeb認証画面のフォームにPOSTされたユーザID・パスワードを使ってユーザを認証する。認証バックエンドはLDAPサーバ。
  6. ユーザIDが認証されたら、その端末からのトラフィックを有線側へ転送開始。
  7. この時点で、DHCPサーバからIPアドレスが改めて振り出し直される。
  8. DHCPサーバから正式なIPアドレスを取得した以降は、普通にインターネットアクセス可能。
  9. 但し、上流側にはHTTPなど通常利用で必須のサービスに限定するACLが掛かっている。また、APに繋がっているクライアント間通信はAPの「セグメンテーション機能」により全遮断されている。
  上記のステップ 7 が曲者で、Mac OS X の挙動として最初に振り出された一時的 IP アドレスのリース時間が極めて短くしてあるにも関わらず、何故かIPアドレスを取得し直さないという問題がある。 現状ではユーザ側で以下のような対応をする以外に方法がない模様。
  • Web認証したら、一旦、ブラウザを閉じる。
  • ブラウザを閉じたら、MacBookを閉じてスリープさせる。おおよそ5秒程度以上。
  • 再度MacBookを開いてリジュームさせる。
  • 再度ブラウザを開けば、インターネットアクセス可能になっている(はず)。
  • 上手く行かなかったら、上記手順を繰り返してみる。

2011年4月21日木曜日

python でメールを送信するテスト

python でメールを送信すると、こうなる。
#!/usr/bin/python
# coding: utf-8

import smtplib

from email.MIMEText import MIMEText
from email.Header import Header
from email.Utils import formatdate

from_addr = 'watari@hogefuga'
to_addr = 'watari@fugafuga'
subject = u'メール送信テスト'
body = u'''SMTP 通信によるメール送信テストです。
これは改行されるかな?'''

encoding = 'iso-2022-jp'

msg = MIMEText(body.encode(encoding), 'plain', encoding)
msg['Subject'] = Header(subject, encoding)
msg['From'] = from_addr
msg['To'] = to_addr
msg['Date'] = formatdate()

s = smtplib.SMTP('メールサーバ', 25)
s.sendmail(from_addr, to_addr, msg.as_string())
s.close()
三重クォートで囲むと、改行文字列が表現できる。 クオートの前にある小文字の "u" は、Unicode 文字列を生成 することになっていることを示す。 2011.04.25 追記
s = smtplib.SMTP('メールサーバ', 25)
s.sendmail(from_addr, to_addr, msg.as_string())
s.close()
を、
s = smtplib.SMTP('メールサーバ', 465)
s.login('ユーザ名','パスワード')
s.sendmail(from_addr, to_addr, msg.as_string())
s.close()
とすると、SMTP-AUTHの通信が可能。

2011年4月20日水曜日

メールのヘッダについて

メールヘッダには、各サーバが受信した時間は書かれているが、 送信した時間は、書かれていない。 「Date:」ヘッダがあるのだが、これは、メールを送信元の送信キューに 置く準備ができた時間。 「後で送信」とかすると、実際に送信した時間と異なる。

mailman の Defaults.py

# -*- python -*-
# -*- coding: euc-jp -*-

# Copyright (C) 1998-2007 by the Free Software Foundation, Inc.
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
# USA.

# [訳注] このファイルは, Mailman 2.1.9 配布物に含まれる
#   Mailman/Defaults.py.in (SF.net での Subversion リビジョンは 7965)
#   のコメント部分を日本語 (共通語) に翻訳したものです.
#   配布等の条件は原文と同様, GNU 一般公衆利用許諾契約書 (GNU
#   General Public License) に従います (上記も参照ください). 内容の正
#   確な理解のためには, 配布物に含まれる原文を参照されることをお勧めし
#   ます.
#   訳者: IKEDA Soji 

"""配布時点の Mailman の重要な設定変数の既定値."""

# サイト固有の設定のためにこのファイルを変更しては*いけない*. かわりに
# そういったことは, かならず mm_cfg.py の指定された範囲に書くこと.
# 詳しくは mm_cfg.py のコメントを見る.


import os

def seconds(s): return s
def minutes(m): return m * 60
def hours(h): return h * 60 * 60
def days(d): return d * 60 * 60 * 24

# 便利な定数 [>=2.1.2]
try:
    True, False
except NameError:
    True = 1
    False = 0

Yes = yes = On = on = True
No = no = Off = off = False


 
#####
# システム全般の既定値
#####

# 画像のロゴを使うかどうか. 0 に設定すると「我々の後援者」の画像のロゴ
# を無効にし, テキストのリンクを張るだけになる (これはショートカットの
# 「favicon」も無効にする). そうでなければ, ここはロゴ画像の URL のベー
# スパスにしなければいけない (そして, 最後のスラッシュは含めなければい
# けない).  Mailman のロゴ入りページフッタまでも無効にしたいと言うのな
# ら, Mailman/htmlformat.py: MailmanLogo() をハックすること. リンクと
# 画像の名前はそこにハードコードしてある.
IMAGE_LOGOS = '/icons/'

# Mailman の favicon の名前
SHORTCUT_ICON = 'mm-icon.png'

# MAILMAN_URL は, ミラーのどれかを指すようにしたいとき以外は変えないこと.
MAILMAN_URL = 'http://www.gnu.org/software/mailman/index.html'
#MAILMAN_URL = 'http://www.list.org/'
#MAILMAN_URL = 'http://mailman.sf.net/'

# Mailman は, (少なくとも) 二つの完全修飾ドメイン名 (FQDN) について知
# る必要がある; 1) あなたの URL に使うホスト名と, 2) あなたのドメイン
# の電子メールアドレスに使うホスト名. たとえば, みんながあなたの 
# Mailman システムに"http://www.dom.ain/mailman" でアクセスするのなら, 
# あなたの URL に使うFQDN は "www.dom.ain" になる. みんながあなたのシ
# ステムに "yourlist@dom.ain" 宛でメールを送るのなら, あなたの電子メー
# ルの FQDN は "dom.ain" になる. DEFAULT_URL_HOST は前者を制御し,
# DEFAULT_EMAIL_HOST は後者を制御する. Mailman はまた, 一方を他方にマッ
# プするやりかたも知る必要がある (これは特に, 仮想ドメインでの運用で重
# 要). 新しくマップを追加するのには
# "add_virtualhost(URLのFQDN, 電子メールのFQDN)" が使える.
#
# mm_cfg.py で DEFAULT_EMAIL_HOST と DEFAULT_URL_HOST を変更する必
# 要がないのなら, ほかにやることはなし; 既定のマップは自動的に追加される.
# しかし, あなたが mm_cfg.py のほうで変数をどれか変えたのなら, 次のも
# のも書いておくこと:
#
#     add_virtualhost(DEFAULT_URL_HOST, DEFAULT_EMAIL_HOST)
#
# だってそうしないと, 既定のマッピングが修正されないから.
DEFAULT_EMAIL_HOST = '@MAILHOST@'
DEFAULT_URL_HOST = '@URLHOST@'
DEFAULT_URL_PATTERN = 'http://%s/mailman/'

# DEFAULT_HOST_NAME は DEFAULT_EMAIL_HOST に置き換わった [>=2.1].
# しかし, サイトによっては前のものがまだ mm_cfg.py ファイルに書いてあ
# るかも. そうなら, そっちを信じることになってる. そうでなければ,
# DEFAULT_EMAIL_HOST のほうを信じることになってる. DEFAULT_URL につ
# いても同様.
DEFAULT_HOST_NAME = None
DEFAULT_URL = None

HOME_PAGE         = 'index.html'
MAILMAN_SITE_LIST = 'mailman'

# 通常はサイト管理者は, サイトパスワードで Web ページの認証をしたとき, 
# リスト管理者として認証するようなクッキーを受け取る. このため, サイト
# 認証クッキーを渡すのはちょっと心配. だって, このクッキーが覗き見られ
# たり捕捉されたりすれば, 侵入者はサイトの全リストへのアクセス権を得る
# ことになる.  一方, サイトの全リストでいちいち認証しなおさなくていい
# のはとっても便利.  サイト認証クッキーを認めるのなら, この値を Yes に
# する.
# [訳注] 2.1.7 での仕様変更: リスト管理者は, 会員オプション画面で「全部
#   変更」を有効にしてオプション変更や会員の退会を実行できなくなった.
#   サイト管理者は, この変数が Yes のときだけ, 会員オプション画面で「全部
#   変更」を有効にしてオプション変更や会員の退会を実行できるようになった.
ALLOW_SITE_ADMIN_COOKIES = No

# text/html パートをプレインテキストに変換するコマンド. これは結果を
# 標準出力に出力しなければいけない. %(filename)s には, プログラムが
# 処理する一時ファイルの名前が入る.
HTML_TO_PLAIN_TEXT_COMMAND = '/usr/bin/lynx -dump %(filename)s'


 
#####
# 仮想ドメイン
#####

# ここで, 仮想ホストのマッピングを設定する. これは主として, Web経由の
# リスト作成に使うので, その影響は現時点ではかなり限られたものだ. 新し
# くマッピングを追加するには add_virtualhost() 呼出しを使う. マップの
# キーは Utils.get_domain() で指定する文字列で, 値は DEFAULT_HOST_NAME 
# に当たるもの. [>=2.1]
VIRTUAL_HOSTS = {}

# Yes に設定すると, その計算機の listinfo ページと admin ページでの一
# 覧が, web_page_url 設定オプションのホスト名がアクセスしているページ
# の URL にあるリストだけに--- 「その仮想ホストにあるリストだけに」--- 
# 限られるようになる. No に設定すると, 一覧にはすべての公表された (つ
# まり公開の) リストが載る.
VIRTUAL_HOST_OVERVIEW = On


# 補助関数; mm_cfg.py ファイルで使える. 省略可能な emailhost 引数を抜
# かすと, urlhost から名前の最初を取り除いたものが設定される, たとえば
#
# add_virtualhost('www.dom.ain')
# VIRTUAL_HOST['www.dom.ain']
# ==> 'dom.ain'
#
def add_virtualhost(urlhost, emailhost=None):
    DOT = '.'
    if emailhost is None:
        emailhost = DOT.join(urlhost.split(DOT)[1:])
    VIRTUAL_HOSTS[urlhost.lower()] = emailhost.lower()

# で, ここで既定の設定をしておく.
add_virtualhost(DEFAULT_URL_HOST, DEFAULT_EMAIL_HOST)

# 注意: すでにあるリストのドメインを変えるには、bin/fix_url.py を実行
# するといいかもしれない. bin/fix_url.py スクリプトは, bin/withlist
# の中で実行する, こんなふうに: bin/withlist -l -r bin/fix_url.py リスト名


 
#####
# スパム防止の既定値 [>=2.1]
#####

# この変数には, (ヘッダ, 正規表現) の形式の 2 要素のタプルのリストが入
# る.  Mailman/Handlers/SpamDetect.py モジュールがこれを使って, 届いた
# メッセージにマッチさせる. 届いたメッセージの指定されたヘッダにマッチ
# したら, そのメッセージはスパムの判定が下る. ヘッダは大文字小文字を区
# 別せず, 後ろのコロンは付けてはいけない. 正規表現はいつも 
# re.IGNORECASE でマッチする.
#
# 検索するものが多くなれば, 処理が全体として遅くなることに注意.  スパ
# ム検出はリストに来るものだけでなく, -owners アドレスに来るものも含め, 
# 明白に承認されたものでなければ, すべてのメッセージに対して働く.
KNOWN_SPAMMERS = []


 
#####
# Web インタフェースの既定値 [>=2.1]
#####

# Mailman の Web インタフェースで使うほとんど全ての色は, 以下の変数で
# パラメタ化してある. このことで, ソースコードに大手術をしなくても簡単
# に好みの色遣いに変えられるようになっている.
# なお, 一般に, テンプレートでの色はここには入っていない. というのは, 
# 既定のテンプレートの色は, サイト全体とか仮想ドメイン全体とかリスト全
# 体で簡単に上書きしてしまえるから.

WEB_BG_COLOR = 'white'                            # ページの背景
WEB_HEADER_COLOR = '#99ccff'                      # 大見出し
WEB_SUBHEADER_COLOR = '#fff0d0'                   # 小見出し
WEB_ADMINITEM_COLOR = '#dddddd'                   # オプション項目の背景
WEB_ADMINPW_COLOR = '#99cccc'                     # パスワードテキストボックス
WEB_ERROR_COLOR = 'red'                           # エラーメッセージの色
WEB_LINK_COLOR = ''                               # 真なら, LINK= を変える
WEB_ALINK_COLOR = ''                              # 真なら, ALINK= を変える
WEB_VLINK_COLOR = ''                              # 真なら, VLINK= を変える
WEB_HIGHLIGHT_COLOR = '#dddddd'                   # 真なら, listinfo と admin
                                                  # の表示で交互に色を変える

 
#####
# 保存書庫の既定値
#####

# 公開保存書庫の URL のテンプレート [>=2.1]. これはいくつかの場所で使う:
# List-Archive: ヘッダ, リストの listinfo ページ, リストの管理ページで.
#
# これは "%(listname)s" がどこかに入った文字列でなければいけな
# い. Mailman はここにリストの名前を代入する. 文字列に "%(hostname)s" 
# をいれることもできる.  Mailman はここにホスト名 (たいてい 
# DEFAULT_URL_HOST) を代入する.
PUBLIC_ARCHIVE_URL = 'http://%(hostname)s/pipermail/%(listname)s'

# 保存書庫が既定で有効かどうか.
DEFAULT_ARCHIVE = On

# 保存書庫は既定で公開か限定か.
# 0=公開, 1=限定
DEFAULT_ARCHIVE_PRIVATE = 0

# ARCHIVE_TO_MBOX
#-1 - なにも保存しない
# 0 - mbox 形式では保存しないが, Mailman の組込み HTML 保存書庫は作る
# 1 - mbox 形式で保存して, 外部の保存書庫作成機構で使う.
# 2 - mbox 形式で保存して, 組込み HTML 保存書庫も作る --- 外部の保存書
#     庫作成機能と Mailman の組込み HTML 保存書庫の両方を使える.
#     フラットなメールファイルは検索や外部保存書庫作成などに便利かも.
ARCHIVE_TO_MBOX = 2

# 0 - 年ごと
# 1 - 月ごと
# 2 - 四半期ごと
# 3 - 週ごと
# 4 - 日ごと
DEFAULT_ARCHIVE_VOLUME_FREQUENCY = 1
DEFAULT_DIGEST_VOLUME_FREQUENCY = 1    # [>=2.1]

# これらの変数は, 外部の保存書庫作成プログラムを制御する. 通常は, 保存
# 書庫作成が有効 (上の ARCHIVE_TO_MBOX と, リストの archive* 属性を参
# 照) なら, 組込みの Pipermail 保存書庫作成プログラムを使う. これは以
# 下の変数がどちらもNo に設定されているときの既定値. 以下のものをどれ
# か設定するのなら, 値はos.popen() に渡せるシェルコマンドの文字列でな
# ければいけない. この文字列には次の置き換え文字列を入れられる:
#
#     %(listname)s -- リストの内部名
#     %(hostname)s -- リストの電子メールホスト名
#
# 保存されるものはこれを置き換えたものになる. os.popen() を使うことに
# 注意.
#
# これらの変数をどちらか設定するのなら, 両方とも設定しなければいけない
# ことに注意 (両方とも同じ文字列であってもよい). つまり, 外部保存書庫
# 作成プログラムを設定すると, 保存書庫が公開でも限定でも関係なく動く.
PUBLIC_EXTERNAL_ARCHIVER = No
PRIVATE_EXTERNAL_ARCHIVER = No

# マルチパートのメッセージを「フラット」なメッセージ (つまりシングルパー
# トのメッセージ) に変換するフィルタモジュール [>=2.1]. これは Pipermail
# で必要だが, 外部保存書庫作成プログラムを使うのなら 0 に設定するとい
# いかも.
# また, 自分で作ったモジュールに置き換えることもできるが, すくなくとも
# process() という関数を含んでいて, この関数が MailList オブジェクトと
# Message オブジェクトを引数にとるようになっていないといけない. これは
# メッセージを捨てるときは Errors.DiscardMessage を raise しないといけ
# ない. 捨てないときは, Message オブジェクトを必要に応じて修正しないと
# いけない.
ARCHIVE_SCRUBBER = 'Mailman.Handlers.Scrubber'

# Mailman.Handlers.Scrubber で, filename パラメタで示される添付ファイ
# ル名をそのまま使うか, それともかわりに 'attachement-xxx' を使うかを
# 制御するパラメタ [>= 2.1.6].  PC や Mac のアプリケーションがかなり長
# い非ASCII のファイル名を使うようになってきたので, 既定値は True とし
# ている. 歴史的には, 2.1.6 では後方互換性のために False となっていた
# のだが, 2.1.7 ではより安全な運用のために True に変わった.
SCRUBBER_DONT_USE_ATTACHMENT_FILENAME = True

# 添付のファイル名の拡張子をそのまま使うのは, ウィルスが拡張子を偽装し
# ていると危険かもしれない. ファイル名の拡張子で添付をフィルタするなら, 
# ここを True に設定できる [>=2.1.6]
SCRUBBER_USE_ATTACHMENT_FILENAME_EXTENSION = False

# この変数は, text/html のサブパートで何をするかを定義する [>=2.1].
# 完全に取り除くか, エスケープするか, 外部プログラムでフィルタするか.
# 指定できる値は:
# 0 - text/html パートを完全に取り除き, メッセージに削除した旨の注意書
#     きを残す. 一番外側のパートが text/html だったら, メッセージ全体
#     を破棄する.
# 1 - 含まれている text/html パートを削除し, HTMLエスケープしたデータ
#     の添付として別に見られるようにする. 一番外側の text/html パート
#     は単にHTMLエスケープするだけ.
# 2 - インラインのまま残すが, HTMLエスケープする.
# 3 - text/html を添付とみなして削除するが, HTMLエスケープしない.
#     注意: これはとても危険. これは本質的には, だれでもあなたのサイト
#     に, 邪悪なJavaScript とか, Web バグとか, その他なにかいやらしい
#     ものを含んだ HTML メールを送れることになるし, 保存書庫を見る人に
#     も影響がある, ということだから.  リストへの投稿に対して強力なモデ
#     レーションをかけているようなときだけ, このオプションを考えること.
#
# 注意: 現在の保存書庫作成のコードによれば, text/html のパートをインラ
# インにしておいてエスケープしないようにするのは不可能. 場合によっては
# 不便なこともあるかもね.
#
# 値は文字列でもよい. その場合, HTML ページを通すフィルタコマンドの名
# 前になる.  結果の出力は添付に入るか, 一番外側のパートが text/html の
# ときはメッセージ全体になる. 文字列の形式には "%(filename)s" を含めら
# れ, これはプログラムが処理する一時ファイルの名前になる. 処理されたメッ
# セージは標準出力に書き出さなければいけない. HTML からプレインテキス
# トへの変換プログラムを指定したければ, ここを 
# HTML_TO_PLAIN_TEXT_COMMAND に設定する.
ARCHIVE_HTML_SANITIZER = 1

# ダウンロードできる保存書庫の .txt ファイルを gzip 圧縮するなら Yes 
# に設定する. これは*極めて*不十分なものであることに注意. 代わりに, メッ
# セージをただ .txt ファイルにまとめておいて, 毎晩 cron ジョブを走らせ
# てtxt.gz ファイルをつくることもできる. 詳細は cron/nightly_gzip 参照.
GZIP_ARCHIVE_TXT_FILES = No

# ここで保存書庫について既定の「日付訂正」方針を設定する. メッセージが
# 保存書庫に入るときに Pipermail をつかっていても, 外部の保存書庫作成
# プログラムをつかっていても, Mailman は Date: ヘッダを, そのヘッダの
# もとの内容ではなく, メッセージが届いた日付に修正できる. これは, とん
# でもない日付のメッセージが届いてしまったような場合に有用.
# ここを 0 に設定すると, 日付はもとのメッセージのとおりにする. 1 にす
# ると, かならず日付を訂正する.  2 に設定すると, 「賢い書き換え」が働
# く; 日付がARCHIVER_ALLOWABLE_SANE_DATE_SKEW より外れていると (進
# んでいても遅れていても), かわりに届いた日付で置き換える. [>=2.1]
ARCHIVER_CLOBBER_DATE_POLICY = 2
ARCHIVER_ALLOWABLE_SANE_DATE_SKEW = days(15)

# Pipermail の保存書庫は, 投稿者の電子メールアドレスをそのまま記録して
# いる.  これは, スパム発信用アドレス収集者にとっては金鉱のようなもの
# だ, と考えるひともいるだろう. ここを Yes に設定すると, 電子メールア
# ドレスを適度にぼやかすことができる. が, これは保存書庫の中に現れる 
# mailto: URL も壊してしまうことに注意.
ARCHIVER_OBSCURES_EMAILADDRS = Yes

# Pipermail は, メッセージボディは US-ASCII テキストを含むと仮定する. 
# 保存書庫のための既定のキャラクタセットに使う他のキャラクタセットを定
# 義するならここのオプションを変える. 「キャラクタセット」という用語は
# MIME での意味で, オクテットの列を文字の列に変換する方法のことを指す. 
# 既定のキャラクタセットを変えたら, 下の VERBATIM_ENCODING にそれを追
# 加したほうがいいかも.
DEFAULT_CHARSET = None

# 多くのキャラクタセットの符号化では, クォートしないといけない特殊な
# HTML実体定義文字がある. そうしないと, Pipermail の保存書庫が正しく表
# 示できない. ところが, キャラクタセットによっては, ブラウザで正しく表
# 示するにはこういった文字をクォートしてはいけないものがある.
# 主な問題は, マルチバイトの符号化でオクテット 0x26 が必ずしも & 文字
# を表さないものがある, というやつだ. ここの変数は, そういうキャラクタ
# セットで保存書庫で HTML クォートしないもののリストを入れる.
# [訳注] この変数は既定値として iso-2022-jp が定義してあるが, 上の説明
#   のような問題が起こるキャラクタセット --- Mailman では現在, 日本
#   語の iso-2022-jp のみ --- では, 保存書庫は EUC などの符号化法を使
#   うことにすればいいので, この変数が設定してあってもしてなくても, あま
#   り意味がない.
VERBATIM_ENCODING = ['iso-2022-jp']

# 保存書庫が公開のとき, Mailman が生の Unix mbox ファイルも公開にして
# しまうか.  [>=2.1.4]
PUBLIC_MBOX = No


 
#####
# 配送の既定値
#####

# [訳注]
#   MTA と Mailman を統合するための設定については, 『GNU Mailman -
#   インストールマニュアル』 (日訳は http://mm.tkikuchi.net/mailman-install/
#   にある) の「メールサーバの設定」の章も参照.

# 出ていくメールの最終的な配送モジュール. このハンドラは, リストへ, あ
# るいは個々のユーザへの SMTP サーバを通じてのメッセージ配送に使う. こ
# の値は Mailman.Handlers パッケージの中のモジュールの名前の文字列でな
# いといけない.
#
# 警告: Sendmail モジュールはセキュリティホールがあるので避けること. 
# というか, これを使おうというのならその前に,
# Mailman/Handlers/Sendmail.py ファイルを読まなければいけない.
#
#DELIVERY_MODULE = 'Sendmail'
DELIVERY_MODULE = 'SMTPDirect'

# MTA は, Mailman/MTA にあるモジュールの名前でなければならない. これは
# リストの作成と削除のための MTA 独自の機能を提供する. [>=2.1;
# MTA_ALIASES_STYLE は廃止]
# Exim のようないくつかのMTA は, 自動的に新しいリストを認識するように
# 設定でき, その場合は MTA 変数は None に設定しなければならない.
# 新しいエイリアスを標準出力に出す(またはサイトリスト管理者へ電子メー
# ルで送る) ようにして /etc/aliases スタイルのファイルを手作業でいじる
# ようにするときは 'Manual' にする.
# Postfix MTA を使っているのなら 'Postfix' にする --- ただしそのときは,
# POSTFIX_STYLE_VIRTUAL_DOMAINS も見ること.
MTA = 'Manual'

# MTA='Postfix' に設定したのなら, Postfix で仮想ドメインを使っているか
# どうか, どんなスタイルの仮想ドメインを使っているかによって, つぎの変
# 数も設定してほしい. [>=2.1]
# Postfix で仮想ドメインを使っていないか, または Sendmail スタイルの仮
# 想ドメイン (すべてのアドレスがすべての仮想ドメインから見える) を使っ
# ているのなら, このフラグを偽に設定する.
# Postfix スタイルの仮想ドメイン (エイリアスがそれぞれの仮想ドメインの
# 中だけに現れる) を使っているのなら, この変数を host_name の値のリス
# トに設定して, 仮想のエントリを分離する. つまり, dom1.ain, dom2.ain,
# dom3.ain を運用しているが dom2 と dom3 だけが仮想なら, この変数をリ
# スト ['dom2.ain', 'dom3.ain'] に設定する. これはメーリングリストの 
# host_name 属性にマッチさせられる. 詳細は README.POSTFIX を見る[訳注:
# README.POSTFIX の内容は, 2.1.6 以降は上記『インストールマニュアル』
# に移された].
POSTFIX_STYLE_VIRTUAL_DOMAINS = []

# これらの変数は, それぞれ aliases.db および virtual-mailman.db を,
# 関連するプレインテキストファイルから再構築するのに使うプログラムを示す. 
# 更新されるファイルの名前が (区切りの空白をはさんで) この文字列に付け
# 加わるので, これは os.system() に渡せるものでなければならな
# い. [>=2.1]
POSTFIX_ALIAS_CMD = '/usr/sbin/postalias'
POSTFIX_MAP_CMD = '/usr/sbin/postmap'

# 一回の SMTP トランザクションで指定できる宛先の数の上限.
# 0 に設定すると, 一トランザクションで全ての宛先を指定する.
# DELIVERY_MODULE が SMTPDirect のときだけ使う.
SMTP_MAX_RCPTS = 500

# ひとつのソケットコネクションで実行する SMTP セッションの数の上限.
# MTA によっては制限がある. 0 に設定すると, 好きなだけたくさん実行する
# (つまり MTA に制限がないとき). 0 より大きいなんらかの数に設定すると,
# Mailman はセッションがこの数に達したら SMTP コネクションを閉じてから
# 開き直す. [>=2.1]
SMTP_MAX_SESSIONS_PER_CONNECTION = 0

# SMTP 配送で同時に使うサブスレッドの最大数. 宛先が SMTP_MAX_RCPTS に
# 従ってカタマリに分けられた後, それぞれのカタマリはそういったスレッド
# によってsmtpd に渡される. Python インタプリタがスレッド対応でビルド
# されていなければ, この仕様は無効になる. MAX_DELIVERY_THREADS を 0 に
# 設定すれば, あらゆる場合にこの仕様を明示的に無効にできる. この仕様は 
# DELIVERY_MODULE が SMTPDirect のときだけ対応している.
#
# 注意: これは実験的な仕様で, 限られたテストによれば, Python の大域イ
# ンタプリタロックにより, 実際には効率を落すかもしれない. 使うときは気
# をつける.
MAX_DELIVERY_THREADS = 0

# DELIVERY_MODULE が 'SMTPDirect' のときの, SMTP のホストとポート.
# ホストが存在していて解決できることを確かめる (つまり, これが初期値の
# "localhost" であるなら, /etc/hosts ファイルに localhost のエントリ
# があることを確かめる, ということだ).
SMTPHOST = 'localhost'
SMTPPORT = 0                                      # smtplib の初期値を使う

# コマンドラインのパイプを使って sendmail 互換のプログラムで配送すると
# きのコマンド. DELIVERY_MODULE が 'Sendmail' のとき設定.
SENDMAIL_CMD = '/usr/lib/sendmail'

# ニューズグループへの投稿や閲覧に NNTP サーバでの認証が要るなら, これ
# らの変数を設定する. 認証が必要ないなら, 両方の変数に None を指定する.
NNTP_USERNAME = None
NNTP_PASSWORD = None

# NNTP ゲートウェイのあるリストで一番使いたい NNTP サーバがあるなら, 
# これを設定する.
DEFAULT_NNTP_HOST = ''

# これらの変数は, NNTP サーバに受け入れられるためにヘッダを削る方法を
# 制御する. [>=2.1] INN のようないくつかのサーバは, 禁止されるヘッダや, 
# 重複するヘッダのあるメッセージをリジェクトする. NNTP サーバは他の理
# 由でもメッセージをリジェクトするかもしれないが, そういったことをプロ
# グラム的に解決できる見込みはあまりない. Mailman/Queue/NewsRunner.py 
# を見ること.
#
# 最初に, これらのヘッダ (大文字小文字の違いは無視する) は, 元のメッセー
# ジから削除する.
NNTP_REMOVE_HEADERS = ['nntp-posting-host', 'nntp-posting-date', 'x-trace',
                       'x-complaints-to', 'xref', 'date-received', 'posted',
                       'posting-version', 'relay-version', 'received']

# 次に, これらのヘッダは, 元のメッセージで重複していなければ, そのまま
# 残す. 2 度めかそれ以降に現れるヘッダは 2 番目の名前のヘッダに書き換
# える (大文字小文字の区別は保存する).
NNTP_REWRITE_DUPLICATE_HEADERS = [
    ('to', 'X-Original-To'),
    ('cc', 'X-Original-Cc'),
    ('content-transfer-encoding', 'X-Original-Content-Transfer-Encoding'),
    ('mime-version', 'X-MIME-Version'),
    ]

# リスト全員に送るようなすべての「普通の」メッセージは, このハンドラモ
# ジュールのパイプラインを通る [>=2.1]. それぞれのリスト自身では,
# `pipeline' 属性を定義すればグローバルなパイプラインを上書きできる.
# [訳注]
#   2.1.6 から Scrubber モジュールが追加された.
#   2.1.8 から CleanseDKIM モジュールが追加された; DomainKey や DKIM
#   のシグネチャ除去が Cleanse モジュールから独立した.
GLOBAL_PIPELINE = [
    # まずは, すべての配送過程で共通の処理をするモジュール.
    'SpamDetect',
    'Approve',
    'Replybot',
    'Moderate',
    'Hold',
    'MimeDel',
    'Scrubber',
    'Emergency',
    'Tagger',
    'CalcRecips',
    'AvoidDuplicates',
    'Cleanse',
    'CleanseDKIM',
    'CookHeaders',
    # それから, メッセージをまとめ読み用の mbox ファイル, 保存書庫, 
    # ニューズのキューに送る. それぞれの runner が, それぞれの配送過程
    # に応じたその後のメッセージの処理をする.
    'ToDigest',
    'ToArchive',
    'ToUsenet',
    # それから, 会員向け配送 (送出) 特有の若干の追加処理をして,
    # 最後に, メッセージを送出キューへ放つ.
    'AfterDelivery',
    'Acknowledge',
    'ToOutgoing',
    ]

# これは, -owner アドレスに送られてきたメッセージが通るパイプライン
# [>=2.1] [訳注: 2.1.8 から CleanseDKIM モジュールが追加された].
OWNER_PIPELINE = [
    'SpamDetect',
    'Replybot',
    'CleanseDKIM',
    'OwnerRecips',
    'ToOutgoing',
    ]


# これは SMTPDirect 配送モジュール (上の DELIVERY_MODULE を参照) のた
# めの書式化文字列を定義する [>=2.1]. 有効な %()s 文字列置換にはつぎの
# ものがある:
#
#     time -- メッセージを Mailman から smtpd に完全に渡すのに要した
#     浮動小数点数の秒数.
#
#     size -- メッセージの全サイズのバイト数.
#
#     #recips -- このメッセージの実際の宛先数.
#
#     #refused -- SMTP で拒否された宛先数 (SMTP_LOG_REFUSED の中でだけ使う).
#
#     listname -- この投稿のメーリングリストの `内部的な' 名前.
#
#     msg_ -- 配送されたメッセージの与えられたヘッダの値.
#     メッセージにそのようなヘッダがなければ, "n/a" を使う. ただし,
#     メッセージにそのようなヘッダが複数あれば, そのうちのどれをつかうかは
#     未定義であることに注意.
#
#     allmsg_ - 上の msg_ とおなじだが, そのようなヘッダ
#     がメッセージに複数あれば, カンマと空白で区切ってすべて出力する.
#
#     sender -- メッセージの "送信者". これは下の USE_ENVELOPE_SENDER
#     変数での指定によって From: かエンヴェロープ送信者かになる.
#
# 各項目は 2 要素のタプルの形式で, 最初の要素がメッセージを出力する 
# logs/ の中のファイルの名前で, 次が Python の %スタイルの文字列置き換
# えである書式文字列になっている. ファイル名は任意; qfiles/ は, 
# もしなければ自動的に作成される.

# 配送が成功かそうでないかにかかわらず, メッセージ配送ごとに出力するメッ
# セージの書式. このログメッセージの出力を無効にするには None を設定す
# る.  [訳注: 2.1.6 から, リスト名 %(listname)s を含めることができる
# ようになった.]
SMTP_LOG_EVERY_MESSAGE = (
    'smtp',
    '%(msg_message-id)s smtp to %(listname)s for %(#recips)d recips, completed in %(time).3f seconds')

# これは, SMTP が即座には失敗しないときだけ出力する.
# SMTP_LOG_REFUSED とは相互に排他的.
SMTP_LOG_SUCCESS = (
    'post',
    'post to %(listname)s from %(sender)s, size=%(size)d, message-id=%(msg_message-id)s, success')

# これは, いずれかのアドレスで即座に SMTP の失敗が発生したときだけ出力する.
# SMTP_LOG_SUCCESS とは相互に排他的.
SMTP_LOG_REFUSED = (
    'post',
    'post to %(listname)s from %(sender)s, size=%(size)d, message-id=%(msg_message-id)s, %(#refused)d failures')

# これはそれぞれの特定の宛先に関する失敗でログを残す. 追加の %()s キー:
#
#     recipient -- 失敗した宛先のアドレス
#     failcode  -- SMTP 失敗コード
#     failmsg   -- 実際の SMTP メッセージ (あれば)
SMTP_LOG_EACH_FAILURE = (
    'smtp-failure',
    'delivery to %(recipient)s failed with code %(failcode)d: %(failmsg)s')

# これらの変数は, より良い配送エラー検知のための VERP 風配送の書式と頻
# 度を制御する [>=2.1]. VERP とは, 以下で定義されている可変エンヴェロー
# プ返送経路情報のこと:
#
# http://cr.yp.to/proto/verp.txt
#
# これは, 宛先のアドレスを我々 (Mailman) がエンヴェロープ送信者アドレ
# ス (つまり SMTP の `MAIL FROM:' アドレス) から知るための符号化を伴う. 
# そのため, 宛先でどんな種類の転送がされても, 配送エラーがあったときは, 
# 我々は曖昧さのない配送エラーアドレスの知らせを受け取れる.
#
# しかしながら, これは技術的には VERP「風」でしかない, なぜならエンヴェ
# ロープ送信者のエンコードを Mailman でやっていて, MTA でやっているの
# ではないから. MTA との連係が要るので, MTA が拡張アドレスを理解できる
# ように設定できるかどうか, 確かめておくこと.
#
# 最初の変数は, VERP エンヴェロープのエンコードのしかたを表す. これは
# 次の3 つの文字列置き換えを含む:
#
# %(bounces)s -- リスト-bounces メールボックス名をここにセットする
# %(mailbox)s -- 宛先のメールボックス名をここにセットする
# %(host)s    -- 宛先のホスト名をここにセットする
#
# ここでの例は, 下の初期設定を使う.
#
# FQDN でのリストアドレスは: mylist@dom.ain
# 宛先は:                    aperson@a.nother.dom
#
# エンヴェロープ送信者は mylist-bounces+aperson=a.nother.dom@dom.ain
# となる
#
# MTA が, /必ず/ こういったアドレスを mylist-bounces に配送するように
# 設定するよう注意!
VERP_FORMAT = '%(bounces)s+%(mailbox)s=%(host)s'

# 次の変数は, こういったアドレスを曖昧さなくデコードするための正規表現
# を表す. 配送エラーを発生させた MTA は, このアドレスを配送エラーメッ
# セージのTo: ヘッダに入れる. これを正しく取得することは重要 --- そし
# て巧妙だ.  使っている Python の正規表現をよく調べること. これはちょ
# うど 3 つの名前つきグループを定義しなければならない: bounces,
# mailbox, host で, 定義は上の変数と同じ. これは大文字小文字の違いを無
# 視してコンパイルされる.
VERP_REGEXP = r'^(?P[^+]+?)\+(?P[^=]+)=(?P[^@]+)@.*


# メッセージを認識するための VERP 書式 [>=2.1.5]
VERP_PROBE_FORMAT = '%(bounces)s+%(token)s'
VERP_PROBE_REGEXP = r'^(?P[^+]+?)\+(?P[^@]+)@.*

# ここを Yes にすると, 配送エラーでの配送停止で VERP 検出を有効にする 
# [>=2.1.6]
VERP_PROBES = No

# VERP を使うのにもっともよい機会は, パスワード通知のときだ. それはす
# でに宛先ごとに個別化されている. ここで Yes を設定すると, パスワード
# 通知で必ず VERP を使うようになる.
VERP_PASSWORD_REMINDERS = No

# ほかによい機会としては, まとめ読みでない通常の配送が個別化されている
# ときがある. ここでも, 個別の宛先ごとにアドレスを生成することが負荷増
# 大になるかもしれない. ここで Yes を設定すると, まとめ読みでない通常
# の配送が個別化されていると VERP を使う (まとめ読みの配送の個別化は未
# 対応).
VERP_PERSONALIZED_DELIVERIES = No

# そして最後に, 通常の個別化されていない配送も VERP にできる. しかしな
# がら, これは著しい負荷増大があるかもしれないので, 通常配送での VERP 
# の頻度を決められるようにしてある. これはメッセージの数で, VERP 宛先
# アドレスを使う間隔を決める. 同じ変数が, 通常とまとめ読みの両方の配送
# を制御する.  0 に設定すると, まったく VERP にしない. 1 に設定すると, 
# すべての配送でVERP にする. 1 より大きい数にすると, 時々 VERP するだ
# けにする.
VERP_DELIVERY_INTERVAL = 0

# より良い確認メッセージのために, VERP 風の書式を使う. これは確認文字
# 列を返信用アドレスにエンコードしてある. これでメッセージの Subject: 
# をよりユーザに親切なものにできるが, MTA との連係が要る. 書式は上の
# VERP_FORMAT と同様だが, つぎの置き換えを使う:
#
# %(addr)s -- リスト-confirm メールボックス名がここに入る
# %(cookie)s  -- 確認文字列がここに入る
VERP_CONFIRM_FORMAT = '%(addr)s+%(cookie)s'

# これは VERP_REGEXP と同様, ただし VERP_CONFIRM_FORMAT での分割用.
# なお, [訳注: 2.1.8b1 以降は]
# From: local_part@host
# を
# To: "local_part" 
# に書き換えて返事をするような MUA を考慮して, '=2.1]
#####

# qrunner のマスタ監視プロセスが, どんなキューを起動するか. これは,
# qrunner クラスの名前 (これは Mailman.Queue パッケージの中で同じ名前
# のモジュールとして存在していなければならない) と, それぞれのqrunner 
# のために fork する並行プロセスの数との, 2 要素のタプルのリストになる.
# 1 個より多くのプロセスを使うと, それぞれがハッシュ空間の互いに等しい
# 部分を取る.

# BAW: そのうち重み付けのあるハッシュ空間に対応するかも
# BAW: 強制ではないが, スライスの数は 2 の累乗であるべき

QRUNNERS = [
    ('ArchRunner',     1), # 保存書庫作成に行くメッセージ
    ('BounceRunner',   1), # qfile/bounces ディレクトリの処理のため
    ('CommandRunner',  1), # 外界から来るコマンドと配送エラー
    ('IncomingRunner', 1), # 外界から来る投稿
    ('NewsRunner',     1), # nntpd へ送り出すメッセージ
    ('OutgoingRunner', 1), # smtpd へ送り出すメッセージ
    ('VirginRunner',   1), # 内部的に作り出した (できたての) メッセージ
    ('RetryRunner',    1), # 一時的に失敗した配送の再試行 [>=2.1.4]
    ]

# ここを Yes に設定すると, `Maildir` 配送オプションを使う. これを変え
# たら, リスト自動検出を使わない MTA のためには bin/genaliases を再実
# 行する必要がある.
#
# 警告: Maildir 配送を使いたいなら, Mailman の qrunner を /必ず/ root 
# で開始しなければならない. そうしないとパーミッションの問題が出る.
#
# 注意: Maildir 配送は Mailman 2.1 では実験的.
USE_MAILDIR = No
# 注意: USE_MAILDIR = Yes に設定するのなら, mm_cfg.py ファイルに次の行
# を加える (もちろん, コメント記号は外す!)
# QRUNNERS.append(('MaildirRunner', 1))

# qrunner のスライスですべてのファイルを処理した後, またキューのディレ
# クトリに新しいファイルがあるか調べるまでに, どのくらいの間 runner を 
# sleep させるか. これは秒未満にもできる. また, ゼロにすればすぐ調べる
# (essentially busy-loop as fast as possible) ようになる.
QRUNNER_SLEEP_TIME = seconds(1)

# (email パッケージで) 解析できないようなメッセージを受け取ったときに, 
# それをどうするか. 解析できないメッセージになる原因としてもっともよく
# あるのは, MIME カプセル化が壊れているもので, そうなる原因としてもっ
# ともよくあるのは, それが Nimda のようなコンピュータウィルスによるも
# のであるときだ. この変数を No に設定すると, そういったメッセージは捨
# てる. Yes にすると, qfiles/bad サブディレクトリに保管する.
QRUNNER_SAVE_BAD_MESSAGES = Yes

# このフラグは, Mailman がデータファイルに書き込んで flush した後でそ
# のデータファイルを fsync() するようにする.  これはディスクへのデータ
# の書き込みを確実にし, データを失うことを防ぐが, 性能を犠牲にする.
# このフラグは, メッセージのピクルと MailList の config.pck ファイル
# の両方に影響することに注意. [>=2.1.4]
SYNC_AFTER_WRITE = No


 
#####
# 一般的な既定値
#####

# このサーバの標準言語. リストの文脈やユーザの文脈がわからないときはい
# つでも, 代わりにこの言語を使う. 設定できる値は下の LC_DESCRIPTIONS 
# を見る. [>=2.1]
DEFAULT_SERVER_LANGUAGE = 'en'

# 会員のみがメーリングリストに投稿できるようにするとき, メッセージの送
# 信者をどのように決めるか. この変数を Yes に設定すると, まずメッセー
# ジのエンヴェロープ送信者を使い, エンヴェロープ送信者がなければ代わり
# に送信者を使う. これを No に設定すると, いつも送信者を使う.
#
# エンヴェロープ送信者は SMTP 配送が設定するから, 送信者よりはごまかす
# のが難しい. 送信者は From: ヘッダに入れるもので, エンドユーザが簡単
# にごまかせる.  しかしながら, エンヴェロープ送信者は, ときには正しく
# 設定されていないことがあって, リスト会員から送られてきているのに投稿
# が承認のために保留になってしまうことがある. このような問題が起こるの
# なら, この変数は No に設定するが, ごまかしメッセージを通してしまうこ
# とがあるのを理解しておくこと.
USE_ENVELOPE_SENDER = No

# 投稿の目的で会員かどうか調べるには, 普通はいくつかのヘッダのうちでど
# れかの値がリスト会員と一致するかを調べる.
# ヘッダはこの変数に挙げた順に調べる. None という値は From_ (エンヴェ
# ロープ送信者) を使うという意味. フィールド名は大文字小文字を区別しな
# い. [>=2.1]
SENDER_HEADERS = ('from', None, 'reply-to', 'sender')

# admin CGI で, 退会やオプション変更のために一度に表示する会員の数.
DEFAULT_ADMIN_MEMBER_CHUNKSIZE = 30

# admindb の Web ページで保留されている投稿の何バイトを表示するか. サ
# イズにかかわらず全メッセージを指定するには負の数を使う (ただしそのペー
# ジを表示するのに時間がかかるかも).
ADMINDB_PAGE_TEXT_LIMIT = 4096

# この変数を Yes に設定すると, リスト管理者は自分のメーリングリストを
# 削除できるようになる. リスト管理者にそんな力を与えたくない場合は, か
# わりにこの変数を No に設定すると, リスト削除はサイト管理者がコマンド
# 行スクリプトbin/rmlist でしなければならなくなる. [>=2.1]
OWNERS_CAN_DELETE_THEIR_OWN_LISTS = No

# この変数を Yes に設定すると, リスト管理者が自分のメーリングリストに
# 「個別化」フラグを設定できるようになる. このフラグを有効にすると,
# Mailman は, MTA への配送をまとめて行うかわりにユーザごとに別々の電子
# メールメッセージを送るようになる. このことにより, 会員ごとにより個別
# 化したメッセージが出せるが, システムの効率に重大な影響を与えるかもし
# れない. [>=2.1]
OWNERS_CAN_ENABLE_PERSONALIZATION = No

# 保留するメッセージを Python のピクルで保存するか, プレインテキストで
# 保存するか. 前者は毎回解析/生成を行わなくてよいので効率がいいが, 後
# 者はもしも保留メッセージをディスク上で変更したいのならよいかもしれな
# い. [>=2.1]
HOLD_MESSAGES_AS_PICKLES = Yes

# [訳注] METADATA_FORMAT [>=2.1 && =2.1]
ADMIN_CATEGORIES = [
    # 1 列め
    'general', 'passwords', 'language', 'members', 'nondigest', 'digest',
    # 2 列め
    'privacy', 'bounce', 'archive', 'gateway', 'autoreply',
    'contentfilter', 'topics',
    ]

# 下の「ユーザオプションのビットフィールド」を参照; ここはそれらのオプ
# ションの合計にする. リストのすべての新規会員はそれらのオプションを設
# 定される. 我々は, 既定値ではみんな投稿の写しを受け取りたがらないと仮
# 定している. しかし, 会員の投稿制限フラグの最初の値はリストの設定変数
# default_member_moderation で制御されることに注意. [>=2.1]
DEFAULT_NEW_MEMBER_OPTIONS = 256

# Mailman が自分でパスワードを生成するとき (ユーザが入会申請のときに自
# 分でパスワードを入力しなかった場合や, リスト作成の際に管理者パスワー
# ドの自動生成を選択したときにそうなる) に使うパスワードの種類の指定.
# [>=2.1.6]
#
# この値を Yes にすると, Mailman 古来の, ユーザに(より)親切なパスワー
# ドにする. 唱えやすそうなパスワードができるので, 覚えるのが楽.
# この値を No にすると, 暗号論的により強度の高い (しかし, より覚えにく
# い) パスワードを使うようにする -- オペレーティング システムと Python 
# が必要な仕様 (特に, /dev/urandom が利用できることが必要) に対応して
# いるのなら.
USER_FRIENDLY_PASSWORDS = Yes
# この値で, 会員とリスト管理者のパスワードの既定の [訳注: つまり, パス
# ワードが自動生成されるときの] 長さを指定する. [>=2.1.6; これらの値は, 
# 以前はハードコードされていた]
MEMBER_PASSWORD_LENGTH = 8
ADMIN_PASSWORD_LENGTH = 10


 
#####
# リストの既定値. 注意: これらの変数を変えても, すでにあるリストの設定は
# *変わらない*. ここでは, 今後作成する新しいリストの既定値を定義するだけ.
#####

# リストは, 既定で公表するかどうか. 明示される宛先で許される数の最大は
# 既定でいくつか. 既定で許されるメッセージサイズの最大はいくつか.
DEFAULT_LIST_ADVERTISED = Yes
DEFAULT_MAX_NUM_RECIPIENTS = 10
DEFAULT_MAX_MESSAGE_SIZE = 40           # キロバイト

# これらの書式文字列は, メーリングリストのインスタンスの辞書を使って展
# 開される.
# [訳注]
#   2.1.6 以降, DEFAULT_SUBJECT_PREFIX に %d を含めると通し番号が
#   入るようになった. %04d といった書式も使える.
#   mm_cfg.py で設定するときは %%d のように書かなければならないことに
#   注意.
DEFAULT_SUBJECT_PREFIX  = "[%(real_name)s] "
# DEFAULT_SUBJECT_PREFIX = "[%(real_name)s %%d]" # 通し番号をつける場合
DEFAULT_MSG_HEADER = ""
DEFAULT_MSG_FOOTER = """_______________________________________________
%(real_name)s mailing list
%(real_name)s@%(host_name)s
%(web_page_url)slistinfo%(cgiext)s/%(_internal_name)s
"""

# 「Re:」のつくメッセージで, 件名の前置きをどこにつけるか [>=2.1.6]:
#
#     旧スタイル: Re: [前置き] テスト
#     新スタイル: [前置き 123] Re: テスト ... (通し番号はオプション)
#
# 後方互換性のために, 旧スタイルを既定値とする. ただし, リスト管理者が
# 前置きに %d (通し番号) を入れたとき [訳注: 上記参照] は, 強制的に新
# スタイルにする. サイト管理者が以前に新スタイル化パッチ (SourceForge
# のパッチ置場にある) を当てていたのなら, この値を mm_cfg.py で No
# に設定するとよいかもしれない.
OLD_STYLE_PREFIXING = Yes

# 通常配送で添付削除する [>=2.1.6]
DEFAULT_SCRUB_NONDIGEST = False

# 電子メールコマンド処理では, 指示された行数より後の電子メールコマンド
# を無視する.
DEFAULT_MAIL_COMMANDS_MAX_LINES = 25

# 管理要求を, 毎日の保留要求通知のほかに, 即座にメールで管理者に知らせ
# るか.
DEFAULT_ADMIN_IMMED_NOTIFY = Yes

# 管理者に入会/退会を知らせるか.
DEFAULT_ADMIN_NOTIFY_MCHANGES = No

# この日数の後, 保留されているメッセージを破棄する [>=2.1.6] [訳注: 0 にすると破棄しない]
DEFAULT_MAX_DAYS_TO_HOLD = 0

# リスト会員の投稿は, 既定で司会つきにするか. [>=2.1;
# DEFAULT_MODERATED は廃止]
DEFAULT_DEFAULT_MEMBER_MODERATION = No

# 自動的に破棄した非会員の投稿を司会者に転送もするか. [>=2.1]
DEFAULT_FORWARD_AUTO_DISCARDS = Yes

# 特定の非会員の動作に一致しなかった非会員の投稿をどうするか. [>=2.1]
# 0 = 承認
# 1 = 保留
# 2 = 拒否
# 3 = 破棄
DEFAULT_GENERIC_NONMEMBER_ACTION = 1

# 'To:', 'Cc:', 'Resent-To:' のどのフィールドにもリスト名がはいってい
# なければエラーとするか. これはスパム対策になる
DEFAULT_REQUIRE_EXPLICIT_DESTINATION = Yes

# リスト名のほかに承認できる名前.
DEFAULT_ACCEPTABLE_ALIASES ="""
"""
# ほかのメーリングリストだけを会員とするメーリングリスト (親子リスト) 
# にするか:
DEFAULT_UMBRELLA_LIST = No

# 親子リストの場合, 管理通知 (入会の確認やパスワード通知) を送るアドレ
# スのメールボックス部につける接尾語:
DEFAULT_UMBRELLA_MEMBER_ADMIN_SUFFIX = "-owner"

# この変数は, 毎月のパスワード通知を送るかどうかを制御する.
DEFAULT_SEND_REMINDERS = Yes

# 新会員に歓迎メッセージを送るか.
DEFAULT_SEND_WELCOME_MSG = Yes

# 退会した会員にお別れメッセージを送るか. [>=2.1]
DEFAULT_SEND_GOODBYE_MSG = Yes

# 送信者情報を消して, リスト-admin アドレスから送っているように見せる
DEFAULT_ANONYMOUS_LIST = No

# {ヘッダ名: 正規表現} スパムフィルタ - 例をいくつか書いておく.
DEFAULT_BOUNCE_MATCHING_HEADERS = """
# '#' で*始まる*行は注釈.
to: friend@public.com
message-id: relay.comanche.denmark.eu
from: list@listme.com
from: .*@uplinkpro.com
"""

# Mailman は, 通過するメッセージの Reply-To: ヘッダを「書き換える」よ
# うに設定できる. 状況によっては, Reply-To: の書き換えをしないもっとも
# な理由がある. 別の状況では, この仕様が本当に必要になる. Web インタ
# フェースの reply_goes_to_list のヘルプで, この問題についての議論へ
# のリンクを見てほしい.
# 0 - Reply-To: を書き換えない
# 1 - Reply-To: をリストに向ける
# 2 - Reply-To: を特定のアドレス (reply_to_address) に設定する
DEFAULT_REPLY_GOES_TO_LIST = 0

# Mailman は, Reply-To: ヘッダがあればすべて取ってしまうようにも, 単に
# 存在する Reply-To: に上記の設定に基づいて追加するようにも設定できる.
# [>=2.1]
DEFAULT_FIRST_STRIP_REPLY_TO = No

# 入会の方針
# 0 - 開放リスト (ALLOW_OPEN_SUBSCRIBE が 1 に設定してあるときだけ) **
# 1 - 入会に確認が要る
# 2 - 入会に管理者の承認が要る
# 3 - 確認と管理者の承認の両方が要る
#
# ** 入会を開放 (次の変数) にしたくないなら, 0 にはしないようにしてほしい.
DEFAULT_SUBSCRIBE_POLICY = 1

# 当サイトでは, まったくチェックなしに入会できるようにするか.
ALLOW_OPEN_SUBSCRIBE = No

# 退会の既定の方針. 0 (承認なしの退会) を強くお勧めする! [>=2.1]
# 0 - 承認なしで退会できる
# 1 - 退会に承認が要る
DEFAULT_UNSUBSCRIBE_POLICY = 0

# 会員名簿の非公開 == 0: だれでも見れる, 1: 会員のみ, 2: 管理者のみ.
# [訳注: 2.1 以降は既定値が 0 から 1 に変更された.]
DEFAULT_PRIVATE_ROSTER = 1

# 会員を見せるときに, 電子メールアドレスだとわからないようにして, Web 
# スパイダがスパムに利用するためにアドレスを収集できなくするか.
DEFAULT_OBSCURE_ADDRESSES = Yes

# RFC 2369 では, メーリングリスト会員を通じて送られるメッセージすべて
# に付加する List-* ヘッダを定義している. これはエンドユーザにはとても
# 役に立つので, いつも付加したい. しかしながら, すべての MUA がこのヘッ
# ダに適合しているわけではなく, あるリストでリスト会員にそういうユーザ
# がおおぜいいると, その人たちがこのヘッダを隠してほしいと騒ぎ立てるか
# もしれない.
# この変数を No に設定することで, リスト管理者はこのヘッダを隠すオプショ
# ンを使えなくなる (それでも, 一部のヘッダを隠すことはできる. つまり, 
# お知らせ専用リストや保存書庫のないリストにすると, 関係するヘッダは隠
# れる).  [>=2.1]
ALLOW_RFC2369_OVERRIDES = Yes

# メーリングリストでの内容フィルタの既定値. DEFAULT_FILTER_CONTENT を 
# 真に設定すると, 内容フィルタが有効になる. [>=2.1]
DEFAULT_FILTER_CONTENT = No

# DEFAULT_FILTER_MIME_TYPES は, 削除する MIME 型のリスト. これは
# "maintype/subtype" あるいは単に "maintype" の形式の文字列のリストに
# する. たとえば, "text/html" はすべての HTML の添付を取り去るし,
# "image" はすべてのイメージ型の添付をサブタイプ (jpeg, gif, など) に
# 関わらず取り去る. [>=2.1]
DEFAULT_FILTER_MIME_TYPES = []

# DEFAULT_PASS_MIME_TYPES は, 通す MIME 型のリスト.
# 形式は DEFAULT_FILTER_MIME_TYPES とおなじ. [>=2.1]
DEFAULT_PASS_MIME_TYPES = ['multipart/mixed',
                           'multipart/alternative',
                           'text/plain']

# DEFAULT_FILTER_FILENAME_EXTENSIONS は, 削除するファイル名の拡張子の
# リスト.  これは役に立つ. なぜなら, いろんなウィルスが, content-type 
# ヘッダを偽装して安全なファイルに見せかけながら実行可能な拡張子をつけ
# るようにしていて, 被害者がそれを「開く」と実行されてしまうことをねらっ
# ているので. [>=2.1.6]
DEFAULT_FILTER_FILENAME_EXTENSIONS = [
    'exe', 'bat', 'cmd', 'com', 'pif', 'scr', 'vbs', 'cpl'
    ]

# DEFAULT_PASS_FILENAME_EXTENSIONS は, 通すファイル名の拡張子のリスト.
# 形式は DEFAULT_FILTER_FILENAME_EXTENSIONS とおなじ. [>=2.1.6]
DEFAULT_PASS_FILENAME_EXTENSIONS = []

# multipart/alternative を, そのうちの最初のパートで置き換える. [>= 2.1.7]
DEFAULT_COLLAPSE_ALTERNATIVES = Yes

# 内容フィルタを通したあとで, text/html を text/plain に変換するかどうか.
# 変換は HTML_TO_PLAIN_TEXT_COMMAND を使って行う. [>=2.1]
DEFAULT_CONVERT_HTML_TO_PLAINTEXT = Yes

# フィルタした結果内容がなくなってしまったメッセージに対してとる既定の動作.
# [>=2.1]
# 0 = 破棄, 1 = 拒否, 2 = 転送, 3 = 保留
DEFAULT_FILTER_ACTION = 0

# リスト管理者が内容フィルタしたメッセージをディスクの特別なキューに保
# 管できるようにするか. [>=2.1]
OWNERS_CAN_PRESERVE_FILTERED_MESSAGES = Yes

# リストに送られるメッセージの管理コマンドチェックをするか.
DEFAULT_ADMINISTRIVIA = Yes


 
#####
# まとめ読みの既定値. リストの既定値と同じ注意がここにもあてはまる.
#####

# リストをまとめ読みなしにできるか.
DEFAULT_NONDIGESTABLE = Yes

# リストをまとめ読み付きにできるか.
DEFAULT_DIGESTABLE = Yes
DEFAULT_DIGEST_HEADER = ""
DEFAULT_DIGEST_FOOTER = DEFAULT_MSG_FOOTER

DEFAULT_DIGEST_IS_DEFAULT = No
DEFAULT_MIME_IS_DEFAULT_DIGEST = No
DEFAULT_DIGEST_SIZE_THRESHHOLD = 30     # キロバイト
DEFAULT_DIGEST_SEND_PERIODIC = Yes

# RFC 1153 (平文) と MIME の両方のまとめ読みで保持するヘッダ. [>=2.1.1]
# RFC 1153 はまた, 以下のヘッダをこのとおりの順序で指定しているので, 
# 順序はだいじ.
MIME_DIGEST_KEEP_HEADERS = [
    'Date', 'From', 'To', 'Cc', 'Subject', 'Message-ID', 'Keywords',
    # つぎのヘッダも保持したほうがいいとおもう
    'In-Reply-To', 'References', 'Content-Type', 'MIME-Version',
    'Content-Transfer-Encoding', 'Precedence', 'Reply-To',
    # Mailman 2.0 [とそれ以降] ではつぎのヘッダを付加する
    'Message',
    ]

PLAIN_DIGEST_KEEP_HEADERS = [
    'Message', 'Date', 'From',
    'Subject', 'To', 'Cc',
    'Message-ID', 'Keywords',
    'Content-Type',
    ]


 
#####
# 配送エラー処理の既定値. リストの既定値と同じ注意がここにもあてはまる.
#####

# 全部配送エラー処理をするか.
DEFAULT_BOUNCE_PROCESSING = Yes

# 配送エラーを検出してキューに入れてあるものを, bounce runner が
# どのくらいの頻度で処理するか. [>=2.1.5]
REGISTER_BOUNCES_EVERY = minutes(15)

# 配送エラー処理はつぎのように働く: ある会員から配送エラーが届くと, そ
# の会員の「配送エラー情報」を探す. 配送エラー情報がなければ, その会員
# からの配送エラーは初めてだ, ということになる. この場合, その日の日付
# を記録し, 配送エラー得点を初期化する (初期値については下記を見る).
#
# その会員の配送エラー情報がすでにあるのなら, 以前に配送エラーが届いた
# 日付を調べる. この日付がその日とくらべて「配送エラー忘却期間」よりも
# へだたっているのなら, 古いデータはすべて捨てて, その会員からの初めて
# の配送エラーであるかのように, 配送エラー得点を初期化する.
#
# そうでなければ, 配送エラー得点を増やす. 配送エラーが弱か強か (つまり
# 一時的エラーか致命的エラーか) を決定できるなら, 弱な配送エラーには 
# 0.5 点, 強な配送エラーには 1.0 点をつかう. 日に一件の配送エラーにだ
# け得点を付けることに注意. そして, 配送エラー得点が「最大エラー点」を
# 超えれば, その会員のアドレスへの配送を停止する.
#
# そのアドレスへの配送を停止した後に, その会員へ警告メッセージを送るこ
# ともできる. これには確認文字列や確認用の URL が書いてあって, それを
# 使って配送を再開できる. また設定した期間が経った後に, そのアドレスを
# 削除することもできる.  配送エラーのためにアドレスを削除したときは, 
# その会員に最後のメッセージを送る.

# 配送エラー得点がこの値より大きければ配送を停止する. [>=2.1]
DEFAULT_BOUNCE_SCORE_THRESHOLD = 5.0

# この期間よりも前の配送エラー情報は期限切れとみなし, 捨てる. [>=2.1;
# DEFAULT_MINIMUM_REMOVAL_DATE は廃止]
DEFAULT_BOUNCE_INFO_STALE_AFTER = days(7)

# 配送停止や削除された会員に, リストから削除する前に通知を送る回数.
# 0 にすると, そのアドレスをすぐに (最後の通知を送って) 削除する. 最初
# のものは配送停止になってから送ることに注意. [>=2.1;
# DEFAULT_MINIMUM_POST_COUNT_BEFORE_BOUNCE_ACTION は廃止]
DEFAULT_BOUNCE_YOU_ARE_DISABLED_WARNINGS = 3

# 配送停止の警告を送る間隔. [>=2.1]
DEFAULT_BOUNCE_YOU_ARE_DISABLED_WARNINGS_INTERVAL = days(7)

# 管理者は, -bounces (および -admin) アドレス宛てのメッセージで配送エ
# ラー検出にひっかからなかったものを受け取るか. [>=2.1]
DEFAULT_BOUNCE_UNRECOGNIZED_GOES_TO_LIST_OWNER = Yes

# 配送エラーに対する動作の通知. 最初のものは, 会員が配送エラーのために
# 配送停止になったときにリスト管理者に知らせるかどうかを指定し, 次のも
# のは会員が配送エラーのために削除されたときに管理者に知らせるかどうか
# を指定する. [>=2.1; DEFAULT_AUTOMATIC_BOUNCE_ACTION は廃止]
DEFAULT_BOUNCE_NOTIFY_OWNER_ON_DISABLE = Yes
DEFAULT_BOUNCE_NOTIFY_OWNER_ON_REMOVAL = Yes


 
#####
# 一般的な時間制限
#####

# 保留データベースから入会要求を破棄するまでの期間の既定値.
PENDING_REQUEST_LIFE = days(3)

# 配送に失敗したメッセージの再送をどれだけの間くりかえすか. この時間が
# たった後, 失敗した配送先はキューから除かれ, その配送先はメッセージを
# 受け取ることはない.
DELIVERY_RETRY_PERIOD = days(5)

# 一時的な配送の失敗に対して, 再送までどれだけの間待つか. [>=2.1.2 && =2.1.2]
PENDINGDB_LOCK_DEBUGGING = Off

# [訳注] PENDINGDB_LOCK_TIMEOUT [>=2.1.2 && =2.1.2 && =2.1;
# MAILMAN_UID, MAILMAN_GID は廃止]
MAILMAN_USER = '@MAILMAN_USER@'
MAILMAN_GROUP = '@MAILMAN_GROUP@'

# Mailman の CGI での部品の型の列挙
Toggle      = 1
Radio       = 2
String      = 3
Text        = 4
Email       = 5
EmailList   = 6
Host        = 7
Number      = 8
FileUpload  = 9
Select      = 10    # [>=2.1]
Topics      = 11    # [>=2.1]
Checkbox    = 12    # [>=2.1]
# 「拡張電子メールリスト」. 内容が電子メールアドレスか, ^ が先頭につく
# 正規表現. 送信者制限のテキストボックスで使う. [>=2.1]
EmailListEx = 13
# 拡張スパムフィルタ [>=2.1.4]
HeaderFilter  = 14

# 処置
DEFER = 0
APPROVE = 1
REJECT = 2
DISCARD = 3
SUBSCRIBE = 4
UNSUBSCRIBE = 5    # [>=2.1]
ACCEPT = 6         # [>=2.1]
HOLD = 7           # [>=2.1]

# 標準のテキスト項目の幅
TEXTFIELDWIDTH = 40

# ユーザのオプションのビットフィールド. すべての新規リストの既定値を設定
# するには上の DEFAULT_NEW_MEMBER_OPTIONS を見る.
Digests             = 0 # ほかの方法で扱うので, フラグはいらない.
DisableDelivery     = 1 # 旧式 [>=2.1]; set/getDeliveryStatus() を使うこと.
DontReceiveOwnPosts = 2 # 通常配信の会員のみ
AcknowledgePosts    = 4
DisableMime         = 8 # まとめ送りの会員のみ
ConcealSubscription = 16
SuppressPasswordReminder = 32
ReceiveNonmatchingTopics = 64
Moderate = 128
DontReceiveDuplicates = 256

# 短縮形のオプション名とフラグの対応 [>=2.1]
OPTINFO = {'hide'    : ConcealSubscription,
           'nomail'  : DisableDelivery,
           'ack'     : AcknowledgePosts,
           'notmetoo': DontReceiveOwnPosts,
           'digest'  : 0,
           'plain'   : DisableMime,
           'nodupes' : DontReceiveDuplicates
           }

# 認証の種類 [>=2.1]
#
# Mailman ではつぎの役割を定義している:

# - ユーザ. 自分の個人オプション設定を変える以外はなんの権限もない普通
#   のユーザ
# - リスト作成者. リストの作成と削除ができるが, (必ずしも) リストの設
#   定はできないひと.
# - リスト司会者. 入会申請や保留メッセージのような, 保留申請を扱えるひと
# - リスト管理者. リストのすべてを制御でき, リストの設定もでき, リスト
#   会員のユーザオプションを変更でき, 会員を入退会させられ, といったひと.
# - サイト管理者. サイト全体を全般的に制御でき, 以上に述べたようなすべて
#   の作業ができるひと. この人物は普通, コマンドラインツールも操作できる.

UnAuthorized = 0
AuthUser = 1          # ユーザの誰かさん
AuthCreator = 2       # リスト創造者/抹殺者
AuthListAdmin = 3     # リスト管理者 (あるリスト全体を制御)
AuthListModerator = 4 # リスト司会者 (保留申請だけ扱える)
AuthSiteAdmin = 5     # サイト管理者 (すべてを制御できる)

# 役に立つディレクトリ名
LIST_DATA_DIR   = os.path.join(VAR_PREFIX, 'lists')
LOG_DIR         = os.path.join(VAR_PREFIX, 'logs')
LOCK_DIR        = os.path.join(VAR_PREFIX, 'locks')
DATA_DIR        = os.path.join(VAR_PREFIX, 'data')
SPAM_DIR        = os.path.join(VAR_PREFIX, 'spam')
WRAPPER_DIR     = os.path.join(EXEC_PREFIX, 'mail')
BIN_DIR         = os.path.join(PREFIX, 'bin')
SCRIPTS_DIR     = os.path.join(PREFIX, 'scripts')
TEMPLATE_DIR    = os.path.join(PREFIX, 'templates')
MESSAGES_DIR    = os.path.join(PREFIX, 'messages')
PUBLIC_ARCHIVE_FILE_DIR  = os.path.join(VAR_PREFIX, 'archives', 'public')
PRIVATE_ARCHIVE_FILE_DIR = os.path.join(VAR_PREFIX, 'archives', 'private')

# Qrunner サブシステムが使うディレクトリ
QUEUE_DIR       = os.path.join(VAR_PREFIX, 'qfiles')
INQUEUE_DIR     = os.path.join(QUEUE_DIR, 'in')
OUTQUEUE_DIR    = os.path.join(QUEUE_DIR, 'out')
CMDQUEUE_DIR    = os.path.join(QUEUE_DIR, 'commands')
BOUNCEQUEUE_DIR = os.path.join(QUEUE_DIR, 'bounces')
NEWSQUEUE_DIR   = os.path.join(QUEUE_DIR, 'news')
ARCHQUEUE_DIR   = os.path.join(QUEUE_DIR, 'archive')
SHUNTQUEUE_DIR  = os.path.join(QUEUE_DIR, 'shunt')
VIRGINQUEUE_DIR = os.path.join(QUEUE_DIR, 'virgin')
BADQUEUE_DIR    = os.path.join(QUEUE_DIR, 'bad')
RETRYQUEUE_DIR  = os.path.join(QUEUE_DIR, 'retry')     # [>=2.1.4]
MAILDIR_DIR     = os.path.join(QUEUE_DIR, 'maildir')

# その他役に立つファイル名
PIDFILE = os.path.join(DATA_DIR, 'master-qrunner.pid')
SITE_PW_FILE = os.path.join(DATA_DIR, 'adm.pw')
LISTCREATOR_PW_FILE = os.path.join(DATA_DIR, 'creator.pw')

# バージョン番号関係をインポート
from Version import *

# Vgg: 言語の説明とキャラクタセットの辞書 [>=2.1]. なにかあたらしい言
# 語に対応したらここに項目を付け加えなければいけない. キーは地域化した
# テキストの入っているディレクトリ名. 値は タプルで, 1 つめの要素が言
# 語の説明で, これはカタログで使う. 2 つめの要素は言語のキャラクタセッ
# ト. このコードは私の GNU/Linux の /usr/share/locale からみつけて
# きた :-) [訳注: その後も言語が追加されている.]
# 
# [訳注]
#   自分のサイトで「中国語」を使えるようにしている(いた)のなら注意:
#
#   o 言語のコード, 説明, キャラクタセットが, 順次つぎのように変更され
#     た:
#     [=2.1.6]
#       add_language('zh_CN', _('Chinese (China)'),     'utf-8')
#       add_language('zh_TW', _('Chinese (Taiwan)'),    'utf-8')
#
#   o 2.1.6 より, 地域化テキストとカタログのメンテナンス (2.0 時点で止
#     まっていた) が再開された. ただし zh_TW についてはカタログのみで,
#     地域化テキストのメンテナンスは未着手.
#
def _(s):
    return s

LC_DESCRIPTIONS = {}

def add_language(code, description, charset, direction='ltr'):
    LC_DESCRIPTIONS[code] = (description, charset, direction)

add_language('ar',    _('Arabic'),              'utf-8',       'rtl')
add_language('ca',    _('Catalan'),             'iso-8859-1',  'ltr')
add_language('cs',    _('Czech'),               'iso-8859-2',  'ltr')
add_language('da',    _('Danish'),              'iso-8859-1',  'ltr')
add_language('de',    _('German'),              'iso-8859-1',  'ltr')
add_language('en',    _('English (USA)'),       'us-ascii',    'ltr')
add_language('es',    _('Spanish (Spain)'),     'iso-8859-1',  'ltr')
add_language('et',    _('Estonian'),            'iso-8859-15', 'ltr')
add_language('eu',    _('Euskara'),             'iso-8859-15', 'ltr') # バスク語
add_language('fi',    _('Finnish'),             'iso-8859-1',  'ltr')
add_language('fr',    _('French'),              'iso-8859-1',  'ltr')
add_language('he',    _('Hebrew'),              'utf-8',       'rtl')
add_language('hr',    _('Croatian'),            'iso-8859-2',  'ltr')
add_language('hu',    _('Hungarian'),           'iso-8859-2',  'ltr')
add_language('ia',    _('Interlingua'),         'iso-8859-15', 'ltr')
add_language('it',    _('Italian'),             'iso-8859-1',  'ltr')
add_language('ja',    _('Japanese'),            'euc-jp',      'ltr')
add_language('ko',    _('Korean'),              'euc-kr',      'ltr')
add_language('lt',    _('Lithuanian'),          'iso-8859-13', 'ltr')
add_language('nl',    _('Dutch'),               'iso-8859-1',  'ltr')
add_language('no',    _('Norwegian'),           'iso-8859-1',  'ltr')
add_language('pl',    _('Polish'),              'iso-8859-2',  'ltr')
add_language('pt',    _('Portuguese'),          'iso-8859-1',  'ltr')
add_language('pt_BR', _('Portuguese (Brazil)'), 'iso-8859-1',  'ltr')
add_language('ro',    _('Romanian'),            'iso-8859-2',  'ltr')
add_language('ru',    _('Russian'),             'koi8-r',      'ltr')
add_language('sr',    _('Serbian'),             'utf-8',       'ltr')
add_language('sl',    _('Slovenian'),           'iso-8859-2',  'ltr')
add_language('sv',    _('Swedish'),             'iso-8859-1',  'ltr')
add_language('tr',    _('Turkish'),             'iso-8859-9',  'ltr')
add_language('uk',    _('Ukrainian'),           'utf-8',       'ltr')
add_language('vi',    _('Vietnamese'),          'utf-8',       'ltr')
add_language('zh_CN', _('Chinese (China)'),     'utf-8',       'ltr')
add_language('zh_TW', _('Chinese (Taiwan)'),    'utf-8',       'ltr')

del _

2011年4月19日火曜日

MAC-VLAN の認証ログを集計する

認証ログは、syslog 転送可能
$ grep "Login succeed" ログファイル | awk '{ print $1,$2,$3,$11,$13,$4,$12 }'
形としては、
Apr 19 14:49:06 MAC=xxxx.xxxx.xxxx VLAN=xx スイッチ PORT=0/16
と出てくる。 月次統計で使えそう。 認証ログを syslog 転送するには、
# mac-authentication logging enable
# logging event-kind evn
# logging event-kind err
# logging event-kind aut
が必要となる。

2011.04.20 追記

ログイン状況は、
$ grep MAC ログファイル | grep LOGIN | awk '{ print $1,$2,$3,$4,$11,$12,$13 }'
Apr 20 08:02:36 スイッチ MAC=0014.5e64.db2c PORT=0/41 VLAN=71
Apr 20 08:05:15 スイッチ MAC=xxxx.xxxx.xxxx PORT=0/41 VLAN=xx
Apr 20 09:06:06 スイッチ MAC=xxxx.xxxx.xxxx PORT=0/41 VLAN=xx
Apr 20 09:15:12 スイッチ MAC=xxxx.xxxx.xxxx PORT=0/8 VLAN=xx
Apr 20 09:20:01 スイッチ MAC=xxxx.xxxx.xxxx PORT=0/36 VLAN=yy
Apr 20 09:21:59 スイッチ MAC=xxxx.xxxx.xxxx PORT=0/21 VLAN=yy
Apr 20 09:23:31 スイッチ MAC=xxxx.xxxx.xxxx PORT=0/8 VLAN=yy
Apr 20 09:33:59 スイッチ MAC=xxxx.xxxx.xxxx PORT=0/4 VLAN=xx
Apr 20 09:40:59 スイッチ MAC=xxxx.xxxx.xxxx PORT=0/28 VLAN=xx
の方が見やすいか。

サーバの消去

knoppix を使用する。
# shred -n2 -z -v /dev/sda
のような感じ。
-n2 ランダム2回
-z  ゼロ1回
-v  進捗を確認

MAC認証済の端末の認証解除方法

※MAC-VLAN登録変更の際に必要な場合があるため

1.認証されているスイッチを確認
$ grep xxxxxxxxxxxx /var/log/radius/radius.log
Mon Feb 21 14:05:58 2011 : Auth: Login OK: [xxxxxxxxxxxx/パスフレーズ] (from client RADIUSクライアント(認証スイッチ) port 25 cli XX-XX-XX-XX-XX-XX)
2.該当スイッチで認証されていることを確認
スイッチ# show mac-authentication login

Date 2011/02/21 14:07:06 JST
 Dynamic VLAN mode total client counts(Login/Max):   1 / 1000
  Authenticating client counts :    0
  Hold down client counts      :    0
  Port roaming : Disable
   No F MAC address     Port  VLAN  Login time            Limit     Reauth
    1   xxxx.xxxx.xxxx  0/16    xx  2011/02/21 14:05:57   01:58:50   
3530
3.認証解除
スイッチ# clear mac-authentication auth-state mac-address xxxx.xxxx.xxxx
4.確認
スイッチ# show mac-authentication login

Date 2011/02/21 14:07:12 JST
There is no information. ( mac-auth login )

スイッチ# show mac-authentication logging

AUT 02/21 14:00:13 MAC No=4:NORMAL:LOGOUT: MAC=xxxx.xxxx.xxxx PORT=0/16 
VLAN=xx Force logout ; Clear mac-authentication command succeeded.
AUT 02/21 14:00:13 MAC No=82:NORMAL:SYSTEM: Accepted clear auth-state command.

※コマンドによりログアウトしたことがログに記載される

同じコマンドを繰り返し実行する

2011年4月18日月曜日

大量のファイルを削除する

特定のディレクトリのファイルが多すぎて、rm だと
$ rm *
bash: /bin/rm: Agrument list too long
みたいになってしまうときは、
$ find ./ -exec rm {} \;
とすれば、見つけたファイルを1つずつを rm に渡すので消去可能。 ただ、これだと、29万のファイルを消すときには、rm が 29万回実行される という恐ろしく時間がかかる状況になってしまうので、
$find ./ | xargs rm
とすると、引数でわたる最大限の個数を複数回でわたすので、上記の例より 比較的速く実行されることになる。 
 

メールサーバの gam_server について

GAM について

プロセスの関係
pcmanfm -d(親) ->(fork)-> pcmanfm(子) ->(fork/exec) gam_server
  • pcmanfm(子)は孫をfork後、すぐにexit
  • pcmanfm(親)はpcmanfm(子)をwait
  • gam_serverはUnixドメインソケットでlisten
  • pcmanfm(親)は、Unixドメインソケットでgam_serverにconnectを試みる。
corbieのブログ 参照

2011年4月14日木曜日

mailman のトラブルについて

インストール

python 2.5 以上 (not python 3.x) が必要。 通常の mailman と同様の手順でインストール。 pythonlib に pykf が入り、Handlers に iso2022jpfix.py が入る。

設定の詳細

(あなたのポリシーと責任で) 1.Defaults.py に設定可能なパラメータを追加してある。
# Charset order in Decorate.py
DECORATE_LCSET = 1
DECORATE_MCSET = 2
DECORATE_CHARSETS = [DECORATE_LCSET, \
                     DECORATE_MCSET, 'utf-8']
フッタ/ヘッダの追加時に LCSET (リストの文字コード), MCSET (メールの文字コード), UTF-8 の順で変換を試みる。 UTF-8 の使用が嫌なら mm_cfg.py でこれを取り除けば良い。 (結果については、設定者の責任です) 2.mm_cfg.py に以下を追加する。
GLOBAL_PIPELINE.insert(1, 'iso2022jpfix')
「嘘つきISO-2022-JP」を(問答無用で)UTF-8 に変換する。

どうしてもポリシーが合わない人は

0. Decorate.py を使わない (それでも archive, digest は、問題がでる) (Obsoleteな) 解決法の 1,2 を試す。 ヒント: 1. email/charset.py を書き変えて使用する 2.behave.py を使う

2011.04.18 追記

どうやら、この DECORATE 関連の設定によって、ヘッダ・フッタの エンコード失敗することで、問題が生じているようだ。

メールサーバのトラフィック調査

netstat

$ sudo netstat -ant | grep -v "tcp     0     0"
で出てきた xxx.xxx.xxx.xxx 宛の通信を中心に検証。

imap pop 転送量調査

$ grep "Apr 14 01" /var/log/mail.log.1 | grep "imap|pop" | grep "sent=" |\
awk -F"sent=" '{ split($1,a," "); split($2,b,","); print a[3] "," b[1] }' \
> /tmp/mail_0100.csv
これを、02時 ~ 08時台についても行う。尚、ログは、01 ~ 05 は、mail.log.1 06 は、mail.log mail.log.1、07 ~ 08 は、mail.log を参照する。

netstat 追調査

$ sudo netstat -ant | grep xxx.xxx.xxx.xxx
こんな感じ

DNS named.root 更新確認スクリプト

#!/bin/bash # DNSのnamed.rootファイルの更新確認スクリプト # 最新版のnamed.rootファイルを取得し、差分を確認する。 # 更新履歴 # 2014.02.07 watari # お約束 export LANG=C ## 実行ディレクトリ #PR...