#! /usr/local/bin/perl # 【 analysis.cgi 本番用】 ← ファイル名は“偽装”。 # ★★ analysis.cgi の役割 # ★【役割 1】★ 30分くらいで 【田中式ダウンロードの パスワードファイル】を 自動的に初期化・更新する。 # ★【役割 2】★ “年月日時刻 変わり”を認識した時は、A〜E 5個の【inTopクッキー元本ファイル】を更新する。 # ★【役割 3】★ “年月日時刻 変わり”を認識した時は、A・B 2個の【fr1クッキー元本ファイル】を更新する。 # ★ファイル名・ディレクトリ名は、実物とは全く異なる名前にしてあります。(あなたも、変更して下さい) # ★暗号化処理のサブルーチンは“削除/無効”にしてあります。 # ★リンク元チェックのplファイル読み込みは“無効”にしてあります。 # ★ unlessコマンドを使って【ファイルの存在・属性チェック】をしている箇所が 何行もありますが、 # 「流れを読みづらい」〜 と感じる人は、サブルーチン化して下さい。 # Perlは インタプリタ実行ですので、多少は 速度的に不利な気がして、サブルーチン化していません。 # ★undef関数の使用は、「まあ良いだろう」として おざなりにしてあります。 作法にこだわる人は修整して下さい。 # ただし、Perlでは、変数のメモリ開放/ゴミ集めは プロセスが終了した時点で自動的に行われる・・と記憶しています。 # ★このプログラムを そのまま流用するなら、このプログラムと同じディレクトリに sclrDataSave.pl が存在している # 必要があります。 # sclrDataSave.pl は、 # 【Try The HomePage(http://www.tryhp.net)】で入手した perl-lib.pl を少しだけ 自分用にチューニング # したパッケージです。 基本的に、“著作権”は Try The HomePageにあります。 # perl-lib.pl は優れたライブラリですが、ロック処理に焦点を絞って考えた時に、 # perl-lib.pl のサイズ55KBは、ちょっとキツイ気がします。 # どこを抜粋・調整して sclrDataSave.pl として仕立てるかは、別のページで説明してあります。 #------------ 初期設定 -------------# # ロック形式 1=flock関数 2=symlink関数 それ以外の数値=mkdir関数)( 1 が望ましい。サーバー次第。) $lockkey = 1; # ◆◆↓ 扱うデータファイルによって、flock/symlinkを使い分けるための【ロック形式】の設定。 # (symlink用ロックfileは、別フォルダを使用。) # # ◆↓ 上の $lockkeyで設定できる値を選んで、好きな値(ロック形式)を設定する。 # ↓ すると、プログラムコードで【$SymYesNo = $SymUsable;】を設定している間だけ $SymUsableで選択した形式でロックされる。 $SymUsable = 1; # ◆↑ symlinkを一時的に【共用】で使うなら、$SymUsableに 2を設定する。 # ◆◆その場合は、全CGIで $SymUsable = 2; を設定するべし(そうしないと 別種CGI同士のロックが効かない)◆◆ # -------------------------------------- # ◆↓全CGIで共通のロックファイル名・・◆【サブルーチン(lock・unlock)の第2引数】 # # ◆【注意】 “データファイル実体 と ロックファイルの組み合わせ”を、全CGIで統一させないと、ロックが無効となる。 # $Sym_IP0_lockfile = '/export/members/hogehoge/mySight/cgi-bin/MunyaSymDir/SymSym_IP0_lock.lok'; $Sym_IP1_lockfile = '/export/members/hogehoge/mySight/cgi-bin/MunyaSymDir/SymSym_IP1_lock.lok'; $Sym_IP2_lockfile = '/export/members/hogehoge/mySight/cgi-bin/MunyaSymDir/SymSym_IP2_lock.lok'; $Sym_0_lockfile = '/export/members/hogehoge/mySight/cgi-bin/MunyaSymDir/SymSym_0_lock.lok'; $Sym_1_lockfile = '/export/members/hogehoge/mySight/cgi-bin/MunyaSymDir/SymSym_1_lock.lok'; $Sym_1i_lockfile = '/export/members/hogehoge/mySight/cgi-bin/MunyaSymDir/SymSym_1i_lock.lok'; $Sym_2_lockfile = '/export/members/hogehoge/mySight/cgi-bin/MunyaSymDir/SymSym_2_lock.lok'; # ここまでのロックfileは、symlink用ディレクトリを指定。 # symlink以外のロックにも使えるが、 # ◆いったん稼動開始したロック方式を 後で変更する場合は、flock形式で作成されたファイル名と重複しないように ↑ 変更すべし。(全CGI 共通) # ◆理由 ↓ ◆ # ◆flockのロックファイルは、その度に削除されない。(ディレクトリとファイルの名前重複の共存も不可。) # ◆flockは、使用中である事を 他の“flockを使うプロセス”に知らせるだけで、 # flockを使わないプロセスをロックすることは出来ない。 # ただし、flockは 高速で確実なロックが出来る。 $mini_IP0_lockfile = '/export/members/hogehoge/mySight/cgi-bin/NormalLockDir/mini_IP0_normal.lok'; $mini_IP1_lockfile = '/export/members/hogehoge/mySight/cgi-bin/NormalLockDir/mini_IP1_normal.lok'; $mini_IP2_lockfile = '/export/members/hogehoge/mySight/cgi-bin/NormalLockDir/mini_IP2_normal.lok'; $mini_0_lockfile = '/export/members/hogehoge/mySight/cgi-bin/NormalLockDir/mini_0_normal.lok'; $mini_1_lockfile = '/export/members/hogehoge/mySight/cgi-bin/NormalLockDir/mini_1_normal.lok'; $mini_2_lockfile = '/export/members/hogehoge/mySight/cgi-bin/NormalLockDir/mini_2_normal.lok'; $mini_i_lockfile = '/export/members/hogehoge/mySight/cgi-bin/NormalLockDir/mini_i_normal.lok'; $mini_f_lockfile = '/export/members/hogehoge/mySight/cgi-bin/NormalLockDir/mini_f_normal.lok'; $pwFile_pre_lockfile = '/export/members/hogehoge/mySight/cgi-bin/NormalLockDir/pwFile_pre_lock.lok'; $pwFile_lockfile = '/export/members/hogehoge/mySight/cgi-bin/NormalLockDir/pwFile_lock.lok'; $cokSrc_pre_lockfile = '/export/members/hogehoge/mySight/cgi-bin/NormalLockDir/cokSrc_pre_lock.lok'; $cokSrc_i_lockfile = '/export/members/hogehoge/mySight/cgi-bin/NormalLockDir/cokSrc_i_lock.lok'; $cokSrc_f_lockfile = '/export/members/hogehoge/mySight/cgi-bin/NormalLockDir/cokSrc_f_lock.lok'; $Bigger_lockfile = '/export/members/hogehoge/mySight/cgi-bin/NormalLockDir/Bigger_lock.lok'; # ---- (ここまで、ロックファイル名) ---- # ◆ ロック形式の使い分け方(一時的に symlinkを使う場合) # $SymYesNo = $SymUsable; # ← ◆一時的に、symlinkロック(2)を指定できる。 # $Sym_IP0_LK = &lock($otherGuard, $Sym_IP0_lockfile); # $SymYesNo = $lockkey; # ← ◆symlink指定を解除。 # # $SymYesNo = $SymUsable; # ← ◆symlinkロック解除を指定。 # &unlock($mylockOFF, $Sym_IP0_LK); # $SymYesNo = $lockkey; # ← ◆symlink指定を解除。 # このCGI専用ロックファイル名 (ログ用) $lockfile = './onlyAnalysisLOC/analysisLog.lok'; # このCGI専用ロックファイル用の【サブルーチン戻り値変数】 $pastCNTmin_LK =0; # ※ロックファイル自体は、転送の必要なし(作成してはダメ)・・自動作成され 自動削除される。 # (転送時に作成すべきなのは、ロックディレクトリ だけ。) # ◆ ↓ flock用のロックアクションモード・・【サブルーチン(lock・unlock)の第1引数】(変更してはならない) # # ◆symlink/mkdir関数 の場合も、ダミーで“引数設定”するべし。 # ◆unlockを呼ぶ時の 第1引数は、必ず $mylockOFF (即ち 8)。 $otherReadOK = 1; # ← ★【共有ロック(1)】を使うと、多重ロック不可能。 $otherGuard = 2; $mylockOFF = 8; # 1 =共有ロック(他者の読み込みを許す) 2 =排他ロック(読み書き禁止) # 8 =ロック解除 # ◆flock検査を使って、「 1,2,4,8 」以外の値が表示されるサーバーでは、flock関数を使わない方が無難。 # ◆【 1 共有ロック】を設定しても、 # 現状の lockサブルーチン では、【flockロック】の場合は、競合プロセスは 同時に読めない。 # ◇理由◇: # “データfileに対する直接の 共有ロック”を行っておらず、 # 【ロックファイルを 上書きモードで開けるか?】によってロックの可否を判断し、 # 上書きモードで開けたら、flockで ロックファイルを共有ロックに設定する。 # 従って、 競合プロセスは、ロックファイルを読めても 上書きモードで開けないので、データfileを読めない。 # (改良の余地) # -------------------------------------- # ◆ ロックファイル名 とペア(組み)となる【サブルーチン戻り値変数】 $Sym_IP0_LK =0; $mini_IP0_LK =0; $Sym_0_LK =0; $mini_0_LK =0; $pwFile_pre_LK =0; $pwFile_LK =0; $Bigger_LK =0; $Sym_1i_LK =0; $mini_f_LK =0; $cokSrc_pre_LK =0; $mini_i_LK =0; $cokSrc_i_LK =0; $cokSrc_f_LK =0; $Sym_IP1_LK =0; $Sym_IP2_LK =0; $Sym_1_LK =0; $Sym_2_LK =0; $mini_IP1_LK =0; $mini_IP2_LK =0; $mini_1_LK =0; $mini_2_LK =0; # もし、使用するロックファイルの数を増やした場合は、↑ここに 【サブルーチン戻り値変数】の記述を追加する。 # (20もあれば足りるでしょう) # その場合は、 ALLUnLockサブルーチン の【numberList_of_array配列】に これ↑と同名の【戻り値変数】の名前を # 【numberList_of_array配列】の要素として 記述を追加する。 # -------------------------------------- # CGIスクリプト内で、chmodコマンドで【ファイルのパーミッション】を変更できるか? (サーバー次第。★変更できない場合の制御は“未完成”) # ↓ $permChg = 1; # → 0=変更できない 1=変更できる # ↓ 【呼び出し+書込み】モードの パーミッション(8進数・・・FTPツールで表示される値) $writeMODE = '0606'; # ↑ サーバーによっては、0666 にする必要あり。 $perWrMODEset = oct($writeMODE); # ↓ 【呼び出しだけ】モードの パーミッション(8進数・・・FTPツールで表示される値) $guard404MODE = '0404'; # ↑ サーバーによっては、0444 にする必要あり。 $perGuardMODEset = oct($guard404MODE); # /*-------------------- # 【最終パス発行/自動初期化の 年月日 + 分】から 何分以上 経過していたら、 # ↓ “パスワードIDを【自動発行】〜ファイル初期化 するか?・・・。 $how_min = 25; # ↑ ◆変更すると具合が悪い。inTopSureOpen.cgi の制御データ(inTop年月日時刻 記録ファイル)の 自動修復に影響する。 # # /*------00時00分〜23時59分 を 【0000分〜1439分】と認識し、記録/比較する。-------------- # ※日付変わりでは、1439から いきなり10000に増えるが問題なし。 # 【12月17日0408分】という認識のさせ方で記録/比較する。 # 年は “localtime関数で取得した年”をそのまま使う(2003年は 103年と認識)。 # 画面に表示するGIF画像 ↓ (1ドット画像。 このプログラムは【隠しCGI】だから。) $dummy_GIF = './images/dot_1.gif'; # “パスワードID自動初期化”のログを記録するか否か。(設定変更は不要。【yes】でも 144回に1回 初期化される。) # $pswLogRec = 'no'; $pswLogRec = 'yes'; $hatena_Log = './whenRefreshPSW/PSWrefreshRecLOG.cgi'; # ↑【“いつ パスワードIDファイルを自動初期化したか”〜の情報】+【文字列 initas】+【自動初期化時の“ID部分”】を記録。 #/*---------- ★【パスワードマネージャ】と記述を統一 ↓ 。 # パスワード/IDファイル【その0】 $pwd0file = '/export/hogehoge/mySight/download_dir/lzh_download/munyamunya1/pasword_1dir/htpasswd.cgi'; # パスワード/IDファイル【標準】 $pwdfile = '/export/hogehoge/mySight/download_dir/lzh_download/munyamunya2/pasword_2dir/htpasswd.cgi'; # パスワード/IDファイル【その2】 $pwd2file = '/export/hogehoge/mySight/download_dir/lzh_download/munyamunya3/pasword_3dir/htpasswd.cgi'; # ↓ 【パスワード発行の“最終 年月日 + 分”】を記録するファイル $lastRegistYearMin_file = '/export/members/hogehoge/mySight/cgi-bin/pswManage/pswRefreshRec/pswRefreshTimeRec.cgi'; # # ↑“本CGI”が参照し、一定時間以上を経過していたら、【パスワード/IDファイル】を“初期化”し、 # このファイルも更新する。 # ※【パスワード/IDファイル】の内容を 一定時間で 頻繁に変化させる目的。 # === 【inTopSureOpen.cgi】との連動 === # 【inTop年月日時刻 記録ファイル】 $YearDayHourRECfile = '/export/members/hogehoge/mySight/cgi-bin/freeDL_GO/inTopCookTimeREC/inTopDayTimeREC.cgi'; # inTopクッキー元本ファイル【A】 $rndCook_A_Sorcefile = '/export/members/hogehoge/mySight/cgi-bin/freeDL_GO/inTopCookSrcREC/inTop1_Cookie.cgi'; # inTopクッキー元本ファイル【B】 $rndCook_B_Sorcefile = '/export/members/hogehoge/mySight/cgi-bin/freeDL_GO/inTopCookSrcREC/inTop2_Cookie.cgi'; # inTopクッキー元本ファイル【C】 $rndCook_C_Sorcefile = '/export/members/hogehoge/mySight/cgi-bin/freeDL_GO/inTopCookSrcREC/inTop3_Cookie.cgi'; # inTopクッキー元本ファイル【D】 $rndCook_D_Sorcefile = '/export/members/hogehoge/mySight/cgi-bin/freeDL_GO/inTopCookSrcREC/inTop4_Cookie.cgi'; # inTopクッキー元本ファイル【E】 $rndCook_E_Sorcefile = '/export/members/hogehoge/mySight/cgi-bin/freeDL_GO/inTopCookSrcREC/inTop5_Cookie.cgi'; # 【inTop乱数パスワード A】の変数名は、【 $rndCookData_A 】 # ↑ inTopSureOpen.cgi が、【inTop乱数パスワードクッキー】に持たせるデータ。 # 【inTop乱数パスワード B】の変数名は、【 $rndCookData_B 】 # 【inTop乱数パスワード C】の変数名は、【 $rndCookData_C 】 # 【inTop乱数パスワード D】の変数名は、【 $rndCookData_D 】 # 【inTop乱数パスワード E】の変数名は、【 $rndCookData_E 】 # ★★ ============ 【fr1LoginCheck.cgi】との連動 ============ # 【fr1年月日時刻 記録ファイル】 $fr1YearDayHourRECfile = '/export/members/hogehoge/mySight/cgi-bin/frDownload/fr1CookTimeREC/fr1DayTimeREC.cgi'; # fr1クッキー元本ファイル【A】 $fr1rndCook_A_Sorcefile = '/export/members/hogehoge/mySight/cgi-bin/frDownload/fr1CookSrcREC/fr1_Cookie.cgi'; # fr1クッキー元本ファイル【B】 $fr1rndCook_B_Sorcefile = '/export/members/hogehoge/mySight/cgi-bin/frDownload/fr1CookSrcREC/fr2_Cookie.cgi'; # 【fr1乱数パスワード A】の変数名は、【 $fr1rndCookData_A 】 # ↑ fr1LoginCheck.cgi が、【fr1乱数パスワードクッキー】に持たせるデータ。 # 【fr1乱数パスワード B】の変数名は、【 $fr1rndCookData_B 】 # =============================== # IP記録ファイル $IPrecFile = './Rec_of_Analysis/IPrec.dat'; # 【アクセス_時刻分 記録ファイル】 $accessTimeMinFile = './Rec_of_Analysis/TimeRec.dat'; # ここまで初期設定 # #--------------------------------------------# # =============================== # ◆【ロック形式 初期値】の設定(通常設定) $SymYesNo = $lockkey ; $lockflag = 0 ; # ◆多重ロック処理で、$lockflagの値は 1か0ではなく、1プラスか1マイナスされる。 # -------------- $lockCount = 0 ; # ロック処理を行った“通算の回数” # -------------- # 【ファイルハンドル名】の初期文字列 $defHandle = 'LCK' ; $FileNumber = 0; # -------------- # 初期値 の設定 $Locked_File[0] = '' ; $Locked_Key[0] = 0 ; $Locked[0] = '' ; # =============================== # ↓ HTTP_REFERER(リンク元)を検査 ★★★ unlikeLinkCHK.plは公開しないので、無効にしてあります。 ★★★ # require './unlikeLinkCHK.pl'; # $dontLink = &unlikeLinkCHK::reffrerCHK(); # $dontLink = 戻り値( 1 は【拒否】。 0 は【許可】) # if ($dontLink == 1) { &pictureView; } # ◆このCGIの方針は、【拒否】した場合は、単に その後を実行しないだけ。 # ======== ★IP重複(上位3セット)と、【アクセス_時刻分】のチェック ★ ======== $addr = ''; $addr = $ENV{'REMOTE_ADDR'}; # IP取得 # (アクセスに時間差を発生させるために、先にIP取得) if ($addr eq "") { &pictureView; } @addrss = split(/\./, $addr); $addrs = "$addrss[0].$addrss[1].$addrss[2]"; # 訪問者のIPアドレスの“上位3セット分”を取得 $IPdata = $addrs; # 初期値 (Read失敗時の対策。or ロックビジー対策。) $defIP = '000.000.000'; # 初期値 # 外ロック開始 $SymYesNo = $SymUsable; # ← ◆symlinkロック(2)を指定できる。 $Sym_IP0_LK = &lock($otherGuard, $Sym_IP0_lockfile); $SymYesNo = $lockkey; # ← ◆symlink指定を解除。 if ($Sym_IP0_LK == 0) { &pictureView; } # ← ◆ロック失敗 # 内ロック開始 $mini_IP0_LK = &lock($otherGuard, $mini_IP0_lockfile); if ($mini_IP0_LK == 0) { &pictureView; } # ← ◆ロック失敗 # ($nowDayTime_min と $nowMin を取得) &nowDayTimeMin_nowMin; # 【アクセス_時刻分 記録ファイル】が存在しなければ、 初期ファイルを作成 unless (-e $accessTimeMinFile) { &make_DefaultFile($accessTimeMinFile,$nowMin); chmod $perGuardMODEset, "$accessTimeMinFile"; } # 【アクセス_時刻分 記録ファイル】を読めない属性なら、 【呼び出しだけ】モードにする。 unless (-r $accessTimeMinFile) { chmod $perGuardMODEset, "$accessTimeMinFile"; } $recTimeMin = $nowMin + 1 ; # ファイルを読めなかった場合の対策 # 【アクセス_時刻分 記録ファイル】から読み込み if(open(IN,"$accessTimeMinFile")){ $recTimeMin = ; close(IN); } $recTimeMin = $recTimeMin + 0; # 読んだデータの文字化け(ファイル破損)の対策 # ◆1分未満の連続アクセスを排除。(アクセス毎の【時刻分 記録ファイル】と アクセス_時刻分が一致したら終了) if ($nowMin != $recTimeMin) { require './sclrDataSave.pl'; $wrMode = 'new'; # (上書きモード) $err = &sclrDataSave::sData_save($accessTimeMinFile, $nowMin, $wrMode, 0, 0); } else { &pictureView; } # 【IP記録ファイル】が存在しなければ、 初期ファイルを作成 unless (-e $IPrecFile) { &make_DefaultFile($IPrecFile,$defIP); chmod $perGuardMODEset, "$IPrecFile"; } # ◆不特定な時間帯に、【IP記録ファイル】を 強制的に 上書き更新。(ファイル破損の対策) # (10分間) # ◇【 sData_save上書きモード指定】の場合は、書込み対象ファイル が読めない属性か否かは 関係なし。 require './sclrDataSave.pl'; # ◆◆◆【書込ロックライブラリ】の読み込み ◆◆◆ # (1439-11=1428) $ForTime = &Rand_TIMEs(1428); $ToTime = $ForTime + 11 ; if ($nowMin > $ForTime && $nowMin < $ToTime) { $ip_check = 0; # $IPdata = $addrs; $wrMode = 'new'; # (上書きモード) $err = &sclrDataSave::sData_save($IPrecFile, $IPdata, $wrMode, 0, 0); if ($err ne ""){ &Errors; } } else { $ip_check = 1; } if ($ip_check == 1) { # 【IP記録ファイル】を読めない属性なら、 【呼び出しだけ】モードにする。 unless (-r $IPrecFile) { chmod $perGuardMODEset, "$IPrecFile"; } # 【IP記録ファイル】から読み込み if(open(IN,"$IPrecFile")){ $IPdata = ; close(IN); } # IP重複のチェック (◆ ロック解除ずみ・・画像表示、終了。) if ($addrs eq $IPdata) { &pictureView; } # ◆ビジー状態で【IP記録ファイル】を読めなかった時も、“$addrs = $IPdata”となり、終了。 # 【IP記録ファイル】を更新する $IPdata = $addrs; $wrMode = 'new'; # (上書きモード) $err = &sclrDataSave::sData_save($IPrecFile, $IPdata, $wrMode, 0, 0); if ($err ne ""){ &Errors; } } # 内ロック解除 &unlock($mylockOFF, $mini_IP0_LK); # 外ロック解除 $SymYesNo = $SymUsable; # ← ◆symlinkロック解除を指定。 &unlock($mylockOFF, $Sym_IP0_LK); $SymYesNo = $lockkey; # ← ◆symlink指定を解除。 # ============ ★IP重複チェック 完了 ★ ============ # 引数を解釈 $param = $ENV{'QUERY_STRING'}; # ★★★ メイン処理 開始 ★★★ if ($param eq "") { &hiddenMain; exit; } else { &pictureView; } # 【引数】は 不許可。・・・ と言うよりも、これは 構文上の“ダミー処理”。 # ========= ★現在の“年月日 + 分”の数値を生成 ★ ========= sub nowDayTimeMin_nowMin { ($sec,$min,$hour,$day,$mon,$year,$wday) = localtime(time); $mon++; $mon = "0$mon" if $mon < 10; $day = "0$day" if $day < 10; $min = $hour * 60 + $min; if ($min < 10) {$min = "000$min";} elsif ($min < 100) {$min = "00$min";} elsif ($min < 1000) {$min = "0$min";} $tmpMin = "$year$mon$day$min"; $nowMin = $min + 0; # ↓ ★現在の“年月日 + 分”。(【+ 0】の部分は、数値変数として確実に認識させるため。) $nowDayTime_min = $tmpMin + 0; } # ======================================= # ========= ★現在の“年月日時刻”の文字列を生成 ★ ========= sub nowTime_YearDayHour { ($sec,$min,$hour,$day,$mon,$year,$wday) = localtime(time); $mon++; $mon = "0$mon" if $mon < 10; $day = "0$day" if $day < 10; $hour= "0$hour" if $hour < 10; # ↓ ★現在の“年月日時刻”。103120604 の形式。( 9ケタ。103年12月06日04時) $YearDayHour = "$year$mon$day$hour"; $nowTime = $YearDayHour; } # ========================================= # ========================================= # ★ 偽装_処理 メイン ★ # #----------------------------------------# sub hiddenMain { # 【最終パス発行 年月日 + 分 記録ファイル】をチェック。 # 外ロック開始 $SymYesNo = $SymUsable; # ← ◆symlinkロックを指定できる。 $Sym_0_LK = &lock($otherGuard, $Sym_0_lockfile); $SymYesNo = $lockkey; # ← ◆symlink指定を解除。 if ($Sym_0_LK == 0) { &pictureView; } # ← ◆ロック失敗 # 現在の年月日分を判定。($nowDayTime_min と $nowMin を取得) &nowDayTimeMin_nowMin; # 内ロック開始 $mini_0_LK = &lock($otherGuard, $mini_0_lockfile); if ($mini_0_LK == 0) { &pictureView; } # ← ◆ロック失敗 # 【最終パス発行 年月日 + 分 記録ファイル】が存在しなければ、初期ファイルを作成 unless (-e $lastRegistYearMin_file) { &make_DefaultFile($lastRegistYearMin_file,$nowDayTime_min); chmod $perGuardMODEset, "$lastRegistYearMin_file"; } # ◆不特定な時間帯に、【最終パス発行 年月日 + 分 記録ファイル】を 強制的に 上書き更新〜終了。(ファイル破損の対策) # (20分間) # ◇【 sData_save上書きモード指定】の場合は、書込み対象ファイル が読めない属性か否かは 関係なし。 # (1439-21=1418) $ForTime = &Rand_TIMEs(1418); $ToTime = $ForTime + 21 ; if ($nowMin > $ForTime && $nowMin < $ToTime) { $wrMode = 'new'; # (上書きモード) $err = &sclrDataSave::sData_save($lastRegistYearMin_file, $nowDayTime_min, $wrMode, 0, 0); &pictureView; } # 【最終パス発行 年月日 + 分 記録ファイル】を読めない属性なら、 【呼び出しだけ】モードにする。 unless (-r $lastRegistYearMin_file) { chmod $perGuardMODEset, "$lastRegistYearMin_file"; } $Rec_accsess_min = $nowDayTime_min + 0; # 初期値 (Read失敗時の対策。 $IPdata と同様) # 【最終パス発行 年月日 + 分 記録ファイル】を読みこむ if(open(IN,"$lastRegistYearMin_file")){ $Rec_accsess_min = ; close(IN); } # ===================================== # ◇ここまでが、同時・集中アクセスを防ぐ“山場” $Rec_accsess_min = $Rec_accsess_min + 0; # ===================================== # 【最終パス発行人の 年月日 + 分】より 現在が 26分($how_min)以上“あと”であれば、 # # 1.【最終パス発行 年月日 + 分 記録ファイル】を最初に更新する。 # # 2.“パスワードIDを【自動発行】〜ファイル初期化〜上書きで書き込み” # # 3.【inTopクッキー元本ファイル】と【fr1クッキー元本ファイル】 も、検査。 $how_min = $how_min + 0; $pastRec_min = $Rec_accsess_min + $how_min + 0; if ($nowDayTime_min > $pastRec_min) { # 外ロック開始 $pwFile_pre_LK = &lock($otherGuard, $pwFile_pre_lockfile); if ($pwFile_pre_LK == 0) { &pictureView; } # ← ◆ロック失敗 # 内ロック開始 $pwFile_LK = &lock($otherGuard, $pwFile_lockfile); if ($pwFile_LK == 0) { &pictureView; } # ← ◆ロック失敗 # ============ # ID/パスワード を設定。 @char = (0 .. 9, 'a' .. 'z', 'A' .. 'Z'); # ID自動発行・・・実際には8桁で処理していません(以下 同様)。 $id=""; srand; foreach (1 .. 8) { $id .= $char[int(rand(@char))]; } $id = "A$id"; # パス自動発行 $pw=""; srand; foreach (1 .. 8) { $pw .= $char[int(rand(@char))]; } # 暗号化 ★暗号処理はお見せできません。 MyEncrypt に代わるサブルーチンを ネットで入手して下さい。 $pw2 = $pw # $pw2 = &MyEncrypt($pw); # ← 暗号化サブルーチンは、“無効”にしてあります。 # ============ # 【パスワード/IDファイル】が存在しなければ、パス/IDの初期ファイルを作成 unless (-e $pwdfile) { $idpw2 = "$id:$pw2\n"; &make_DefaultFile($pwdfile,$idpw2); chmod $perGuardMODEset, "$pwdfile"; } unless (-e $pwd0file) { $idpw2 = "$id:$pw2\n"; &make_DefaultFile($pwd0file,$idpw2); chmod $perGuardMODEset, "$pwd0file"; } unless (-e $pwd2file) { $idpw2 = "$id:$pw2\n"; &make_DefaultFile($pwd2file,$idpw2); chmod $perGuardMODEset, "$pwd2file"; } # 念のため、パスワードファイル自身の“更新時刻”を確認する。 # パスワード/IDファイルが 更新されて25分以内の新しい物であれば、終了。 $pw_mtime = (stat($pwdfile))[9]; if ($pw_mtime && $pw_mtime > time - $how_min * 60) { &pictureView; } # 【最終パス発行 年月日 + 分 記録ファイル】を 上書き更新。 &nowDayTimeMin_nowMin; # $nowDayTime_min と $nowMin を取得 $wrMode = 'new'; $err = &sclrDataSave::sData_save($lastRegistYearMin_file, $nowDayTime_min, $wrMode, 0, 0); if ($err ne ""){ &Errors; } # ===== 【最終パス発行 年月日 + 分 記録ファイル】の更新を完了。 # ======================= # パスワードファイルを初期化する。 # 【パスワード/IDファイル】を読めない属性なら、 【呼び出しだけ】モードにする。 unless (-r $pwdfile) { chmod $perGuardMODEset, "$pwdfile"; } unless (-r $pwd0file) { chmod $perGuardMODEset, "$pwd0file"; } unless (-r $pwd2file) { chmod $perGuardMODEset, "$pwd2file"; } $writeData = "$id:$pw2\n"; $wrMode = 'new'; # パスワード/IDファイル【標準】 上書き $err = &sclrDataSave::sData_save($pwdfile, $writeData, $wrMode, 0, 0); if ($err ne ""){ &Errors; } # パスワード/IDファイル【その0】 上書き $err = &sclrDataSave::sData_save($pwd0file, $writeData, $wrMode, 0, 0); if ($err ne ""){ &Errors; } # パスワード/IDファイル【その2】 上書き $err = &sclrDataSave::sData_save($pwd2file, $writeData, $wrMode, 0, 0); if ($err ne ""){ &Errors; } # 内ロック解除 &unlock($mylockOFF, $pwFile_LK); # 外ロック解除 &unlock($mylockOFF, $pwFile_pre_LK); # 【“いつ パスワードIDファイルを自動初期化したか”〜の情報】+【文字列 initas】+【自動初期化時の“ID部分”】 # を記録。 if($pswLogRec eq 'yes'){ # ロック開始 $Bigger_LK = &lock($otherGuard, $Bigger_lockfile); if ($Bigger_LK == 0) { &pictureView; } # ← ◆ロック失敗 $hatena_data = "$nowDayTime_min:initas:$id\n"; # もし 記録ファイルが存在しなければ、初期ファイルを作成 unless (-e $hatena_Log) { &make_DefaultFile($hatena_Log,$hatena_data); } # 記録ファイルを読めない属性なら、 【呼び出しだけ】モードにする。 unless (-r $hatena_Log) { chmod $perGuardMODEset, "$hatena_Log"; } $wrMode = 'add'; $err = &sclrDataSave::sData_save($hatena_Log, $hatena_data, $wrMode, 0, 0); if ($err ne ""){ &Errors; } # ロック解除 &unlock($mylockOFF, $Bigger_LK); } # ★★ ============ ★ 【inTopSureOpen.cgi】 との連動 ★ ========= # ★★ ============ ★ 【fr1LoginCheck.cgi】との連動 ★ ========= # 外ロック開始 $SymYesNo = $SymUsable; # ← ◆symlinkロック(2)を指定できる。 $Sym_1i_LK = &lock($otherGuard, $Sym_1i_lockfile); $SymYesNo = $lockkey; # ← ◆symlink指定を解除。 if ($Sym_1i_LK == 0) { &pictureView; } # ← ◆ロック失敗 # 内ロック開始 $mini_i_LK = &lock($otherGuard, $mini_i_lockfile); if ($mini_i_LK == 0) { &pictureView; } # ← ◆ロック失敗 # 内ロック開始 $mini_f_LK = &lock($otherGuard, $mini_f_lockfile); if ($mini_f_LK == 0) { &pictureView; } # ← ◆ロック失敗 # ======================================= # ★現在の“年月日時刻” を取得。(文字列) &nowTime_YearDayHour; # 【グローバル変数】で、 $nowTime と $YearDayHour を取得。 103120604 の形式。( 9ケタ。103年12月06日04時) # ============================ # ◆先頭部のチェックのおかげで、 # ここへ来た時は、すでに “25分に1回”の処理である。(前回アクセスの26分以上 あと。) # 【inTop年月日時刻 記録ファイル】が存在しなければ、現在の時刻で 初期ファイルを作成 unless (-e $YearDayHourRECfile) { &make_DefaultFile($YearDayHourRECfile,$nowTime); chmod $perGuardMODEset, "$YearDayHourRECfile"; } # 【fr1年月日時刻 記録ファイル】が存在しなければ、現在の時刻で 初期ファイルを作成 unless (-e $fr1YearDayHourRECfile) { &make_DefaultFile($fr1YearDayHourRECfile,$nowTime); chmod $perGuardMODEset, "$fr1YearDayHourRECfile"; } # 不特定な時間帯に、【inTop年月日時刻 記録ファイル】と【fr1年月日時刻 記録ファイル】を 強制的に 上書き更新〜終了。 # (35分間) # ◇ファイル破損の対策。 inTopSureOpen.cgi の防波堤ファイルでもある。 # (1439-36=1403) $ForTime = &Rand_TIMEs(1403); $ToTime = $ForTime + 36 ; &nowDayTimeMin_nowMin; # $nowDayTime_min と $nowMin を取得 if ($nowMin > $ForTime && $nowMin < $ToTime) { require './sclrDataSave.pl'; # ← ◆書込ロックライブラリ の読み込み。 # 【inTop年月日時刻 記録ファイル】を上書きする $wrMode = 'new'; $err = &sclrDataSave::sData_save($YearDayHourRECfile, $nowTime, $wrMode, 0, 0); # 【fr1年月日時刻 記録ファイル】を上書きする $wrMode = 'new'; $err = &sclrDataSave::sData_save($fr1YearDayHourRECfile, $nowTime, $wrMode, 0, 0); &pictureView; } # 【inTop年月日時刻 記録ファイル】を読めない属性なら、 【呼び出しだけ】モードにする。 unless (-r $YearDayHourRECfile) { chmod $perGuardMODEset, "$YearDayHourRECfile"; } # $nowTime と $YearDayHour を取得(文字列) &nowTime_YearDayHour; $RecTime = "1$nowTime"; # ◆初期値 (Read失敗時の対策。 inTopSureOpen.cgi と違う。) # ◆【inTopの 年月日時刻】の記録ファイル用。 # 【ビジー状態】で データを読めなかった時は、 $nowTime と $RecTime($fr1RecTime) が 異なる値。 # (“時刻 変わり”を認識する) # その場合、【inTop年月日時刻 記録ファイル】・【fr1年月日時刻 記録ファイル】を上書きする。 # その場合、 【inTopクッキー元本ファイル】・【fr1クッキー元本ファイル】を更新する。 # (このCGIは、どんな場合も【クッキー送信】しない。) # ◆【inTop年月日時刻 記録ファイル】を読みこむ if(open(IN,"$YearDayHourRECfile")){ $RecTime = ; close(IN); } # ◇“時刻 変わり”を認識したら、【inTop年月日時刻 記録ファイル】を更新して フラッグを立てる。 if ($nowTime ne $RecTime) { require './sclrDataSave.pl'; # ← ◆書込ロックライブラリ の読み込み。 # 【inTop年月日時刻 記録ファイル】を上書きする (“時刻 変わり”を認識) $wrMode = 'new'; $err = &sclrDataSave::sData_save($YearDayHourRECfile, $nowTime, $wrMode, 0, 0); if ($err ne ""){ &Errors; } $YearDayHourfileNEW = 1; # 【時刻 変わり】と【inTop年月日時刻 記録ファイル更新】のフラッグ } else { $YearDayHourfileNEW = 0; } $fr1RecTime = "2$nowTime"; # ◆初期値 (Read失敗時の対策。 fr1LoginCheck.cgi と違う。) # ◆【fr1年月日時刻】の記録ファイル用。 # 【fr1年月日時刻 記録ファイル】を読めない属性なら、 【呼び出しだけ】モードにする。 unless (-r $fr1YearDayHourRECfile) { chmod $perGuardMODEset, "$fr1YearDayHourRECfile"; } # 【fr1年月日時刻 記録ファイル】を読みこむ if(open(IN,"$fr1YearDayHourRECfile")){ $fr1RecTime = ; close(IN); } # ◇“時刻 変わり”を認識したら、【fr1年月日時刻 記録ファイル】を更新して フラッグを立てる。 &nowTime_YearDayHour; # $nowTime と $YearDayHour を取得(文字列) if ($nowTime ne $fr1RecTime) { require './sclrDataSave.pl'; # ← ◆書込ロックライブラリ の読み込み。 # 【fr1年月日時刻 記録ファイル】を上書きする (“時刻 変わり”を認識) $wrMode = 'new'; $err = &sclrDataSave::sData_save($fr1YearDayHourRECfile, $nowTime, $wrMode, 0, 0); if ($err ne ""){ &Errors; } $fr1YearDayHourfileNEW = 1; # 【時刻 変わり】と【fr1年月日時刻 記録ファイル更新】のフラッグ } else { $fr1YearDayHourfileNEW = 0; } # 内ロック解除 &unlock($mylockOFF, $mini_f_LK); # 内ロック解除 &unlock($mylockOFF, $mini_i_LK); # 外ロック解除 $SymYesNo = $SymUsable; # ← ◆symlinkロック解除を指定。 &unlock($mylockOFF, $Sym_1i_LK); $SymYesNo = $lockkey; # ← ◆symlink指定を解除。 # ===================================== # 外ロック開始 $cokSrc_pre_LK = &lock($otherGuard, $cokSrc_pre_lockfile); if ($cokSrc_pre_LK == 0) { &pictureView; } # ← ◆ロック失敗 # 内ロック開始 $cokSrc_i_LK = &lock($otherGuard, $cokSrc_i_lockfile); if ($cokSrc_i_LK == 0) { &pictureView; } # ← ◆ロック失敗 # 内ロック開始 $cokSrc_f_LK = &lock($otherGuard, $cokSrc_f_lockfile); if ($cokSrc_f_LK == 0) { &pictureView; } # ← ◆ロック失敗 if ((!-e $rndCook_A_Sorcefile) || (!-e $rndCook_B_Sorcefile) || (!-e $rndCook_C_Sorcefile) || (!-e $rndCook_D_Sorcefile) || (!-e $rndCook_E_Sorcefile)) { $cookSrcFileExist = 0; } else { $cookSrcFileExist = 1; } if ((!-e $fr1rndCook_A_Sorcefile) || (!-e $fr1rndCook_B_Sorcefile)) { $fr1cookSrcFileExist = 0; } else { $fr1cookSrcFileExist = 1; } if (($YearDayHourfileNEW == 1) || ($cookSrcFileExist != 1)) { # ◇“時刻 変わり”を認識・・もしくは、【inTopクッキー元本ファイル】が存在しない。 # A・B・C・D・E 5個の【乱数パスワード】を発行。 &nowTime_YearDayHour; # $nowTime と $YearDayHour を取得(文字列) @char = (0 .. 9, 'a' .. 'z', 'A' .. 'Z'); $pw_A=""; srand; foreach (1 .. 8) { $pw_A .= $char[int(rand(@char))]; } $pw_A = "$YearDayHour$pw_A"; # $pw_A は 【 年月日時刻 + 乱数文字列】・・ 以下、B〜Eも同様。 $pw_B=""; srand; foreach (1 .. 8) { $pw_B .= $char[int(rand(@char))]; } $pw_B = "$YearDayHour$pw_B"; $pw_C=""; srand; foreach (1 .. 8) { $pw_C .= $char[int(rand(@char))]; } $pw_C = "$YearDayHour$pw_C"; $pw_D=""; srand; foreach (1 .. 8) { $pw_D .= $char[int(rand(@char))]; } $pw_D = "$YearDayHour$pw_D"; $pw_E=""; srand; foreach (1 .. 8) { $pw_E .= $char[int(rand(@char))]; } $pw_E = "$YearDayHour$pw_E"; } if (($fr1YearDayHourfileNEW == 1) || ($fr1cookSrcFileExist != 1)) { # ◇“時刻 変わり”を認識・・もしくは、【fr1クッキー元本ファイル】が存在しない。 # A・B 2個の【乱数パスワード】を発行。 &nowTime_YearDayHour; # $nowTime と $YearDayHour を取得(文字列) @char = (0 .. 9, 'a' .. 'z', 'A' .. 'Z'); $pw_A_fr1=""; srand; foreach (1 .. 8) { $pw_A_fr1 .= $char[int(rand(@char))]; } $pw_A_fr1 = "$YearDayHour$pw_A_fr1"; # $pw_A_fr1 は 【 年月日時刻 + 乱数文字列】・・ Bも同様。 $pw_B_fr1=""; srand; foreach (1 .. 8) { $pw_B_fr1 .= $char[int(rand(@char))]; } $pw_B_fr1 = "$YearDayHour$pw_B_fr1"; } # 【inTopクッキー元本ファイル】が存在しなければ、 初期ファイルを作成 (【A】〜【E】) unless (-e $rndCook_A_Sorcefile) { &make_DefaultFile($rndCook_A_Sorcefile,$pw_A); chmod $perGuardMODEset, "$rndCook_A_Sorcefile"; } unless (-e $rndCook_B_Sorcefile) { &make_DefaultFile($rndCook_B_Sorcefile,$pw_B); chmod $perGuardMODEset, "$rndCook_B_Sorcefile"; } unless (-e $rndCook_C_Sorcefile) { &make_DefaultFile($rndCook_C_Sorcefile,$pw_C); chmod $perGuardMODEset, "$rndCook_C_Sorcefile"; } unless (-e $rndCook_D_Sorcefile) { &make_DefaultFile($rndCook_D_Sorcefile,$pw_D); chmod $perGuardMODEset, "$rndCook_D_Sorcefile"; } unless (-e $rndCook_E_Sorcefile) { &make_DefaultFile($rndCook_E_Sorcefile,$pw_E); chmod $perGuardMODEset, "$rndCook_E_Sorcefile"; } # 【fr1クッキー元本ファイル】が存在しなければ、 初期ファイルを作成 (【A・B】) unless (-e $fr1rndCook_A_Sorcefile) { &make_DefaultFile($fr1rndCook_A_Sorcefile,$pw_A_fr1); chmod $perGuardMODEset, "$fr1rndCook_A_Sorcefile"; } unless (-e $fr1rndCook_B_Sorcefile) { &make_DefaultFile($fr1rndCook_B_Sorcefile,$pw_B_fr1); chmod $perGuardMODEset, "$fr1rndCook_B_Sorcefile"; } # 【inTopクッキー元本ファイル】を読めない属性なら、 【呼び出しだけ】モードにする。 unless (-r $rndCook_A_Sorcefile) { chmod $perGuardMODEset, "$rndCook_A_Sorcefile"; } unless (-r $rndCook_B_Sorcefile) { chmod $perGuardMODEset, "$rndCook_B_Sorcefile"; } unless (-r $rndCook_C_Sorcefile) { chmod $perGuardMODEset, "$rndCook_C_Sorcefile"; } unless (-r $rndCook_D_Sorcefile) { chmod $perGuardMODEset, "$rndCook_D_Sorcefile"; } unless (-r $rndCook_E_Sorcefile) { chmod $perGuardMODEset, "$rndCook_E_Sorcefile"; } # 【fr1クッキー元本ファイル】を読めない属性なら、 【呼び出しだけ】モードにする。 unless (-r $fr1rndCook_A_Sorcefile) { chmod $perGuardMODEset, "$fr1rndCook_A_Sorcefile"; } unless (-r $fr1rndCook_B_Sorcefile) { chmod $perGuardMODEset, "$fr1rndCook_B_Sorcefile"; } # ===================================== if ($YearDayHourfileNEW == 1) { # ◇“時刻 変わり”の認識。 # A・B・C・D・E 5個の【inTopクッキー元本ファイル】を更新。 # ファイルから A〜Dを読み込んだ後、 # DをEに代入コピーし、CをDに代入コピーし、BをCに代入コピーし、AをBに代入コピーする。 # # Aについては、新規の【年月日時刻 + 乱数文字列】を代入し、ファイルに上書きする。 # A〜E 全部 ファイルに上書きする。 if(open(IN,"$rndCook_A_Sorcefile")){ $rndCookData_A = ; close(IN); } if(open(IN,"$rndCook_B_Sorcefile")){ $rndCookData_B = ; close(IN); } if(open(IN,"$rndCook_C_Sorcefile")){ $rndCookData_C = ; close(IN); } if(open(IN,"$rndCook_D_Sorcefile")){ $rndCookData_D = ; close(IN); } # $rndCookData_A は、【inTop乱数パスワードクッキー】に持たせるデータ。 $rndCookData_E = $rndCookData_D; $rndCookData_D = $rndCookData_C; $rndCookData_C = $rndCookData_B; $rndCookData_B = $rndCookData_A; $rndCookData_A = $pw_A; # A・B・C・D・E 5個の【inTopクッキー元本ファイル】を上書きする require './sclrDataSave.pl'; # ← ◆書込ロックライブラリ $wrMode = 'new'; $err = &sclrDataSave::sData_save($rndCook_A_Sorcefile, $rndCookData_A, $wrMode, 0, 0); if ($err ne ""){ &Errors; } $err = &sclrDataSave::sData_save($rndCook_B_Sorcefile, $rndCookData_B, $wrMode, 0, 0); if ($err ne ""){ &Errors; } $err = &sclrDataSave::sData_save($rndCook_C_Sorcefile, $rndCookData_C, $wrMode, 0, 0); if ($err ne ""){ &Errors; } $err = &sclrDataSave::sData_save($rndCook_D_Sorcefile, $rndCookData_D, $wrMode, 0, 0); if ($err ne ""){ &Errors; } $err = &sclrDataSave::sData_save($rndCook_E_Sorcefile, $rndCookData_E, $wrMode, 0, 0); if ($err ne ""){ &Errors; } } # ==================================== if ($fr1YearDayHourfileNEW == 1) { # ◇“時刻 変わり”の認識。 # A・B 2個の【fr1クッキー元本ファイル】を更新。 # ファイルから Aを読み込んだ後、、AをBに代入コピーする。 # Aについては、新規の【fr1年月日時刻 + 乱数文字列】を代入し、ファイルに上書きする。 if(open(IN,"$fr1rndCook_A_Sorcefile")){ $fr1rndCookData_A = ; close(IN); } # $fr1rndCookData_A は、【fr1乱数パスワードクッキー】に持たせるデータ。 $fr1rndCookData_B = $fr1rndCookData_A; $fr1rndCookData_A = $pw_A_fr1; # A・B 2個の【fr1クッキー元本ファイル】を上書きする require './sclrDataSave.pl'; # ← ◆書込ロックライブラリ $wrMode = 'new'; $err = &sclrDataSave::sData_save($fr1rndCook_A_Sorcefile, $fr1rndCookData_A, $wrMode, 0, 0); if ($err ne ""){ &Errors; } $err = &sclrDataSave::sData_save($fr1rndCook_B_Sorcefile, $fr1rndCookData_B, $wrMode, 0, 0); if ($err ne ""){ &Errors; } } # 内ロック解除 &unlock($mylockOFF, $cokSrc_f_LK); # 内ロック解除 &unlock($mylockOFF, $cokSrc_i_LK); # 外ロック解除 &unlock($mylockOFF, $cokSrc_pre_LK); # ★ ======================================== ★ # ★ ======================================== ★ } # ◆【最終パス発行人の 年月日 + 分】より 現在が 26分以上“後”・・ の処理、 終了。 # 重要な記録ファイルではないので、不定期に初期化(10分間。ファイルの肥大化を防止) # (1439-11=1428) $ForTime = &Rand_TIMEs(1428); $ToTime = $ForTime + 11 ; if ($nowMin > $ForTime && $nowMin < $ToTime) { # ロック開始 $Bigger_LK = &lock($otherGuard, $Bigger_lockfile); if ($Bigger_LK == 0) { &pictureView; } # ← ◆ロック失敗 $hatena_data = "init or cleared at : $nowDayTime_min\n"; # もし 記録ファイルが存在しなければ、初期ファイルを作成 unless (-e $hatena_Log) { &make_DefaultFile($hatena_Log,$hatena_data); } $wrMode = 'new'; # (上書きモード) $err = &sclrDataSave::sData_save($hatena_Log, $hatena_data, $wrMode, 0, 0); # ロック解除 &unlock($mylockOFF, $Bigger_LK); } # 内ロック解除 &unlock($mylockOFF, $mini_0_LK); # 外ロック解除 $SymYesNo = $SymUsable; # ← ◆symlinkロック解除を指定。 &unlock($mylockOFF, $Sym_0_LK); $SymYesNo = $lockkey; # ← ◆symlink指定を解除。 &pictureView; } # ================================================ #/*---------------- サブルーチン -----------------*/ #-----------------# # 1 〜 引数値(4桁)までの乱数数値を発生。⇒【戻り値】 sub Rand_TIMEs { my($MaxSEC) = $_[0]; $MaxSEC = $MaxSEC + 0; if ($MaxSEC < 1) { $MaxSEC = 1; } my(@char) = (0 .. 9); my($Rsec) = ''; srand; foreach (1 .. 4) { $Rsec .= $char[int(rand(@char))]; } my($Wsec) = ($Rsec % $MaxSEC) + 1 ; # a % b (【a 割る b】 の余り)。 return $Wsec ; } #-----------------# # GIF画像を画面に表示。 (1ドットの画像を表示させるだけ。 下の /bin/cat のパス部分は、サーバーによって異なる。) # sub pictureView { if ($lockflag != 0) { &ALLUnLock; } undef @Locked_File; print "Content-type: image/gif\n\n"; $dummy_image = `/bin/cat $dummy_GIF`; print "$dummy_image"; exit; } # ===================================== # # ◆ロック処理 # $LockAction …… ロックアクションモード・・【第1引数(flock用)】 # $LockingFile …… ロックファイル名・・・・・【第2引数】 # # ◆【戻り値】: # ロック出来なかった場合は、ゼロ(0) # ロック出来た場合は、 ロックした時の 【ロック処理履歴・情報-配列 の 添字ナンバー($lockCount)】(「何回目のロック処理か?」の値) # # ※【配列の特徴】: 同じロックfileでも、 成功すれば 単純に 情報を格納する(繰り返して)。 # $lockCountは ロックした通算回数。 # 【戻り値 $LockNumber】は、その時のロック処理が何回目であるか・・の数値。 # # ※戻り先で、 # 各々のロックfile専用変数 ↓ に、【そのロックfileを最後にロックした時の“添字ナンバー”】として # $Sym_IP0_LK などに代入する。 # ◇エラー時は、$Sym_IP0_LK 〜 $cokSrc_f_LK 等が、それぞれの 【戻り値 $LockNumber】の最新_添字ナンバーを保有。 # # # $LockHandle[$lockCount] …… ロックファイルの【ファイルハンドル(flock用)】 # # ↑ ファイルハンドルへのリファランス・・・(【作成したファイルハンドルの“型グロブ”】へのポインタ) # が代入され、保有する(flockロック成功時)。 sub lock { my $LockKey = $SymYesNo ; $lockbusy = 1; local ($LockAction) = $_[0]; local ($LockingFile) = $_[1]; # 180秒以上 古いロックなら削除(symlink・mkdirの場合) # ◆外部アクセスの処理では、時間を長く確保。 if (($LockKey != 1) && (-e $LockingFile)) { local($mtime) = (stat($LockingFile))[9]; if ($mtime && $mtime < time - 180) { if ($LockKey == 2) { unlink($LockingFile); } else { rmdir($LockingFile); } } } # ◆ flockでは、ロック中にプロセスがダウンしても自動的にロック解除される。 # 【ファイルハンドル名】を生成 (flock用) $FileNumber++; $NewHandle = "$defHandle$FileNumber" ; # LockBlockは ラベル LockBlock: { local($cnt) ; for ($cnt = 1; $cnt < 4; $cnt++) { if ($LockKey == 1) { # flockで ロック if (open($NewHandle, ">$LockingFile")) { if (flock($NewHandle, $LockAction)) { $lockflag++; $lockCount++; $Locked_File[$lockCount] = $LockingFile ; $Locked_Key[$lockCount] = $LockKey ; $Locked[$lockCount] = 'yes' ; $LockHandle[$lockCount] = \*$NewHandle ; #【型グロブへのリファランス】を代入。 $lockbusy = 0 ; last LockBlock; } else { close($NewHandle) ; sleep(1); } # ← flock出来ない場合 } else { sleep(1); next; } # ← open出来ない場合 (他のプロセスがロック中) } elsif ($LockKey == 2) { # symlinkで ロック if (symlink(".", $LockingFile)) { $lockflag++; $lockCount++; $Locked_File[$lockCount] = $LockingFile ; $Locked_Key[$lockCount] = $LockKey ; $Locked[$lockCount] = 'yes' ; $lockbusy = 0 ; last LockBlock; } else { sleep(1); next; } } else { # mkdirで ロック if (mkdir($LockingFile, 0755)) { $lockflag++; $lockCount++; $Locked_File[$lockCount] = $LockingFile ; $Locked_Key[$lockCount] = $LockKey ; $Locked[$lockCount] = 'yes' ; $lockbusy = 0 ; last LockBlock; } else { sleep(1); } } } } if ($lockbusy == 0) { $LockNumber = $lockCount ; } else { $LockNumber = 0 ; } return $LockNumber ; } # ===================================== # # ◆ロックを解除 # $unlockAction …【第1引数】・・ ロックアクションモード(flock用) # $unLockNumber …【第2引数】・・ ロック解除すべきロックファイルの、【ロック処理履歴・情報-配列 の 添字ナンバー】(「何回目のロック処理か?」の値) # # # $LockHandle[$unLockNumber] …… ロックファイルの【ファイルハンドル(flock用)】 # $Locked_File[$unLockNumber] …… ロックファイル # sub unlock { my $LockKey = $SymYesNo ; local ($unlockAction) = $_[0]; local ($unLockNumber) = $_[1]; if (($lockflag != 0) && ($Locked_File[$unLockNumber] ne '') && ($Locked[$unLockNumber] eq 'yes')) { if ($LockKey == 1) { flock($LockHandle[$unLockNumber], $unlockAction) ; close($LockHandle[$unLockNumber]) ; $lockflag--; $Locked[$unLockNumber] = 'free' ; # ロック解除の目印 } elsif ($LockKey == 2) { if (-e $Locked_File[$unLockNumber]) {unlink($Locked_File[$unLockNumber]) ;} $lockflag--; $Locked[$unLockNumber] = 'free' ; # ロック解除の目印 } else { if (-e $Locked_File[$unLockNumber]) {rmdir($Locked_File[$unLockNumber]) ;} $lockflag--; $Locked[$unLockNumber] = 'free' ; # ロック解除の目印 } } } # ===================================== # # ◆終了させる時の 【全ロック解除】処理◆ # sub ALLUnLock { if ($lockflag == 0) { return; } # 配列の各要素は、「特定ロックファイルの“最後のロック処理”が、通算で何回目のロック処理か?」の値を保有。 # (ロック処理履歴・情報-配列 の 添字ナンバー) $dummy_LK = 0; @numberList_of_array = ( $dummy_LK, $Sym_IP0_LK, $mini_IP0_LK, $Sym_0_LK, $mini_0_LK, $pwFile_pre_LK, $pwFile_LK, $Bigger_LK, $Sym_1i_LK, $mini_f_LK, $cokSrc_pre_LK, $mini_i_LK, $cokSrc_i_LK, $cokSrc_f_LK, $Sym_IP1_LK, $Sym_IP2_LK, $Sym_1_LK, $Sym_2_LK, $mini_IP1_LK, $mini_IP2_LK, $mini_1_LK, $mini_2_LK, $pastCNTmin_LK, $psIDwork, $LgdlchkGo, $pswCookREC, $psDateMgr, $dHjlIfI, $elHIjfItI ) ; # ◆配列の要素↑を追加する時、【最後の要素】の後ろには“カンマ”を付けては ↑ ダメ。 $ULK_Suu = 0; local $LetUnLock[0] = 0 ; foreach $locked_number (@numberList_of_array) { $n = $locked_number + 0; if (($n != 0) && ($Locked[$n] eq 'yes') && ($Locked_File[$n] ne '')) { $WiLLunLockNumber = $n ; $ULK_Suu++; $LetUnLock[$ULK_Suu] = $WiLLunLockNumber; # $LetUnLock[$ULK_Suu] は、アンロック対象の 新規_情報配列。 $WiLLunLockNumber は、【ロック処理履歴・情報-配列 の 添字ナンバー】 } } if ($ULK_Suu > 0) { &EachUnLock($ULK_Suu); } $lockflag = 0 ; # 各自アンロック不成功でも、強制的に $lockflag をゼロに。(仕方ない) } # ===================================== sub EachUnLock { # ALLUnLockからのみ呼ばれるサブルーチン。($lockflag = 0 ; は、親ルーチンで設定。) my($ULK_Suu) = $_[0]; for ($L = 1; $L <= $ULK_Suu ; $L++) { $ULKnumber = $LetUnLock[$L]; if ($Locked_Key[$ULKnumber] == 1) { flock($LockHandle[$ULKnumber], $mylockOFF); close($LockHandle[$ULKnumber]); $Locked[$ULKnumber] = 'free' ; # ロック解除の目印 } elsif ($Locked_Key[$ULKnumber] == 2) { if (-e $Locked_File[$ULKnumber]) {unlink($Locked_File[$ULKnumber]) ;} $Locked[$ULKnumber] = 'free' ; # ロック解除の目印 } else { if (-e $Locked_File[$ULKnumber]) {rmdir($Locked_File[$ULKnumber]) ;} $Locked[$ULKnumber] = 'free' ; # ロック解除の目印 } } } # ===================================== sub miniSleep { select(undef, undef, undef, 0.5) ; } #-----------------# # 暗号化処理 # sub MyEncrypt { # ★暗号処理はお見せできません。 代わりのサブルーチンを ネットで入手して下さい。 } #----------------------# # 初期ファイル生成 sub make_DefaultFile { local ($makefile) = $_[0]; local ($fileData) = $_[1]; if(open(OUT,"> $makefile")){ print OUT $fileData; close(OUT); } # ★パーミッションを 【606】 に設定。 if ($permChg == 1) {chmod $perWrMODEset, "$makefile";} } #----------------------# # エラー 〜 終了処理 # sub Errors { if ($lockflag != 0) { &ALLUnLock; } &pictureView; } #/*----------