Portál AbcLinuxu, 30. dubna 2025 16:30

Užitečné skripty 5: zálohujeme SVN repositář

28.3.2007 21:21 | Přečteno: 1466× | Linux

V dnešním díle zvedneme kvalitu seriálu zpátky na rozumnou úroveň a ukážeme si skript na zálohování SVN repositáře. Pokud si svoje textové výtvory skladujete v SVN, jistě oceňujete to, že si můžete zjistit všechny verze a změny, které jste kdy napsali. Je však potřeba myslet na katastrofickou situaci, když se nějak pokazí repositář. Potom se hodí záloha repositáře. Pokud máte repositářů víc, jistě se hodí skript, který celou akci zautomatizuje.

Abstrakt

Své texty (opravdové texty, skripty, konfiguráky apod.) si ukládám do SVN. Používám více repositářů, protože věci, které spolu opravdu nesouvisejí, raději dávám zvlášť. Abyste věděli předem, co od skriptu očekávat, tady je stručný přehled:

Samotný skript

Základem skriptu je kód zveřejněný v jedné internetové diskusi, viz [1]. Skript je trochu delší.
Soubor backup.sh
  1. #!/bin/sh
  2. #Skript na zalohovani SVN
  3. #Use: $0 <what to backup>
  4. #based on http://snippets.dzone.com/posts/show/2635
  5. call_exit(){
  6. echo -n "Error code $1 - "
  7. case "$1" in
  8. 1)
  9. echo "Cannot find place for backup, exitting"
  10. ;;
  11. 2)
  12. echo "Backup dir is not present, exitting"
  13. ;;
  14. 3)
  15. echo "Backup dir is not writable, exitting"
  16. ;;
  17. esac
  18. exit $1
  19. }
  20. #Setup
  21. infoDir=${HOME}/.backup #directory, where information about stored revisions is kept
  22. svnRepository=${HOME}/SVN #repository location
  23. externalBackupMountPoint1='/mnt/mp3' #first mountpoint to try
  24. externalBackupMountPoint2='/mnt/local/mp3' #second mountpoint to try
  25. externalBackupDir='backup' #path in the mounted disc (asume the disc can be mounted on two locations)
  26. defaultBackup='phd' #what to backup, if nothing is given on commandline
  27. #End of setup
  28. #Find a location for the backup
  29. if [ `mount | grep $externalBackupMountPoint1 | wc -l` -eq 1 ]
  30. then
  31. backupDir="$externalBackupMountPoint1/$externalBackupDir"
  32. elif [ `mount | grep $externalBackupMountPoint2 | wc -l` -eq 1 ]
  33. then
  34. backupDir="$externalBackupMountPoint2/$externalBackupDir"
  35. else
  36. call_exit 1
  37. fi
  38. [ -d $backupDir ] || call_exit 2
  39. [ -w $backupDir ] || call_exit 3
  40. echo =============================================
  41. echo ============ Backup utility =================
  42. echo =============================================
  43. echo
  44. echo Using $backupDir for the backup
  45. timeStamp=`date +%F-%H-%M-%S`
  46. #function to dump SVN repository
  47. dumpDir(){
  48. dir=$1 #what repository to backup
  49. dirBaseName=`basename $dir` #basename of the repository to backup
  50. echo Processing $dir
  51. youngest=`svnlook youngest $dir` #last (youngest) revision in the repository
  52. if [ -r $infoDir/$dirBaseName ]; then #if we have information about the last backupped revision
  53. latest=`cat $infoDir/$dirBaseName` #last revision
  54. if [ $latest -lt $youngest ]; then #if the last backuped revision is older than the youngest
  55. cil=${backupDir}/`basename $dir`_$latest_$youngest_$timeStamp.gz #file name where to backup
  56. echo Running incremental backup from revision $latest to revision $youngest
  57. echo Target is $cil
  58. svnadmin dump $dir --incremental -r $latest:$youngest | gzip > $cil # the command itself
  59. cp $infoDir/$dirBaseName $infoDir/$dirBaseName.old #backup the old setting
  60. echo $youngest > $infoDir/$dirBaseName #write the information about the backup
  61. else #no change since the last backup
  62. echo No need to backup
  63. fi
  64. else #if we have no info about last backup, run full backup
  65. cil=${backupDir}/`basename $dir`_0_$youngest_$timeStamp.gz
  66. echo Runnig full backup up to revision $youngest
  67. echo Target is $cil
  68. svnadmin dump $dir | gzip > $cil #the command itself
  69. [ -d $infoDir ] || mkdir $infoDir
  70. echo $youngest > $infoDir/$dirBaseName #write the information about the backup
  71. fi
  72. echo Done
  73. }
  74. #if nothing is given on commandline, $defaultBackup is backed up
  75. what=$1
  76. if [ "x$1" = "x" ]
  77. then
  78. what=$defaultBackup
  79. fi
  80. case "$what" in
  81. all)
  82. for dir in $svnRepository/*
  83. do
  84. dumpDir $dir
  85. done
  86. ;;
  87. *)
  88. dir=${svnRepository}/${what}
  89. if [ -d $dir ]
  90. then
  91. dumpDir $dir
  92. else
  93. echo $dir is not a valid SVN repository
  94. exit 2
  95. fi
  96. ;;
  97. esac
  98. echo All Done

Lehké vysvětlení:

Obnovení ze zálohy

Pro nedostatek času toto téma vynechávám, můžete se vyřádit v diskusi.

Odkazy

  1. http://snippets.dzone.com/posts/show/2635

Místa k vylepšení, otázky

  1. Zlepšit reakci na vzniklé chyby, například, když dump repositáře nefunguje, jak má (řádky 62 a 72)
       

Hodnocení: 100 %

        špatnédobré        

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

Komentáře

Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře. , Tisk

Vložit další komentář

David Watzke avatar 28.3.2007 21:33 David Watzke | skóre: 74 | blog: Blog... | Praha
Rozbalit Rozbalit vše Re: Užitečné skripty 5: zálohujeme SVN repositář
Odpovědět | Sbalit | Link | Blokovat | Admin
what=$1

if [ "x$1" = "x" ]
then
	what=$defaultBackup
fi
lze nahradit za
what=${1:-$defaultBackup}
P.S.: s/exitting/exiting/g
“Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.