<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/">
  <title>Main</title>
  <link rel="alternate" href="http://www.zylk.net/web/guest/web-2-0/wiki?p_p_id=36&amp;p_p_lifecycle=0&amp;p_r_p_185834411_nodeId=12323" />
  <subtitle />
  <entry>
    <title>InstalacionApacheTomcatModProxy 1.7</title>
    <link rel="alternate" href="http://www.zylk.net/web/guest/web-2-0/wiki?p_p_id=36&amp;p_p_lifecycle=0&amp;p_r_p_185834411_nodeId=12323&amp;p_r_p_185834411_title=&amp;InstalacionApacheTomcatModProxy" />
    <author>
      <name>Cesar Capillas</name>
    </author>
    <id>http://www.zylk.net/web/guest/web-2-0/wiki?p_p_id=36&amp;p_p_lifecycle=0&amp;p_r_p_185834411_nodeId=12323&amp;p_r_p_185834411_title=&amp;InstalacionApacheTomcatModProxy</id>
    <updated>2012-04-17T09:08:41Z</updated>
    <published>2012-04-17T09:08:41Z</published>
    <summary type="html">El módulo proxy (mod_proxy) viene por defecto en la instalación de Apache2. 

En primer lugar hay que habilitar los proxys:
{{{
$ vim /etc/apache2/mods-available/proxy.load 

# Depends: proxy
LoadModule proxy_http_module /usr/lib/apache2/modules/mod_proxy.so
}}}

{{{
$ vim /etc/apache2/mods-available/proxy.conf

&lt;IfModule mod_proxy.c&gt;
        #turning ProxyRequests on and allowing proxying from all may allow
        #spammers to use your proxy to send email.

        ProxyRequests Off

        &lt;Proxy *&gt;
                AddDefaultCharset off
                Order deny,allow
                #Deny from all
                Allow from all
                #Allow from .example.com
        &lt;/Proxy&gt;

        # Enable/disable the handling of HTTP/1.1 "Via:" headers.
        # ("Full" adds the server version; "Block" removes all outgoing Via: headers)
        # Set to one of: Off | On | Full | Block

        ProxyVia On
&lt;/IfModule&gt;
}}}

De la siguiente manera saltamos desde el Apache a nuestro Tomcat situado en el puerto 8080 (proxy http).
{{{
$ vim /etc/apache2/mods-available/proxy_http.load 

# Depends: proxy
LoadModule proxy_http_module /usr/lib/apache2/modules/mod_proxy_http.so
}}}

{{{
$ vim /etc/apache2/mods-available/proxy_http.conf

ProxyPass        /alfresco miservidor:8080/alfresco/
ProxyPassReverse /alfresco miservidor:8080/alfresco/
}}}

También se puede hacer pero conectando al AJP y no al Coyote (proxy ajp).. Por ejemplo para la aplicación de los ejemplos webdav:
{{{
$ vim /etc/apache2/mods-available/proxy_ajp.load

# Depends: proxy
LoadModule proxy_ajp_module /usr/lib/apache2/modules/mod_proxy_ajp.so
}}}

{{{
$ vim /etc/apache2/mods-available/proxy_ajp.conf

ProxyPass        /alfresco ajp://localhost:8009/alfresco/
ProxyPassReverse /alfresco ajp://localhost:8009/alfresco/
}}}

Por último, tenemos que habilitar el módulo y reiniciar el servidor.
{{{
$ a2dismod proxy
$ a2dismod proxy_http
$ a2dismod proxy_ajp
$ a2enmod proxy
$ a2enmod proxy_http
$ a2enmod proxy_ajp
$ /etc/init.d/apache2 force-reload
}}}</summary>
    <dc:creator>Cesar Capillas</dc:creator>
    <dc:date>2012-04-17T09:08:41Z</dc:date>
  </entry>
  <entry>
    <title>EsleBiltegiErabilpenEskuliburu 1.5</title>
    <link rel="alternate" href="http://www.zylk.net/web/guest/web-2-0/wiki?p_p_id=36&amp;p_p_lifecycle=0&amp;p_r_p_185834411_nodeId=12323&amp;p_r_p_185834411_title=&amp;EsleBiltegiErabilpenEskuliburu" />
    <author>
      <name>Irune Prado</name>
    </author>
    <id>http://www.zylk.net/web/guest/web-2-0/wiki?p_p_id=36&amp;p_p_lifecycle=0&amp;p_r_p_185834411_nodeId=12323&amp;p_r_p_185834411_title=&amp;EsleBiltegiErabilpenEskuliburu</id>
    <updated>2011-03-30T09:42:29Z</updated>
    <published>2011-03-30T09:42:29Z</published>
    <summary type="html">= ESLEko biltegia erabiltzeko eskuliburua =
== Sarrera ==
Gforge proiektuen kudeaketa eramateko erabilgarria den softwarea da. Nahiz eta Software proiektuetara zuzenduta egon, dituen plugin euskarria dela medio, edozein proiektu motara egokitu daiteke. Gforge, sourceforge.net erabiltzen zuen kodearen adar libreetako bat da eta proiektuaren aitzindaria sortzaileetako bat.

Esku liburu honetan bere erabilpena azalduko dugu, oinarri bezala http://floss.esle.eu/ -ra bideratuz.
== ESLEko errepsitorioan nabigatzen ==
=== Lehen urratsak ===
ESLEko biltegian sartzeko [[http://floss.esle.eu/|floss-en]] URLa erabiliko dugu. Hor biltegiaren orri nagusia aurkituko dugu, bertan atari horretatik nabigatzen hasi ahal izango gara.

&lt;img src="/image/image_gallery?img_id=12874&amp;t=1206545845320" alt="Esleren biltegiaren ikuspegi orokorra" /&gt;

Goiko irudian atari honen sekzio nagusiak zeintzuk diren ikus dezakegu.
==== Bilaketa bat burutu ====
Bilatu testu kutxan proiektu baten bilaketa, izen edo deskribapena erabiliz burutu dezakegu. Konboa eratzekotan,

{{image/image_gallery?img_id=12966&amp;t=1206548437880|Bilaketa formularioa}}

kategoria, pertsona, software, taldeen... gaineko bilaketa burutu dezakegu, hau horrela izanik, bilaketa era arin eta eroso batetan burutu dugu.

===== Proiektu baten barneko bilaketa =====

Proiektu baten gaineko bilaketa bat burutzeko, proiektu horren barruan kokatuta egon beharko gara. Horra heltzeko atariaren proiektu arbolaren menu itenak erabiliko ditugu, hauek atariaren goiko menuan aurkituko ditugu.

Bertan, kokatuta gauden proiektuaren gaineko bilaketa zehatzagoak burutuko ditugu.

&lt;img src="/image/image_gallery?img_id=12979&amp;t=1206548643866" alt="Proiektu baten barnean bilatzeko formularioa" /&gt;

=== Deskargen ibilera ===
Proiektu desberdinen deskargak atzitzeko proiektu horren barruan egon behar izango gara, fitxategietara sartzeko goiko menua erabiliko dugu.

&lt;img src="/image/image_gallery?img_id=12983&amp;t=1206548664205" alt="Deskargak kudeatzeko menua" /&gt;

Fitxategien sekziora sartzekotan dokumentu zerrenda bat aurkituko dugu. Biltegian aurkituko ditugun proiektu guztiak eskema mankomuna jarraituko dute:
* Erabiltzaile eskuliburua (.pdf), azken erabiltzaileei produktuaren ezaugarriak eta funtzionamendua ezagutarazteko zuzenduak.
* Eskuliburu teknikoak (.pdf), administratzaileei produktuaren ezaugarriak eta funtzionamendua ezagutarazteko zuzenduak.
* Erabateko dokumentazioa (.zip), eskuliburu guztien deskarga burutzeko zuzendutako fitxategi konprimitua.
* Iturburu kodea (.zip), aplikazioaren erabateko iturburu kodea.
* Instalatzaileak (.zip), aplikazioa instalatzeko instalatzaileak.
* Proiektu osoa (.zip), orain arte azaldutako fitxategi guztiak konprimitzen dituen fitxategia.
Fitxategi baten deskarga burutzeko, fitxategiaren izena klikatuko dugu. Letra larriz idatzitako izenean klikatuz gero fitxategiaren deskribapen batera bideratuko digu.

&lt;img src="/image/image_gallery?img_id=12994&amp;t=1206548708990" alt="Pakete eskuragarrien zerrenda" /&gt;

Hortaz, deskarga hasten da:

&lt;img src="/image/image_gallery?img_id=12999&amp;t=1206548730468" alt="Mozilla Firefoxen deskarga kudeatzailearen leihoa" /&gt;

Gforge sisteman sesioa hasita izatekotan orain arte azaldutakoaz gain, proiektuari gure bozka emateko gai izango ginateke. Batetik bostera gure irizpidearen araberako bozka emanez.

**Azken oharra**: Behin proiektuak errepositoriora igota, nahiz eta orri nagusian agertu 24 ordu behar dituzte proiektu arbolan erabilgarri egoteko.
== Kontaktua ==
Erabiltzaileak atariarekin atzera elikadura bat erabil dezake. Bere galderak, iradokizunak eta proiektuen informazioa eskatu dezake helbide honetara e-mail bat bidaliz:

esle@esle.eu

http://www.esle.eu/

Baita korreo arrunta erabiliz:

C/ Landaberde, 15 behea

01010 Gasteiz (Araba)

ESLEko biltegia atzitzeko bideratu helbide honetara:

http://floss.esle.eu/</summary>
    <dc:creator>Irune Prado</dc:creator>
    <dc:date>2011-03-30T09:42:29Z</dc:date>
  </entry>
  <entry>
    <title>SubversionTips 2.2 (minor-edit)</title>
    <link rel="alternate" href="http://www.zylk.net/web/guest/web-2-0/wiki?p_p_id=36&amp;p_p_lifecycle=0&amp;p_r_p_185834411_nodeId=12323&amp;p_r_p_185834411_title=&amp;SubversionTips" />
    <author>
      <name>Cesar Capillas</name>
    </author>
    <id>http://www.zylk.net/web/guest/web-2-0/wiki?p_p_id=36&amp;p_p_lifecycle=0&amp;p_r_p_185834411_nodeId=12323&amp;p_r_p_185834411_title=&amp;SubversionTips</id>
    <updated>2010-05-10T13:40:40Z</updated>
    <published>2010-05-10T13:40:40Z</published>
    <summary type="html">= Todo lo que quiso saber de subversion y nunca se atrevió a preguntar ... =

&lt;&lt;TableOfContents&gt;&gt;

== Información general ==

El FAQ de subversion puede encontrarse en [http://subversion.tigris.org/faq.html]

La referencia base de subversion puede encontrarse en el libro on-line [http://svnbook.red-bean.com/]

* Otra referencia muy interesante de subversion puede encontrarse en el libro Pragmatic version control using Subversion. 

* La reference card puede consultarse en [http://www.cs.put.poznan.pl/csobaniec/Papers/svn-refcard.pdf]

== Resumen de comandos ==
|= command |= Description
| '''add'''        | Adds files and directories.
| '''blame'''      | (praise, annotate, ann) Shows author and revision information in-line for the specified files or URLs.
| '''cat'''        | Outputs the contents of the specified files or URLs.
| '''checkout'''   | (co) Checks out a working copy from a repository.
| '''cleanup'''    | Recursively clean up the working copy.
| '''commit'''     | (ci) Send changes from your working copy to the repository.
| '''copy'''       | (cp) Copy a file or directory in a working copy or in the repository.
| '''delete'''     | (del, remove, rm) Delete an item from a working copy of the repository.
| '''diff'''       | (di) Display the differences between two paths.
| '''export'''    | Exports a clean directory tree.
| '''help'''       | Prints help text.
| '''import'''     | Recursively commit a copy of local dir into a repository.
| '''info'''       | Print information about PATHs.
| '''list'''       | (ls) List directory entries in the repository.
| '''log'''        | Displays commit log messages.
| '''merge'''      | Apply the differences between two sources to a working copy path.
| '''mkdir'''      | Create a new directory under version control.
| '''move'''       | (mv, rename, ren) Move a file or directory.
| '''propdel'''    | (pdel, pd) Remove a property from an item.
| '''propget'''    | (pget, pg) Prints the value of a property.
| '''proplist'''   | (plist, pl) Lists all properties.
| '''propset'''    | (pset, ps) Sets a property on files, directories, or revisions.
| '''resolved'''   | Remove conflicted state on working copy files or directories.
| '''revert'''     | Undo all local edits.
| '''status'''     | (stat, st) Print the status of working copy files and directories.
| '''switch'''     | (sw) Update working copy to a different URL.
| '''update'''     | (up) Updates your working copy.

== Recoger los cambios del repositorio ==
Para recoger los últimos cambios del repositorio:
{{{
$ svn update
}}}

Para recoger los cambios de una versión específica:
{{{
$ svn update -r &lt;version&gt;
}}}

== Chequear los cambios pendientes en el repositorio con respecto a tu copia local ==
Si quieres chequear los cambios en de tu copia local.

{{{
$ svn status}}}

Si además quieres ver los cambios pendientes en el repositorio:
 
{{{
$ svn status --show-updates}}}

Otras opciones posibles son
{{{
--verbose, -v       : prints extra information
--non-recursive, -N : operate in a single directory only
--no-ignore         : Disregard default and svn:ignore property ignores}}}

== Status de los ficheros ==
* U File was updated.
* A File was added.
* D File was deleted.
* R File was replaced.
* G File was merged.
* C Conflicting changes.
* ? Resource is not under version control.
* ! Resource is missing or incomplete (removed by another tool than Subversion). 

== Ver las diferencias de un archivo ==
Para ver las diferencias de un archivo de tu copia local con la copia del repositorio:

{{{
$ svn diff &lt;archivo&gt;
}}}

Para ver los cambios de tu copia local sin modificar con respecto a una versión posterior del repositorio.

{{{
$ svn diff -r HEAD &lt;archivo&gt;
}}}

== Revertir una versión ==

{{{
$ svn merge -r 27:26 .}}}

== Revertir los cambios (no commiteados) de la copia local ==

{{{
$ svn revert}}}


== Enviar un email a una lista de usuarios tras hacer un commit ==

En el server:

Suponiendo que el repositorio $SVNROOT esta en /srv/svn/ se edita el archivo de acciones post-commit
{{{
$ vim /srv/svn/hooks/post-commit

REPOS="$1"
REV="$2"
PATH=/usr/share/subversion/tools/hook-scripts
commit-email.pl "$REPOS" "$REV" &lt;cesar at zylk.net&gt; 
}}}

== Ignorar ficheros en un directorio local ==

Si quieres ignorar una serie de ficheros (por ejemplo *.py) en un directorio (no funciona en sus subdirectorios! solo se aplica a los ficheros en un directorio) haz:

{{{
$ svn propedit svn:ignore directorio}}}

Esto te abre un editor y se introduce en cada linea una expresion regular de los ficheros a ignorar. 
{{{
*.pyc
*.pyo
*.o}}}

Luego se hace un commit 

{{{
$ svn commit -m "Adding svn properties to directory"}}}

Se pueden ver los cambios en los archivos que se ignoran mediante el comando:

{{{
$ svn status --no-ignore}}}

Otra posibilidad para ignorar un archivo es la siguiente:

{{{
$ svn propset svn:ignore configuration.php /var/www/joomla/
}}}

NOTA: Si el archivo ha sido añadido al repositorio es necesario borrarlo (en ambos casos).

Por otro lado, otra posibilidad interesante es definir un archivo de ignores {{{.ignore}}} en el directorio en cuestión para que pueda ser aplicado por el grupo de trabajo.

El archivo {{{.ignore}}} contiene las expresiones a ignorar.

{{{
$ vim .ignore}}}

{{{
*.pyc
*.pyo
*.o}}}
{{{

$ svn commit -m "Adding .ignore to repository"}}}

{{{
$ svn propset svn:ignore -F .ignore .
property 'svn:ignore' set on '.'}}}

{{{
$ svn commit -m "Adding svn properties to directory"}}}

== Ignorar ficheros en todo el repositorio ==

También puedes hacer un cambio de la configuración global del cliente de subversion en: 

{{{
$ vim ~/.subversion/config}}}

y editar la línea {{{global-ignores}}} añadiendo los archivos que quieres ignorar, archivos de backup de los editores, precompilados de python, objetos de C.... 

{{{
global-ignores = *.o *.pyc *.pyo .*~ *~ .#* .DS_Store}}}

El comportamiento en este caso si es recursivo. En cualquier caso los ignores se aplican a archivos que no se añadido en el repositorio. Es particularmente util definir alguna extension que te sirva de comodin como *.orig *.old *.new, de modo que pueda estar en tu copia local sin los continuos {{{?}}} del svn sobre ese fichero.

== Cómo cambiar un log de un commit? ==

En el servidor hay que activar {{{revprop-change}}}. Contacta con tu administrador:

{{{
$ cd /path_to_repository/hooks
$ cp pre-revprop-change.tmpl pre-revprop-change
$ chmod +x pre-revprop-change}}}

Desde el cliente:
{{{
$ svn propedit -r 261 --revprop svn:log}}}

Otra posibilidad es cambiar el {{{log}}} directamente desde el servidor.

{{{
$ svnadmin setlog /srv/svn -r 261}}}

== Cómo hacer un backup del repositorio? ==

Para hacer un dump de todo el repositorio y asumiendo que este se encuentra en {{{/srv/svn/}}}:

{{{
$ svnadmin dump /srv/svn &gt; dumpfile.24032006}}}

Para restaurarlo:

{{{
$ svnadmin create /home/cesar/svn-repos
$ svnadmin load /home/cesar/svn-repos &lt; dumpfile.24032006}}}

Otra posibilidad es hacer un backup incremental

{{{
$ svnadmin dump --incremental --revision 300:398 /srv/svn}}}

== Script incremental de backup del repositorio ==

##El script [attachment:daily-backup.pl daily-backup.pl] :
El script diario:

{{{#!Perl
#!/usr/bin/perl -w
#
# Excerpted from the book, "Pragmatic Version Control using Subversion"
#
# Perform a daily backup of a Subversion repository,
# using the previous most-recently-backed-up revision
# to create just an incremental dump.

$svn_repos = "/home/cesar/svn-repos";
$backups_dir = "/home/cesar/svn-backup";
$next_backup_file = "daily-incremental-backup." . `date +%Y%m%d`;

open(IN, "$backups_dir/last_backed_up");
$previous_youngest = &lt;IN&gt;;
chomp $previous_youngest;
close IN;

$youngest = `svnlook youngest $svn_repos`;
chomp $youngest;

if($youngest eq $previous_youngest) {
    print "No new revisions to back up.\n";
    exit 0;
}

# We need to backup from the last backed up revision
# to the latest (youngest) revision in the repository
$first_rev = $previous_youngest + 1;
$last_rev = $youngest;

print "Backing up revisions $first_rev to $last_rev...\n";
$svnadmin_cmd = "svnadmin dump --incremental " .
                "--revision $first_rev:$last_rev " .
                "$svn_repos &gt; $backups_dir/$next_backup_file";
`$svnadmin_cmd`;

print "Compressing dump file...\n";
print `gzip -9 $backups_dir/$next_backup_file`;

open(LOG, "&gt;$backups_dir/last_backed_up");
print LOG $last_rev;
close LOG;
}}}

##El script [attachment:weekly-backup.pl weekly-backup.pl]:
El script semanal:

{{{#!VimColor
#!/usr/bin/perl -w
#
# Excerpted from the book, "Pragmatic Version Control using Subversion
#
# Perform a weekly backup of a Subversion repository,
# logging the most-recently-backed-up revision so an
# incremental script can be run other days.

$svn_repos = "/home/cesar/svn-repos";
$backups_dir = "/home/cesar/svn-backup";
$next_backup_file = "weekly-full-backup." . `date +%Y%m%d`;

$youngest = `svnlook youngest $svn_repos`;
chomp $youngest;

print "Backing up to revision $youngest\n";
`svnadmin dump $svn_repos &gt; $backups_dir/$next_backup_file`;
print "Compressing dump file...\n";
print `gzip -9 $backups_dir/$next_backup_file`;

open(LOG, "&gt;$backups_dir/last_backed_up");
print LOG $youngest;
close LOG;
}}}

== Cómo iniciar un proyecto con subversion? ==
Como root creamos el grupo de usuarios de svn y añadimos el usuario cesar al grupo:

{{{
$ groupadd svnusers
$ usermod -G svnusers cesar
$ usermod -G www cesar
}}}
Esto también puede hacerse modificando el archivo /etc/group.

Como usuario cesar, creamos el repositorio en el directorio del servidor {{{/srv/svn}}}:

{{{
$ cd /srv/
$ mkdir /srv/svn
$ chgrp svnusers /srv/svn
$ chown cesar /srv/svn
$ chmod g+w svn
$ chmod g+s svn
$ umask 002
$ svnadmin create /srv/svn
}}}

Importamos el proyecto inicial en el home. El proyecto se denomina {{{zox}}}. Creamos un directorio para la rama principal (trunk), para las ramas de desarrollo de los usuarios (branches) y para las releases del proyecto (tags):

{{{
$ cd /home/cesar
$ mkdir tmp
$ cd tmp
$ mkdir zox
$ mkdir zox/trunk
$ mkdir zox/branches
$ mkdir zox/tags    
$ svn import . file:///srv/svn --message 'Import inicial de la estructura de directorios del proyecto zox'
}}}

Como usuario www importamos el proyecto {{{/srv/www/zox/}}} en el trunk:

{{{
$ cd /srv/www/zox/
$ umask 002
$ svn import bcs file:///srv/svn/zox/trunk
}}}

Hacemos el primer checkout desde el servidor:

{{{
$ cd /home/cesar/zox/work/
$ umask 002
$ svn co file:///srv/svn/zox/trunk trunk
}}}

Comprobamos desde un cliente remoto:

{{{
$ svn co svn+ssh://lcpx04.wm.lc.ehu.es:/srv/svn/zox/trunk trunk
}}}

== Cómo migrar un repositorio CVS a subversion? ==

En primer lugar es necesario instalar los paquetes de subversion, cvs y cvs2svn (tambien rcs).

{{{
$ aptitude install subversion
$ aptitude install cvs
$ aptitude install cvs2svn
}}} 

El repositorio de CVS que queremos migrar se encuentra en /home/zylk/cvsroot

Exportamos la variable de entorno {{{$CVSROOT}}}:

{{{
$ export CVSROOT=/home/zylk/cvsroot
}}}

y se comprueba desde un cliente local que el repositorio no está corrupto:

{{{
$ cd /tmp
$ cvs co src
}}}

Aplicamos la conversión:

{{{
$ cd
$ cvs2svn -s /home/zylk/svnroot /home/zylk/cvsroot
}}}

Los repositorios están situados en /home/zylk/cvsroot (CVS) y /home/zylk/svnroot (SUBVERSION)

Si dice que el repositorio de svn no existe:

{{{
$ svnadmin create /home/zylk/svnroot
}}}

Si se queja de los nombres de los archivos es necesario definir el encoding.

{{{
$ cvs2svn --encoding=latin1 -s /home/zylk/svnroot /home/zylk/cvsroot

cvs2svn Statistics:
------------------
Total CVS Files: 13882
Total CVS Revisions: 30428
Total Unique Tags: 61
Total Unique Branches: 20
CVS Repos Size in KB: 700115
Total SVN Commits: 2378
First Revision Date: Thu Nov 4 11:54:53 2004
Last Revision Date: Thu Jul 13 13:39:20 2006
------------------
Timings:
------------------
pass 1: 36 seconds
pass 2: 7 seconds
pass 3: 0 seconds
pass 4: 4 seconds
pass 5: 8 seconds
pass 6: 0 seconds
pass 7: 0 seconds
pass 8: 548 seconds
total: 606 seconds
}}}

Hago una prueba de que se exportado todo:

{{{
$ svn ls file:///home/zylk/svnroot/trunk
CVSROOT/
docs/
personal/
src/
}}}

== Crear una rama ==

Crear una rama o una línea paralela de desarrollo:

{{{
                           copy
----------------------------------------- tronco
                           |
                           |
                           ++++++++++++++ rama
}}}

En realidad es un copia a otro directorio del repositorio que puede ser sincronizada (merge).

{{{
svn copy 
https://svn.zylk.net:446/svn/src/z-proy/tknika/kzylkgestionformacion/ 
https://svn.zylk.net:446/svn/src/z-proy-int/java/portlets/kzylkgestionformacion_v2.0 
-m "Copiando rama a proyectos internos para el desarrollo de la version 2.0 del portlet"
}}}


=== Creando una versión (tag) ===

Crear una versión no es más que crear una rama nueva cuyo nombre indica que se trata de una versión. En la copia se indica la revisión (-r1964), sino se indica coge la revisión HEAD.

{{{

svn copy https://svn.zylk.net:446/svn/src/z-proy/esle/efacturaCore -r1964 
https://svn.zylk.net:446/svn/src/z-proy/esle/sinadura-tags/v.1.2/efacturaCore 
-m"Tag de efactura Core version 1.2"

}}}

Más información sobre tags y estructura de svn: http://svnbook.red-bean.com/en/1.1/ch04s06.html

== Borrar todos los directorios "/.svn" ==

Se puede hacer un export pero a veces.....

{{{
$ find . -type d |grep "\.svn$" | xargs -n 1 rm -rf
}}}


== Creando externals ==


Como crear un enlace externo a otra ruta. 

Tiene que hacerse sobre una copia local, se indica un directorio local donde vaya a ir el contenido de una ruta del svn. Este directorio local no tiene que existir, sino dará un error de bloqueo posteriormente al hacer un update. Se indica la ruta del svn (http://svn:.....). Se indica a qué directorio se aplica la propiedad (en este caso .) lo que implica que se aplica a la ruta versionada. 

{{{

svn propset svn:externals "scripts https://svn.zylk.net:446/svn/src/z-proy/esle/sinadura-tags/scripts/" .

}}}


Se hace commit de la propiedad aplicada para que en una descarga posterior se descarguen las rutas externas. Para no descargar los externals de una ruta durante un checkout, existe la opción --ignore-externals.</summary>
    <dc:creator>Cesar Capillas</dc:creator>
    <dc:date>2010-05-10T13:40:40Z</dc:date>
  </entry>
  <entry>
    <title>CvsPrimerosPasos 2.2 (minor-edit)</title>
    <link rel="alternate" href="http://www.zylk.net/web/guest/web-2-0/wiki?p_p_id=36&amp;p_p_lifecycle=0&amp;p_r_p_185834411_nodeId=12323&amp;p_r_p_185834411_title=&amp;CvsPrimerosPasos" />
    <author>
      <name>Cesar Capillas</name>
    </author>
    <id>http://www.zylk.net/web/guest/web-2-0/wiki?p_p_id=36&amp;p_p_lifecycle=0&amp;p_r_p_185834411_nodeId=12323&amp;p_r_p_185834411_title=&amp;CvsPrimerosPasos</id>
    <updated>2010-04-18T11:29:35Z</updated>
    <published>2010-04-18T11:29:35Z</published>
    <summary type="html">&lt;&lt;TableOfContents&gt;&gt;

Estos son los primeros pasos para iniciar un proyecto en CVS:
== Enlaces ==

* http://cvsbook.red-bean.com/cvsbook.html
* http://www.gentoo.org/doc/es/cvs-tutorial.xml
* http://www.bravegnu.org/cvscheat/cvscheat.pdf
* http://tnerual.eriogerg.free.fr/cvsqrc.pdf

== Crear un repositorio ==
En primer lugar es necesario crear un repositorio donde se van a guardar las versiones diferentes: Esto puede hacerse creando el directorio directamente,
{{{
cesar@bender:~&gt; mkdir cvsroot/
cesar@bender:~&gt; mkdir cvsroot/CVSROOT
}}}
o bien se puede hacer con un comando CVS:
{{{
cesar@bender:~&gt; cvs -d /home/cesar/cvsroot init
}}}
En este caso hemos creado un repositorio en la máquina local bender, que funcionaría como servidor.
Por otro lado, en zylk.net el repositorio de control de versiones CVS se encuentra en kastor.zylk.net y nuestras máquinas funcionan como clientes. El repositorio es texto plano con lo que se puede llevar a cualquier otra máquina sin problemas.

== Definir la ubicación (PATH) del repositorio ==
Para que la shell conozca la ubicación del repositorio (el de kastor o el de bender) debemos cargar la variable de entorno correspondiente. Editamos el fichero .bashrc si nuestra shell es bash y definimos la variable de entorno CVSROOT. Para el caso del repositorio en el servidor kastor.zylk.net.
{{{
cesar@bender:~&gt; vim .bashrc
export CVSROOT="ext:cesar@kastor.zylk.net:/data/cvsroot/"
export CVS_RSH="ssh"
export CVS_EDITOR="vim"
}}}
Ejecutamos el fichero .bashrc para que se cargue la variable de entorno,
{{{
cesar@bender:~&gt; . .bashrc
}}}
Los requisitos previos de conexión son por lo tanto un cliente de CVS y de openssh o similar, y debemos tener una cuenta de usuario en la máquina que funciona como servidor. La autentificación será mediante la contraseña de usuario. Por cierto, las máquinas y directorios especificados son ficticios :-)

== Importar un proyecto ==
Normalmente, al empezar un proyecto se tiene un directorio base en el que trabajas que quieres introducir/importar en el CVS, digamos /home/$USER/zylk/olatxu

Antes de hacer nada, por si acaso:
{{{
cesar@bender:~&gt; cd ~/zylk
cesar@bender:~/zylk&gt; tar -czvf olatxu.tgz olatxu/
}}}
Primero movemos el directorio a otro,
{{{
cesar@bender:~/zylk&gt; mv olatxu dummy
cesar@bender:~/zylk&gt; cd dummy
cesar@bender:~/zylk/dummy&gt; cvs import -m "El proyecto olatxu" zylk/olatxu zylk beta
}}}
Algunos comentarios:
* Lo que hace import es importar los archivos recursivamente desde el directorio actual y ponerlos en el CVS
* La opcion -m te permite comentar el proyecto que vas a iniciar. Si no escribes nada te abrirá tu editor por defecto $EDITOR o $CVS_EDITOR y te pedirá un comentario.
* zylk/olatxu es el path relativo al $CVSROOT donde está alojado el código guardado. Es decir, guardamos el código en kastor.zylk.net:/data/cvsroot/zylk/olatxu
* zylk es un vendor tag
* beta es un release tag
Ya tenemos proyecto. Lo que necesitamos es verificar que ha funcionado y para eso vamos a sacar una copia del repositorio.

== Crear una copia local del proyecto ==
{{{
cesar@bender:~/zylk/dummy&gt; cd ..
cesar@bender:~/zylk&gt; cd ..
cesar@bender:~&gt; cvs checkout zylk/olatxu
}}}
Esto te crea una copia en zylk/olatxu. Miramos si todo es correcto.
{{{
cesar@bender:~&gt; cd zylk
cesar@bender:~/zylk&gt; diff -rq olatxu dummy
Only in olatxu: CVS
.
.
}}}
Lo cual no debe dar diferencias en los archivos de código. En este momento podemos borrar la copia inicial dummy.
{{{
cesar@bender:~/zylk&gt; rm -rf dummy
}}}
Y comenzamos a trabajar en nuestro directorio original $HOME/zylk/olatxu
== Comandos básicos ==
* El comando status: La salida del comando muestra el estado de todos los archivos por debajo del directorio en el que te encuentras.
{{{
$ cvs status
}}}
También puedes hacer:
{{{
$ cvs status documentation.tex
$ cvs status|grep "Status"
}}}
Un alias bastante útil es:
{{{
$ alias cvstat="cvs status 2&gt;&amp;1 | egrep '(\?|File:)' | grep -v Up-to-date"
}}}
* El comando log: Proporciona los comentarios de una versión. Los diferentes logs de los archivos en el CVS. Los comentarios en la opcion -m "xxxxxx" en las diferentes revisiones.
{{{
$ cvs log &lt;file&gt;
}}}
* El comando diff: Permite obtener las diferencias entre versiones. El primer comando muestra las diferencias del archivo con la version del repositorio. El segundo comando te muestra las diferencias entre las versiones 1.1 y 1.3 del repositorio.
{{{
$ cvs diff &lt;file&gt;
$ cvs diff -r1.1 -r1.3 &lt;file&gt;
}}}
* El comando update: El comando update compara la versión presente en tu copia local con la del repositorio y recoge los cambios. Al comenzar a trabajar es lo primero que debe hacerse, un update con los posibles cambios que ha hecho tu equipo. Cuando has hecho tus cambios en tus archivos locales debes hacer update para que el repositorio tenga cuenta de estos cambios. Los cambios no serán permanentes hasta que no hagas commit.
{{{
$ cvs update &lt;file&gt;
}}}
* El comando commit: Guarda una versión en el repositorio.
{{{
$ cvs commit &lt;file&gt;
}}}
* El comando checkout: Hace una copia de un archivo del repositorio. En el segundo caso hace la copia de la version 1.1.
{{{
$ cvs checkout &lt;file&gt;
$ cvs checkout -r 1.1 &lt;file&gt;
}}}
* El comando add: Añade un archivo nuevo al repositorio. Después de hacer un add hay que hacer un commit.
{{{
$ cvs -m "New module for... " add &lt;file&gt;
}}}
* El comando remove: Borra archivos del repositorio.
{{{
$ cvs remove &lt;file&gt;
}}}
== Ignorar archivos en un directorio ==
Crear el archivo .cvsignore
{{{
$ vim .cvsignore
Makefile
Global.py
}}}
== Mandar un email tras un commit ==
Editar el archivo loginfo:
{{{
$ vim $CVSROOT/CVSROOT/loginfo
}}}
de modo que,
{{{
DEFAULT echo %{sVv} at `date` | /usr/bin/Mail -s "[z-commits]" &lt;email&gt;
}}}</summary>
    <dc:creator>Cesar Capillas</dc:creator>
    <dc:date>2010-04-18T11:29:35Z</dc:date>
  </entry>
  <entry>
    <title>AlfrescoInitialScript 1.4</title>
    <link rel="alternate" href="http://www.zylk.net/web/guest/web-2-0/wiki?p_p_id=36&amp;p_p_lifecycle=0&amp;p_r_p_185834411_nodeId=12323&amp;p_r_p_185834411_title=&amp;AlfrescoInitialScript" />
    <author>
      <name>Cesar Capillas</name>
    </author>
    <id>http://www.zylk.net/web/guest/web-2-0/wiki?p_p_id=36&amp;p_p_lifecycle=0&amp;p_r_p_185834411_nodeId=12323&amp;p_r_p_185834411_title=&amp;AlfrescoInitialScript</id>
    <updated>2010-02-09T17:53:11Z</updated>
    <published>2010-02-09T17:53:11Z</published>
    <summary type="html">= Script de inicio de Alfresco Labs 3 =

{{{
$ sudo vim /etc/init.d/alfresco

#! /bin/sh

# ENVIRONMENT VARIABLES
export ALFRESCO_HOME=/opt/alfresco
export ALFRESCO_USER=zylk
export HOSTNAME=alfrescolabs.extranet.zylk.net
#export PIDFILE=/var/run/alfresco.pid

# redirect FROM TO PROTOCOL
# setup port redirect using iptables
redirect() {

        echo "Redirecting port $1 to $2 ($3)"
        iptables -t nat -A OUTPUT -d localhost -p $3 --dport $1 -j REDIRECT --to-ports $2
        iptables -t nat -A PREROUTING -d $HOSTNAME -p $3 --dport $1 -j REDIRECT --to-ports $2
        iptables -t nat -A OUTPUT -d $HOSTNAME -p $3 --dport $1 -j REDIRECT --to-ports $2

}

# setup_iptables
# setup iptables for redirection of CIFS and FTP

setup_iptables () {

        # Activate IP forwarding
        echo "1" &gt;/proc/sys/net/ipv4/ip_forward

        # Clear NATing tables
        iptables -t nat -F

        # FTP NATing
        redirect 21 1121 tcp

        # CIFS NATing
        redirect 445 1445 tcp
        redirect 139 1139 tcp
        redirect 137 1137 udp
        redirect 138 1138 udp

}

# CASES

case "$1" in
        start)
                echo "Setting up iptables ..."
                setup_iptables
                sudo -H -u $ALFRESCO_USER $ALFRESCO_HOME/alfresco.sh start
                echo "Starting Alfresco ..."

        ;;

        stop)
                sudo -H -u $ALFRESCO_USER $ALFRESCO_HOME/alfresco.sh stop
                echo "Stopping Alfresco ..."
        ;;

        *)

                echo "Usage: /etc/init.d/alfresco {start|stop}"
                exit 1

        ;;

esac

exit 0
}}}

Posteriormente:
{{{
$ sudo chmod o+x /etc/init.d/alfresco
$ sudo update-rc.d alfresco defaults
}}}</summary>
    <dc:creator>Cesar Capillas</dc:creator>
    <dc:date>2010-02-09T17:53:11Z</dc:date>
  </entry>
  <entry>
    <title>HowTos 4.6 (minor-edit)</title>
    <link rel="alternate" href="http://www.zylk.net/web/guest/web-2-0/wiki?p_p_id=36&amp;p_p_lifecycle=0&amp;p_r_p_185834411_nodeId=12323&amp;p_r_p_185834411_title=&amp;HowTos" />
    <author>
      <name>Cesar Capillas</name>
    </author>
    <id>http://www.zylk.net/web/guest/web-2-0/wiki?p_p_id=36&amp;p_p_lifecycle=0&amp;p_r_p_185834411_nodeId=12323&amp;p_r_p_185834411_title=&amp;HowTos</id>
    <updated>2009-12-08T23:07:57Z</updated>
    <published>2009-12-08T23:07:57Z</published>
    <summary type="html">&lt;&lt;TableOfContents&gt;&gt;

== Zimbra Collaboration Suite (ZCS) ==

*[[InstallZimbraInUbuntu | Como instalar un servidor zimbra en Ubuntu]]
*[[ZimbraAdminTips4 | Zimbra Administration Tips 4.5]]
*[[ZimbraAdminTips5 | Zimbra Administration Tips 5.x]]

== Alfresco ECM (Enterprise Content Management) ==
*[[InstallAlfrescoUbuntu | Como instalar el servidor Alfresco Labs 3 en Ubuntu]]
*[[AlfrescoInitialScript | Script de inicio de Alfresco Labs 3]]
*[[AlfrescoFileServer | Configurando los servidores CIFS y FTP en Alfresco Labs 3]]
*[[AlfrescoSharePoint | Instalando el módulo de Sharepoint en Alfresco Labs 3]]
*[[AlfrescoExportScript | Creación de un script de exportación e importación en Alfresco]]
*[[AlfrescoFreemind | Integrando Freemind en Alfresco ]]

== Apache Tomcat ==
*[[InstalacionTomcatUbuntu | Como instalar un servidor Tomcat 5.x/6.x en Ubuntu]]
*[[TomcatJscv | Demonio JSCV para Tomcat]]
*[[TomcatNativeLib | Librerías nativas en Tomcat]]
*[[InstalacionApacheTomcatModJk | Apache + Tomcat + mod_jk]]
*[[InstalacionApacheTomcatModProxy | Apache + Tomcat + mod_proxy]]
*[[ApacheTomcatSSL | Certificados SSL y conectores Tomcat ]]
*[[TomcatDeploy | Desplegar una aplicación en Tomcat ]]
*[[TomcatAppRestrict | Restringiendo el acceso a aplicaciones ]]
*[[TomcatBasicAutentication | Configurando una autenticación básica ]]
*[[TomcatCGI | CGI's en Tomcat ]]
*[[TomcatPool | Cómo configurar un pool de conexiones en Tomcat ]]  
*[[TomcatClustering | Clustering en Tomcat ]]</summary>
    <dc:creator>Cesar Capillas</dc:creator>
    <dc:date>2009-12-08T23:07:57Z</dc:date>
  </entry>
  <entry>
    <title>FrontPage 2.1</title>
    <link rel="alternate" href="http://www.zylk.net/web/guest/web-2-0/wiki?p_p_id=36&amp;p_p_lifecycle=0&amp;p_r_p_185834411_nodeId=12323&amp;p_r_p_185834411_title=&amp;FrontPage" />
    <author>
      <name>Gustavo Fernandez</name>
    </author>
    <id>http://www.zylk.net/web/guest/web-2-0/wiki?p_p_id=36&amp;p_p_lifecycle=0&amp;p_r_p_185834411_nodeId=12323&amp;p_r_p_185834411_title=&amp;FrontPage</id>
    <updated>2009-11-12T17:17:03Z</updated>
    <published>2009-11-12T17:17:03Z</published>
    <summary type="html">= El sitio wiki de zylk.net =
Bienvenidos al wiki colaborativo de zylk.net!

Este site dispone de información relacionada con las tecnologías del software libre que aplicamos en zylk.net en nuestro día a día. En él, iremos alojando diversos artículos, manuales y recetas sobre sistemas operativos linux como ubuntu, lenguajes de programación como java o python, y herramientas de código abierto en general.

Esperamos que nuestra pequeña contribución a la comunidad del software libre os resulte de utilidad.

 -- zylk.net

==Documentos==
# [[ManualesZylk | Manuales]]
# [[CursosZylk | Cursos]]
# [[OfertaFormativa | Oferta Formativa]]
# [[ArticulosZylk | Articulos]]
# [[PreguntasDeUsoFrecuente | PUF]]
# [[HowTos | HowTo]]
==Enlaces==
# [[AlternativasLibresJava | Alternativas Libres Java]]</summary>
    <dc:creator>Gustavo Fernandez</dc:creator>
    <dc:date>2009-11-12T17:17:03Z</dc:date>
  </entry>
  <entry>
    <title>InstalacionApacheTomcatModJk 1.3 (minor-edit)</title>
    <link rel="alternate" href="http://www.zylk.net/web/guest/web-2-0/wiki?p_p_id=36&amp;p_p_lifecycle=0&amp;p_r_p_185834411_nodeId=12323&amp;p_r_p_185834411_title=&amp;InstalacionApacheTomcatModJk" />
    <author>
      <name>Cesar Capillas</name>
    </author>
    <id>http://www.zylk.net/web/guest/web-2-0/wiki?p_p_id=36&amp;p_p_lifecycle=0&amp;p_r_p_185834411_nodeId=12323&amp;p_r_p_185834411_title=&amp;InstalacionApacheTomcatModJk</id>
    <updated>2009-11-12T14:03:24Z</updated>
    <published>2009-11-12T14:03:24Z</published>
    <summary type="html">En esta configuración el servidor web Apache sirve en el puerto 80 y los JSP's se sirven a través de una redirección al AJP del Tomcat.

Instalo Apache y el módulo mod_jk:
{{{
$ aptitude install apache2
$ aptitude install libapache2-mod-jk
}}}

Configuro la carga del módulo jk:
{{{
$ vim /etc/apache2/mods-available/jk.load
LoadModule jk_module /usr/lib/apache2/modules/mod_jk.so
}}}

Configuro el módulo jk:
{{{
$ vim /etc/apache2/mods-available/jk.conf
# Where to find workers.properties
JkWorkersFile /etc/apache2/workers.properties

# Where to put jk logs
JkLogFile /var/log/apache2/mod_jk.log

# Set the jk log level [debug/error/info]
JkLogLevel error

# Select the log format
JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "

# JkOptions indicate to send SSL KEY SIZE,
JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories

# JkRequestLogFormat set the request format
JkRequestLogFormat "%w %V %T"

JkShmFile /var/log/apache2/jk-runtime-status


JkMount /alfresco worker1
JkMount /alfresco/* worker1
}}}

donde hemos especificado el formato del log, definido el archivo de conectores {{{workers.properties}}} y las reglas de los saltos JkMount

A continuación creamos el archivo {{{/etc/apache2/workers.properties}}}:
{{{
$ vim /etc/apache2/workers.properties
workers.tomcat_home=/opt/alfresco/tomcat/
workers.java_home=/usr/lib/jvm/java-6-sun/
ps=/
worker.list=worker1

worker.default.port=8009
worker.default.host=localhost
worker.default.type=ajp13
worker.default.lbfactor=1
}}}

{{{
$ a2enmod mod-jk
$ /etc/init.d/apache2 force-reload
}}}

De este modo, la conexión el servidor Apache establece un conexión con el Tomcat que es negociada a través del puerto 8009 (AJP). Así podemos utilizar el Apache como una primera capa web, e incluso desconectar el conector HTTP de Tomcat (Coyote), que por defecto se sirve en el puerto 8080.</summary>
    <dc:creator>Cesar Capillas</dc:creator>
    <dc:date>2009-11-12T14:03:24Z</dc:date>
  </entry>
  <entry>
    <title>ManualesZylk 1.5</title>
    <link rel="alternate" href="http://www.zylk.net/web/guest/web-2-0/wiki?p_p_id=36&amp;p_p_lifecycle=0&amp;p_r_p_185834411_nodeId=12323&amp;p_r_p_185834411_title=&amp;ManualesZylk" />
    <author>
      <name>Alfredo Sánchez Blanco</name>
    </author>
    <id>http://www.zylk.net/web/guest/web-2-0/wiki?p_p_id=36&amp;p_p_lifecycle=0&amp;p_r_p_185834411_nodeId=12323&amp;p_r_p_185834411_title=&amp;ManualesZylk</id>
    <updated>2009-10-29T11:26:17Z</updated>
    <published>2009-10-29T11:26:17Z</published>
    <summary type="html">== Manuales para el uso del repositorio de ESLE ==
* [[EsleBiltegiErabilpenEskuliburu  | ESLEko biltegia erabiltzeko eskuliburua]]
* [[EsleRepositorioManual | Manual para el repositorio de ESLE]]</summary>
    <dc:creator>Alfredo Sánchez Blanco</dc:creator>
    <dc:date>2009-10-29T11:26:17Z</dc:date>
  </entry>
  <entry>
    <title>AlfrescoFreemind 1.9</title>
    <link rel="alternate" href="http://www.zylk.net/web/guest/web-2-0/wiki?p_p_id=36&amp;p_p_lifecycle=0&amp;p_r_p_185834411_nodeId=12323&amp;p_r_p_185834411_title=&amp;AlfrescoFreemind" />
    <author>
      <name>Cesar Capillas</name>
    </author>
    <id>http://www.zylk.net/web/guest/web-2-0/wiki?p_p_id=36&amp;p_p_lifecycle=0&amp;p_r_p_185834411_nodeId=12323&amp;p_r_p_185834411_title=&amp;AlfrescoFreemind</id>
    <updated>2009-07-19T11:43:18Z</updated>
    <published>2009-07-19T11:43:18Z</published>
    <summary type="html">= Integrando Freemind en Alfresco =

El contenido original de este artículo puede consultarse en:

* http://www.techbits.de/2007/03/02/integrating-freemind-documents-into-alfresco/
* http://thinkalfresco.blogspot.com/2009/02/indexing-freemind-mindmaps-with.html

== Visualizando un archivo freemind en Alfresco ==

Creamos en primer lugar un nuevo tipo mimetype de freemind {{{.mm}}} en el directorio extensión de configuración (p.ej en /opt/alfresco/tomcat/shared/classes/alfresco/extension) definido en &lt;entension&gt;/mimetype-map-extension.xml

{{{
$ vim &lt;extension&gt;/mimetypes-extension.xml

&lt;alfresco-config area="mimetype-map"&gt;
&lt;config condition="Mimetype Map" evaluator="string-compare"&gt;
  &lt;mimetypes&gt;
    &lt;mimetype display="Freemind"
      mimetype="application/x-freemind"&gt;
      &lt;extension&gt;mm&lt;/extension&gt;
    &lt;/mimetype&gt;
  &lt;/mimetypes&gt;
&lt;/config&gt;
&lt;/alfresco-config&gt;
}}}   

HINT: Resulta que en las versiones de Alfresco Labs 3.0 y 3.1 hay un problemita relacionado con la creación de mimetypes en el directorio extension de modo que puede ser necesario modificar /opt/alfresco/tomcat/webapps/alfresco/WEB-INF/classes/alfresco/mimetype/mimetype-map.xml

Nos bajamos el flash player de freemind:

http://www.efectokiwano.net/mm/freeMindFlashBrowser.zip

Alojamos el archivo descomprimido en {{{/opt/alfresco/tomcat/webapps/alfresco/custom/freemind/}}}

Y creamos la template según:

http://wiki.alfresco.com/wiki/Template_Guide

{{{
$ vim template.ftl

&lt;#if document?exists&gt;
&lt;div id="flashcontent" style="height: 500px;"&gt;
         Flash plugin or Javascript are turned off.
         Activate both  and reload to view the mindmap
&lt;/div&gt;
&lt;script type="text/javascript" src="/alfresco/custom/freemind/flashobject.js"&gt; &lt;/script&gt;
&lt;script type="text/javascript"&gt;
        var fo = new FlashObject("/alfresco/custom/freemind/visorFreemind.swf", 
                                             "visorFreeMind", "100%", "100%", 6, "#9999ff");
        fo.addParam("quality", "high");
        fo.addParam("bgcolor", "#ffffff");
        fo.addVariable("openUrl", "_blank");
        fo.addVariable("initLoadFile", "/alfresco${document.url}");
        fo.addVariable("startCollapsedToLevel","5");
        fo.write("flashcontent");
    &lt;/script&gt;
&lt;#else&gt;
   No document found!
&lt;/#if&gt;
}}}

Subimos la template a Data Dictionary &gt; Presentation Templates y de este modo podemos previsualizar un archivo mm con la template.

== Indexando un documento Freemind en Alfresco ==

La idea principal es usar una herramienta de línea de comandos para la extracción de los datos de un archivo freemind (.mm) para su posterior indexación en Alfresco. Los pasos son los siguientes.

* Añadir un mimetype application/x-freemind para .mm
* Añadir un transformador para el mimetype  appplication/x-freemind a text/plain

Un archivo freemind no es más que un XML. La conversión de los datos del freemind a texto se puede hacer mediante xmlstarlet, que se puede descargar de:

http://xmlstar.sourceforge.net/

o bien a través de los repositorios de debian/ubuntu

{{{
$ sudo aptitude install xmlstarlet
}}}

Un pequeño script de shell con permisos de ejecución (/home/cesar/bin/freemind2text.sh) del tipo:

{{{
# !/bin/bash  
SOURCE=$1  
TARGET=$2  
echo "from $SOURCE to $TARGET" &gt;&gt;/tmp/freemindtransform.log  

xmlstarlet sel --text --encoding UTF-8 -t -m //node -v @TEXT -o ' ' "$SOURCE" &gt; "$TARGET" 
}}}

Creamos un &lt;entension&gt;/freemind-context.xml

{{{
&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"&gt;
&lt;beans&gt;
  &lt;bean id="transformer.freemindToText" 
               class="org.alfresco.repo.content.transform.RuntimeExecutableContentTransformer" 
               parent="baseContentTransformer"&gt;
    &lt;property name="transformCommand"&gt;
      &lt;bean name="transformer.freemind.Command" class="org.alfresco.util.exec.RuntimeExec"&gt;
        &lt;property name="commandMap"&gt;
          &lt;map&gt;
            &lt;entry key="Linux.*"&gt;
              &lt;value&gt;/home/cesar/bin/freemind2text.sh ${source} ${target}&lt;/value&gt;
            &lt;/entry&gt;
            &lt;entry key="Windows.*"&gt;
              &lt;value&gt;/home/cesar/bin/freemind2text.sh ${source} ${target}&lt;/value&gt;
            &lt;/entry&gt;
          &lt;/map&gt;
        &lt;/property&gt;
        &lt;property name="defaultProperties"&gt;
          &lt;props&gt;
            &lt;prop key="options"/&gt;
          &lt;/props&gt;
        &lt;/property&gt;
      &lt;/bean&gt;
    &lt;/property&gt;

    &lt;property name="explicitTransformations"&gt;
      &lt;list&gt;
        &lt;bean class="org.alfresco.repo.content.transform.ExplictTransformationDetails" &gt;
          &lt;property name="sourceMimetype"&gt;&lt;value&gt;application/x-freemind&lt;/value&gt;&lt;/property&gt;
          &lt;property name="targetMimetype"&gt;&lt;value&gt;text/plain&lt;/value&gt;&lt;/property&gt;
        &lt;/bean&gt;
      &lt;/list&gt;
    &lt;/property&gt;

    &lt;!--
    &lt;property name="explicitTransformations"&gt;
      &lt;list&gt;
        &lt;bean class="org.alfresco.repo.content.transform.ContentTransformerRegistry$TransformationKey"&gt;
          &lt;constructor-arg&gt;
            &lt;value&gt;application/x-freemind&lt;/value&gt;
          &lt;/constructor-arg&gt;
          &lt;constructor-arg&gt;
            &lt;value&gt;text/plain&lt;/value&gt;
          &lt;/constructor-arg&gt;
        &lt;/bean&gt;
      &lt;/list&gt;
    &lt;/property&gt;
    --&gt;

  &lt;/bean&gt;
&lt;/beans&gt;
}}}

HINT: Fijaros que hubo que cambiar la parte de explicitTransformations del artículo original probablemente debido a otra versión de Alfresco.

Y una vez reiniciado Alfresco el contenido de nuestros archivos freemind será indexado automáticamente al añadir contenido  y por lo tanto se podrá buscar posteriormente</summary>
    <dc:creator>Cesar Capillas</dc:creator>
    <dc:date>2009-07-19T11:43:18Z</dc:date>
  </entry>
  <entry>
    <title>InstallAlfrescoUbuntu 1.8</title>
    <link rel="alternate" href="http://www.zylk.net/web/guest/web-2-0/wiki?p_p_id=36&amp;p_p_lifecycle=0&amp;p_r_p_185834411_nodeId=12323&amp;p_r_p_185834411_title=&amp;InstallAlfrescoUbuntu" />
    <author>
      <name>Cesar Capillas</name>
    </author>
    <id>http://www.zylk.net/web/guest/web-2-0/wiki?p_p_id=36&amp;p_p_lifecycle=0&amp;p_r_p_185834411_nodeId=12323&amp;p_r_p_185834411_title=&amp;InstallAlfrescoUbuntu</id>
    <updated>2009-06-08T21:21:05Z</updated>
    <published>2009-06-08T21:21:05Z</published>
    <summary type="html">= Instalacion de Alfresco Labs 3 en Ubuntu =

&lt;&lt;TableOfContents&gt;&gt;

== Requerimientos ==

{{{
$ sudo -i
$ aptitude install sun-java6-jdk
$ aptitude install mysql-server-5.0
$ aptitude install openoffice.org openoffice.org-java-common openoffice.org-headless
$ aptitude install imagemagick
$ aptitude install swftools
}}}

== Instalación ==

http://sourceforge.net/projects/alfresco/

Una vez descargado el instalador de Alfresco Labs 3 {{{Alfresco-Labs-3Stable-Linux-x86-Install}}}:

{{{
$ sudo -i
$ groupadd alfresco
$ useradd -g alfresco -s /bin/bash -d /usr/local/alfresco alfresco
$ cd /usr/local/
$ ./Alfresco-Labs-3Stable-Linux-x86-Install --mode console --prefix /usr/local/alfresco
$ chown -R alfresco:alfresco alfresco
}}}

NOTA:  Otra opción en vez del instalador es utilizar el bundle de Tomcat {{{alfresco-labs3Stable.tar.gz}}}

{{{
$ cd /usr/local/
$ tar zxvf alfresco-labs3Stable.tar.gz
}}}

Fijamos las variables de entorno $ALF_HOME y $JAVA_HOME en el script alfresco.sh

{{{
$ vim /usr/local/alfresco/alfresco.sh

ALF_HOME=/usr/local/alfresco
cd "$ALF_HOME"
APPSERVER="${ALF_HOME}/tomcat"
export JAVA_HOME="/usr/lib/jvm/java-6-sun-1.6.0.07"
export JAVA_OPTS='-Xms128m -Xmx512m -XX:MaxPermSize=128m -server'

if [ "$1" = "start" ]; then
  "${APPSERVER}/bin/startup.sh"
elif [ "$1" = "stop" ]; then
  "${APPSERVER}/bin/shutdown.sh"
fi
}}}

== Configuramos el fichero de properties ==

Redefinimos algunos paths en el fichero extensions

{{{
$ cd /usr/local/alfresco
$ vim tomcat/shared/classes/alfresco/extension/custom-repository.properties

# Alfresco data
dir.root=/usr/local/alfresco/alf_data

# External programs
ooo.exe=/usr/lib/openoffice/program/soffice
swf.exe=/usr/bin/pdf2swf
img.exe=/usr/bin/convert
}}}

== Configuración con Mysql 5.0 ==

Por defecto, la instalación configura una base de datos tipo embebida Derby, que sólo es aconsejable para pruebas. En este caso vamos a configurar

Creamos la bbdd alfresco y el usuario alfresco en la base de datos.

{{{
$ mysql -u root -p
&gt; create database alfresco;
&gt; grant all on alfresco.* to "alfresco"@"localhost" identified by "alfresco" with grant option;
&gt; grant all on alfresco.* to "alfresco"@"localhost.localdomain" identified by "alfresco" with grant option;
}}}

Este es el contenido del script {{{/usr/local/alfresco/extras/databases/mysql/db_setup.sql}}}:

Configuramos el driver utilizado por Alfresco (pool de conexiones) en el fichero properties así como los datos de conexión.

{{{
$ cd /usr/local/alfresco
$ vim tomcat/shared/classes/alfresco/extension/custom-repository.properties

db.driver=org.gjt.mm.mysql.Driver
db.url=jdbc:mysql://localhost/alfresco
}}}

Y configuramos también las propiedades de hibernate:
{{{
$ cd /usr/local/alfresco/
$ vim tomcat/shared/classes/alfresco/extension/custom-hibernate-dialect.properties

# MySQL dialect (default)
hibernate.dialect=org.hibernate.dialect.MySQLInnoDBDialect
}}}

Por último, nos descargamos un conector java para mysql y lo copiamos en el directorio del conetenedor de servlets Tomcat {{{/usr/local/alfresco/tomcat/common/lib}}} o {{{/usr/local/alfresco/tomcat/lib}}} 

http://dev.mysql.com/downloads/connector/j/5.1.html

{{{
$ tar zxvf mysql-connector-java-5.1.6.tar.gz
$ cp mysql-connector-java-5.1.6/mysql-connector-java-5.1.6-bin.jar /usr/local/alfresco/tomcat/lib/common/
}}}

NOTA: Si hemos iniciado el servidor con alguna otra base de datos deberíamos borrar el directorio {{{alf_data}}}.

== Configuración con Postgresql 8.3 ==

Si en vez de Mysql nos inclinamos por Postgresql como base de datos, instalamos postgresql:
{{{
$ aptitude install postgresql
}}}

Para permitir conexiones remotas a la base de datos desde otras máquinas:
{{{
$ vim /etc/postgresql/8.3/main/pg_hba.conf

host all all 127.0.0.1/32 password
}}}

Creamos la base de datos alfresco y el usuario alfresco con password alfresco con privilegios.
{{{
$ sudo -i
$ su - postgresql
$ psql
CREATE DATABASE alfresco WITH OWNER=alfresco;
CREATE USER alfresco WITH PASSWORD 'alfresco';
GRANT ALL PRIVILEGES ON DATABASE alfresco TO alfresco;
\l
\du
\q
}}}

Editamos el fichero de properties:
{{{
$ cd /usr/local/alfresco
$ vim tomcat/shared/classes/alfresco/extension/custom-repository.properties

#
# PostgreSQL connection (requires postgresql-8.2-504.jdbc3.jar or equivalent)
#
db.driver=org.postgresql.Driver
db.url=jdbc:postgresql://localhost:5432/alfresco
}}}

Y configuramos también las propiedades de hibernate:
{{{
$ cd /usr/local/alfresco/
$ vim tomcat/shared/classes/alfresco/extension/custom-hibernate-dialect.properties

#
# PostgreSQL dialect
#
hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
hibernate.query.substitutions=true TRUE, false FALSE
}}}

El conector en este caso nos lo descargamos de:

http://jdbc.postgresql.org/download.html

== Inicio del servidor ==

{{{
$ cd /usr/local/alfresco
$ sh alfresco.sh start
}}}

== Notas ==
Si por alguna razón hemos iniciado la Derby en una prueba anterior y posteriormente lo hemos intentado con la MySQL, es necesario borrar el directorio {{{alf_data}}} (creado con la Derby) y la base de datos alfresco en Mysql. Posteriormente es necesario reimportar el script db_setup.sql y reiniciar el servidor Alfresco.</summary>
    <dc:creator>Cesar Capillas</dc:creator>
    <dc:date>2009-06-08T21:21:05Z</dc:date>
  </entry>
  <entry>
    <title>SecureShellHacks 1.7</title>
    <link rel="alternate" href="http://www.zylk.net/web/guest/web-2-0/wiki?p_p_id=36&amp;p_p_lifecycle=0&amp;p_r_p_185834411_nodeId=12323&amp;p_r_p_185834411_title=&amp;SecureShellHacks" />
    <author>
      <name>Cesar Capillas</name>
    </author>
    <id>http://www.zylk.net/web/guest/web-2-0/wiki?p_p_id=36&amp;p_p_lifecycle=0&amp;p_r_p_185834411_nodeId=12323&amp;p_r_p_185834411_title=&amp;SecureShellHacks</id>
    <updated>2009-05-19T14:44:20Z</updated>
    <published>2009-05-19T14:44:20Z</published>
    <summary type="html">&lt;&lt;TableOfContents&gt;&gt;

= SSH hacks =
== Cómo me conecto por ssh sin contraseñas ==
En primer lugar es necesario generar una pareja de claves en tu máquina ('''client'''), en este caso '''bender''':
{{{cesar@bender ~ $ ssh-keygen -t dsa}}}
Te preguntará un passphrase que es recomendable introducir, aunque también se puede dejar en blanco. Tras esta operación obtendrás los ficheros:
{{{cesar@bender ~ $ ls ~/.ssh
id_dsa
id_dsa.pub
known_hosts
}}}
El fichero '''id_dsa''' contiene la clave privada y no debería salir de tu ordenador. Debe tener permisos 600:
{{{
cesar@bender ~ $ chmod 600 .ssh/id_dsa
}}}
El fichero '''id_dsa.pub''' contiene tu clave pública. Para autorizar una clave pública en una máquina remota '''kastor''':
{{{
cesar@bender ~ $ cat ~/.ssh/id_dsa.pub | ssh kastor 'cat - &gt;&gt; .ssh/authorized_keys'
}}}
No olvides poner dos símbolos "&gt;", puesto que en caso contrario te cargarás otras claves autorizadas en la máquina '''kastor'''.
La próxima vez que hagas '''ssh kastor''' entrará sin más. Si has puesto passphrase, tendrás que hacer primero:
{{{
cesar@bender ~ $ ssh-add
}}}
=== Solución de problemas ===
* Sigue sin dejar conectarme: Asegúrate de que los permisos de '''~/.ssh/authorized_keys''' en la máquina remota son 644.
* Cuando escribo '''ssh-add''' aparece el mensaje ''Could not open a connection to your authentication agent'': La shell desde la que intentas conectarte no esta bajo el control del agente de autenticación.
* Solucion rápida: Lanza una shell con el agente de ssh.
{{{
cesar@bender ~ $ ssh-agent bash
}}}
* Solución mejor: lanza todas tus X bajo el '''ssh-agent'''. Así todas las terminales colgarán de él. 
== El archivo /etc/hosts ==
Para un acceso rápido por ssh resulta muy útil definir alias de tus máquinas comunes en el fichero '''/etc/hosts''':
{{{
cesar@bender ~ $ sudo vim /etc/hosts
#
# Syntax:
#    
# IP-Address  Full-Qualified-Hostname  Short-Hostname
#
192.168.1.4     kastor.zylk.net kastor
}}}
Esta operación requiere privilegios de administrador o superusuario.
== Como manejar las llaves de ssh ? Uso de keychain ==
Una posibilidad es iniciar el ordenador en '''init 3''' sin X y redefinir tu '''startx''':
Este es mi '''~/bin/startx-ssh''':
{{{
cesar@bender ~ $ vim ~/bin/startx-ssh
#!/bin/bash

keychain ~/.ssh/id_dsa || exit
source ~/.keychain/`hostname`-sh
startx

exit
}}}
Al iniciarlo, me pide el passphrase.
Otra posibilidad es incluir estas dos líneas en tu archivo '''.gnomerc''' o similar en otros entornos gráficos. 
{{{
keychain  ~/.ssh/id_dsa
source ~/.keychain/`hostname`-sh
}}}
Y ahora, si hago login desde otra máquina, o quiero que un cron pueda conectarse a otras máquinas, incluyo las siguientes líneas:
{{{
cesar@bender ~ $ source ~/.keychain/`hostname`-sh
}}}
Si quiero cerrar el acceso, hago:
{{{
cesar@bender ~ $ keychain --stop
}}}
Para volverlo a arrancar:
{{{
cesar@bender ~ $ keychain ~/.ssh/id_dsa
}}}
== Cómo y por qué usar un túnel ssh? ==
Has trabajado alguna vez detrás de un firewall? 
Tienes una página web privada de una institución detrás de un firewall a la que sólo pueden acceder las máquinas de esa institución? 
Has intentado alguna vez mover un fichero desde detrás de un firewall a otra máquina que esta detrás de otro firewall? 
Entonces, lo que necesitas es hacer un túnel ssh.

La idea básica es que desde tu máquina ('''client.machine''') tienes acceso a una máquina '''bridge.machine''' que no es a la que quieres acceder, pero que desde ella si podrías acceder a tu objetivo '''target.machine'''. El túnel te permite operar de forma transparente desde '''client.machime''' hasta '''target.machine'''. Hay dos tipos de túneles: túneles directos e inversos.
En un túnel directo (forward) se hace corresponder un puerto de destino ('''dport''') en la '''target.machine''', con un puerto local ('''lport''') en tu máquina '''client.machine'''. Esto se hace de la siguiente manera:
{{{
cesar@bender ~ $ ssh -NfL lport:target.machine:dport bridge.machine
}}}
Regla nemotécnica: acuérdate de la liga de futbol americano (NFL) y que la del medio es en minúscula.
\\
HINT: Por cierto, aseguraros que el puerto local no está siendo usado, por ejemplo que apache este escuchando en ese puerto (aunque este mapeado con un virtual host deshabilitado). Por otro lado la opción verbose (-NfvL) puede ayudar en la traza de algún error. 
=== Conectarse por ssh a target.machine ===
Primero construiríamos el túnel:
{{{
cesar@bender ~ $ ssh -NfL 6666:target.machine:22 bridge.machine
}}}
Y a continuación basta con hacer lo siguiente para entrar directamente en '''target.machine''':
{{{
cesar@bender ~ $ ssh -p6666 localhost
}}}
O bien:
{{{
cesar@bender ~ $ scp -P6666 fichero localhost:/el/path/que/te/venga/bien
}}}
Esto requiere que en tu '''$HOME/.ssh/config''' añadas la línea:
{{{
NoHostAuthenticationForLocalhost yes
}}}
== Ejemplos de uso para los túneles ssh ==
=== Conexión a una web de una red privada ===
Si montas un servicio en un ordenador detrás de un firewall, este no va a estar disponible fuera porque en general los puertos estarán capados. Por ejemplo, una web dentro de una máquina de una red privada sin salida al exterior. A través de un túnel ssh se puede acceder a este servicio.
{{{
cesar@bender ~ $ ssh -NfL 8080:target.machine:80 bridge.machine
}}}
Después en el navegador, la web de '''target.machine''' estará disponible en '''http://localhost:8080'''.
=== Conexión al LDAP de una red privada ===
{{{
cesar@bender ~ $ ssh -Nvf -L 9999:kastor.zylk.net:389 cesar@kastor.zylk.net
}}}
Aunque el puerto del LDAP (389) esta capado, yo puedo acceder a él desde fuera de la red si tengo un acceso a '''kastor'''
haciéndolo pasar a través del puerto 22 (el del ssh) y mapeandolo a un puerto, digamos el 9999 en mi máquina local.
Situación inicial:
{{{
               |             |
localhost:9999   ----------- | kastor.zylk.net:389
               |             |
}}}
Túnel:
{{{
               |          22 |                     |
localhost:9999   -----------   kastor.zylk.net:22    kastor.zylk.net:389
               |             |                     |
}}}
Una vez hecho el túnel, puedo configurar en mi agenda el acceso al LDAP con servidor localhost y puerto 9999.
Nota: En realidad el proceso incorpora tres máquinas, la local, la de salida y la del servicio. Lo que pasa es
que en este caso las dos ultimas son la misma.
=== Administrar el servidor CUPS de una red privada ===
Desde mi máquina:
{{{
cesar@bender ~ $ ssh -Nvf -L 63131:cups.zylk.net:631 cesar@kastor.zylk.net
}}}
Túnel:
{{{
               |          22 |                 |
localhost:63131   -----------   kastor.zylk.net   cups.zylk.net:631
               |             |                 |
}}}
De este modo me puedo conectar a la interfaz web de administración desde mi máquina en http://localhost:63131
== Cómo definir tus propios hosts sin ser root? ==
Una situación bastante común es que tener acceso a una cuenta en una máquina sin privilegios de administrador o superusuario. 
Para conectarte a '''kastor.zylk.net''' con login '''cesar''':
{{{
cesar@bender ~ $ ssh cesar@kastor.zylk.net
}}}
La solución está en el fichero '''$HOME/.ssh/config''':
{{{
Host kastor
Hostname kastor.zylk.net
User cesar
Port 22
ForwardX11 no 
Protocol 2,1

Host cups
Hostname localhost
User zylk
Port 9999
}}}
Con lo cual puedes hacer directamente:
{{{
cesar@bender ~ $ ssh kastor
}}}
El ssh sabe que tiene que conectarse a la máquina '''kastor.zylk.net''' y usar el login '''cesar'''.
Y ahora sabe que tiene que conectarse al puerto 9999 de '''localhost''' usando como login '''zylk'''.
Con esto tienes ya total transparencia en los túneles. Sobre todo si te haces un alias para levantarlo
del tipo de:
{{{
cesar@bender ~ $ alias tncups='ssh -NfL 9999:cups.zylk.net:22 cesar@kastor'
}}}
Ejecutas el alias, que puedes copiar en tu '''.bashrc''':
{{{
cesar@bender ~ $ tncups
}}}
y te puedes conectar directamente a '''cups.zylk.net''' de forma transparente desde el exterior.
{{{
cesar@bender ~ $ ssh cups
}}}
== Utilizando el sistema de ficheros sshfs ==
El objetivo es tener un sistema de ficheros remoto. Una especie de NFS o samba, pero seguro a través de ssh.
Instalo sshfs:
{{{
$ sudo apt-get install sshfs
}}}
Me añado al grupo "fuse":
{{{
$ sudo vi /etc/group
}}}
Luego ejecuto:
{{{
$ sshfs cesar@kastor.zylk.net:/data1/z-docs /mnt/z-docs/
}}}
== Cómo conectarse unicamente via certificado? ==
Configurar el demonio de ssh de modo que sólo se puedan realizar conexiones ssh a la máquina si el usuario remoto está en la lista '''authorized_keys'''.
{{{
$ sudo vim /etc/sshd_config
PasswordAuthentication no
UsePAM no
}}}
Por defecto esta opción está marcada como yes.
También se puede definir donde están las listas autorizadas (claves públicas). Por defecto las define el usuario:
{{{
#AuthorizedKeysFile     %h/.ssh/authorized_keys
}}}
Reinicio el servicio:
{{{
$ /etc/init.d/sshd restart
}}}
== Desactivar el login a root por ssh ==
Desactivo conexiones remotas ssh a la cuenta root, como medida de prevención de ataques ssh.
{{{
$ sudo vim /etc/sshd_config
PermitRootLogin no
}}}
Reinicio el servicio:
{{{
$ /etc/init.d/sshd restart
}}}</summary>
    <dc:creator>Cesar Capillas</dc:creator>
    <dc:date>2009-05-19T14:44:20Z</dc:date>
  </entry>
  <entry>
    <title>ComandoTar 3.6</title>
    <link rel="alternate" href="http://www.zylk.net/web/guest/web-2-0/wiki?p_p_id=36&amp;p_p_lifecycle=0&amp;p_r_p_185834411_nodeId=12323&amp;p_r_p_185834411_title=&amp;ComandoTar" />
    <author>
      <name>Cesar Capillas</name>
    </author>
    <id>http://www.zylk.net/web/guest/web-2-0/wiki?p_p_id=36&amp;p_p_lifecycle=0&amp;p_r_p_185834411_nodeId=12323&amp;p_r_p_185834411_title=&amp;ComandoTar</id>
    <updated>2009-05-18T12:11:12Z</updated>
    <published>2009-05-18T12:11:12Z</published>
    <summary type="html">&lt;&lt;TableOfContents&gt;&gt;

= El comando tar =
El programa tar crea, añade o extrae archivos de un fichero tipo tar.   
{{{
tar [[-]bundled-options Args] [gnu-style-flags] [filenames | -C directory-name] ...
}}}

== Operaciones básicas ==
Las tres opciones básicas son crear, extraer y listar.
{{{
-c
--create (crea un archivo)

-x
--extract (extrae archivos - 
el propietario, la fecha de modificación y los permisos del archivo se restauran si es posible.) 
--get   
     
-t
--list (lista los archivos)
}}}
Es posible comprimir mediante las opciones:
{{{
-z
--gzip
--gunzip               
--use-compress-program program
                      
-j
--bzip
--bzip2
--bunzip2              

-Z
--compress
--uncompress           
}}}
Algunas opciones recomendables son preservar los permisos, o seguir los links simbólicos.
{{{
--preserve              Has the effect of -p -s.

-p
--same-permissions
--preserve-permissions  Extract all protection information.
--preserve              Has the effect of -p -s.

-s
--same-order
--preserve-order        List of names to extract is sorted to match archive.

-h
--dereference           Don't write symlinks as symlinks; write the data of the files they name.
}}}
Es muy útil en un backup al poder especificar o excluir un conjunto de archivos.
{{{
--files-from file       Get names of files to extract or create from file, one per line.
-X file
--exclude-from file     Exclude files listed in file.
}}}
== Aplicaciones del comando tar ==
* Archivar un conjunto de archivos (recursivo)
{{{
cesar@bender /tmp $ tar -czvpsf backup.tgz /home/cesar
}}}
o bien
{{{
cesar@bender / $ tar --preserve -czvf backup.tgz /home/cesar
}}}
* Extraer un conjunto de archivos
{{{
cesar@bender /tmp $ tar -xzvpsf backup.tgz -C /data/
}}}
* Listar los archivos
{{{
cesar@bender /tmp $ tar -tvf backup.tar
}}}
* Extraer los archivos de código C
{{{
cesar@bender /tmp $ tar -xf backup.tar '*.[ch]'
}}}
* Mostrar un archivo concreto en la salida estándar
{{{
cesar@bender /tmp $ tar -xOf backup.tar /home/cesar/.bashrc
}}}
* Unir dos archivos tar
{{{
cesar@bender /tmp $ tar -Af archive1.tar archive2.tar
}}}
* Archivar ficheros que fueron modificados después de la fecha indicada
{{{
cesar@bender ~ $ tar -cf backup.tar --newer-mtime 'Feb 9 13:15 1997' srcdir/
}}}
* Tar al vuelo
{{{
cesar@bender ~ $ tar -cvf - --files-from=/etc/backup.list | \
ssh cesar@kastor.zylk.net 'cat - &gt; /home/cesar/backup.tar'
}}}
* Copia segura de directorios
{{{
cesar@bender ~ $ tar -cf - /home/cesar/share/tutorials | tar xpf - -C /tmp
}}}
o bien
{{{
cesar@bender ~ $ tar -cf - /home/cesar/share/tutorials | (cd /tmp; tar xvf -)
}}}</summary>
    <dc:creator>Cesar Capillas</dc:creator>
    <dc:date>2009-05-18T12:11:12Z</dc:date>
  </entry>
  <entry>
    <title>AlfrescoExportScript 1.1</title>
    <link rel="alternate" href="http://www.zylk.net/web/guest/web-2-0/wiki?p_p_id=36&amp;p_p_lifecycle=0&amp;p_r_p_185834411_nodeId=12323&amp;p_r_p_185834411_title=&amp;AlfrescoExportScript" />
    <author>
      <name>Cesar Capillas</name>
    </author>
    <id>http://www.zylk.net/web/guest/web-2-0/wiki?p_p_id=36&amp;p_p_lifecycle=0&amp;p_r_p_185834411_nodeId=12323&amp;p_r_p_185834411_title=&amp;AlfrescoExportScript</id>
    <updated>2009-05-13T08:12:44Z</updated>
    <published>2009-05-13T08:12:44Z</published>
    <summary type="html">= Creación de un script de exportación / importación en Alfresco =

http://forums.alfresco.com/en/viewtopic.php?f=4&amp;p=61707

El script es el siguiente donde es necesario definir la variable $ALF_HOME
{{{
#!/bin/sh
# Create Alfresco export script
# Peter Löfgren, Redpill Linpro

SCRIPTNAME="export.sh"
ALF_HOME=/opt/alfresco
cd "$ALF_HOME"
APPSERVER="${ALF_HOME}/tomcat"

# Add the basics
echo "#!/bin/sh" &gt; $SCRIPTNAME

# make the export dir
echo "if [ ! -d ./export ]; then" &gt;&gt; $SCRIPTNAME
echo "mkdir export" &gt;&gt; $SCRIPTNAME
echo "fi" &gt;&gt; $SCRIPTNAME

# Add Java options to script
echo "export JAVA_HOME=/usr/lib/jvm/java-6-sun" &gt;&gt; $SCRIPTNAME
#echo "export JAVA_OPTS='-Xms128m -Xmx1024m -XX:MaxPermSize=128m -server'" &gt;&gt; $SCRIPTNAME

# Add classpath to the script
echo -n "java -classpath $APPSERVER/webapps/alfresco/WEB-INF/classes/alfresco/module:"  &gt;&gt; $SCRIPTNAME
echo -n "$APPSERVER/shared/classes:"  &gt;&gt; $SCRIPTNAME
echo -n "$APPSERVER/webapps/alfresco/WEB-INF/classes:"  &gt;&gt; $SCRIPTNAME

# List all libs
for FILE in $APPSERVER/webapps/alfresco/WEB-INF/lib/*
  do
      echo -n $FILE: &gt;&gt; $SCRIPTNAME
  done
  # This is to get your db jar, you may hav to include other locations
  for FILE in $APPSERVER/lib/*
    do
        echo -n $FILE: &gt;&gt; $SCRIPTNAME
    done

# Add the final export commands
echo -n -e " org.alfresco.tools.Export -user admin -pwd admin \
 -zip -dir export -verbose -store \0044\0061 \0044\0062"  &gt;&gt; $SCRIPTNAME
}}}

{{{
$ cd /opt/alfresco
$ export.sh  
$ export.sh workspace://SpacesStore spacesstore.acp
$ ls -la exporttotal 72
drwxr-xr-x  2 zylk zylk  4096 2009-05-13 09:45 .
drwxr-xr-x 10 zylk zylk  4096 2009-05-13 09:43 ..
-rw-r--r--  1 zylk zylk 58984 2009-05-13 09:45 spacesstore.acp
}}}</summary>
    <dc:creator>Cesar Capillas</dc:creator>
    <dc:date>2009-05-13T08:12:44Z</dc:date>
  </entry>
  <entry>
    <title>AlfrescoSharePoint 1.0</title>
    <link rel="alternate" href="http://www.zylk.net/web/guest/web-2-0/wiki?p_p_id=36&amp;p_p_lifecycle=0&amp;p_r_p_185834411_nodeId=12323&amp;p_r_p_185834411_title=&amp;AlfrescoSharePoint" />
    <author>
      <name>Cesar Capillas</name>
    </author>
    <id>http://www.zylk.net/web/guest/web-2-0/wiki?p_p_id=36&amp;p_p_lifecycle=0&amp;p_r_p_185834411_nodeId=12323&amp;p_r_p_185834411_title=&amp;AlfrescoSharePoint</id>
    <updated>2009-05-12T22:08:20Z</updated>
    <published>2009-05-12T22:08:20Z</published>
    <summary type="html">= Instalando el protocolo Sharepoint en Alfresco Labs 3 =

Instalando el módulo sharepoint:
{{{
# Sharepoint
$ java -jar alfresco-mmt-3Stable.jar install vti-module.amp /usr/local/alfresco/tomcat/webapps/alfresco.war
}}}

Al reiniciar el servidor observamos la siguiente traza en el {{{catalina.out}}}

{{{
00:12:07,000 User:System INFO [repo.module.ModuleServiceImpl] Found 1 module(s).
00:12:14,545 User:System INFO [repo.module.ModuleServiceImpl]
Installing module 'org.alfresco.module.vti' version 1.0.
}}}

Un escaneo de puertos sobre la máquina evidencia que se abre el puerto 7070:

{{{
$ nmap locahost
$ nmap localhost
PORT STATE SERVICE
22/tcp open ssh
3306/tcp open mysql
7070/tcp open realserver
8080/tcp open http-proxy
}}}

La url para el sharepoint:

http://alfrescoserver:7070/alfresco</summary>
    <dc:creator>Cesar Capillas</dc:creator>
    <dc:date>2009-05-12T22:08:20Z</dc:date>
  </entry>
  <entry>
    <title>AlfrescoFileServer 1.0</title>
    <link rel="alternate" href="http://www.zylk.net/web/guest/web-2-0/wiki?p_p_id=36&amp;p_p_lifecycle=0&amp;p_r_p_185834411_nodeId=12323&amp;p_r_p_185834411_title=&amp;AlfrescoFileServer" />
    <author>
      <name>Cesar Capillas</name>
    </author>
    <id>http://www.zylk.net/web/guest/web-2-0/wiki?p_p_id=36&amp;p_p_lifecycle=0&amp;p_r_p_185834411_nodeId=12323&amp;p_r_p_185834411_title=&amp;AlfrescoFileServer</id>
    <updated>2009-05-12T22:02:22Z</updated>
    <published>2009-05-12T22:02:22Z</published>
    <summary type="html">= Configurando un CIF Server y un FTP Server en Alfresco =

Copiamos los archivos necesarios en el directorio extension:

{{{
$ cd /usr/local/alfresco/tomcat
$ cp webapps/alfresco/WEB-INF/classes/alfresco/file-servers.properties \
 shared/classes/alfresco/extension/custom-file-servers.properties
$ cp webapps/alfresco/WEB-INF/classes/alfresco/file-servers.xml \
 shared/classes/alfresco/extension/file-servers-custom.properties
$ cp webapps/alfresco/WEB-INF/classes/alfresco/network-protocol-context.xml \ 
 shared/classes/alfresco/extension/network-protocol-context.xml

$ cd shared/classes/alfresco/extension/
}}}

Editamos el properties en primer lugar.

{{{
$ vim custom-file-servers.properties

cifs.localname=${localname}
cifs.domain=ZYLK
cifs.broadcast=192.168.1.255
}}}
Apuntamos al properties en el bean correspondiente:
{{{
$ vim network-protocol-context.xml

   &lt;bean id="fileServersConfigSource" class="org.alfresco.config.source.UrlConfigSource"&gt;
      &lt;constructor-arg&gt;
         &lt;list&gt;
            &lt;value&gt;classpath:alfresco/file-servers.xml&lt;/value&gt;
            &lt;value&gt;classpath:alfresco/extension/file-servers-custom.xml&lt;/value&gt;
         &lt;/list&gt;
      &lt;/constructor-arg&gt;
   &lt;/bean&gt;
   &lt;bean id="fileServersConfigService" class="org.alfresco.config.xml.XMLConfigService" init-method="init"&gt;
      &lt;constructor-arg&gt;
         &lt;ref bean="fileServersConfigSource" /&gt;
      &lt;/constructor-arg&gt;
      &lt;property name="properties"&gt;
         &lt;list&gt;
                &lt;value&gt;classpath:alfresco/file-servers.properties&lt;/value&gt;
                &lt;value&gt;classpath:alfresco/extension/custom-file-servers.properties&lt;/value&gt;
              &lt;/list&gt;
      &lt;/property&gt;
   &lt;/bean&gt;

}}}

Configuramos los servidores de ficheros, CIFS (puertos 1445, 1137, 1138 y 1139) y FTP (1121) que posteriormente natearemos via iptables en el script de inicio. Modificamos las partes correspondientes al servidor CIFS, FTP y NFS. 

{{{

&lt;alfresco-config area="file-servers"&gt;

   &lt;config evaluator="string-compare" condition="CIFS Server"&gt;
          &lt;serverEnable enabled="true"/&gt;
      &lt;host name="${cifs.localname}A" domain="${cifs.domain}"/&gt;
      &lt;comment&gt;Alfresco CIFS Server&lt;/comment&gt;

      &lt;!-- Set to the broadcast mask for the subnet --&gt;
      &lt;broadcast&gt;${cifs.broadcast}&lt;/broadcast&gt;

      &lt;!-- Use Java socket based NetBIOS over TCP/IP and native SMB on linux --&gt;
      &lt;tcpipSMB platforms="linux,solaris,macosx"/&gt;
      &lt;netBIOSSMB platforms="linux,solaris,macosx"/&gt;

           &lt;!-- Can be mapped to non-privileged ports, then use firewall rules to forward
                    requests from the standard ports --&gt;
      &lt;tcpipSMB port="1445" platforms="linux,solaris,macosx"/&gt;
      &lt;netBIOSSMB sessionPort="1139" namePort="1137" datagramPort="1138" platforms="linux,solaris,macosx"/&gt;

      &lt;hostAnnounce interval="5"/&gt;

      &lt;!-- Use Win32 NetBIOS interface on Windows --&gt;
      &lt;Win32NetBIOS/&gt;
      &lt;Win32Announce interval="5"/&gt;

      &lt;!-- CIFS authentication --&gt;
      &lt;authenticator type="enterprise"&gt;
      &lt;/authenticator&gt;

&lt;!--
      &lt;WINS&gt;
         &lt;primary&gt;1.2.3.4&lt;/primary&gt;
         &lt;secondary&gt;5.6.7.8&lt;/secondary&gt;
      &lt;/WINS&gt;
--&gt;
      &lt;sessionDebug flags="Negotiate,Socket"/&gt;
   &lt;/config&gt;

   &lt;config evaluator="string-compare" condition="FTP Server"&gt;
          &lt;serverEnable enabled="true"/&gt;

          &lt;!-- Run on a non-privileged port --&gt;
          &lt;port&gt;1121&lt;/port&gt;

      &lt;!-- FTP authentication --&gt;
      &lt;authenticator type="alfresco"/&gt;

&lt;!--      &lt;debug flags="File,Search,Error,Directory,Info,DataPort"/&gt; --&gt;
   &lt;/config&gt;

   &lt;config evaluator="string-compare" condition="NFS Server"&gt;
          &lt;serverEnable enabled="false"/&gt;
   &lt;/config&gt;

&lt;/alfresco-config&gt;
}}}

Reiniciamos el servidor con el script de inicio. Debemos ver una traza del Tomcat del estilo a:

{{{
20:13:43,600  INFO  [config.xml.XMLConfigService$PropertyConfigurer] 
Loading properties file from class path resource [alfresco/extension/custom-file-servers.properties]
}}}

Podemos ver los puertos abiertos con nmap, o hacer pruebas simples con telnet a los puertos nateados.

{{{
21  --&gt; 1121
445 --&gt; 1145
137 --&gt; 1137
138 --&gt; 1138
139 --&gt; 1139
}}}</summary>
    <dc:creator>Cesar Capillas</dc:creator>
    <dc:date>2009-05-12T22:02:22Z</dc:date>
  </entry>
  <entry>
    <title>ApacheTomcatSSL 1.4 (minor-edit)</title>
    <link rel="alternate" href="http://www.zylk.net/web/guest/web-2-0/wiki?p_p_id=36&amp;p_p_lifecycle=0&amp;p_r_p_185834411_nodeId=12323&amp;p_r_p_185834411_title=&amp;ApacheTomcatSSL" />
    <author>
      <name>Cesar Capillas</name>
    </author>
    <id>http://www.zylk.net/web/guest/web-2-0/wiki?p_p_id=36&amp;p_p_lifecycle=0&amp;p_r_p_185834411_nodeId=12323&amp;p_r_p_185834411_title=&amp;ApacheTomcatSSL</id>
    <updated>2009-03-12T17:41:22Z</updated>
    <published>2009-03-12T17:41:22Z</published>
    <summary type="html">== Crear un certificado para Tomcat ==
Para los certificados en Tomcat utilizaremos la aplicación de java {{{keytool}}}.

Creamos en primer lugar la llave (.key):
{{{
$ keytool -genkey -alias tomcat -keyalg RSA -keystore tomcat.key
Escriba la contraseña del almacén de claves: [changeit]
Volver a escribir la contraseña nueva: [changeit]
¿Cuáles son su nombre y su apellido?
  [Unknown]: Phillip J. Fry
¿Cuál es el nombre de su unidad de organización?
  [Unknown]:  IT
¿Cuál es el nombre de su organización?
  [Unknown]:  zylk.net
¿Cuál es el nombre de su ciudad o localidad?
  [Unknown]:  Bilbao
¿Cuál es el nombre de su estado o provincia?
  [Unknown]:  Bizkaia
¿Cuál es el código de país de dos letras de la unidad?
  [Unknown]:  ES
¿Es correcto CN=Phillip J. Fry, OU=IT, O=zylk.net, L=Bilbao, ST=Bizkaia, C=ES?
  [no]:  si
}}}

Importamos el CSR:
{{{
$ keytool -certreq -keyalg RSA -alias tomcat -file tomcat.csr -keystore tomcat.key
}}}

== Crear un conector SSL en el Tomcat ==

{{{
$ vim conf/server.xml

&lt;!-- Define a SSL Coyote HTTP/1.1 Connector on port 8443 --&gt;
&lt;Connector
           port="8443" keystoreFile="tomcat.key" minProcessors="5" maxProcessors="75"
           enableLookups="false" disableUploadTimeout="true"
           acceptCount="100" debug="0" scheme="https" secure="true"
           clientAuth="false" sslProtocol="TLS"/&gt;
}}}

Por defecto, Tomcat se espera un keystoreFile llamado .keystore con keystorePass changeit. Si no ambos parámetros tienen que definirse en la configuración del conector.

== Apache y Tomcat seguros ==

Otra posibilidad es quitar el conector HTTP del Tomcat en 8080, y que sea el Apache el que utilice https, comunicandos con el Tomcat via mod_jk con AJP.

Para eso necesitamos un certificado para Apache. Primero instalamos {{openssl}}

{{{
$ aptitude install openssl
}}}

Posteriormente generamos las llaves (.key):
{{{
$ openssl genrsa -out tomcat-apr.key 1024
}}}

y creamos el certificado raíz (.csr):
{{{
$ openssl req -new -key tomcat-apr.key -out tomcat-apr.csr
}}}

Por último firmamos el certificado:
{{{
$ #openssl ca -config openssl.cnf -in tomcat-apr.csr -out tomcat-apr.crt
$ openssl x509 -req -days 365 -in tomcat-apr.csr -signkey tomcat-apr.key -out tomcat-apr.crt
}}}

Otra posibilidad en Ubuntu (para hacer los tres pasos en uno) es utilizar el script {{{make-ssl-cert}}}
{{{
$ aptitude install ssl-cert
$ mkdir /etc/apache2/ssl/
$ /usr/sbin/make-ssl-cert /usr/share/ssl-cert/ssleay.cnf /etc/apache2/ssl/nagios-apache.pem
}}}

En Ubuntu 6.06  se llama {{{apache2-ssl-certificate}}}</summary>
    <dc:creator>Cesar Capillas</dc:creator>
    <dc:date>2009-03-12T17:41:22Z</dc:date>
  </entry>
  <entry>
    <title>TomcatJscv 1.3</title>
    <link rel="alternate" href="http://www.zylk.net/web/guest/web-2-0/wiki?p_p_id=36&amp;p_p_lifecycle=0&amp;p_r_p_185834411_nodeId=12323&amp;p_r_p_185834411_title=&amp;TomcatJscv" />
    <author>
      <name>Cesar Capillas</name>
    </author>
    <id>http://www.zylk.net/web/guest/web-2-0/wiki?p_p_id=36&amp;p_p_lifecycle=0&amp;p_r_p_185834411_nodeId=12323&amp;p_r_p_185834411_title=&amp;TomcatJscv</id>
    <updated>2009-03-12T16:07:05Z</updated>
    <published>2009-03-12T16:07:05Z</published>
    <summary type="html">Instalo make y autoconf.

{{{
$ aptitude install build-essential
$ aptitude install make
$ aptitude install autoconf
}}}

En el propio {{{$CATALINA_HOME}}} descomprimimos y compilamos.
{{{
$ cd $CATALINA_HOME/bin
$ tar xvfz jsvc.tar.gz
$ cd jsvc-src
$ autoconf
$ ./configure
$ make
$ cp jsvc ..
$ cd ..
}}}

Ahora se puede iniciar el demonio de esta manera (como root o superusuario):
{{{
$ jsvc \
      -user $TOMCAT_USER \
      -cp ./bin/bootstrap.jar \
      -outfile ./logs/catalina.out \
      -errfile ./logs/catalina.err \
      -pidfile "$CATALINA_PID" \
      -Djava.endorsed.dirs=./common/endorsed \
      -Dcatalina.home="$CATALINA_HOME" \
      -Djava.io.tmpdir="$CATALINA_TMPDIR" \
      org.apache.catalina.startup.Bootstrap start
}}}


En este caso no se va a poder parar el servidor con el script shutdown.sh, ya que no se va a escuchar el puerto 8005 especificado (por defecto) en el archivo {{{conf/server.xml}}}
Lo que hay que hacer es matar la señal del proceso de Tomcat {{{$CATALINA_PID}}}

{{{
$ kill -9 $CATALINA_PID
}}}

Un posible script de inicio de Tomcat:

{{{
#!/bin/sh
export JAVA_HOME="/usr/lib/jvm/java-6-sun/"
export CATALINA_HOME="/usr/local/tomcat/"
PATH="$PATH:/usr/local/tomcat/bin"
DAEMON_HOME=$CATALINA_HOME/bin
TOMCAT_BIN=$CATALINA_HOME/bin
TOMCAT_USER=tomcat
PID_FILE="/var/run/jsvc.pid"
RETVAL=0
TMP_DIR=/tmp
CLASSPATH=$JAVA_HOME/lib/tools.jar:\
$CATALINA_HOME/bin/commons-daemon.jar:\
$CATALINA_HOME/bin/bootstrap.jar

case "$1" in
        start)
                echo "Starting tomcat"
                $DAEMON_HOME/jsvc \
                 -user $TOMCAT_USER \
                 -home $JAVA_HOME \
                 -Dcatalina.home=$CATALINA_HOME \
                 -Djava.io.tmpdir=$TMP_DIR \
                 -Dfile.encoding=ISO-8859-1 \
                 -pidfile $PID_FILE \
                 -outfile $CATALINA_HOME/logs/catalina.out \
                 -errfile $CATALINA_HOME/logs/catalina.err \
                 -cp $CLASSPATH \
                org.apache.catalina.startup.Bootstrap

                echo "Tomcat started OK."
                exit $?;;

        stop)

                echo "Stopping Tomcat..."
                jsvc \
                        -stop \
                        -pidfile $PID_FILE \
                        org.apache.catalina.startup.Bootstrap

                echo "Tomcat stopped"
                exit $?;;
esac
}}}</summary>
    <dc:creator>Cesar Capillas</dc:creator>
    <dc:date>2009-03-12T16:07:05Z</dc:date>
  </entry>
  <entry>
    <title>TomcatNativeLib 1.2</title>
    <link rel="alternate" href="http://www.zylk.net/web/guest/web-2-0/wiki?p_p_id=36&amp;p_p_lifecycle=0&amp;p_r_p_185834411_nodeId=12323&amp;p_r_p_185834411_title=&amp;TomcatNativeLib" />
    <author>
      <name>Cesar Capillas</name>
    </author>
    <id>http://www.zylk.net/web/guest/web-2-0/wiki?p_p_id=36&amp;p_p_lifecycle=0&amp;p_r_p_185834411_nodeId=12323&amp;p_r_p_185834411_title=&amp;TomcatNativeLib</id>
    <updated>2009-03-10T15:27:17Z</updated>
    <published>2009-03-10T15:27:17Z</published>
    <summary type="html">== Librerías nativas de Tomcat ==

Cuando inicias el Tomcat es usual ver una traza de info en el {{{catalina.out}}} tal que:

{{{
INFO: The Apache Tomcat Native library which allows optimal performance in production 
environments was not found on the java.library.path: 
}}}

Tomcat puede usar Apache Portable Runtime para proporcionar una escabilidad superior, rendimiento y mejor integración con las tecnologías nativas de servidor.

En primer lugar instalamos dos librerías dev:

{{{
$ sudo aptitude install libapr1-dev libssl-dev
}}}

Y nos descargamos el tomcat-native de la página de Tomcat.

http://tomcat.apache.org/download-native.cgi

{{{
$ cd /usr/local
$ tar -zxvf tomcat-native-1.1.16-src.tgz
$ cd tomcat-native-1.1.16-src/jni/native

$ ./configure --with-apr=/usr/bin/apr-1-config \
                  --with-java-home=/usr/lib/jvm/java-6-sun/ \
                  --with-ssl=yes --prefix=/usr/local/tomcat/

$ make
$ sudo make install
}}}

Las librerías se instalan en {{{/usr/local/tomcat/lib}}}, y hay que incluirlas en el {{{$LD_LIBRARY_PATH}}} y en el script de inicio.

Ademas en Ubuntu hay que desactivar IPV6:

{{{
$ sudo vim /etc/modprobe.d/aliases

#alias net-pf-10 ipv6
alias net-pf-10 off

}}}

Por último, hay que configurar un conector que utilice el protocolo de HTTP pero de las APR:
{{{
&lt;Connector port="8080"
           protocol="org.apache.coyote.http11.Http11AprProtocol"
           disableUploadTimeout="false"
           maxThreads="150" connectionTimeout="20000"
           redirectPort="8443" /&gt;
}}}

Y reiniciar la maquina para que coja los alias de net-pf-10.</summary>
    <dc:creator>Cesar Capillas</dc:creator>
    <dc:date>2009-03-10T15:27:17Z</dc:date>
  </entry>
  <entry>
    <title>TomcatPool 2.1 (minor-edit)</title>
    <link rel="alternate" href="http://www.zylk.net/web/guest/web-2-0/wiki?p_p_id=36&amp;p_p_lifecycle=0&amp;p_r_p_185834411_nodeId=12323&amp;p_r_p_185834411_title=&amp;TomcatPool" />
    <author>
      <name>Cesar Capillas</name>
    </author>
    <id>http://www.zylk.net/web/guest/web-2-0/wiki?p_p_id=36&amp;p_p_lifecycle=0&amp;p_r_p_185834411_nodeId=12323&amp;p_r_p_185834411_title=&amp;TomcatPool</id>
    <updated>2009-03-05T12:05:28Z</updated>
    <published>2009-03-05T12:05:28Z</published>
    <summary type="html">En primer lugar, necesitamos un conector para mysql que puede descargarse:

http://dev.mysql.com/downloads/connector/j/5.1.html

Descomprimimos y lo copiamos en {{{common/lib}}}
{{{
$ cp mysql-connector-java-5.1.6-bin.jar /usr/local/tomcat/common/lib/
}}}

y reiniciamos el servidor Tomcat.

Para el ejemplo de pool de conexiones necesitamos instalar {{{mysql-server-5.0}}}:

{{{
$ aptitude install mysql-server-5.0
}}}

El usuario en el ejemplo va a ser {{{root}}} y no va a tener contraseña.

Creamos el esquema {{{authority}}} con las siguientes tablas:

{{{
$ vim users.sql

CREATE TABLE users (
  username         varchar(15) NOT NULL PRIMARY KEY,
  password         varchar(15) NOT NULL
);

CREATE TABLE user_roles (
  username          varchar(15) NOT NULL,
  role              varchar(15) NOT NULL,
  PRIMARY KEY (username, role)
);

}}}

Importamos la tabla:

{{{
$ mysql -u root
&gt; create database authority;
&gt; use authority;
&gt; source users.sql
&gt; insert into user_roles (username,role) values ('tomcat', 'tomcat');
&gt; insert into user_roles (username,role) values ('tomcat', 'manager');
&gt; insert into user_roles (username,role) values ('tomcat', 'admin');
}}}


Creamos un archivo de contexto en {{{conf/Catalina/localhost/}}} y definimos el recurso que utiliza el driver de conexión a una base de datos mysql.

{{{
$ cd conf/Catalina/localhost/
$ vim test-pool.xml
&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;Context&gt;
  &lt;Resource name="jdbc/authority"
            auth="Container"
            type="javax.sql.DataSource"
            driverClassName="com.mysql.jdbc.Driver"
            url="jdbc:mysql://localhost:3306/authority?autoReconnect=true"
            username="root"
            password=""
            maxActive="100"
            maxIdle="30"
            maxWait="10000"
    /&gt;
&lt;/Context&gt;
}}}

Creamos el archivo {{{WEB-INF/web.xml}}} dentro de la carpeta {{{webapps/test-pool}}}
{{{
$ cd webapps
$ mkdir -p test-pool/WEB-INF
$ vim WEB-INF/web.xml

&lt;web-app xmlns="http ://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http ://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http ://java.sun.com/xml/ns/j2ee 
 http ://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4"&gt;
  &lt;description&gt;MySQL Test App&lt;/description&gt;
  &lt;resource-ref&gt;
      &lt;description&gt;DB Connection&lt;/description&gt;
      &lt;res-ref-name&gt;jdbc/authority&lt;/res-ref-name&gt;
      &lt;res-type&gt;javax.sql.DataSource&lt;/res-type&gt;
      &lt;res-auth&gt;Container&lt;/res-auth&gt;
  &lt;/resource-ref&gt;
&lt;/web-app&gt;
}}}


Y finalmente, una prueba de concepto de un JSP que realiza una select en el pool definido:

{{{
$ vim test-pool/test.jsp

&lt;%@ taglib uri="http ://java.sun.com/jsp/jstl/sql" prefix="sql" %&gt;
&lt;%@ taglib uri="http ://java.sun.com/jsp/jstl/core" prefix="c" %&gt;

&lt;sql:query var="rs" dataSource="jdbc/authority"&gt;
select username, role from user_roles
&lt;/sql:query&gt;

&lt;html&gt;
  &lt;head&gt;
    &lt;title&gt;DB Test&lt;/title&gt;
  &lt;/head&gt;
  &lt;body&gt;
  &lt;h2&gt;Usuarios y roles&lt;/h2&gt;
  &lt;table border="1"&gt;
  &lt;tr&gt;
      &lt;th&gt;Usuario&lt;/th&gt;&lt;th&gt;Rol&lt;/th&gt;
  &lt;/tr&gt;
&lt;c:forEach var="row" items="${rs.rows}"&gt;
    &lt;tr&gt;
      &lt;td&gt;${row.username}&lt;/td&gt;&lt;td&gt;${row.role}&lt;/td&gt;
    &lt;/tr&gt;
&lt;/c:forEach&gt;
  &lt;/table&gt;

&lt;/html&gt;
}}}

Es necesario instalar además la versión 1.1.x de las librerías {{{jstl.jar}}} y {{{standard.jar}}} en el directorio {{{WEB-INF/lib}}} (Jakarta Taglib Standard 1.1)

http://jakarta.apache.org/site/downloads/downloads_taglibs-standard.cgi</summary>
    <dc:creator>Cesar Capillas</dc:creator>
    <dc:date>2009-03-05T12:05:28Z</dc:date>
  </entry>
</feed>

