• R/O
  • SSH
  • HTTPS

websvn-admin: Commit


Commit MetaInfo

Revision10 (tree)
Zeit2011-01-21 23:01:59
Autorinoue-h

Log Message

hotcopy失敗時に単純コピー、グローバル変数宣言不足修正 など

Ändern Zusammenfassung

Diff

--- trunc/index.php (revision 9)
+++ trunc/index.php (revision 10)
@@ -10,6 +10,7 @@
1010 // http://oasis.halfmoon.jp/
1111 //
1212 // version 0.1 (2011/01/16)
13+// version 0.2 (2011/01/20)
1314 //
1415 // GNU GPL Free Software
1516 //
@@ -64,6 +65,12 @@
6465 die;
6566 }
6667
68+// execコマンドに渡す変数の汚染除去(エスケープ)
69+$strSvnCmdPath = escapeshellcmd($strSvnCmdPath);
70+$strBaseDir = escapeshellcmd($strBaseDir);
71+$strBackupDir = escapeshellcmd($strBackupDir);
72+
73+
6774 $nResult = CheckAuthDataFile();
6875 if($nResult == 0){
6976 ?>
@@ -96,7 +103,6 @@
96103 <div id="main_content_left">
97104 <h2>System</h2>
98105 <p><?php echo date('Y/m/d H:i:s', time()) ; ?><br />
99-WebSVN-Admin &nbsp;<?php echo $strVersion; ?><br />
100106 Subversion &nbsp;<?php echo get_svn_version(); ?></p>
101107 <h2>Menu</h2>
102108 <ul>
@@ -108,9 +114,7 @@
108114 <h2>Repositories</h2>
109115 <?php
110116
111-// *********************
112117 // 既存リポジトリ一覧を表示(左側ペイン)
113-// *********************
114118 display_repositories();
115119
116120 ?>
@@ -120,73 +124,54 @@
120124 <?php
121125
122126 // *********************
127+// プログラム引数によって処理分岐
128+// *********************
129+
123130 // バックアップディレクトリの一覧
124-// *********************
125131 if(isset($_GET['mode']) && $_GET['mode'] === 'backuplist'){
126132 display_backup_list();
127133 }
128-// *********************
129134 // 新規リポジトリ作成
130-// *********************
131135 elseif(isset($_GET['mode']) && $_GET['mode'] === 'makerepo' && isset($_POST['newrepo']) && strlen($_POST['newrepo'])>0){
132136 $strRepo = trim($_POST['newrepo']);
133137 create_new_repository($strRepo);
134138 }
135-// *********************
136139 // ログアウト
137-// *********************
138140 elseif(isset($_GET['mode']) && $_GET['mode'] === 'logout'){
139141 LogoffAuth();
140-?>
141-<h1>Logout</h1>
142-<p>ログアウトしました</p>
143-<?php
142+ print("<h1>Logout</h1>\n<p>ログアウトしました</p>\n");
144143 }
145-// *********************
146144 // ユーザ名・パスワード変更
147-// *********************
148145 elseif(isset($_GET['mode']) && $_GET['mode'] === 'chgpasswd'){
149146 print("<h1>Change User and Password (ユーザ名、パスワード変更)</h1>\n");
150147 print("<p>".ChangePassword($strFilenameThis, 'svnadmin-create')."</p>\n");
151148 }
152-// *********************
153149 // 既存リポジトリの情報表示(バックアップ、削除サブメニュー表示)
154-// *********************
155150 elseif(isset($_GET['mode']) && $_GET['mode'] === 'inforepo' && isset($_GET['reponame'])){
156151 $strRepo = $_GET['reponame'];
157152 info_repository($strRepo);
158153 }
159-// *********************
160154 // 既存リポジトリのベリファイ
161-// *********************
162155 elseif(isset($_GET['mode']) && $_GET['mode'] === 'verify' && isset($_GET['reponame'])){
163156 $strRepo = $_GET['reponame'];
164157 verify_repository($strRepo);
165158 }
166-// *********************
167159 // 既存リポジトリのバックアップ(hotcopy)
168-// *********************
169160 elseif(isset($_GET['mode']) && $_GET['mode'] === 'hotcopy' && isset($_GET['reponame'])){
170161 $strRepo = $_GET['reponame'];
171162 hotcopy_repository($strRepo, 0);
172163 }
173-// *********************
174164 // 既存リポジトリのバックアップ(dump)
175-// *********************
176165 elseif(isset($_GET['mode']) && $_GET['mode'] === 'dump' && isset($_GET['reponame'])){
177166 $strRepo = $_GET['reponame'];
178167 dump_repository($strRepo);
179168 }
180-// *********************
181169 // リポジトリの削除
182-// *********************
183170 elseif(isset($_GET['mode']) && $_GET['mode'] === 'remove' && isset($_GET['reponame'])){
184171 $strRepo = $_GET['reponame'];
185172 remove_repository($strRepo);
186173 }
187-// *********************
188174 // 新規リポジトリ作成 入力画面
189-// *********************
190175 else{
191176 // 引数が何もなかった場合、新規リポジトリ名の入力画面を表示
192177 input_new_repository();
@@ -211,6 +196,7 @@
211196 // *********************
212197 function display_repositories() {
213198 global $strBaseDir;
199+ global $strFilenameThis;
214200
215201 $arrDirs = array();
216202 if ($dir = opendir($strBaseDir)) {
@@ -237,6 +223,7 @@
237223 // 新規リポジトリ名入力画面
238224 // *********************
239225 function input_new_repository() {
226+ global $strFilenameThis;
240227 ?>
241228
242229 <h1>Create New Repository (リポジトリ作成)</h1>
@@ -300,6 +287,7 @@
300287 function info_repository($strRepo) {
301288 global $strSvnCmdPath;
302289 global $strBaseDir;
290+ global $strFilenameThis;
303291
304292 print("<h1>Repository Administration (リポジトリ管理)</h1>\n");
305293 print("<p>リポジトリ名 : ".htmlspecialchars($strRepo)."</p>\n");
@@ -315,7 +303,6 @@
315303 exec($strSvnCmdPath."svnlook youngest ".$strBaseDir.$strRepo." 2>&1", $arrStdout, $nResult);
316304 if($nResult != 0){
317305 print("<p class=\"error\">svnlook youngestコマンドが実行できません</p>\n");
318- return;
319306 }
320307 if(count($arrStdout) >= 1){ $strRevNo = $arrStdout[0]; }
321308 $arrStdout = array();
@@ -325,7 +312,6 @@
325312 exec($strSvnCmdPath."svnlook author ".$strBaseDir.$strRepo." 2>&1", $arrStdout, $nResult);
326313 if($nResult != 0){
327314 print("<p class=\"error\">svnlook authorコマンドが実行できません</p>\n");
328- return;
329315 }
330316 if(count($arrStdout) >= 1){ $strAuthor = $arrStdout[0]; }
331317 $arrStdout = array();
@@ -335,7 +321,6 @@
335321 exec($strSvnCmdPath."svnlook date ".$strBaseDir.$strRepo." 2>&1", $arrStdout, $nResult);
336322 if($nResult != 0){
337323 print("<p class=\"error\">svnlook dateコマンドが実行できません</p>\n");
338- return;
339324 }
340325 if(count($arrStdout) >= 1){ $strDate = $arrStdout[0]; }
341326
@@ -397,6 +382,8 @@
397382 // *********************
398383 // 既存リポジトリのバックアップ(hotcopy)
399384 // *********************
385+// 引数 $flag_mode : 0のとき、処理のタイトルを表示する
386+// 戻り値 0:失敗, 1:成功
400387 function hotcopy_repository($strRepo, $flag_mode) {
401388 global $strSvnCmdPath;
402389 global $strBaseDir;
@@ -410,7 +397,7 @@
410397 // リポジトリ名に不正な文字が入っていないか検査
411398 if(!preg_match("/^[A-Za-z0-9\-]+$/", $strRepo) || $strRepo[0] == '-' || $strRepo[strlen($strRepo)-1] == '-' || strlen($strRepo) > 20 || strlen($strRepo) <= 0){
412399 print("<p class=\"error\">不正なリポジトリ名が指定されました</p>\n");
413- return;
400+ return(0);
414401 }
415402
416403 // バックアップ先ディレクトリが既存でないか検査
@@ -417,7 +404,7 @@
417404 $strBackupBasename = $strRepo.'-'.date('Ymd-Hi', time());
418405 if(file_exists($strBackupDir.$strBackupBasename)){
419406 print("<p class=\"error\">バックアップ先に同じ名称のディレクトリがあります</p>\n");
420- return;
407+ return(0);
421408 }
422409
423410 print("<p>コマンド実行中 ... (svnadmin hotcopy ".htmlspecialchars($strRepo)." ".htmlspecialchars($strBackupBasename).")</p>\n");
@@ -425,8 +412,24 @@
425412 // バックアップコマンドを実行
426413 exec($strSvnCmdPath."svnadmin hotcopy ".$strBaseDir.$strRepo." ".$strBackupDir.$strBackupBasename." 2>&1", $arrStdout, $nResult);
427414 if($nResult != 0){
428- print("<p class=\"error\">バックアップに失敗しました</p>\n");
429- return;
415+ print("<p class=\"info\">バックアップに失敗しました。単純コピーを試します</p>\n");
416+ print("<p>コマンド実行中 ... (cp -Rv ".htmlspecialchars($strRepo)." ".htmlspecialchars($strBackupBasename).")</p>\n");
417+ $arrStdout = array();
418+ exec("cp -Rv ".$strBaseDir.$strRepo." ".$strBackupDir.$strBackupBasename." 2>&1", $arrStdout, $nResult);
419+ // コマンドのStdout出力がある場合
420+ if(count($arrStdout)>0){
421+ print("<pre>\n\n");
422+ foreach($arrStdout as $str){
423+ print($str."\n");
424+ }
425+ print("</pre>\n");
426+ }
427+ if($nResult != 0){
428+ print("<p class=\"error\">単純コピーも出来ません。バックアップに失敗しました</p>\n");
429+ return(0);
430+ }
431+ print("<p class=\"ok\">hotcopyは失敗しましたが、単純コピーは完了しました</p>\n");
432+ return(1);
430433 }
431434 // コマンドのStdout出力がある場合
432435 if(count($arrStdout)>0){
@@ -439,7 +442,7 @@
439442 else{
440443 print("<p class=\"ok\">バックアップが完了しました</p>\n");
441444 }
442- return;
445+ return(1);
443446 }
444447
445448 // *********************
@@ -494,6 +497,7 @@
494497 function remove_repository($strRepo) {
495498 global $strSvnCmdPath;
496499 global $strBaseDir;
500+ global $strBackupDir;
497501
498502 print("<h1>Remove Repository (リポジトリ削除)</h1>\n");
499503 print("<p>リポジトリ名 : ".htmlspecialchars($strRepo)."</p>\n");
@@ -506,10 +510,12 @@
506510
507511 // バックアップ(hotcopy)
508512 print("<p class=\"info\">削除前に、バックアップを行います</p>\n");
509- hotcopy_repository($strRepo, 1);
513+ if(!hotcopy_repository($strRepo, 1)){
514+ print("<p class=\"error\">対象リポジトリがバックアップできないため、削除を中止します</p>\n");
515+ return;
516+ }
510517
511518 print("<p>コマンド実行中 ... (rm -rfv ".htmlspecialchars($strRepo).")</p>\n");
512-
513519 // 削除
514520 exec("rm -rfv ".$strBaseDir.$strRepo." 2>&1", $arrStdout, $nResult);
515521 if($nResult != 0){
Show on old repository browser