#///////////////////////////////////////////////////////////////////// $VERSION{'admi'} = 'Admini Function Ver 1.11'; # 管理者用スクリプト 2006/01/03 #///////////////////////////////////////////////////////////////////// #================================================= # 設定データ編集フォーム出力 #================================================= sub Conf{ &Dout("F","Conf","AskID=$aid,Type=$type,Max=$max,Size=$size"); # ヘッダ出力 &HeadOut(); # 更新・追加処理 ($in{'enq'} || $in{'chg'}) && &ConfEdit(); my($top,$sts,$title,$msg,@data); ($top,$sts,$title,$msg,@data) = &ReadConfFile() if(-f $CONF_FILE); # データ再ソート(登録昇順) (@data) = &DataSort('0:a',\@data) if(@data); # print "-----------------
"; # foreach (@data){ # print "$_
\n"; # } # print "-----------------
"; # 追加用 push(@data,""); $cgi_form = &CgiFormHead("conf"); $select_sts = &DataSelectTag("L","sts",\@STATUS_LIST,$sts); $enq_title = $title; $enq_msg = &L_ConvCrTag2Text($msg); &FmtPartOut("CONF_HEAD"); foreach $line (@data){ $no++; undef %out; if($line){ &SplitConf($line,*out); $out{'btn'} = ' 更 新 '; $next_aid = sprintf("%02d",$out{'aid'}+1); } else{ $out{'btn'} = ' 追 加 '; $out{'aid'} = $next_aid; $next_aid = ""; } $select_type = &DataSelectTag("L","type",\@TYPE_LIST,$out{'type'}); $select_entry = &DataSelectTag("L","entry",\@ENTRY_LIST,$out{'entry'}); $select_chk = &DataSelectTag("L","chk",\@CHECK_LIST,$out{'chk'}); $select_sts = &DataSelectTag("L","sts",\@STATUS_LIST2,$out{'sts'}); &FmtPartOut("CONF_BODY_H"); ($out{'list'},$out{'cnt'}) = &ConfData($out{'type'},$out{'aid'}); &FmtPartOut("CONF_BODY_D"); $cgi_url = &CgiUrl(). "&mode=msg&aid=$out{'aid'}"; &FmtPartOut("CONF_BODY_F"); } &FmtPartOut("CONF_FOOT"); } #================================================= # リストデータ編集フォーム出力 #================================================= sub ConfData{ my($type,$aid) = @_; &Dout("F","ConfData","AskID=$aid,Type=$type"); my($top,@data); ($dat_file,$top,$acc,$time,@data) = &ReadDataFile($aid) if($type =~ /[CRLl]/); # 新規リスト追加用 for($i=0; $i<$LIST_ADD_CNT; $i++){ push(@data,""); } my($list,$cnt); foreach (@data){ &SplitData($out{'type'},$_,*out); my($id) = ($out{'id'}) ? $out{'id'} : ++$top; $list .= qq|
\n|; $cnt .= qq|
\n|; } return $list,$cnt; } #================================================= # 入力設定データ編集保存 #================================================= sub ConfEdit{ my($match,$line,$pos); &Dout("F","ConfEdit"); my($top,$sts,$title,$msg,@data); ($top,$sts,$title,$msg,@data) = &ReadConfFile() if(-f $CONF_FILE); # 基本設定 if($in{'enq'}){ $sts = $in{'sts'}; $title = $in{'title'}; $msg = $in{'msg'}; @new = @data; } # 質問設定 else{ foreach $line (@data){ &SplitConf($line,*conf); $pos++; # 更新時 if($conf{'aid'} eq $in{'aid'}){ $line = &JoinConf($conf{'aid'},$pos); &ConfEditData($in{'aid'}); $match= 1; } elsif($conf{'title'} eq $in{'title'}){ &Error("$conf{'title'} は既に登録されています。"); } push(@new,$line); } # 新規登録時 if(!$match){ $line = &JoinConf(++$top,++$pos); push(@new,$line); &ConfEditData($top); $title = $CGI_TITLE unless $title; } } $head = join($LOG_SEP,$top,$sts,$title,$msg,""); &L_WriteLogFile($CONF_FILE,$head,@new) || &Error($ERR_MSG); } #================================================= # 入力リストデータ編集保存 #================================================= sub ConfEditData{ my($aid) = shift; &Dout("F","ConfDataEdit","AskID=$aid"); my(@list,$i,$cnt); my($dat_file,$top,$acc,$time,@dm) = &ReadDataFile($aid,"",1); for($i=1;$i<=99;$i++){ ($in{"item$i"}) || last; $in{"cnt$i"} = 0 unless $in{"cnt$i"}; $line = join($LOG_SEP,$i,$in{"item$i"},$in{"cnt$i"},"\n"); push(@list,$line); } if($in{'type'} =~ /[TM]/){ (@list) && &Error("入力項目に対してリスト設定はできません。"); undef @list; @list = @dm; } else{ ($i == 1) && &Error("選択リストを設定して下さい。"); $top = $i -1; } $head = join($LOG_SEP,$top,$acc,$time,""); &L_WriteLogFile($dat_file,$head,@list) || &Error($ERR_MSG); } #================================================= # 設定データ結合および内容チェック #================================================= sub JoinConf{ my($aid,$pos) = @_; &Dout("F","JoinConf","AskID=$aid,Pos=$pos"); $aid = sprintf("%02d",$aid); ($aid >= 100 || $aid eq "00") && &Error("質問Noに誤りがあります。[Ask No=$aid]"); ($in{'max'} =~ /\D/) && &Error("最大保存数の設定値に誤りがあります。
[Max=$in{'max'}]"); ($in{'len'} =~ /\D/) && &Error("入力最大桁数の設定値に誤りがあります。
[Len=$in{'len'}]"); ($in{'pos'} =~ /\D/) && &Error("表示位置の設定値に誤りがあります。
[Pos=$in{'pos'}]"); ($in{'show'} =~ /\D/) && &Error("表示数の設定値に誤りがあります。
[Show=$in{'show'}]"); ($in{'size'} =~ /\D/) && &Error("表示サイズの設定値に誤りがあります。
[Size=$in{'size'}]"); ($in{'size'} > 80) && &Error("表示サイズの設定値が大きすぎます。
[Size=$in{'size'}]"); ($in{'title'}) || &Error("質問項目が未設定です。"); ($in{'type'}) || &Error("質問形式が未設定です。"); $in{'pos'} = $pos unless $in{'pos'}; if($in{'type'} =~ /[RCLl]/){ my($max); foreach (keys %in){ ($_ !~ /^item/) && next; $max++ if $in{$_}; } $in{'max'} = $max if($max>$in{'max'}); } ($in{'pos'} == 1 && $in{'entry'} ne 'Y') && &Error("先頭項目は、必須入力しか設定できません。"); my($line) = join($LOG_SEP,$aid, @in{'type','entry','pos','title','max','len','show','msg','chk','size','sts'}); $line .= "$LOG_SEP\n"; return $line; } #================================================= # ファイル管理 #================================================= sub File{ &Dout("F","File"); # タイトル出力 &HeadOut('ファイル管理'); my($buf,$i,$file,@list); &FmtPartOut("FILE_HEAD"); # ファイル管理実行 &FileEdit(); # メッセージ出力 &FmtMsgOut("B","ERROR !!",$ERR_MSG) if($ERR_MSG); my($cgi_url) = &CgiUrl() . "&mode=file"; my($top,$sts,$title,$msg,@data) = &ReadConfFile(); # ログファイル ----------- my($dat_file,$dir,$target); undef @list; push(@list, qq|設定ファイル<>$CONF_FILE<>RW-<>| .qq|| .qq||); foreach (@data){ &SplitConf($_,*conf); $dat_file = &GetDataFile($conf{'aid'}); push(@list, qq|データファイル ask=$conf{'aid'}<>$dat_file<>RW-<>| .qq|| .qq||); } &FileList("ログファイル",@list); # ログファイル ----------- undef @list; push(@list, qq|設定ファイル<>$CONF_FILE_BK<>RW-<>|); foreach (@data){ &SplitConf($_,*conf); $dat_file = &GetDataFile($conf{'aid'},$DAT_FILE_BK); push(@list, qq|データファイル ask=$conf{'aid'}<>$dat_file<>RW-<>| .qq||); } &FileList("バックアップファイル",@list); # CGI実行ファイル -------- (@list) = ( "CGIスクリプト<>$CGI_PROG<>R-X", "設定ファイル<>$ini_file<>R--" ); foreach (keys %HTML_FMT){ if($tmp !~ /$HTML_FMT{$_}/){ push(@list,"HTMLテンプレート<>$HTML_FMT{$_}<>R--"); $tmp .= ",$HTML_FMT{$_}"; } } &FileList("CGI実行ファイル",@list); # ディレクトリ ----------- undef @list; $dat_file = &GetDataFile($conf{'aid'}); ($dir,$target) = &FileDirName($dat_file); push(@list,"データディレクトリ<>$dir<>RWXD"); ($dir,$target) = &FileDirName($LOG_FILE); push(@list,"ログディレクトリ<>$dir<>RWXD"); ($dir,$target) = &FileDirName($LOCK_FILE); push(@list,"ロックディレクトリ<>$dir<>RWXD", "ロックファイル<>$LOCK_FILE<>未存在<>" ." " .""); &FileList("ロックファイル",@list); if($VERSION_OUT){ foreach $key (keys %VERSION){ $ver_info .= ""; $ver_info .= "
Lib = $key$VERSION{$key}
\n"; } } &FmtPartOut("FILE_FOOT"); } #================================================= # ファイル管理実行 #================================================= sub FileEdit{ &Dout("F","FileEdit",""); # ロックファイル削除 if($in{'lckdel'}){ &Dout("S","FileInit","Lock File Delete"); &L_FileUnlock($LOCK_FILE); return; } # ロックファイル作成 elsif($in{'lckmk'}){ &Dout("S","FileInit","Lock File Make"); &L_FileLock($LOCK_FILE); return; } elsif(!$in{'init'} && !$in{'bkup'} && !$in{'rest'}){ return; } # ロック制御 if($LOCK_MODE){ &L_FileLock($LOCK_FILE) || &Error($ERR_MSG); $m_lock_flg = 1; } &Dout("S","FileInit","Enq ID=$in{'eid'}, Ask ID=$in{'aid'},Init=$in{'init'},Bk=$in{'bkup'},Rest=$in{'rest'}"); # 対象ファイル my(%log) = ('conf'=>$CONF_FILE,'log'=>sprintf($DAT_FILE,$in{'aid'})); my(%bak) = ('conf'=>$CONF_FILE_BK,'log'=>sprintf($DAT_FILE_BK,$in{'aid'})); # ログファイルの初期化 if($in{'init'}){ my($target) = $in{'init'}; &Dout("S","FileInit","Log File Truncate : $log{$target}"); unlink($log{$target}) || &Error("$log{$target}の削除に失敗しました。"); } # ログファイルのバックアップ elsif($in{'bkup'}){ my($target) = $in{'bkup'}; &Dout("S","FileInit","Log File Backup : $log{$target} - > $bak{$target}"); &FileDataCopy($log{$target},$bak{$target}) || &Error("$log{$target}のバックアップに失敗しました。"); } # ログファイルのバックアップ復元 elsif($in{'rest'}){ my($target) = $in{'rest'}; &Dout("S","FileInit","Log File Restore : $bak{$target} - > $log{$target}"); &FileDataCopy($bak{$target},$log{$target}) || &Error("$log{$target}の復元に失敗しました。");;; } if($LOCK_MODE && $m_lock_flg){ &L_FileUnlock($LOCK_FILE); $m_lock_flg = 0; } return; } #================================================= # ファイルリスト出力 #================================================= sub FileList{ local($title,@list) = @_; &Dout("F","FileList","Title=$title"); # リスト未存在時ダミー設定 (@list)|| push(@list,"未存在<> <>"); $cgi_form = &CgiFormHead("file"); &FmtPartOut("FILE_BODY_H"); $no = 0; foreach (@list){ $no++; ($name,$file,$def,$menu) = split(/<>/, $_); $menu = " " unless $menu; ($time,$size,$sts,$dir) = &FileStat($file); # ステータス相違時は赤字表示 $sts = qq|$sts| if($sts ne $def && $sts !~ /^$def/i); &FmtPartOut("FILE_BODY_D"); } &FmtPartOut("FILE_BODY_F"); } #================================================= # ファイル情報取得 #================================================= sub FileStat{ my($file) = @_; &Dout("F","FileStat","File=$file"); my($time,$size,$sts,$dir); if(-e $file){ $sts = (-r $file) ? "R" : "-"; $sts .= (-w $file) ? "W" : "-"; $sts .= (-x $file) ? "X" : "-"; $time = &FmtDate($DATE_FMT{'file'},(stat($file))[9]); # ディレクトリ時 if(-d $file){ $sts .= "D"; $size = "Directory"; } else{ $size = &L_SetFiller((-s $file)) . " byte"; } } else{ $time = '--------'; $sts = '未存在'; $size = '----'; } return $time,$size,$sts,$dir; } #=========================================================== # メッセージ表示 #=========================================================== sub Msg{ &Dout("F","Line"); # ヘッダ出力 &HeadOut(); # データ削除 &MsgDel($in{'id'}) if $in{'del'}; # 情報ファイル読込 my($top,$sts,$title,$msg,@data) = &ReadConfFile(); ($pos,$line) = &DataTargetLine(0,$in{'aid'},\@data); &SplitConf($line,*out); &FmtPartOut("MSG_HEAD"); $cgi_form = &CgiFormHead("msg","msg"); my($dat_file,$top,$acc,$time,@data) = &ReadDataFile($in{'aid'},'0:d'); (@data) || &Error("現在、登録データは存在しません。"); &FmtPartOut("MSG_BODY_H"); # 登録データ存在時 my($cnt) = scalar @data; ($cnt_out,@data) = &DataPgList($in{'pg'},$MSG_PG_MAX,@data); foreach (@data){ &SplitData($out{'type'},$_,*out); $out{'date'} = &FmtDate($DATE_FMT{'msg'},$out{'time'}); $out{'item'} =~ s/\<\;br\>\;/
/ig; &FmtPartOut("MSG_BODY_D"); } # ページナビ my($cgi) = &CgiUrl('mode','aid'). "&pg="; my($back,$next,$end) = &DataPgInfo($in{'pg'},$MSG_PG_MAX,$cnt); ($navi_bk,$navi_pg,$navi_nx) = &DataPgNavi($in{'pg'},$back,$next,$end,$cgi,\%PG_NAVI); &FmtPartOut("MSG_BODY_F"); &FmtPartOut("MSG_FOOT"); } #=========================================================== # メッセージ削除 #=========================================================== sub MsgDel{ my($target) = @_; &Dout("F","MsgDel","Tartget=$target"); ($target) || return; my(@list) = split(/$MULT_SEP/,$target); if($LOCK_MODE){ &L_FileLock($LOCK_FILE) || &Error($ERR_MSG); $m_lock_flg = 1; } my($dat_file,$top,$acc,$time,@data) = &ReadDataFile($in{'aid'}); my($id,$bf_id); foreach $id (@list){ ($id eq $bf_id) && next; $bf_id = $id; my($match) = 0; my($cnt) = scalar @data; for($i=$cnt-1;$i>=0;$i--){ &SplitData('T',$data[$i],*out); # ($target !~ /$out{'id'}($|$MULT_SEP)/) && next; ($target !~ /(^|$MULT_SEP)$out{'id'}($|$MULT_SEP)/) && next; splice(@data,$i,1); $INFO_MSG .= "MsgID=$out{'id'}
"; $match--; &Dout("S","ListDel in","ID=$out{'id'}"); } } # ヘッダ行合成 $head = join($LOG_SEP,$top,$acc,$time,""); &L_WriteLogFile($dat_file,$head,@data) || &Error($ERR_MSG); } 1;