summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorfukachan <fukachan>2001-03-02 04:40:06 +0000
committerfukachan <fukachan>2001-03-02 04:40:06 +0000
commitc659b7e1278a6deab2521222cbc0496d7634ddb7 (patch)
tree4c73d92fb1a24396e744bb890ed233b578dac065
parent209485d5cb3a4eb289cf3fdb4c96e1ba3c89e645 (diff)
downloadfml8-snap-20010302.tar.gz
fml8-snap-20010302.tar.bz2
fml8-snap-20010302.zip
error messages librarysnap-20010302
-rw-r--r--fml/lib/ErrorMessages/00_PARSE.ja.txt311
-rw-r--r--fml/lib/ErrorMessages/00_README.ja.txt12
2 files changed, 323 insertions, 0 deletions
diff --git a/fml/lib/ErrorMessages/00_PARSE.ja.txt b/fml/lib/ErrorMessages/00_PARSE.ja.txt
new file mode 100644
index 00000000..2b6f66cf
--- /dev/null
+++ b/fml/lib/ErrorMessages/00_PARSE.ja.txt
@@ -0,0 +1,311 @@
+### VERY FUNDAMENTAL CONFIG ###
+$ErrorCodePat = '55\d|5\.\d\.\d';
+$TrapWord = 'unknown \S+|\S+ unknown|\S+ not known| not found';
+
+# regexp
+$RE_SJIS_C = '[\201-\237\340-\374][\100-\176\200-\374]';
+$RE_SJIS_S = "($RE_SJIS_C)+";
+$RE_EUC_C = '[\241-\376][\241-\376]';
+$RE_EUC_S = "($RE_EUC_C)+";
+$RE_JIN = '\033\$[\@B]';
+$RE_JOUT = '\033\([BJ]';
+###############################
+
+
+
+
+
+
+sub Parse
+{
+ my ($new_block, $gobble, $curf, $first_header_part);
+ my ($mp_block, $p, $pmax);
+
+ $new_block = 1;
+ $gobble = 0;
+ $curf = $NULL;
+ $first_header_part = 1;
+
+ # gobble error mail
+ {
+ $pmax = sysread(STDIN,
+ $MessageBuffer,
+ $MEAD_INCOMING_MAIL_SIZE_LIMIT);
+
+ if ($pmax >= $MEAD_INCOMING_MAIL_SIZE_LIMIT) {
+ &Log("warn: input mail is too large");
+ &Log("warn: check the fisrt $MEAD_INCOMING_MAIL_SIZE_LIMIT bytes");
+ }
+ &Log("log: read $pmax bytes") if $debug;
+ }
+
+ my ($msgbufp, $msgbufp1);
+ for ($msgbufp = 0; $msgbufp <= $pmax; ) {
+ $msgbufp1 = index($MessageBuffer, "\n", $msgbufp);
+ last if $msgbufp1 < 0;
+ $_ = substr($MessageBuffer, $msgbufp, $msgbufp1 - $msgbufp);
+ $msgbufp = $msgbufp1 + 1;
+
+ # reread input buffer since this buffer ends incomletely.
+ # we ends it up with "\n" correctly.
+ $SavedBuffer .= $_."\n" if $InputLines++ < 1024;
+
+ # ignore the first header
+ # we should ignore header for <maintainer>
+ $first_header_part = 0 if /^$/;
+
+ # save excursion
+ $PrevLine = $CurLine;
+ $CurLine = $_;
+
+ # check the current block
+ if (/^Content-Type:\s*(.*)/i) {
+ &Debug("<<< $_ >>>");
+ $mp_block = $1;
+ }
+
+ if (/^(Content-Description:\s*Notification).*/i) {
+ &Debug("<<< $_ >>>");
+ $mp_block = $1;
+ }
+
+ # Store Received: field
+ if (! $first_header_part) {
+ if (/^([-A-Za-z]+):(.*)/) {
+ $curf = $1;
+ $value = $2;
+ $Received .= "\n".$value if $curf =~ /Received/i;
+ }
+ elsif (/^\s+(.*)/) {
+ $value = $1;
+ $Received .= $value if $curf =~ /Received/i;
+ }
+ }
+
+ if ($original_mail && $found && $debug) {
+ &Debug(" --- $_") if $debug;
+ }
+ elsif ($debug) {
+ &Debug(" | $_") if $debug;
+ }
+
+ $new_block = 1 if /^\s*$/;
+
+ if (/^From:.*mailer-daemon/i || /^From:.*postmaster/) {
+ undef %return_addr;
+ $original_mail = $found = 0;
+ undef $MTA;
+ undef $CurAddr;
+ }
+
+ # guess MTA ...
+ if (/^Message-ID:\s+\<[\w\d]+\-[\w\d]+\-[\w\d]+\@/i) {
+ $MTA = "exim";
+ next;
+ }
+ if (/qmail-send/) {
+ $MTA = "qmail";
+ next;
+ }
+
+ # get returned addresses
+ if ($first_header_part) {
+ if (/^(To|Cc):.*/i) {
+ if ($new_block && $gabbble == 0) {
+ &Debug("$new_block, $gobble> rset \%return_addr\n") if $debug;
+ undef %return_addr;
+ }
+
+ $new_block = 0;
+ $gabbble = 1;
+
+ &ExtractAddr($_);
+ next;
+ }
+ elsif (/^X\-MLServer:/i) { # this is the commnd mail from fml.
+ $NotSavedBuffer = 1;
+ }
+ # 822 folding
+ elsif (/^\s+/ && $gobble) {
+ &ExtractAddr($_);
+ next;
+ }
+ }
+
+
+ ###
+ ### RFC1891,1894 DSN
+ ###
+ if ($mp_block =~ /delivery\-status/i) {
+ if (/^Final-Recipient:.*\s+(\S+\@\S+)/i) {
+ $DSN_FinalRecipient = &BareAddr($1);
+ }
+ elsif (/^Original-Recipient:.*\s+(\S+\@\S+)/i) {
+ $DSN_OriginalRecipient = &BareAddr($1);
+ }
+ elsif (/^Status:\s*5/i) {
+ if ($DSN_OriginalRecipient) {
+ &CacheOn($DSN_OriginalRecipient, " ");
+ }
+ if ($DSN_FinalRecipient) {
+ &CacheOn($DSN_FinalRecipient, " ");
+ }
+
+ $found++;
+ }
+ }
+
+ # smtpfeed -1 -F hack
+ if (/^To: \(original recipient in envelope at \S+\) <(\S+)>/) {
+ &PickUpHint($1);
+ }
+
+ #####
+ ##### MTA szpecific
+ #####
+ # postfix
+ # <uja@beth.fml.org>: unknown user
+ if ($mp_block eq 'Content-Description: Notification') {
+ if (/^\s*(\S+\@\S+):\s*(unknown user|.*:\s+5\d\d\s+.*)/) {
+ $CurAddr = $1;
+ $CurAddr =~ s/[\<\>]//g;
+ $CurAddr =~ s/\s*//g;
+ &Debug("CurAddr => $CurAddr") if $debug && $CurAddr;
+ $MTA = 'postfix';
+ }
+ }
+
+ # exim || qmail
+ if ($MTA eq 'qmail' && /This is a permanent error/) {
+ $RABuf .= $_;
+ }
+
+ if ($MTA eq 'exim' || $MTA eq 'qmail') {
+ /^\s*(\S+\@\S+):\s*$/ && ($CurAddr = $1);
+ $CurAddr =~ s/[\<\>]//g;
+ $CurAddr =~ s/\s*//g;
+ &Debug("CurAddr => $CurAddr") if $debug && $CurAddr;
+ }
+
+ $gobble = 0;
+
+ # ignore Japanese strings.
+ next if /$RE_JIN/;
+ next if /$RE_JOUT/;
+ next if /$RE_SJIS_S/;
+ next if /$RE_EUC_S/;
+
+ ### unknown MTA ###
+ if (/(\S+\@[-A-Z0-9\.]+)/i) {
+ /(\S+\@[-A-Z0-9\.]+)/i && ($P_CurAddr = $1); # pseudo
+ $P_CurAddr =~ s/[\<\>]//g;
+ $P_CurAddr =~ s/\s*//g;
+ &Debug("P_CurAddr => $P_CurAddr") if $debug && $P_CurAddr;
+ }
+
+ # error message line
+ # next if /<<<.*\@/;
+ # next if /^Diagnostic-Code:/i;
+
+ # ignore the original mails
+ # &Debug("next") if $original_mail && $found;
+ next if $original_mail && $found;
+ $original_mail = 1 if /^received:/i;
+
+ ##### TRAP CODE #####
+ if (/fatal error/i) { $fatal++;}
+
+ if (/\@/ && /(5\d\d)/) { &AnalyzeErrorCode($_); $found++; }
+ if (/\@/ && /$TrapWord/i) { &AnalyzeErrorWord($_); $found++; }
+
+ ### unknown MTA
+ # e.g. uset not known
+ if (/$TrapWord/i && $P_CurAddr) {
+ &AnalyzeErrorWord($_, $P_CurAddr);
+ $found++;
+ }
+
+ ### postfix
+ if (/$TrapWord/i && $MTA eq 'postfix') {
+ &AnalyzeErrorWord($_, $CurAddr);
+ $found++;
+ }
+
+ ###
+ ### exim
+ ###
+ if (/$TrapWord/i && $MTA eq 'exim') {
+ &AnalyzeErrorWord($_, $CurAddr);
+ $found++;
+ }
+
+ # EXIM pattern
+ if (/failed/i && $MTA eq 'exim') {
+ $trap_want_addr = $_;
+ next;
+ }
+ if ($trap_want_addr && /\@/ && $MTA eq 'exim') {
+ local($a);
+ /^\s*(\S+\@\S+)/ && ($a = $1);
+ $a =~ s/[\<\>:]//g;
+ &CacheOn($a, " ") if $a; # space is a dummy
+ undef $trap_want_addr;
+ }
+
+ if (/($ErrorCodePat)/ && $MTA eq 'exim') {
+ &AnalyzeErrorWord($_, $CurAddr);
+ $found++;
+ }
+
+ ###
+ ### qmail
+ ###
+ if (/\#5\.\d+\.\d+/ && $MTA eq 'qmail') {
+ &AnalyzeErrorWord($_, $CurAddr);
+ $found++;
+ }
+
+ if ($MTA eq 'qmail' && $CurAddr && $RABuf) {
+ &AnalyzeErrorWord($RABuf, $CurAddr);
+ $found++;
+ }
+
+ ###
+ ### sendmail
+ ###
+ if ($fatal) {
+ local($a);
+ /^\s*(\S+\@\S+)/ && ($a = $1);
+ $a =~ s/[\<\>]//g;
+ &CacheOn($a, " ") if $a; # space is a dummy
+ }
+ # end of fatal block
+ if ($fatal && /^$/) {
+ undef $fatal;
+ }
+ }
+
+ # VERPs: qmail specific
+ # Suppose list-admin-account=domain@$mydomain syntax, ...
+ {
+ local($ra, $addr);
+
+ $addr = $ENV{'RECIPIENT'};
+ $ra = $ENV{'RECIPIENT'};
+
+ if ($addr =~ /=/) {
+ $addr =~ s/\@\S+$//;
+ $addr =~ s/=/\@/;
+ $addr =~ s/^\S+\-admin\-//; # fml specific
+
+ $ra =~ s/admin\-\S+\@/admin@/;
+
+ &Debug("qmail:". $addr);
+ &Debug("qmail return_addr:". $ra);
+ $return_addr{$ra} = 1;
+ &CacheOn($addr, " ");
+ }
+ }
+}
+
+
diff --git a/fml/lib/ErrorMessages/00_README.ja.txt b/fml/lib/ErrorMessages/00_README.ja.txt
new file mode 100644
index 00000000..622b3e3a
--- /dev/null
+++ b/fml/lib/ErrorMessages/00_README.ja.txt
@@ -0,0 +1,12 @@
+ エラーメッセージのコレクション
+
+入力は
+ Mailinglist::Messages オブジェクトの形で
+
+
+出力は
+ ハッシュで {
+
+ 駄目そうなメールアドレス => 理由
+
+ }