#!/usr/local/bin/perl # #view.cgi #アンケート管理スクリプト:管理者専用 #箱を一括して管理するCGIです。 #箱そのものの削除は list.cgiから行って下さい。 require './jcodeLE.pl'; require './prei.cgi'; $| = 1; &winit;&noaxschk; &init; &decode;&jikan; #管理者でなければパスワードの要求画面へ if($pass ne $rootpwd){ &html;exit; } if ($referer =~ /$cgichk/i ){ &edit if($erase); } &html;exit; ################################################## sub init{ #初期設定など $rootpwd = 'master777'; #総合管理者のパスワード(重要!) }#init END ################################################## sub html { my($roomtotal,$roomn,$roomc,$file,$line,$voten,$name,$wchat,$date,$host,$ps,$tms,$invalid,$color,$time2); my($oname,$ohost,$odate,$ochat,$eraseid,$hostname,$lmtd); print "Content-type: text/html\n\n"; print <<"_HTML_"; 管理メニュー $metacode $bodys

アンケート管理メニュー


_HTML_ #パスワードをチェック(2度手間になるが。) if($pass ne $rootpwd){ print <<"_HTML_";

パスワードの入力

管理者パスワード
オリジナルはゆいぼーど2(Free)
_HTML_ return; } if($room eq 'all'){ #箱の一覧を取得 opendir(DIR,"$logdir"); @readlist = grep(/log/, readdir(DIR)); closedir(DIR); } else{ #箱をひとつだけ読み込む @readlist = ($room) if($room > 0); } foreach $roomn (@readlist) { $roomn =~ s/log\.(.*)\.cgi/$1/; $filedata = -M "./$logdir/log.$roomn.cgi"; if($hotlist){ #更新日付がhotlist以内のものをピックアップ push(@roomlist,$roomn) if ($filedata < $hotlist); }else{ push(@roomlist,$roomn); } $ans2{$roomn} = $filedata; } if ($rev ne 'off'){ @roomlist = sort { $a <=> $b; } @roomlist; @roomlist = reverse (@roomlist); }else{ @roomlist = sort { $ans2{$a} <=> $ans2{$b} } @roomlist; } $roomtotal = @roomlist; print "${date}現在の箱及び投票のリスト(計 ${roomtotal}箱)
"; print "
\n"; foreach $roomn (@roomlist) { $filedata = -M "./$logdir/log.$roomn.cgi"; last if($roomn eq ''); $file="./$logdir/log.$roomn.cgi"; if(open(DB, $file)){ @lines = ; close(DB); } else{ last; } $set=shift(@lines); ($title,$chkkey,$ddata,$oname,$ochat,$ohost,$odate) = split(/:#/,$set); $title = unpack("A80",$title); if( $vkey ne $chkkey ){ $title=''; $ddata=10; } $title = '?' if($title eq ''); $datedata = $ddata - $filedata; $hatusuu=@lines; ($sec,$min,$hour,$mday,$month,$year,$wday,$yday,$isdst) = localtime($times-$filedata*24*60*60); $sec = "0$sec" if ($sec < 10);$min = "0$min" if ($min < 10);$month++; if($datedata < 1){ $dates = "$month/$mday $hour時$min分<\/FONT>"; }else{ if($filedata < 0.5 ){ $dates = "$month/$mday $hour時$min分<\/FONT>"; }else{ $dates = "$month/$mday $hour時$min分"; } } print "

 \n"; print "$title
"; if($gethost){ $hostname = gethostbyaddr(pack('C4',split(/\./,$ohost)),2) if($ohost =~ /\d+\.\d+\.\d+\.\d+/); $ohost = $hostname if($hostname ne ''); } print "($roomn $ohost $oname $odate)$dates: $hatusuu投票:$datedata日
\n"; print "

    \n"; foreach $line(@lines){ ($voten,$name,$vote,$wchat,$date,$host,$tms,$invalid,$time2) = split(/:#/,$line); $eraseid = "${roomn}-${time2}"; print "
    \n"; if($invalid eq 'true'){ $color = '#0000FF'; }else{ $color = "#$body2"; } if($gethost){ $hostname = gethostbyaddr(pack('C4',split(/\./,$host)),2) if($host =~ /\d+\.\d+\.\d+\.\d+/); if($hostname ne ''){ $host = $hostname; } } $lmtd = int(limitchk($host)); if($lmtd){ print "($host $date)$vote\n"; }else{ print "($host $date)$vote\n"; } #コメント内容までいちいち表示していると大変なのでオフにしてある #print "

    $wchat

    \n"; print "
    \n"; } print "

\n"; $roomc++; } #削除ボタン print qq!\n!; #箱指定 print <<"_HTML_";
箱を指定して\表\示(allで全箱一覧)
更新順に並べる
出来るだけホスト名を取得 (かなり重い処理。また、サーバーによっては使えない。)
過去日以内に更新された箱を表\示
(0日を指定した場合は、全ての箱を対象とする。)
_HTML_ #キーワード削除 if($room>0 && $roomc>0){ print <<"_HTML_";
削除キーワード(項目データの中に含まれる文字列。秒数指定が安全)
※箱番号を指定した時だけこの機\能\が使えます

_HTML_ } $pass=''; print "
オリジナルはゆいぼーど2(Free)
\n";#この行だけは消さないでっ!! }#html END ################################################## sub decode{ #一般的なデコード&変数への代入 my($brnum); if($ENV{'REQUEST_METHOD'} eq "POST"){ read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); }else{ $buffer = $ENV{'QUERY_STRING'}; } &decodearg($buffer); $room = $FORM{'room'}; $erase = $FORM{'erase'}; $erasekey = $FORM{'erasekey'}; $erasekey = unpack("A80",$erasekey); $room = '000' if($room eq ''); $hotlist = $FORM{'h'}; $gethost = $FORM{'gh'}; $rev = $FORM{'r'};$rev = 'on' if($rev eq ''); $pass = $FORM{'pass'};$pass = $$ unless($pass); $pass2 = &passwd($pass); $page = $FORM{'page'}; $page = 0 if($page < 0);$page = int($page); $page2 = $page*$pagemax; }#decode END ################################################## sub passwd{ local($p2,$pass); $pass = $_[0]; $p2 = crypt($pass,$rootpwd); return $p2; }#passwd END ################################################## sub readlog{ #配列@linesにログを読み込む open(DB,"$chat_file") || &err("ログファイルが読めません。"); seek(DB,0,0); @lines = ; close(DB); #$set=shift(@lines); }#readlog END ################################################## #各箱の指定された投票を削除する。削除リストは箱順に並んでいると効率的 sub edit{ my(@eraselist,@eroom,@evote,$file,$set,@lines,$ln,$n); $buffer =~ s/&//g; #余分な部分を削除 (@eraselist) = split(/eraseid=/, $buffer); #削除リストを作成 shift(@eraselist); #配列の最初に余分な要素が入るのでひとつ消す #キーワード削除があれば一箱だけリストに入れる if($room && $erasekey){ @eroom = ($room); } else{ foreach (@eraselist){ /([0-9]+)-([0-9]+)/; @eroom = (@eroom,$1); @evote = (@evote,$2); } } $ln = @eroom; foreach (0 .. ($ln-1)){ $file = "./$logdir/log.$eroom[$_].cgi"; if(-e $file){ open(DB, "$file"); @lines = ; close(DB); $set = shift(@lines); $n = $_; foreach($n .. ($ln-1)){ #読み込んだ箱の中の該当項目を削除する last if($eroom[$_] != $eroom[$n]); @lines = grep(!/$evote[$_]/,@lines); #秒数指定で削除 } $_ = $n; @lines = grep(!/$erasekey/,@lines); #キーワードで削除 open(DB, ">$file"); print DB $set; print DB @lines; close(DB); } } }#edit END ################################################## __END__