このセクションの内容:
•概要 •Milter用のスクリプト •Spamd用のスクリプト •Rspamd用のスクリプト •メッセージ構造を説明する表 •メッセージ構造を説明するテーブル 概要
Dr.Web MailDコンポーネントはLuaプログラムインタプリタを介したインタラクションをサポートします(バージョン5.3.4を使用。Dr.Web for UNIX Mail Serversに同梱)。Luaで記述されたスクリプトをコンポーネントで使用すると、メールメッセージの分析と処理を実行できます。
いずれかのインターフェース(Milter、Spamd、Rspamd)を介してスキャン用に受信したメールメッセージの解析は、対応する*Hookパラメータの指定したインターフェースのパラメータグループにあるDr.Web MailD設定で指定されるLuaのスクリプトを使用して実行されます(Luaプログラムテキスト、または必要な処理プログラムを含むファイルへのパスのいずれかを指定できます)。
Milterインターフェースのメッセージ処理のためのスクリプト
スクリプトの必要条件
ファイルには、メッセージスキャンモジュールのエントリポイントとなるグローバル関数が含まれている必要があります(Dr.Web MailDは、新しく受信したメッセージを処理する際にこの関数を呼び出します)。処理関数は、次の呼び出し規則を満たす必要があります。
1.関数名はmilter_hookです。 2.引数はMilterContextテーブルのみです(関数から処理されたメールメッセージに関する情報へのアクセス権限を付与します)。 3.返り値はMilterResult完了テーブルのみです。返り値は、スキャンされたメッセージについての判定(承認:"accept"、拒否:"reject"、変更:"change"、破棄:"discard")の他、メッセージが承認された場合にメッセージに適用される(可能性がある)アクションを定義します。 Milterインターフェースを介してスキャンするために受信されたすべてのメッセージのAccept判定を無条件にDr.Web MailDに返すスクリプトの定義例(ctx引数はMilterContextテーブルのインスタンスになります)
function milter_hook(ctx)
return {action = "accept"}
end
|
例
処理中に以下の変更を加える例:
•メールメッセージで検出された脅威の名前をヘッダーX-Foundの値として追加する。 •スパムスコアが100ポイントを超える場合は、メールの件名(ヘッダーSubjectの値)に"[SPAM]"プレフィックスを追加する。
function milter_hook (ctx)
-- 検出された脅威の名前をヘッダーに追加します
for threat in ctx.message.threats() do
ctx.modifier.add_header_field("X-Found", threat.name)
end
-- メッセージのスパムスコアが100ポイントを超える場合は、
-- Subjectヘッダーの値を変更します
if ctx.message.spam.score > 100 then
local old_value = ctx.message.header.value("Subject") or ""
local new_value = "[SPAM] " .. old_value
ctx.modifier.change_header_field("Subject", new_value)
end
-- 保留中の変更を適用して受信者にメッセージを送信します
return {
action = "accept",
modifications = ctx.modifier.modifications()
}
end
|
処理中にメッセージをリパックする例:
•検出された脅威を保護されたアーカイブに移動する。 •スパムスコアが100ポイントを超える場合は、保護されたアーカイブにメールメッセージを移動する。
function milter_hook(ctx)
ctx.modifier.repack_password = "xxx"
ctx.modifier.repack_message = ""
-- すべての部分をパスワードで保護されたアーカイブに移動します
-- 脅威が見つかったメッセージ
for threat, path in ctx.message.threats() do
ctx.modifier.repack(path)
local msg = " Threat found: " .. threat.name
ctx.modifier.repack_message = ctx.modifier.repack_message .. msg
end
-- スパムスコアが100ポイントを超えている場合、
-- メッセージ全体をリパックします
if ctx.message.spam.score > 100 then
ctx.modifier.repack()
local msg = " Spam score: " .. ctx.message.spam.score
ctx.modifier.repack_message = ctx.modifier.repack_message .. msg
end
-- 保留中の変更を適用して受信者にメッセージを送信します
-- 変更テーブルが指定されていない場合は、
-- 自動的に返されます
return {action = "accept"}
end
|
メッセージから削除された不要な部分をすべて含むアーカイブは、新しく生成されたメッセージ(リパックされたメッセージ)の添付ファイルとして受信者に送信されます。アーカイブはパスワードで保護されます。この場合のパスワードは、文字列"xxx"が強制的に適用されます。
使用中のテーブル
テーブルMilterContext
milter_hook関数の入力引数として使用されます。処理されたメールメッセージに関する情報(フィールド、構造、ヘッダー、本文、送信者と受信者に関する情報、SMTPセッションに関する情報)へのアクセス権限を提供します。テーブルには以下のフィールドを含みます。
フィールド
|
説明
|
データタイプ
|
session_id
|
このクライアントからのメッセージが処理されている間のクライアントセッションの識別子。
|
文字列
|
sender
|
メールの送信者に関する情報。
|
テーブルMilterSender
|
helo
|
メールメッセージを送信したSMTPクライアントから受信したウェルカム文字列HELO/EHLO、または文字列が見つからない/不明の場合(MTAによって提供されない場合)はnil
|
文字列
|
from
|
山括弧なしの送信者のメールアドレス(例:user@domain.com)
|
文字列
|
to
|
山括弧なしの受信者のメールアドレス
|
テーブルRcptTo
|
message
|
メール(本文とすべてのヘッダーを含む)
|
テーブルMimeMessage
|
modifier
|
MilterModifierテーブルには、MilterResultテーブルのスキャン結果に従って"accept"アクションが生成された場合にメッセージに行われるすべての変更が含まれます。
|
テーブルMilterModifier
|
無効になったメタメソッド:なし
|
テーブルMilterSender
MilterContextテーブルのsenderフィールドとして使用されます。このテーブルには、メール送信者に関する情報が格納され、以下のフィールドが含まれます。
フィールド
|
説明
|
データタイプ
|
hostname
|
送信者のホスト名(FQDN)
|
文字列
|
family
|
文字列で示した接続タイプ
•"U" - 不明なタイプ •"L" - UNIXソケット経由の接続 •“4” - IPv4経由の接続 •"6" - IPv6経由の接続 |
文字列
|
port
|
ポート番号
|
整数
|
ip
|
送信者のホストのIPアドレス。IPアドレスがないか不明の場合(MTAから提供されない場合)はnil
|
テーブルIpAddress
|
無効になったメタメソッド:なし
|
テーブルMilterResult
結果として使用されます。milter_hook関数によって返されます。以下のフィールドを含みます。
フィールド
|
説明
|
データタイプ
|
action
|
メッセージに適用するアクションの説明を含む文字列:
•"accept" - 承認(MTAから受信者へのメッセージ送信を許可します)。 •"discard" - 送信者に通知せずにメッセージを破棄します •"reject" - メッセージを拒否し、SMTP 5**コードを送信者に返します。 •"tempfail" - メッセージを拒否し、SMTP 4**コードを送信者に返します。 •"replycode" - codeフィールドで指定されたSMTP応答を送信者に送信します。 必須フィールド。
|
文字列
|
code
|
送信者に送信される3桁のSMTP応答コード(例:"541")。
オプションのフィールドです。action = "replycode"の場合にのみ使用します。
|
文字列
|
text
|
送信者に送信される応答テキストを含む文字列(例:"User not local or invalid address – Relay denied")。
オプションのフィールドです。action = "replycode"の場合にのみ使用します。
|
文字列
|
message
|
送信者に送信された応答テキストを含む文字列(例:"Message rejected as spam")。
オプションのフィールドです。action = "reject"の場合にのみ使用します。
|
文字列
|
modifications
|
変更の説明を含むテーブル。受信者に送信する前にメールメッセージに適用されます。
オプションのフィールドです。action = "accept"の場合にのみ使用します。
|
テーブルMilterModifications
|
added_recipients
|
追加のメッセージ受信者のメールアドレスのリスト。
オプションのフィールドです。action = "accept"の場合にのみ使用します。
|
文字列の配列
|
deleted_recipients
|
メッセージ受信者のリストから除外する必要があるメールアドレスのリスト。
オプションのフィールドです。action = "accept"の場合にのみ使用します。
|
文字列の配列
|
incident
|
Mailタイプの登録済みイベントのインシデントの説明。
•このフィールドが文字列の場合、この文字列の内容がMailイベントのincident_textフィールドに送信され、イベントが登録されます。 •このフィールドがブール値でfalseに等しい場合、Mailイベントのincident_textフィールドは存在せず、イベントは登録されません。 •このフィールドがブール値でtrueに等しい場合、Mailイベントのincident_textフィールドは自動的に入力され、incident_textの値が空でない場合はイベントが登録されます。 |
文字列またはブール値
|
無効になったメタメソッド:なし
|
テーブルMilterModifications
受信者への配信が決定された場合(acceptアクションが選択された場合)に、メールメッセージに対して行われる必要がある、すべての変更の説明に使用されます。次のフィールドが含まれます(すべてのフィールドはオプションです。対応するフィールド値がない場合、アクションはメッセージに適用されません)。
フィールド
|
説明
|
データタイプ
|
new_body
|
処理されたメッセージの本文を置き換えるために使用される新しいメッセージ本文(ヘッダーなし)
|
文字列
|
added_fields
|
処理されたメッセージに追加されるヘッダー
|
MilterAddedFieldテーブルの配列
|
changed_fields
|
処理されたメッセージから変更または削除されるヘッダー
|
MilterChangedFieldテーブルの配列
|
無効になったメタメソッド:なし
|
テーブルMilterAddedField
処理されたメッセージに追加されるヘッダーの説明に使用されます。以下のフィールドを含みます。
フィールド
|
説明
|
データタイプ
|
name
|
ヘッダー名
|
文字列
|
value
|
ヘッダー値
|
文字列
|
無効になったメタメソッド:なし
|
テーブルMilterChangedField
処理されたメッセージ内で変更される(または削除される)ヘッダーの説明に使用されます。以下のフィールドを含みます。
フィールド
|
説明
|
データタイプ
|
name
|
ヘッダー名
|
文字列
|
index
|
変更するメッセージ内でnameの名前を持つヘッダーの序数(1からカウント)
|
番号
|
value
|
ヘッダーの新しい値(ヘッダーを削除する場合、値は空の文字列""になります)。
|
文字列
|
無効になったメタメソッド:なし
|
テーブルMilterModifier
処理後(および受信者に送信される場合)に、メッセージの変更のスケジュールを設定するためのインターフェースを提供するために使用されます。以下のフィールドを含みます。
フィールド
|
説明
|
データタイプ
|
add_header_field
|
メールメッセージに新しいヘッダーを追加するアクションのスケジュールを設定する関数。
次の2つの必須の引数を受け取ります。
•nameはヘッダー名(文字列)です。 •valueはヘッダー値(文字列)です。 値はRFC 2047に従ってエンコードされます。
|
機能
|
change_header_field
|
指定されたヘッダーを変更(または削除)するアクションのスケジュールを設定する関数。
次の2つの必須の引数を受け取ります。
•nameはヘッダー名(文字列)です。 •valueはヘッダー値(文字列)です。 メッセージに指定された名前を持つ複数のヘッダーがある場合、この関数はその名前を持つ最初のヘッダーの値を変更します。同じヘッダーの値が複数回変更された場合は、最後の値だけが保持されます。valueが空の文字列""の場合、ヘッダーのnameはメッセージから削除されます。
値はRFC 2047に従ってエンコードされます。
|
機能
|
modifications
|
メールメッセージへの実行がスケジュール設定されている変更の全リストを含むMilterModificationsテーブルを返す関数。引数はありません。
|
機能
|
repack
|
指定したメッセージ部分(部分が指定されていないか指定された部分がない場合はメッセージ全体)のリパックのスケジュールを設定する関数。リパック中に、指定した部分がパスワード付きでアーカイブに追加されます。
オプションの引数pathまたはiteratorを受け入れます。
•pathは、アーカイブされるスキャンされたメールの添付ファイルへのパスです。パスが指定されていない場合や、指定されたパスが無効な場合は、メッセージ全体がアーカイブされます。 •iteratorはメッセージ部分の反復子であり、関数によって、MimePartテーブルのthreats、urls、attachments、files、parts、leaf_parts、text_partsが返されます。この場合、反復子から返されたメッセージのすべての部分がリパックされるようにスケジュールされます。 関数の引数が指定されていない場合、または指定されたパスが無効な場合は、メッセージ全体がアーカイブされます。
例:
-- パスワード付きアーカイブへのメッセージのリパックのスケジュールを設定します
-- (メッセージ全体)
ctx.modifier.repack()
-- パスワード付きアーカイブへのメッセージのリパックのスケジュールを設定します
-- 指定されたパスのメッセージ部分(または
-その部分がない場合メッセージ全体)
ctx.modifier.repack('/1/2/3')
-- パスワード付きアーカイブへのメッセージのリパックのスケジュールを設定します
-- (実行ファイルを含むすべての部分)
ctx.modifier.repack(ctx.message.files{name='*.exe'})
-- パスワード付きアーカイブへのメッセージのリパックのスケジュールを設定します
-- (すべてのZIP添付ファイル)
ctx.modifier.repack(ctx.message.attachments{name='*.zip'})
|
|
機能
|
repack_archive_name
|
メッセージの悪意のあるアイテムまたは不要なアイテムを圧縮するためのアーカイブの名前。デフォルトでは、"quarantine.zip"。
|
文字列
|
repack_password
|
アーカイブ保護のためのパスワード。指定されていない場合は、構成ファイルに指定されたパスワードが使用されます(RepackPasswordパラメータ)。
|
文字列
|
repack_message
|
メッセージ(またはその部分)のリパックの理由を表す任意のメッセージ。最終メッセージに追加されます(省略することもできます)。
|
文字列
|
templates_dir
|
リパックのためのテンプレートが保存されているディレクトリへのパス。パスは、設定ファイル(TemplatesDirパラメータ)に指定したパスを基準にした相対パスになります。デフォルト値は"milter"です(つまり、milterサブディレクトリのテンプレートが使用されます)。
|
文字列
|
無効になったメタメソッド:なし
|
このテーブルにアクセスするには、MilterContextテーブルのmodifierフィールドを使用する必要があります。例:
function milter_hook(ctx)
-- ヘッダーリストの末尾に新しいヘッダーを追加する
-- スケジュールを設定します
ctx.modifier.add_header_field("X-Name", "Value")
-- "Subject"フィールドの値を"New value"に変更するスケジュールを設定します
ctx.modifier.change_header_field("Subject", "New value")
-- パスワード付きアーカイブへのメッセージのリパックのスケジュールを設定します
ctx.modifier.repack()
-- メッセージ保留中のすべての変更を使用し、
-- milterプロトコルを介して判定を返します(テーブルMilterResult)
return { action = "accept"}
end
|
MilterModifierテーブルは使用せずに、MilterModifierテーブル(およびそのmodificationsフィールド、つまりMilterModificationsテーブル)に直接入力する例。
-- “X-Checked: True”ヘッダーを追加し、
-- 受信者へのメッセージ送信を有効にします。
function milter_hook(ctx)
return {
action = “accept”,
modifications = {
added_fields = {
{
name = "X-Checked",
value = "True"
}
}
}
}
end
|
MilterModifierテーブルに加えられた変更を無視した、accept判定の返信例:
function milter_hook(ctx)
…
-- メッセージヘッダーを追加するスケジュールを設定します
ctx.modifier.add_header_field('X-Header', 'some value')
…
-- 空のMilterModificationsテーブルを強制的に返します
return {action = "accept", modifications = {}}
end
|
Spamdインターフェースのメッセージ処理のためのスクリプト
スクリプトの必要条件
ファイルには、メッセージスキャンモジュールのエントリポイントとなるグローバル関数が含まれている必要があります(Dr.Web MailDは、新しく受信したメッセージを処理する際にこの関数を呼び出します)。処理関数は、次の呼び出し規則を満たす必要があります。
1.関数名はspamd_report_hookです。 2.引数はSpamdContextテーブルのみです(関数から処理されたメールメッセージに関する情報へのアクセス権限を付与します)。 3.返り値は入力済みのSpamdReportResultテーブルのみです。返り値はSpamdを介した応答を定義します。 Dr.Web MailDでメッセージをスパムとしてマークする必要があるという判定を無条件に返すスクリプトの適切な定義の例(スパムポイント:200、スパム認識しきい値:100、メッセージ:メッセージはスパムとして認識されました。これ以降、ctx引数はSpamdContextテーブルのインスタンスになります):
-- 簡単な実行例
function spamd_report_hook(ctx)
return {
score = 200,
threshold = 100,
report = "The message was recognized as spam"
}
end
|
使用中のテーブル
テーブルSpamdContext
spamd_report_hook関数の入力引数として使用されます。処理されたメールメッセージに関する情報(フィールド、構造、ヘッダー、本文、送信者と受信者に関する情報、SMTPセッションに関する情報)へのアクセス権限を提供します。テーブルには以下のフィールドを含みます。
フィールド
|
説明
|
データタイプ
|
session_id
|
このクライアントからのメッセージが処理されている間のクライアントセッションの識別子。
|
文字列
|
message
|
メールメッセージ。
|
テーブルMimeMessage
|
無効になったメタメソッド:なし
|
テーブルSpamdReportResult
結果として使用されます。spamd_report_hook関数によって返されます。スパムのスキャン結果をDr.Web MailDに渡します。結果はMTAに返されます。以下のフィールドを含みます。
フィールド
|
説明
|
データタイプ
|
score
|
スキャン中にメールメッセージに割り当てられたスパムポイントの数(MTAの場合、Eximによって$spam_score変数と$spam_score_int変数が入力されます)
|
番号
|
threshold
|
メッセージがスパムと見なされるしきい値
|
番号
|
report
|
メッセージスキャンのテキスト結果(MTAの場合、Eximによって$spam_report変数が入力されます)
|
文字列
|
incident
|
Mailタイプの登録済みイベントのインシデントの説明。
•このフィールドが文字列の場合、この文字列の内容がMailイベントのincident_textフィールドに送信され、イベントが登録されます。 •このフィールドがブール値でfalseに等しい場合、Mailイベントのincident_textフィールドは存在せず、イベントは登録されません。 •このフィールドがブール値でtrueに等しい場合、Mailイベントのincident_textフィールドは自動的に入力され、incident_textの値が空でない場合はイベントが登録されます。 |
文字列またはブール値
|
無効になったメタメソッド:なし
|
Rspamdインターフェースのメッセージ処理のためのスクリプト
スクリプトの必要条件
ファイルには、メッセージスキャンモジュールのエントリポイントとなるグローバル関数が含まれている必要があります(Dr.Web MailDは、新しく受信したメッセージを処理する際にこの関数を呼び出します)。処理関数は、次の呼び出し規則を満たす必要があります。
1.関数名はrspamd_hookです。 2.引数はRspamdContextテーブルのみです(関数から処理されたメールメッセージに関する情報へのアクセス権限を付与します。下のテーブルの説明を参照)。 3.返り値は入力済みのRspamdResultテーブルのみです(下のテーブルの説明を参照)。返り値はRspamDを介した応答を定義します。 スクリプトの定義例(ctx引数はRspamdContextテーブルのインスタンスになります):
-- 簡単な実行例
function rspamd_hook(ctx)
return {
score = 200,
threshold = 100
}
end
|
例
MTAと、メールメッセージにスパムポイントを付与する理由を定義するRspamdSymbolテーブルに対して推奨されるアクションの応答例:
function rspamd_hook(ctx)
return {
score = 1080,
threshold = 100,
action = "REJECT:Malicious message"
symbols = {
{
name = "Threat found",
score = 1000
},
{
name = "Spam score by VadeRetro",
score = 80
}
}
}
end
|
使用中のテーブル
テーブルRspamdContext
rspamd_hook関数の入力引数として使用されます。処理されたメールメッセージに関する情報へのアクセス権を提供します。テーブルには以下のフィールドを含みます。
フィールド
|
説明
|
データタイプ
|
session_id
|
このクライアントからのメッセージが処理されている間のクライアントセッションの識別子。
|
文字列
|
sender
|
メッセージ送信者に関する情報
|
テーブルRspamdSender
|
helo
|
SMTPクライアントから受信した文字列HELO/EHLO、または文字列が見つからない/不明の場合(MTAによって提供されない場合)はnil
|
文字列
|
from
|
送信者のメールアドレス(山括弧なし、例:user@domain.com)。アドレスが見つからない/不明な場合(MTAから提供されない場合)はnil
|
文字列
|
to
|
山括弧なしの受信者のメールアドレス
|
テーブルRcptTo
|
message
|
メールメッセージ
|
テーブルMimeMessage
|
無効になったメタメソッド:なし
|
テーブルRspamdSender
メッセージ送信者に関する情報を記述します。以下のフィールドを含みます。
フィールド
|
説明
|
データタイプ
|
hostname
|
送信者のホストの名前(FQDN)、または名前が見つからないか不明の場合(MTAによって提供されない場合)はnil
|
文字列
|
ip
|
送信者のホストのIPアドレス。アドレスが見つからないか不明の場合(MTAから提供されない場合)はnil
|
テーブルIpAddress
|
無効になったメタメソッド:なし
|
テーブルRspamdResult
これは、rspamd_hook関数の結果として使用されます。次のフィールドとしてメッセージスキャンレポートが含まれます。
フィールド
|
説明
|
データタイプ
|
score
|
スキャン中にメールメッセージに割り当てられたスパムポイントの数(MTAの場合、Eximによって$spam_score変数と$spam_score_int変数が入力されます)
|
番号
|
threshold
|
メッセージがスパムと見なされるしきい値
|
番号
|
action
|
オプションのフィールドです。メッセージスキャンの結果としてMTAに推奨されるアクション(MTAの場合、Eximにより$spam_action変数が入力されます)
|
文字列
|
symbols
|
オプションのフィールドです。scoreフィールドで指定されたスパムポイント数を割り当てる理由を特定するためのRspamdSymbolテーブルの配列
|
RspamdSymbolテーブルの配列
|
incident
|
Mailタイプの登録済みイベントのインシデントの説明。
•このフィールドが文字列の場合、この文字列の内容がMailイベントのincident_textフィールドに送信され、イベントが登録されます。 •このフィールドがブール値でfalseに等しい場合、Mailイベントのincident_textフィールドは存在せず、イベントは登録されません。 •このフィールドがブール値でtrueに等しい場合、Mailイベントのincident_textフィールドは自動的に入力され、incident_textの値が空でない場合はイベントが登録されます。 |
文字列またはブール値
|
無効になったメタメソッド:なし
|
テーブルRspamdSymbol
記号の内容を表すテーブル。メッセージに割り当てられている特定数のスパムポイントに対してスキャン中に見つかったアイテム(脅威のあるファイル、不要なURLなど)を示します。テーブルには以下のフィールドを含みます。
フィールド
|
説明
|
データタイプ
|
name
|
検出されたアイテムの名前。
|
文字列
|
score
|
アイテム検出のためにメッセージに割り当てられるスパムポイントの数。
|
番号
|
description
|
オプションのフィールドです。検出されたアイテムの説明
|
文字列
|
無効になったメタメソッド:なし
|
メッセージ構造を説明する表
テーブルRcptTo
SMTPプロトコルのRCPT TOコマンドで発生したメッセージ受信者(山括弧なし)のメールアドレスの配列を含むテーブル。さらに、次のフィールドが含まれています。
フィールド
|
説明
|
データタイプ
|
search
|
アドレス配列内の指定されたテンプレートの少なくとも1つに対応する少なくとも1つのアドレスの存在を確認する関数。
Perl構文(PCRE)の1つの必須patterns引数(検索パターン:1つ(文字列)または複数(文字列の配列))の正規表現を受け入れます。
ブール値を返します。
•true - 少なくとも1つのテンプレートに完全に対応するアドレスが見つかった場合。 •false - それ以外の場合。 大文字と小文字を区別しません。
|
機能
|
all_match
|
すべてのアドレスがアドレス配列内の指定されたテンプレートの少なくとも1つに対応するかどうかをチェックする関数。
Perl構文(PCRE)の1つの必須patterns引数(検索パターン:1つ(文字列)または複数(文字列の配列))の正規表現を受け入れます。
ブール値を返します。
•true - すべてのアドレスが少なくとも1つのテンプレートに完全に対応する場合。 •false - それ以外の場合。 大文字と小文字を区別しません。
|
機能
|
無効になったメタメソッド:なし
|
テーブルMimeMessage
このテーブルは、スキャンされたメールメッセージの概要を示します(MimePartテーブルから継承され、そのすべてのフィールドを含みます)。テーブルには以下のフィールドを含みます。
フィールド
|
説明
|
データタイプ
|
dkim
|
メールメッセージのDKIM署名(RFC 6376を参照)
|
DKIMテーブル
|
raw
|
クライアントから受信したメッセージ
|
文字列
|
spam
|
スパムの兆候に対するメッセージスキャンの結果についてのレポート
|
テーブルSpam
|
from
|
メッセージにFromがない場合、メッセージヘッダーの値はFromまたはnil
|
テーブルFrom
|
to
|
メッセージにToがない場合、メッセージヘッダーの値はToまたはnil
|
テーブルTo
|
date
|
メッセージにDateがない場合、メッセージヘッダーの値は、Dateまたはnil
|
文字列
|
message_id
|
メッセージにMessage-IDがない場合、メッセージヘッダー値はMessage-IDまたはnil
|
文字列
|
subject
|
メッセージにSubjectがない場合、メッセージヘッダーの値はSubjectまたはnil
|
文字列
|
user_agent
|
メッセージにUser-Agentがない場合、メッセージヘッダーの値はUser-Agentまたはnil
|
文字列
|
(MimePartテーブルから継承したフィールド)
|
無効になったメタメソッド:なし
|
テーブルMimePart
このテーブルは、メールメッセージの部分を説明したもので、次のフィールドが含まれます。
フィールド
|
説明
|
データタイプ
|
header
|
メールメッセージのヘッダー
|
テーブルMimeHeader
|
body
|
該当部分の本体。添付された部品がある場合はnil。
|
テーブルMimeBody
|
part
|
テーブルの配列として(現在のメッセージ部分に)添付された部分。添付された部品がない場合、配列は空になります。
|
MimePartテーブルの配列
|
content_disposition
|
このヘッダーが該当部分にない場合、Content-Dispositionヘッダーのコンテンツ、またはnil。
|
ContentDispositionテーブル
|
content_id
|
このヘッダーが該当部分にない場合、Content-IDヘッダーのコンテンツまたはnil。
|
文字列
|
content_type
|
このヘッダーが該当部分にない場合、Content-Typeヘッダーのコンテンツまたはnil。
|
ContentTypeテーブル
|
name
|
添付ファイル名。該当部分が添付ファイルでない場合はnil
|
文字列
|
part_at
|
path引数(メッセージの子部分へのパス)を受け取る関数。指定されたパスにある添付されたメッセージ部分(テーブルMimePart)を返します。
pathは"/ 1/2/3"のような文字列となります。これは、root_part. part [1]. part [2]. part [3]を意味します。数字のない""、"/"、"//"のようなパスはメッセージ部分に対応し、この関数の呼び出し元になります(例:root_part)。指定したパスに子部分がない場合や、パスが正しくない場合は、関数はnilを返します。
|
機能
|
threats
|
オプションの引数filterを1つ受け取る関数。この関数は単一の値、つまり反復子関数を返します。この反復子を使用すると、メッセージのこの部分と添付部分にある、指定されたfilter条件を満たすすべての脅威を調べることができます。反復子関数は引数を持たず、次の2つの値を返します。
•Virusテーブル。 •検出された脅威を含むメッセージ部分への相対パス。 filter引数として、次のものを使用できます。
•ThreatFilterテーブル。 •Virus引数のみを受け取り、次のブール値を返す任意の叙述関数: otrue - 引数が条件を満たしている(脅威である)場合。 ofalse - それ以外の場合。 |
機能
|
urls
|
オプションの引数filterを1つ受け取る関数。この関数は単一の値、つまり反復子関数を返します。この反復子を使用すると、メッセージのこの部分と添付部分にある、指定されたfilter条件を満たすすべてのURLを調べることができます。反復子関数は引数を持たず、次の2つの値を返します。
•Urlテーブル。 •見つかったURLを含むメッセージ部分への相対パス。 filter引数として、次のものを使用できます。
•UrlFilterテーブル。 •Url引数のみを受け取り、次のブール値を返す任意の叙述関数: otrue - 引数が条件を満たしている(不要である)場合。 ofalse - それ以外の場合。 |
機能
|
attachments
|
オプションの引数filterを1つ受け取る関数。この関数は単一の値、つまり反復子関数を返します。この反復子を使用すると、メッセージのこの部分と添付部分にある、指定されたfilter条件を満たすすべての添付ファイルを調べることができます。反復子関数は引数を持たず、次の2つの値を返します。
•MimePartテーブル。 •見つかった添付ファイルを含むメッセージ部分への相対パス。 filter引数として、次のものを使用できます。
•PartFilterテーブル。 •MimePart引数のみを受け取り、次のブール値を返す任意の叙述関数 otrue - 引数が条件を満たしている場合。 ofalse - それ以外の場合。 |
機能
|
files
|
オプションの引数filterを1つ受け取る関数。この関数は単一の値、つまり反復子関数を返します。この反復子を使用すると、メッセージのこの部分と添付部分(アーカイブを含む)にある、指定されたfilter条件を満たすすべてのファイルを調べることができます。反復子関数は引数を持たず、次の2つの値を返します。
•文字列で示したファイル名。 •見つかったファイルを含むメッセージ部分への相対パス。 filter引数として、次のものを使用できます。
•FileFilterテーブル。 •ファイル名を文字列として受け取り、次のブール値を返す任意の叙述関数: otrue - 引数が条件を満たしている場合。 ofalse - それ以外の場合。 |
機能
|
parts
|
オプションの引数filterを1つ受け取る関数。この関数は単一の値、つまり反復子関数を返します。この反復子を使用すると、メッセージのこの部分と添付部分にある、指定されたfilter条件を満たすすべてのメッセージ部分を調べることができます。反復子関数は引数を持たず、次の2つの値を返します。
•MimePartテーブル。 •メッセージ部分への相対パス。 filter引数として、次のものを使用できます。
•PartFilterテーブル。 •MimePartテーブルを受け取り、次のブール値を返す任意の叙述関数: otrue - 引数が条件を満たしている場合。 ofalse - それ以外の場合。 |
機能
|
leaf_parts
|
オプションの引数filterを1つ受け取る関数。この関数は単一の値、つまり反復子関数を返します。この反復子を使用すると、メッセージのこの部分と添付部分にある、指定されたfilter条件を満たすすべてのリーフ部分を調べることができます。反復子関数は引数を持たず、次の2つの値を返します。
•MimePartテーブル。 •メッセージ部分への相対パス。 filter引数として、次のものを使用できます。
•PartFilterテーブル。 •MimePartテーブルを受け取り、次のブール値を返す任意の叙述関数: otrue - 引数が条件を満たしている場合。 ofalse - それ以外の場合。 |
機能
|
text_parts
|
オプションの引数filterを1つ受け取る関数。この関数は単一の値、つまり反復子関数を返します。この反復子を使用すると、メッセージのこの部分と添付部分にある、指定されたfilter条件を満たすすべてのテキスト部分を調べることができます。反復子関数は引数を持たず、次の2つの値を返します。
•MimePartテーブル。 •メッセージ部分への相対パス。 filter引数として、次のものを使用できます。
•PartFilterテーブル。 •MimePartテーブルを受け取り、次のブール値を返す任意の叙述関数: otrue - 引数が条件を満たしている場合。 ofalse - それ以外の場合。 |
機能
|
scan_reports
|
オプションのfilterを1つ受け取る関数。この関数は単一の値、つまり反復子関数を返します。この反復子を使用すると、指定されたfilter条件を満たす、メールの該当部分およびその添付ファイルの部分をスキャンするレポートを処理できます。
反復子関数には引数がなく、単一の値、つまりScanReportテーブルを返します。
filter引数として、次のものを使用できます。
•ScanReportFilterテーブル。 •ScanReportテーブルを受け取り、次のブール値を返す任意の叙述関数: otrue - 引数が条件を満たしている場合。 ofalse - それ以外の場合。 |
機能
|
has_url
|
オプション引数filterを1つの受け取る関数(既述のurls関数の説明を参照)。
ブール値を返します。
•true - メッセージの該当部分とその添付された部分に条件filterを満たすURLが含まれる場合。 •false - それ以外の場合。 例:
if ctx.message.has_url() then
-- メールメッセージに少なくとも1つのURLが見つかりました
end
if ctx.message.has_url{category = "adult_content"} then
-- adult contentのリンクが見つかりました
end
if ctx.message.has_url{category = {"adult_content", "social_networks"}} then
-- 「adult_content」または「social_networks」リンクが見つかった場合
end
if ctx.message.has_url{category = "black_list"} then
-- ブラックリストリソースへのリンクが見つかった場合
end
if ctx.message.has_url{host = "example.com"} then
-- ホスト部分が"example.com"であるリンクが見つかりました
end
if ctx.message.has_url{host_not = "*example.com"} then
-- ホスト部分が"*example.com"に該当しないリンクが見つかりました
end
if ctx.message.has_url(function(url) return port > 80 end) then
-- ポート番号が80より大きいリンクが見つかりました
end
|
|
機能
|
has_threat
|
オプション引数filterを1つの受け取る関数(既述のthreats関数の説明を参照)。
ブール値を返します。
•true - メッセージの該当部分と添付ファイル部分に条件filterを満たす脅威が含まれる場合。 •false - それ以外の場合。 例:
if ctx.message.has_threat() then
-- メッセージに、いずれかのカテゴリーの脅威が1つ以上含まれています
end
if ctx.message.has_threat({category = "known_virus"}) then
-- メッセージに、「known_virus」カテゴリーの脅威が1つ以上含まれている
end
if ctx.message.has_threat{category = "known_virus"} then
-- 同上
end
if ctx.message.has_threat({category = {"known_virus", "joke"}}) then
-- メッセージに、「known_virus」カテゴリーまたは「joke」カテゴリーの脅威が1つ以上含まれている
end
if ctx.message.has_threat{category_not = "joke"} then
-- メッセージに、「joke」以外のカテゴリーの脅威が含まれている
end
|
|
機能
|
has_file
|
オプション引数filterを1つの受け取る関数(既述のfiles関数の説明を参照)。
ブール値を返します。
•true - メッセージの該当部分とその添付ファイル部分に条件filterを満たすファイルが含まれる場合(アーカイブのファイルを含む)。 •false - それ以外の場合。 例:
if ctx.message.has_file() then
-- メールメッセージに少なくとも1つのファイルが見つかりました
end
if ctx.message.has_file{name = "*.exe"} then
-- メールメッセージに少なくとも1つのexeファイルが見つかりました
end
|
|
機能
|
has_part
|
オプション引数filterを1つの受け取る関数(既述のparts関数の説明を参照)。
ブール値を返します。
•true - メッセージの該当部分とその添付ファイル部分に条件filterを満たす部分が含まれる場合。 •false - それ以外の場合。 |
機能
|
has_scan_report
|
オプション引数filterを1つ受け取る関数(上記のscan_reports関数の説明を参照)。
ブール値を返します。
•true - メッセージの該当部分とその添付ファイル部分に条件filterを満たすスキャンレポートが含まれる場合。 •false - それ以外の場合。 使用例については、ScanReportFilterテーブルの編集を参照してください。
|
機能
|
search
|
正規表現(PCRE)を使用してこのメッセージセクション内のテキストを検索する関数。正規表現(文字列)を受け取ります。引用符内で文字列を使用する場合は、スラッシュ文字をエスケープする必要があります。
ブール値を返します。
•true - 指定した正規表現との一致がこのセクションまたは子部分で見つかった場合。 •false - それ以外の場合。 |
機能
|
無効になったメタメソッド:なし
|
テーブルFrom
Fromメールメッセージヘッダーを説明するテーブル。ヘッダー(文字列の配列)から抽出されたメールアドレスのリストが含まれます。さらに、次のフィールドが含まれます。
フィールド
|
説明
|
データタイプ
|
search
|
アドレス配列内の指定されたテンプレートの少なくとも1つに対応する少なくとも1つのアドレスの存在を確認する関数。
Perl構文(PCRE)の1つの必須patterns引数(検索パターン:1つ(文字列)または複数(文字列の配列))の正規表現を受け入れます。
ブール値を返します。
•true - 少なくとも1つのテンプレートに完全に対応するアドレスが見つかった場合。 •false - それ以外の場合。 大文字と小文字を区別しません。
|
機能
|
all_match
|
すべてのアドレスがアドレス配列内の指定されたテンプレートの少なくとも1つに対応するかどうかをチェックする関数。
Perl構文(PCRE)の1つの必須patterns引数(検索パターン:1つ(文字列)または複数(文字列の配列))の正規表現を受け入れます。
ブール値を返します。
•true - すべてのアドレスが少なくとも1つのテンプレートに完全に対応する場合。 •false - それ以外の場合。 大文字と小文字を区別しません。
|
機能
|
無効になったメタメソッド:
•__tostringは、デコードされたヘッダー値を返す関数です。 •__concatは、ヘッダーの復号化された値と文字列を結合する関数です。 |
テーブルTo
Toメールメッセージヘッダーを説明するテーブル。Fromテーブルと同じフィールドとメソッドが含まれています。
ContentTypeテーブル
メッセージ部分のContent-Typeヘッダーを説明するテーブル。以下のフィールドを含みます。
フィールド
|
説明
|
データタイプ
|
type
|
メッセージ部分のMIMEタイプ
|
文字列
|
subtype
|
メッセージ部分のサブタイプ
|
文字列
|
param
|
次のフィールドを持つテーブル配列形式のヘッダーパラメータ:
•nameはパラメータ名(文字列)です。 •valueはパラメータ値(文字列)です。 |
テーブル配列
|
無効になったメタメソッド:
•__tostringは、デコードされたヘッダー値を返す関数です。 •__concatは、ヘッダーの復号化された値と文字列を結合する関数です。 |
ContentDispositionテーブル
メッセージ部分のContent-Dispositionヘッダーを説明するテーブル。以下のフィールドを含みます。
フィールド
|
説明
|
データタイプ
|
type
|
メッセージ部分のビュータイプ
|
文字列
|
param
|
次のフィールドを持つテーブル配列形式のヘッダーパラメータ:
•nameはパラメータ名(文字列)です。 •valueはパラメータ値(文字列)です。 |
テーブル配列
|
無効になったメタメソッド:
•__tostringは、デコードされたヘッダー値を返す関数です。 •__concatは、ヘッダーの復号化された値と文字列を結合する関数です。 |
テーブルSpam
スパムに対するメッセージスキャンについてのレポートを説明するテーブル。以下のフィールドを含みます。
フィールド
|
説明
|
データタイプ
|
type
|
メッセージのタイプ(スパムのステータス)可能な値:
•"legit" - メッセージはスパムではありません。 •"spam" - メッセージはスパムです。 •"virus" - ヒューリスティックアナライザVadeRetroにより、メッセージ本文にウイルスが検出されました。 •"bounce" - メッセージには、元のメッセージの送信者に送信されたネガティブ配信確認(DSN)に関するレポートが含まれています。 •"suspicious" - 疑わしいメッセージ。 •"pce" - 有効なサブスクリプションサービスによって送信される「プロフェッショナルな」商用(広告)メッセージ。 •"mce" - 有効なサブスクリプションサービスでは送信されないが、サブスクリプションを解除する方法が含まれる商用(広告)メッセージ。 •"dce" - サブスクリプションを解除する方法のない「ダーティーな」コマーシャル(広告)メッセージ。 •"community" - ソーシャルネットワークからのメッセージ。 •"transactional" - トランザクション関連のメッセージ(登録、サービスまたは商品の購入)。 •"phishing" - 不正なメッセージ。 •"scam" - 不正なメッセージ(詐欺メッセージ)。 |
文字列
|
score
|
メッセージごとに記録されたスパムポイント数。
|
番号
|
normalized_score
|
インターバル[0, 1]で正規化されたスパムスコア
|
番号
|
reason
|
メールメッセージがスパムであるとされた理由の説明を含む暗号化された文字列
|
文字列
|
version
|
VadeRetroライブラリバージョン
|
文字列
|
無効になったメタメソッド:なし
|
テーブルVirus
脅威を説明するテーブル。以下のフィールドを含みます。
フィールド
|
説明
|
データタイプ
|
type
|
脅威の種類(Doctor Webの分類による)。可能な値:
•"known_virus" - 既知の脅威(ウイルスデータベースに説明がある脅威)。 •"virus_modification" - 既知の脅威の亜種。 •"unknown_virus" - 未知の脅威、疑わしいオブジェクト。 •"adware" - 広告プログラム。 •"dialer" - ダイアラープログラム •"joke" - ジョークプログラム。 •"riskware" - 潜在的に危険なプログラム。 •"hacktool" - ハッキングツール。 |
文字列
|
name
|
脅威の種類(Doctor Webの分類による)
|
文字列
|
無効になったメタメソッド:なし
|
テーブルUrl
URLを説明するテーブル。以下のフィールドを含みます。
フィールド
|
説明
|
データタイプ
|
scheme
|
スキーム(プロトコル)プレフィックス。例:"http"
|
文字列
|
host
|
ホスト名またはIPアドレス。例:"example.com"
|
文字列
|
port
|
ポート番号。例:80。URLに含まれていない場合、値はnilになります。
|
番号
|
path
|
リソースへのパス。例:"index.html"。URLに含まれていない場合、値はnilになります。
|
文字列
|
categories
|
スキャンの結果としてURLに割り当てられたカテゴリー。可能な値:
•"infection_source" - 感染源。 •"not_recommended" - 非推奨のWebサイト。 •"adult_content" - アダルトコンテンツ。 •"violence" - 暴力。 •"weapons" - 武器。 •"gambling" - ギャンブル。 •"drugs" - 薬物。 •"obscene_language" - 卑猥な表現。 •"chats" - チャット。 •"terrorism" - テロリズム。 •"free_email" - 無料メール。 •"social_networks" - ソーシャルネットワーク。 •"owners_notice" - 著作権者からの申し立てによってリストに登録されたWebサイト。 •"online_games" - オンラインゲーム。 •"anonymizers" - アノニマイザー。 •"cryptocurrency_mining_pools" - 仮想通貨マイニングプール。 •"jobs" - 求人検索サイト。 •"black_list" - ブラックリスト(メールサーバー管理者によって非推奨と見なされるリソース)。 |
文字列のテーブル
|
legal_url
|
URLがowners_noticeカテゴリーに属する場合、フィールドには所有者のWebサイトへのURLが含まれます。属さない場合は、nilになります。
|
文字列
|
無効になったメタメソッド:
•__toString - この関数は、Urlコンテンツを文字列(UTF-8)として返します。 •__concat - この関数は、URL文字列値と別の文字列を連結します。 |
テーブルThreatFilter
脅威に対するフィルターを説明するテーブル。次のフィールドが含まれます(すべてのフィールドはオプションです)。
フィールド
|
説明
|
データタイプ
|
category
|
脅威が該当するカテゴリーのリスト(大文字と小文字は区別されません)。Virusテーブルのtypeフィールドの説明にあるカテゴリーのリストを参照してください。
|
文字列または文字列のテーブル
|
category_not
|
脅威が該当しないカテゴリーのリスト(大文字と小文字は区別されません)。
|
文字列または文字列のテーブル
|
無効になったメタメソッド:なし
|
フィルターフィールドが指定されていない(値がnil)場合、脅威はフィルターと一致します。複数のフィルターフィールドが指定されている場合、条件は接続詞(論理積)によって結合されます。フィルターフィールドがテーブル(リスト)の場合、オブジェクトは少なくとも1つのテーブル(リスト)の項目と一致する必要があります。
使用例:
1.メッセージ内に見つかったすべての脅威名をログに出力するには、次の手順を実行します。
function milter_hook(ctx)
…
for virus in ctx.message.threats() do
dw.notice("threat found: " .. virus.name)
end
…
end
|
2.カテゴリーフィルターに一致する脅威名と、脅威が検出されたメッセージ部分の名前をログに出力するには、次の手順を実行します。
function milter_hook(ctx)
…
for v, p in ctx.message.threats({category = "known_virus"}) do
dw.notice("found " .. v.name .. " in " .. ctx.message.part_at(p).name(p))
end
…
end
|
3.叙述関数に一致する脅威名と、脅威が検出されたメッセージ部分の名前をログに出力するには、次の手順を実行します。
function milter_hook(ctx)
…
local function eicar_filter(v)
return v.name == "EICAR Test File (NOT a Virus!)"
end
for v, p in ctx.message.threats(eicar_filter) do
dw.notice("found " .. v.name .. " in " .. ctx.message.part_at(p).name(p))
end
…
end
|
テーブルUrlFilter
URLのフィルターを説明するテーブル(既述のテーブルThreatFilterと同様のもの)。次のフィールドが含まれます(すべてのフィールドはオプションです)。
フィールド
|
説明
|
データタイプ
|
category
|
URLが該当するカテゴリーのリスト(大文字と小文字は区別されません)。Urlテーブルのcategoriesフィールドの説明にあるカテゴリーのリストを参照してください。
|
文字列または文字列のテーブル
|
category_not
|
URLが該当しないカテゴリーのリスト(大文字と小文字は区別されません)。
|
文字列または文字列のテーブル
|
text
|
URLと一致しなければならないテキスト
|
文字列または文字列のテーブル
|
text_not
|
URLと一致できないテキスト
|
文字列または文字列のテーブル
|
host
|
URLに存在するホスト(ドメイン)
|
文字列または文字列のテーブル
|
host_not
|
URLにないホスト(ドメイン)
|
文字列または文字列のテーブル
|
無効になったメタメソッド:なし
|
フィルターフィールドが指定されていない(値がnil)場合、脅威はフィルターと一致します。複数のフィルターフィールドが指定されている場合、条件は接続詞(論理積)によって結合されます。フィルターフィールドがテーブル(リスト)の場合、オブジェクトは少なくとも1つのテーブル(リスト)の項目と一致する必要があります。
使用例:
1.メッセージ内に見つかったすべてのURLをログに出力するには、次の手順を実行します。
function milter_hook(ctx)
…
for url in ctx.message.urls() do
dw.notice("url found: " .. url)
end
…
end
|
2.カテゴリーに一致するURLと、URLが検出されたメッセージ部分の名前をログに出力するには、次の手順を実行します。
function milter_hook(ctx)
…
for u, p in ctx.message.urls{category = "adult_content"} do
dw.notice("found " .. u.text .. " in " .. ctx.message.part_at(p).name(p))
end
…
end
|
テーブルFileFilter
ファイルのフィルターを説明するテーブル(既述のテーブルThreatFilterと同様のもの)。次のフィールドが含まれます(すべてのフィールドはオプションです)。
フィールド
|
説明
|
データタイプ
|
name
|
ファイルに必要な名前。例:"*.exe"、"eicar.txt"。
大文字と小文字を区別しません。
|
文字列または文字列のテーブル
|
name_re
|
ファイル名が一致しなければならない正規表現(PCRE)。例:".*\\.zip"、[[.*\.zip]]。
大文字と小文字を区別しません。引用符内で文字列を使用する場合は、スラッシュ文字をエスケープする必要があります。
|
文字列または文字列のテーブル
|
name_not
|
ファイルが持つことができない名前。
大文字と小文字を区別しません。
|
文字列または文字列のテーブル
|
name_re_not
|
ファイル名が一致できない正規表現(PCRE)。
大文字と小文字を区別しません。引用符内で文字列を使用する場合は、スラッシュ文字をエスケープする必要があります。
|
文字列または文字列のテーブル
|
無効になったメタメソッド:なし
|
複数のフィルターフィールドが指定されている場合、条件は接続詞(論理積)によって結合されます。フィルターフィールドがテーブル(配列)の場合、オブジェクトは少なくとも1つのテーブル(配列)の項目と一致する必要があります。フィルターフィールドが指定されていない(値がnil)場合、ファイルはフィルターと一致します。
使用例:
拡張子として"exe”を持つファイルを含む部分の名前をログに出力する場合
function milter_hook(ctx)
…
for f, p in ctx.message.files{name = "*.exe"} do
local where = ctx.message.part_at(p).name
if not where or where == "" then where = p end
dw.notice("EXE found in " .. where)
end
…
end
|
テーブルPartFilter
メッセージ部分のフィルターを説明するテーブル(既述のテーブルFileFilterと同様のもの)。次のフィールドが含まれます(すべてのフィールドはオプションです)。
フィールド
|
説明
|
データタイプ
|
name
|
その部分に必要な名前。例:"*.exe"、"eicar.txt"。
大文字と小文字を区別しません。
|
文字列または文字列のテーブル
|
name_re
|
部分名が一致しなければならない正規表現(PCRE)。例:".*\\.zip"、[[.*\.zip]]。
大文字と小文字を区別しません。引用符内で文字列を使用する場合は、スラッシュ文字をエスケープする必要があります。
|
文字列または文字列のテーブル
|
content_type
|
部品(添付ファイル)に必要なContent-Type値。例:"image/*"。
大文字と小文字を区別しません。
|
文字列または文字列のテーブル
|
content_disposition
|
該当部分(添付ファイル)が持っていなければならないContent-Disposition値。例:"inline"、"attachment"。
大文字と小文字を区別しません。
|
文字列または文字列のテーブル
|
name_not
|
部分が持つことができない名前。
大文字と小文字を区別しません。
|
文字列または文字列のテーブル
|
name_re_not
|
メッセージ部分の名前が一致できない正規表現(PCRE)。
大文字と小文字を区別しません。引用符内で文字列を使用する場合は、スラッシュ文字をエスケープする必要があります。
|
文字列または文字列のテーブル
|
content_type_not
|
Content-Type部分で一致することができない値。
大文字と小文字を区別しません。
|
文字列または文字列のテーブル
|
content_disposition_not
|
Content-Disposition部分で一致することができない値。
大文字と小文字を区別しません。
|
文字列または文字列のテーブル
|
無効になったメタメソッド:なし
|
フィルターフィールドが指定されていない(値がnil)場合、任意の部分(添付ファイル)がフィルターと一致します。複数のフィルターフィールドが指定されている場合、条件は接続詞(論理積)によって結合されます。フィルターフィールドがテーブル(配列)の場合、オブジェクトは少なくとも1つのテーブル(配列)の項目と一致する必要があります。
使用例:
1.すべての添付ファイルとそのMD5ハッシュをログに出力するには、次の手順を実行します。
function milter_hook(ctx)
…
for a, p in ctx.message.attachments() do
-- Content-TypeとContent-Dispositionに指定されていない場合、
-- 添付ファイル名は空文字列になります
local name = a.name
if name == "" then name = "at path " .. p end
dw.notice("Attachment: " .. name .. "; md5=" .. a.body.md5)
end
…
end
|
2..exe拡張子を持つすべての添付ファイルをログに出力するには、次の手順を実行します。
function milter_hook(ctx)
…
for a in ctx.message.attachments{name = "*.exe"} do
dw.notice("EXE attachment: " .. a.name)
end
…
end
|
3.メールメッセージ内の画像を種類別にカウントするには、次の手順を実行します。
function milter_hook(ctx)
…
local images = {}
for part, path in ctx.message.parts{content_type = "image/*"} do
local subtype = part.content_type.subtype
images[subtype] = (images[subtype] or 0) + 1
end
for t, c in pairs(images) do
dw.notice("Found " .. t .. " images: " .. c)
end
…
end
|
4.添付ファイルにあるすべてのオーディオファイルをログに出力するには、次の手順を実行します。
function milter_hook(ctx)
…
for p, path in ctx.message.parts{
content_type = "audio/*",
content_disposition = {"inline", "attachment"}
} do
local name = p.name
if name == "" then name = "<unnamed>" end
dw.notice("Audio file: " .. name)
end
…
end
|
テーブルScanReportFilter
脅威のメッセージ部分をスキャンするレポートのフィルターを説明するテーブル(上記のFileFilterと同様)。次のフィールドが含まれます(すべてのフィールドはオプションです)。
フィールド
|
説明
|
データタイプ
|
error
|
ScanReportに含める必要のあるエラー。たとえば、"password_protected"、"scan_timeout"。
大文字と小文字を区別しません。
|
文字列または文字列のテーブル
|
error_not
|
ScanReportに含めることができないエラー。たとえば、"password_protected"、"scan_timeout"。
大文字と小文字を区別しません。
|
文字列または文字列のテーブル
|
無効になったメタメソッド:なし
|
複数のフィルターフィールドが指定されている場合、条件は接続詞(論理積)によって結合されます。フィルターフィールドがテーブル(配列)の場合、スキャンレポートは少なくとも1つのテーブル(配列)の項目と一致する必要があります。フィルターフィールドが指定されていない場合(値はnil)、スキャンレポートはすべてフィルターに一致します。
使用例:
1.パスワードで保護されたアーカイブのスキャンに失敗した場合は、メッセージを隔離します。
function milter_hook(ctx)
…
if ctx.message.has_scan_report{error = 'password_protected'} then
return
{
action = 'accept', deleted_recipients = ctx.to,
added_recipients = {'quarantine@mail.domain.com'}
}
end
…
end
|
2.スキャン制限を超えている場合は、次のようにメッセージを隔離します。
function milter_hook(ctx)
…
local limit_errors = {
'archive_level_limit', 'compression_limit',
'container_level_limit', 'mail_level_limit',
'packer_level_limit', 'report_size_limit'
}
if ctx.message.has_scan_report{error = limit_errors} then
return
{
action = 'accept', deleted_recipients = ctx.to,
added_recipients = {'quarantine@mail.domain.com'}
}
end
…
end
|
3.スキャンエラーがある場合は、次のようにメッセージを拒否します。
function milter_hook(ctx)
…
if ctx.message.has_scan_report{error = '*'} then
return {action = 'reject'}
end
…
end
|
テーブルMimeHeader
このテーブルは、メッセージ部分のヘッダーについて説明します。以下のフィールドを含みます。
フィールド
|
説明
|
データタイプ
|
field
|
ヘッダーとその値のリスト
|
HeaderFieldテーブルの配列
|
search
|
正規表現(PCRE)を使用してヘッダーを検索する関数。正規表現(文字列)を受け取ります。メッセージ部分のすべてのヘッダーが検索対象になります。引用符内で文字列を使用する場合は、スラッシュ文字をエスケープする必要があります。
ブール値を返します。
•true - field.name .. ": " .. field.value.decoded文字列が、少なくとも1つのヘッダーに対して指定した正規表現と一致する場合。 •false - それ以外の場合。 |
機能
|
value
|
指定したヘッダーの値を返す関数。ヘッダー名(文字列)を受け取ります。
指定した名前を持つ最初に見つかったヘッダーに対応するHeaderFieldValueテーブルを返します。ヘッダーが見つからなかった場合は、nilを返します。
|
機能
|
無効になったメタメソッド:なし
|
テーブルHeaderField
このテーブルは、メッセージ部分のヘッダーについて説明します。以下のフィールドを含みます。
フィールド
|
説明
|
データタイプ
|
name
|
ヘッダー名
|
文字列
|
value
|
ヘッダー値
|
テーブルHeaderFieldValue
|
url
|
ヘッダー値に含まれるURLのリスト(Subjectヘッダーのみ)。それ以外のヘッダーの場合は、nil
|
Urlテーブルの配列
|
無効になったメタメソッド:なし
|
テーブルHeaderFieldValue
このテーブルは、メールメッセージヘッダーの値を説明したもので、次のフィールドが含まれます。
フィールド
|
説明
|
データタイプ
|
raw
|
未加工の(デコードされていない)ヘッダー値
|
文字列
|
decoded
|
デコードされたヘッダー値
|
文字列
|
無効になったメタメソッド:
•__toString - この関数は、HeaderFieldValueの内容(decodedフィールドの値)を文字列として返します。 •__concat - この関数は、HeaderFieldValue(decodedフィールドの値)と別の文字列を連結します。 |
テーブルMimeBody
このテーブルは、メッセージ部分の本体について説明します。以下のフィールドを含みます。
フィールド
|
説明
|
データタイプ
|
raw
|
メッセージ部分の未加工の(デコードされていない)本文
|
文字列
|
decoded
|
メッセージ部分本体のデコードされた値(Content-Transfer-EncodingヘッダーとContent-Typeヘッダーの値に応じたもの)
|
文字列
|
text
|
Content-Typeヘッダーのcharsetパラメータに従って、UTF-8でデコードされたメッセージ部分本体の値。
"Content-Type: text/*"を持つ部分またはContent-Typeが空の部分にのみ存在します。それ以外の場合は、nilになります。
|
文字列
|
scan_report
|
脅威のスキャンについてのレポート
|
テーブルScanReport
|
url
|
部分テキストに見つかったURL。Urlテーブルの配列。
textフィールドがない場合(nil)、フィールドは空になります。
|
Urlテーブルの配列
|
search
|
正規表現(PCRE)を使用してこの本文内のテキストを検索する関数。正規表現(文字列)を受け取ります。引用符内で文字列を使用する場合は、スラッシュ文字をエスケープする必要があります。
ブール値を返します。
•true - 本文がテキストであり、一致が見つかった場合。 •false - それ以外の場合。 |
機能
|
md5
|
メールメッセージ本文のMD5ハッシュ。
|
文字列
|
sha1
|
メールメッセージ本文のSHA1ハッシュ。
|
文字列
|
sha256
|
メールメッセージ本文のSHA256ハッシュ。
|
文字列
|
無効になったメタメソッド:なし
|
テーブルScanReport
脅威のスキャンについてのレポートを説明するテーブル。以下のフィールドを含みます。
フィールド
|
説明
|
データタイプ
|
object
|
スキャンされたオブジェクトの名前
|
文字列
|
archive
|
スキャンされたオブジェクトがコンテナの場合は、コンテナに関する情報。オブジェクトがコンテナではない場合、nil
|
Archiveテーブル
|
virus
|
検出された脅威のリスト
|
Virusテーブルの配列
|
error
|
エラーが発生した場合は、スキャンエラーの文字列が含まれます。発生していない場合は、nilになります。使用可能な値:
•"path_not_absolute" - 指定されたパスは絶対パスではありません。 •"file_not_found" - ファイルが見つかりませんでした。 •"file_not_regular" - ファイルは通常のファイルではありません。 •"file_not_block_device" - ブロックデバイスではありません。 •"name_too_long" - 名前が長すぎます。 •"no_access" - アクセスが拒否されました。 •"read_error" - 読み取りエラーが発生しました。 •"write_error" - 書き込みエラー。 •"file_too_large" - ファイルが大きすぎます。 •"file_busy" - ファイルは使用中です。 •"unpacking_error" - アンパックエラー。 •"password_protected" - アーカイブはパスワードで保護されています。 •"arch_crc_error" - CRCアーカイブエラー。 •"arch_invalid_header" - 無効なアーカイブヘッダー。 •"arch_no_memory" - アーカイブを解凍するための十分なメモリがありません。 •"arch_incomplete" - 不完全なアーカイブ。 •"can_not_be_cured" - ファイルを修復できません。 •"packer_level_limit" - パックされたオブジェクトのネストレベルの上限を超えました。 •"archive_level_limit" - アーカイブのネストレベルの上限を超えました。 •"mail_level_limit" - メールファイルのネストレベルの上限を超えました。 •"container_level_limit" - コンテナのネストレベルの上限を超えました。 •"compression_limit" - 圧縮率の上限を超えました。 •"report_size_limit" - レポートサイズの上限を超えました。 •"scan_timeout" - スキャンタイムアウトの上限を超えました。 •"engine_crash" - スキャンエンジンの障害。 •"engine_hangup" - スキャンエンジンのハングアップ。 •"engine_error" - スキャンエンジンエラー。 •"no_license" - アクティブなライセンスが見つかりません。 •"multiscan_too_late" - マルチスキャンエラー。 •"curing_limit_reached" - 修復試行の上限を超えました。 •"non_supported_disk" - ディスクタイプはサポートされていません。 •"unexpected_error" - 予期しないエラー。 |
文字列
|
item
|
スキャンされたオブジェクトがコンテナ(アーカイブ、添付されたMIMEオブジェクトなど)の場合、添付されたアイテムのスキャンについて報告します。
|
ScanReport テーブルの配列
|
無効になったメタメソッド:なし
|
Archiveテーブル
アーカイブを説明するテーブル。以下のフィールドを含みます。
フィールド
|
説明
|
データタイプ
|
type
|
アーカイブの種類:
•"archive" - アーカイブ。 •"mail"- メールファイル。 •"container" - その他のコンテナ。 |
文字列
|
name
|
アーカイブ名。例:ZIP
|
文字列
|
無効になったメタメソッド:なし
|
DKIMテーブル
メッセージ内のすべてのDKIM署名を説明するテーブル。以下のフィールドを含みます。
フィールド
|
説明
|
データタイプ
|
signature
|
メッセージに存在するDKIM署名のリスト
|
DKIMSignatureテーブルの配列
|
has_valid_signature
|
1つのオプションの引数filterを受け取って返す関数
•DKIMSignatureテーブルの形式で"pass"に等しいスキャン結果を持つ最初に検出されたDKIM署名。 •検証で署名が検出されなかった場合、nilが表示されます。 filter引数として、次のものを使用できます。
•DKIMSignatureFilterテーブル。 •DKIMSignature引数のみを受け取り、ブール値を返す任意の叙述関数 otrue - 引数が条件を満たしている場合。 ofalse - それ以外の場合。 |
機能
|
無効になったメタメソッド:なし
|
DKIMSignatureテーブル
メッセージのDKIM署名を説明するテーブル。以下のフィールドを含みます。
フィールド
|
説明
|
データタイプ
|
auid
|
DKIM署名の"i"タグから取得されるエージェントまたはユーザー識別子(AUID)の値は、デフォルト値を考慮します
|
文字列
|
data
|
DKIM署名の"b"タグから抽出された署名のテキスト(base64)値
|
文字列
|
result
|
DKIM署名検証結果
|
DKIMResultテーブル
|
sdid
|
DKIM署名の"d"タグから取得した署名ドメイン識別子(SDID)の値
|
文字列
|
selector
|
DKIM署名の"s"タグから取得したセレクター
|
文字列
|
無効になったメタメソッド:なし
|
DKIMResultテーブル
メッセージのDKIM署名を説明するテーブル。以下のフィールドを含みます。
フィールド
|
説明
|
データタイプ
|
type
|
テキスト形式のDKIM署名検証結果。次の値が含まれる場合があります。
•passは、署名の検証が成功したことを示します。 •failは、署名の検証が失敗したことを示します(つまり、メール本文のハッシュと一致しないか、署名を検証できませんでした)。 •neutralは、DKIM署名の構文エラーです。 •temperrorは、ドメインキーの取得に失敗したことを示します(DNSエラー)。 •permerrorは、他のタイプのエラー(署名形式、キー形式、キーと署名の間の不整合など)を示します。 |
文字列
|
comment
|
スキャン結果のコメント(Authentication-Resultsのコメントとして使用できます)
|
文字列
|
key_size
|
スキャン中に使用されるキーサイズはnilか、キーまたはスキャン結果の取得に失敗した場合はneutral
|
番号
|
無効になったメタメソッド:なし
|
テーブルDKIMSignatureFilter
DKIMメッセージ署名のフィルターを説明するテーブル(上記のFileFilterテーブルと同様)。次のフィールドが含まれます(すべてのフィールドはオプションです)。
フィールド
|
説明
|
データタイプ
|
domain
|
DKIM署名のSDIDフィールドのドメインが対応するドメイン
|
文字列または文字列のテーブル
|
domain_not
|
DKIM署名のSDIDフィールドのドメインが対応すべきではないドメイン
|
文字列または文字列のテーブル
|
無効になったメタメソッド:なし
|
フィルターフィールドが指定されていない場合(つまり、nil値が含まれている場合)、このメッセージのDKIM署名はすべてフィルターと一致します。複数のフィルターフィールドが指定されている場合、条件は接続詞(論理積)によって結合されます。フィルターフィールドタイプがテーブル(配列)の場合、フィルターされたオブジェクトは、テーブル(配列)要素の少なくとも1つと一致する必要があります。
利用可能な補助モジュール
LuaのプログラムスペースでDr.Web for UNIX Mail Serversとやり取りするために、次の特定のモジュールをインポートできます。
モジュール名
|
機能
|
drweb
|
Luaプログラムを起動したDr.Web for UNIX Mail ServersコンポーネントとLuaプロシージャの非同期実行の手段のログに、Luaプログラムからのメッセージを記録する機能を提供するモジュール
|
drweb.lookup
|
Dr.Web LookupDモジュールを呼び出して外部ソースからデータを要求するためのツールを提供するモジュール
|
drweb.dnsxl
|
ホストのアドレスがDNSxLブラックリストにあるかどうかを確認するためのツールを提供するモジュール
|
drweb.regex
|
文字列と正規表現を一致させるためのインターフェースを提供するモジュール
|
drweb.subprocess
|
外部アプリケーション(プロセス)を実行するためのインターフェースを提供するモジュール
|
drweb.config
|
Dr.Web MailD設定パラメータ値を持つテーブルを提供するモジュール。
|
drwebモジュールの内容
1.機能
このモジュールは次の機能を提供します。
1.1.LuaプログラムからのメッセージをDr.Web for UNIX Mail Serversコンポーネントログに保存するための機能:
•log(<level>, <message>)は<message>文字列をDr.Web for UNIX Mail Serversログに<level>レベル(必要なレベルは、「debug」、「info」、「notice」、「warning」、「error」を使用して定義します)で書き込みます。 •debug(<message>)は<message>文字列をDr.Web for UNIX Mail ServersログにDEBUGレベルで書き込みます。 •info(<message>)は<message>文字列をDr.Web for UNIX Mail ServersログにINFOレベルで書き込みます。 •notice(<message>)は<message>文字列をDr.Web for UNIX Mail ServersログにNOTICEレベルで書き込みます。 •warning(<message>)は<message>文字列をDr.Web for UNIX Mail ServersログにWARNINGレベルで書き込みます。 •error(<message>)は<message>文字列をDr.Web for UNIX Mail ServersログにERRORレベルで書き込みます。 1.2.Luaプロシジャの同期管理のための機能:
•sleep(<sec.>)はこのLuaプロシジャインスタンスの実行を指定された秒数で一時停止します。 •async(<Lua function>[, <argument list>])は、指定された関数の非同期開始を起動し、指定された引数リストに転送します。async関数呼び出しはすぐに完了し、戻り値(Futureテーブル)を使用すると、<Lua function>の結果を取得できます(まだ実行が完了していない場合は、完了するまで待機している可能性があります)。 1.3.IPアドレスをIpAddressテーブルとして表示するための機能:
•ip(<address>)は、IpAddressテーブルの形式で<address>文字列として送信される、IPアドレスを指定します。IPv4またはIPv6アドレスのいずれかを使用できます。 1.4.テキストファイルから外部データをアップロードするには:
•load_set(<file path>)は、指定されたテキストファイルのコンテンツからtrue値を含むテーブルを生成し、ファイルから読み取られた文字列はキーとして使用されます。空の文字列と空白文字のみで構成される文字列は無視され、テーブルには含まれません。 •load_array(<file path>)は、指定されたテキストファイルのコンテンツから文字列の配列を生成します。空の文字列と空白文字のみで構成される文字列は無視され、配列には含まれません。 2.テーブル
2.1.Futureテーブルは、async関数を使用して関数を実行した後の保留中の結果を表します。テーブルには以下のフィールドを含みます。
フィールド
|
説明
|
データタイプ
|
wait
|
async関数を使用して開始した関数の結果を返す関数。関数がまだ実行を完了していない場合は、完了を待って結果を返します。waitが呼び出される前に関数が完了した場合、結果はすぐに返されます。開始された関数が失敗した場合、wait呼び出しは同じエラーを生成します。
|
機能
|
無効になったメタメソッド:なし
|
2.2 IpAddressテーブルはIPアドレスを表します。以下のフィールドを含みます。
フィールド
|
説明
|
データタイプ
|
belongs
|
指定したサブネット(IPアドレス範囲)のIpAddressテーブルに保存されているIPアドレスの所属を確認する関数。
「<IP address>」または「<IP address>/<mask>」のような文字列を唯一の引数として受け取ります。ここで、<IP address>はホストアドレスまたはネットワークアドレス(「127.0.0.1」など)、<mask>はサブネットワークマスク(「255.0.0.0」などのIPアドレスとして、または「8」などの数値形式で指定できます)です。
ブール値を返します。
•trueは、アドレスが指定されたアドレスの少なくとも1つと等しいか、指定されたサブネット(IPアドレスの範囲)の少なくとも1つに属していることを示します。 •false - それ以外の場合。 |
機能
|
無効になったメタメソッド:
•__tostringは、文字列内のIpAddressを変更する関数です。例:「127.0.0.1」(IPv4)または「::1」(IPv6) •__concatは、IpAddressを文字列に結合する関数です。 •__eqは、2つのIpAddressが等しいことを確認するための関数です。 •__bandは、マスクを適用するための関数(例:dw.ip('192.168.1.2') & dw.ip('255.255.254.0'))です。 |
3.例
3.1.非同期的に開始される手順によって生成される、ログへの出力メッセージ:
local dw = require "drweb"
-- この関数は2秒間待機して文字列を返します。
-- 引数として受信されます
function out_msg(message)
dw.sleep(2)
return message
end
-- 「メイン」関数
function intercept(ctx)
-- NOTICEレベルでDr.Web for UNIX Mail Serversログに文字列を出力します
dw.notice("Intercept function started.")
-- out_msg関数の2つのコピーを非同期で起動します
local f1 = dw.async(out_msg, "Hello,")
local f2 = dw.async(out_msg, " world!")
-- out_msg関数のコピーの完了を待機中です
-- out_msgとその結果をログに出力します
-- Dr.Web for UNIX Mail Servers ログにデバッグレベルで出力します
dw.log("debug", f1.wait() .. f2.wait())
end
|
3.2.指定されたスケジュールに従って定期的に開始する手順を作成する:
local dw = require "drweb"
-- Futureテーブルをfutureグローバル変数で保存し、
-- Luaのガベージコレクターにより
-- 計画されたタスクが破壊されないようにします
future = dw.async(function()
while true do
-- 毎日、次のメッセージがログに表示されます
dw.sleep(60 * 60 * 24)
dw.notice("A brand new day began")
end
end)
|
3.3.文字列のIPアドレスを変更する:
local dw = require "drweb"
local ipv4 = dw.ip("127.0.0.1")
local ipv6 = dw.ip("::1")
local mapped = dw.ip("::ffff:127.0.0.1")
|
drweb.lookupモジュールの内容
1.機能
このモジュールは次の機能を提供します。
•lookup(<request>, <parameters>)はDr.Web LookupDモジュールから利用できる外部ストレージからデータを要求します。<request>パラメータは、Dr.Web LookupD設定内のセクション(文字列<type>@<tag>)に対応している必要があります。<parameters>引数はオプションで、リクエストを生成するために使用される置換を表します。これらのパラメータはテーブルとして設定されます。このテーブルのキーと値は文字列でなければなりません。この関数は、リクエストの結果である文字列の配列を返します。 •check(<checked string>、<request>、<parameters>)は、Dr.Web LookupDモジュールを介して利用できる外部リポジトリで<checked string>が見つかった場合にtrueを返します。引数<request>および<parameters>は、lookup関数の引数と同じです(上記を参照)。<checked string>引数は、文字列または__tostringメタメソッドを持つテーブル(つまり、文字列にフォーマットできる)であると想定されます。 2.例
データソースLookupD.LDAP.usersから取得されたユーザーリストのログへの出力:
local dw = require "drweb"
local dwl = require "drweb.lookup"
-- 「メイン」関数
function intercept(ctx)
-- NOTICEレベルでDr.Web for UNIX Mail Serversログに文字列を出力します
dw.notice("Intercept function started.")
-- リクエスト結果をDr.Web for UNIX Mail Serversログへ出力
-- 'ldap@users’データソースへ
for _, s in ipairs(dwl.lookup("ldap@users", {user="username"})) do
dw.notice("Result for request to 'ldap@users': " .. s)
end
end
|
drweb.dnsxlモジュールの内容
1.機能
このモジュールは次の機能を提供します。
•ip(<IP address>, <DNSxL server>)は指定されたIPアドレス<IP address>に対応するDNSxLサーバー<DNSxL server>からAタイプのDNSレコードをリクエストします。 検査されているIPアドレスがDNSxLサーバーのリストに登録されている場合、結果は架空のIPアドレスのリストになります。さらに、返された架空のIPアドレスのそれぞれに、検査済みの<IP address>がこのサーバーのリストに表示されている理由が含まれていることがあります(通常、理由タイプは返された架空のIPアドレスの最後のオクテット値によって決まります)。DNSxLサーバーにIPアドレス<IP address>に対応するAタイプのDNSレコードが含まれていない場合、関数はnilを返します。
•url(<URL>, <SURBL server>)は<URL>ドメイン部分に対応する<SURBL server>サーバーにからAタイプのDNSレコードをリクエストします(HTTPリダイレクトは処理されません)。 <URL>から取得された、検査されているドメインがSURBLサーバーのサーバーリストに登録されている場合、結果は架空のIPアドレスのリストになります。さらに、返された架空のIPアドレスのそれぞれに、検査済みのドメインがこのサーバーのリストに表示されている理由が含まれていることがあります(通常、理由タイプは返された架空のIPアドレスの最後のオクテット値によって決まります)。SURBLサーバーに<URL>からのドメインに対応するAタイプのDNSレコードが含まれていない場合、この関数はnilを返します。
関数の引数は、文字列または文字列にキャストされるオブジェクトです(たとえば、<IP address>としてはIpAddressテーブルを使用でき、<URL>としてはUrlテーブルを使用できます)。IPアドレスは、IpAddressテーブルの配列として返されます。
2.テーブル
2.1.IpAddressテーブルはIPアドレスを表します。テーブルについては上で説明しています。
3.例
DNSxLサーバーによるIPアドレスのスキャン結果のログへの出力:
local dw = require "drweb"
local dwxl = require "drweb.dnsxl"
-- 「メイン」関数
function intercept(ctx)
-- NOTICEレベルでDr.Web for UNIX Mail Serversログに文字列を出力します
dw.notice("Intercept function started.")
-- スキャン結果をDr.Web for UNIX Mail Serversログに出力します
-- IPアドレス10.20.30.40はDNSxLサーバーのブラックリストに登録されています
-- dnsxl.server1.org
local records = dwxl.ip("10.20.30.40", "dnsxl.server1.org")
if records then
for _, ip in ipairs(records) do
dw.notice("DNSxL A record for 10.20.30.40: " .. ip)
end
end
end
|
drweb.regexモジュールの内容
1.機能
このモジュールは次の機能を提供します。
•search(<template>, <text>[, <flags>]) - <text>文字列に<template>正規表現と一致するサブストリングが含まれている場合はtrueを返します。オプションの<flags>パラメータ(整数)は、関数の動作に影響を与える一連のフラグであり、論理和でつなげられます。 •match(<template>, <text>[, <flags>]) - <template>正規表現がそのサブストリングだけでなく<text>ストリング全体と一致しなければならない点を除いてsearchと同じです。 2.利用可能なフラグ
•ignore_caseはテキストの大文字と小文字を区別しません。 3.例
local rx = require "drweb.regex"
rx.search("te.?t", "some TexT") -- false
rx.search("te.?t", "some TexT", rx.ignore_case) -- true
rx.match("some.+", "some TexT") -- true
|
drweb.subprocessモジュールの内容
1.機能
このモジュールは次の機能を提供します。
•run(<parameters >)は指定されたプロセス(アプリケーション)を同期モードで実行します(この関数はプロセスが終了した後にのみコントロールを戻します)。<parameters>引数は、ファイルへの実行可能ファイルのパス、起動時にアプリケーションに渡されるすべての引数(配列argv)、アプリケーションの入出力ストリーム(stdin、stdout、stderr)に関連付けられたオプションのパラメータを含むテーブルです。オプションのパラメータは、アプリケーションの(現在の)作業ディレクトリと環境変数を指定します。 関数の結果は、終了後のプロセス操作の結果(プロセスが終了した終了コードまたはシグナル番号)を含むテーブルになります。さらに、プロセス実行パラメータのテーブルで指定すると、返されるテーブルに、stdoutおよびstderr出力ストリームから読み込まれるデータを含むフィールドを含めることができます。
2.テーブル
2.1.入力実行パラメータのテーブル。以下のフィールドを含みます。
フィールド
|
説明
|
データタイプ
|
(名前なし)
|
ファイルパスとアプリケーション実行引数(配列argv)。
必須フィールド。フィールドはコマンドライン引数の数だけ繰り返され、最初の値はargv[0]、つまり実行可能パスに対応します。
|
文字列
|
stdin
|
実行後にアプリケーション(プロセス)が入力ストリーム(stdin)から受け取るテキスト。オプションのフィールド(指定しない場合、stdinは何も受け取りません)。
|
文字列
|
stdout
|
返されるテーブルのフィールドの名前。このフィールドは、プロセスがstdoutストリームに出力するテキストを受け取ります。オプションのフィールド(指定しない場合、出力はstdoutに保存されません)。
|
文字列
|
stderr
|
返されるテーブルのフィールドの名前。このフィールドは、プロセスがstderrストリームに出力するテキストを受け取ります。オプションのフィールド(指定しない場合、出力はstderrに保存されません)。
|
文字列
|
env
|
プロセス環境に送信される環境変数をフィールドに持つテーブル。環境変数は、"<variable name>"="<value>"のペアで指定されます。オプションのフィールド(指定しない場合、環境変数は設定されません)。
|
テーブル
|
workdir
|
実行中のプロセスの作業(現在の)ディレクトリ。オプションのフィールド(指定しない場合、作業ディレクトリは設定されません)。
|
文字列
|
2.2.実行結果のテーブル(run関数の戻り値)以下のフィールドを含みます。
フィールド
|
説明
|
データタイプ
|
exit_status
|
プロセスが正常に終了したときの返りコード。発生していない場合は、nilになります。
|
番号
|
exit_signal
|
プロセスが終了したときのシグナル番号発生していない場合は、nilになります。
|
番号
|
(入力パラメータテーブルのstdoutフィールドの値)
|
終了したプロセスのstdoutストリームから読み込まれたデータ。フィールドは、入力パラメータのテーブルでstdoutフィールドが指定されている場合にのみ使用可能です。
|
文字列
|
(入力パラメータテーブルのstderrフィールドの値)
|
終了したプロセスのstderrストリームから読み込まれたデータ。フィールドは、入力パラメータのテーブルでstderrフィールドが指定されている場合にのみ使用可能です。
|
文字列
|
3.例
3.1.catユーティリティを引数なしで実行し、'some data'テキストをその入力ストリームに渡し、コマンド出力の結果を返されるテーブルのstdout_fieldフィールドに渡すには、次のように指定します。
local sp = require 'drweb.subprocess'
local cat_result = sp.run({
'/bin/cat',
stdin = 'some data',
stdout = 'stdout_field',
})
|
cat_result変数に格納される結果のテーブルには、以下のフィールドが含まれます。
フィールド
|
値
|
exit_status
|
0
|
exit_signal
|
nil
|
stdout_field
|
'some data'
|
3.2.-сとenv | grep TESTVAR 1>&2のパラメータを指定してshコマンド(インタプリタによりコマンド実行)を実行し、VALUE値を持つTESTVAR変数を環境に追加し、コマンドstderrの出力結果を返されるテーブルのstderr_fieldフィールドに渡すには、次のように指定します。
local sp = require 'drweb.subprocess'
local env_result = sp.run({
'/bin/sh', '-c', 'env | grep TESTVAR 1>&2',
env = { TESTVAR = 'VALUE' },
stderr = 'stderr_field'
})
|
env_result変数に格納される結果のテーブルには、以下のフィールドが含まれます。
フィールド
|
値
|
exit_status
|
0
|
exit_signal
|
nil
|
stderr_field
|
'TESTVAR=VALUE\n'
|
3.3.pwdコマンドを実行して作業ディレクトリをシステムのルートディレクトリに設定し、コマンドstdoutの出力結果を返されるテーブルのstdout_fieldフィールドに渡すには、次のように指定します。
local sp = require 'drweb.subprocess'
local pwd_result = sp.run{
'/bin/pwd',
workdir = '/',
stdout = 'stdout_field'
}
|
pwd_result変数に格納される結果のテーブルには、以下のフィールドが含まれます。
フィールド
|
値
|
exit_status
|
0
|
exit_signal
|
nil
|
stdout_field
|
'/\n'
|
3.4.killコマンドをbashで実行し、SIGKILLシグナルをインタプリタに渡すには、次のように指定します。
local sp = require 'drweb.subprocess'
local kill_result = sp.run{'/bin/bash', '-c', 'kill -9 $$'}
|
kill_result変数に格納される結果のテーブルには、以下のフィールドが含まれます。
フィールド
|
値
|
exit_status
|
nil
|
exit_signal
|
9
|
プロセスを非同期的に実行するには、async関数呼び出し内でrun関数を実行します(上を参照)。
drweb.configモジュールの内容
1.機能
このモジュールには関数はありません。
2.利用可能なテーブル
このモジュールでは、次のフィールドでMailDConfigテーブルを提供します。
フィールド
|
説明
|
データタイプ
|
version
|
Dr.Web MailDバージョン。
|
文字列
|
無効になったメタメソッド:なし
|
MailDConfigテーブルは、モジュールによってmaildフィールドとして提供されます。
3.例
以下はDr.Web MailDコンポーネントの現在のバージョンをログに記録する出力です。
local dw = require 'drweb'
local cfg = require 'drweb.config'
-- 「メイン」関数
function milter_hook(ctx)
-- NOTICEレベルでDr.Web for UNIX Mail Serversログに文字列を出力します
dw.notice(cfg.maild.version)
end
|
|