tag:blogger.com,1999:blog-40325397627301519142024-03-08T21:00:58.402+01:00OggersJuan Carlos Coruñahttp://www.blogger.com/profile/17578464077292503137noreply@blogger.comBlogger3125tag:blogger.com,1999:blog-4032539762730151914.post-76582345036887697932016-09-07T22:58:00.001+02:002016-09-07T23:00:26.579+02:00Pasando un repositorio mercurial a gitDesde la aparición de los repositorios distribuidos me posicioné más a favor de mercurial por aquello de estar programado en python y por haber un sitio web que permitía crear repositorios privados sin cobrar por ello. Al principio <a href="https://bitbucket.org/">Bitbucket</a> solo soportaba mercurial pero tenía una gran ventaja: se podian crear ilimitados repositorios privados.<br />
<br />
Actualmente manejo más de una centena de repositorios, alguno de ellos de tipo git y he decidido el ir migrando poco a poco los repositorios a git, para así tener un entorno más homogéneo.<br />
<br />
Investigando en Internet me he encontrado con una utilidad para hacer la migración más sencilla sin perder datos de ningún commit: <a href="https://github.com/frej/fast-export">https://github.com/frej/fast-export</a><br />
<br />
La migración es muy sencilla:<br />
Primero creamos el directorio del nuevo repositorio:<br />
<span style="font-size: x-small;"><span style="font-family: "courier new" , "courier" , monospace;">$ mkdir new_repository</span></span><br />
<span style="font-size: x-small;"><span style="font-family: "courier new" , "courier" , monospace;">$ cd new_repository</span></span><br />
<span style="font-size: x-small;"><span style="font-family: "courier new" , "courier" , monospace;">$ git init</span></span><br />
<span style="font-size: x-small;"><span style="font-family: "courier new" , "courier" , monospace;">$ hg-fast-export.sh -r <local-path-to-repository></span></span><br />
<br />
La utilidad solamente funciona con repositorios locales.<br />
Una vez migrado habrá que hacer el checkout a mano, porque sino parecerá que está vacío.<br />
<span style="font-size: x-small;"><span style="font-family: "courier new" , "courier" , monospace;">$ git checkout</span></span><br />
<br />
Una vez creado el repositorio remoto lo configuramos en nuestro nuevo repositorio local, por ejemplo:<br />
<span style="font-family: "courier new" , "courier" , monospace;"><span style="font-size: x-small;">$ git remote add origin git@bitbucket.org:oggers/new_repository.git</span></span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><span style="font-size: x-small;">$ git push origin master </span></span><br />
<br />
Advertencia: la utilidad usa python 2, por lo que si tu distribución linux usa la versión 3 de python por defecto, no te funcionará. En la distribución Antergos al menos ocurre esto y para solucionarlo rápidamente edité la utilidad para que usase python2.Juan Carlos Coruñahttp://www.blogger.com/profile/17578464077292503137noreply@blogger.com0tag:blogger.com,1999:blog-4032539762730151914.post-7462908163900880642016-09-06T09:47:00.003+02:002016-09-07T23:30:48.437+02:00Bareos, un fork de Bacula<h2>
</h2>
Hasta ahora he estado usando <a href="http://backuppc.sourceforge.net/">BackupPC</a> para hacer las copias de seguridad, sobre todo de los servidores vps remotos. Pero creo que ha llegado la hora de probar <a href="http://blog.bacula.org/">Bacula</a>.<br />
En mis búsquedas en Internet para informarme sobre Bacula encontré otro proyecto llamado Bareos que es un fork de Bacula. Parece que el fork se produjo debido a que la empresa que está detrás de Bacula solamente incorporó las mejoras y parches aportados por la comunidad en la versión comercial de Bacula. Ante este hecho algunos de los principales desarrolladores de la comunidad decidieron hacer el fork. Puedes leer más sobre esta historia <a href="http://www.bareos.org/en/faq/items/why_fork.html">aquí</a>.<br />
<h2>
Modulos de Bareos</h2>
Bareos se compone de una serie de módulos especializados:<br />
<h4>
Director</h4>
Este módulo es el que se encarga de toda la gestión de las copias de seguridad. Se comunica con el resto de modulos para ordenar una copia de seguridad o para hacer una restauración. Se ayuda de una base de datos para mantener las programaciones así como los catálogos de las copias de seguridad realizadas.<br />
<h4>
Console</h4>
Es una especie de terminal que permite interactuar con el director. Desde aquí se pueden lanzar trabajos y ver su estado. <br />
<h4>
Storage daemon</h4>
Este módulo es el encargado de gestionar los medios de almacenamiento, ya sean discos duros o dispositivos de cinta.<br />
<h4>
File daemon</h4>
También conocido como programa cliente. Es el responsable de interactuar con los archivos a respaldar o restaurar. Cada ordenador que se respalde tiene que tener este servicio instalado.<br />
<h4>
Web User Interface</h4>
Interfaz web para supervisar Bareos, aún no tiene demasiadas funcionalidades.<br />
<br />
Aquí tienes el manual de Bareos para seguir leyendo: <a href="http://doc.bareos.org/master/html/bareos-manual-main-reference.html">http://doc.bareos.org/master/html/bareos-manual-main-reference.html</a><br />
<br />
<h2>
Instalando Bareos en un servidor Ubuntu 14.04 LTS</h2>
En este documento el servidor usado para instalar Bareos es Ubuntu 14.04 LTS (64 bit).<br />
La pr<span style="font-family: inherit;">o<span style="font-size: small;">pia</span> </span>gente de Bareos mantienen un repositorio oficial de paquetes de Ubuntu, así que no tenemos problema, simplemente incluimos el repositorio y su clave:<br />
<br />
<span style="font-size: x-small;"><span style="font-family: "courier new" , "courier" , monospace;"># echo "deb http://download.bareos.org/bareos/release/latest/xUbuntu_14.04/ /" > /etc/apt/sources.list.d/bareos.list</span></span><br />
<br />
Tuve algún problema con la URL del repositorio, de acuerdo con la documentación era diferente, probablemente cuando estés leyendo esto ya esté <span style="font-family: inherit;">resuelto.<span style="font-size: x-small;"> </span></span><br />
<span style="font-family: inherit;"><span style="font-size: x-small;"><span style="font-size: small;">Para poder usar este nuevo repositorio bajamos su clave y la instalamos:</span></span></span><br />
<br />
<span style="font-size: x-small;"><span style="font-family: "courier new" , "courier" , monospace;">$ wget -q http://download.bareos.org/bareos/release/latest/xUbuntu_14.04/Release.key -O- | sudo apt-key add -</span></span><br />
<br />
Ahora ya podemos instalar Bareos:<br />
<br />
<span style="font-size: x-small;"><span style="font-family: "courier new" , "courier" , monospace;"># apt-get update</span></span><br />
<span style="font-size: x-small;"><span style="font-family: "courier new" , "courier" , monospace;"># apt-get install bareos bareos-database-postgresql</span></span><br />
<br />
Para instalar Bareos tienes que instalar el paquete bareos y el correspondiente a la base de datos que utilices, en mi caso al usar postgresql he instalado el paquete bareos-database-postgresql.<br />
<h4>
<span class="cmtt-8"><span style="font-size: x-small;"><span style="font-size: small;">Configurando bareos director</span></span></span></h4>
<span class="cmtt-8"><span style="font-size: x-small;"><span style="font-size: small;">Editar /etc/bareos/bareos-dir.conf para ajustar correctamente los correos electrónicos en las directivas Messages. </span></span></span><br />
<h2>
<span class="cmtt-8">Instalando el cliente Bareos en un puesto de trabajo Ubuntu 14.10</span></h2>
<span class="cmtt-8">Tienes que proceder de la misma forma que en el servidor para configurar el repositorio.</span><br />
<span class="cmtt-8">Una vez configurado el repositorio instalamos el cliente:</span><br />
<br />
<span style="font-size: x-small;"><span style="font-family: "courier new" , "courier" , monospace;"># apt-get update</span></span><br />
<span style="font-size: x-small;"><span style="font-family: "courier new" , "courier" , monospace;"># apt-get install bareos-client</span></span><br />
<br />
<span class="cmtt-8">Este metapaquete instala bareos-bconsole, bareos-client, bareos-common, bareos-filedaemon y bareos-traymonitor.</span><br />
<span class="cmtt-8">Ahora toca ajustar la configuración del filedaemon. Edita /etc/bareos/bareos-fd.conf poniendo los valores adecuados:</span><br />
<br />
<pre>Director {
Name = <bareos server director name>
Password = "<client filedaemon password>"
}
Director {
Name = <client bareos monitor name>
Password = "<client tray monitor password>"
Monitor = yes
}
FileDaemon { # this is me
Name = <client filedaemon name>
Maximum Concurrent Jobs = 20
}
Messages {
Name = Standard
director = <server director name> = all, !skipped, !restored
}</pre>
<br />
<div class="cmtt-8">
La contraseña que figura en la directiva Director -> Password será la contraseña que tiene que usar el servicio director para acceder al servicio filedaemon. <br />
Después de editar hay que reiniciar el servicio filedaemon:</div>
<pre># service bareos-fd restart</pre>
<br />
<div class="cmtt-8">
Edita /etc/bareos/tray-monitor.conf y establece los valores apropiados:</div>
<pre>Storage {
Name = <server storage daemon name>
Address = <bareos storage server dns name>
SDPort = 9103
Password = "<copy password from srvintranet-sd>" # look at bareos-fd.conf in server
}
Director {
Name = <server director name>
DIRport = 9101
address = <bareos director server dns name>
}
Messages {
Name = Standard
director = <director name> = all, !skipped, !restored
}</pre>
<br />
<h2 class="cmtt-8">
Instalando el cliente Bareos en un Ubuntu remoto para usar con un túnel ssh</h2>
<div class="cmtt-8">
Lo he extraído de <a href="http://wiki.bacula.org/doku.php?id=sshtunnel">esta guía</a>.</div>
<h4 class="cmtt-8">
Configurando OpenSSH en la parte del servidor</h4>
<div class="cmtt-8">
Hay que crear un directorio .ssh en el directorio home del usuario bareos para poder almacenar allí la pareja de claves ssh:</div>
<pre># mkdir -p /var/lib/bareos/.ssh
# chmod 700 /var/lib/bareos/.ssh
# chown bareos.bareos /var/lib/bareos/.ssh</pre>
<br />
<div class="cmtt-8">
Ahora creamos la pareja de claves ssh, pero tienes que asegurarte de no cifrar la clave privada con una frase ya que cuando se establezca la conexión el sistema preguntará por esta frase quedándose bloqueado hasta recibir respuesta y esto no es lo que queremos.</div>
<div class="cmtt-8">
Entra como usuario bareos y crea las claves:</div>
<pre>$ sudo -Hu bareos bash
$ cd .ssh
$ ssh-keygen -b 2048 -C "SSH Tunnel for bareos" -t rsa -f bareos_tunnel -N ""</pre>
<br />
<div class="cmtt-8">
Para no tener que usar opciones en el comando ssh creamos un archivo config en el directorio .ssh:</div>
<pre>Host <yourclientFQDN>
AddressFamily inet
ConnectionAttempts 10
ForwardAgent no
ForwardX11 no
ForwardX11Trusted no
GatewayPorts yes
HostBasedAuthentication no
HostKeyAlias <yourclientname>
HostName <yourclientFQDN>
IdentityFile ~/.ssh/bareos_tunnel
PasswordAuthentication no
Protocol 2
Compression yes
CompressionLevel 9
ServerAliveCountMax 3
ServerAliveInterval 15
TCPKeepAlive no
User tunneluser</pre>
<div class="code">
<br />
Si el servicio openssh estuviese escuchando en un puerto diferente al estándar 22 se puede añadir la siguiente línea al archivo config (puerto 12345 en este ejemplo):</div>
<pre> Port 12345</pre>
<br />
Y finalmente transfiere el archivo bacula_tunnel.pub a la maquina cliente.<br />
<h4 class="code">
Configurando OpenSSH en la parte del cliente</h4>
<div class="code">
Creamos un usuario llamado tunneluser:</div>
<pre># adduser -m -s /bin/false tunneluser</pre>
<br />
<div class="code">
Configuramos esta nueva cuenta de usuario:</div>
<pre># cd /home/tunneluser
# mkdir -p /home/tunneluser/.ssh
# touch /home/tunneluser/.ssh/authorized_keys
# # Asegúrate de usar la doble redirección >>, o destruirás cualquier clave autorizada previa.
# cat <donde_sea>/bacula_tunnel.pub >> /home/tunneluser/.ssh/authorized_keys
# chmod 700 /home/tunneluser/.ssh
# chmod 400 /home/tunneluser/.ssh/*
# chown -R tunneluser:tunneluser /home/tunneluser/.ssh</pre>
<br />
<div class="code">
La primera vez hay que hacer la conexión manualmente para que se almacene la huella digital del host. Ejecuta en el servidor Bareos:</div>
<pre>$ sudo -Hu bareos ssh <clientfqdm></pre>
<br />
<div class="code">
Recuerda que al crear el archivo ~/.ssh/config ya no nos hace falta usar opciones en el comando ssh ya que están configurados en el archivo config.</div>
<h4 class="code">
Instalando y configurando Bareos en la parte del cliente</h4>
<div class="code">
Procede como antes para configurar el repositorio bareos e instala el filedaemon:</div>
<pre># apt-get install bareos-filedaemon</pre>
<br />
<div class="code">
Edita el archivo de configuración del filedaemon:</div>
<pre>Director {
Name = <nombre director en el servidor bareos>
Password = "..."
}
FileDaemon {
Name = <nombre de lfile daemon>
Maximum Concurrent Jobs = 20
FDAddress = 127.0.0.1
FDPort = 9102
}</pre>
<br />
<div class="code">
Ahora aseguráte que el nombre dns del servidor que está corriendo el "storage daemon" no se resuelve desde el cliente, en caso contrario el sistema no funcionará. Crea una entrada en el archio /etc/hosts para que el nombre dns de este servidor resuelva a 127.0.0.1:</div>
<pre>127.0.0.1 server-sd.local server-sd</pre>
<h4 class="code">
Configuración bareos en la parte del servidor</h4>
<div class="code">
Configura los recursos client y job en bareos de la forma habitual.</div>
<div class="code">
Modifica el recurso client de la siguiente forma:</div>
<pre>Name=<yourclientFQDN-fd>
Address=localhost
FDPort=9112 # forward port</pre>
<br />
<div class="code">
Si configuras varios clientes remotos tienes que variar el FDPort en cada uno de ellos.<br />
<br />
En el recurso job añade la ejecución de un script antes de hacer el respaldo:</div>
<pre>Run Before Job = "/usr/local/sbin/sshbacula <yourclientFQDN> <forward_port>"</pre>
<br />
<div class="code">
El script para establecer el túnel ssh:</div>
<pre>#!/bin/bash
# Establishes a self-killing SSH tunnel to the
# given SSH server, and forwards the correct
# ports for bacula usage.
# Bacula-dir runs as user bacula, but with root's
# environment. We need to trick it into running
# actually looking for the .ssh directory in
# the right place.
USER=bareos
HOME=$(grep "^$USER:" /etc/passwd | cut -d : -f 6)
CLIENT=$1
LOCAL=$(hostname -f)
SSH=/usr/bin/ssh
FORWARD_PORT=$2
echo "Starting SSH-tunnel to $CLIENT..."
# -f means: go into background
# -C means: use compression
# -2 means: only use SSH2
# -R 9101:$LOCAL:9101 means: when client connects to remote port 9101 (bacula-dir), it will be
# forwarded to this machine.
# -R 9103:$LOCAL:9103 means: when client connects to remote port 9101 (bacula-sd), it will be
# forwarded to this machine.
# -L 9112:localhost:9102 means: when bacula-dir connects to port 9112 (instead of the normal 9102),
# it will be forwarded to the client's FD. The client will think the connection was to port
# 9102 as usual
# sleep 60 is a simple command that will execute on the server and does nothing for 60 seconds,
# then it exits. This keeps ssh running for 60 seconds. Once we connect to the FD, that
# connection will keep ssh running even beyond the 60 seconds.
# Using this approach, we do not need to tear down the tunnel later, it disconnects itself
# automagically.
# It is important to redirect stdout and stderr, or else bareos will not realize that the
# script has terminated.
$SSH -fC2 -R 9101:$LOCAL:9101 -R 9103:$LOCAL:9103 -L $FORWARD_PORT:localhost:9102 $CLIENT sleep 60 >/dev/null 2>/dev/null
# give ssh a little time to establish the connection.
sleep 10</pre>
<h4 class="cmtt-8">
A tener en cuenta</h4>
<div class="cmtt-8">
Cuando se lanza un trabajo la directiva "run before job" se encarga de establecer el tunel para comunicar con el cliente, pero cuando se quiere averiguar el estado del cliente no existe la posibilidad de lanzar previamente la creación del tunel. En este caso no nos queda otro remedio que crear el tunel a mano con el comando:</div>
<div class="cmtt-8">
<br /></div>
<div class="cmtt-8">
<span style="font-size: x-small;"><span style="font-family: "courier new" , "courier" , monospace;">$ ssh -C2 -R 9101:server-director-ip:9101 -R 9103:server-director-ip:9103 -L 9112:localhost:9102 client-ip -N</span></span></div>
<div class="cmtt-8">
<br /></div>
<div class="cmtt-8">
<br /></div>
Juan Carlos Coruñahttp://www.blogger.com/profile/17578464077292503137noreply@blogger.com0tag:blogger.com,1999:blog-4032539762730151914.post-37495104639162864052011-03-03T23:45:00.000+01:002011-03-03T23:45:26.155+01:00Virtualenv<a href="http://pypi.python.org/pypi/virtualenv">Virtualenv</a> permite crear entornos virtuales de <a href="http://www.python.org/">Python</a> aislados unos de otros con sus propios conjuntos de paquetes. El intérprete python es realmente el mismo en todos los entornos virtuales, sin embargo, los paquetes que se instalen desde el entorno virtual pertenecen al ámbito de cada entorno virtual. Los paquetes instalados en el ámbito del sistema están disponibles desde cualquier entorno virtual.<br />
Cuando se desarrolla en python puede ser necesario un paquete de un versionado diferente al que está instalado en el ordenador. Para esto se crea un entorno virtual de python con su propio conjunto de paquetes con el versionado deseado, así no se interfiere en los paquetes instalados en el ámbito del sistema o en al ámbito de otro entorno virtual.<br />
<br />
<span class="Apple-style-span" style="font-size: large;">Ins<span class="Apple-style-span" style="font-family: inherit;">talac</span>ión de Virtualenv</span><br />
Esta instalación ha sido realizada en el siguiente sistema:<br />
<ul><li>Kubuntu 10.10 64 bit</li>
<li>Python 2.6.6</li>
</ul>Para instalar virtualenv lo más sencillo es usar el gestor de paquetes <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"><b>easy_install</b></span>:<br />
<br />
<pre class="brush: shell; gutter: false; toolbar: false" name="shell">$ sudo easy_install virtualenv
install_dir /usr/local/lib/python2.6/dist-packages/
Searching for virtualenv
Reading http://pypi.python.org/simple/virtualenv/
Reading http://virtualenv.openplans.org
Best match: virtualenv 1.5.1
Downloading http://pypi.python.org/packages/source/v/virtualenv/virtualenv-1.5.1.tar.gz#md5=3daa1f449d5d2ee03099484cecb1c2b7
Processing virtualenv-1.5.1.tar.gz
Running virtualenv-1.5.1/setup.py -q bdist_egg --dist-dir /tmp/easy_install-cnxeNj/virtualenv-1.5.1/egg-dist-tmp-Ypb83B
warning: no previously-included files matching '*.*' found under directory 'docs/_templates'
Adding virtualenv 1.5.1 to easy-install.pth file
Installing virtualenv script to /usr/local/bin
Installed /usr/local/lib/python2.6/dist-packages/virtualenv-1.5.1-py2.6.egg
Processing dependencies for virtualenv
Finished processing dependencies for virtualenv</pre><br />
<span class="Apple-style-span" style="font-size: large;">Crear un entorno virtual</span><br />
Para crear un entorno virtual sencillamente usar el comando:<br />
<pre class="brush: shell; gutter: false; toolbar: false" name="shell">$ virtualenv test1</pre><br />
He aquí algunas opciones interesantes de la utilidad virtualenv:<br />
<b><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">--no-site-packages</span></b>: no incluir los paquetes que se encuentran en el site-packages del ámbito del sistema.<br />
<b><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">-p PYTHON_EXE</span></b>: usar el intérprete PYTHON_EXE en lugar del intérprete por defecto que es el que ha sido usado para instalar virtualenv.<br />
<br />
<span class="Apple-style-span" style="font-size: large;">Usar el entorno virtual</span><br />
Para empezar a usar el entorno virtual ejecutar:<br />
<pre class="brush: shell; gutter: false; toolbar: false" name="shell">$ source test1/bin/activate</pre><br />
El indicador del sistema cambiará, incluyendo el directorio del entorno virtual activo entre paréntesis. Para testear el entorno se puede instalar por ejemplo el paquete <a href="http://pypi.python.org/pypi/yolk" style="font-family: 'Courier New', Courier, monospace;">yolk</a><span class="Apple-style-span" style="font-family: inherit;"> y ejecutarlo</span>:<br />
<pre class="brush: shell; gutter: false; toolbar: false" name="shell">(test1) $ easy_install yolk
(test1) $ yolk -l
Python - 2.6.6 - active development (/usr/lib/python2.6/lib-dynload)
pip - 0.8.1 - active
setuptools - 0.6c11 - active
wsgiref - 0.1.2 - active development (/usr/lib/python2.6)
yolk - 0.4.1 - active
</pre><div><br />
</div>Para salir del entorno virtual:<br />
<pre class="brush: shell; gutter: false; toolbar: false" name="shell">(test1) $ deactivate</pre>y se vuelve al indicador normal.<br />
<br />
Fuera del entorno virtual la utilidad yolk no estará disponible.Juan Carlos Coruñahttp://www.blogger.com/profile/17578464077292503137noreply@blogger.com0