#!/usr/bin/perl # $Id: check-old-reservation,v 1.2 2000/02/27 16:23:46 fuku Exp $ ################################################################ # 設定項目 ################################################################ # 取り消し日数: 予約してからこの日数を超過したものは取り消し候補? $days_fatal = 360; # 警告日数: 予約してからこの日数を超過したものは警告 :) $days_warning = 180; # sendmail のパス $sendmail = '/usr/sbin/sendmail'; ################################################################ # 今日の年月日 my ($this_year, $this_month, $this_day) = &today; # 今日は UNIX epoch から何日? $today = &days_from_epoch($this_year, $this_month, $this_day); while(@ARGV){ my $arg = shift; if($arg eq '-v'){ $verbose = 1; next; } if($arg eq '-h'){ &usage; next; } if($arg eq '-m'){ $mail = 1; next; } $list_file = $arg; } &usage unless -r $list_file; open(LIST, "nkf -e < $list_file |") || die "Can't open $list_file\n"; while(){ chomp; if(/^#/){ next; } # tabs to space s/\t/ /g; if(/^([A-Z][A-Z][A-Z][A-Z]):\s+(.*)$/){ my ($name, $arg) = ($1, $2); $props{$name} = $arg; next; } if(/^\s*$/){ unless(keys(%props)){ # これはただの無害な空白行、気にしない next; } if(!length($props{'NAME'}) || !length($props{'TRNS'}) || !length($props{'PDAT'}) || !length($props{'STAT'})){ die "Insufficient entry at line $.\n"; } my($y, $m, $d) = ($props{'PDAT'} =~ m|(\d\d\d\d)/(\d+)/(\d+)|); my $days = sprintf('%05d', $today - &days_from_epoch($y, $m, $d)); warn "$props{'NAME'}: $days days\n"; push @status, join("\t", $days, $props{'NAME'}, $props{'TRNS'}, $props{'PDAT'}, $props{'STAT'}, $props{'NOTE'}); %props = (); } } close(LIST); # 日数でソートして.. for(reverse sort @status){ my ($days, $name, $trns, $pdat, $stat, $note) = split(/\t/); $days += 0; if($days > $days_fatal){ print "--- FATAL ---------------------------------------------\n"; print "| 文書名: $name\n"; print "| 予約日時: $pdat\n"; print "| 担当者: $trns\n"; print "| ステータス: $stat\n"; print "| 超過日数: $days 日\n\n"; my $msg = &fatal($trns, $name, $pdat, $days); print $msg if $verbose; &mail($msg, $trns) if $mail; }elsif($days > $days_warning){ print "--- WARNING -------------------------------------------\n"; print "| 文書名: $name\n"; print "| 予約日時: $pdat\n"; print "| 担当者: $trns\n"; print "| ステータス: $stat\n"; print "| 超過日数: $days 日\n\n"; my $msg = &warning($trns, $name, $pdat, $days); print $msg if $verbose; &mail($msg, $trns) if $mail; }else{ print "--- INFO ----------------------------------------------\n"; print "| 文書名: $name\n"; print "| 予約日時: $pdat\n"; print "| 担当者: $trns\n"; print "| ステータス: $stat\n"; print "| 超過日数: $days 日\n\n"; } } exit; ################################################################ sub today{ my ($a, $b, $c, $d, $m, $y) = localtime(time); ($y+1900, $m+1, $d); } ################################################################ sub days_from_epoch{ my($y, $m, $d) = @_; my($i); for($i=1970; $i<$y; $i++){ $d += 365; $d ++ unless $i % 4; } for($i=1; $i<$m; $i++){ $d += (0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31)[$i]; $d++ if $i==2 && !($y % 4); } $d; } ################################################################ sub usage{ die ; } ################################################################ sub mail{ my($msg, $mail) = @_; # `-f sender' オプションは、sendmail.cf によっては怒られるし、 # 実装されてない場合もある (qmail の sendmail ラッパとか) open(OUT, "| nkf -j | $sendmail $mail") || die; print OUT $msg; close(OUT); } ################################################################ sub warning{ my($mail, $name, $date, $days) = @_; return << "EOM"; To: $mail Subject: status of `$name' ? From: JF-gofer\@linux.or.jp Reply-To: JF\@linux.or.jp Content-Type: text/plain; charset=iso-2022-jp (このメールは自動送信されています) こんにちは. JF-gofer グループです. 予約されている文書の翻訳進行状況についてお尋ねします. $mail さんは, 文書名 `$name' の(翻訳)作業を $date に予約されており, 現在予約日以降 $days 日が経過しています. 作業の状況はいかがでしょうか? もしお一人での作業が大変でしたら, JF メンバに分担しての作業をお勧めします. なお, このメールがドメイン変更などで届かなかった場合, あるいは 1 ヶ月経ってもこのメールへの返答がなかった場合は, 作業が停止状態にあるとみなし, 他の方が予約できるよう あなたの $name に関する作業予約を抹消いたします. このメールに返答すると JF\@linux.or.jp に届くことになります. これは, 作業の進行状況を JF メンバ全員で認識するためのものです. それでは,下の空白部分を埋めた形での返答をおねがいいたします. 予約文書名: $name 予約者名: $mail 予約をどうするか? : 予約継続 / 予約取り消し / 再度予約 現状報告: [継続での例 - 第n章まで訳了.あと○○行なので,□□% 終わっています] [取り消しでの例 - 第n章まで訳了.その部分までを添付] [再予約での例 - 第n章まで訳了.再度予約します] JF はボランタリな活動ですので, 途中で作業できなくなる状況に陥ったり することは当然あり得ます. これは何ら恥じることではありません. しかし, そういった場合は, なるべく早めに「手を上げて」, 他のメンバへの 作業の委譲をお願いします. また, 予約を取り消される場合は, それまでの訳文を JF メーリングリストに 流すなどして, できる限り作業結果をフィードバックくださるようお願いいた します. JF Project の作業円滑のため, ぜひご協力をお願いいたします. -- JF-gofer グループ EOM } ################################################################ sub fatal{ my($mail, $name, $date, $days) = @_; return << "EOM"; To: $mail Subject: status of `$name' ? From: JF-gofer\@linux.or.jp Reply-To: JF\@linux.or.jp Content-Type: text/plain; charset=iso-2022-jp (このメールは自動送信されています) こんにちは. JF-gofer グループです. 予約されている文書の翻訳進行状況についてお尋ねします. $mail さんは, 文書名 `$name' の(翻訳)作業を $date に予約されており, 現在予約日以降 $days 日が経過しています. 作業の状況はいかがでしょうか? 予約の一旦取り消し, ないしは予約し直し をお勧めします. なお, このメールがドメイン変更などで届かなかった場合, あるいは 1 ヶ月経ってもこのメールへの返答がなかった場合は, 作業が停止状態にあるとみなし, 他の方が予約できるよう あなたの $name に関する作業予約を抹消いたします. このメールに返答すると JF\@linux.or.jp に届くことになります. これは, 作業の進行状況を JF メンバ全員で認識するためのものです. それでは,下の空白部分を埋めた形での返答をおねがいいたします. 予約文書名: $name 予約者名: $mail 予約をどうするか? : 予約継続 / 予約取り消し / 再度予約 現状報告: [継続での例 - 第n章まで訳了.あと○○行なので,□□% 終わっています] [取り消しでの例 - 第n章まで訳了.その部分までを添付] [再予約での例 - 第n章まで訳了.再度予約します] JF はボランタリな活動ですので, 途中で作業できなくなる状況に陥ったり することは当然あり得ます. これは何ら恥じることではありません. しかし, そういった場合は, なるべく早めに「手を上げて」, 他のメンバへの 作業の委譲をお願いします. また, 予約を取り消される場合は, それまでの訳文を JF メーリングリストに 流すなどして, できる限り作業結果をフィードバックくださるようお願いいた します. JF Project の作業円滑のため, ぜひご協力をお願いいたします. -- JF-gofer グループ EOM } __END__ Usage: check-old-reservation [options] reserved.list Options: -v verbose: also print generated mail message to stdout -m do mail the messages -h show this help