| //g; # 旧バージョンのフォーマット変換
s/<\/small><\/td><\/tr><\/table>//g; # 旧バージョンのフォーマット変換
s/$base_url\d{4}\/\d{2}\/(\d{14})$ssi/$reload\/permalink\/$1/;
$KIJI .= "$_ \n";
}
close(f);
$line =~ s//__article__/;
}
}
# 最新のコメント
if ($line =~ //) {
$file = $base_dir . 'comment' . $ext;
$COMM = "";
if (open(f,$file)) {
while () {
s/\n//g;
s/| //g; # 旧バージョンのフォーマット変換
s/<\/small><\/td><\/tr><\/table>//g; # 旧バージョンのフォーマット変換
s/<\/a> \( /<\/a> on /g; # 旧バージョンのフォーマット変換
s/<\/a>\)/<\/a>/g; # 旧バージョンのフォーマット変換
s/$base_url\d{4}\/\d{2}\/(\d{14})$ssi/$reload\/permalink\/$1/g;
$COMM .= "$_ \n";
}
close(f);
$line =~ s//__comment__/;
}
}
# 最新のトラックバック
if ($line =~ //) {
$file = $base_dir . 'trackback' . $ext;
$TRACKB = "";
if (open(f,$file)) {
while () {
s/| //g; # 旧バージョンのフォーマット変換
s/<\/small><\/td><\/tr><\/table>//g; # 旧バージョンのフォーマット変換
s/$base_url\d{4}\/\d{2}\/(\d{14})$ssi/$reload\/permalink\/$1/g;
$TRACKB .= "$_ \n";
}
close(f);
$line =~ s//__trackback__/;
}
}
# カレンダー
if ($line =~ //) {
($dir_year,$dir_month) = &findDir($num);
if (opendir(d,"$base_dir$dir_year/$dir_month")) {
@d = readdir(d);
close(d);
}
else { @d = (); }
@blog2 = (); %blog = ();
foreach $file (reverse sort @d) {
next if $file eq '.';
next if $file eq '..';
if ($file =~ /^(\d{4}\d{2}\d{2})\d{6}$ext/) { $blog{$1}++; } # その日の記事件数の調査(カレンダー用)
}
if (($dir_year < $year - 10 || $dir_year > $year + 1) || ($dir_month < 1 || $dir_month > 12)) { $ret = &calendar($year,$month); }
else { $ret = &calendar($dir_year,$dir_month); }
$line =~ s//$ret/;
}
# 過去ログ
if ($line =~ //) {
&getAllFiles();
foreach $file (@all) {
if ($file =~ /^(\d\d\d\d\d\d)(\d\d)(\d\d\d\d\d\d)$ext/) { $list{$1} = 1; }
}
$ret = "";
foreach $key (reverse sort keys %list) {
if ($key =~ /^(\d\d\d\d)(\d\d)$/) {
$y = $1; $m = $m2 = $2;
$m2 =~ s/0(\d)/ $1/; #$m2 =~ s/0/ /;
$monthList = "$y年$m2月";
}
else { next; }
$ret .= "$monthList \n";
}
$ret .= "\n";
$line =~ s//$ret/;
}
if ($line =~ //) { $line =~ s///g; }
if ($line =~ /\0/) { $line =~ s/\0/--/g; }
$html .= $line;
}
if ($html =~ /<\/body>/i) { $html =~ s/<\/body>/$copyright\n<\/body>/i; }
if ($form{'cmd'} eq 'write2') { print "Location: $reload/permalink/$num\n\n"; exit; }
if ($permalink) { # 固定リンクをCGI出力時
Jcode::convert( \$html,'utf8' );
$html =~ s/__article__/$KIJI/;
$html =~ s/__comment__/$COMM/;
$html =~ s/__trackback__/$TRACKB/;
print "Content-type: text/html; charset=utf-8\n\n";
print $html;
exit;
}
return $all[$target +1],$all[$target -1]; # ひとつ前,ひとつ後
}
##
#### ■携帯処理(メニュー)
##
sub Keitai_menu {
$max = 20; # 携帯メニューで一覧する記事数の上限
$Keitai = 1;
$kiji = "$blog_title \n";
&getAllFiles();
@blogs = reverse sort @all;
$all_blogs = @blogs - $max;
foreach $i (0 .. $#blogs) {
$c++;
if ($c > $max) { last; }
if ($c > 1) { $kiji .= " \n"; }
&getBlog($blogs[$i]);
if ($key{'title'} eq "") { $Title = "(題名なし)"; }
elsif (length($key{'title'}) > 30) { $key{'title'} = &z_substr($key{'title'},0,30) . '..'; }
$key{'title'} =~ s/\n//g;
$key{'title'} =~ s{
<
[^<>]*
>
}{}xsg;
@j = split("\0",$key{'cm'});
$j = @j;
if ($c <= 9) { $accesskey = " accesskey=$c directkey=$c"; $accesskey2 = "$c)"; }
else { $accesskey = $accesskey2 = ""; }
if ($key{'comment'} != 1 || $j == 0) { $ck = ""; } else { $ck = "($j)"; }
$kiji .= "$accesskey2$key{'title'}$ck";
}
$kiji .= " 他$all_blogs件/()内はコメント数\n";
if (open(f,$base_k)) { @template = ; close(f); } # テンプレート読み込み
foreach $line (@template) {
if ($line =~ //i) { $line =~ s//\n/i; }
if ($line =~ //i) { $line =~ s//$blog_title/i; }
if ($line =~ //) { $line =~ s//$kiji/; }
if ($line =~ /class=".*" /) { $line =~ s/class=".*" //g; }
if ($line =~ //) { $line =~ s///g; }
$html .= $line;
}
print "Content-type: text/html; charset=Shift_JIS\n\n";
print $html;
exit;
}
##
#### ■携帯処理(固定リンク)
##
sub Keitai {
local($num) = @_;
if ($num !~ /^(\d{6})(\d{8})$/) { &error("Not Found"); }
$Keitai = 1;
&getAllFiles();
@blogs = reverse sort @all;
foreach $i (0..$#blogs) {
if ($blogs[$i] == $num) { $target = $i; last; } # 対象となるブログの順位を調査
}
if ($blogs[$target +1] && $#blogs != $target) { # 直前のブログHTMLの情報を取る
if ( &getBlog($blogs[$target +1]) ) {
if (length($key{'title'}) > 30) { $key{'title'} = &z_substr($key{'title'},0,30) . ' ..'; }
($dir_year,$dir_month) = &findDir($blogs[$target +1]);
$mae = "*)前";
}
}
if ($blogs[$target -1] && $target > 0) { # 直後のブログHTMLの情報を取る
if ( &getBlog($blogs[$target -1]) ) {
if (length($key{'title'}) > 30) { $key{'title'} = &z_substr($key{'title'},0,30) . ' ..'; }
($dir_year,$dir_month) = &findDir($blogs[$target -1]);
$ato = "#)次";
}
}
&getBlog($num);
$Title = $key{'title'};
$Title =~ s/\n//g;
$Title =~ s{
<
[^<>]*
>
}{}xsg;
$key{'body'} =~ s{
<
[^<>]*
>
}{}xsg;
if ($Title eq "") { $Title = "(題名なし)"; }
elsif (length($Title) > 20) { $Title = &z_substr($Title,0,20) . '..'; }
if (open(f,$base_k)) { @template = ; close(f); } # テンプレート読み込み
foreach $line (@template) {
if ($line =~ //i) { $line =~ s//\n/i; }
if ($line =~ //i) { $line =~ s//$blog_title: $Title/i; }
if ($line =~ //) {
$DATE = &getTime($key{'date'});
$blog .= "$key{'title'} \n";
$key{'body'} =~ s/ / /g; $size = length($key{'body'}) - 300 . "バイト";
if (length($key{'body'}) > 300) { $key{'body'} = &z_substr($key{'body'},0,300) . "..続き(あと$size〜)"; }
$blog .= "$key{'body'} \n";
if ($key{'comment'} == 1) {
$i = 1;
foreach $j (reverse split("\0",$key{'cm'})) {
if ($i == 1) { $blog .= "コメント(最新順) \n"; }
if ($i > 10) { @j = split("\0",$key{'cm'}); $j = @j; $j -= 10; $blog .= "他$j件 \n"; last; }
($key,$uname,$email,$url,$body,$ip) = split(/\t/,$j,6);
$uname =~ s/\n//g;
if ($uname eq "") { $uname = "(名前ナシ)"; }
$body =~ s/ / /g; $size = length($body) - 50 . "バイト";
if (length($body) > 50) { $body = "■$uname》" . &z_substr($body,0,50) . "..続き(あと$size〜)"; }
else { $body = "■$uname》$body"; }
$blog .= "$body \n";
$i++;
}
if ($key{'cm'}) { $blog .= " \n"; }
else { $blog .= "コメントはありません \n"; }
}
if ($key{'writer'} ne "") { $writer = "by $key{'writer'} ¦ "; } else { $writer = ""; }
$blog .= "$writer$DATE \n";
$blog .= "$mae $ato MENU\n";
$line =~ s//$blog/;
}
if ($line =~ //) { $line =~ s///g; }
$html .= $line;
}
print "Content-type: text/html; charset=Shift_JIS\n\n";
print $html;
exit;
}
##
#### ■携帯処理(補助処理)
##
sub Keitai2 {
if ($form{'num'} !~ /^(\d{6})(\d{8})$/) { &error("Not Found"); }
$Keitai = 1;
&getBlog($form{'num'});
$Title = $key{'title'};
$Title =~ s/\n//g;
$Title =~ s{
<
[^<>]*
>
}{}xsg;
$key{'body'} =~ s{
<
[^<>]*
>
}{}xsg;
if ($Title eq "") { $Title = "(題名なし)"; }
elsif (length($Title) > 20) { $Title = &z_substr($Title,0,20) . '..'; }
if (open(f,$base_k)) { @template = ; close(f); } # テンプレート読み込み
foreach $line (@template) {
if ($line =~ //i) { $line =~ s//\n/i; }
if ($line =~ //i) {
if ($form{'target'} ne "") { $line =~ s//$blog_title: $Titleに対するコメント/i; }
else { $line =~ s//$blog_title: $Title/i; }
}
if ($line =~ //) {
if ($form{'target'} eq "") {
$key{'body'} =~ s/ / /g;
$key{'body'} = &z_substr($key{'body'},300);
$blog .= "..$key{'body'} \n";
}
else {
foreach $j (split("\0",$key{'cm'})) {
($key,$uname,$email,$url,$body,$ip) = split(/\t/,$j,6);
if ($key eq $form{'target'}) {
$body =~ s/ / /g;
$body = &z_substr($body,50);
$blog .= "..$body\n";
last;
}
}
}
$blog .= " \n*)戻る\n";
$line =~ s//$blog/;
}
if ($line =~ //) { $line =~ s///g; }
$html .= $line;
}
print "Content-type: text/html; charset=Shift_JIS\n\n";
print $html;
exit;
}
##
#### ■保存フォルダ判定
##
sub findDir {
local($blogFileName) = @_;
if ($blogFileName =~ /^(\d{4})(\d{2})\d{8}$/) { $dir_year = $1; $dir_month = $2; }
elsif ($blogFileName =~ /^(\d{4})(\d{2})/) { $dir_year = $1; $dir_month = $2; }
else { return; }
if (!-e "$base_dir$dir_year/" && $mkdir_check) { # $mkdir_check:なければ作成(新規投稿時のみ)
if (!mkdir("$base_dir$dir_year",0777)) { &error($!); }
}
if (!-e "$base_dir$dir_year/$dir_month/" && $mkdir_check) {
if (!mkdir("$base_dir$dir_year/$dir_month",0777)) { &error($!); }
}
return($dir_year,$dir_month);
}
##
#### ■投稿処理(コメントデータ記録)
##
sub Write2 {
if ($form{'num'} eq "") { &error("不明なエラー"); }
&getBlog($form{'num'});
if ($key{'comment'} ne "1") { &error('この記事はコメントを受け付けません.'); }
local($html);
if ($form{'body'} eq "" || $form{'uname'} eq "") { &error("名前またはタイトルが書かれていません."); }
if ($HumanCheck) {
if ($form{'HC'} eq "") { &error("システムエラーが発生しました."); }
if ($form{'HC2'} eq "") { &error("計算式 $form{'HC'} の答えを入力してください."); }
($add1,$add2) = split(/\+/,$form{'HC'},2);
$kotae = $add1 + $add2;
if ($form{'HC2'} ne $kotae) { &error("計算が間違っています. 計算式 $form{'HC'} の答えは $kotae です."); }
}
if ($spam_comment) {
@comment_result = getcode( \$form{'body'} );
if ($comment_result[0] eq 'ascii') { &error("このコメントは受け付けられませんでした. お問い合わせください."); }
}
$form{'body'} =~ s/\n/ /g;
if ($form{'passwd'} ne "") { $crypted_pwd = &Crypt($form{'passwd'}); }
($dir_year,$dir_month) = &findDir($form{'num'});
if (!open(f,">> $base_dir$dir_year/$dir_month/$form{'num'}$ext")) { &error($!); }
print f "cm:$time\t$form{'uname'}\t$form{'email'}\t$form{'url'}\t$form{'body'}\t$ENV{'REMOTE_ADDR'}\t$crypted_pwd\n";
close(f);
$Name = $form{'uname'};
if ($Name eq "") { $Name = "(名前なし)"; }
elsif (length($Name) > 20) { $Name = &z_substr($Name,0,20) . ' ..'; }
$Title = $key{'title'};
if ($Title eq "") { $Title = "(題名なし)"; }
elsif (length($Title) > 30) { $Title = &z_substr($Title,0,30) . ' ..'; }
&rotation('comment'," ( )",''); # 最新のコメントを更新
$form{'uname'} =~ s/<//g;
$form{'uname'} =~ s/&/&/g;
$form{'uname'} =~ s/\;/;/g;
$form{'email'} =~ s/&/&/g;
$form{'email'} =~ s/\;//g;
$form{'url'} =~ s/&/&/g;
$form{'url'} =~ s/\;//g;
if ($sendmail_set) { &sendmail($admin_email,"[$blog_title] コメントがありました","名前:$form{'uname'}\n\n$form{'body'}\n\n[固定リンク]\n$reload/permalink/$form{'num'}#$time"); }
if ($form{'cookie'}) { &setCookie('uname',$form{'uname'},1); &setCookie('email',$form{'email'},1); &setCookie('url',$form{'url'},1); }
else { &setCookie('uname',"",'x'); &setCookie('email',"",'x'); &setCookie('url',"",'x'); }
&ModFile($form{'num'});
}
##
#### ■
##
sub getBlog {
local($filename) = @_;
if ($filename !~ /^\d{14}$/) { return 0; }
undef %key;
($dir_year,$dir_month) = &findDir($filename);
if (!open(f,"$base_dir$dir_year/$dir_month/$filename$ext")) { return 0; }
while () {
s/\n//g;
($key,$val) = split(/:/,$_,2);
$key{$key} .= "\0" if (defined($key{$key}));
$key{$key} .= $val;
}
close(f);
}
##
#### ■トラックバック受信
##
sub receive_trackback {
local($num) = @_;
&getBlog($num);
if ($key{'trackback'} ne "1") { &to_xml('1',''); exit; } # 受け付けない
($dir_year,$dir_month) = &findDir($num);
if (!-e "$base_dir$dir_year/$dir_month/$num$ext") { &to_xml('1','File Not Found'); exit; }
$URL = $form{'url'};
if ($URL eq "") { &to_xml('1',''); exit; }
$blog_name = $form{'blog_name'};
$blog_name =~ s/\n//g;
if ($spam_blogname && $blog_name eq "") { &to_xml('1',''); exit; }
elsif ($blog_name eq "") { $blog_name = "(ブログ名なし)"; }
$Title = $form{'title'};
$Title =~ s/\n//g;
$Title =~ s/&/&/g;
if ($spam_title && $Title eq "") { &to_xml('1',''); exit; }
elsif ($Title eq "") { $Title = "(題名なし)"; }
$excerpt = $form{'excerpt'};
$excerpt =~ s/\n//g;
$excerpt =~ s/&/&/g;
$excerpt =~ s{
<
[^<>]*
>
}{}xsg;
if ($spam_excerpt) {
@result = getcode( \$excerpt );
if ($result[0] eq 'ascii') { &to_xml('1',''); exit; }
}
if (length($excerpt) > 252) { $excerpt = &z_substr($excerpt,0,249) . ' ..'; }
($dir_year,$dir_month) = &findDir($num);
if (!open(DB,">> $base_dir$dir_year/$dir_month/$num$ext")) { &to_xml('1',''); exit; }
print DB "tb:$time\t$blog_name\t$Title\t$URL\t$excerpt\n";
close(DB);
if (length($blog_name) > 60) { $blog_name = &z_substr($blog_name,0,60) . ' ..'; }
if (length($Title) > 30) { $Title = &z_substr($Title,0,30) . ' ..'; }
&rotation('trackback',"$Title ($blog_name) «",'');
if ($sendmail_set) { &sendmail("","[$blog_title] トラックバックがありました","題名:$Title($blog_name)\n$URL\n\n$excerpt \n\nトラックバック元:$reload/permalink/$num"); }
&ModFile($num); # 固定ページを作成
$make_index = 1;
$view_blog_month = $num;
$no_disp = 1; &makeBlog();
&to_xml('0','');
exit;
}
##
#### ■トラックバックピング
##
sub ping {
local($blogFileName) = @_;
@ping = split(/\n/,$form{'ping'});
foreach $tburl (@ping) {
$Title = $form{'title'};
if (length($Title) > 60) { $Title = &z_substr($Title,0,60) . ' ..'; }
$Title =~ s/>/>/g;
$Title =~ s/</]*
>
}{}xsg;
$Excerpt = $form{'body'};
$Excerpt =~ s/\n//g;
$Excerpt =~ s{
<
[^<>]*
>
}{}xsg;
if (length($Excerpt) > 252) { $Excerpt = &z_substr($Excerpt,0,249) . ' ..'; }
($dir_year,$dir_month) = &findDir($blogFileName);
$Url = "$reload/permalink/$blogFileName";
Jcode::convert( \$blog_title, 'utf8' );
Jcode::convert( \$Excerpt, 'utf8' );
Jcode::convert( \$Title, 'utf8' );
my $trackback = new Net::Trackback::Ping;
$trackback->ping_url( $tburl );
$trackback->title( $Title );
$trackback->url( $Url );
$trackback->excerpt( $Excerpt );
$trackback->blog_name( $blog_title );
my $client = new Net::Trackback::Client;
my $return = $client->send_ping( $trackback );
my $msg = new Net::Trackback::Message;
$msg->message( $return );
$xml = $msg->to_xml( $return );
if (open(f,">> $base_dir$dir_year/$dir_month/$blogFileName$ext")) {
print f "tburl:$time\t$tburl\n";
close(f);
}
}
}
##
#### ■
##
sub to_xml
{
local($code,$msg) = @_;
print <<"EOF";
Content-Type: text/xml\n
$code
$msg
EOF
}
##
#### ■トラックバック Ping の一覧を受信する
##
sub mode_rss
{
local($num) = @_;
if (! &getBlog($num) ) { &to_xml('1','File Not Found'); exit; }
$Title = $key{'title'};
$Title =~ s/\n//g;
$Title =~ s{
<
[^<>]*
>
}{}xsg;
if ($Title eq "") { $Title = "(題名なし)"; }
elsif (length($Title) > 60) { $Title = &z_substr($Title,0,60) . ' ..'; }
Jcode::convert( \$Title,'utf8' );
$excerpt = $key{'body'};
$excerpt =~ s/\n//g;
$excerpt =~ s/&/&/g;
$excerpt =~ s{
<
[^<>]*
>
}{}xsg;
if (length($excerpt) > 252) { $excerpt = &z_substr($excerpt,0,249) . ' ..'; }
Jcode::convert( \$excerpt,'utf8' );
print <<"EOF";
Content-Type: text/xml\n
0
$Title
$reload/permalink/$num
$excerpt
ja-jp
EOF
}
##
#### ■
##
sub getwday { # 曜日判定
local ($year,$month,$day) = @_;
local ($base,$i);
# 2月の日数(うるう年の判定)
$days[2] = 28;
unless ($year % 4) { $days[2] = 29; }
unless ($year % 100) { $days[2] = 28; }
unless ($year % 400) { $days[2] = 29; }
# Zeller(ツェラー)の公式
$base = (($year - 1) * 365) + int(($year - 1) / 4) - int(($year - 1) / 100) + int(($year - 1) / 400);
# そこへ該当年の日数を加算
$i = $month;
while ( --$i ) { $base += $days[$i]; }
#1週間7日で除算した余りが曜日 ... 0なら日曜、1なら月曜 ... 6なら土曜。
return ($base + $day) % 7;
}
##
#### ■
##
sub urlencoded
{
local($line) = @_;
$line =~ s/([^0-9A-Za-z_])/"%" . unpack("H2",$1)/ge;
$line =~ tr/ /+/;
$line;
}
##
#### ■
##
sub setCookie {
local($name,$cookie,$exp) = @_;
if ($exp == 1) {
($secg,$ming,$hourg,$mdayg,$mong,$yearg,$wdayg,$ydayg,$isdstg) = gmtime(time + 30*24*60*60);
$y0="Sunday"; $y1="Monday"; $y2="Tuesday"; $y3="Wednesday"; $y4="Thursday"; $y5="Friday"; $y6="Saturday";
$m0="Jan"; $m1="Feb"; $m2="Mar"; $m3="Apr"; $m4="May"; $m5="Jun"; $m6="Jul"; $m7="Aug"; $m8="Sep"; $m9="Oct"; $m10="Nov"; $m11="Dec";
@youbi = ($y0,$y1,$y2,$y3,$y4,$y5,$y6);
@monthg = ($m0,$m1,$m2,$m3,$m4,$m5,$m6,$m7,$m8,$m9,$m10,$m11);
$date_gmt = sprintf("%s\, %02d\-%s\-%04d %02d:%02d:%02d GMT",$youbi[$wdayg],$mdayg,$monthg[$mong],$yearg +1900,$hourg,$ming,$secg);
$expires = "; expires=$date_gmt";
}
elsif ($exp eq 'x') {
$expires = "; expires=Sun, 01-Jan-1995 01:00:00 GMT"; # クッキーを完全消去するには正確な過去を設定する(ブラウザを正常に閉じたあとに実行される)
}
else { $expires = ''; }
$cookie =~ s/</</g;
$cookie =~ s/>/>/g;
print "Set-Cookie: $name=$cookie$expires\n";
}
##
#### ■暗号化
##
sub Crypt
{
my $mypass = $_[0];
srand();
my @saltset = ('a'..'z','A'..'Z','0'..'9','.','/');
my $nsalt = $saltset[int(rand(64))] . $saltset[int(rand(64))];
return crypt($mypass,$nsalt);
}
##
#### ■
##
sub getTime
{
local($time) = @_;
local($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst); # (秒,分,時,日,月(0〜11),年(年号-1900),曜日(0〜6),1月1日から何日目,サマータイムの有無)
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($time);
if ($Keitai) { return sprintf("%02d:%02d %s\.%02d",$hour,$min,$mon_array[$mon],$mday); }
else { return sprintf("%02d:%02d, %s, %s %02d, %04d",$hour,$min,$wday_array2[$wday],$mon_array[$mon],$mday,$year +1900); }
# 例 15:05, Saturday, May 14, 2005
}
sub getTime_forRDF
{
local($time) = @_;
local($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst);
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($time);
return sprintf("%04d-%02d-%02dT%02d:%02d:%02d%s",$year +1900,$mon +1,$mday,$hour,$min,$sec,$timezone); # フォーマット済み(変更しないこと)
}
##
#### ■
##
sub upForm
{
$html = <<"EOF";
画像アップロード
画像アップロード
EOF
Jcode::convert( \$html,'utf8' );
print "Content-type: text/html; charset=utf-8\n\n";
print $html;
exit;
}
##
#### ■
##
sub upImg
{
foreach $in (@in) {
($name) = $in =~ /\bname="([^"]+)"/i;
($name) = $in =~ /\bname=([^\s:;]+)/i unless defined $name;
if ($name !~ /upfile/) { next; }
($ctype) = $in =~ /\s*Content-type:\s*"([^"]+)"/i;
($ctype) = $in =~ /\s*Content-Type:\s*([^\s:;]+)/i unless defined $ctype;
if ($ctype eq '') { &error("エラー","ファイルタイプを識別できません."); }
elsif ($ctype =~ m#^image/(.*)#i) {
$type = $1;
if ($type =~ /^gif$/i) { $fext = '.gif'; }
elsif ($type =~ /^(.*)jp(.*)g$/i) { $fext = '.jpg'; }
elsif ($type =~ /^(.*)png$/i) { $fext = '.png'; }
else { &error("エラー","扱えないファイルを検出しました. -> $ctype"); }
}
else { &error("エラー","送信されていないか、扱えないファイルを検出しました."); }
if ($in{'upname'} ne "") { $filename = $in{'upname'}; }
else {
($filename) = $in =~ /\bfilename="([^"]*)"/i;
@filename = split(/[\\\/]/,$filename);
($filename,$e) = split(/\./,$filename[$#filename]);
}
if ($filename =~ /\W/) { &error("エラー",'ファイル名(拡張子を除く)は半角英数字である必要があります.','閉じてもう一度やり直してください.'); }
if (!$in{'w'} && -e "$img_dir$filename$fext") { &error("ファイル名が重複しています."); }
if (!open(IMAGE,"> $img_dir$filename$fext")) { &error($!); }
binmode(IMAGE);
print IMAGE $in{$name};
close(IMAGE);
chmod(0666,"$img_dir$filename$fext");
}
$html = <<"EOF";
画像アップロード
EOF
Jcode::convert( \$html,'utf8' );
print "Content-type: text/html; charset=utf-8\n\n";
print $html;
exit;
}
##
#### ■ファイルローテーション
##
sub rotation {
local($fname,$value,$del) = @_;
if ($value ne "") {
$value .= "\n";
Jcode::convert( \$value, 'utf8' );
}
$i = 0; @new = ();
if (!-e "$base_dir$fname$ext" && $value ne "") {
if (open(F, "> $base_dir$fname$ext")) {
print F $value;
close(F);
chmod(0666,"$base_dir$fname$ext");
}
}
elsif (open(F, "+< $base_dir$fname$ext")) {
flock F, 2;
while () {
if (/.*/) { s/.*/$newTitle /; }
if ($value ne "" && //) { $_ = $value; } # 修正時(記事)
elsif (//) { next; } # 削除時(記事/コメント/トラックバック)
push(@new,$_);
$i++;
if ($i >= $maxLog - 1) { last; }
}
eval 'truncate F,0;';
seek(F,0,0);
if ($value ne "" && $del eq "") { print F $value; }
print F @new;
close(F);
}
}
##
#### ■メール処理
##
sub sendmail {
local($from,$subject,$body) = @_;
require "./base64.pl";
$timezone =~ s/://g;
@mon_array3 = ('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec');
@wday_array3 = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat');
$date_now = sprintf("%s, %02d %s %04d %02d:%02d:%02d $timezone",$wday_array3[$wday],$mday,$mon_array3[$mon],$year,$hour,$min,$sec);
$MailValue = "Date: $date_now\n";
$MailValue .= "X-Sender: $ENV{'REMOTE_ADDR'}\n";
$MailValue .= "X-Mailer: bloq [www.rescue.ne.jp]\n";
$subject = &base64'b64encode($subject);
eval 'chomp($subject);'; chop($subject) if $@ ne '';
$MailValue .= "Subject: =?ISO-2022-JP?B?$subject?=\n";
if ($from =~ /\b[-\w.]+@[-\w.]+\.[-\w]+\b/) { $MailValue .= "Reply-To: $from\n"; }
$MailValue .= "From: nobody\n";
$MailValue .= "To: $admin_email\n";
$MailValue .= "\n"; # セパレータ
$body =~ s/>/>/g;
$body =~ s/<//\n/g;
$MailValue .= "$body\n\n";
$MailValue .= "[$blog_title]\n";
$MailValue .= "$reload\n\n";
Jcode::convert( \$MailValue, 'jis' );
if (open(OUT,"| $sendmail -t")) {
print OUT $MailValue;
close(OUT);
}
}
##
#### ■全角混在用substr() # 出典 Perl Tips by あけび for Shift_JIS
##
sub z_substr {
local($s,$p,$l) = @_;
$s =~ s/(.)/$1\0/g;
$s =~ s/([\x81-\x9f\xe0-\xfc])\0(.)\0/$1$2\0\0/g;
$s = $l eq '' ? substr($s,$p*2):substr($s,$p*2,$l*2);
$s =~ tr/\0//d;
$s;
}
##
#### ■アクセス解析
##
sub analyze
{
$gif = $img_dir . $gif;
$gif2 = $img_dir . $gif2;
if ($form{'date'} ne "") { ; }
else {
#------------------------------------------------------
# データ取得
opendir(DIR,$log_dir);
@ls = readdir(DIR);
close(DIR);
foreach $file (@ls) {
next if $file eq '.';
next if $file eq '..';
next if $file eq $log_file;
next if $file eq 'ip.cgi';
next if -d $file;
if (-M "$log_dir$file" > $max_record) { unlink "$log_dir$file"; }
else {
($file,$ext) = split(/\./,$file,2);
$count = "x";
$log = "$log_dir$file.dat";
if (!open(LOG,$log)) { ; }
else {
$count = ; $count =~ s/\n//g;
close(LOG);
push(@BASE,$file);
}
$file{$file} = $count; $q++;
}
}
#------------------------------------------------------
print <<"EOF";
Content-type: text/html; charset=Shift_JIS\n
アクセス解析
アクセス解析
EOF
if ($q == 0) { print "| None | \n"; }
else {
$border = $f = 0;
foreach $file (sort { $file{$b} <=> $file{$a} } keys %file) {
$bar = $file{$file};
if ($f == 0) { $f = 1; $magnification = $bar / 100; $bar = 100; }
else { $bar = $bar / $magnification; }
$bar = int($bar);
if ($bar == 0) { $bar = 1; }
$width{$file} = $bar;
}
foreach $file (reverse sort keys %file) {
$border++;
if ($border % 2 != 0) { $bgcolor = "bgcolor=#ffeedd"; } else { $bgcolor = ""; }
if ($file =~ /(\d\d\d\d)(\d\d)(\d\d)/) {
$y = $1; $m = $2 + 0; $d = $3 + 0;
($youbi) = $wday_array[&getwday($y,$m,$d)];
}
print "\n";
print "| $y年$m月$d日($youbi) | \n";
print " $file{$file} | \n";
print " \n";
}
}
print <<"EOF";
※ アクセスがない日のグラフは表\示されません。( $max_record日分保存 )
※ グラフは相対表\示です。
EOF
exit;
}
#------------------------------------------------------
if ($form{'date'} =~ /(\d\d\d\d)(\d\d)(\d\d)/) {
$y = $1; $m = $2 + 0; $d = $3 + 0;
($youbi) = $wday_array[&getwday($y,$m,$d)];
$date = "$y年$m月$d日($youbi)";
}
$log = "$log_dir$form{'date'}.dat";
if (!open(LOG,$log)) { &error('データが開けません','データファイルが削除されたか、何らかの理由で読み込ません。'); }
$count = ; $count =~ s/\n//g;
@lines = ;
close(LOG);
foreach $data (@lines) {
$data =~ s/\n//g;
($HOUR,$ref,$host,$host2,$agent,$keitai,$OS) = split(/\t/,$data,7);
$all++;
if ($HOUR ne '') { $hour{$HOUR}++; $j++; }
if ($ref ne '') { $ref{$ref}++; $k++; }
if ($host ne '') { $host{$host}++; $l++; }
if ($host2 ne '') { $host2{$host2}++; $o++; }
if ($agent ne '') { $agent{$agent}++; $m++; }
if ($keitai ne '') { $keitai{$keitai}++; $p++; }
if ($OS ne '') { $os{$OS}++; $n++; }
}
#------------------------------------------------------
print <<"EOF";
Content-type: text/html; charset=Shift_JIS\n
アクセス解析
アクセス解析
時間帯別 | 参照元 | リモートホスト | プロクシ経由調査 | ブラウザ | 携帯アクセス調査 | OS
対象日 $date
総サンプル数 [$all]アクセス
EOF
foreach $hour (sort { $hour{$b} <=> $hour{$a} } keys %hour) { $hourmax = $hour{$hour}; last; }
$magnification = $hourmax / 100;
$f = 0;
foreach $hour (0 .. 23) {
$hour = sprintf("%02d",$hour);
if ($j != 0) { $bar = $hour{$hour}; }
print "\n";
$bar = $bar / $magnification;
$bar = int($bar);
if ($bar == 0) { print " | \n"; }
else {
$blank = 100 - $bar;
if ($blank != 0 ) { print " "; }
print "$hour{$hour} ";
print " \n";
next;
}
}
print <<"EOF";
EOF
foreach $hour (0 .. 23) {
if ($hour < 12) { $bgcolor = "bgcolor=#eeddff"; } else { $bgcolor = "bgcolor=#ffeedd"; }
print "| $hour | \n";
}
print <<"EOF";
EOF
if ($k == 0) { print "| None | \n"; }
else {
$before = '';
$num = $border = $f = 0;
foreach $ref (sort { $ref{$b} <=> $ref{$a} } keys %ref) {
$num++;
if ($num > $max) { print ". . . | \n"; last; }
$bar = $ref{$ref};
if ($f == 0) { $f = 1; $magnification = $bar / 100; $bar = 100; }
else { $bar = $bar / $magnification; }
$bar = int($bar);
if ($bar == 0) { $bar = 1; }
$border++;
if ($border % 2 != 0) { $bgcolor = "bgcolor=#ffeedd"; } else { $bgcolor = ""; }
if (length($ref) > 70) { $url = substr($ref,0,67) . "..."; } else { $url = $ref; }
#$url =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;
if ($before eq '') { $number = "1"; }
if ($before == $ref{$ref}) { $number = ""; }
else { $number = $num; }
$before = $ref{$ref};
if ($ref =~ /^http:\/\//) {
print "\n";
print "| $number | \n";
print "$url | \n";
print " $ref{$ref} | \n";
print " \n";
}
else {
print "\n";
print "| $number | \n";
print "$url | \n";
print " $ref{$ref} | \n";
print " \n";
}
}
}
print <<"EOF";
||| リモートホスト
EOF
if ($l == 0) { print "| None | \n"; }
else {
$before = '';
$num = $border = $f = 0;
foreach $host (sort { $host{$b} <=> $host{$a} } keys %host) {
$num++;
if ($num > $max) { print ". . . | \n"; last; }
$bar = $host{$host};
if ($f == 0) { $f = 1; $magnification = $bar / 100; $bar = 100; }
else { $bar = $bar / $magnification; }
$bar = int($bar);
if ($bar == 0) { $bar = 1; }
$border++;
if ($border % 2 != 0) { $bgcolor = "bgcolor=#ffeedd"; } else { $bgcolor = ""; }
if ($before eq '') { $number = "1"; }
if ($before == $host{$host}) { $number = ""; }
else { $number = $num; }
$before = $host{$host};
print "\n";
print "| $number | \n";
print "$host | \n";
print " $host{$host} | \n";
print " \n";
}
}
print <<"EOF";
||| プロクシ経由調査
EOF
if ($o == 0) { print "| None | \n"; }
else {
$before = '';
$num = $border = $f = 0;
foreach $host2 (sort { $host2{$b} <=> $host2{$a} } keys %host2) {
$num++;
if ($num > $max) { print ". . . | \n"; last; }
$bar = $host2{$host2};
if ($f == 0) { $f = 1; $magnification = $bar / 100; $bar = 100; }
else { $bar = $bar / $magnification; }
$bar = int($bar);
if ($bar == 0) { $bar = 1; }
$border++;
if ($border % 2 != 0) { $bgcolor = "bgcolor=#ffeedd"; } else { $bgcolor = ""; }
if ($before eq '') { $number = "1"; }
if ($before == $host2{$host2}) { $number = ""; }
else { $number = $num; }
$before = $host2{$host2};
print "\n";
print "| $number | \n";
print "$host2 | \n";
print " $host2{$host2} | \n";
print " \n";
}
}
print <<"EOF";
※ ?マークは匿名串、パケット代節約サービス経由等の可能\性.
EOF
if ($m == 0) { print "| None | \n"; }
else {
$before = '';
$num = $border = $f = 0;
foreach $agent (sort { $agent{$b} <=> $agent{$a} } keys %agent) {
$num++;
if ($num > $max) { print ". . . | \n"; last; }
$bar = $agent{$agent};
if ($f == 0) { $f = 1; $magnification = $bar / 100; $bar = 100; }
else { $bar = $bar / $magnification; }
$bar = int($bar);
if ($bar == 0) { $bar = 1; }
$border++;
if ($border % 2 != 0) { $bgcolor = "bgcolor=#ffeedd"; } else { $bgcolor = ""; }
if ($before eq '') { $number = "1"; }
elsif ($before == $agent{$agent}) { $number = ""; }
else { $number = $num; }
$before = $agent{$agent};
print "\n";
print "| $number | \n";
print "$agent | \n";
print " $agent{$agent} | \n";
print " \n";
}
}
print <<"EOF";
||| 携帯アクセス調査
EOF
if ($p == 0) { print "| None | \n"; }
else {
$before = '';
$num = $border = $f = 0;
foreach $keitai (sort { $keitai{$b} <=> $keitai{$a} } keys %keitai) {
$num++;
if ($num > $max) { print ". . . | \n"; last; }
$bar = $keitai{$keitai};
if ($f == 0) { $f = 1; $magnification = $bar / 100; $bar = 100; }
else { $bar = $bar / $magnification; }
$bar = int($bar);
if ($bar == 0) { $bar = 1; }
$border++;
if ($border % 2 != 0) { $bgcolor = "bgcolor=#ffeedd"; } else { $bgcolor = ""; }
if ($before eq '') { $number = "1"; }
elsif ($before == $keitai{$keitai}) { $number = ""; }
else { $number = $num; }
$before = $keitai{$keitai};
print "\n";
print "| $number | \n";
print "$keitai | \n";
print " $keitai{$keitai} | \n";
print " \n";
}
}
print <<"EOF";
EOF
if ($n == 0) { print "| None | \n"; }
else {
$before = '';
$num = $border = $f = 0;
foreach $os (sort { $os{$b} <=> $os{$a} } keys %os) {
$num++;
if ($num > $max) { print ". . . | \n"; last; }
$bar = $os{$os};
if ($f == 0) { $f = 1; $magnification = $bar / 100; $bar = 100; }
else { $bar = $bar / $magnification; }
$bar = int($bar);
if ($bar == 0) { $bar = 1; }
$border++;
if ($border % 2 != 0) { $bgcolor = "bgcolor=#ffeedd"; } else { $bgcolor = ""; }
if ($before eq '') { $number = "1"; }
if ($before == $os{$os}) { $number = ""; }
else { $number = $num; }
$before = $os{$os};
print "\n";
print "| $number | \n";
print "$os | \n";
print " $os{$os} | \n";
print " \n";
}
}
print <<"EOF";
※ 解析結果は必ずしも正確な情報ではなく、おおまかなアクセス状態を解析するものです。
EOF
exit;
}
##
#### ■アクセス解析(データ取得)
##
sub analyze_log
{
local($ref,$OS,$agent,$host,$host2,$keitai);
local($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst);
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
$today = sprintf("%04d%02d%02d",$year +1900,$mon +1,$mday);
$HOUR = sprintf("%02d",$hour);
if (!-e $log_dir) {
if (!mkdir($log_dir,0777)) { &error($!); }
}
$ip_chk = $log_dir . 'ip.cgi';
$IP = $ENV{'REMOTE_ADDR'};
$hit = 0;
if (!-e $ip_chk) { open(F,"> $ip_chk"); print F "$time\t$IP\n"; close(F); chmod(0666,$ip_chk); }
elsif (open(F,"+< $ip_chk")) {
flock F, 2;
while ($line = ) {
if ($line =~ /(\d+)\t(.+)/) {
$keika = $1; $ip = $2;
if ($keika + 86400 < $time) { next; }
}
else { $ip = $line; next; }
if ($ip =~ /$IP/) { $hit = 1; }
push(@IP,$line);
}
eval 'truncate F,0;'; # truncate()が使えないサーバでは致命的なエラーとなる
seek(F,0,0);
print F @IP;
if (!$hit) { print F "$time\t$IP\n"; }
close(F);
}
opendir(DIR,$log_dir);
@ls = readdir(DIR);
close(DIR);
foreach $file (@ls) {
next if $file eq '.';
next if $file eq '..';
next if $file eq 'count.dat';
next if $file eq 'ip.cgi';
next if -d $file;
if (-M "$log_dir$file" > $max_record) { unlink "$log_dir$file"; }
}
if (!$hit) {
#------------------------------------------------------
# 参照元 ($ref)
$ref = $ENV{'HTTP_REFERER'};
$ref =~ s/</g; # 念の為
$ref =~ s/>/>/g;
if ($ref eq "" && $ENV{'HTTP_WEFERER'} ne "") { $ref = "Field blocked by Norton"; }
#------------------------------------------------------
# OS調査 ($OS)
$agent = $ENV{'HTTP_USER_AGENT'};
$agent =~ s/</g; # 念の為
$agent =~ s/>/>/g;
$agent =~ s/User-Agent: //g;
if ($agent =~ /Win(.*)95/i) { $OS = "Windows 95"; }
elsif ($agent =~ /Vista/i) { $OS = "Windows Vista"; }
elsif ($agent =~ /98; Win/i) { $OS = "Windows Me"; }
elsif ($agent =~ /Win(.*)98/i) { $OS = "Windows 98"; }
elsif ($agent =~ /WinNT/i) { $OS = "Windows NT4.0"; }
elsif ($agent =~ /Windows NT 5\.0/i) { $OS = "Windows 2000"; }
elsif ($agent =~ /Windows NT 5/i) { $OS = "Windows XP"; }
elsif ($agent =~ /Windows NT/i) { $OS = "Windows NT"; }
elsif ($agent =~ /(Mac_|Macintosh)/i) { $OS = "Macintosh"; }
elsif ($agent =~ /X11/i) { $OS = "X11"; }
elsif ($agent =~ /Linux/i) { $OS = "Linux"; }
elsif ($agent =~ /SunOS/i) { $OS = "SunOS"; }
elsif ($agent =~ /FreeBSD/i) { $OS = "FreeBSD"; }
elsif ($agent =~ /WebTV/i && $agent =~ /MSIE/) { $OS = "DreamCast"; }
elsif ($agent =~ /WebTV/i) { $OS = "WebTV"; }
elsif ($agent =~ /AIX/i) { $OS = "AIX"; }
elsif ($agent =~ /OSF1/i) { $OS = "OSF1"; }
elsif ($agent =~ /NEWS-OS/i) { $OS = "NEWS-OS"; }
elsif ($agent =~ /IRIX/i) { $OS = "IRIX"; }
elsif ($agent =~ /HP-UX/i) { $OS = "HP-UX"; }
elsif ($agent =~ /BSD/i) { $OS = "BSD"; }
else { $OS = "その他"; }
#------------------------------------------------------
# IPアドレス調査 ($host)
$host = &nslookup($ENV{'REMOTE_ADDR'});
if ($host =~ /(.*)\.(\d+)$/) { substr($host,0,1) = 'x'; }
elsif ($host =~ /(.*)\.(.*)\.(.*)\.(.*)$/) { $host = "\*\.$2\.$3\.$4"; }
elsif ($host =~ /(.*)\.(.*)\.(.*)$/) { $host = "\*\.$2\.$3"; }
if ($agent =~ /Google.*Proxy/i && $host =~ /google\.com/) { $host = ""; }
sub nslookup {
local($addr) = @_;
local($host,$ip);
if ($addr =~ /([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+)/) {
$ip = "$1.$2.$3.$4";
$host = (gethostbyaddr(pack('C4',$1,$2,$3,$4),2))[0];
$host =~ y/A-Z/a-z/;
if ($host ne "") { return $host; } else { return $ip; }
}
else { return $addr; }
}
#------------------------------------------------------
# プロクシ調査 ($host2)
if ($ENV{'HTTP_VIA'} =~ s/.*\s(\d+)\.(\d+)\.(\d+)\.(\d+)/$1.$2.$3.$4/) { $host2 = $ENV{'HTTP_VIA'}; }
if ($ENV{'HTTP_X_FORWARDED_FOR'} =~ s/^(\d+)\.(\d+)\.(\d+)\.(\d+)(\D*).*/$1.$2.$3.$4/) { $host2 = $ENV{'HTTP_X_FORWARDED_FOR'}; }
if ($ENV{'HTTP_FORWARDED'} =~ s/.*\s(\d+)\.(\d+)\.(\d+)\.(\d+)/$1.$2.$3.$4/) { $host2 = $ENV{'HTTP_FORWARDED'}; }
$host2 = &nslookup($host2);
if ($host2 =~ /(.*)\.(\d+)$/) { substr($host2,0,1) = 'x'; }
elsif ($host2 =~ /(.*)\.(.*)\.(.*)\.(.*)$/) { $host2 = "\*\.$2\.$3\.$4"; }
elsif ($host2 =~ /(.*)\.(.*)\.(.*)$/) { $host2 = "\*\.$2\.$3"; }
elsif ($ENV{'HTTP_USER_AGENT'} =~ /via/i || $ENV{'HTTP_USER_AGENT'} =~ /Proxy/i || $ENV{'HTTP_USER_AGENT'} =~ /Gateway/i) { $host2 = "?"; }
else { $host2 = ""; }
if ($agent =~ /Google.*Proxy/i && $host =~ /google\.com/) { $host2 = "Google経由"; }
#------------------------------------------------------
# ブラウザ($agent)とプラットフォーム($keitai)調査
if ($agent =~ /Opera/) { $agent = "Opera"; }
elsif ($agent =~ /JBH/i) { $agent = "JBH"; }
elsif ($agent =~ /JustView/i) { $agent = "JustView"; }
elsif ($agent =~ /Plala-Browser/i) { $agent = "Plala-Browser"; }
elsif ($agent =~ /DreamPassport/i) { $agent = "DreamCast"; }
elsif ($agent =~ /SonicPassport/i) { $agent = "DreamCast"; }
elsif ($agent =~ /WWWC/i) { $agent = "WWWC"; }
elsif ($agent =~ /HotJava/i) { $agent = "HotJava"; }
elsif ($agent =~ /Lynx/i) { $agent = "Lynx"; }
elsif ($agent =~ /w3m/i) { $agent = "w3m"; }
elsif ($agent =~ /OmniWeb/i) { $agent = "OmniWeb"; }
elsif ($agent =~ /iCab/i) { $agent = "iCab"; }
elsif ($agent =~ /Lite/) { $agent = "Lite"; }
elsif ($agent =~ /AppleWebKit/) { $agent = "Safari"; }
elsif ($agent =~ /Goo|mogimogi|moget|Slurp|Googlebot|Robot|InfoSeek Sidewinder|aruyo|NettuhanCom|ZyBorg|indexpert|User-Agent: |sohu-search|appie|MyApp/i) { $agent = "検索ロボット"; }
elsif ($agent =~ /.*\(.*http:\/\/.*\)/i) { $agent = "検索ロボット"; }
elsif ($agent eq "") { $agent = "検索ロボット?"; }
elsif ($agent =~ /Google CHTML Proxy/i && $host =~ /google\.com/) { $agent = "Google変換(imode版)"; }
elsif ($agent =~ /Google WAP Proxy/i && $host =~ /google\.com/) { $agent = "Google変換(ezweb版)"; }
elsif ($agent =~ /MSIE (\d+)/) { $agent = "Internet Explorer $1"; }
elsif ($agent =~ /Netscape6\/(\d+)/) { $agent = "Netscape-6 $1"; }
elsif ($agent =~ /Mozilla\/(\d+)/ && $agent =~ /Gecko/ && $agent !~ /Netscape/) { $agent = "Mozilla $1"; }
elsif ($agent =~ /Mozilla\/(\d+)/) { $agent = "Netscape Navigator $1"; }
elsif ($agent =~ /DoCoMo\/(.+)\/(.+)\/(.+)$/) { $agent = "DoCoMo $1"; $keitai = "DoCoMo"; }
elsif ($agent =~ /J-PHONE\/(.+)\/(.+)$/) { $agent = "J-PHONE $1"; $keitai = "J-PHONE"; }
elsif ($agent =~ /KDDI-(.+) UP\.Browser\/(\d)\./) {
$agent = "UP.Browser $2";
$keitai = "au";
}
elsif ($agent =~ /UP\.Browser\/(\d)\.-(.)(.)(.)(.)/) {
$agent = "UP.Browser $1"; $carr = $4;
if ($carr eq "T") { $keitai = "TU-KA"; }
else { $keitai = "au"; }
}
elsif ($agent =~ /ASTEL\/(.+)\/(.+)$/) { $agent = "ASTEL $1"; $keitai = "ASTEL"; }
else { $agent = "その他"; }
#------------------------------------------------------
# アクセスデータ記録
if (!-e "$log_dir$today\.dat") { open(F,"> $log_dir$today\.dat"); print F "0"; close(F); chmod(0666,"$log_dir$today\.dat"); }
if (open(F,"+< $log_dir$today\.dat")) {
flock F, 2;
$count = ;
@LOG = ;
$count =~ s/\n//g;
$count ++;
eval 'truncate F,0;'; # truncate()が使えないサーバでは致命的なエラーとなる
seek(F,0,0);
print F "$count\n";
print F @LOG;
print F "$HOUR\t$ref\t$host\t$host2\t$agent\t$keitai\t$OS\n";
close(F);
}
#------------------------------------------------------
# 累計カウント
if (!-e "$log_dir$log_file") { open(F,"> $log_dir$log_file"); print F "1"; close(F); chmod(0666,"$log_dir$log_file"); }
elsif (open(F,"+< $log_dir$log_file")) {
flock F, 2;
$count = ;
$count =~ s/\n//g;
$count ++;
eval 'truncate F,0;'; # truncate()が使えないサーバでは致命的なエラーとなる
seek(F,0,0);
print F $count;
close(F);
}
}
#------------------------------------------------------
# 読み出し
if (!open(LOG,"$log_dir$log_file")) { $count = 'ERR'; }
else {
$count = ; $count =~ s/\n//g;
close(LOG);
}
$log = "$log_dir$today.dat";
if (!open(LOG,$log)) { $today_count = 0; }
else {
$today_count = ; $today_count =~ s/\n//g;
close(LOG);
}
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time - 24*60*60);
$yesterday = sprintf("%04d%02d%02d",$year +1900,$mon +1,$mday);
$log = "$log_dir$yesterday.dat";
if (!open(LOG,$log)) { $yesterday_count = 0; }
else {
$yesterday_count = ; $yesterday_count =~ s/\n//g;
close(LOG);
}
$fmt = <<"EOF"; # カウンター表示書式
| 本日 | $today_count |
| 昨日 | $yesterday_count |
| 累計 | $count |
EOF
$fmt;
}
##
#### ■メンテナンスモード
##
sub maintenance {
if (@remove) {
foreach (@remove) {
$moddel{'del'} = $_;
&modDel();
}
}
&getAllFiles();
if ($form{'now'} eq "") { $form{'now'} = 0; }
if ($form{'add'} eq "") { $form{'add'} = 20; }
$now = $form{'add'} + $form{'now'};
$HTML = <<"EOF";
メンテナンスモード
メンテナンスモード
EOF
if ($#all ne $i - 1) {
$selected{$form{'add'}} = " selected";
$HTML .= <<"EOF";
EOF
}
$HTML .= <<"EOF";
※アップロードした画像はメンテナンス対象外です。 ※タグ覚え img src="img/ .jpg"
ブログに戻る
EOF
print "Content-type: text/html; charset=Shift_JIS\n\n";
print $HTML;
exit;
}
##
#### ■エラー表示
##
sub error { # SJIS出力
local(@msg) = @_;
$error = <<"EOF";
ERROR
$msg[0]
EOF
foreach (1..$#msg) { $error .= "$msg[$_] \n"; }
$error .= <<"EOF";
EOF
print "Content-type: text/html; charset=Shift_JIS\n\n";
print $error;
exit;
}
##
#### ■ロゴ
##
sub copyright {
local($file) = @_;
@array = (
"47","49","46","38","39","61","77","00","14","00","c4","00","00","fd","fd","fd","9d","9d","9d","dc","dc","dc","5e","5e","5e","ec",
"ec","ec","2f","2f","2f","1f","1f","1f","4e","4e","4e","0f","0f","0f","8d","8d","8d","6e","6e","6e","ad","ad","ad","3f","3f","3f",
"7e","7e","7e","bd","bd","bd","cc","cc","cc","00","00","00","fc","fc","fc","00","00","00","00","00","00","00","00","00","00","00",
"00","00","00","00","00","00","00","00","00","00","00","00","00","00","00","00","00","00","00","00","00","00","00","00","00","00",
"00","00","00","00","00","21","f9","04","00","00","00","00","00","2c","00","00","00","00","77","00","14","00","40","05","ff","20",
"10","34","64","69","9e","68","aa","ae","6c","eb","be","30","1b","00","40","13","dd","90","73","33","4c","f4","20","90","60","22",
"c2","08","3a","1e","91","20","24","12","50","16","08","84","e0","21","58","88","38","82","40","c5","4e","99","bb","79","af","ca",
"de","20","d8","18","43","7a","56","6e","ae","11","7c","80","d7","ca","80","97","50","80","20","90","de","88","21","4c","b3","e5",
"ff","80","81","82","83","84","85","80","6f","4b","79","88","6a","8c","8d","8d","3a","37","75","41","0c","7d","86","96","97","98",
"99","81","8b","8e","9d","9e","6a","94","35","5e","5d","5e","0f","10","0b","a3","36","02","41","7b","08","36","57","09","0e","b2",
"90","a4","80","ab","09","0a","55","11","ab","90","5f","10","78","05","03","37","07","7b","43","be","5c","0e","6c","67","44","46",
"ca","0d","ab","41","c2","08","0b","a6","10","07","cc","7c","a2","9a","db","dc","dd","37","9c","9f","e1","8e","a1","7e","6c","03",
"0d","53","72","de","dd","01","0a","b5","37","63","98","88","03","04","c9","43","4d","0c","cf","ca","e2","8c","e4","a3","05","0c",
"f6","2c","58","a5","2e","ca","90","01","05","ae","28","48","b0","e4","4a","03","59","0c","74","41","10","26","e0","c0","2a","06",
"0b","1c","8c","49","d0","c0","c0","0d","53","bd","be","91","32","a0","a5","89","80","2b","ea","d2","ff","20","3b","29","80","89",
"92","64","64","a2","04","d1","72","aa","5a","8f","22","d9","fc","70","c9","d3","c4","40","1d","61","f0","20","10","98","e2","85",
"4d","81","3a","0c","a0","09","89","c4","45","4b","84","3a","92","7e","29","a2","02","c1","00","81","1b","ab","9c","1e","33","f2",
"a7","49","c8","31","3a","1e","5c","9d","22","d5","0b","ce","49","34","ce","c5","58","cb","b6","2d","0b","33","fc","e2","f6","a3",
"a1","60","96","dd","bb","78","f3","ea","dd","cb","b7","af","5f","59","0c","e5","0a","ce","b9","ae","b0","61","41","e0","06","87",
"f3","17","01","08","16","ad","87","31","11","43","10","72","95","c7","4b","88","50","79","59","90","45","c0","83","7d","83","19",
"27","81","54","e0","5a","04","02","23","f0","9c","ec","e5","46","75","83","00","57","f3","3c","48","10","5b","00","89","94","11",
"16","34","00","f9","e7","8a","6d","75","ab","09","ac","6e","a9","f2","a5","b2","00","6f","60","3a","29","e3","d8","ce","39","80",
"51","cf","54","c2","01","c9","80","30","03","06","04","10","18","23","40","80","81","6b","d3","9a","c8","41","f0","44","61","ee",
"68","4d","f4","58","8d","c0","7d","01","84","06","43","df","a5","61","80","1a","42","00","01","01","85","1b","48","2a","72","e5",
"91","08","fb","28","d7","43","00","e4","d5","03","81","16","03","50","16","81","cd","3b","84","e1","00","10","03","72","5c","d1",
"4b","01","36","34","31","c6","77","3d","70","42","dd","56","4a","34","c0","c3","28","21","a5","61","56","0f","06","11","33","15",
"32","ca","68","b1","07","1c","ef","bd","71","93","2c","ac","60","83","96","36","49","68","e6","05","02","f4","45","c0","10","1e",
"7b","34","d1","45","14","a6","05","70","4d","14","bd","78","a7","0e","77","5e","01","78","4a","6f","07","fa","60","df","0d","4d",
"20","10","5b","7f","4a","7c","16","c4","78","cd","48","c1","9e","1d","0f","ac","22","8c","02","06","20","71","96","74","da","70",
"d4","80","31","5f","0c","70","00","9a","3e","0c","91","0c","4f","07","0c","60","4c","02","0b","e8","46","1c","13","24","f4","42",
"80","02","07","20","17","a2","00","09","08","a9","c0","9d","6c","dc","49","a5","35","26","90","15","27","0f","0d","00","81","80",
"02","0b","04","30","26","0f","c2","4c","3a","5d","64","98","1a","52","cf","2c","4c","2a","d6","c9","83","0c","34","17","8a","1b",
"7f","95","6a","ea","a9","a8","a6","aa","aa","2c","0f","00","10","02","00","3b");
if (!-e $file) {
open(f,"> $file");
foreach (@array) { $data = pack('C*',hex($_)); print f $data; }
close(f);
}
print "Content-type: image/gif\n\n";
foreach (@array) { $data = pack('C*',hex($_)); print $data; }
exit;
}
|
|
|