#!/usr/local/bin/perl ########################################################################### # # nif2bbs.pl : NIFTY -> trees log converter # for Perl on Win32 / UNIX # # Copyright(C) 2000 WAKI Toshihito # # mailto:HQL05475@nifty.ne.jp # http://www2b.biglobe.ne.jp/~wakit/SOFTWARE/ # ########################################################################### #------------------ 初期設定 ------------------ # プラットフォーム(WIN32 or UNIX いずれかを選択) # $OS = "WIN32"; $OS = "UNIX"; # jcode.pl のパス require "jcode.pl"; # 読み込み元ログファイル $logfile = "nifty.log"; # trees ログ書き出し先ディレクトリ( / または \ で閉じない) $logdir = "data"; #-------------- 以下 trees 用設定 -------------- # ログ削除用パスワード $CryptPasswd = "password"; # ホスト名(ダミー) $host = "hoge.nifty.ne.jp"; # 表示方法(-1:通常、0:改行無効、1:図/表モード(等幅フォントで表示)) $how = 1; # メッセージ中の URL を自動リンクするかどうか(1:する、0:しない) $link = 1; # コメントがついたときメールでしらせるかどうか(1:する、0:しない) $psemail = 0; #------------------ 初期設定終了 ---------------- if ($OS eq "WIN32") { $dirseparator = "\\"; } elsif ($OS eq "UNIX") { $dirseparator = "\/"; } else { print "Unknown OS."; exit; } if (!-e $logfile) { print "Log file $logfile does not exist."; exit; } if (!-e $logdir) { mkdir ("$logdir", 0755); } open (IN, "$logfile"); open (OUT,">$logdir${dirseparator}dummy.log"); while($line = ) { $line =~ s/\n$//; if ($line =~ /^0+([0-9]+)\/0+([0-9]+)\s+([A-Z]{3,3}[0-9]{5,5})\s+([^\s]+)\s+(.+)$/) { &write; close (OUT); $mesnum = $1; $ID = $3; $name = $4; $title = $5; $name =~ s/\s//g; $name =~ s/ //g; $lines_message = ""; $pwd = "ERROR"; while ($pwd eq "ERROR"){ ($pwd) = &MakeCrypt($CryptPasswd); } } elsif ($line =~ /^\(\s+([0-9]+)\)\s+([0-9]{2,2}\/[0-9]{2,2}\/[0-9]{2,2})\s+([0-9]{2,2}:[0-9]{2,2})(.*)$/) { $commentcount = $1; $date = "$2 $3"; $commentnum = substr($4, 0, 21); if ($commentnum =~ /\s*0*([0-9]+)へのコメント.*/) { $commentnum = $1; } else { $commentnum = ""; } if ($commentnum eq ""){ $ext = "msg" } else { $ext = "res" } $filelist{$mesnum} = "$mesnum.$ext"; open (OUT,">$logdir$dirseparator$mesnum.$ext"); #現在のデータがツリーの開始点なら if ($ext eq "msg") { $lines_resp = "resp\t.\n"; $lines_tree = "tree\t$mesnum\n"; open (TREE, ">$logdir$dirseparator$mesnum.tre"); print TREE "
$mesnum.msg\n"; print TREE "
\n"; close (TREE); } #現在のデータがコメントなら else { $resfile = $filelist{$commentnum}; $lines_resp = "resp\t$resfile\n"; open (RESP,"$logdir$dirseparator$resfile"); open (RESP2,">$logdir${dirseparator}res.tmp"); while ($line = ){ if ($line =~ /^res\t\n/){ $line = "res\t1\n"; } print RESP2 $line; } close (RESP2); close (RESP); rename ("$logdir${dirseparator}res.tmp", "$logdir$dirseparator$resfile"); #ひとつ上が開始点なら if ($resfile =~ /msg/) { $top = $resfile; $top =~ s/^(.+)\.msg/$1/; } #ひとつ上もコメントなら else { open (TREE, "$logdir$dirseparator$resfile"); while ($input =){ if ($input =~ /^tree\t[0-9]+\n$/){ $input =~ s/^tree\t([0-9]+)\n$/$1/; $top = $input; } } close (TREE); } $lines_tree = "tree\t$top\n"; open (TREE, "$logdir$dirseparator$top.tre"); open (TREE2, ">$logdir${dirseparator}tree.tmp"); while ($line=){ $res = $resfile; $res =~ s/^([0-9]+)\.[a-zA-Z]+/$1/; if ($line =~ /^
<\!--$res-->\n$/){ print TREE2 "
\n"; print TREE2 "
$mesnum.$ext\n"; print TREE2 "
<\!--$mesnum-->\n"; print TREE2 "
\n"; print TREE2 $line; } else { print TREE2 $line; } } close (TREE2); close (TREE); rename ("$logdir${dirseparator}tree.tmp", "$logdir$dirseparator$top.tre"); } $lines_psemail = "psemail\t$psemail\n"; $lines_res = "res\t\n"; } else { $lines_message = "$lines_message$line\n"; } } &write; close (OUT); close (IN); unlink ("$logdir${dirseparator}dummy.log"); exit; sub write { &jcode'h2z_sjis(*uname); &jcode'h2z_sjis(*subject); &jcode'h2z_sjis(*lines_message); $lines_pwd = "pwd\t$pwd\n"; $lines_rc = "rc\t1\n"; $lines_date = "date\t$date\n"; $lines_uname = "uname\t$name\n"; $lines_email = "email\t$ID\@nifty.ne.jp\n"; $lines_host = "host\t$host\n"; $lines_subject = "subject\t$title\n"; $lines_size = "size\t" . length($lines_message) . "\n"; $lines_how = "how\t$how\n"; $lines_link = "link\t$link\n"; print OUT $lines_pwd; print OUT $lines_rc; print OUT $lines_date; print OUT $lines_uname; print OUT $lines_email; print OUT $lines_host; print OUT $lines_subject; print OUT $lines_size; print OUT $lines_how; print OUT $lines_link; print OUT $lines_resp; print OUT $lines_tree; print OUT $lines_psemail; print OUT $lines_res; print OUT $lines_message; print "Message file $logdir$dirseparator$mesnum.$ext created.\n"; } sub MakeCrypt { local($plain) = @_; local(@char,$f,$now,@saltset,$pert1,$pert2,$nsalt,$salt); @saltset = ('a'..'z','A'..'Z','0'..'9','.','/'); $now = time; srand(time|$$); $f = splice(@saltset,rand(@saltset),1) . splice(@saltset,rand(@saltset),1); ($pert1,$pert2) = unpack("C2",$f); $week = $now / (60*60*24*7) + $pert1 + $pert2 - length($plain); $nsalt = $saltset[$week % 64] . $saltset[$now % 64]; $result = crypt($plain,$nsalt); if ($result =~ /^\$1\$/) { $salt = 3; } else { $salt = 0; } if (crypt($plain,substr($result,$salt,2)) ne $result) { print "Password crypt error. Retrying...\n"; $result = "ERROR"; } return ($result,$salt); }