Oggi si è presentato un compito davvero arduo: migrare i repository subversion da una macchina CentOS 5.5 ad una macchina Debian 5.0.7.
Ovviamente il compito non era proprio banalissimo, dal momento che si dovevano spostare decine di repository con GigaByte di dati a bordo, e ovviamente non volevo fare tutto a manina. Cosa non meno importante, nel mio caso, era che i backup dei repository fallivano perchè per qualche motivo, ancora non ben definito, la partizione di backup andava a rimontarsi in read-only.

Beh, come prima cosa ho ovviamente installato il server debian, cercando di mantenere la stessa struttura per quello che riguarda la configurazione dei repository della macchina CentOS. Ho creato un disco per i repository che avrei montato sotto /svn ed un disco di capacità eguale che avrei montato poi sotto /home/backup.

Anche gli utenti sono stati riportati, quindi svnusr e backup, con i rispettivi path e le rispettive password (queste potevo anche cambiarle, ma ho preferito così).

Installato il sistema base, ho provveduto ad installare tramite aptitude subversion.
Dal momento che comunque avevo problemi sui dischi della macchina CentOS, ho preferito installare anche samba server e configurato in maniera molto minimale, giusto per condividere la directory sulla quale, all’ora prefissata, avrei effettuato il backup dei miei repository.

A questo punto dovevo ricreare i miei repository e poi importarmi le configurazioni, e poi alla fine reimportarmi i backup.

Ricreare i repository è stato abbastanza semplice.

#!/bin/bash
# svn-repos.sh
# Gioachino Bartolotta 05-01-2011
####################################################
# Questo script monitora tutta la cartella dei repository
# e prende tutti quelli che sono repository validi
# all’interno della cartella del repository
####################################################

# La directory dei nostri repository
DIR_SVN="/svn"

for i in `find $DIR_SVN -name ‘db’`
do
  # Con questa espressione ci facciamo restituire il percorso relativo del repository
  # sul quale andremo a fare il dump dei dati
  # NOTA.
  # Per estrarre la subsring la sintassi è
  # ${stringa:punto_partenza:lunghezza}
  # Per estrarre la lunghezza della stringa
  # ${#stringa}
  REPO=`dirname "${i:${#DIR_SVN}+1:${#i}-${#DIR_SVN}}"`
  echo "svnadmin create $REPO" >> /root/create_repos.sh
done;

Eseguiamo lo script appena creato sul server da migrare, per ottenere la lista di quelli che vanno reimplementati.

chmod +x svn-repos.sh && ./svn-repos.sh

Come si nota l’output di quel file viene mandato su un file chiamato create_repos.sh, che ci servirà dopo per poter ricreare la nostra precedente struttura.
Tramite scp dalla macchina Debian ci andiamo a prendere il file e lo copiamo sotto la cartella dei repository (/svn nel mio esempio).

scp root@server_da_migrare:create_repos.sh /svn

A questo punto facciamo:

su – svnusr

E dopo:

sh ./create_repos.sh
exit

In meno di un minuto abbiamo di nuovo la stessa struttura che risiede sull’altro server!!
I file di configurazione sono tanti, e non posso simulare ogni volta la connessione ssh e digitare la password, non finirei mai (oltre alla possibilità di avere errori di battitura). Ho quindi creato una coppia di chiavi senza necessità della password per autenticarmi sul server CentOS, usando (ovviamente) questa guida.
Il compito non è finito, perchè adesso abbiamo comunque le nostre configurazioni mancanti, e per far questo faccio qualcosa di simile a prima.
Mi creo uno script che si chiama svn-config.sh che è praticamente uguale al precedente ad eccezione di una riga.

#!/bin/bash
# svn-config.sh
# Gioachino Bartolotta 05-01-2011

# La directory dei nostri repository
DIR_SVN="/svn"

for i in `find $DIR_SVN -type d -name ‘conf’`
do
  REPO=`dirname "${i:${#DIR_SVN}+1:${#i}-${#DIR_SVN}}"`
  echo "scp -r -i .ssh/miachiave_dsa root@10.192.1.20:$DIR_SVN/$REPO/conf/* $DIR_SVN/$REPO/conf/" >> /root/get_config.sh
done

Eseguo

chmod +x svn-config.sh && ./svn-config.sh

Come utente root prima mi copio il file tramite scp sulla cartella /svn della macchina debian e poi lo lancio.

scp -i .ssh/miachiave_dsa root@server_da_migrare:get_config.sh .
sh ./get_config.sh

Siamo già a metà dell’opera!!!
Adesso come utente root sul server da migrare, non ci resta che montare la directory remota via samba e creare lo script di backup che carichi i nostri dump all’interno della condivisione.

mount -t cifs -o username=miouser,password=miapass //192.168.1.1/backup_svn /home/backup

E preparare lo script svn-backup.sh da lanciare per conservare i repository subversion:

#!/bin/bash
# svn-backup.sh
# Gioachino Bartolotta 05-01-2011
##############################################
# Questo script monitora tutta la cartella dei repository di subversion
# e prende tutti quelli che sono repository validi, che hanno cioè
# un file format all’interno della cartella del repository.
# Dopo di che fa il backup e li sposta
# in una directory di backup dove il dump
# (per svn migliore rispetto alla copia fisica del file)
# viene poi eventualmente compresso e preparato per il successivo
# trasferimento su directory condivisa.
##############################################

# Un file di log per il controllo delle operazioni
LOGFILE="/var/log/svn_backup.`date +%Y-%m-%d`.log"

echo "$(date +%x) $(date +%T) Inizio backup" >> $LOGFILE

# La directory dei nostri repository
DIR_SVN="/svn"

# Una directory temporanea dove appoggiare una copia del repository
DIR_TMP="/home/backup/tmp"

# La directory dove salvare il dump compresso del repository
DIR_BACKUP="/home/backup/svn"

BACKUP_FILE="backup.tar.gz"
# Se non esiste il file di log, crealo
if [ ! -e "$LOGFILE" ]; then
  touch $LOGFILE
fi

for i in `find $DIR_SVN -name ‘db’`
do
  REPO=`dirname "${i:${#DIR_SVN}+1:${#i}-${#DIR_SVN}}"`

  echo "`date +%Y-%m-%d` `date +%r` : $REPO" >> $LOGFILE
  echo "`date +%Y-%m-%d` `date +%r` : Creo la cartella $REPO nella dir temporanea " >> $LOGFILE

  mkdir -p $DIR_TMP/svn_backup/$REPO
  echo "`date +%Y-%m-%d` `date +%r` : Creo la cartella del backup per il repository $REPO" >> $LOGFILE
  mkdir -p $DIR_BACKUP/$REPO

  echo "`date +%Y-%m-%d` `date +%r` : Eseguo hotcopy del repository $REPO" >> $LOGFILE
  /usr/bin/svnadmin hotcopy $DIR_SVN/$REPO $DIR_TMP/svn_backup/$REPO

  echo "`date +%Y-%m-%d` `date +%r` : Eseguo il dump del repository $REPO" >> $LOGFILE
  /usr/bin/svnadmin dump "$DIR_TMP/svn_backup/$REPO" > "$DIR_BACKUP/$REPO/dump"
  # Questa opzione la possiamo attivare per il backup vero e proprio qualora
  # vogliamo risparmiare spazio su disco
  # bzip2 "$DIR_BACKUP/$REPO/dump"

  echo "`date +%Y-%m-%d` `date +%r` : Rimuovo cartella temporanea" >> $LOGFILE
  rm -Rf $DIR_TMP/svn_backup/$REPO
  echo "" >> $LOGFILE
done;
# Al termine dell’importazione, creiamo un tar.gz così da poter essere
# spostato su un supporto diverso per backup
tar -zcf /home/backup/$BACKUP_FILE /home/backup/svn/

# Facciamoci arrivare una email al termine dell’operazione.
echo | mutt -a $LOGFILE -s "Log Backup svn server" miaemail@mioserver.it

A questo punto non ci resto solo che ricaricare i nostri repository sul nuovo server!
Lo script che andremo a mettere in piedi sarà verosimilmente simile agli altri.

#!/bin/bash
# svn-load.sh
# Gioachino Bartolotta 05-01-2011
####################################################
# Questo script monitora tutta la cartella dei repository
# e prende tutti quelli che sono repository validi
# all’interno della cartella del repository
####################################################
# La directory dove salvare il dump del repository
DIR_BACKUP="/home/backup/svn"

# La directory dei nostri repository
DIR_SVN="/svn"

for i in `find $DIR_SVN -name ‘db’`
do
  REPO=`dirname "${i:${#DIR_SVN}+1:${#i}-${#DIR_SVN}}"`
  echo "svnadmin load $DIR_SVN/$REPO < $BACKUP_DIR/$REPO/dump" >> /svn/reload_repos.sh
done;

A questo punto come utente svn lanciamo lo script svn_load.sh che produrrà il nostro reload_repos.sh per reimportare i nostri repository.

chmod +x ./svn-load.sh && ./svn-load.sh
cd /svn
./reload_repos.sh

Al termine della procedura, i nostri repository sono stati reimportati senza grossi problemi, e soprattutto senza nemmeno troppi sforzi da parte nostra.

VN:F [1.9.16_1159]
Rating: 0.0/10 (0 votes cast)
VN:F [1.9.16_1159]
Rating: 0 (from 0 votes)
Creare PDF    Invia l'articolo in formato PDF