#!/usr/local/bin/perl #ずるぼんさんのあぷろだに繰上げ処理とカウント処理を追加するCGI Ver 0.52 #"subupload" by Y.K #私が作ったソフト(スクリプト)を利用した事によって、万一、利用者が損害を負っても私は一切、引責・補償を致しません。 #作者ホームページ #http://homepage2.nifty.com/nonota/(Y.K.Studio) #VerUp履歴 #2002/05/07 しばカウンタの機能をファイル保護処理にさしかえる。これによってカウンタ機能を無くすものの、よりファイル保護が強固なものに。 >> Ver 0.5 #2002/05/05 2ちゃんねる等にファイルへの直リンクを貼られた場合の、鬼のようなアクセスからログファイルを守るのは不可能であると #       判断。外部(upload.cgi以外)からのアクセスの場合にはカウント処理を行わないように変更。これにより相当な負荷の #       軽減が望め、ログファイルが消えてしまうバグを取り除く事が出来たと考える。(常識的なアクセス数ならばもう消えないはず)>> Ver 0.4 #2002/05/05 まだアクセス集中に耐えられないようなので、ファイルの排他処理を更に強化。 >>Ver0.31 #2002/05/04 環境変数の受け取り方を改良することで自分のPCにファイルを保存する場合にもそのままのファイル名で保存できるように。>> Ver 0.3 #2002/05/04 ファイルの排他処理を強化。これによりアクセス集中でログファイルが消されてしまうのを防げるはず。>>Ver 0.2 #2002/05/02 2ちゃんねるWebprograming板からアイデアを頂いてスクリプトを作成。>> Ver 0.1 #このスクリプトはイメージを置くディレクトリにイメージと一緒において下さい。 #改造をすることで非常に初期設定が面倒になっています。どうぞ作者ホームページのサポート文を参考になさって下さい。 #もしも、HTML用のログファイルが消失してしまった場合に備えてこまめにログファイルのバックアップをとるようお勧め致します。 #初期設定 #ログファイル名。必ず本体(upload.cgi)と同じログファイルを使う事。また拡張子は入れない事。 $source = '../sourcelog/sourcelog'; #カウントファイル名。同じく本体と同じファイルを使う事。 $countsource = '../sourcelog/count.txt'; #ファイル保護の強度設定。本体と同じ数字を使う事。 #0以下は不可。数字をあげる程、ファイル保護が強固になる。 $guard = 3; #繰上げ処理を行うか?(yes=1/no=0) $resinsert = 1; #本体(upload.cgi)のアドレスをフルパスで記入。 $path = 'http://isweb41.infoseek.co.jp/feminine/uzafwyd/cgi-bin/upload.cgi'; #〜・〜・〜・〜・〜・〜・〜・〜・〜・〜・〜・〜・〜・〜・〜・〜・〜・〜・〜・〜・〜・〜・〜・〜・〜・〜・〜・〜・〜・〜・〜・〜・〜・〜・〜・〜・〜・〜・〜・〜・〜・〜 #まずはファイルを表示します。 #MIMETYPEのリストをハッシュに登録 %MIME = ( # テキスト c => "text/c", css => "text/css", csv => "text/comma-separated-values", htm => "text/html", js => "text/(js|javascript)", rtf => "text/rtf|application/rtf", smi => "text/smil-basic|application/smil", txt => "text/plain", vbs => "text/vbscript", xml => "text/xml|application/xml", # イメージ bmp => "image/(bmp|x-bmp|x-MS-bmp)", gif => "image/gif", ico => "image/x-icon", jpg => "image/jpeg", png => "image/(png|x-png)", psd => "image/x-photoshop", tif => "image/(tiff|x-tiff)", xbm => "image/(x-xbm|x-xbitmap)", # ビデオ asf => "video/(x-ms-asf|x-ms-asf-plugin)|application/x-mplayer2", avi => "video/(avi|msvideo|x-msvideo)", mov => "video/quicktime", mpg => "video/(mpg|mpeg|x-mpeg)", # オーディオ aif => "audio/(aiff|x-aiff|x-pn-aiff)", au => "audio/(basic|x-pn-au)", m3u => "audio/(mpegurl|x-scpls|x-mpegurl)", mid => "audio/(mid|midi|x-mid|x-midi)|application/x-midi|music/crescendo|x-music/x-midi", mod => "audio/x-mod", mp3 => "audio/(mp3|mpg|mpeg|x-mp3|x-mpg)", ra => "audio/(x-realaudio|vnd\\.rn-realaudio)", ram => "audio/x-pn-realaudio", rm => "application/vnd\\.rn-realmedia", rpm => "audio/x-pn-realaudio-plugin", vqe => "audio/x-twinvq-plugin", vqf => "audio/x-twinvq|application/x-twinvq", wav => "audio/(wav|x-wav|x-pn-wav|x-pn-windows-acm|x-pn-windows-pcm)", wma => "audio/x-ms-wma", # 他 arj => "application/arj", bin => "application/(octet-stream|x-macbinary)", dcr => "application/x-director", exe => "application/(x-exe|x-msdownload)", gz => "gzip", hlp => "application/(winhlp|x-winhelp)", jar => "application/java-archive", js => "application/x-javascript", lzh => "lha|lzh|LhasaArchive|LHMelt", pac => "application/x-ns-proxy-autoconfig", pdf => "application/pdf", rar => "application/x-rar-compressed", sit => "application/x-stuffit", swf => "application/x-shockwave-flash", tar => "application/x-tar", uue => "application/x-uuencode", wmf => "application/x-msmetafile", wri => "application/application/x-mswrite", yz1 => "application/x-yz1", Z => "application/x-compress", zip => "zip", wrl => "model/vrml|x-world/x-vrml", ); #GETで送られてきたファイル名を取得 $giffile = $ENV{'PATH_INFO'}; $giffile = substr($giffile,1); $key = $giffile; $number = $giffile; #拡張子を調べて、それに見合ったMINETYPEを出力する。 $key =~ s/(.+\.)(.+)/$2/; print "Content-type: $MIME{$key}\n\n"; open(GIF, "$giffile") || die; @a = ; print @a; close(GIF); #ユーザーのアクセス元を調べてあぷろだ本体からのアクセス時のみ、カウント処理を行う。 $userpath = $ENV{'HTTP_REFERER'}; ($userpath, undef) = split(/\?/, $userpath); #パラメータから数字だけ取り出す。 $number =~ s/(\D*)(\d+)(\..+)/$2/; #以下はカウント・繰上げ処理。 #ファイル保護の為複数のファイルを使いまわす。 if($userpath eq $path){ if(!open(DB,"$countsource")){ exit; } seek(DB,0,0); $no = ; close(DB); $getno = $no % $guard; $getsource = "$source"."$getno"."\.txt"; if(!open(LOG,"$getsource")){ exit; } seek(LOG,0,0); @LOG = ; close(LOG); $number =~ s/(\D*)(\d+)(\..+)/$2/; $n = 0; foreach(@LOG){ ($id, $type, $comment, $host, $brauza, $date, $size, $ctype, $pass, $md5, $dcrc, $readcount) = split(/\t/); if($id == $number){ $readcount++; $_ = join("\t", $id, $type, $comment, $host, $brauza, $date, $size, $ctype, $pass, $md5, $dcrc, $readcount); $_ .= "\n"; if($resinsert){ splice(@LOG,$n,1); unshift(@LOG,$_); } last; } $n++; } $no++; $getno = $no % $guard; if($no >= $guard*10000){ $no=0; } $getsource = "$source"."$getno"."\.txt"; if(!open(LOG,">$getsource")){ exit; } eval { flock(LOG,2); }; seek(LOG,0,0); print LOG @LOG; chmod 0666 , $getsource; eval { flock(LOG,8); }; close(LOG); if(!open(DB,">$countsource")){ exit; } eval { flock(DB,2); }; seek(DB,0,0); print DB $no; eval { flock(DB,8); }; close(DB); }