<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>igayoso's life &#187; manual</title>
	<atom:link href="http://blog.igayoso.net/tag/manual/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.igayoso.net</link>
	<description>Mi vida plasmada en un blog</description>
	<lastBuildDate>Fri, 25 Sep 2009 15:08:30 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Script para bajar todas las canciones de ultrastar-es.org</title>
		<link>http://blog.igayoso.net/script-para-bajar-todas-las-canciones-de-ultrastar-es-org/</link>
		<comments>http://blog.igayoso.net/script-para-bajar-todas-las-canciones-de-ultrastar-es-org/#comments</comments>
		<pubDate>Wed, 02 Sep 2009 09:33:29 +0000</pubDate>
		<dc:creator>igayoso</dc:creator>
				<category><![CDATA[Técnico]]></category>
		<category><![CDATA[awk]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[canciones]]></category>
		<category><![CDATA[descargar]]></category>
		<category><![CDATA[how-to]]></category>
		<category><![CDATA[jdownloader]]></category>
		<category><![CDATA[manual]]></category>
		<category><![CDATA[mediafire]]></category>
		<category><![CDATA[plowshare]]></category>
		<category><![CDATA[script]]></category>
		<category><![CDATA[sed]]></category>
		<category><![CDATA[songs]]></category>
		<category><![CDATA[tucan]]></category>
		<category><![CDATA[ultrastar]]></category>
		<category><![CDATA[ustar]]></category>
		<category><![CDATA[ustar-es]]></category>

		<guid isPermaLink="false">http://blog.igayoso.net/?p=154</guid>
		<description><![CDATA[Debido a la aventura que me ha sido encomendada para la despedida de Coto a.k.a. &#8220;Despedida Legendaria&#8220;, he tenido que bajarme todas las canciones del karaoke libre llamado UltraStar, que hay en la WEB de ustar-es.
Como tenían varias formas de evitar que puedas descargar de forma automática todos estos ficheros, que a su vez están [...]]]></description>
			<content:encoded><![CDATA[<p>Debido a la <strong>aventura</strong> que me ha sido encomendada para la <strong>despedida de Coto </strong>a.k.a. &#8220;<a title="Post legendario" href="http://blog.igayoso.net/legendario/" target="_self">Despedida Legendaria</a>&#8220;, he tenido que <strong>bajarme</strong> todas las <strong>canciones</strong> del <strong>karaoke</strong> libre llamado <a title="WEB de UltraStar" href="http://sourceforge.net/projects/ultrastar/" target="_blank">UltraStar</a>, que hay en la <strong>WEB</strong> de <a title="WEB de UltraStar en Español" href="http://ultrastar-es.org" target="_blank">ustar-es</a>.</p>
<p>Como tenían varias formas de <strong>evitar</strong> que puedas descargar de <strong>forma automática</strong> todos estos ficheros, que a su vez están <em>hosteados</em> en <a title="WEB de MediaFire" href="http://mediafire.com" target="_blank">MediaFire</a>, he tenido que tirar de<em> curl</em> y <em>parsear</em> un montón para llegar a hacer la <strong>lista de descargas</strong>, aquí os dejo el <em>script</em> hecho en <em>bash</em>, también la lista para ejecutarlo y por último la <em>app</em> que he usado para <strong>descargar</strong> de <em>MediaFire</em>.</p>
<p>cookie=&#8221;./cookie&#8221; #Creamos una cookie para que podamos loguearnos en la WEB<br />
useragent=&#8217;Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; es-ES; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2&#8242; #Falseamos un UA y que no de mucho cante en los LOGs de la WEB<br />
sid=`awk &#8216;/sid/ { print $7}&#8217; $cookie` #Necesitamos un id que se crea con la cookie para seguir los enlaces a la descarga<br />
canciones=&#8221;$1&#8243; #Cogemos por parámetro la WEB de las canciones, en este caso será por letra y página<br />
user=&#8221;usuario_de_la_web&#8221; #Tendremos que tener un usuario/contraseña válido para hacer login<br />
passwd=&#8221;passwd_del_user&#8221;</p>
<p>echo &#8220;Haciendo Login&#8230;&#8221;<br />
#Con esta línea, lo que hacemos con curl es loguearnos en la WEB, que en realidad corre un foro phpBB por debajo (si no me equivoco), para ellos curl creará una cookie y cogerá las variables que hemos declarado arriba para el UA, user y password. El redirect da igual, porque en realidad no lo hará, únicamente es para crear la cookie con el login correcto<br />
curl http://ultrastar-es.org/foro/ucp.php?mode=login -d login=Identificarse -d password=$passwd -d redirect=..//canciones.php?letra=A -d username=$user -A &#8220;$useragent&#8221; -b ${cookie} -c ${cookie} &#8211;silent</p>
<p>echo &#8220;Pillando todas las caciones..&#8221;<br />
#Con el primer bucle, saco los IDs de las canciones, para luego seguir el link y que me lleve al link final de MediaFire. Para ello, uso la cookie creada anteriormente y el UA. Parseo el código de la WEB para únicamente sacar el ID<br />
for ncancion in `curl $canciones -b ${cookie} -c ${cookie} -A &#8220;$useragent&#8221; | awk &#8216;/amp;id/ { print }&#8217; | awk &#8216;{ FS=&#8221;amp;id=&#8221;; RS=&#8221;\&#8221; title=&#8221;;  print $2 }&#8217; | grep -ve ^$`<br />
do<br />
#Por último, sacando los IDs de cada canción, lo que hago es seguir el link de la WEB y que me lleve a la página de descarga de MediaFire para poder parseala. Una vez parseada, saco únicamente el link y lo meto dentro de un fichero llamado listado.txt, con él ya podré descargar todos los ficheros.<br />
`curl -L -A &#8220;$useragent&#8221; -b ${cookie} -c ${cookie} &#8220;http://ultrastar-es.org/canciones.php?op=descargar&amp;id=$ncancion&amp;sid=$sid&#8221; | awk &#8216;FS=&#8221;&amp;quot;&#8221; { print $2 };&#8217; | grep -ve ^$  &gt;&gt; ./listado.txt `<br />
done</p>
<p>Ahora ya tentemos un <strong>fichero</strong> de texto llamado <em>listado.txt</em>, que contendrá todos los <em>links</em> de <strong>descaga</strong> de <em>MediaFire</em>. Lo que haremos ahora será usar algún <strong>programa</strong> que <strong>automatice</strong> el proceso de <strong>descarga</strong>, ya que si no tendríamos que hacerlo a mano<strong> uno por uno</strong> y no valdría para nada este <em>script</em>.</p>
<p>Después de <strong>probar</strong> <strong><a title="WEB de JDownloader" href="http://jdownloader.org/" target="_blank">JDownloader</a></strong> y no poder hacer nada porque no funcionaba muy bien el tema del <em>captcha</em>, aunque es un <em>bug</em> conocido y están reparándolo, encontré <strong><a title="WEB de Tucan" href="http://tucaneando.com/" target="_blank">Tucan</a></strong>, un proyecto español y muy <em>alpha</em>, que esta vez el error estaba a la hora de crear carpetas, que en las que incluía <em>&#8216;/&#8217;</em> daba error y cerraba el programa (he creado <a title="WEB del Bug de Tucan" href="http://urlcorta.es/60z" target="_blank">una entrada</a> en su bugtrack). Finalmente encontré <strong><a title="WEB de plowshare" href="http://code.google.com/p/plowshare/" target="_blank">plowshare</a></strong>, otro proyecto libre y español que lo hace todo desde la <strong>consola</strong>, así que finalmente me decanté por él.</p>
<p>Para <strong>instalarlo</strong>, tenéis que seguir la <a title="WEB de instalación y uso de Tucan" href="http://doc.tucaneando.com/readme.html#instalaci-n-y-uso" target="_blank">instrucciones</a> de su <strong>WEB</strong> y con el listado ya creado, ejecutar:</p>
<p>plowdown listado.txt</p>
<p>Tardará lo suyo, porque <em>MediaFire</em> limita mucho el<strong> ancho de banda</strong>, así que paciencia <img src='http://blog.igayoso.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Si tenéis alguna duda, poneros en <a title="Contacta conmigo" href="http://blog.igayoso.net/contacto/" target="_self">contacto</a> conmigo <img src='http://blog.igayoso.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<div id="crp_related"><h3>Post relacionados:</h3><ul><li><a href="http://blog.igayoso.net/bebe-que-twittea-antes-de-nacer-kickbee/" rel="bookmark">Bebe que twittea antes de nacer - kickbee</a></li><li><a href="http://blog.igayoso.net/legendario/" rel="bookmark">Legendario</a></li><li><a href="http://blog.igayoso.net/screencast-1-iniciacion-wordpress/" rel="bookmark">Screencast #1: Iniciación Wordpress</a></li><li><a href="http://blog.igayoso.net/un-water-twitteador/" rel="bookmark">Un water twitteador</a></li><li><a href="http://blog.igayoso.net/servicio-alsa-wifi-en-supra/" rel="bookmark">Servicio Alsa WiFi en Supra</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://blog.igayoso.net/script-para-bajar-todas-las-canciones-de-ultrastar-es-org/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Instalación y configuración de TRAC</title>
		<link>http://blog.igayoso.net/instalacion-y-configuracion-de-trac/</link>
		<comments>http://blog.igayoso.net/instalacion-y-configuracion-de-trac/#comments</comments>
		<pubDate>Mon, 31 Aug 2009 11:25:59 +0000</pubDate>
		<dc:creator>igayoso</dc:creator>
				<category><![CDATA[Técnico]]></category>
		<category><![CDATA[how-to]]></category>
		<category><![CDATA[manual]]></category>
		<category><![CDATA[subversion]]></category>
		<category><![CDATA[svn]]></category>
		<category><![CDATA[trac]]></category>

		<guid isPermaLink="false">http://blog.igayoso.net/?p=144</guid>
		<description><![CDATA[Después del post del otro día sobre SVN, que mejor que unir este maravilloso gestor de tareas para proyectos en SVN. Digo lo mismo que el otro día, si alguien lo quiere en PDF, solo tiene que pedírmelo  
Comenzaremos instalando el trac vía apt-get:
# apt-get install trac
Creamos el entorno para que trabaje trac. Esto [...]]]></description>
			<content:encoded><![CDATA[<p>Después del <a title="HOW-TO SVN" href="http://blog.igayoso.net/configuracion-…subversion-svn/" target="_self">post</a> del otro día sobre SVN, que mejor que unir este maravilloso gestor de tareas para proyectos en SVN. Digo lo mismo que el otro día, si alguien lo quiere en PDF, solo tiene que<a title="Contacta conmigo" href="http://blog.igayoso.net/contacto/" target="_self"> pedírmelo</a> <img src='http://blog.igayoso.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Comenzaremos instalando el trac vía apt-get:</p>
<p># apt-get install trac</p>
<p>Creamos el entorno para que trabaje trac. Esto se compondrá de un directorio donde irá guardando todos los datos:</p>
<p># trac-admin /etc/trac/pruebas initenv</p>
<p>Nos hará varias preguntas para configurar trac, en las que responderemos:</p>
<p>Creating a new Trac environment at /etc/trac/pruebas2</p>
<p>Trac will first ask a few questions about your environment<br />
in order to initalize and prepare the project database.</p>
<p>Please enter the name of your project.<br />
This name will be used in page titles and descriptions.</p>
<p>Project Name [My Project]&gt;carreteras</p>
<p>Aquí le diremos el nombre que tendrá nuestro proyecto en trac, en este caso carreteras.</p>
<p>Please specify the connection string for the database to use.<br />
By default, a local SQLite database is created in the environment<br />
directory. It is also possible to use an already existing<br />
PostgreSQL database (check the Trac documentation for the exact<br />
connection string syntax).</p>
<p>Database connection string [sqlite:db/trac.db]&gt;[Pulsamos enter]</p>
<p>Ahora nos preguntará donde queremos y que motor de base de datos queremos usar, dejamos la opción por defecto, es decir, pulsamos enter sin más.</p>
<p>Please specify the type of version control system,<br />
By default, it will be svn.</p>
<p>If you don&#8217;t want to use Trac with version control integration,<br />
choose the default here and don&#8217;t specify a repository directory.<br />
in the next question.</p>
<p>Repository type [svn]&gt; [Pulsamos enter]</p>
<p>Podremos usar trac con un proyecto de svn ya hecho, si es este el caso y usamos svn pulsaremos enter para que marque la opción por defecto.</p>
<p>Please specify the absolute path to the version control<br />
repository, or leave it blank to use Trac without a repository.<br />
You can also set the repository location later.</p>
<p>Path to repository [/path/to/repos]&gt; /home/sistemas/proyectos</p>
<p>Lo que configuraremos ahora será, solo en el caso de que vayamos a usar trac con un proyecto de svn y será el directorio del repositorio de svn a trabajar, en este caso /home/sistemas/proyectos</p>
<p>Por último nos preguntará el directorio de plantillas, donde ha sido instalado trac, en este caso está en el directorio por defecto, así que daremos al enter para acabar de configurar el entorno:</p>
<p>Please enter location of Trac page templates.<br />
Default is the location of the site-wide templates installed with Trac.</p>
<p>Templates directory [/usr/share/trac/templates]&gt; [Pulsamos enter]</p>
<p><strong>Arrancar el servidor de trac</strong></p>
<p><strong>En modo standalone</strong></p>
<p>Ahora ya tendremos configurado el entorno, ahora vamos a lanzar el servicio de forma “standalone” para ver a tiempo real los accesos, luego lo mandaremos en modo demonio y lo meteremos en el inicio del sistema, para que arranque cuando arrancamos la máquina.</p>
<p># tracd &#8211;port 8000 /etc/trac/pruebas</p>
<p>Si no ha habido ningún problema, arrancará nuestro servidor de trac, con el entorno que hemos configurado en el paso anterior, por lo tanto para ver trac en la WEB, abriremos un navegador e iremos al puerto de trac:</p>
<p>http://localhost:8000/carreteras</p>
<p>Veremos que trac está funcionando en este puerto y para el proyecto y entorno que hemos creado.<br />
<strong><br />
En modo demonio</strong></p>
<p>Ahora vamos a ejecutar trac como demonio, para que no tengamos que tenerlo siempre ejecutado en una consola, por lo tanto meteremos el flag d y lo ejecutaremos:</p>
<p># tracd –d &#8211;port 8000 /etc/trac/pruebas</p>
<p>Por ultimo vamos a meterlo como demonio en el arranque del sistema. Creamos un script que arranque el trac en modo demonio, como hemos hecho a lo último y lo metemos en un fichero dentro de /etc/init.d:</p>
<p># vim /etc/init.d/tracd</p>
<p>Y metemos dentro la línea de ejecución:</p>
<p>tracd –d &#8211;port 8000 /etc/trac/pruebas</p>
<p>Le damos permisos de ejecución:</p>
<p># chmod a+x /etc/init.d/tracd</p>
<p>Y por ultimo lo metemos en los rc:</p>
<p># update-rc.d -f tracd defaults</p>
<p>Como hemos puesto por defecto, lo meterá en todos los arranques del sistema (0-6). Por ultimo probaremos si se arranca bien, ejecutando:</p>
<p># /etc/init.d/tracd start</p>
<p>Si quisiéramos que al hacer stop/restart también funcionara, tendríamos que modificar el script que hay en init.d para que lo hiciera, como no es nuestro caso, lo dejaremos así de momento.</p>
<p><strong>Usando el mod_python</strong></p>
<p>Según la recomendación de trac, una forma de usarlo, de la manera más rápida y/o cómoda es con mod_python, un módulo de apache2 para que funcione python en él, por lo tanto vamos a instalarlo y configurarlo, primero instalamos los paquetes necesarios:</p>
<p># apt-get install libapache2-mod-python libapache2-mod-python-doc</p>
<p>Activamos el módulo en apache2, por si no lo hace él solo a la hora de instalar:</p>
<p># a2enmod mod_python</p>
<p>Creamos dentro de apache2 la localización para entrar a él vía WEB, por lo tanto editamos el fichero por defecto del virtualhost (o el que vayamos a usar) e introducimos las siguientes líneas:</p>
<p># vim /etc/apache2/sites-enable/000-default</p>
<p>&lt;Location /trac&gt;<br />
SetHandler mod_python<br />
PythonInterpreter main_interpreter<br />
PythonHandler trac.web.modpython_frontend<br />
PythonOption TracEnv /etc/trac/carreteras<br />
&lt;/Location&gt;</p>
<p>Hay veces que se arma líos con las rutas y los estilos, por si acaso meteremos este alias en apache2 para que sepa bien dónde está:</p>
<p># vim /etc/apache2/sites-enable/000-default</p>
<p>Alias /trac/css &#8220;/usr/share/trac/htdocs/css&#8221;<br />
&lt;Location /trac/css&gt;<br />
SetHandler None<br />
&lt;/Location&gt;</p>
<p>Para finalizar, tenemos que reiniciar apache2 para que coja estás nuevas localizaciones y rutas, por lo tanto:</p>
<p># /etc/init.d/apache2 restart</p>
<p>Y si ahora vamos a la nueva dirección para entrar en trac, que en este caso no hará falta entrar a través del puerto 8000, ya que no lo hemos configurado así, iremos:</p>
<p>http://localhost/trac</p>
<p><strong>Configurar los permisos en trac por usuario</strong></p>
<p>Dentro de trac podremos crear usuarios para que puedan crear tickets, corregirlos, cerrarlos, etc… para ello usaremos contraseñas de apache2 y en este caso aprovecharemos las que usamos en svn/dav y así tenerlas todas en el mismo sitio. El directorio de login dentro de trac está en:</p>
<p>/trac/login</p>
<p>Por lo tanto vamos a crear una nueva localización y darle permisos con contraseñas de apache2:</p>
<p># vim /etc/apache2/sites-enable/000-default</p>
<p>&lt;Location /trac/login&gt;<br />
AuthType Basic<br />
AuthName &#8220;Trac Login&#8221;<br />
AuthUserFile /etc/apache2/dav_svn.passwd<br />
Require valid-user<br />
&lt;/Location&gt;</p>
<p>Ahora ya podremos hacer autentificarnos, dentro de trac en el apartado login, usando la autentificación de apache2 que también usamos para el svn/dav.</p>
<p>Si quisiéramos usar otro fichero de contraseñas, únicamente tendríamos que crearlo con htpasswd y meterlo en el Location.</p>
<p><strong>Configuración de un plugin: webadmin</strong></p>
<p>En este apartado vamos a matar dos pájaros de un tiro, por una parte vamos a mostrar como configurar e instalar un plugin de trac y para ello, usaremos el webadmin, que es una forma fácil de configurar nuestros proyectos en trac sin usar la consola con el comando trac-admin.</p>
<p>Lo primero que vamos a hacer es instalar un paquete necesario para python:</p>
<p># apt-get install python-setuptools</p>
<p>Una vez instalado, nos bajaremos el código del webadmin y haremos un fichero .egg, que será el plugin comprimido, bajamos el código:</p>
<p># cd /tmp<br />
# svn export http://svn.edgewall.com/repos/trac/sandbox/webadmin/</p>
<p>El código lo tendremos dentro de la carpeta webadmin, ahora vamos a usar python para crear el .egg:</p>
<p># cd webmin<br />
# python setup.py bdist_egg</p>
<p>Ahora que ya lo tenemos, lo metemos dentro de la carpeta plugins de nuestro entorno. El .egg estará en la carpeta dist:</p>
<p># cp dist/* /etc/trac/carreteras/plugins/</p>
<p>Para casi finalizar, meteremos dentro del entorno este plugin, editando el fichero trac.ini y añadiendo unas líneas:</p>
<p># vim /etc/trac/carreteras/conf/trac.ini</p>
<p>[components]<br />
webadmin.* = enabled</p>
<p>Para finalizar daremos permisos a uno o más usuarios para poder usar este plugin, para ello usaremos trac-admin:</p>
<p># trac-admin /etc/trac/carreteras/ permission add sistemas TRAC_ADMIN</p>
<p>En este caso damos permisos en el apartado TRAC_ADMIN al usuario sistemas, que está dentro de los usuarios que pueden acceder a login y hemos configurado previamente.</p>
<p>Reiniciaremos apache2 y estará todo configurado:</p>
<p># /etc/init.d/apache2 restart</p>
<div id="crp_related"><h3>Post relacionados:</h3><ul><li><a href="http://blog.igayoso.net/configuracion-y-primeros-pasos-con-subversion-svn/" rel="bookmark">Configuración y primeros pasos con subversion (svn)</a></li><li><a href="http://blog.igayoso.net/instalar-yo-renovar-certificado-de-ipsca-en-apache2-y-courier/" rel="bookmark">Instalar y/o renovar certificado de ipsCA en Apache2 y courier</a></li><li><a href="http://blog.igayoso.net/script-para-bajar-todas-las-canciones-de-ultrastar-es-org/" rel="bookmark">Script para bajar todas las canciones de ultrastar-es.org</a></li><li><a href="http://blog.igayoso.net/porque-no-usaria-centreon/" rel="bookmark">Por que no usaría Centreon</a></li><li><a href="http://blog.igayoso.net/header_checks-en-postfix/" rel="bookmark">header_checks en Postfix</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://blog.igayoso.net/instalacion-y-configuracion-de-trac/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Configuración y primeros pasos con subversion (svn)</title>
		<link>http://blog.igayoso.net/configuracion-y-primeros-pasos-con-subversion-svn/</link>
		<comments>http://blog.igayoso.net/configuracion-y-primeros-pasos-con-subversion-svn/#comments</comments>
		<pubDate>Wed, 26 Aug 2009 11:13:55 +0000</pubDate>
		<dc:creator>igayoso</dc:creator>
				<category><![CDATA[Técnico]]></category>
		<category><![CDATA[how-to]]></category>
		<category><![CDATA[manual]]></category>
		<category><![CDATA[subversion]]></category>
		<category><![CDATA[svn]]></category>

		<guid isPermaLink="false">http://blog.igayoso.net/?p=134</guid>
		<description><![CDATA[Primer manual grande que posteo, voy a intentar ponerlos aquí directamente, pero creo que cuando tenga ganas los iré subiendo a algún sitio en PDF, pero si alguien le corre prisa que me lo pida y se lo mandaré sin problema  
Configuración servidor subversion
Instalamos el subversion, en este ejemplo ya tenemos el apache2 instalado [...]]]></description>
			<content:encoded><![CDATA[<p>Primer manual grande que posteo, voy a intentar ponerlos aquí directamente, pero creo que cuando tenga ganas los iré subiendo a algún sitio en PDF, pero si alguien le corre prisa que me lo <a title="Contacta conmigo" href="http://blog.igayoso.net/contacto/" target="_self">pida</a> y se lo mandaré sin problema <img src='http://blog.igayoso.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><strong>Configuración servidor subversion</strong></p>
<p>Instalamos el subversion, en este ejemplo ya tenemos el apache2 instalado y configurado, así que le meteremos únicamente el paquete de de svn:</p>
<p># apt-get install subversion subversion-tools libapache2-svn</p>
<p>Ahora reiniciamos el servidor de apache2 para que cargue los módulos de svn y dav:</p>
<p># /etc/init.d/apache2 restart</p>
<p>Ahora configuramos un sitio nuevo en apache2.</p>
<p>Abrimos el fichero de configuración del módulo de apache2 de svn:</p>
<p># vim /etc/apache2/mods-enabled/dav_svn.conf</p>
<p>Y lo dejamos algo así como:</p>
<p>DAV svn</p>
<p>SVNPath /var/lib/svn</p>
<p>AuthType Basic<br />
AuthName &#8220;Subversion Repository&#8221;<br />
AuthUserFile /etc/apache2/dav_svn.passwd<br />
Require valid-user</p>
<p>AuthzSVNAccessFile /etc/apache2/dav_svn.authz</p>
<p>SVNPath -&gt; Contendrá la ruta donde hemos configura el sitio para svn<br />
AuthType -&gt; Autentificación básica de apache2<br />
AuthName -&gt; El nombre que saldrá a la hora de autentificarse<br />
AuthUserFile -&gt; El fichero que contiene los usuarios y contraseñas de apache2 para autentificarse<br />
Require valid-user -&gt; Para entrar a este sitio, se pone esta directiva para que requiera autentificación<br />
AuthzSVNAccessFile -&gt; Para que una vez autentificado (o no), podramos controlar lo que puede hacer cada usuario</p>
<p>Creamos el sitio de svn en nuestra máquina. Deberemos crearlo donde hemos especificado anteriormente en la configuración de svn en apache2, en la directiva SVNPath:</p>
<p># svnadmin create /var/lib/svn</p>
<p>Ahora creamos la contraseña de apache2 para un usuario en concreto, en la ruta que hemos especificado antes mediante la directiva AuthUserFile:</p>
<p># htpasswd -mc /etc/apache2/dav_svn.passwd sistemas</p>
<p>Con el flag m forzamos la encriptación en MD5 y con el flag c creamos un fichero nuevo. Si quisiéramos modificar (añadir, cambiar, eliminar…) quitaríamos el flag c para que lo hiciera con un fichero ya creado.</p>
<p>Modificamos el fichero de autentificación de svn, para tener un control sobre cada usuario. Dependiendo de cada usuario, grupo o todos especificaremos unos permisos. También podríamos controlarlo por carpetas. Editamos el fichero que hemos especificado anteriormente mediante la directiva AuthzSVNAccessFile:</p>
<p># vim /etc/apache2/dav_svn.authz</p>
<p>Y lo dejamos así para que el usuario que hemos creado antes pueda leer y escribir. También hemos configurado que todos los usuarios puedan leer:</p>
<p>[/]<br />
* = r<br />
sistemas = rw</p>
<p>Si quisiéramos hacer grupos, los podríamos especificar de la siguiente manera, dejando el fichero con algo parecido a esto:</p>
<p>[groups]<br />
admin = sistemas, igayoso, idiego<br />
[/]<br />
admin = rw</p>
<p>Con este ejemplo, crearíamos un grupo llamado admin., que estarían los usuarios: sistemas, igayoso e idiego, que tendríamos que haber creado previamente. Este grupo tendría permisos de lectura y escritura y nadie más podría ni leer, ni escribir.</p>
<p>Reiniciamos apache2 de nuevo para que coja las últimas configuraciones que hemos metido:</p>
<p># /etc/init.d/apache2 restart</p>
<p>Si ahora vamos a la máquina en cuestión y a la localización que hemos puesto, en este caso:</p>
<p>http://localhost/svn</p>
<p>Sigue leyendo&#8230;.</p>
<p><span id="more-134"></span></p>
<p>Una vez que nos hayamos autentificado con los datos que hemos metido antes, deberíamos de ver lo que tenemos dentro del svn que hemos creado, que de momento es nada, por lo tanto vamos a crear un proyecto con sus respectivas carpetas. Para crear este proyecto vamos a crear la siguiente estructura para luego importarla a svn:</p>
<p>carreteras<br />
trunk<br />
tags<br />
branches</p>
<p>carreteras -&gt; es el nombre del proyecto, podríamos poner el que queramos, incluso ninguno y crear las otras carpetas únicamente, pero lo creamos de esta forma para tenerlo todo un poco mejor organizado<br />
trunk –&gt; es la última versión que hay, sea estable o inestable<br />
tags -&gt; cambios más comunes en módulos, librerías…<br />
branches -&gt; versiones estables que hemos ido haciendo con una o diferentes ramas</p>
<p>Por ejemplo, en este caso vamos a crear la estructura en /tmp para luego borrarla, ya que una vez que esté importada en svn no hará falta, ya que al importar cosas dentro de svn, lo pasa a formato Berkley Database (por defecto), así que no será necesario tenerlo, por lo tanto:</p>
<p># mkdir /tmp/carreteras /tmp/carreteras/trunk /tmp/carreteras/branches /tmp/carreteras/tags</p>
<p>Y para ver que una vez importado lo podremos ver desde la WEB que hemos comprobado y configurado antes, crearemos un fichero:</p>
<p># echo &#8220;Hello world&#8221; &gt; /tmp/carreteras/trunk/index.html</p>
<p>Ahora vamos a importar todas las carpeta y ficheros a svn, esto se hace con el comando:</p>
<p># svn import origen destino –m “Mensaje”</p>
<p>El origen es local, así que lo especificaremos como una ruta en Linux; el destino en este caso es local también, así que lo especificaremos con file:///ruta/donde/esta/svn; y por último con el flag m, especificaremos un mensaje que quedará guardado en el log de svn que podremos ver en un futuro:</p>
<p># svn import /tmp/carreteras/ file:///var/lib/svn/carreteras -m “Primera importación de ficheros y carpetas” (1)</p>
<p>Puede que nos salga una ventana con el nano que nos informará de los cambio que se van a hacer a la hora de hacer el commit, como en este caso no hemos hecho ningún cambio y únicamente vamos a importar unos ficheros y carpetas saldrá vacío. Para salir del nano pulsar CTRL + x y luevo darle a la c para continuar y que haga la importación, debería salir una cosa como esta:</p>
<p>AÃ±adiendo      /tmp/carreteras/trunk<br />
AÃ±adiendo      /tmp/carreteras/trunk/index.html<br />
AÃ±adiendo      /tmp/carreteras/branches<br />
AÃ±adiendo      /tmp/carreteras/tags</p>
<p>Commit de la revisiÃ³n 1.</p>
<p>Con esto pasamos a la revisión 1, ya que cada vez que importemos algo hará un commit por si hubiera algún conflicto del contenido, por que tendría que ser solucionado antes de importar algo. Ahora podremos ver que ha añadido las carpetas y el fichero, en la WEB de antes y que ha cambiado la revisión.</p>
<p>Como esta WEB es dav y por subversion, únicamente podremos ver el contenido y/o descargarlo, ya que no interpreta HTML o PHP, esto lo tendríamos que hacer a través de un cliente svn o con un script a la hora de hacer el commit, que veremos más adelante.</p>
<p>(1)Es posible que a la hora de importar carpetas o ficheros de un problema de permisos como este:</p>
<p>Execute: Import<br />
Error: Error while performing action: Cant create directory /var/lib/svn/db/transactions/1-1.txt: Permission denied</p>
<p>Esto es porque hemos creado el svn como root, por lo tanto le vamos a dar permisos de propiedad a apache2, al usuario www-data, por lo tanto:</p>
<p># chown –R www-data.www-data /var/lib/svn</p>
<p><strong>Configuración y uso de un cliente subversion</strong></p>
<p>Ahora vamos a configurar un cliente para poder trabajar con el servidor de subversion que hemos configurado antes. Primero instalamos los paquetes de subversion en el cliente:</p>
<p># apt-get install subversion subversion-tools</p>
<p>Haremos un checkout, que lo que hacemos es descargarnos todo el proyecto a nuestra máquina local, nos situaremos en un directorio donde queramos guardar la copia local y haremos el checkout:</p>
<p># cd /home/sistemas/proyectos<br />
# svn checkout http://svn/svn</p>
<p>Al haber puesto autentificación en el svn, nos pedirá que nos autentiquemos, al hacerlo correctamente importará a local lo que haya en el svn, que nos saldrá algo así como:</p>
<p>Usuario: sistemas<br />
Clave de &#8217;sistemas&#8217;:<br />
A    svn/carreteras<br />
A    svn/carreteras/trunk<br />
A    svn/carreteras/trunk/index.html<br />
A    svn/carreteras/branches<br />
A    svn/carreteras/tags<br />
RevisiÃ³n obtenida: 1</p>
<p>Ahora en el directorio donde hemos el checkout estará las carpetas y ficheros que hemos creado anteriormente. También veremos la revisión que hemos hecho el checkout, en este caso la revisión 1.</p>
<p><strong>Añadir un fichero/carpeta</strong></p>
<p>Ahora dentro de esta carpeta podremos hacer las modificaciones oportunas para luego hacer un commit, en este caso vamos a crear un fichero y llamarle style.css:</p>
<p># touch /home/sistemas/proyectos/svn/carreteras/trunk/style.css</p>
<p>Como es un fichero nuevo, deberemos indicarle a svn que tenemos que añadirlo, ya que el solito no lo hace. Pasa lo mismo a la hora de eliminarlo o cambiarle el nombre/extensión (es lo mismo que crear y eliminar). Por lo tanto vamos a añadir el fichero de estilos:</p>
<p># svn add /home/sistemas/proyectos/svn/carreteras/trunk/style.css</p>
<p>Y ahora hacemos el commit. Podemos hacer de directorio en concreto o de todo el árbol, todo depende de donde estemos situados, por ejemplo para hacer únicamente de la carpeta trunk nos situaremos en esa carpeta y haremos el commit (recordar que el flag m era para poner un mensaje y comentar que cambios ha habido en esta revisión):</p>
<p># cd /home/sistemas/proyectos/svn/carreteras/trunk/<br />
# svn commit –m “Hemos creado una hoja de estilos llamada style.css”</p>
<p>Y nos diría una cosa como esta:</p>
<p>AÃ±adiendo      trunk/style.css<br />
Transmitiendo contenido de archivos .<br />
Commit de la revisiÃ³n 10.</p>
<p>Hay que hacerlo siempre en la carpeta en la que hemos hecho algún tipo de cambio. Este commit lo hará en sus subcarpetas, pero no en las anteriores, así que por ejemplo si hubiéremos estado en otra carpeta que no incluyera estos cambios no hubiera hecho nada.</p>
<p>Si quisiéramos hacer un simple cambio en un fichero bastaría con hacerlo y ejecutar un commit, abrimos el fichero, introducimos alguna línea y hacemos el commit:</p>
<p># vim /home/sistemas/proyectos/svn/carreteras/trunk/style.css</p>
<p>Configuramos algún estilo dentro del fichero, en este caso únicamente he puesto un comentario:</p>
<p>#######################################<br />
# Esto es la hoja de estilos<br />
#######################################</p>
<p>Lo guardamos y hacemos el commit estando dentro de la carpeta donde está el fichero que hemos modificado o una anterior que lo incluya:</p>
<p># cd /home/sistemas/proyectos/svn/carreteras/trunk/<br />
# svn commit –m “Modificamos la hoja de estilos con un comentario”</p>
<p>Si todo ha salido bien saldría una cosa como esta:</p>
<p>Enviando       trunk/style.css<br />
Transmitiendo contenido de archivos .<br />
Commit de la revisiÃ³n 11.</p>
<p>Como vemos ha aumentado la revisión en un número. Cada vez que hagamos algún tipo de cambio aumentará esta revisión. En cualquier momento podemos volver atrás a alguna de estas revisiones.</p>
<p><strong>Eliminar fichero/carpeta</strong></p>
<p>Ahora vamos a procedes a eliminar un archivo, en este caso la hoja de estilos. Como borrando y haciendo un commit no se podría, ya que no es una modificación en el contenido de algún fichero, debemos eliminar primero de hacer el commit, por lo tanto:</p>
<p># svn rm /home/sistemas/proyectos/svn/carreteras/trunk/style.css<br />
# svn status</p>
<p>Ahora podemos ver el estado de nuestra versión local, en este caso pone una D porque este fichero ha sido eliminado o creado y no forma parte de la revisión aún, por lo tanto debemos indicárselo a svn haciendo un commit:</p>
<p># svn commit –m “Eliminamos la Hoja de estilos”</p>
<p>Y nos saldrá una cosa parecida a esto:</p>
<p>Eliminando     trunk/style.css</p>
<p>Commit de la revisiÃ³n 12.</p>
<p>Como veis también ha aumentado la revisión.</p>
<p><strong>Actualizar revisión local</strong></p>
<p>Habrá veces que habrán hecho nuevas revisiones, pero nuestra revisión local no estará actualizada a la última versión, por lo tanto deberemos actualizarla con el siguiente comando:</p>
<p># svn update</p>
<p>Y nos dirá la revisión actual y los cambios que se han hecho referentes a nuestra revisión local:</p>
<p>A    loquesea.php<br />
Actualizado a la revisiÃ³n 13.</p>
<p>La A significa add, es decir que ha sido añadido y por último nos dice la revisión que se ha descargado a local.</p>
<p><strong>Guardar versiones de trunk a tags/branches</strong></p>
<p>Una vez que hemos hecho los cambios oportunos en nuestra versión de trunk, vamos a hacer una versión para que quede como “estable” en las ramas (branches), también podríamos guardarlo en tags, ya que se hace del mismo modo. Por lo tanto vamos a crear la versión 0.0 de dicha WEB:</p>
<p># svn copy http://svn/svn/carreteras/trunk http://svn/svn/carreteras/branches/0.0</p>
<p>De nuevo nos abrirá nano para mostrarnos los cambios que se irán a realizar, pulsamos CTR + x y luego la c para continuar, entonces hará un commit para comprobar si hay conflictos y hará la rama nueva.</p>
<p>Todo esto se haría de la misma forma, cambiando las rutas para futuras versiones o tags.</p>
<p><strong>Solucionar conflictos entre ficheros/carpetas</strong></p>
<p>Si se produce algún cambio a la vez o si intentas hacer un commit con una revisión vieja, habrá un conflicto que deberemos solucionar a mano. Por lo tanto imaginemos que alguien ha cambiado el fichero loquesea.php que está dentro de trunk. Yo pensaba que tenía la última versión, pero no es así, por lo tanto modifiqué el fichero e intenté hacer un commit con el siguiente resultado:</p>
<p># echo “Hola, modificando fichero” &gt;&gt; /home/sistemas/proyectos/svn/carreteras/trunk/loquesea.php<br />
# cd /home/sistemas/proyectos/svn/carreteras/trunk/<br />
# svn commit –m “Modificando el fichero loquesea.php para probocar un conflicto”</p>
<p>Enviando       trunk/loquesea.php<br />
svn: FallÃ³ el commit (detalles a continuaciÃ³n):<br />
svn: Su archivo o directorio &#8216;loquesea.php&#8217; estÃ¡ probablemente desactualizado<br />
svn: The version resource does not correspond to the resource within the transaction.  Either the requested version resource is out of date (needs to be updated), or the requested version resource is newer than the transaction root (restart the commit).</p>
<p>Por lo tanto ahora deberemos actualizar nuestra versión local con:</p>
<p># cd /home/sistemas/proyectos/svn/carreteras/trunk/<br />
# svn update</p>
<p>Nos saldrá la actualización de la revisión y del fichero:</p>
<p>C    loquesea.php<br />
Actualizado a la revisiÃ³n 16.</p>
<p>Si hacemos un listado del directorio, veremos que ahora hay un montón de ficheros:</p>
<p># ls –la /home/sistemas/proyectos/svn/carreteras/trunk/</p>
<p>total 36<br />
drwxr-xr-x  4 root root 4096 2008-08-26 19:04 .<br />
drwxr-xr-x  6 root root 4096 2008-08-26 18:52 ..<br />
-rw-r&#8211;r&#8211;  1 root root 3297 2008-08-26 18:17 index.php<br />
-rw-r&#8211;r&#8211;  1 root root 2548 2008-08-26 18:52 license.txt<br />
-rw-r&#8211;r&#8211;  1 root root  106 2008-08-26 19:04 loquesea.php<br />
-rw-r&#8211;r&#8211;  1 root root    5 2008-08-26 19:04 loquesea.php.mine<br />
-rw-r&#8211;r&#8211;  1 root root    0 2008-08-26 19:04 loquesea.php.r15<br />
-rw-r&#8211;r&#8211;  1 root root   66 2008-08-26 19:04 loquesea.php.r16<br />
drwxr-xr-x  6 root root 4096 2008-08-26 19:04 .svn<br />
drwxr-xr-x 14 root root 4096 2008-08-26 18:06 system</p>
<p>loquesea.php -&gt; contendrá una mezcla del fichero que has modificado junto a la última revisión<br />
loquesea.php.mine -&gt; la modificación que has hecho tu<br />
loquesea.php.r* -&gt; las versiones en conflicto</p>
<p>Por lo tanto, dependiendo de lo que queramos hacer, deberemos abrir unos u otros ficheros y finalmente poner en el loquesea.php la versión que queremos conservar, por ejemplo queremos mezclar tanto la versión que hemos hecho nosotros como la que hay nueva, por lo tanto abrimos el fichero loquesea.php y quitamos las líneas que nos indican los cambios, tal que:</p>
<p># vim /home/sistemas/proyectos/svn/carreteras/trunk/loquesea.php</p>
<p>Saldria algo así como:</p>
<p>&lt;&lt;&lt;&lt;&lt;&lt;&lt; .mine hola ======= Ã±kdlsjgfaÃ±sljfaÃ±sljfÃ±lasdjfaÃ±skdljf asdf as f asdfsafasdfasdf&gt;&gt;&gt;&gt;&gt;&gt;&gt; .r16</p>
<p>Por lo tanto borramos lo referente a las versiones, quedando:</p>
<p>hola</p>
<p>Ã±kdlsjgfaÃ±sljfaÃ±sljfÃ±lasdjfaÃ±skdljf<br />
asdf<br />
as<br />
f<br />
asdfsafasdfasdf</p>
<p>Guardamos el fichero y resolvemos el conflicto con este fichero:</p>
<p># cd /home/sistemas/proyectos/svn/carreteras/trunk/<br />
# svn resolved loquesea.php</p>
<p>Nos dirá algo así como:</p>
<p>Se resolvió el conflicto de &#8216;loquesea.php&#8217;</p>
<p>Y por ultimo hacemos el commit:<br />
# cd /home/sistemas/proyectos/svn/carreteras/trunk/<br />
# svn commit -m “Resolviendo el conflicto”</p>
<p>Y ahora no debería darnos ningún problema:</p>
<p>Enviando       trunk/loquesea.php<br />
Transmitiendo contenido de archivos .<br />
Commit de la revisión 17.</p>
<p><strong>Ver los logs de las revisiones</strong></p>
<p>Podemos ir viendo información sobre las revisiones que se han hecho. También se puede usar para ver los comentarios que hemos ido haciendo con los commit:</p>
<p># svn log</p>
<p>Y nos saldrá algo como:</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br />
r15 | sistemas | 2008-08-27 13:20:15 +0200 (miÃ©, 27 ago 2008) | 1 line</p>
<p>Pruebas2<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br />
r13 | sistemas | 2008-08-27 13:03:34 +0200 (miÃ©, 27 ago 2008) | 1 line</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br />
r12 | sistemas | 2008-08-27 12:59:28 +0200 (miÃ©, 27 ago 2008) | 1 line</p>
<p>Borramos el css<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br />
r11 | sistemas | 2008-08-27 12:53:16 +0200 (miÃ©, 27 ago 2008) | 1 line</p>
<p>Modificamos la hoja de estilos<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br />
r10 | sistemas | 2008-08-27 12:48:23 +0200 (miÃ©, 27 ago 2008) | 1 line</p>
<p>Anadido styles.css<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br />
r9 | sistemas | 2008-08-27 12:41:15 +0200 (miÃ©, 27 ago 2008) | 1 line</p>
<p>Mas pruebas<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br />
r8 | sistemas | 2008-08-27 12:38:57 +0200 (miÃ©, 27 ago 2008) | 1 line</p>
<p>Pruebas1<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br />
r7 | sistemas | 2008-08-27 12:34:03 +0200 (miÃ©, 27 ago 2008) | 1 line</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br />
r6 | sistemas | 2008-08-27 12:33:03 +0200 (miÃ©, 27 ago 2008) | 1 line</p>
<p>Importacion del codigo base de Code Igniter<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br />
r1 | root | 2008-08-27 11:57:22 +0200 (miÃ©, 27 ago 2008) | 1 line</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br />
<strong>Automatizar el proceso de subida a un FTP cuando hacemos commit</strong></p>
<p>Cuando realizamos commit, la tarea más ardua a la hora de trabajar con svn para proyectos WEB es que al tener codificado todo el contenido usando Berkley Database (por defecto), no podremos ver a priori los datos WEB, por lo tanto podremos hacer a mano que exporte los datos y luego subirlos a un FTP, para verlos desde un servidor WEB, el problema es que cuando hacemos mucho commit, la tarea se hace muy pesada, por lo tanto vamos a automatizar este proceso.</p>
<p>Cuando hemos creado el repositorio svn, dentro de la carpeta que hemos creado, existe una carpeta llamada hooks, que contiene plantillas de scripts para realizar tareas, una vez que se hagan otras; me explico, por ejemplo existe una plantilla para cuando se realizan los commit llamada post-commit.tmpl. Para empezar deberemos renombrarla y quitarle la extensión .tmpl:</p>
<p># mv /var/lib/svn/hooks/post-commit.tmpl /var/lib/svn/hooks/post-commit</p>
<p>Editamos el fichero y únicamente dejamos una línea que llame a otro script:</p>
<p># vim /var/lib/svn/hooks/post-commit</p>
<p>Y quedará tal que:</p>
<p>/usr/share/subversion/hook-scripts/svn2ftp</p>
<p>Ahora creamos el siguiente fichero, con el siguiente contenido:</p>
<p># vim /usr/share/subversion/hook-scripts/svn2ftp</p>
<p>Y metemos dentro:</p>
<p>######### INICIO SCRIPT ####################<br />
#!/usr/bin/php5<br />
/**<br />
* SVN FTP synchronization post-commit hook<br />
* @author Moises Macia<br />
* @modificated Israel Gayoso igayoso&lt;!@!&gt;gmail.com<br />
* @license MIT<br />
* @version 0.1.1<br />
*/</p>
<p>$SVN_PRJ = &#8220;carreteras&#8221;;<br />
$SVN_DIR = &#8220;/var/lib/svn&#8221;;<br />
$EXPORT_DIR = &#8220;/tmp/export&#8221;;<br />
$FTP_HOST = &#8220;ftp.algo.es&#8221;;<br />
$FTP_USER = &#8220;ftpuser&#8221;;<br />
$FTP_PWD = &#8220;ftp&#8221;;<br />
$FTP_DIR = &#8220;ejemplos.algo.es&#8221;;<br />
$NSUB = strlen($SVN_PRJ . &#8220;/trunk/&#8221;);</p>
<p>//get changed files from last commit<br />
exec(&#8221;svnlook changed $SVN_DIR&#8221;, $files);</p>
<p>if(count($files) &gt; 0)<br />
{<br />
system(&#8221;svn export &#8211;quiet file:///&#8221; . $SVN_DIR . &#8220;/&#8221; . $SVN_PRJ . &#8220;/trunk/ &#8221; . $EXPORT_DIR);</p>
<p>$ftp_id = ftp_connect($FTP_HOST);<br />
$login_status = @ftp_login($ftp_id, $FTP_USER, $FTP_PWD);</p>
<p>if((!$ftp_id) || (!$login_status))<br />
die(&#8221;Fallo al conectar al FTP $FTP_SERVER\n&#8221;);</p>
<p>ftp_chdir($ftp_id,$FTP_DIR);</p>
<p>foreach ($files as $line)<br />
{<br />
echo &#8220;$line\n&#8221;;<br />
preg_match(&#8221;/^([AUD]{1})(\s+)(&#8221; . $SVN_PRJ . &#8220;\/trunk.*)/&#8221;, $line, $match);<br />
$svn_code = $match[1]; //file state code<br />
$file_path = substr($match[3], $NSUB);<br />
switch($svn_code)<br />
{<br />
case &#8216;U&#8217;: //file updated<br />
if(is_file($EXPORT_DIR . &#8220;/&#8221; . $file_path))<br />
{<br />
$upload_status = ftp_put($ftp_id, $file_path, $EXPORT_DIR . &#8220;/&#8221; . $file_path, FTP_BINARY);<br />
if(!$upload_status)<br />
echo &#8220;Fallo al transmitir fichero $file_path\n&#8221;;<br />
}<br />
break;</p>
<p>case &#8216;A&#8217;: //file added<br />
if(is_file($EXPORT_DIR . &#8220;/&#8221; . $file_path))<br />
{<br />
$upload_status = ftp_put($ftp_id, $file_path, $EXPORT_DIR . &#8220;/&#8221; . $file_path, FTP_BINARY);<br />
if(!$upload_status)<br />
echo &#8220;Fallo al transmitir fichero $file_path\n&#8221;;<br />
}</p>
<p>if(is_dir($EXPORT_DIR . &#8220;/&#8221; . $file_path))<br />
{<br />
$upload_status = ftp_mkdir($ftp_id, $file_path);<br />
if(!$upload_status)<br />
echo &#8220;Fallo al crear el directorio $file_path\n&#8221;;<br />
}<br />
break;</p>
<p>case &#8216;D&#8217;: //file deleted<br />
if(substr($file_path, -1, 1) == &#8220;/&#8221;) //if its a directory<br />
ftp_rmdirr($ftp_id, &#8216;/&#8217; . substr($file_path, 0, strlen($file_path)-1));<br />
else //if its a plain file<br />
ftp_delete($ftp_id, $file_path);<br />
break;<br />
}<br />
}</p>
<p>system(&#8221;rm -rf $EXPORT_DIR&#8221;); //clean exported files<br />
ftp_close($ftp_id);<br />
}</p>
<p>function ftp_rmdirr($ftp_stream, $directory)<br />
{<br />
// Sanity check<br />
if (!is_resource($ftp_stream) || get_resource_type($ftp_stream) !== &#8216;FTP Buffer&#8217;)<br />
return false;</p>
<p>// Init<br />
$i             = 0;<br />
$files         = array();<br />
$folders       = array();<br />
$statusnext    = false;<br />
$currentfolder = $directory;</p>
<p>// Get raw file listing<br />
$list = ftp_rawlist($ftp_stream, $directory, true);</p>
<p>// Iterate listing<br />
foreach ($list as $current)<br />
{<br />
// An empty element means the next element will be the new folder<br />
if (empty($current))<br />
{<br />
$statusnext = true;<br />
continue;<br />
}</p>
<p>// Save the current folder<br />
if ($statusnext === true)<br />
{<br />
$currentfolder = substr($current, 0, -1);<br />
$statusnext = false;<br />
continue;<br />
}</p>
<p>// Split the data into chunks<br />
$split = preg_split(&#8217;[ ]&#8216;, $current, 9, PREG_SPLIT_NO_EMPTY);<br />
$entry = $split[8];<br />
$isdir = (substr($split[0],0,1) === &#8216;d&#8217;) ? true : false;</p>
<p>// Skip pointers<br />
if ($entry === &#8216;.&#8217; || $entry === &#8216;..&#8217;)<br />
continue;</p>
<p>// Build the file and folder list<br />
if ($isdir == true)<br />
$folders[] = $currentfolder . &#8216;/&#8217; . $entry;<br />
else<br />
$files[] = $currentfolder . &#8216;/&#8217; . $entry;<br />
}</p>
<p>// Delete all the files<br />
foreach ($files as $file)<br />
ftp_delete($ftp_stream, $file);</p>
<p>// Delete all the directories<br />
// Reverse sort the folders so the deepest directories are unset first<br />
rsort($folders);<br />
foreach ($folders as $folder)<br />
ftp_rmdirr($ftp_stream, $folder);</p>
<p>// Delete the final folder and return its status<br />
return ftp_rmdir($ftp_stream, $directory);<br />
}</p>
<p>?&gt;<br />
######### FIN SCRIPT ####################</p>
<p>Deberemos configurar las variables de inicio, si alguna de ellas hubiera sido cambiada anteriormente.</p>
<p>Para que funcione este script tendremos que asegurarnos de un par de cosas primero:</p>
<p>Que el fichero tenga permisos de ejecución y propiedad de apache2:</p>
<p># chown www-data.www-data /usr/share/subversion/hook-scripts/svn2ftp<br />
# chmod 744 /usr/share/subversion/hook-scripts/svn2ftp</p>
<p>Tener instalado php en el servidor y su intérprete para bash:</p>
<p># apt-get install php5 php5-cli</p>
<p>Una vez hecho esto, deberemos exportar todo lo que tengamos porque al ser la primera vez no hay ningún fichero en el FTP, por lo tanto esto solo lo haremos la primera vez que metamos esto y solo en el caso de que ya haya ficheros, como ocurre ahora, por lo tanto:</p>
<p># svn export &#8211;quiet file:///var/lib/svn/carreteras/trunk /tmp/svn</p>
<p>Ahora tendremos el contenido de trunk en /tmp/svn, ahora copiaremos de la forma que más nos guste (FTP, scp, etc…) a nuestro servidor WEB y una vez que tengamos los mismos datos, cambiaremos algo en el servidor y haremos un commit para comprobar que se sube bien al FTP. No nos debería dar ningún error a la hora de hacer el commit, si lo diera comprobar que las variables han sido cambiadas correctamente, los permisos y/o propietarios y por último si los paquetes están instalados.</p>
<p><strong>Clientes subversion</strong></p>
<p>Existes mucha variedad de clientes subversiones para todas las plataformas, así que aquí tenéis el enlace de la wikipedia donde hace una comparación de los clientes, muestra la última versión, licencia, etc…</p>
<p><a title="Lista clientes SVN en Wikipedia" href="http://en.wikipedia.org/wiki/Comparison_of_Subversion_clients" target="_blank">Lista en Wikipedia</a></p>
<p><strong>TO-DO</strong></p>
<p>Cosas que se podrían añadir o mejor a este manual:</p>
<p>Usar SSL para conectarse al servidor de svn<br />
Hacer el script un poco más legible y más escalable, a parte de crear otros para subirlos por scp, cp, etc…<br />
Añadir screenshoots o vídeos al manual<br />
Explicar el acceso por ssh a subversion<br />
Explicar muchas más opciones a la hora de actualizar, realizar commit, volver a una revisión, etc…</p>
<p><strong>Creador</strong><br />
El autor de este manual es Israel Gayoso Pérez, para cualquier duda, problema o aclaración no dudes en ponerte en contacto a través del <a title="Contacta conmigo" href="http://blog.igayoso.net/contacto/" target="_self">apartado contacto</a> del blog.</p>
<p><strong>Licencia</strong><br />
Este documento se distribuye bajo una licencia <a title="Licencia CC" href="http://creativecommons.org/licenses/by-nc-sa/2.5/es/" target="_blank">Creative Commons by nc-sa</a>, excepto el script para la sincronización de ficheros entre SVN y FTP que está liberado bajo una licencia <a title="Licencia MIT" href="http://es.wikipedia.org/wiki/MIT_License" target="_blank">MIT</a>.</p>
<div id="crp_related"><h3>Post relacionados:</h3><ul><li><a href="http://blog.igayoso.net/instalacion-y-configuracion-de-trac/" rel="bookmark">Instalación y configuración de TRAC</a></li><li><a href="http://blog.igayoso.net/instalar-yo-renovar-certificado-de-ipsca-en-apache2-y-courier/" rel="bookmark">Instalar y/o renovar certificado de ipsCA en Apache2 y courier</a></li><li><a href="http://blog.igayoso.net/script-para-bajar-todas-las-canciones-de-ultrastar-es-org/" rel="bookmark">Script para bajar todas las canciones de ultrastar-es.org</a></li><li><a href="http://blog.igayoso.net/porque-no-usaria-centreon/" rel="bookmark">Por que no usaría Centreon</a></li><li><a href="http://blog.igayoso.net/header_checks-en-postfix/" rel="bookmark">header_checks en Postfix</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://blog.igayoso.net/configuracion-y-primeros-pasos-con-subversion-svn/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
