#!/usr/local/bin/perl # 「なつみかん」他形式データ出力スクリプト「nm_op.pl」 ver.2.3.1(20000306) # "NATSU-MICAN" Copyright (C) 1998-2000 hiya All Rights Reserved. ## メイン # 初期設定 use Time::Local; use File::Copy 'cp'; # シグナル設定 $SIG{'INT'} = $SIG{'BUS'} = $SIG{'HUP'} = $SIG{'QUIT'} = $SIG{'TERM'} = $SIG{'ALRM'} = 'autokill'; if($ARGV[1] ne "nounix"){ alarm(120); } # 初期設定 $NOW = time; $info_ref ={}; $remote_ref = {}; $remget_ref = {}; @urllist = (); %remlist = {}; # 入力ファイル # nm.phとmican.phとjcode.plとnm_lib.plとLIRS.pmの読み込み require './nm_lib.pl'; require './LIRS.pm'; $headfile = $ARGV[0]; require "$headfile"; require './jcode.pl'; ## 実行開始 $expiresCount = "23400"; $0 = $UserAgent; print "\012$UserAgent nm_op.pl start\012"; # ディレクトリ移動 chdir $basedir || die "Can't chdir $basedir\012"; # lockファイルの作成と更新開始時刻メモファイルの吐き出し if(-e "natsumican.lock"){ if(&nm_lib::lfile_time("natsumican.lock") + (60 * 60 * 6) < $NOW){ # .lockファイルが作成されてから6時間経過していたら、.lockファイルを削除する。 unlink("natsumican.lock") || print STDERR "natsumican.lock: $!\012"; print "natsumican.lock: lock file is older, delete lock file, and recovery.\012"; }else{ print "natsu-mican $version: lock-file exists.\012"; exit(0); } } open(TMP, ">natsumican.lock") || die "Can't create lock file\012"; close(TMP); print "\012lock set\012"; # 他データ形式の書き出し print "\012output other file format\012"; if($hinaout){ open(HOUT, ">$tmpdir$hinaout.$$"); } if($diout){ open(DOUT, ">$tmpdir$diout.$$"); $di = "HINA/2.1\012"; $di .= "User-Agent: $UserAgent\012"; $di .= &nm_lib::showdate("$NOW", "Date: %ee%, %DD% %nn% %YYYY% %HH%:%TT%:%SS% GMT"); $di .= "\012\012"; print DOUT $di; } # LIRSファイルの読み込み open(SRC, "$outputdir$out") || die "Can't open get last modified time information file\012"; while(){ unless(/^#/){ if(/^LIRS.*/){ my ($time, $lmd, $lag, $length, $url, $title, $author, $remote, $optional) = &LIRS::LIRS2list($_); my ($vurl, $key, $option, $etc, $refer) = split(",", $optional); if($hinaout){ # hina.txt互換形式の作成 $remold = "2"; $remold = "1" if($NOW < $lmd + $expiresCount - (60 * 30)); $remold = "0" if($refer eq "FILE" || $refer eq "HEAD" || $refer eq "GET"); if($time == 0){ $hr = ""; $hr .= "$title"; }else{ $hr = &nm_lib::showdate(($time + $localTimeZone), ""; $hr .= "$title"; } $hr .= "$author
\012"; &jcode::convert(\$hr, 'euc'); if($refer ne "LENGTH"){ print HOUT $hr; }else{ print HOUT "$title$author
\012"; } } if($diout){ # DI形式の作成 $di = "Url: $url\012"; $di .= "Title: $title\012" if($title ne "0"); $di .= "Author-Name: $author\012" if($author ne "0"); if($time eq "0"){ $expire_string = &nm_lib::showdate('0', "%ee%, %DD% %nn% %YYYY% %HH%:%TT%:%SS% GMT"); }else{ $di .= &nm_lib::showdate("$time", "Last-Modified: %ee%, %DD% %nn% %YYYY% %HH%:%TT%:%SS% GMT"); $di .= "\012"; $di .= &nm_lib::showdate("$lmd", "Last-Modified-Detected: %ee%, %DD% %nn% %YYYY% %HH%:%TT%:%SS% GMT"); $di .= "\012"; $expire_string = &nm_lib::showdate(($lmd + $expiresCount), "%ee%, %DD% %nn% %YYYY% %HH%:%TT%:%SS% GMT"); } $di .= "Expire: ".$expire_string."\012"; $di .= "Expires: ".$expire_string."\012"; $di .= "Content-Length: $length\012" if($length > 0); if($refer eq "HEAD" || $refer eq "GET" || $refer eq "FILE" || $refer eq "LENGTH"){ $di .= "Authorized: $UserAgent\012"; $di .= "Authorized-Url: $referer\012"; $di .= "Method: $refer\012"; }elsif($refer eq "CACHE"){ $di .= "Authorized-Url: $referer\012" if($referer ne "0"); $di .= "Method: CACHE\012"; }else{ $di .= "Authorized-Url: $remote\012" if($remote ne "0"); $di .= "Method: REMOTE\012"; } $di .= "\012"; &jcode::convert(\$di, 'euc'); print DOUT $di; } } } } if($hinaout){ close(HOUT); rename("$tmpdir$hinaout.$$", "$outputdir$hinaout"); print "output hina.txt file\012"; } if($diout){ close(DOUT); rename("$tmpdir$diout.$$", "$outputdir$diout"); print "output DI file\012"; } # lockファイルの削除 unlink("natsumican.lock") || print STDERR "natsumican.lock: $!\012"; print "\012unlock\012"; # 終わり exit(0); ## メイン終わり ## # 自爆サブルーチン sub autokill{ print STDERR "$!\012"; unlink("natsumican.lock") || print STDERR "natsumican.lock: $!\012"; exit(1); } 1;