• R/O
  • SSH
  • HTTPS

websvn-admin: Commit


Commit MetaInfo

Revision8 (tree)
Zeit2011-01-18 23:32:41
Autorinoue-h

Log Message

バックアップ機能

Ändern Zusammenfassung

Diff

--- trunc/include/config.php (revision 7)
+++ trunc/include/config.php (revision 8)
@@ -18,12 +18,19 @@
1818 // $strSvnCmdPath = '';
1919
2020
21-
2221 // ***** svn repositoy parent directory *****
2322 // this string must end with '/'.
2423
2524 // $strBaseDir = '/var/svn/';
25+// $strBaseDir = '/home/user0000/var/svn/';
2626
2727
28+// ***** repositoy backup/trash directory *****
29+// this string must end with '/'.
30+
31+// $strBackupDir = '/var/svn-backup/';
32+// $strBackupDir = '/home/user0000/var/svn-backup/';
33+
34+
2835 ?>
2936
--- trunc/index.php (revision 7)
+++ trunc/index.php (revision 8)
@@ -57,7 +57,7 @@
5757 $strFilenameThis = htmlspecialchars(basename($_SERVER['PHP_SELF']));
5858
5959 // config.php で設定が行われているか確認する
60-if(!isset($strSvnCmdPath) || !isset($strBaseDir)){
60+if(!isset($strSvnCmdPath) || !isset($strBaseDir) || !isset($strBackupDir)){
6161 print("<p class=\"error\">include/config.php の初期設定が行われていません</p>\n");
6262 print("</body>\n</html>\n");
6363 die;
@@ -93,6 +93,9 @@
9393
9494 ?>
9595 <div id="main_content_left">
96+<h2>System</h2>
97+<p><?php echo date('Y/m/d H:i:s', time()) ; ?></p>
98+<p>SVN <?php echo get_svn_version(); ?></p>
9699 <h2>Menu</h2>
97100 <ul>
98101 <li><a href="<?php echo $strFilenameThis;?>">Home</a></li>
@@ -102,10 +105,14 @@
102105 <h2>Repositories</h2>
103106 <ul>
104107 <?php
108+
109+// *********************
110+// 既存リポジトリ一覧を表示(左側ペイン)
111+// *********************
105112 if ($dir = opendir($strBaseDir)) {
106113 while (($file = readdir($dir)) !== false) {
107114 if ($file != "." && $file != ".." && is_dir($strBaseDir.$file)) {
108- print "<li class=\"repo\"><a class=\"repo\" href=\"$strFilenameThis?mode=repo&reponame=".htmlspecialchars($file)."\">".htmlspecialchars($file)."</a></li>\n";
115+ print "<li class=\"repo\"><a class=\"repo\" href=\"$strFilenameThis?mode=inforepo&reponame=".htmlspecialchars($file)."\">".htmlspecialchars($file)."</a></li>\n";
109116 }
110117 }
111118 closedir($dir);
@@ -175,47 +182,11 @@
175182 print("<p>".ChangePassword($strFilenameThis, 'svnadmin-create')."</p>\n");
176183 }
177184 // *********************
178-// 既存リポジトリ指定
185+// 既存リポジトリの情報表示(バックアップ、削除サブメニュー表示)
179186 // *********************
180-elseif(isset($_GET['mode']) && $_GET['mode'] === 'repo' && isset($_GET['reponame'])){
187+elseif(isset($_GET['mode']) && $_GET['mode'] === 'inforepo' && isset($_GET['reponame'])){
181188 $strRepo = $_GET['reponame'];
182- print("<h1>Existing Repository (既存リポジトリ)</h1>\n");
183- print("<p>リポジトリ名 : ".htmlspecialchars($strRepo)."</p>\n");
184- if(!preg_match("/^[A-Za-z0-9\-]+$/", $strRepo) || $strRepo[0] == '-' || $strRepo[strlen($strRepo)-1] == '-' || strlen($strRepo) > 20 || strlen($strRepo) <= 0){
185- print("<p class=\"error\">不正なリポジトリ名が指定されました</p>\n");
186- }
187- else{
188- exec($strSvnCmdPath."svnlook youngest ".$strBaseDir.$strRepo." 2>&1", $arrStdout, $nResult);
189- if($nResult != 0){ print("<p class=\"error\">svnlook youngestコマンドが実行できません</p>\n"); }
190- else{
191- if(count($arrStdout) >= 1){ $strRevNo = $arrStdout[0]; }
192- else{ $strRevNo = ''; }
193- }
194- $arrStdout = array();
195- exec($strSvnCmdPath."svnlook author ".$strBaseDir.$strRepo." 2>&1", $arrStdout, $nResult);
196- if($nResult != 0){ print("<p class=\"error\">svnlook authorコマンドが実行できません</p>\n"); }
197- else{
198- if(count($arrStdout) >= 1){ $strAuthor = $arrStdout[0]; }
199- else{ $strAuthor = ''; }
200- }
201- $arrStdout = array();
202- exec($strSvnCmdPath."svnlook date ".$strBaseDir.$strRepo." 2>&1", $arrStdout, $nResult);
203- if($nResult != 0){ print("<p class=\"error\">svnlook dateコマンドが実行できません</p>\n"); }
204- else{
205- if(count($arrStdout) >= 1){ $strDate = $arrStdout[0]; }
206- else{ $strDate = ''; }
207- }
208-
209- print("<p>直近にコミットしたユーザ : ".$strAuthor."</p>\n");
210- print("<p>直近のコミット日時 : ".$strDate."</p>\n");
211- print("<p>リビジョン no : ".$strRevNo."</p>\n");
212-
213- print("<p><a class=\"repo\" href=\"$strFilenameThis?mode=verify&reponame=".htmlspecialchars($strRepo)."\">".htmlspecialchars($strRepo)." をベリファイする (svnadmin verify)</a></p>\n");
214- print("<p><a class=\"repo\" href=\"$strFilenameThis?mode=recover&reponame=".htmlspecialchars($strRepo)."\">".htmlspecialchars($strRepo)." のエラー回復を行う (svnadmin recover)</a></p>\n");
215- print("<p><a class=\"repo\" href=\"$strFilenameThis?mode=hotcopy&reponame=".htmlspecialchars($strRepo)."\">".htmlspecialchars($strRepo)." をバックアップする (svnadmin hotcopy)</a></p>\n");
216- print("<p><a class=\"repo\" href=\"$strFilenameThis?mode=dump&reponame=".htmlspecialchars($strRepo)."\">".htmlspecialchars($strRepo)." をバックアップ(ダンプ)する (svnadmin dump)</a></p>\n");
217- print("<p><a class=\"repo\" href=\"$strFilenameThis?mode=remove&reponame=".htmlspecialchars($strRepo)."\">".htmlspecialchars($strRepo)." を削除する</a></p>\n");
218- }
189+ info_repository($strRepo);
219190 }
220191 // *********************
221192 // 既存リポジトリのベリファイ
@@ -222,27 +193,23 @@
222193 // *********************
223194 elseif(isset($_GET['mode']) && $_GET['mode'] === 'verify' && isset($_GET['reponame'])){
224195 $strRepo = $_GET['reponame'];
225- print("<h1>Verify Repository (既存リポジトリのベリファイ)</h1>\n");
226- print("<p>リポジトリ名 : ".htmlspecialchars($strRepo)."</p>\n");
227- if(!preg_match("/^[A-Za-z0-9\-]+$/", $strRepo) || $strRepo[0] == '-' || $strRepo[strlen($strRepo)-1] == '-' || strlen($strRepo) > 20 || strlen($strRepo) <= 0){
228- print("<p class=\"error\">不正なリポジトリ名が指定されました</p>\n");
229- }
230- else{
231- exec($strSvnCmdPath."svnadmin verify ".$strBaseDir.$strRepo." 2>&1", $arrStdout, $nResult);
232- if($nResult != 0){ print("<p class=\"error\">svnadmin verifyコマンドが実行できません</p>\n"); }
233- else{
234- // コマンドのStdout出力がある場合
235- if(count($arrStdout)>0){
236- print("<pre>\n\n");
237- foreach($arrStdout as $str){
238- print($str."\n");
239- }
240- print("</pre>\n");
241- }
242- }
243- }
196+ verify_repository($strRepo);
244197 }
245198 // *********************
199+// 既存リポジトリのバックアップ(hotcopy)
200+// *********************
201+elseif(isset($_GET['mode']) && $_GET['mode'] === 'hotcopy' && isset($_GET['reponame'])){
202+ $strRepo = $_GET['reponame'];
203+ hotcopy_repository($strRepo);
204+}
205+// *********************
206+// 既存リポジトリのバックアップ(dump)
207+// *********************
208+elseif(isset($_GET['mode']) && $_GET['mode'] === 'dump' && isset($_GET['reponame'])){
209+ $strRepo = $_GET['reponame'];
210+ dump_repository($strRepo);
211+}
212+// *********************
246213 // 新規リポジトリ作成 入力画面
247214 // *********************
248215 else{
@@ -259,6 +226,211 @@
259226 </form>
260227 <?php
261228 }
229+
230+
231+// *********************
232+// 既存リポジトリの情報表示(バックアップ、削除サブメニュー表示)
233+// *********************
234+function info_repository($strRepo) {
235+ global $strSvnCmdPath;
236+ global $strBaseDir;
237+
238+ print("<h1>Repository Administration (リポジトリ管理)</h1>\n");
239+ print("<p>リポジトリ名 : ".htmlspecialchars($strRepo)."</p>\n");
240+
241+ // リポジトリ名に不正な文字が入っていないか検査
242+ if(!preg_match("/^[A-Za-z0-9\-]+$/", $strRepo) || $strRepo[0] == '-' || $strRepo[strlen($strRepo)-1] == '-' || strlen($strRepo) > 20 || strlen($strRepo) <= 0){
243+ print("<p class=\"error\">不正なリポジトリ名が指定されました</p>\n");
244+ return;
245+ }
246+
247+ // リポジトリの最終リビジョン番号を読み取る
248+ $strRevNo = '';
249+ exec($strSvnCmdPath."svnlook youngest ".$strBaseDir.$strRepo." 2>&1", $arrStdout, $nResult);
250+ if($nResult != 0){
251+ print("<p class=\"error\">svnlook youngestコマンドが実行できません</p>\n");
252+ return;
253+ }
254+ if(count($arrStdout) >= 1){ $strRevNo = $arrStdout[0]; }
255+ $arrStdout = array();
256+
257+ // リポジトリの最終変更ユーザ名を読み取る
258+ $strAuthor = '';
259+ exec($strSvnCmdPath."svnlook author ".$strBaseDir.$strRepo." 2>&1", $arrStdout, $nResult);
260+ if($nResult != 0){
261+ print("<p class=\"error\">svnlook authorコマンドが実行できません</p>\n");
262+ return;
263+ }
264+ if(count($arrStdout) >= 1){ $strAuthor = $arrStdout[0]; }
265+ $arrStdout = array();
266+
267+ // リポジトリの最終変更日時を読み取る
268+ $strDate = '';
269+ exec($strSvnCmdPath."svnlook date ".$strBaseDir.$strRepo." 2>&1", $arrStdout, $nResult);
270+ if($nResult != 0){
271+ print("<p class=\"error\">svnlook dateコマンドが実行できません</p>\n");
272+ return;
273+ }
274+ if(count($arrStdout) >= 1){ $strDate = $arrStdout[0]; }
275+
276+ print("<p>直近にコミットしたユーザ : ".$strAuthor."</p>\n");
277+ print("<p>直近のコミット日時 : ".$strDate."</p>\n");
278+ print("<p>リビジョン no : ".$strRevNo."</p>\n");
279+
280+ print("<p><a class=\"repo\" href=\"$strFilenameThis?mode=verify&reponame=".htmlspecialchars($strRepo)."\">".htmlspecialchars($strRepo)." をベリファイする (svnadmin verify)</a></p>\n");
281+ print("<p><a class=\"repo\" href=\"$strFilenameThis?mode=recover&reponame=".htmlspecialchars($strRepo)."\">".htmlspecialchars($strRepo)." のエラー回復を行う (svnadmin recover)</a></p>\n");
282+ print("<p><a class=\"repo\" href=\"$strFilenameThis?mode=hotcopy&reponame=".htmlspecialchars($strRepo)."\">".htmlspecialchars($strRepo)." をバックアップする (svnadmin hotcopy)</a></p>\n");
283+ print("<p><a class=\"repo\" href=\"$strFilenameThis?mode=dump&reponame=".htmlspecialchars($strRepo)."\">".htmlspecialchars($strRepo)." をバックアップ(ダンプ)する (svnadmin dump)</a></p>\n");
284+ print("<p><a class=\"repo\" href=\"$strFilenameThis?mode=remove&reponame=".htmlspecialchars($strRepo)."\">".htmlspecialchars($strRepo)." を削除する</a></p>\n");
285+
286+}
287+
288+// *********************
289+// 既存リポジトリのベリファイ
290+// *********************
291+function verify_repository($strRepo) {
292+ global $strSvnCmdPath;
293+ global $strBaseDir;
294+
295+ print("<h1>Verify Repository (ベリファイ)</h1>\n");
296+ print("<p>リポジトリ名 : ".htmlspecialchars($strRepo)."</p>\n");
297+
298+ // リポジトリ名に不正な文字が入っていないか検査
299+ if(!preg_match("/^[A-Za-z0-9\-]+$/", $strRepo) || $strRepo[0] == '-' || $strRepo[strlen($strRepo)-1] == '-' || strlen($strRepo) > 20 || strlen($strRepo) <= 0){
300+ print("<p class=\"error\">不正なリポジトリ名が指定されました</p>\n");
301+ return;
302+ }
303+
304+ // ベリファイコマンドを実行
305+ exec($strSvnCmdPath."svnadmin verify ".$strBaseDir.$strRepo." 2>&1", $arrStdout, $nResult);
306+ if($nResult != 0){
307+ print("<p class=\"error\">svnadmin verifyコマンドが実行できません</p>\n");
308+ return;
309+ }
310+
311+ // コマンドのStdout出力がある場合
312+ if(count($arrStdout)>0){
313+ print("<pre>\n\n");
314+ foreach($arrStdout as $str){
315+ print($str."\n");
316+ }
317+ print("</pre>\n");
318+ print("<p class=\"info\">ベリファイが完了しました</p>\n");
319+ }
320+ else{
321+ print("<p class=\"info\">svnadminコマンドの出力無し。エラーの可能性あり</p>\n");
322+ }
323+}
324+
325+// *********************
326+// 既存リポジトリのバックアップ(hotcopy)
327+// *********************
328+function hotcopy_repository($strRepo) {
329+ global $strSvnCmdPath;
330+ global $strBaseDir;
331+ global $strBackupDir;
332+
333+ print("<h1>Backup (hotcopy) Repository (バックアップ : hotcopy)</h1>\n");
334+ print("<p>リポジトリ名 : ".htmlspecialchars($strRepo)."</p>\n");
335+
336+ // リポジトリ名に不正な文字が入っていないか検査
337+ if(!preg_match("/^[A-Za-z0-9\-]+$/", $strRepo) || $strRepo[0] == '-' || $strRepo[strlen($strRepo)-1] == '-' || strlen($strRepo) > 20 || strlen($strRepo) <= 0){
338+ print("<p class=\"error\">不正なリポジトリ名が指定されました</p>\n");
339+ return;
340+ }
341+
342+ // バックアップ先ディレクトリが既存でないか検査
343+ $strBackupBasename = $strRepo.'-'.date('Ymd-Hi', time());
344+ if(file_exists($strBackupDir.$strBackupBasename)){
345+ print("<p class=\"error\">バックアップ先に同じ名称のディレクトリがあります</p>\n");
346+ return;
347+ }
348+
349+ print("<p>コマンド実行中 ... (svnadmin hotcopy ".htmlspecialchars($strRepo)." ".htmlspecialchars($strBackupBasename).")</p>\n");
350+
351+ // バックアップコマンドを実行
352+ exec($strSvnCmdPath."svnadmin hotcopy ".$strBaseDir.$strRepo." ".$strBackupDir.$strBackupBasename." 2>&1", $arrStdout, $nResult);
353+ if($nResult != 0){
354+ print("<p class=\"error\">バックアップに失敗しました</p>\n");
355+ return;
356+ }
357+ // コマンドのStdout出力がある場合
358+ if(count($arrStdout)>0){
359+ print("<pre>\n\n");
360+ foreach($arrStdout as $str){
361+ print($str."\n");
362+ }
363+ print("</pre>\n");
364+ }
365+ else{
366+ print("<p class=\"ok\">バックアップが完了しました</p>\n");
367+ }
368+ return;
369+}
370+
371+// *********************
372+// 既存リポジトリのバックアップ(dump)
373+// *********************
374+function dump_repository($strRepo) {
375+ global $strSvnCmdPath;
376+ global $strBaseDir;
377+ global $strBackupDir;
378+
379+ print("<h1>Backup (dump) Repository (バックアップ : dump)</h1>\n");
380+ print("<p>リポジトリ名 : ".htmlspecialchars($strRepo)."</p>\n");
381+
382+ // リポジトリ名に不正な文字が入っていないか検査
383+ if(!preg_match("/^[A-Za-z0-9\-]+$/", $strRepo) || $strRepo[0] == '-' || $strRepo[strlen($strRepo)-1] == '-' || strlen($strRepo) > 20 || strlen($strRepo) <= 0){
384+ print("<p class=\"error\">不正なリポジトリ名が指定されました</p>\n");
385+ return;
386+ }
387+
388+ // バックアップ先ディレクトリが既存でないか検査
389+ $strBackupBasename = $strRepo.'-'.date('Ymd-Hi', time()).'.txt';
390+ if(file_exists($strBackupDir.$strBackupBasename)){
391+ print("<p class=\"error\">バックアップ先に同じ名称のファイルがあります</p>\n");
392+ return;
393+ }
394+
395+ print("<p>コマンド実行中 ... (svnadmin dump ".htmlspecialchars($strRepo)." &gt; ".htmlspecialchars($strBackupBasename).")</p>\n");
396+
397+ // バックアップコマンドを実行
398+ exec($strSvnCmdPath."svnadmin dump ".$strBaseDir.$strRepo." > ".$strBackupDir.$strBackupBasename." 2>&1", $arrStdout, $nResult);
399+ if($nResult != 0){
400+ print("<p class=\"error\">バックアップに失敗しました</p>\n");
401+ return;
402+ }
403+ // コマンドのStdout出力がある場合
404+ if(count($arrStdout)>0){
405+ print("<pre>\n\n");
406+ foreach($arrStdout as $str){
407+ print($str."\n");
408+ }
409+ print("</pre>\n");
410+ }
411+ else{
412+ print("<p class=\"ok\">バックアップが完了しました</p>\n");
413+ }
414+ return;
415+}
416+
417+// *********************
418+// svnコマンドのバージョン番号(文字列)を返す関数
419+// *********************
420+function get_svn_version() {
421+
422+ global $strSvnCmdPath;
423+ global $strBaseDir;
424+ $strSvnVersion = '';
425+
426+ exec($strSvnCmdPath."svnlook --version 2>&1", $arrStdout, $nResult);
427+ if($nResult == 0){
428+ if(preg_match('~([0-9]+)\.([0-9]+)\.([0-9]+)~', $arrStdout[0], $matches)) {
429+ $strSvnVersion = $matches[0];
430+ }
431+ }
432+ return($strSvnVersion);
433+}
262434 ?>
263435
264436 </div> <!-- id="main_content_right" -->
Show on old repository browser