<?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>Lapiz Corto &#187; Vicente</title>
	<atom:link href="http://www.lapizcorto.com/author/vicente/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.lapizcorto.com</link>
	<description>Para esas soluciones que nunca recuerdas</description>
	<lastBuildDate>Mon, 14 Dec 2015 08:34:34 +0000</lastBuildDate>
	<language>es-ES</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.9.1</generator>
	<item>
		<title>Corrección de permisos recursivamente mediante PHP</title>
		<link>http://www.lapizcorto.com/correccion-de-permisos-recursivamente-mediante-php/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=correccion-de-permisos-recursivamente-mediante-php</link>
		<comments>http://www.lapizcorto.com/correccion-de-permisos-recursivamente-mediante-php/#comments</comments>
		<pubDate>Fri, 01 Feb 2013 12:08:33 +0000</pubDate>
		<dc:creator><![CDATA[Vicente]]></dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Servidores]]></category>
		<category><![CDATA[permisos]]></category>
		<category><![CDATA[suPHP]]></category>

		<guid isPermaLink="false">http://www.lapizcorto.com/?p=840</guid>
		<description><![CDATA[A la hora de realizar una mudanza de servidor es posible encontrarse con problemas de permisos que impidan descargar todo el contenido de una web mediante FTP. Por lo general estos problemas son ocasionados cuando hay un administrador de ficheros integrado en la web y el servidor está configurado con PHP estándar, sin el módulo [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>A la hora de realizar una mudanza de servidor es posible encontrarse con problemas de permisos que impidan descargar todo el contenido de una web mediante FTP. Por lo general estos problemas son ocasionados cuando hay un administrador de ficheros integrado en la web y el servidor está configurado con PHP estándar, sin el módulo <a href="http://www.suphp.org" target="_blank" title="suPHP">suPHP</a>. En estos casos, todo fichero generado mediante un script tendrá como dueño <code>apache</code>, y con los permisos <code>600</code>, por lo que no podrá ser descargado mediante FTP.</p>
<p>Para solucionarlo, utilizamos el siguiente fichero PHP:<br />
<span id="more-840"></span></p>
<pre class="brush: php; title: ; notranslate">
&lt;?php

  function fsmodify($obj) {
       $chunks = explode('/', $obj);
       chmod($obj, is_dir($obj) ? 0755 : 0644);
       chown($obj, $chunks[2]);
       chgrp($obj, $chunks[2]);
    }


    function fsmodifyr($dir) 
    {
       if($objs = glob($dir.&quot;/*&quot;)) {        
           foreach($objs as $obj) {
               fsmodify($obj);
               if(is_dir($obj)) fsmodifyr($obj);
           }
       }

       return fsmodify($dir);
    }   

  fsmodifyr('web');

?&gt;
</pre>
<p>Este fichero modificará recursivamente los permisos de todos los ficheros y carpetas dentro de <code>web</code>, de forma que serán descargables por cualquier usuario, incluido el que tenga acceso FTP.</p>
<p>Gracias a <a href="http://stackoverflow.com/users/742249" title="Felipe Alcacibar" target="_blank">Felipe Alcacibar</a> por su <a href="http://stackoverflow.com/a/7261673" title="Stack Overflow" target="_blank">solución en Stack Overflow</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lapizcorto.com/correccion-de-permisos-recursivamente-mediante-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Migración de Plesk para Windows a Plesk para Linux</title>
		<link>http://www.lapizcorto.com/migracion-de-plesk-para-windows-a-plesk-para-linux/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=migracion-de-plesk-para-windows-a-plesk-para-linux</link>
		<comments>http://www.lapizcorto.com/migracion-de-plesk-para-windows-a-plesk-para-linux/#comments</comments>
		<pubDate>Mon, 07 Jan 2013 09:00:06 +0000</pubDate>
		<dc:creator><![CDATA[Vicente]]></dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Plesk]]></category>
		<category><![CDATA[Servidores]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[mailenable]]></category>
		<category><![CDATA[migración]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[sql]]></category>
		<category><![CDATA[windows]]></category>

		<guid isPermaLink="false">http://www.lapizcorto.com/?p=218</guid>
		<description><![CDATA[En las últimas versiones de Plesk, Parallels ha incluido una herramienta estupenda que permite realizar migraciones entre servidores Linux, o servidores Windows, e incluso de un servidor Linux a un servidor Windows, utilizando internamente ssh y rsync para realizar el transporte de datos, pero no da la posibilidad de realizar una migración automatizada de Windows [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>En las últimas versiones de Plesk, Parallels ha incluido una herramienta estupenda que permite realizar migraciones entre servidores Linux, o servidores Windows, e incluso de un servidor Linux a un servidor Windows, utilizando internamente ssh y rsync para realizar el transporte de datos, pero no da la posibilidad de realizar una migración automatizada de Windows a Linux, así que para este caso no ha quedado más remedio que recurrir a procedimientos más artesanales.</p>
<p>El plan consiste básicamente en realizar consultas SQL a la base de datos de Plesk para Windows, a partir de las cuáles se pueda obtener una serie de scripts que utilicen los comandos CLI provistos por Plesk. Una vez replicada la estructura de clientes y dominios, ya se comienza a pasar los datos, vía FTP, del código de las webs, y mediante exports de MySQL para las bases de datos. Para el correo se creó una utilidad en Python que analizaba el fichero AUTH.TAB de <a title="MailEnable" href="http://www.mailenable.com/" target="_blank">MailEnable</a>, generando un script que crea los buzones en Plesk, y después invoca a <a href="http://freecode.com/projects/imapsync" target="_blank">imapsync</a> para copiar el contenido de los mismos.<br />
<span id="more-218"></span></p>
<h4>Estructura de dominios en Plesk</h4>
<p>Comenzamos generando la estructura de revendedores, clientes y dominios en el servidor destino, creando una serie de comandos para el CLI de Plesk, ejecutando comandos SQL en el servidor origen:</p>
<p>SQL que genera los revendedores:</p>
<pre class="brush: sql; title: ; notranslate">
SELECT &quot;reseller -c &quot; + cl.login +
&quot; -name &quot;&quot;&quot; + cl.pname + &quot;&quot;&quot;&quot; +
&quot; -passwd &quot; + cl.passwd +
&quot; -company &quot;&quot;&quot; + cl.cname + &quot;&quot;&quot;&quot; +
&quot; -phone &quot;&quot;&quot; + cl.phone + &quot;&quot;&quot;&quot; +
&quot; -email &quot;&quot;&quot; + cl.email + &quot;&quot;&quot;&quot; +
&quot; -address &quot;&quot;&quot; + cl.address + &quot;&quot;&quot;&quot; +
&quot; -city &quot;&quot;&quot; + cl.city + &quot;&quot;&quot;&quot; +
&quot; -zip &quot;&quot;&quot; + cl.pcode + &quot;&quot;&quot;&quot; +
&quot; -country &quot;&quot;&quot; + cl.country + &quot;&quot;&quot;&quot; +
&quot; -creation-date &quot;&quot;&quot; + FORMAT(cl.cr_date,&quot;YYYY-MM-DD&quot;) + &quot;&quot;&quot;&quot;
FROM clients cl
WHERE type = &quot;reseller&quot;
</pre>
<p>SQL que genera un script para la creación de clientes, obviando los suscriptores, que ya tienen su cuenta del paso anterior:</p>
<pre class="brush: sql; title: ; notranslate">
SELECT &quot;customer -c &quot; + cl.login +
&quot; -name &quot;&quot;&quot; + cl.pname + &quot;&quot;&quot;&quot; +
&quot; -passwd &quot; + cl.passwd +
&quot; -company &quot;&quot;&quot; + cl.cname + &quot;&quot;&quot;&quot; +
&quot; -phone &quot;&quot;&quot; + cl.phone + &quot;&quot;&quot;&quot; +
&quot; -email &quot;&quot;&quot; + cl.email + &quot;&quot;&quot;&quot; +
&quot; -address &quot;&quot;&quot; + cl.address + &quot;&quot;&quot;&quot; +
&quot; -city &quot;&quot;&quot; + cl.city + &quot;&quot;&quot;&quot; +
&quot; -zip &quot;&quot;&quot; + cl.pcode + &quot;&quot;&quot;&quot; +
&quot; -country &quot;&quot;&quot; + cl.country + &quot;&quot;&quot;&quot; +
&quot; -creation-date &quot;&quot;&quot; + FORMAT(cl.cr_date,&quot;YYYY-MM-DD&quot;) + &quot;&quot;&quot;&quot; +
&quot; -owner &quot;&quot;&quot; + res.login + &quot;&quot;&quot;&quot;
FROM clients cl
LEFT JOIN clients res ON (res.id = cl.parent_id)
  WHERE type &amp;lt;&amp;gt; &quot;reseller&quot;
</pre>
<p>En este punto, nosotros reemplazamos el owner &#8220;admin&#8221; por nuestra empresa, para que nada dependiese del usuario raíz, ya que según la nueva estructura de Plesk 10, parece más correcto.</p>
<p>Por último, el SQL que genera un script para la creación de suscripciones a partir de los dominios de Plesk 9. Los dominios los crea con el DNS desactivado, dado que seguiremos manejando el servicio DNS con el otro servidor, y a la IP compartida (que está, claramente, modificada). También el login utiliza sólo minúsculas, ya que se ha introducido esta restricción en Plesk 10.</p>
<pre class="brush: sql; title: ; notranslate">
SELECT &quot;domain -c &quot; + dom.name +
&quot; -owner &quot;&quot;&quot; + cl.login + &quot;&quot;&quot;&quot; +
&quot; -dns false&quot; +
&quot; -hosting true &quot; +
&quot; -ip 192.168.0.164 &quot; +
&quot; -login &quot;&quot;&quot; + LCASE(hos.fp_adm) + &quot;&quot;&quot;&quot; +
&quot; -passwd &quot;&quot;&quot; + hos.fp_pass + &quot;&quot;&quot;&quot; +
&quot; -creation-date &quot;&quot;&quot; + FORMAT(dom.cr_date,&quot;YYYY-MM-DD&quot;) + &quot;&quot;&quot;&quot;
FROM (domains dom
LEFT JOIN clients cl ON (cl.id = dom.cl_id))
LEFT JOIN hosting hos ON (hos.dom_id = dom.id)
</pre>
<p>Puntos mejorables:</p>
<ul>
<li>Hay que revisar los DNS a mano. Hemos preferido hacerlo así, para hacer limpieza, pero tampoco sería complejo realizar un script similar a los mostrados, y marcar las suscripciones con el servicio DNS activado por defecto, de forma que sólo quedase pendiente realizar la modificación en el dominio.</li>
<li>Las redirecciones de correo y demás opciones específicas deben ser revisadas, ya que el script únicamente ignora las cuentas que estén desactivadas en MailEnable, pero nada más.</li>
<li>Todas las suscripciones pasan como hosting, así que las que son redirecciones o simplemente sin hosting no pasan mediante el script. Esto es debido a que se hace un JOIN con la tabla hosting de Plesk 9.</li>
<li>Las suscripciones y revendedores pasan con un plan personalizado. En nuestro caso nos da igual, porque vamos a aprovechar para repasar todos los clientes y revisar así usos y precios.</li>
</ul>
<h4>Correo electrónico</h4>
<p>Bien, tras esto ya tenemos los revendedores, clientes, suscripciones y dominios en Plesk 10. A continuación presentamos una pequeña utilidad en Python que genera dos ficheros, uno que permite la creación de los buzones en Plesk, y otro que sincroniza los correos entre los dos servidores mediante IMAP, creando la estructura de carpetas existente en el antiguo.</p>
<pre class="brush: python; title: ; notranslate">
# This Python file uses the following encoding: utf-8
'''
me2plesk: Utilidad para la transformación de AUTH.TAB en scripts Plesk 10 e imapsync
Created on 13/10/2011
@author: Vicente Monroig (Digital Disseny)
'''

import os
import sys

def parse_authtab(fichero):
    '''Abre el fichero AUTH.TAB, lo parsea y devuelve una lista con los buzones y contraseñas.'''
    print &quot;Procesando fichero AUTH.TAB &quot; + fichero + &quot;...&quot;
    f = open(fichero, &quot;r&quot;)
    lista = []
    while True:
        lin = f.readline().strip()
        if not lin: break
        campos = lin.split('\t')
        # Ignoramos los que estén desactivados
        if campos[1] &lt;&gt; 1:
            lista.append([campos[0], campos[2]])
    f.close()
    return lista

# Obtenemos la ruta donde se está ejecutando el archivo
ruta = os.path.dirname(os.path.abspath(__file__)) + '/'
# Recogemos el parámetro donde está el AUTH.TAB o mostramos la ayuda
if (len(sys.argv) &gt; 1):
    # Extraemos los pares correo, contraseña
    lista = parse_authtab(sys.argv[1])
    print(&quot;Generando scripts...&quot;)
    # Creamos los archivos de script
    fplesk = open(ruta + 'me2plesk_plesk.txt', &quot;w&quot;)
    fsync = open(ruta + 'me2plesk_imapsync.txt', &quot;w&quot;)
    for elemento in lista:
        # Creamos una nueva línea en ambos scripts
        fplesk.write(&quot;/opt/psa/bin/mail --create &quot; + elemento[0] + &quot; -passwd &quot; + elemento[1] +
                     &quot; -mailbox true\n&quot;)
        fsync.write(&quot;imapsync --host1 origen.com&quot; +
                    &quot; --user1 &quot; + elemento[0] + &quot; --password1 &quot; + elemento[1] +
                    &quot; --host2 destino.com&quot; +
                    &quot; --user2 &quot; + elemento[0] + &quot; --password2 &quot; + elemento[1] +
                    &quot; --sep1 / --prefix1 &quot;&quot;  --subscribe --fastio1 --fastio2 --fast\n&quot;)
    fplesk.close()
    fsync.close()
    print(&quot;Scripts me2plesk_plesk.txt y me2plesk_imapsync.txt generados en %s.&quot; % ruta)
else:
    print &quot;&quot;&quot;
Información:
    me2plesk es una pequeña utilidad que analiza sintácticamente el fichero AUTH.TAB del
    servidor de correo MailEnable para Windows, generando dos scripts, uno que llama a la
    función mail del CLI de Plesk 10, creando los buzones encontrados, y un segundo que
    invoca a la utilidad imapsync, una vez por cada buzón, permitiendo con la combinación
    de ambos la mudanza de un servidor MailEnable Windows a un Plesk 10.
Uso:
    me2plesk.py &lt;AUTH.TAB&gt;
       &quot;&quot;&quot;
</pre>
<p>Además, como algunos ISPs son algo lentos cambiando los registros DNS, tenemos la ventaja de que no perderemos ningún correo, al poder ejecutar la sincronización varias veces, incluso con los DNS ya cambiados y propagados.</p>
<p>Una pega: Aquellos clientes que mantengan correo en el servidor y utilicen POP3 como protocolo, verán sus correos duplicados en los clientes. Sin embargo, los que utilicen IMAP no tendrán este problema, dado que <a title="imapsync" href="http://freecode.com/projects/imapsync" target="_blank">imapsync</a>, la utilidad llamada por el script para sincronizar los buzones, respeta las <em>flags</em> de cada mensaje.</p>
<h4>Webs (código y bases de datos)</h4>
<p>Para pasar el código de las webs utilizaremos FTP, y más concretamente <a title="LFTP" href="http://lftp.yar.ru/" target="_blank">LFTP</a>, que incorpora un comando mirror que nos va a permitir realizar todo el traspaso en una única línea de comandos ejecutada en el servidor destino:</p>
<pre class="brush: bash; light: true; title: ; notranslate">
lftp -e &quot;mirror httpdocs /var/www/vhosts/&lt;dominio&gt;/httpdocs --parallel=10&quot; -u &lt;usuario&gt;,&lt;contraseña&gt; &lt;servidor_fuente&gt;
</pre>
<p>Quedaría ajustar los permisos y propietario de los distintos archivos. Podemos poner unos estándar para Plesk y después repasar lo que necesite permisos de escritura, como carpetas para ficheros temporales.</p>
<pre class="brush: bash; light: true; title: ; notranslate">
chown -R &lt;usuarioplesk&gt;:psacln /var/www/vhosts/&lt;dominio&gt;/httpdocs/*
find /var/www/vhosts/&lt;dominio&gt;/httpdocs/* -type d -exec chmod 755 {} \;
find /var/www/vhosts/&lt;dominio&gt;/httpdocs/* -type f -exec chmod 644 {} \;
</pre>
<p style="text-align: center;"><a href="http://www.lapizcorto.com/wp-content/uploads/2012/02/export_sql.png"><img class="aligncenter size-full wp-image-474" title="HeidiSQL Export" src="http://www.lapizcorto.com/wp-content/uploads/2012/02/export_sql.png" alt="" width="606" height="328" /></a></p>
<p>Vamos a por las bases de datos. Nos centraremos en MySQL, que son las que nos vamos a encontrar en su mayoría (WordPress, Joomla, Magento, Drupal&#8230;). Aprovechando que todavía tenemos un servidor Windows, podemos utilizar HeidiSQL para realizar una copia de seguridad, y si configuramos debidamente el servidor destino para aceptar conexiones externas, también podremos utilizarlo para restaurar, todo desde el mismo servidor origen.</p>
<h4>DNS</h4>
<p>Ya están la estructura de usuarios recreada, correos pasados, código fuente transferido y bases de datos restauradas. Tan sólo queda modificar los DNS de los dominios para que dirijan al nuevo servidor.</p>
<p>Como último apunte, antes de comenzar con los cambios de IPs en los DNS es muy recomendable modificar los registros SOA, indicando un TTL de 5 minutos, con lo que podremos realizar modificaciones que se propaguen mucho más rápido. Por supuesto, esto conlleva un aumento del tráfico, pero con las máquinas y anchos de banda de hoy en día, no debería ser ningún problema.</p>
<p>Recordad también que el <a title="Archivo hosts" href="http://es.wikipedia.org/wiki/Archivo_hosts" target="_blank">archivo hosts</a> es nuestro amigo, y que es <span style="text-decoration: underline;">muy</span> conveniente realizar pruebas en el nuevo servidor antes de cambiar los DNS. Siempre podemos relanzar la sincronización de correos y volver a pasar la copia de seguridad de la base de datos cuando estemos seguros de que todo está operativo de nuevo.</p>
<h4>Organización</h4>
<p>Lo más crucial, lo más importante y lo único que no puede fallar durante el proceso es la organización. Sobre esto poco voy a decir, pues esto es un blog técnico, pero sí quiero remarcar que antes de empezar hay que planificar y dividir las tareas que van a tener que hacerse fuera de horario de oficina. Hay que comunicar a los clientes previamente lo que se va a hacer, y que les quede claro que puede haber problemas, y cuándo se va a hacer, no sea que les dé por liarse a actualizar su web justo cuando tenemos pensado ponernos a migrar sus servicios.</p>
<p><a href="http://www.lapizcorto.com/wp-content/uploads/2012/12/organizacion1.jpg"><img class="aligncenter size-full wp-image-824" title="Organización" src="http://www.lapizcorto.com/wp-content/uploads/2012/12/organizacion1.jpg" alt="Organización en hoja de cálculo" width="600" height="629" /></a></p>
<p>Prepara una hoja de cálculo, verifica y anota los servicios a trasladar, agrúpalos por similitud y anota los posibles problemas y su resolución. Como mínimo.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lapizcorto.com/migracion-de-plesk-para-windows-a-plesk-para-linux/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sincronización NTP de servidores Windows</title>
		<link>http://www.lapizcorto.com/sincronizacion-ntp-de-servidores-windows/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=sincronizacion-ntp-de-servidores-windows</link>
		<comments>http://www.lapizcorto.com/sincronizacion-ntp-de-servidores-windows/#comments</comments>
		<pubDate>Mon, 31 Dec 2012 09:03:34 +0000</pubDate>
		<dc:creator><![CDATA[Vicente]]></dc:creator>
				<category><![CDATA[Servidores]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://www.lapizcorto.com/?p=814</guid>
		<description><![CDATA[Para sincronizar cualquier equipo con sistema operativo Windows de escritorio (XP ó 7, principalmente), es tan simple como hacer doble click en la hora de la barra de tareas, ir a la pestaña Hora de Internet, y allí hacer los cambios que se desee. Sin embargo, esta pestaña no está disponible en los sistemas operativos [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Para sincronizar cualquier equipo con sistema operativo Windows de escritorio (XP ó 7, principalmente), es tan simple como hacer doble click en la hora de la barra de tareas, ir a la pestaña Hora de Internet, y allí hacer los cambios que se desee. Sin embargo, esta pestaña no está disponible en los sistemas operativos para servidores (comprobado en 2003 y 2008 R2), así que tenemos que recurrir al símbolo de sistema para lograrlo:</p>
<p>El servidor elegido se puede cambiar en el parámetro, por supuesto, pero así de paso veis cuál es el NTP que lleva la hora oficial en España, del <a title="Real Instituto y Observatorio de la Armada" href="http://www.armada.mde.es/ArmadaPortal/page/Portal/ArmadaEspannola/ciencia_observatorio" target="_blank">Real Instituto y Observatorio de la Armada</a>.</p>
<p><a href="http://www.lapizcorto.com/wp-content/uploads/2012/12/ntp.png"><img class="aligncenter size-full wp-image-815" title="Configuración NTP Windows" src="http://www.lapizcorto.com/wp-content/uploads/2012/12/ntp.png" alt="Configuración NTP Windows" width="668" height="307" /></a></p>
<p>Para no tener que teclear tanto, esta es la secuencia de comandos:</p>
<pre class="brush: plain; title: ; notranslate">
net stop w32time
net start w32time
w32tm /config /manualpeerlist:hora.roa.es,0x1 /syncfromflags:MANUAL
w32tm /config /update
w32tm /resync
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.lapizcorto.com/sincronizacion-ntp-de-servidores-windows/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Renombrar archivos masivamente</title>
		<link>http://www.lapizcorto.com/renombrar-archivos-masivamente/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=renombrar-archivos-masivamente</link>
		<comments>http://www.lapizcorto.com/renombrar-archivos-masivamente/#comments</comments>
		<pubDate>Thu, 08 Nov 2012 13:01:45 +0000</pubDate>
		<dc:creator><![CDATA[Vicente]]></dc:creator>
				<category><![CDATA[Utilidades]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://www.lapizcorto.com/?p=807</guid>
		<description><![CDATA[De vez en cuando suele surgir la problemática: en una colección de fotos, con documentos almacenados en la empresa, los trabajos de la carrera&#8230; Necesitamos ir organizándolos, y es posible que los tengamos ya organizados, pero en un momento dado preferimos cambiar algo de la organización. Ahí es donde podemos echar mano de Rename Expert, [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>De vez en cuando suele surgir la problemática: en una colección de fotos, con documentos almacenados en la empresa, los trabajos de la carrera&#8230; Necesitamos ir organizándolos, y es posible que los tengamos ya organizados, pero en un momento dado preferimos cambiar algo de la organización. Ahí es donde podemos echar mano de <a title="Rename Expert" href="http://www.rename-expert.com/en/features.html" target="_blank">Rename Expert</a>, la mejor aplicación con que me he cruzado para este fin.</p>
<p>Se puede realizar un filtrado por multitud de conceptos, tanto sobre el nombre y ruta del fichero como sobre el contenido. Por nombrar algunos:</p>
<ul>
<li>Longitud del nombre del fichero.</li>
<li>Ancho de la imagen contenida.</li>
<li>Datos de la cámara con que se realiza la fotografía.</li>
<li>Título de la canción según ID3.</li>
<li>Autor del texto del PDF.</li>
</ul>
<p><a href="http://www.lapizcorto.com/wp-content/uploads/2012/11/renamexpert.png"><img class="aligncenter size-large wp-image-808" title="Rename Expert" src="http://www.lapizcorto.com/wp-content/uploads/2012/11/renamexpert-1024x558.png" alt="" width="600" height="326" /></a></p>
<p>Después, para los ficheros que cumplan el filtro se pueden definir acciones que no se limitan a jugar con el nombre, como pueden ser:</p>
<ul>
<li>Mover el fichero.</li>
<li>Recuperar el nombre de una lista CSV.</li>
<li>Encriptación de los nombres de archivo por contraseña.</li>
</ul>
<p>En definitiva, tras probar unos cuantos, el mejor que he encontrado. Eso sí, sólo Windows.</p>
<p>Espera, ¿que no quieres pagar por el renombrador? Pues nada, hay una alternativa, pero no es tan estética e intuitiva: <a title="Bulk Rename Utility" href="http://www.bulkrenameutility.co.uk" target="_blank">Bulk Rename Utility</a>.</p>
<p><a href="http://www.lapizcorto.com/wp-content/uploads/2012/11/bulkrenameutility.png"><img class="aligncenter size-large wp-image-812" title="Bulk Rename Utility" src="http://www.lapizcorto.com/wp-content/uploads/2012/11/bulkrenameutility-1024x576.png" alt="" width="600" height="337" /></a></p>
<p>No me ha hecho falta, así que no he buscado mucho, pero creo que tampoco puede lidiar con MP3, JPG y PDF. Lo que sí hace perfectamente es trabajar con las longitudes de nombres y tratar la generación de duplicados.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lapizcorto.com/renombrar-archivos-masivamente/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Traducción de los mensajes de postfix</title>
		<link>http://www.lapizcorto.com/traduccion-de-los-mensajes-de-postfix/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=traduccion-de-los-mensajes-de-postfix</link>
		<comments>http://www.lapizcorto.com/traduccion-de-los-mensajes-de-postfix/#comments</comments>
		<pubDate>Fri, 17 Feb 2012 17:46:04 +0000</pubDate>
		<dc:creator><![CDATA[Vicente]]></dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Servidores]]></category>

		<guid isPermaLink="false">http://www.lapizcorto.com/?p=479</guid>
		<description><![CDATA[Si estás leyendo esto posiblemente sepas inglés, y quizá también seas administrador de algún sistema de correo. Aunque no lo seas, convendrás en que no todos los usuarios de un servidor de correo tienen por qué saber idiomas, así que cuando reciben un mensaje de un tal MAILER-DAEMON, lo primero que hacen es pensar que [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Si estás leyendo esto posiblemente sepas inglés, y quizá también seas administrador de algún sistema de correo. Aunque no lo seas, convendrás en que no todos los usuarios de un servidor de correo tienen por qué saber idiomas, así que cuando reciben un mensaje de un tal <em>MAILER-DAEMON</em>, lo primero que hacen es pensar que hay un error en el sistema y llamar directamente al informático, aunque el mensaje sea una confirmación de entrega con un gran <em>successful</em> en el asunto. Es por esto que conviene traducir estos mensajes, o mejor aun mantener el inglés pero añadir el castellano en ellos. Esto se puede hacer fácilmente en <a title="postfix" href="http://www.postfix.org/" target="_blank">postfix</a>, utilizando un fichero de plantilla, siguiendo estos pasos:</p>
<p>Primero averiguamos dónde está la configuración de postfix y el fichero de plantilla:</p>
<pre class="brush: bash; light: true; title: ; notranslate">
postconf -n | grep config_directory
postconf -n | grep bounce_template_file
</pre>
<p>Si ya tenemos un fichero de plantilla, simplemente sustituimos el contenido por el que adjuntamos poco después. Si no lo tenemos configurado, modificamos el fichero <code>main.cf</code>, añadiendo una línea:</p>
<pre class="brush: plain; light: true; title: ; notranslate">
bounce_template_file = /etc/postfix/bounce.es-ES.cf
</pre>
<p>Y creando el fichero <code>/etc/postfix/bounce.es-ES.cf</code>, con el siguiente contenido:</p>
<pre class="brush: plain; light: true; title: ; notranslate">
#
# The failure template is used when mail is returned to the sender;
# either the destination rejected the message, or the destination
# could not be reached before the message expired in the queue.
#

failure_template = &lt;&lt;EOF
Charset: utf-8
From: MAILER-DAEMON (Sistema de entrega de correo)
Subject: Servidor de correo: Mensaje no entregado
Postmaster-Subject: Servidor de correo: Mensaje no entregado

Este es un mensaje de correo enviado automáticamente por el servidor de
correo $myhostname.

No ha sido posible entregar su mensaje a uno o más destinatarios. El
mensaje que causó el error está adjunto a este mensaje.

Para más información o cualquier duda, por favor, envíe un mensaje al
administrador del sistema en &lt;postmaster&gt;.

En tal caso incluya adjunto este mensaje de informe. Puede eliminar el
texto del mensaje original que considere, aunque le recomendamos que
mantenga intacto el texto de este informe.

-------------------------------------------------------------------------------

This is the mail system at host $myhostname.

I'm sorry to have to inform you that your message could not
be delivered to one or more recipients. It's attached below.

For further assistance, please send mail to &lt;postmaster&gt;

If you do so, please include this problem report. You can
delete your own text from the attached returned message.

                   The mail system
EOF

#
# The delay template is used when mail is delayed. Note a neat trick:
# the default template displays the delay_warning_time value as hours
# by appending the _hours suffix to the parameter name; it displays
# the maximal_queue_lifetime value as days by appending the _days
# suffix.
#
# Other suffixes are: _seconds, _minutes, _weeks. There are no other
# main.cf parameters that have this special behavior.
#
# You need to adjust these suffixes (and the surrounding text) if
# you have very different settings for these time parameters.
#

delay_template = &lt;&lt;EOF
Charset: utf-8
From: MAILER-DAEMON (Sistema de entrega de correo)
Subject: Servidor de correo: Mensaje pospuesto
Postmaster-Subject: Servidor de correo: Mensaje pospuesto

Este es un mensaje de correo enviado automáticamente por el servidor de
correo $myhostname.

###########################################
# ÉSTE ES SÓLO UN MENSAJE DE AVISO.       #
# NO ES NECESARIO QUE REENVÍE EL MENSAJE. #
###########################################

Su mensaje no pudo ser entregado al destinatario después de intentarlo
durante $delay_warning_time_hours hora(s).
Se seguirá intentando enviar el mensaje hasta que pasen
$maximal_queue_lifetime_days días.

Para más información o cualquier duda, por favor, envíe un mensaje al
administrador del sistema en &lt;postmaster&gt;.

En tal caso incluya adjunto este mensaje de informe. Puede eliminar el
texto del mensaje original que considere, aunque le recomendamos que
mantenga intacto el texto de este informe.

-------------------------------------------------------------------------------

This is the mail system at host $myhostname.

####################################################################
# THIS IS A WARNING ONLY.  YOU DO NOT NEED TO RESEND YOUR MESSAGE. #
####################################################################

Your message could not be delivered for $delay_warning_time_hours hour(s).
It will be retried until it is $maximal_queue_lifetime_days day(s) old.

For further assistance, please send mail to &lt;postmaster&gt;

If you do so, please include this problem report. You can
delete your own text from the attached returned message.

                   The $mail_name program
EOF

#
# The success template is used when mail is delivered to mailbox,
# when an alias or list is expanded, or when mail is delivered to a
# system that does not announce DSN support. It is an error to specify
# a Postmaster-Subject: here.
#

success_template = &lt;&lt;EOF
Charset: utf-8
From: MAILER-DAEMON (Sistema de entrega de correo)
Subject: Servidor de correo: Informe de entrega correcta de mensaje

Este es un mensaje de correo enviado automáticamente por el servidor de
correo $myhostname.

Su mensaje fue entregado correctamente al/a los destinatario/s indicados a
continuación. Si el mensaje fue entregado directamente a los destinatarios,
no recibirá más notificaciones; en caso contrario, si el mensaje tuviera que
pasar por más servidores de correo, es posible que reciba más notificaciones
de estos servidores.

-------------------------------------------------------------------------------

This is the mail system at host $myhostname.

Your message was successfully delivered to the destination(s)
listed below. If the message was delivered to mailbox you will
receive no further notifications. Otherwise you may still receive
notifications of mail delivery errors from other systems.

                   The mail system
EOF

#
# The verify template is used for address verification (sendmail -bv
# address...). or for verbose mail delivery (sendmail -v address...).
# It is an error to specify a Postmaster-Subject: here.
#

verify_template = &lt;&lt;EOF
Charset: utf-8
From: MAILER-DAEMON (Sistema de entrega de correo)
Subject: Servidor de correo: Informe de estado de entrega de mensaje

Este es un mensaje de correo enviado automáticamente por el servidor de
correo $myhostname.

Adjunto a este mensaje se encuentra el informe de entrega solicitado.

-------------------------------------------------------------------------------

This is the mail system at host $myhostname.

Enclosed is the mail delivery report that you requested.

                   The mail system
EOF

</pre>
<p>Como dato extra, es posible que también quieras modificar el remitente de dichos correos, que suele ser <code>MAILER-DAEMON@hostname</code>. Esto, como bien se apunta <a title="Configuración de aplicaciones de red en Debian" href="http://www.debian.org/doc/manuals/debian-reference/ch06.en.html#_the_mail_address_configuration" target="_blank">aquí</a>, se soluciona modificando el fichero <code>/etc/mailname</code> en sistemas <a title="Debian" href="http://www.debian.org/index.es.html" target="_blank">Debian</a>, como <a title="Ubuntu" href="http://www.ubuntu.com/" target="_blank">Ubuntu</a>.</p>
<p>Por último, recargamos la configuración de postfix para que sea efectivo el cambio:</p>
<pre class="brush: bash; light: true; title: ; notranslate">
postfix reload
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.lapizcorto.com/traduccion-de-los-mensajes-de-postfix/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Conexión fácil de IIS con Tomcat</title>
		<link>http://www.lapizcorto.com/conexion-facil-de-iis-con-tomcat/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=conexion-facil-de-iis-con-tomcat</link>
		<comments>http://www.lapizcorto.com/conexion-facil-de-iis-con-tomcat/#comments</comments>
		<pubDate>Thu, 09 Feb 2012 18:47:37 +0000</pubDate>
		<dc:creator><![CDATA[Vicente]]></dc:creator>
				<category><![CDATA[Tomcat]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[BonCode]]></category>
		<category><![CDATA[conector]]></category>
		<category><![CDATA[IIS]]></category>

		<guid isPermaLink="false">http://www.lapizcorto.com/?p=446</guid>
		<description><![CDATA[Si se quieren procesar páginas JSP y ASP.NET en un mismo servidor no queda más remedio que tener instalados Tomcat e IIS simultáneamente. Si además queremos que las páginas se sirvan por el mismo puerto, que generalmente suele ser el 80, pues ya tenemos un problema. Existen conectores ISAPI que permiten reenviar las peticiones JSP [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Si se quieren procesar páginas JSP y ASP.NET en un mismo servidor no queda más remedio que tener instalados <a title="Tomcat" href="http://tomcat.apache.org/" target="_blank">Tomcat</a> e <a title="IIS" href="http://www.iis.net/" target="_blank">IIS</a> simultáneamente. Si además queremos que las páginas se sirvan por el mismo puerto, que generalmente suele ser el 80, pues ya tenemos un problema. Existen conectores ISAPI que permiten reenviar las peticiones JSP del IIS al Tomcat, como hace el Plesk 9 para Windows, pero siempre los he encontrado complejos de configurar. Sin embargo, en la última instalación de Windows Server 2008 R2 que hemos realizado, hemos encontrado un nuevo conector que simplifica enormemente el trabajo, permitiendo realizarlo en dos pasos.</p>
<p>Partiremos de una instalación funcional de IIS 7.5 en el puerto web estándar, y de Tomcat 7.0.25 en el puerto 8080 con AJP en el puerto 8009. Si no sabes cómo llegar a este punto, mal empezamos&#8230; <img src="http://www.lapizcorto.com/wp-includes/images/smilies/icon_razz.gif" alt=":P" class="wp-smiley" /> </p>
<p>Supondremos que la web JSP que queremos alojar está en</p>
<p><code>C:\inetpub\wwwroot\miwebaspxjsp.com\partejsp</code>. En tal caso, lo primero que haremos será hacer que Tomcat conozca dicho código, creando un fichero XML en <code>%CATALINA_HOME%\conf\Catalina\localhost</code>, con nombre <code>partejsp.xml</code>, y con el siguiente contenido:</p>
<pre class="brush: xml; light: true; title: ; notranslate">
&lt;Context
  displayName=&quot;partejsp&quot;
  docBase=&quot;C:\inetpub\wwwroot\miwebaspxjsp.com\partejsp&quot;
  path=&quot;/partejsp&quot;
  reloadable=&quot;true&quot;
/&gt;
</pre>
<p>Ahora vamos a la URL <code>http://miwebaspxjsp.com:8080/partejsp</code>, y deberíamos ver el contenido servido directamente por Tomcat correctamente. Si no es así, toca revisar las rutas y reiniciar el servicio Tomcat.</p>
<p>Sin embargo, si vamos a la <code>URL http://miwebaspxjsp.com/partejsp</code>, obtendremos un precioso error 404.3, ya que IIS no sabe cómo interpretar el script y además no nos permite descargarlo al no conocer el tipo MIME del fichero.</p>
<p style="text-align: center;"><a href="http://www.lapizcorto.com/wp-content/uploads/2012/02/BonCodeAJP.png"><img class="aligncenter size-full wp-image-448" title="Instalador BonCode AJP" src="http://www.lapizcorto.com/wp-content/uploads/2012/02/BonCodeAJP.png" alt="" width="402" height="310" /></a></p>
<p>Ahora la parte mágica: Descarga el proyecto <a title="IIS to Tomcat Connector" href="http://tomcatiis.riaforge.org/" target="_blank">IIS to Tomcat Connector</a> de <a title="BonCode" href="http://boncode.blogspot.com/" target="_blank">Bilal</a>. En él encontrarás un instalador que a partir de unos datos mínimos de configuración se encargará de registrarse en el IIS, pudiendo limitarse a los sitios que se le indique, de forma que no haya que configurar nada más que el nuevo documento por defecto <code>index.jsp</code>.</p>
<p>Tras la instalación, prueba de nuevo la URL <code>http://miwebaspxjsp.com/partejsp</code>, y si todo ha ido correctamente, ya se debería mostrar exactamente lo mismo que accediendo a <code>http://miwebaspxjsp.com:8080/partejsp</code>.</p>
<p>Como limitación, indicar que con este sistema siempre se cargaría la web JSP como subdirectorio, en la URL <code>http://www.miwebaspjsp.com/partejsp/</code>. Seguramente se podrá solucionar, pero como no lo hemos necesitado, no he investigado más.</p>
<h4>Actualización: Cómo hacerlo funcionar en el raíz y con servlets</h4>
<p>Para hacerlo funcionar en el raíz del dominio, podemos utilizar el módulo <a title="URL Rewrite" href="http://www.iis.net/download/urlrewrite" target="_blank">URL Rewrite</a> de IIS, similar al mod_rewrite de Apache, de forma que redirijamos todas las peticiones a una subcarpeta, y así no tenemos que pelear tanto con la configuración. También debemos preservar la ruta de la cookie, para evitar problemas con las sesiones, con una segunda regla. Quedaría en web.config más o menos así:</p>
<pre class="brush: xml; light: true; title: ; notranslate">
        &lt;rewrite&gt;
            &lt;rules&gt;
                &lt;rule name=&quot;Reescribimos a subcarpeta&quot; enabled=&quot;true&quot;&gt;
                    &lt;match url=&quot;^(.*)&quot; /&gt;
                    &lt;action type=&quot;Rewrite&quot; url=&quot;carpetaconjsp/{R:1}&quot; /&gt;
                &lt;/rule&gt;
            &lt;/rules&gt;
            &lt;outboundRules&gt;
                &lt;rule name=&quot;Reescribimos la ruta de la cookie de sesión&quot;&gt;
                    &lt;match serverVariable=&quot;RESPONSE_Set_Cookie&quot; pattern=&quot;^(.*); Path=/carpetaconjsp(.*)&quot; /&gt;
                    &lt;action type=&quot;Rewrite&quot; value=&quot;{R:1}; Path={R:2}&quot; /&gt;
                &lt;/rule&gt;
            &lt;/outboundRules&gt;
        &lt;/rewrite&gt;
</pre>
<p>Igualmente, si utilizamos servlets, habrá que modificar el manejador por defecto, para que IIS no salte con un 404 si no se llama a algo que no sea un JSP, quedando el siguiente código en web.config:</p>
<pre class="brush: xml; light: true; title: ; notranslate">
        &lt;handlers&gt;
            &lt;add name=&quot;Boncode&quot; path=&quot;*&quot; verb=&quot;*&quot; type=&quot;BonCodeIIS.BonCodeCallHandler,BonCodeIIS,Version=1.0.0.0,Culture=neutral,PublicKeyToken=ad590a40d40745cf&quot; resourceType=&quot;Unspecified&quot; preCondition=&quot;integratedMode&quot; /&gt;
        &lt;/handlers&gt;
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.lapizcorto.com/conexion-facil-de-iis-con-tomcat/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Reparación de inicio de Windows 7 tras cambiar la placa base</title>
		<link>http://www.lapizcorto.com/reparacion-de-inicio-de-windows-7-tras-cambiar-la-placa-base/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=reparacion-de-inicio-de-windows-7-tras-cambiar-la-placa-base</link>
		<comments>http://www.lapizcorto.com/reparacion-de-inicio-de-windows-7-tras-cambiar-la-placa-base/#comments</comments>
		<pubDate>Sun, 29 Jan 2012 21:26:08 +0000</pubDate>
		<dc:creator><![CDATA[Vicente]]></dc:creator>
				<category><![CDATA[Hardware]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://www.lapizcorto.com/?p=432</guid>
		<description><![CDATA[Cuando se actualiza &#8220;a lo bestia&#8221; el hardware sobre el que corre Windows 7, pueden ocurrir problemas serios, como que Windows se niegue a arrancar, mostrando un BSOD con el código 0x0000007B, que viene a indicar que el sistema operativo no es capaz de acceder al disco. Sobre todo suele ocurrir cuando se cambia el [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Cuando se actualiza &#8220;a lo bestia&#8221; el hardware sobre el que corre Windows 7, pueden ocurrir problemas serios, como que Windows se niegue a arrancar, mostrando un <a title="BSOD" href="http://es.wikipedia.org/wiki/Pantalla_azul_de_la_muerte" target="_blank">BSOD</a> con el código 0x0000007B, que viene a indicar que el sistema operativo no es capaz de acceder al disco. Sobre todo suele ocurrir cuando se cambia el chipset de la placa, o se pasa de modo IDE a AHCI. El problema es debido a que para optimizar el arranque del sistema operativo, se desactivan algunas detecciones de controladores tras la instalación, con lo que al realizar el cambio, pues Windows no es capaz de volver a arrancar.</p>
<p>Para solucionarlo, tendremos que reactivar dichos controladores, como bien se explica en el <a title="KB922976" href="http://support.microsoft.com/kb/922976/en-us" target="_blank">KB922976</a>, bien restaurando momentáneamente el hardware original, o mediante las herramientas de reparación integradas en el DVD de Windows 7 (en el símbolo de sistema podemos ejecutar RegEdit), o incluso utilizando un editor de registro <em>offline</em>, como el incluido con <a title="UBCD4Win" href="http://www.ubcd4win.com/" target="_blank">UBCD4Win</a>. Las claves que debemos modificar son:</p>
<p><code>HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Msahci</code><br />
<code>HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\IastorV</code></p>
<p>Poniendo en ambas el valor de <code>Start</code> a <code>0</code>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lapizcorto.com/reparacion-de-inicio-de-windows-7-tras-cambiar-la-placa-base/feed/</wfw:commentRss>
		<slash:comments>23</slash:comments>
		</item>
		<item>
		<title>Eliminación de valores por defecto establecidos en el cliente OpenERP mediante SQL</title>
		<link>http://www.lapizcorto.com/eliminacion-de-valores-por-defecto-establecidos-en-el-cliente-openerp-mediante-sql/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=eliminacion-de-valores-por-defecto-establecidos-en-el-cliente-openerp-mediante-sql</link>
		<comments>http://www.lapizcorto.com/eliminacion-de-valores-por-defecto-establecidos-en-el-cliente-openerp-mediante-sql/#comments</comments>
		<pubDate>Tue, 24 Jan 2012 22:57:45 +0000</pubDate>
		<dc:creator><![CDATA[Vicente]]></dc:creator>
				<category><![CDATA[OpenERP]]></category>

		<guid isPermaLink="false">http://www.lapizcorto.com/?p=411</guid>
		<description><![CDATA[OpenERP tiene una función bastante cómoda, que permite establecer valores por defecto en el cliente web o GTK. Esto es muy útil para definir el país más utilizado al dar de alta un nuevo partner, o para establecer los impuestos más comunes al crear un nuevo producto. Sin embargo, si se utiliza a la ligera [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>OpenERP tiene una función bastante cómoda, que permite establecer valores por defecto en el cliente web o GTK. Esto es muy útil para definir el país más utilizado al dar de alta un nuevo <em>partner</em>, o para establecer los impuestos más comunes al crear un nuevo producto.</p>
<p style="text-align: center;"><a href="http://www.lapizcorto.com/wp-content/uploads/2012/01/Pantallazo-del-2012-01-24-235546.png"><img class="aligncenter size-full wp-image-414" title="Ventana de preferencia de campo" src="http://www.lapizcorto.com/wp-content/uploads/2012/01/Pantallazo-del-2012-01-24-235546.png" alt="Ventana de preferencia de campo" width="354" height="238" /></a></p>
<p>Sin embargo, si se utiliza a la ligera puede dar problemas, como por ejemplo si decidimos que las nuevas líneas de factura tengan un impuesto por defecto. Al principio puede parecer que es una maravilla, hasta que queremos introducir una factura de proveedor y comprobamos que si no tenemos cuidado, vamos a asignarle el mismo IVA repercutido de las facturas de clientes, cuando debería ser IVA soportado. A la hora de deshacerlo, se pueden eliminar las líneas de impuestos y establecer de nuevo el valor con el asistente, o bien modificar directamente la base de datos.</p>
<p>Así, para eliminar la opción comentada de unos impuestos por defecto en la línea de factura, esta es la sentencia SQL a utilizar:</p>
<pre class="brush: sql; title: ; notranslate">
DELETE
  FROM ir_values
  WHERE name = 'invoice_line_tax_id'
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.lapizcorto.com/eliminacion-de-valores-por-defecto-establecidos-en-el-cliente-openerp-mediante-sql/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>&#8216;NoneType&#8217; object has no attribute &#8216;id&#8217; en OpenERP, al cambiar el partner de la factura</title>
		<link>http://www.lapizcorto.com/nonetype-object-has-no-attribute-id-en-openerp-al-cambiar-el-partner-de-la-factura/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=nonetype-object-has-no-attribute-id-en-openerp-al-cambiar-el-partner-de-la-factura</link>
		<comments>http://www.lapizcorto.com/nonetype-object-has-no-attribute-id-en-openerp-al-cambiar-el-partner-de-la-factura/#comments</comments>
		<pubDate>Wed, 18 Jan 2012 19:07:42 +0000</pubDate>
		<dc:creator><![CDATA[Vicente]]></dc:creator>
				<category><![CDATA[OpenERP]]></category>

		<guid isPermaLink="false">http://www.lapizcorto.com/?p=398</guid>
		<description><![CDATA[Como no estoy seguro de si es realmente un bug o un problema con los datos de prueba, lo anoto en este blog, pero no paso informe en Launchpad, que es donde debería, pero el caso es que he detectado este problema utilizando la versión 6.0.3 de OpenERP con los módulos de la localización española [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Como no estoy seguro de si es realmente un <em>bug</em> o un problema con los datos de prueba, lo anoto en este blog, pero no paso informe en Launchpad, que es donde debería, pero el caso es que he detectado este problema utilizando la versión 6.0.3 de OpenERP con los módulos de la localización española y <a href="http://apps.openerp.com/addon/1469" target="_blank">nan_account_extension</a> instalados, siempre que se introduce un cliente en la factura.</p>
<p><img class="aligncenter size-full wp-image-399" title="'NoneType' object has no attribute 'id'" src="http://www.lapizcorto.com/wp-content/uploads/2012/01/Pantallazo-del-2012-01-18-193125.png" alt="'NoneType' object has no attribute 'id'" width="580" height="346" /><br />
Para solucionarlo, basta con modificar la línea 395 de invoice.py en el módulo account:</p>
<pre class="brush: python; first-line: 395; title: ; notranslate">
        if p.property_account_receivable and (p.property_account_receivable.company_id.id != company_id) and p.property_account_payable and (p.property_account_payable.company_id.id != company_id):
</pre>
<p>De esta forma, antes de utilizar las cuentas a cobrar y a pagar del partner, se comprueba que estén definidas, que es lo que estaba dando problemas, aunque entiendo que no debería, al tener instalado el módulo de <a href="http://www.nan-tic.com/" target="_blank">NaN</a> que en principio las gestiona debidamente.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lapizcorto.com/nonetype-object-has-no-attribute-id-en-openerp-al-cambiar-el-partner-de-la-factura/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Instalación simple de mod_security en Plesk 10 para Ubuntu</title>
		<link>http://www.lapizcorto.com/instalacion-simple-de-mod_security-en-plesk-10-para-ubuntu/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=instalacion-simple-de-mod_security-en-plesk-10-para-ubuntu</link>
		<comments>http://www.lapizcorto.com/instalacion-simple-de-mod_security-en-plesk-10-para-ubuntu/#comments</comments>
		<pubDate>Thu, 15 Dec 2011 11:30:08 +0000</pubDate>
		<dc:creator><![CDATA[Vicente]]></dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Plesk]]></category>
		<category><![CDATA[Servidores]]></category>

		<guid isPermaLink="false">http://www.lapizcorto.com/?p=378</guid>
		<description><![CDATA[Uno de los sistemas para minimizar las posibilidades de éxito de los intentos de ataque a los servidores, a nivel de aplicación, es ModSecurity. Con él podemos dormir un poquito más tranquilos, sabiendo que vamos a estar más protegidos de los ataques de inyección SQL, fuerza bruta o vulnerabilidades conocidas. Lamentablemente, parece que por cuestiones [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Uno de los sistemas para minimizar las posibilidades de éxito de los intentos de ataque a los servidores, a nivel de aplicación, es <a title="ModSecurity" href="http://www.modsecurity.org/projects/modsecurity/apache/" target="_blank">ModSecurity</a>. Con él podemos dormir un poquito más tranquilos, sabiendo que vamos a estar más protegidos de los ataques de inyección SQL, fuerza bruta o vulnerabilidades conocidas.</p>
<p>Lamentablemente, parece que por cuestiones de licencia, ya no se siguen generando los binarios en paquetes Debian, por lo que el método recomendado de instalación es compilar a partir del código fuente, pero esto necesita un cambio en el servidor Apache que viene con Plesk 10 para Ubuntu, así que mejor dejamos la última versión disponible instalable con apt, y procedemos con:</p>
<p><code>apt-get install libapache-mod-security</code></p>
<p>Esto nos dejará instalados y activados los módulos mod_security2 y mod_unique_id, con sus enlaces en /etc/apache2/mods-enabled. Ahora necesitamos un conjunto de reglas para ModSecurity, y las que vamos a utilizar son las gratuitas de Atomicorp, los editores de ASL, que las ofrecen con un retraso de 90 días sobre las de pago, disponibles en <a title="Reglas ModSecurity" href="http://updates.atomicorp.com/channels/rules/delayed/" target="_blank">http://updates.atomicorp.com/channels/rules/delayed/</a>. Las descargamos y descomprimimos en /etc/apache2/modsecurity.d:</p>
<p><code>mkdir /etc/apache2/modsecurity.d<br />
wget http://updates.atomicorp.com/channels/rules/delayed/modsec-2.5-free-latest.tar.gz<br />
tar xvf modsec-2.5-free-latest.tar.gz</code></p>
<p>Ahora creamos un fichero de configuración, también en /etc/apache2/modsecurity.d, llamado modsecurity_crs_10_config.conf, con el siguiente contenido:</p>
<pre class="brush: plain; title: ; notranslate">SecRuleEngine On
SecRequestBodyAccess On
SecResponseBodyAccess On
SecResponseBodyMimeType (null) text/html text/plain text/xml
SecResponseBodyLimit 2621440
SecServerSignature Apache
SecComponentSignature 200911012341
SecUploadDir /var/asl/data/suspicious
SecUploadKeepFiles Off
SecAuditEngine RelevantOnly
SecAuditLogRelevantStatus &quot;^(?:5|4(?!04))&quot;
SecAuditLogType Concurrent
SecAuditLog /var/log/apache2/modsecurity/audit_log
SecAuditLogParts ABIFHZ
SecArgumentSeparator &quot;&amp;&quot;
SecCookieFormat 0
SecRequestBodyInMemoryLimit 131072
SecDataDir /var/asl/data/msa
SecTmpDir /tmp
SecAuditLogStorageDir /var/asl/data/audit
SecResponseBodyLimitAction ProcessPartial

#SecPcreMatchLimit  100000
#SecPcreMatchLimitRecursion 100000

SecDebugLog /var/log/apache2/modsecurity/modsec_debug_log
SecDebugLogLevel 3</pre>
<p>Atención a las carpetas especificadas para las estructuras de datos necesarias para ModSecurity, que deben existir y Apache tener permiso sobre ellas, por lo que ejecutamos:</p>
<p><code>mkdir /var/asl /var/asl/data /var/asl/data/audit /var/asl/data/msa /var/asl/data/security<br />
chown -R www-data:www-data /var/asl/data/</code></p>
<p>Por último, creamos un fichero 00_modsecurity.conf en /etc/apache2/conf/, con ese nombre para que cargue el primero, activando las reglas que deseemos, que en nuestro caso son las siguientes:</p>
<pre class="brush: plain; title: ; notranslate">LoadModule security2_module modules/mod_security2.so
LoadModule unique_id_module modules/mod_unique_id.so

  # Todas + exclusiones personalizadas:
  Include /etc/apache2/modsecurity.d/00_asl_0_global.conf
  Include /etc/apache2/modsecurity.d/00_asl_custom_exclude.conf
  # Quitamos RBL porque coge las IPs incorrectamente, como desordenadas
  #Include /etc/apache2/modsecurity.d/00_asl_rbl.conf
  #Include /etc/apache2/modsecurity.d/00_asl_whitelist.conf
  # Esta sólo funciona con ModSecurity &gt; 2.6.1
  #Include /etc/apache2/modsecurity.d/00_asl_z_antievasion.conf
  Include /etc/apache2/modsecurity.d/00_asl_zz_strict.conf
  Include /etc/apache2/modsecurity.d/05_asl_exclude.conf
  # No tenemos el CLAM antivirus instalado
  #Include /etc/apache2/modsecurity.d/05_asl_scanner.conf
  Include /etc/apache2/modsecurity.d/09_asl_rules.conf
  Include /etc/apache2/modsecurity.d/09_asl_rules_antievasion.conf
  Include /etc/apache2/modsecurity.d/10_asl_antimalware.conf
  Include /etc/apache2/modsecurity.d/10_asl_antimalware_output.conf
  Include /etc/apache2/modsecurity.d/10_asl_rules.conf
  Include /etc/apache2/modsecurity.d/11_asl_data_loss.conf
  Include /etc/apache2/modsecurity.d/12_asl_brute.conf
  Include /etc/apache2/modsecurity.d/20_asl_useragents.conf
  Include /etc/apache2/modsecurity.d/30_asl_antimalware.conf
  Include /etc/apache2/modsecurity.d/30_asl_antispam.conf
  Include /etc/apache2/modsecurity.d/30_asl_antispam_referrer.conf
  Include /etc/apache2/modsecurity.d/40_asl_apache2-rules.conf
  Include /etc/apache2/modsecurity.d/50_asl_rootkits.conf
  Include /etc/apache2/modsecurity.d/60_asl_recons.conf
  Include /etc/apache2/modsecurity.d/61_asl_recons_dlp.conf
  Include /etc/apache2/modsecurity.d/98_asl_jitp.conf
  Include /etc/apache2/modsecurity.d/99_asl_exclude.conf
  Include /etc/apache2/modsecurity.d/99_asl_jitp.conf
  Include /etc/apache2/modsecurity.d/99_asl_redactor.conf
  # No tenemos el CLAM antivirus instalado
  #Include /etc/apache2/modsecurity.d/99_asl_scanner.conf
</pre>
<p>Vamos, prácticamente todas, menos la que da problemas por la versión de ModSecurity, que no es la 2.6.1 o superior, las de listas negras y las del antivirus CLAM.</p>
<p>Ya está todo listo. Comprobamos que la configuración de Apache es correcta con</p>
<p><code>apache2ctl configtest</code></p>
<p>Y si lo es, reiniciamos apache con</p>
<p><code>apache2ctl graceful</code></p>
<p>Hale, ya podemos empezar a ver correr en /var/log/apache2/modsecurity/audit_log la lista de peticiones bloqueadas.</p>
<h2></h2>
<h2>Actualización: Cómo desactivar reglas</h2>
<p>&nbsp;</p>
<p>Es muy posible que tengamos que desactivar algunas reglas al encontrarnos con falsos positivos, mostrando errores 403 cuando los permisos y el código están perfectamente. En nuestro caso, al alojar tiendas, algunos TPVs virtuales dan problemas, así que decidimos desactivar globalmente. Para esto, se modifica el fichero <code>/etc/apache2/modsecurity.d/00_asl_custom_exclude.conf</code>, añadiendo el siguiente contenido:</p>
<pre class="brush: plain; title: ; notranslate">
&lt;LocationMatch .*&gt;
  &lt;IfModule mod_security2.c&gt;
    SecRuleRemoveById 350147
    SecRuleRemoveById 350148
  &lt;/IfModule&gt;
&lt;/LocationMatch&gt;
</pre>
<p>Al modificar el fichero de configuración global y utilizar <code>.*</code> como patrón, indicamos que para cualquier dominio y URL alojada en el servidor no queremos que se tengan en cosideración esas reglas. También podemos modificar una regla para un dominio en particular, modificando el fichero <code>vhost.conf</code> que Plesk utiliza para este menester, y regenerando la configuración, por supuesto.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lapizcorto.com/instalacion-simple-de-mod_security-en-plesk-10-para-ubuntu/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
