#!/usr/bin/perl # ↑はサーバーに合わせて変更して下さい。 #---------------------------------------------------------------------- # 箱庭諸島 ver2.30 # メンテナンスツール(ver1.01) # 使用条件、使用方法等は、hako-readme.txtファイルを参照 # # 箱庭諸島のページ: http://www.bekkoame.ne.jp/~tokuoka/hakoniwa.html #---------------------------------------------------------------------- # ―――――――――――――――――――――――――――――― # 各種設定値 # ―――――――――――――――――――――――――――――― # マスターパスワード my($masterpassword) = ''; # 1ターンが何秒か my($unitTime) = 21600; # 6時間 # ディレクトリのパーミッション my($dirMode) = 0755; # このファイル my($thisFile) = 'http://path/hako-mente.cgi'; # データディレクトリの名前 # hakojima.cgi中のものと合わせてください。 my($dirName) = 'data'; # use Time::Localが使えない環境では、'use Time::Local'の行を消して下さい。 # ただし、更新時間の変更が'秒指定で変更'しかできなくなります。 use Time::Local; # ―――――――――――――――――――――――――――――― # 設定項目は以上 # ―――――――――――――――――――――――――――――― # 各種変数 my($mainMode); my($inputPass); my($deleteID); my($currentID); my($ctYear); my($ctMon); my($ctDate); my($ctHour); my($ctMin); my($ctSec); print < Hakoniwa Islands 2 Maintenance Tool END cgiInput(); if($mainMode eq 'delete') { if(passCheck()) { deleteMode(); } } elsif($mainMode eq 'current') { if(passCheck()) { currentMode(); } } elsif($mainMode eq 'time') { if(passCheck()) { timeMode(); } } elsif($mainMode eq 'stime') { if(passCheck()) { stimeMode(); } } elsif($mainMode eq 'new') { if(passCheck()) { newMode(); } } mainMode(); print < END sub myrmtree { my($dn) = @_; opendir(DIN, "$dn/"); my($fileName); while($fileName = readdir(DIN)) { unlink("$dn/$fileName"); } closedir(DIN); rmdir($dn); } sub currentMode { myrmtree "${dirName}"; mkdir("${dirName}", $dirMode); opendir(DIN, "${dirName}.bak$currentID/"); my($fileName); while($fileName = readdir(DIN)) { fileCopy("${dirName}.bak$currentID/$fileName", "${dirName}/$fileName"); } closedir(DIN); } sub deleteMode { if($deleteID eq '') { myrmtree "${dirName}"; } else { myrmtree "${dirName}.bak$deleteID"; } unlink "hakojimalockflock"; } sub newMode { mkdir($dirName, $dirMode); # 現在の時間を取得 my($now) = time; $now = $now - ($now % ($unitTime)); open(OUT, ">$dirName/hakojima.dat"); # ファイルを開く print OUT "1\n"; # ターン数1 print OUT "$now\n"; # 開始時間 print OUT "0\n"; # 島の数 print OUT "1\n"; # 次に割り当てるID # ファイルを閉じる close(OUT); } sub timeMode { $ctMon--; $ctYear -= 1900; $ctSec = timelocal($ctSec, $ctMin, $ctHour, $ctDate, $ctMon, $ctYear); stimeMode(); } sub stimeMode { my($t) = $ctSec; open(IN, "${dirName}/hakojima.dat"); my(@lines); @lines = ; close(IN); $lines[1] = "$t\n"; open(OUT, ">${dirName}/hakojima.dat"); print OUT @lines; close(OUT); } sub mainMode { opendir(DIN, "./"); print <

Hakoniwa Islands 2 Maintenance Tool

Password: END # 現役データ if(-d "${dirName}") { dataPrint(""); } else { print < END } # バックアップデータ my($dn); while($dn = readdir(DIN)) { if($dn =~ /^${dirName}.bak(.*)/) { dataPrint($1); } } closedir(DIN); } # 表示モード sub dataPrint { my($suf) = @_; print "
"; if($suf eq "") { open(IN, "${dirName}/hakojima.dat"); print "

Currently active data

"; } else { open(IN, "${dirName}.bak$suf/hakojima.dat"); print "

Backup $suf

"; } my($lastTurn); $lastTurn = ; my($lastTime); $lastTime = ; my($timeString) = timeToString($lastTime); print <Turn $lastTurn
Time of last update: $timeString
Time of last update (in seconds): $lastTime seconds since 1970/01/01
END if($suf eq "") { my($sec, $min, $hour, $date, $mon, $year, $day, $yday, $dummy) = localtime($lastTime); $mon++; $year += 1900; $sec = sprintf("%02d", $sec); $min = sprintf("%02d", $min); $hour = sprintf("%02d", $hour); $date = sprintf("%02d", $date); $mon = sprintf("%02d", $mon); print <Change last update time // ::
seconds since 1970/01/01 END } else { print < END } } sub timeToString { my($sec, $min, $hour, $date, $mon, $year, $day, $yday, $dummy) = localtime($_[0]); $mon++; $year += 1900; $sec = sprintf("%02d", $sec); $min = sprintf("%02d", $min); $hour = sprintf("%02d", $hour); $date = sprintf("%02d", $date); $mon = sprintf("%02d", $mon); return "${year}/${mon}/${date} ${hour}:${min}:${sec}"; } # CGIの読みこみ sub cgiInput { my($line); # 入力を受け取る $line = <>; $line =~ tr/+/ /; $line =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; if($line =~ /DELETE([0-9]*)/) { $mainMode = 'delete'; $deleteID = $1; } elsif($line =~ /CURRENT([0-9]*)/) { $mainMode = 'current'; $currentID = $1; } elsif($line =~ /NEW/) { $mainMode = 'new'; } elsif($line =~ /NTIME/) { $mainMode = 'time'; if($line =~ /YEAR=([0-9]*)/) { $ctYear = $1; } if($line =~ /MON=([0-9]*)/) { $ctMon = $1; } if($line =~ /DATE=([0-9]*)/) { $ctDate = $1; } if($line =~ /HOUR=([0-9]*)/) { $ctHour = $1; } if($line =~ /MIN=([0-9]*)/) { $ctMin = $1; } if($line =~ /NSEC=([0-9]*)/) { $ctSec = $1; } } elsif($line =~ /STIME/) { $mainMode = 'stime'; if($line =~ /SSEC=([0-9]*)/) { $ctSec = $1; } } if($line =~ /PASSWORD=([^\&]*)\&/) { $inputPass = $1; } } # ファイルのコピー sub fileCopy { my($src, $dist) = @_; open(IN, $src); open(OUT, ">$dist"); while() { print OUT; } close(IN); close(OUT); } # パスチェック sub passCheck { if($inputPass eq $masterpassword) { return 1; } else { print <Password is incorrect. END return 0; } } 1;