<?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>El rincón de Zerial &#187; Tips</title>
	<atom:link href="http://blog.zerial.org/category/tips/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.zerial.org</link>
	<description>Informática, GNU/Linux, Seguridad, Hacking, Programación, Ocio</description>
	<lastBuildDate>Tue, 20 Jul 2010 18:13:34 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>DPMS y ScreenBlanking: Controlar el ahorro de energía de la pantalla</title>
		<link>http://blog.zerial.org/linux/dpms-y-screenblanking-controlar-el-ahorro-de-energia-de-la-pantalla/</link>
		<comments>http://blog.zerial.org/linux/dpms-y-screenblanking-controlar-el-ahorro-de-energia-de-la-pantalla/#comments</comments>
		<pubDate>Tue, 20 Jul 2010 18:13:34 +0000</pubDate>
		<dc:creator>Zerial</dc:creator>
				<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[ayuda]]></category>
		<category><![CDATA[dpms]]></category>
		<category><![CDATA[gnu/linux]]></category>
		<category><![CDATA[screenblanking]]></category>
		<category><![CDATA[x]]></category>
		<category><![CDATA[xorg]]></category>

		<guid isPermaLink="false">http://blog.zerial.org/?p=1795</guid>
		<description><![CDATA[Despues de una actualización, magicamente, cuando veia alguna película en mi portatil despues de 10 minutos se iba a negro y se apagaba la pantalla. Es un comportamiento normal si pensamos en que el laptop estaba inactivo, pero no me sucedía cuando dejaba corriendo VLC o mplayer. Ultimamente comenzó a suceder &#8230; entonces pensé inmediatamente [...]]]></description>
			<content:encoded><![CDATA[<p>Despues de una actualización, magicamente, cuando veia alguna película en mi portatil despues de 10 minutos se iba a negro y se apagaba la pantalla. Es un comportamiento normal si pensamos en que el laptop estaba inactivo, pero no me sucedía cuando dejaba corriendo VLC o mplayer. Ultimamente comenzó a suceder &#8230; entonces pensé inmediatamente que era la opción DPMS de la X.</p>
<p>Probé poniendo la opción <strong>Options &#8220;DPMS&#8221; &#8220;false&#8221;</strong>, configurando la X usando <strong>xset</strong> para desactivar la opción de ahorro de energia y tambien probé con <strong>vbetool</strong>, pero ninguna me dio resultado.</p>
<p>Buscando y buscando, encontré que existen dos opciones: <strong>DPMS</strong> y <strong>ScreenBlanking</strong>.</p>
<p><strong>ScreenBlanking: </strong>Es un &#8220;apagado de pantalla/monitor&#8221; de mentira, hace que la pantalla se &#8220;apague&#8221; y se ponga negra, pero realmente sigue prendida, por lo que solamente le baja el brillo. Por defecto está <em>seteado</em> en 10 minutos.</p>
<p><strong>DPMS:</strong> Esta es una función real del manejo de energia para las pantallas. Por defecto pasa a un estado &#8220;StandBy&#8221; luego de 20 minutos, &#8220;Suspend&#8221; luego de 30 minutos y &#8220;Off&#8221; luego de 40.</p>
<p>Para manejar las configurar los parametros de estas opciones podemos hacerlo mediante la configuración de la X o usando xset.</p>
<p><span id="more-1795"></span></p>
<p>Si ejecutamos <strong>xset -q</strong> podemos ver la configuración actual:</p>
<blockquote><p>Keyboard Control:<br />
auto repeat:  on    key click percent:  0    LED mask:  00000000<br />
XKB indicators:<br />
00: Caps Lock:   off    01: Num Lock:    off    02: Scroll Lock: off<br />
03: Compose:     off    04: Kana:        off    05: Sleep:       off<br />
06: Suspend:     off    07: Mute:        off    08: Misc:        off<br />
09: Mail:        off    10: Charging:    off    11: Shift Lock:  off<br />
12: Group 2:     off    13: Mouse Keys:  off<br />
auto repeat delay:  660    repeat rate:  25<br />
auto repeating keys:  00ffffffdffffbbf<br />
fadfffefffedffff<br />
9fffffffffffffff<br />
fff7ffffffffffff<br />
bell percent:  50    bell pitch:  400    bell duration:  100<br />
Pointer Control:<br />
acceleration:  2/1    threshold:  4<br />
<strong>Screen Saver:<br />
prefer blanking:  yes    allow exposures:  yes<br />
timeout:  0    cycle:  600</strong><br />
Colors:<br />
default colormap:  0&#215;20    BlackPixel:  0    WhitePixel:  16777215<br />
Font Path:<br />
/usr/share/fonts/misc,/usr/share/fonts/100dpi:unscaled,/usr/share/fonts/75dpi:unscaled,/usr/share/fonts/TTF,/usr/share/fonts/Type1,/usr/share/fonts/misc/,/usr/share/fonts/TTF/,/usr/share/fonts/Type1/,/usr/share/fonts/100dpi/,/usr/share/fonts/75dpi/,built-ins<br />
<strong>DPMS (Energy Star):<br />
Standby: 600    Suspend: 600    Off: 600<br />
DPMS is Disabled</strong><br />
Font cache:<br />
Server does not have the FontCache Extension</p></blockquote>
<p>Fijarse en la sección &#8220;DPMS&#8221;, aparecen tres valores, standby, suspend, off que estan seteados en 600 segundos, es decir, 10 minutos. Para configurar estos valores debemos hacer lo siguiente:</p>
<p><code>xset dpms 300 600 900</code><br />
El primer número corresponde a Standby, el segundo a Suspend y el tercero a Off. Para desactivarlo podemos dejarlo en cero:<br />
<code>xset dpms 0 0 0</code><br />
Tambien podemos desactivar directamente el DPMS con<br />
<code>xset -dpms</code><br />
Y para activarlo cambiamos el signo menos (-) por un signo mas: +</p>
<p>Si desactivamos DPMS veremos que seguirá apagandose el monitor, pues debemos desactivar (o aumentar el valor) de ScreenBlanking.</p>
<p><code>xset s 0</code><br />
Seteamos el valor a 0 (desactivado).</p>
<p>Para más información les recomiendo el siguiente link (fue el que me ayudó a mi):</p>
<p><a href="http://www.shallowsky.com/linux/x-screen-blanking.html">http://www.shallowsky.com/linux/x-screen-blanking.html</a></p>
<p><a href="http://www.addtoany.com/add_to/delicious?linkurl=http%3A%2F%2Fblog.zerial.org%2Flinux%2Fdpms-y-screenblanking-controlar-el-ahorro-de-energia-de-la-pantalla%2F&amp;linkname=DPMS%20y%20ScreenBlanking%3A%20Controlar%20el%20ahorro%20de%20energ%C3%ADa%20de%20la%20pantalla" title="Delicious" rel="nofollow" target="_blank"><img src="http://blog.zerial.org/wp-content/plugins/add-to-any/icons/delicious.png" width="16" height="16" alt="Delicious"/></a> <a href="http://www.addtoany.com/add_to/twitter?linkurl=http%3A%2F%2Fblog.zerial.org%2Flinux%2Fdpms-y-screenblanking-controlar-el-ahorro-de-energia-de-la-pantalla%2F&amp;linkname=DPMS%20y%20ScreenBlanking%3A%20Controlar%20el%20ahorro%20de%20energ%C3%ADa%20de%20la%20pantalla" title="Twitter" rel="nofollow" target="_blank"><img src="http://blog.zerial.org/wp-content/plugins/add-to-any/icons/twitter.png" width="16" height="16" alt="Twitter"/></a> <a href="http://www.addtoany.com/add_to/facebook?linkurl=http%3A%2F%2Fblog.zerial.org%2Flinux%2Fdpms-y-screenblanking-controlar-el-ahorro-de-energia-de-la-pantalla%2F&amp;linkname=DPMS%20y%20ScreenBlanking%3A%20Controlar%20el%20ahorro%20de%20energ%C3%ADa%20de%20la%20pantalla" title="Facebook" rel="nofollow" target="_blank"><img src="http://blog.zerial.org/wp-content/plugins/add-to-any/icons/facebook.png" width="16" height="16" alt="Facebook"/></a> <a href="http://www.addtoany.com/add_to/google_bookmarks?linkurl=http%3A%2F%2Fblog.zerial.org%2Flinux%2Fdpms-y-screenblanking-controlar-el-ahorro-de-energia-de-la-pantalla%2F&amp;linkname=DPMS%20y%20ScreenBlanking%3A%20Controlar%20el%20ahorro%20de%20energ%C3%ADa%20de%20la%20pantalla" title="Google Bookmarks" rel="nofollow" target="_blank"><img src="http://blog.zerial.org/wp-content/plugins/add-to-any/icons/google.png" width="16" height="16" alt="Google Bookmarks"/></a> <a href="http://www.addtoany.com/add_to/friendfeed?linkurl=http%3A%2F%2Fblog.zerial.org%2Flinux%2Fdpms-y-screenblanking-controlar-el-ahorro-de-energia-de-la-pantalla%2F&amp;linkname=DPMS%20y%20ScreenBlanking%3A%20Controlar%20el%20ahorro%20de%20energ%C3%ADa%20de%20la%20pantalla" title="FriendFeed" rel="nofollow" target="_blank"><img src="http://blog.zerial.org/wp-content/plugins/add-to-any/icons/friendfeed.png" width="16" height="16" alt="FriendFeed"/></a> <a href="http://www.addtoany.com/add_to/digg?linkurl=http%3A%2F%2Fblog.zerial.org%2Flinux%2Fdpms-y-screenblanking-controlar-el-ahorro-de-energia-de-la-pantalla%2F&amp;linkname=DPMS%20y%20ScreenBlanking%3A%20Controlar%20el%20ahorro%20de%20energ%C3%ADa%20de%20la%20pantalla" title="Digg" rel="nofollow" target="_blank"><img src="http://blog.zerial.org/wp-content/plugins/add-to-any/icons/digg.png" width="16" height="16" alt="Digg"/></a> <a href="http://www.addtoany.com/add_to/slashdot?linkurl=http%3A%2F%2Fblog.zerial.org%2Flinux%2Fdpms-y-screenblanking-controlar-el-ahorro-de-energia-de-la-pantalla%2F&amp;linkname=DPMS%20y%20ScreenBlanking%3A%20Controlar%20el%20ahorro%20de%20energ%C3%ADa%20de%20la%20pantalla" title="Slashdot" rel="nofollow" target="_blank"><img src="http://blog.zerial.org/wp-content/plugins/add-to-any/icons/slashdot.png" width="16" height="16" alt="Slashdot"/></a> <a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fblog.zerial.org%2Flinux%2Fdpms-y-screenblanking-controlar-el-ahorro-de-energia-de-la-pantalla%2F&amp;linkname=DPMS%20y%20ScreenBlanking%3A%20Controlar%20el%20ahorro%20de%20energ%C3%ADa%20de%20la%20pantalla">Compartir/Guardar</a> </p>]]></content:encoded>
			<wfw:commentRss>http://blog.zerial.org/linux/dpms-y-screenblanking-controlar-el-ahorro-de-energia-de-la-pantalla/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Script monitor de sistemas de archivos y particiones</title>
		<link>http://blog.zerial.org/linux/script-monitor-de-sistemas-de-archivos-y-particiones/</link>
		<comments>http://blog.zerial.org/linux/script-monitor-de-sistemas-de-archivos-y-particiones/#comments</comments>
		<pubDate>Wed, 14 Jul 2010 19:15:42 +0000</pubDate>
		<dc:creator>Zerial</dc:creator>
				<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[filesystems]]></category>
		<category><![CDATA[herramientas]]></category>
		<category><![CDATA[monitor]]></category>
		<category><![CDATA[script]]></category>
		<category><![CDATA[shell]]></category>
		<category><![CDATA[sysadmin]]></category>
		<category><![CDATA[tools]]></category>

		<guid isPermaLink="false">http://blog.zerial.org/?p=1782</guid>
		<description><![CDATA[Existen herramientas que nos permiten monitorear distintas cosas en un parque de servidores, como Zabbix, Nagios, etc. Pero hay veces que no es posible, ya sea por recursos o por tiempo, implementar una solución de monitoreo de alto nivel, por lo que recurrimos a los scrtips. Estoy seguro que bash, las llaves publicas y privadas [...]]]></description>
			<content:encoded><![CDATA[<p>Existen herramientas que nos permiten monitorear distintas cosas en un parque de servidores, como Zabbix, Nagios, etc. Pero hay veces que no es posible, ya sea por recursos o por tiempo, implementar una solución de monitoreo de alto nivel, por lo que recurrimos a los scrtips. Estoy seguro que bash, las llaves publicas y privadas para la autentificación, y cron son unos de nuestros mejores amigos al momento de querer monitorear o administrar máquinas simultaneamente.</p>
<p>Con <strong>du</strong> podemos saber el uso de disco de nuestro sistema y con un pequeño script en bash podemos mejorar la salida de este comando.</p>
<p><code>ssh 10.0.0.56 -p5022 "df -hPl"|awk -F ' ' '{print $1,$4,$6,$5}' |egrep -v "Avail|Dispo|Use|Use"</code></p>
<p>Esto nos devuelve en 4 columnas el dispositivo, espacio disponible, punto de montaje y porcentaje usado.</p>
<p>Algo similar a:</p>
<blockquote><p>/dev/mapper/VolGroup_25980-LogVol1 3.5G / 75%<br />
/dev/sda1 80M /boot 16%<br />
none 16G /dev/shm 0%<br />
/dev/mapper/VolGroup_25980-LogVolHome 30G /home 69%<br />
/dev/mapper/VolGroup_25980-LogVol2 4.6G /tmp 1%<br />
/dev/mapper/VolGroup_25980-LogVol5 6.6G /usr 29%<br />
/dev/mapper/VolGroup_25980-LogVol4 14G /var 87%<br />
/dev/mapper/VolGroup_25980-mysql 7.0G /var/lib/mysql 63%</p></blockquote>
<p><span id="more-1782"></span></p>
<p>Mi idea es trabajar con <em>threshold</em> (umbral) y gatillar eventos según el umbral alcanzado. Por ejemplo, con un threshold del 80% asociado al porcentaje utilizado, que envie emails de &#8220;advertencias&#8221; y con el 90% notificaciones de &#8220;criticidad del sistema de archivos&#8221;. Lo que querìa lograr era que todos los dias se monitoreen los sistemas de archivos, generando reportes <strong>diarios</strong> de los sistemas criticos y, <strong>semanalmente</strong>, un reporte general, donde me muestre detalladamente los &#8220;normales&#8221;, &#8220;advertencias&#8221; y los &#8220;criticos&#8221;. La salida esperada es algo asi:</p>
<blockquote><p>[+] Server: x.x.x.x (x.hostname)<br />
[-] [Dev:/dev/hda2] [Mount:/] [Free:4.2G] [Used:5%]</p>
<p>[-] [Dev:/dev/hda1] [Mount:/boot] [Free:83M] [Used:11%]</p>
<p>[-] [Dev:/dev/hda3] [Mount:/home] [Free:3.6G] [Used:19%]</p>
<p>[-] [Dev:/dev/hda6] [Mount:/tmp] [Free:1.7G] [Used:1%]</p>
<p>[-] [Dev:/dev/hda5] [Mount:/usr] [Free:8.6G] [Used:3%]</p>
<p>[-] [Dev:/dev/hda7] [Mount:/var] [Free:12G] [Used:21%]</p>
<p>No critical filesystems</p></blockquote>
<p>[...] cuando <strong>no</strong> hay sistemas de archivos criticos y,</p>
<blockquote><p>
[+] Server: y.y.y.y (y.hostname)<br />
[-] [Dev:/dev/mapper/VolGroup00-LogVol00] [Mount:/] [Free:16G] [Used:14%]</p>
<p>[-] [Dev:/dev/sda1] [Mount:/boot] [Free:80M] [Used:15%]</p>
<p>[-] [Dev:/dev/shm] [Mount:/dev/shm] [Free:2.0G] [Used:0%]</p>
<p>[-] [Dev:/dev/mapper/VolGroup00-LogVol02] [Mount:/var] [Free:7.4G] [Used:74%]</p>
<p>[-] [Dev:/dev/mapper/VolGroup00-LogVol03] [Mount:/backup] [Free:13G] [Used:66%]</p>
<p>[-] [Dev:/dev/mapper/VolGroup00-LogVol04] [Mount:/home] [Free:6.6G] [Used:93%] [***CRITICAL***]</p>
<p>[-] [Dev:/dev/mapper/VolGroup00-LogVol05] [Mount:/usr/local] [Free:7.3G] [Used:89%] [***WARNING***]</p></blockquote>
<p>cuando hay criticos y cuando hay emergencias, es decir, cuando se alcanza el umbral del 90% y 80%, respectivamente.</p>
<p>El script que hice es el siguiente:</p>
<pre name="code" class="c">#/bin/bash -e
warning_threshold="80%"
critical_threshold="90%"

warnings=0;
critical=0;
for host in $(grep -v ^# ips.txt);
do
	critical_count=0;
	hostname=$(echo -n $host|cut -f1 -d ":")
        ip=$(echo -n $host|cut -f2 -d ":")
        port=$(echo -n $host|cut -f3 -d ":")
	echo "\n[+] Server: $ip ($hostname)"
	filesystems=$(ssh $ip -p$port "df -Phl"|egrep -v 'Avail|Dispo|tmpfs|udev|Uso|Use'|awk -F ' ' '{print $6}');
	for FS in $filesystems;
	do
		alert="";
		temp=$(ssh $ip -p$port "df -hPl $FS"|awk -F ' ' '{print $1,$4,$6,$5}' |egrep -v 'Avail|Dispo|Uso|Use');
		dev=$(echo $temp |cut -f1 -d " ");
		mountpoint=$(echo $temp |cut -f3 -d " ");
		size=$(echo $temp |cut -f2 -d " ");
		used=$(echo $temp |cut -f4 -d " ");
		_wthreshold=$(echo -n $warning_threshold |sed 's/%//g');
		_cthreshold=$(echo -n $critical_threshold |sed 's/%//g');
		_used=$(echo -n $used |sed 's/%//g');
		case "$1" in
			weekly)
				if [ $_used -gt $_wthreshold ]; then
                                        alert="[***WARNING***]"; warning=$(expr $warning + 1);
                                fi
				if [ $_used -gt $_cthreshold ]; then
					alert="[***CRITICAL***]"; critical=$(expr $critical + 1);
				fi
				echo "[-] [Dev:$dev] [Mount:$mountpoint] [Free:$size] [Used:$used] $alert";
				echo "";
			;;
			daily)
                                if [ $_used -gt $_cthreshold ]; then
                                        alert="[***CRITICAL***]";
					critical_count=$(expr $critical_count + 1);
                                	echo "[-] [Dev:$dev] [Mount:$mountpoint] [Free:$size] [Used:$used] $alert";
					echo "";
				fi
			;;
		esac
	done
	if [ $critical_count -eq 0 ]; then
		echo "No critical filesystems"
		critical_count=0;
	fi
done
if [ "$1" = "weekly" ]; then
	echo "________________"
	echo "Warnings: $warning\t|";
	echo "Criticals: $critical\t|";
fi</pre>
<p>Para que el script funcione, es necesario que en la misma ruta donde se encuentra, exista el archivo <em>ips.txt</em> que debe tener, bajo la sintaxis <strong>hostname:ip:port</strong>, la información para que el script se conecté por ssh a las máquinas. Para que sea más dinámico y no requiera la intervención de un humano, la máquina donde se ejecutará el script debe tener una llave privada cuya llave publica esté repartida en los servidores que se desean monitorear.<br />
El script necesita un argumento para funcionar, puede ser &#8220;weekly&#8221; o &#8220;daily&#8221;, segun se necesite. Con daily el script genera reportes donde mostrará solamente los criticos, mientras que con weekly hará un reporte general.</p>
<p>En el cron tengo agregado que <strong>todos los dias a las 9AM, haga un reporte diario</strong> y <strong>todos los lunes a las 8AM uno general (weekly)</strong> y los envie por correo a los responsables.</p>
<blockquote><p> 8 * * 1 cd /root/du_alert; sh alert.sh weekly |mail -s &#8220;Weekly Disk Usage Status&#8221; encargado@dominio.cl &#8212; -F &#8220;System Administrator&#8221;<br />
0 9 * * * cd /root/du_alert; sh alert.sh daily |mail -s &#8220;Daily Disk Usage Status&#8221; encargado@dominio.cl &#8212; -F &#8220;System Administrator&#8221;</p></blockquote>
<p><a href="http://www.addtoany.com/add_to/delicious?linkurl=http%3A%2F%2Fblog.zerial.org%2Flinux%2Fscript-monitor-de-sistemas-de-archivos-y-particiones%2F&amp;linkname=Script%20monitor%20de%20sistemas%20de%20archivos%20y%20particiones" title="Delicious" rel="nofollow" target="_blank"><img src="http://blog.zerial.org/wp-content/plugins/add-to-any/icons/delicious.png" width="16" height="16" alt="Delicious"/></a> <a href="http://www.addtoany.com/add_to/twitter?linkurl=http%3A%2F%2Fblog.zerial.org%2Flinux%2Fscript-monitor-de-sistemas-de-archivos-y-particiones%2F&amp;linkname=Script%20monitor%20de%20sistemas%20de%20archivos%20y%20particiones" title="Twitter" rel="nofollow" target="_blank"><img src="http://blog.zerial.org/wp-content/plugins/add-to-any/icons/twitter.png" width="16" height="16" alt="Twitter"/></a> <a href="http://www.addtoany.com/add_to/facebook?linkurl=http%3A%2F%2Fblog.zerial.org%2Flinux%2Fscript-monitor-de-sistemas-de-archivos-y-particiones%2F&amp;linkname=Script%20monitor%20de%20sistemas%20de%20archivos%20y%20particiones" title="Facebook" rel="nofollow" target="_blank"><img src="http://blog.zerial.org/wp-content/plugins/add-to-any/icons/facebook.png" width="16" height="16" alt="Facebook"/></a> <a href="http://www.addtoany.com/add_to/google_bookmarks?linkurl=http%3A%2F%2Fblog.zerial.org%2Flinux%2Fscript-monitor-de-sistemas-de-archivos-y-particiones%2F&amp;linkname=Script%20monitor%20de%20sistemas%20de%20archivos%20y%20particiones" title="Google Bookmarks" rel="nofollow" target="_blank"><img src="http://blog.zerial.org/wp-content/plugins/add-to-any/icons/google.png" width="16" height="16" alt="Google Bookmarks"/></a> <a href="http://www.addtoany.com/add_to/friendfeed?linkurl=http%3A%2F%2Fblog.zerial.org%2Flinux%2Fscript-monitor-de-sistemas-de-archivos-y-particiones%2F&amp;linkname=Script%20monitor%20de%20sistemas%20de%20archivos%20y%20particiones" title="FriendFeed" rel="nofollow" target="_blank"><img src="http://blog.zerial.org/wp-content/plugins/add-to-any/icons/friendfeed.png" width="16" height="16" alt="FriendFeed"/></a> <a href="http://www.addtoany.com/add_to/digg?linkurl=http%3A%2F%2Fblog.zerial.org%2Flinux%2Fscript-monitor-de-sistemas-de-archivos-y-particiones%2F&amp;linkname=Script%20monitor%20de%20sistemas%20de%20archivos%20y%20particiones" title="Digg" rel="nofollow" target="_blank"><img src="http://blog.zerial.org/wp-content/plugins/add-to-any/icons/digg.png" width="16" height="16" alt="Digg"/></a> <a href="http://www.addtoany.com/add_to/slashdot?linkurl=http%3A%2F%2Fblog.zerial.org%2Flinux%2Fscript-monitor-de-sistemas-de-archivos-y-particiones%2F&amp;linkname=Script%20monitor%20de%20sistemas%20de%20archivos%20y%20particiones" title="Slashdot" rel="nofollow" target="_blank"><img src="http://blog.zerial.org/wp-content/plugins/add-to-any/icons/slashdot.png" width="16" height="16" alt="Slashdot"/></a> <a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fblog.zerial.org%2Flinux%2Fscript-monitor-de-sistemas-de-archivos-y-particiones%2F&amp;linkname=Script%20monitor%20de%20sistemas%20de%20archivos%20y%20particiones">Compartir/Guardar</a> </p>]]></content:encoded>
			<wfw:commentRss>http://blog.zerial.org/linux/script-monitor-de-sistemas-de-archivos-y-particiones/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Creación de passwords aleatorias con /dev/urandom</title>
		<link>http://blog.zerial.org/linux/creacion-de-passwords-aleatorias-con-devurandom/</link>
		<comments>http://blog.zerial.org/linux/creacion-de-passwords-aleatorias-con-devurandom/#comments</comments>
		<pubDate>Wed, 23 Jun 2010 14:34:02 +0000</pubDate>
		<dc:creator>Zerial</dc:creator>
				<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[password]]></category>
		<category><![CDATA[password aleatoria]]></category>
		<category><![CDATA[password segura]]></category>
		<category><![CDATA[passwords]]></category>
		<category><![CDATA[unix]]></category>

		<guid isPermaLink="false">http://blog.zerial.org/?p=1762</guid>
		<description><![CDATA[/dev/random es un archivo especial que sirve como un generador de números aleatorios, o un generador de números seudo-aleatorios. Permite el acceso a ruido ambiental recogido de dispositivos y otras fuentes [...] /dev/urandom que reutiliza la fuente interna para producir más bits seudoaleatorios. Esto implica que llamadas de lectura nunca se bloquearán, pero la salida [...]]]></description>
			<content:encoded><![CDATA[<p><img class="aligncenter size-full wp-image-1763" title="random" src="http://blog.zerial.org/wp-content/uploads/2010/06/random.png" alt="" width="472" height="123" /></p>
<blockquote><p><strong><tt>/dev/random</tt></strong> es un archivo especial que sirve como un  generador de números aleatorios, o un generador de números  seudo-aleatorios. Permite el acceso a ruido ambiental recogido de  dispositivos y otras fuentes [...] <strong>/dev/urandom</strong> que reutiliza la fuente interna para producir más bits seudoaleatorios. Esto implica que llamadas de lectura nunca se bloquearán, pero la salida puede contener menos entropía que una lectura de /dev/random. La intención es servir como un generador de números seudoaleatorios criptográficamente seguro. Éste puede ser utilizado en aplicaciones que no necesiten de tanta seguridad. (<a href="http://es.wikipedia.org/wiki//dev/random">Wikipedia</a>)</p></blockquote>
<p>Para generar password aleatorias usaremos una combinación de los comandos <strong>tr</strong> y <strong>head</strong>, para poder hacer legible para humanos los bits aleatorios que nos entregará <em>urandom</em>.</p>
<p><span id="more-1762"></span></p>
<p>Si hacemos un <strong>cat</strong> directamente a <strong>/dev/urandom</strong> solamente vamos a ver caracteres raros</p>
<p><a href="http://blog.zerial.org/wp-content/uploads/2010/06/urandom_raw_output.png"><img class="aligncenter size-full wp-image-1768" title="urandom_raw_output" src="http://blog.zerial.org/wp-content/uploads/2010/06/urandom_raw_output.png" alt="" width="546" height="188" /></a></p>
<p>Para &#8220;traducir&#8221; estos bits aleatorios a caracteres legibles por nosotros usaremos <strong>tr</strong>anslate.</p>
<p><a href="http://blog.zerial.org/wp-content/uploads/2010/06/urandom_tr_az.png"><img class="aligncenter size-full wp-image-1770" title="urandom_tr_az" src="http://blog.zerial.org/wp-content/uploads/2010/06/urandom_tr_az.png" alt="" width="541" height="167" /></a></p>
<p>De esta forma, le decimos a <strong>tr</strong> que nos interprete los bits en caracteres de la A a la Z (mayúscula). Podemos jugar con el juego de caracteres que queremos obtener, por ejemplo decirle que me muestre letras de la a-z y A-Z</p>
<p><a href="http://blog.zerial.org/wp-content/uploads/2010/06/urandom_tr_azaz.png"><img class="aligncenter size-full wp-image-1771" title="urandom_tr_azaz" src="http://blog.zerial.org/wp-content/uploads/2010/06/urandom_tr_azaz.png" alt="" width="535" height="124" /></a></p>
<p>Tambien podemos decirle que nos muestre números y caracteres como guión o guión bajo. El comando final quedaria de la siguiente forma:</p>
<p><code>tr -dc A-Za-z0-9_ &lt; /dev/urandom | head -c 8</code></p>
<p>Con <em>head -c 8</em> le diremos que nos muestre solo los primeros 8 caracteres. Podemos cambiar su valor si deseamos caracteres de mayor o menor longitud. Al final de la linea podemos agregarle un <em> &#038;&#038; echo &#8220;&#8221;</em>  para que nos muestre un salto de linea al final.</p>
<blockquote><p>[zerial@balcebu ~]$ tr -dc A-Za-z0-9_ < /dev/urandom | head -c 8 &#038;&#038; echo<br />
Z2_gaCcE<br />
[zerial@balcebu ~]$ tr -dc A-Za-z0-9_ < /dev/urandom | head -c 8 &#038;&#038; echo<br />
Tob68gN0<br />
[zerial@balcebu ~]$ tr -dc A-Za-z0-9_ < /dev/urandom | head -c 8 &#038;&#038; echo<br />
boEzFU3O<br />
[zerial@balcebu ~]$ tr -dc A-Za-z0-9_ < /dev/urandom | head -c 8 &#038;&#038; echo<br />
EFfcRcuf<br />
[zerial@balcebu ~]$ tr -dc A-Za-z0-9_ < /dev/urandom | head -c 8 &#038;&#038; echo<br />
cTY330uO<br />
[zerial@balcebu ~]$ tr -dc A-Za-z0-9_ < /dev/urandom | head -c 8 &#038;&#038; echo<br />
l3UnaDPo<br />
[zerial@balcebu ~]$ </p></blockquote>
<p>O una forma más elegante:</p>
<p><strong>$ tr -dc A-Za-z0-9_ < /dev/urandom | head -c 8 | xargs</strong></strong></p></blockquote>
<p></code></p>
<p><a href="http://www.addtoany.com/add_to/delicious?linkurl=http%3A%2F%2Fblog.zerial.org%2Flinux%2Fcreacion-de-passwords-aleatorias-con-devurandom%2F&amp;linkname=Creaci%C3%B3n%20de%20passwords%20aleatorias%20con%20%2Fdev%2Furandom" title="Delicious" rel="nofollow" target="_blank"><img src="http://blog.zerial.org/wp-content/plugins/add-to-any/icons/delicious.png" width="16" height="16" alt="Delicious"/></a> <a href="http://www.addtoany.com/add_to/twitter?linkurl=http%3A%2F%2Fblog.zerial.org%2Flinux%2Fcreacion-de-passwords-aleatorias-con-devurandom%2F&amp;linkname=Creaci%C3%B3n%20de%20passwords%20aleatorias%20con%20%2Fdev%2Furandom" title="Twitter" rel="nofollow" target="_blank"><img src="http://blog.zerial.org/wp-content/plugins/add-to-any/icons/twitter.png" width="16" height="16" alt="Twitter"/></a> <a href="http://www.addtoany.com/add_to/facebook?linkurl=http%3A%2F%2Fblog.zerial.org%2Flinux%2Fcreacion-de-passwords-aleatorias-con-devurandom%2F&amp;linkname=Creaci%C3%B3n%20de%20passwords%20aleatorias%20con%20%2Fdev%2Furandom" title="Facebook" rel="nofollow" target="_blank"><img src="http://blog.zerial.org/wp-content/plugins/add-to-any/icons/facebook.png" width="16" height="16" alt="Facebook"/></a> <a href="http://www.addtoany.com/add_to/google_bookmarks?linkurl=http%3A%2F%2Fblog.zerial.org%2Flinux%2Fcreacion-de-passwords-aleatorias-con-devurandom%2F&amp;linkname=Creaci%C3%B3n%20de%20passwords%20aleatorias%20con%20%2Fdev%2Furandom" title="Google Bookmarks" rel="nofollow" target="_blank"><img src="http://blog.zerial.org/wp-content/plugins/add-to-any/icons/google.png" width="16" height="16" alt="Google Bookmarks"/></a> <a href="http://www.addtoany.com/add_to/friendfeed?linkurl=http%3A%2F%2Fblog.zerial.org%2Flinux%2Fcreacion-de-passwords-aleatorias-con-devurandom%2F&amp;linkname=Creaci%C3%B3n%20de%20passwords%20aleatorias%20con%20%2Fdev%2Furandom" title="FriendFeed" rel="nofollow" target="_blank"><img src="http://blog.zerial.org/wp-content/plugins/add-to-any/icons/friendfeed.png" width="16" height="16" alt="FriendFeed"/></a> <a href="http://www.addtoany.com/add_to/digg?linkurl=http%3A%2F%2Fblog.zerial.org%2Flinux%2Fcreacion-de-passwords-aleatorias-con-devurandom%2F&amp;linkname=Creaci%C3%B3n%20de%20passwords%20aleatorias%20con%20%2Fdev%2Furandom" title="Digg" rel="nofollow" target="_blank"><img src="http://blog.zerial.org/wp-content/plugins/add-to-any/icons/digg.png" width="16" height="16" alt="Digg"/></a> <a href="http://www.addtoany.com/add_to/slashdot?linkurl=http%3A%2F%2Fblog.zerial.org%2Flinux%2Fcreacion-de-passwords-aleatorias-con-devurandom%2F&amp;linkname=Creaci%C3%B3n%20de%20passwords%20aleatorias%20con%20%2Fdev%2Furandom" title="Slashdot" rel="nofollow" target="_blank"><img src="http://blog.zerial.org/wp-content/plugins/add-to-any/icons/slashdot.png" width="16" height="16" alt="Slashdot"/></a> <a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fblog.zerial.org%2Flinux%2Fcreacion-de-passwords-aleatorias-con-devurandom%2F&amp;linkname=Creaci%C3%B3n%20de%20passwords%20aleatorias%20con%20%2Fdev%2Furandom">Compartir/Guardar</a> </p>]]></content:encoded>
			<wfw:commentRss>http://blog.zerial.org/linux/creacion-de-passwords-aleatorias-con-devurandom/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Violando sistemas: Sniffeando la red</title>
		<link>http://blog.zerial.org/seguridad/violando-sistemas-sniffeando-la-red/</link>
		<comments>http://blog.zerial.org/seguridad/violando-sistemas-sniffeando-la-red/#comments</comments>
		<pubDate>Thu, 01 Apr 2010 01:42:12 +0000</pubDate>
		<dc:creator>Zerial</dc:creator>
				<category><![CDATA[Hacking]]></category>
		<category><![CDATA[Seguridad]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[man in the middle]]></category>
		<category><![CDATA[mitm]]></category>
		<category><![CDATA[redes]]></category>
		<category><![CDATA[sniffers]]></category>
		<category><![CDATA[tcpdump]]></category>
		<category><![CDATA[wireshark]]></category>

		<guid isPermaLink="false">http://blog.zerial.org/?p=1626</guid>
		<description><![CDATA[Cuando se logra vulnerar la seguridad de un sistema informático y obtenemos acceso al servidor tenemos varias formas de continuar el ataque, ya sea revisando los archivos del servidor buscando información interesante, controlar distintos servicios como el de base de datos o de correo, revisar la información de cada usuario de sistema, dejar una puerta [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-medium wp-image-1631" style="margin: 4px;" title="spying" src="http://blog.zerial.org/wp-content/uploads/2010/03/spying-233x300.jpg" alt="" width="192" height="246" />Cuando se logra vulnerar la seguridad de un sistema informático y obtenemos acceso al servidor tenemos varias formas de continuar el ataque, ya sea revisando los archivos del servidor buscando información interesante, controlar distintos servicios como el de base de datos o de correo, revisar la información de cada usuario de sistema, dejar una puerta trasera para volver a ingresar al servidor, etc. Una de las cosas que más me gustan es saltar a otros servidores, hacer un análisis de la red y poder tener control sobre la mayor cantidad de máquinas que forman la red, ya sean servidores físicos o virtuales.<br />
El primer paso para armar un diagrama lógico de red es empezare a ver la configuración de la o las tarjetas de red, ver los últimos accesos que se han hecho en forma local o desde la lan, revisar logs, archivo de hosts y obviamente empezar a escanear usando nmap (obviamente de forma local) o alguna otra utilidad que tenga instalada o que podamos instalar. Si no tenemos nmap lo podemos hacer con un simple script en bash que haga ping a todo un rango y nos diga qué dirección está arriba:</p>
<pre name="code" class="c">#!/bin/bash
NETWORK=192.168.1
FROM=100
TO=110
for x in $(seq $FROM $TO)
do
	ping -c 1 $NETWORK.$x &gt;/dev/null 2&gt;&amp;1
	if [ $? -eq 0 ]; then
		echo $NETWORK.$x is up.
	else
		echo $NETWORK.$x is down.
	fi
done</pre>
<p>Una vez que tengamos el mapa mental-lógico de la red podemos empezar a analizar el tráfico que pasa por ellas y acá es donde entran en juego los famosos <em>sniffers</em>, que nos ayudarán a reforzar nuestro diagrama:</p>
<p><span id="more-1626"></span></p>
<blockquote><p>En informática, un packet sniffer es un programa de captura de las tramas de red.</p></blockquote>
<p>Existen distintos métodos y herramientas para sniffear y para envenenar la red.</p>
<p><strong><a href="http://ettercap.sf.net">ettercap</a></strong> Ettercap es un interceptor/sniffer/registrador para LANs con switch. Soporta direcciones activas y pasivas de varios protocolos (incluso aquellos cifrados, como SSH y HTTPS). También hace posible la inyección de datos en una conexión establecida y filtrado al vuelo aun manteniendo la conexión sincronizada gracias a su poder para establecer un Ataque Man-in-the-middle(Spoofing). Muchos modos de sniffing fueron implementados para darnos un conjunto de herramientas poderoso y completo de sniffing.</p>
<p><strong><a href="http://www.tcpdump.org/">tcpdump</a></strong> es un herramienta en línea de comandos cuya utilidad principal es analizar el tráfico que circula por la red. Permite al usuario capturar y mostrar a tiempo real los paquetes transmitidos y recibidos en la red a la cual el ordenador está conectado. Está escrito por Van Jacobson, Craig Leres, y Steven McCanne que trabajaban en &#8230; (<a href="http://es.wikipedia.org/wiki/Tcpdump">más</a>)</p>
<p><strong><a href="http://www.wireshark.org">wireshark o ethereal</a></strong> La funcionalidad que provee es similar a la de tcpdump, pero añade una interfaz gráfica y muchas opciones de organización y filtrado de información. Así, permite ver todo el tráfico que pasa a través de una red (usualmente una red Ethernet, aunque es compatible con algunas otras) estableciendo la configuración en modo promiscuo. También incluye una versión basada en texto llamada tshark.</p>
<p>(<em>nota: Las definiciones fueron obtenidas desde Wikipedia</em>)</p>
<p>Luego de identificar qué máquinas nos interesan, podemos aplicar la técnica del <em>hombre en el medio (Man In The Middle)</em> o MiTM para capturar información para poder acceder a otros sistemas.</p>
<p>Link: <strong><a href="http://sectools.org/sniffers.html">Top 11 Packet Sniffers</a></strong></p>
<p><a href="http://www.addtoany.com/add_to/delicious?linkurl=http%3A%2F%2Fblog.zerial.org%2Fseguridad%2Fviolando-sistemas-sniffeando-la-red%2F&amp;linkname=Violando%20sistemas%3A%20Sniffeando%20la%20red" title="Delicious" rel="nofollow" target="_blank"><img src="http://blog.zerial.org/wp-content/plugins/add-to-any/icons/delicious.png" width="16" height="16" alt="Delicious"/></a> <a href="http://www.addtoany.com/add_to/twitter?linkurl=http%3A%2F%2Fblog.zerial.org%2Fseguridad%2Fviolando-sistemas-sniffeando-la-red%2F&amp;linkname=Violando%20sistemas%3A%20Sniffeando%20la%20red" title="Twitter" rel="nofollow" target="_blank"><img src="http://blog.zerial.org/wp-content/plugins/add-to-any/icons/twitter.png" width="16" height="16" alt="Twitter"/></a> <a href="http://www.addtoany.com/add_to/facebook?linkurl=http%3A%2F%2Fblog.zerial.org%2Fseguridad%2Fviolando-sistemas-sniffeando-la-red%2F&amp;linkname=Violando%20sistemas%3A%20Sniffeando%20la%20red" title="Facebook" rel="nofollow" target="_blank"><img src="http://blog.zerial.org/wp-content/plugins/add-to-any/icons/facebook.png" width="16" height="16" alt="Facebook"/></a> <a href="http://www.addtoany.com/add_to/google_bookmarks?linkurl=http%3A%2F%2Fblog.zerial.org%2Fseguridad%2Fviolando-sistemas-sniffeando-la-red%2F&amp;linkname=Violando%20sistemas%3A%20Sniffeando%20la%20red" title="Google Bookmarks" rel="nofollow" target="_blank"><img src="http://blog.zerial.org/wp-content/plugins/add-to-any/icons/google.png" width="16" height="16" alt="Google Bookmarks"/></a> <a href="http://www.addtoany.com/add_to/friendfeed?linkurl=http%3A%2F%2Fblog.zerial.org%2Fseguridad%2Fviolando-sistemas-sniffeando-la-red%2F&amp;linkname=Violando%20sistemas%3A%20Sniffeando%20la%20red" title="FriendFeed" rel="nofollow" target="_blank"><img src="http://blog.zerial.org/wp-content/plugins/add-to-any/icons/friendfeed.png" width="16" height="16" alt="FriendFeed"/></a> <a href="http://www.addtoany.com/add_to/digg?linkurl=http%3A%2F%2Fblog.zerial.org%2Fseguridad%2Fviolando-sistemas-sniffeando-la-red%2F&amp;linkname=Violando%20sistemas%3A%20Sniffeando%20la%20red" title="Digg" rel="nofollow" target="_blank"><img src="http://blog.zerial.org/wp-content/plugins/add-to-any/icons/digg.png" width="16" height="16" alt="Digg"/></a> <a href="http://www.addtoany.com/add_to/slashdot?linkurl=http%3A%2F%2Fblog.zerial.org%2Fseguridad%2Fviolando-sistemas-sniffeando-la-red%2F&amp;linkname=Violando%20sistemas%3A%20Sniffeando%20la%20red" title="Slashdot" rel="nofollow" target="_blank"><img src="http://blog.zerial.org/wp-content/plugins/add-to-any/icons/slashdot.png" width="16" height="16" alt="Slashdot"/></a> <a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fblog.zerial.org%2Fseguridad%2Fviolando-sistemas-sniffeando-la-red%2F&amp;linkname=Violando%20sistemas%3A%20Sniffeando%20la%20red">Compartir/Guardar</a> </p>]]></content:encoded>
			<wfw:commentRss>http://blog.zerial.org/seguridad/violando-sistemas-sniffeando-la-red/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Imagenes y snapshots: Respaldo de servidores</title>
		<link>http://blog.zerial.org/linux/imagenes-y-snapshots-respaldo-de-servidores/</link>
		<comments>http://blog.zerial.org/linux/imagenes-y-snapshots-respaldo-de-servidores/#comments</comments>
		<pubDate>Mon, 22 Feb 2010 13:15:02 +0000</pubDate>
		<dc:creator>Zerial</dc:creator>
				<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[automatizacion]]></category>
		<category><![CDATA[backup]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[dd]]></category>
		<category><![CDATA[gnu/linux]]></category>
		<category><![CDATA[lvm]]></category>
		<category><![CDATA[nfs]]></category>
		<category><![CDATA[respaldos]]></category>
		<category><![CDATA[script]]></category>
		<category><![CDATA[servidores]]></category>
		<category><![CDATA[shell]]></category>
		<category><![CDATA[snapshots]]></category>

		<guid isPermaLink="false">http://blog.zerial.org/?p=1563</guid>
		<description><![CDATA[Mi propósito era crear imágenes de todos los servidores del datacenter para que, en caso de cualquier contingencia, levantar un nuevo servidor identico simplemente traspasando la imágen de respaldo hacia ese servidor. Los sistemas estaban instalados usando volumenes lógicos (LVM) por lo que sería mucho más fácil crear imágenes y snapshots de respaldos. En un [...]]]></description>
			<content:encoded><![CDATA[<p>Mi propósito era crear imágenes de todos los servidores del datacenter para que, en caso de cualquier contingencia, levantar un nuevo servidor identico simplemente traspasando la imágen de respaldo hacia ese servidor. Los sistemas estaban instalados usando volumenes lógicos (LVM) por lo que sería mucho más fácil crear imágenes y snapshots de respaldos. En un prinicpio pensé hacer directamente <strong>dd</strong> sobre los volumenes lógicos pero la imágen se corrompía y en muchos casos no podía volver a recuperarla. Existe la posibilidad de montar el volumen lógico en un directorio y respaldar, usando tar, bzip y esas cosas, sólo los archivos, pero no era mi propósito, ya que para restaurar solamente los archivos, debía tener una partición ya preparada, con el sistma de ficheros, sistema instalado, etc etc. En cambio, con la imágen simplemente hacia un <strong>dd</strong> para restaurarla, sin tener el sistema de archivos creado, etc.</p>
<p>Por twitter me recomendaron varias opciones. <a href="http://twitter.com/apostols">@Apostols</a> me recomendó las herramientas &#8220;puppet&#8221; y &#8220;rlbackup&#8221;, mientras que <a href="http://twitter.com/ssugasti">@ssugasti</a> &#8220;mondorescue&#8221;, pero yo seguia con mi idea de usar directamente &#8220;dd&#8221;. Debía hacer el mismo procedimiento en mas de 40 servidores, por lo que usar una aplicación &#8220;cliente->servidor&#8221; no era mi solución. Usar aplicaciones que requieran modo grafico o que requieran mucha interacción con el usuario tampoco me servian, yo necesitaba algo automatizado que pueda dejar corriendo de noche y volver al otro día y encontrar el trabajo hecho.</p>
<p><span id="more-1563"></span></p>
<p>Leyendo el manual de LVM, especialmente el de <strong>lvcreate</strong>, encontré la opción &#8220;<strong>snapshot</strong>&#8221; que básicamente le toma una &#8220;foto&#8221; al volumen lógico de origen y crea un nuevo volumen con ese preciso instante en que se hizo el snapshot, de ésta forma la partición original podrá ser actualizara mientras que el snapshot se respalda sin problemas. Luego de eso, el snapshot se elimina y se guarda la imágen. La rutína sería mas o menos asi:</p>
<p><code># lvcreate --snapshot /dev/Vol00/var --name var-snap -L100k<br />
# dd if=/dev/Vol00/var-snap of=/backup/var.img<br />
# lvremove -f /dev/Vol00/var-snap </code></p>
<p>De esta forma, creamos un snapshot llamado &#8220;var-snap&#8221; en base a la partición (o volumen) /dev/Vol00/var, luego, usando dd, creamos la imágen de dicha partición y la guardamos en /backup. Finalmente eliminamos el snapshot.<br />
Para tener aún más certesa de que todo funcionaría, tambien decidí empaquetar, comprimir y guardar los ficheros, por lo que antes de eliminarla (lvremove) la debo montar y hacer un tar. La rutina quedaría así:</p>
<p><code># lvcreate --snapshot /dev/Vol00/var --name var-snap -L100k<br />
# dd if=/dev/Vol00/var-snap of=/backup/var.img<br />
# mount /dev/Vol00/var-snap /mnt<br />
# tar cfjv /bakcup/var.tbz2 /mnt<br />
# umount /mnt<br />
# lvremove -f /dev/Vol00/var-snap </code></p>
<p>En mi caso, /backup corresponde a un punto de montaje de red NFS.<br />
Mi misión era realizar ésta misma rutina en más de 40 servidores, por lo que necesitaba hacer un script que se paseara por todos los servidores y ejecutara estos comandos.</p>
<pre name="code" class="c">
#!/bin/bash

IDENTITYFILE=$HOME/.ssh/id_rsa
MACHINES=servidores.list
DATE=$(date +%d%m%Y)
NFS=/mnt/imagenes/servers/
DIR_SNAPSHOT=/mnt/snapshot

for server in $(cat servidores.list);
do
        echo "Respaldando $server ..."
        ssh -i $IDENTITYFILE $server "lvdisplay" >/tmp/lvdisplay_temp
        lvdisplay=$(awk '
                /LV Name/ { name = $3 }
                /VG Name/ { print name","$3 } ' /tmp/lvdisplay_temp)
        for _logicalv in $lvdisplay;
        do
                lvname=$(echo $_logicalv |cut -f1 -d ","|cut -f4 -d "/")
                logicalv=$(echo $_logicalv |cut -f2 -d ",")
                echo -e "\tVolumen Logico: $lvname"
                ssh $server "lvcreate --size 100m --snapshot --name $lvname-snap /dev/$logicalv/$lvname"
                ssh $server "mount /dev/$logicalv/$lvname-snap $DIR_SNAPSHOT"
                ssh $server "mkdir $NFS$server"
                ssh $server "tar cfj $NFS$server/snapshot_$lvname-$DATE.tar.bz2 $DIR_SNAPSHOT"
                ssh $server "umount $DIR_SNAPSHOT"
                ssh $server "dd if=/dev/$logicalv/$lvname-snap of=$NFS$server/image_$lvname-$DATE.img"
                ssh $server "lvremove -f /dev/$logicalv/$lvname-snap"
                echo -e "\tArchivo imagen: $NFS$server/image_$lvname-$DATE.img"
                echo -e "\tArchivo tarball: $NFS$server/snapshot_$lvname-$DATE.tar.bz2"
        done
done
scp /tmp/lvdisplay_temp $server:$NFS$server/lvdisplay
</pre>
<p>El script trabaja con la salida del comando <strong>lvdisplay</strong> que entrega una salida con los detalles de cada volumen lógico. Lee un fichero llamado <em>servidores.list</em> y hace un recorrido línea por línea, conectándose a cada servidor y ejecutando las instrucciones necesarias. Para hacer el proceso más eficiente y automatizado es necesario, previamente, copiar todas las claves públicas a cada servidor, para evitar la autentificación.</p>
<p><a href="http://www.addtoany.com/add_to/delicious?linkurl=http%3A%2F%2Fblog.zerial.org%2Flinux%2Fimagenes-y-snapshots-respaldo-de-servidores%2F&amp;linkname=Imagenes%20y%20snapshots%3A%20Respaldo%20de%20servidores" title="Delicious" rel="nofollow" target="_blank"><img src="http://blog.zerial.org/wp-content/plugins/add-to-any/icons/delicious.png" width="16" height="16" alt="Delicious"/></a> <a href="http://www.addtoany.com/add_to/twitter?linkurl=http%3A%2F%2Fblog.zerial.org%2Flinux%2Fimagenes-y-snapshots-respaldo-de-servidores%2F&amp;linkname=Imagenes%20y%20snapshots%3A%20Respaldo%20de%20servidores" title="Twitter" rel="nofollow" target="_blank"><img src="http://blog.zerial.org/wp-content/plugins/add-to-any/icons/twitter.png" width="16" height="16" alt="Twitter"/></a> <a href="http://www.addtoany.com/add_to/facebook?linkurl=http%3A%2F%2Fblog.zerial.org%2Flinux%2Fimagenes-y-snapshots-respaldo-de-servidores%2F&amp;linkname=Imagenes%20y%20snapshots%3A%20Respaldo%20de%20servidores" title="Facebook" rel="nofollow" target="_blank"><img src="http://blog.zerial.org/wp-content/plugins/add-to-any/icons/facebook.png" width="16" height="16" alt="Facebook"/></a> <a href="http://www.addtoany.com/add_to/google_bookmarks?linkurl=http%3A%2F%2Fblog.zerial.org%2Flinux%2Fimagenes-y-snapshots-respaldo-de-servidores%2F&amp;linkname=Imagenes%20y%20snapshots%3A%20Respaldo%20de%20servidores" title="Google Bookmarks" rel="nofollow" target="_blank"><img src="http://blog.zerial.org/wp-content/plugins/add-to-any/icons/google.png" width="16" height="16" alt="Google Bookmarks"/></a> <a href="http://www.addtoany.com/add_to/friendfeed?linkurl=http%3A%2F%2Fblog.zerial.org%2Flinux%2Fimagenes-y-snapshots-respaldo-de-servidores%2F&amp;linkname=Imagenes%20y%20snapshots%3A%20Respaldo%20de%20servidores" title="FriendFeed" rel="nofollow" target="_blank"><img src="http://blog.zerial.org/wp-content/plugins/add-to-any/icons/friendfeed.png" width="16" height="16" alt="FriendFeed"/></a> <a href="http://www.addtoany.com/add_to/digg?linkurl=http%3A%2F%2Fblog.zerial.org%2Flinux%2Fimagenes-y-snapshots-respaldo-de-servidores%2F&amp;linkname=Imagenes%20y%20snapshots%3A%20Respaldo%20de%20servidores" title="Digg" rel="nofollow" target="_blank"><img src="http://blog.zerial.org/wp-content/plugins/add-to-any/icons/digg.png" width="16" height="16" alt="Digg"/></a> <a href="http://www.addtoany.com/add_to/slashdot?linkurl=http%3A%2F%2Fblog.zerial.org%2Flinux%2Fimagenes-y-snapshots-respaldo-de-servidores%2F&amp;linkname=Imagenes%20y%20snapshots%3A%20Respaldo%20de%20servidores" title="Slashdot" rel="nofollow" target="_blank"><img src="http://blog.zerial.org/wp-content/plugins/add-to-any/icons/slashdot.png" width="16" height="16" alt="Slashdot"/></a> <a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fblog.zerial.org%2Flinux%2Fimagenes-y-snapshots-respaldo-de-servidores%2F&amp;linkname=Imagenes%20y%20snapshots%3A%20Respaldo%20de%20servidores">Compartir/Guardar</a> </p>]]></content:encoded>
			<wfw:commentRss>http://blog.zerial.org/linux/imagenes-y-snapshots-respaldo-de-servidores/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Script para escanear la red en busca de servidores y servicios</title>
		<link>http://blog.zerial.org/linux/script-para-escanear-la-red-en-busca-de-servidores-y-servicios/</link>
		<comments>http://blog.zerial.org/linux/script-para-escanear-la-red-en-busca-de-servidores-y-servicios/#comments</comments>
		<pubDate>Wed, 10 Feb 2010 13:40:07 +0000</pubDate>
		<dc:creator>Zerial</dc:creator>
				<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[nmap]]></category>
		<category><![CDATA[puertos]]></category>
		<category><![CDATA[redes]]></category>
		<category><![CDATA[scan]]></category>
		<category><![CDATA[script]]></category>
		<category><![CDATA[servicios]]></category>

		<guid isPermaLink="false">http://blog.zerial.org/?p=1515</guid>
		<description><![CDATA[Hace un par de días tuve la necesidad de escanear 3 redes completas, mas de 50 direcciones ip, en busca de servicios que corrieran en ellas. Obviamente, no iba a ingresar a cada servidor y hacer un netstat o revisar uno por uno que servicios tenia instalado, si para eso existe nmap! Lo que hicste [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.zerial.org/wp-content/uploads/2010/02/eyes_scan1.png"><img class="aligncenter size-full wp-image-1519" title="eyes_scan" src="http://blog.zerial.org/wp-content/uploads/2010/02/eyes_scan1.png" alt="" width="422" height="80" /></a></p>
<p>Hace un par de días tuve la necesidad de escanear 3 redes completas, mas de 50 direcciones ip, en busca de servicios que corrieran en ellas. Obviamente, no iba a ingresar a cada servidor y hacer un <em>netstat</em> o revisar uno por uno que servicios tenia instalado, si para eso existe <a href="http://nmap.org" target="_blank"><strong>nmap</strong></a>!<br />
Lo que hicste fue separar los rangos de ip en archivos distintos, para tener un orden y escanear la red en orden según los segmentos y luego hice un script que leia cada archivo y escaneaba la ip en busca de servicios, la salida del nmap la <em>parseaba</em> y lo guarda en un archivo separado por comas. En un principio el script mostraba todo en el <strong>stdout</strong> pero para que quedara más ordenado, preferí hacerlo en un CSV para poder abrirlo con <em>oocalc</em>.<br />
El script me genera un archivo con la siguiente información:</p>
<p><strong>host, IP, Servicio, Puerto, Version</strong></p>
<p><span id="more-1515"></span></p>
<p>El script es el siguiente:</p>
<pre name="code" class="c">
#!/bin/bash

nmap=/usr/bin/nmap
params="-sV"
tmp_file=/tmp/nmap_scanner_output
output=Servidores.csv
export SCANNER_ERROR=0

echo "host,IP,Servicio,Puerto,Version" >> $output
for ips in ips.*
do
	echo "Analizando $ips ..."
	for ip in $(cat $ips)
	do
		echo -e "\t-> $ip ..."
		ping -c 1 $ip 1>/dev/null 2>&#038;1|| export SCANNER_ERROR=1
		if [ $SCANNER_ERROR = "1" ]; then
			echo -e "\t\t- Host no activo"
		fi
		if [ $SCANNER_ERROR = "0" ]; then
			$nmap $params $ip |grep -v "Starting Nmap" |grep -v "Nmap scan report" |grep -v "Host is up" |grep -v "Not shown" |grep -v "Service detection performed" |grep -v "Nmap done" > $tmp_file
			export _host=$(grep "Service Info" $tmp_file |sed 's/,//g'|grep "Host" |awk -F ' ' {'print $4'} |sed 's/;//g')
			grep tcp $tmp_file |scanner_ip=$ip awk -F " " '{print ENVIRON["_host"]","ENVIRON["scanner_ip"]","$3","$1","$4,$5,$6,$7,$8;}' >>$output
			echo -e "\n" >>$output
		fi
		export SCANNER_ERROR=0
	done
done
</pre>
<p>El script necesita para funcionar archivos con el listado de direcciones ip. Los (o el) archivo(s) se deben llamar &#8220;<em>ips.<algo></algo></em>&#8220;. En mi caso, tengo los siguientes archivos:<br />
<code>ips.192 ips.10 ips.172</code><br />
Dentro de cada archivo hay direcciones del tipo 192.168.0.X, 10.0.0.X, 172.20.20.X&#8230;</p>
<p><code>$ sh scan.sh<br />
Analizando ips.10 ...<br />
	-&gt; 10.0.0.2 ...<br />
	-&gt; 10.0.0.3 ...<br />
	-&gt; 10.0.0.11 ...<br />
		- Host no activo<br />
	-&gt; 10.0.0.20 ...<br />
		- Host no activo<br />
	-&gt; 10.0.0.21 ...<br />
		- Host no activo<br />
	-&gt; 10.0.0.70 ...<br />
	-&gt; 10.0.0.72 ...<br />
	-&gt; 10.0.0.73 ...<br />
Analizando ips.172 ...<br />
	-&gt; 172.20.20.2 ...<br />
	-&gt; 172.20.20.3 ...<br />
Analizando ips.192 ...<br />
	-&gt; 192.168.0.55 ...<br />
	-&gt; 192.168.0.101 ...</p>
<p>[...]</code></p>
<p>El script generará un output a un archivo llamado &#8220;Servidores.csv&#8221;, el cual lo podemos encontrar en la misma ruta donde tenemos el script.</p>
<p><a href="http://www.addtoany.com/add_to/delicious?linkurl=http%3A%2F%2Fblog.zerial.org%2Flinux%2Fscript-para-escanear-la-red-en-busca-de-servidores-y-servicios%2F&amp;linkname=Script%20para%20escanear%20la%20red%20en%20busca%20de%20servidores%20y%20servicios" title="Delicious" rel="nofollow" target="_blank"><img src="http://blog.zerial.org/wp-content/plugins/add-to-any/icons/delicious.png" width="16" height="16" alt="Delicious"/></a> <a href="http://www.addtoany.com/add_to/twitter?linkurl=http%3A%2F%2Fblog.zerial.org%2Flinux%2Fscript-para-escanear-la-red-en-busca-de-servidores-y-servicios%2F&amp;linkname=Script%20para%20escanear%20la%20red%20en%20busca%20de%20servidores%20y%20servicios" title="Twitter" rel="nofollow" target="_blank"><img src="http://blog.zerial.org/wp-content/plugins/add-to-any/icons/twitter.png" width="16" height="16" alt="Twitter"/></a> <a href="http://www.addtoany.com/add_to/facebook?linkurl=http%3A%2F%2Fblog.zerial.org%2Flinux%2Fscript-para-escanear-la-red-en-busca-de-servidores-y-servicios%2F&amp;linkname=Script%20para%20escanear%20la%20red%20en%20busca%20de%20servidores%20y%20servicios" title="Facebook" rel="nofollow" target="_blank"><img src="http://blog.zerial.org/wp-content/plugins/add-to-any/icons/facebook.png" width="16" height="16" alt="Facebook"/></a> <a href="http://www.addtoany.com/add_to/google_bookmarks?linkurl=http%3A%2F%2Fblog.zerial.org%2Flinux%2Fscript-para-escanear-la-red-en-busca-de-servidores-y-servicios%2F&amp;linkname=Script%20para%20escanear%20la%20red%20en%20busca%20de%20servidores%20y%20servicios" title="Google Bookmarks" rel="nofollow" target="_blank"><img src="http://blog.zerial.org/wp-content/plugins/add-to-any/icons/google.png" width="16" height="16" alt="Google Bookmarks"/></a> <a href="http://www.addtoany.com/add_to/friendfeed?linkurl=http%3A%2F%2Fblog.zerial.org%2Flinux%2Fscript-para-escanear-la-red-en-busca-de-servidores-y-servicios%2F&amp;linkname=Script%20para%20escanear%20la%20red%20en%20busca%20de%20servidores%20y%20servicios" title="FriendFeed" rel="nofollow" target="_blank"><img src="http://blog.zerial.org/wp-content/plugins/add-to-any/icons/friendfeed.png" width="16" height="16" alt="FriendFeed"/></a> <a href="http://www.addtoany.com/add_to/digg?linkurl=http%3A%2F%2Fblog.zerial.org%2Flinux%2Fscript-para-escanear-la-red-en-busca-de-servidores-y-servicios%2F&amp;linkname=Script%20para%20escanear%20la%20red%20en%20busca%20de%20servidores%20y%20servicios" title="Digg" rel="nofollow" target="_blank"><img src="http://blog.zerial.org/wp-content/plugins/add-to-any/icons/digg.png" width="16" height="16" alt="Digg"/></a> <a href="http://www.addtoany.com/add_to/slashdot?linkurl=http%3A%2F%2Fblog.zerial.org%2Flinux%2Fscript-para-escanear-la-red-en-busca-de-servidores-y-servicios%2F&amp;linkname=Script%20para%20escanear%20la%20red%20en%20busca%20de%20servidores%20y%20servicios" title="Slashdot" rel="nofollow" target="_blank"><img src="http://blog.zerial.org/wp-content/plugins/add-to-any/icons/slashdot.png" width="16" height="16" alt="Slashdot"/></a> <a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fblog.zerial.org%2Flinux%2Fscript-para-escanear-la-red-en-busca-de-servidores-y-servicios%2F&amp;linkname=Script%20para%20escanear%20la%20red%20en%20busca%20de%20servidores%20y%20servicios">Compartir/Guardar</a> </p>]]></content:encoded>
			<wfw:commentRss>http://blog.zerial.org/linux/script-para-escanear-la-red-en-busca-de-servidores-y-servicios/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>SSH, Port Forwarding y Tunneling: Saltarse las restricciones del firewall</title>
		<link>http://blog.zerial.org/seguridad/ssh-port-forwarding-y-tunneling-saltarse-las-restricciones-del-firewall/</link>
		<comments>http://blog.zerial.org/seguridad/ssh-port-forwarding-y-tunneling-saltarse-las-restricciones-del-firewall/#comments</comments>
		<pubDate>Sat, 06 Feb 2010 19:59:04 +0000</pubDate>
		<dc:creator>Zerial</dc:creator>
				<category><![CDATA[Documentacion]]></category>
		<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[Hacking]]></category>
		<category><![CDATA[Seguridad]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[bypass]]></category>
		<category><![CDATA[firewall]]></category>
		<category><![CDATA[network]]></category>
		<category><![CDATA[port forwarding]]></category>
		<category><![CDATA[redes]]></category>
		<category><![CDATA[ssh]]></category>
		<category><![CDATA[tunneling]]></category>

		<guid isPermaLink="false">http://blog.zerial.org/?p=1502</guid>
		<description><![CDATA[En mi nuevo lugar de trabajo, misteriosamente está bloqueado por el firewall, entre otras cosas, la salida al puerto 25 de cualquier servidor. Desde mi portatil uso el cliente de correo Thunderbird conectandose a distintas cuentas  de correo que tengo alojadas en Google Apps asi que no podía quedarme sin revisar mis cuentas de correo, [...]]]></description>
			<content:encoded><![CDATA[<p>En mi nuevo lugar de trabajo, misteriosamente está bloqueado por el firewall, entre otras cosas, la salida al puerto 25 de cualquier servidor. Desde mi portatil uso el cliente de correo Thunderbird conectandose a distintas cuentas  de correo que tengo alojadas en Google Apps asi que no podía quedarme sin revisar mis cuentas de correo, por lo que tuve que buscar la forma de hacerlo.<br />
<a href="http://blog.zerial.org/wp-content/uploads/2010/02/firwall.png"><img class="alignleft size-medium wp-image-1503" title="firwall" src="http://blog.zerial.org/wp-content/uploads/2010/02/firwall-300x167.png" alt="" width="250" height="139" /></a>Lo primero que se me vino a la cabeza es hacer un port forwarding con ssh usando un servidor externo, sabiendo que tengo el puerto 22 desbloqueado para salir. Entonces, accedería a cualquier servicio corriendo en el puerto 25 mediante un redireccionamiento a traves del puerto 22. Con esta técnica podemos saltarons el firewall y todas las restricciones.</p>
<p><span id="more-1502"></span></p>
<p>El port forwarding, según el mismo manual de ssh, corresponde a:</p>
<blockquote><p>Specifies that the given port on the local (client) host is to be<br />
forwarded to the given host and port on the remote side.  This<br />
works by allocating a socket to listen to port on the local side,<br />
optionally bound to the specified bind_address.  Whenever a con-<br />
nection is made to this port, the connection is forwarded over<br />
the secure channel, and a connection is made to host port<br />
hostport from the remote machine.	Port forwardings can also be<br />
specified in the configuration file.  IPv6 addresses can be spec-<br />
ified with an alternative syntax:<br />
[bind_address/]port/host/hostport or by enclosing the address in<br />
square brackets.  Only the superuser can forward privileged<br />
ports.  By default, the local port is bound in accordance with<br />
the GatewayPorts setting.	However, an explicit bind_address may<br />
be used to bind the connection to a specific address.  The<br />
bind_address of &#8220;localhost&#8221; indicates that the listening port<br />
be bound for local use only, while an empty address or &#8216;*&#8217; indi-<br />
cates that the port should be available from all interfaces.</p></blockquote>
<p>En simples palabras, lo que se hace, es habilitar un puerto local, por el cual se hara un redireccionamiento, a traves de ssh y el servidor remoto, hacia nuestro destino.</p>
<p><a href="http://blog.zerial.org/wp-content/uploads/2010/02/SSH-Portforwarding.png"><img class="aligncenter size-full wp-image-1507" title="SSH-Portforwarding" src="http://blog.zerial.org/wp-content/uploads/2010/02/SSH-Portforwarding.png" alt="" width="628" height="472" /></a></p>
<h2>Paso a paso</h2>
<p>Mapear la dirección de destino a nuestor localhost, en mi caso (y como ejemplo) usaré <strong>smtp.gmail.com</strong>. Debemos editar el <em>/etc/hosts</em> y agregar a la línea de 127.0.0.1 nuestro destino:<br />
<code>127.0.0.1		localhost.localdomain	localhost smtp.gmail.com</code><br />
Verificamos:<br />
<code> $ ping -c1 smtp.gmail.com<br />
PING localhost.localdomain (127.0.0.1) 56(84) bytes of data.<br />
64 bytes from localhost.localdomain (127.0.0.1): icmp_seq=1 ttl=64 time=0.038 ms</code><br />
Ahora, para nuestro sistema, el host smtp.gmail.com está apuntando a nuestra misma máquina.</p>
<p>Ahora, hacemos el port forwading usando el parámetro <strong>-L</strong> de la siguiente forma:<br />
<code># ssh -L25:smtp.gmail.com:25 zerial@mydomain.org</code></p>
<p>Una véz logeados, ya va a estar hecho el redireccionamiento de puerto. Lo que hacemos con esa linea es decirle que todo el trafico desde <strong>localhost:25</strong> lo lleve a traves de <strong>mydomain.org:22</strong> a nuestro destino <strong>smtp.gmail.com:25</strong>.</p>
<p>Ahora realizamos la prueba, para ver si realmente tenemos salida a <strong>smtp.gmail.com:25</strong>:<br />
<code>$ telnet localhost 25<br />
Trying 127.0.0.1...<br />
Connected to localhost.<br />
Escape character is '^]'.<br />
220 mx.google.com ESMTP 42sm25383892vws.12</code></p>
<p>Listo. Obviamente, el Firewall no podrá bloquear el tráfico de <em>localhost</em> y tampoco el de ssh, ya que va <strong>cifrado</strong>.</p>
<p><a href="http://www.addtoany.com/add_to/delicious?linkurl=http%3A%2F%2Fblog.zerial.org%2Fseguridad%2Fssh-port-forwarding-y-tunneling-saltarse-las-restricciones-del-firewall%2F&amp;linkname=SSH%2C%20Port%20Forwarding%20y%20Tunneling%3A%20Saltarse%20las%20restricciones%20del%20firewall" title="Delicious" rel="nofollow" target="_blank"><img src="http://blog.zerial.org/wp-content/plugins/add-to-any/icons/delicious.png" width="16" height="16" alt="Delicious"/></a> <a href="http://www.addtoany.com/add_to/twitter?linkurl=http%3A%2F%2Fblog.zerial.org%2Fseguridad%2Fssh-port-forwarding-y-tunneling-saltarse-las-restricciones-del-firewall%2F&amp;linkname=SSH%2C%20Port%20Forwarding%20y%20Tunneling%3A%20Saltarse%20las%20restricciones%20del%20firewall" title="Twitter" rel="nofollow" target="_blank"><img src="http://blog.zerial.org/wp-content/plugins/add-to-any/icons/twitter.png" width="16" height="16" alt="Twitter"/></a> <a href="http://www.addtoany.com/add_to/facebook?linkurl=http%3A%2F%2Fblog.zerial.org%2Fseguridad%2Fssh-port-forwarding-y-tunneling-saltarse-las-restricciones-del-firewall%2F&amp;linkname=SSH%2C%20Port%20Forwarding%20y%20Tunneling%3A%20Saltarse%20las%20restricciones%20del%20firewall" title="Facebook" rel="nofollow" target="_blank"><img src="http://blog.zerial.org/wp-content/plugins/add-to-any/icons/facebook.png" width="16" height="16" alt="Facebook"/></a> <a href="http://www.addtoany.com/add_to/google_bookmarks?linkurl=http%3A%2F%2Fblog.zerial.org%2Fseguridad%2Fssh-port-forwarding-y-tunneling-saltarse-las-restricciones-del-firewall%2F&amp;linkname=SSH%2C%20Port%20Forwarding%20y%20Tunneling%3A%20Saltarse%20las%20restricciones%20del%20firewall" title="Google Bookmarks" rel="nofollow" target="_blank"><img src="http://blog.zerial.org/wp-content/plugins/add-to-any/icons/google.png" width="16" height="16" alt="Google Bookmarks"/></a> <a href="http://www.addtoany.com/add_to/friendfeed?linkurl=http%3A%2F%2Fblog.zerial.org%2Fseguridad%2Fssh-port-forwarding-y-tunneling-saltarse-las-restricciones-del-firewall%2F&amp;linkname=SSH%2C%20Port%20Forwarding%20y%20Tunneling%3A%20Saltarse%20las%20restricciones%20del%20firewall" title="FriendFeed" rel="nofollow" target="_blank"><img src="http://blog.zerial.org/wp-content/plugins/add-to-any/icons/friendfeed.png" width="16" height="16" alt="FriendFeed"/></a> <a href="http://www.addtoany.com/add_to/digg?linkurl=http%3A%2F%2Fblog.zerial.org%2Fseguridad%2Fssh-port-forwarding-y-tunneling-saltarse-las-restricciones-del-firewall%2F&amp;linkname=SSH%2C%20Port%20Forwarding%20y%20Tunneling%3A%20Saltarse%20las%20restricciones%20del%20firewall" title="Digg" rel="nofollow" target="_blank"><img src="http://blog.zerial.org/wp-content/plugins/add-to-any/icons/digg.png" width="16" height="16" alt="Digg"/></a> <a href="http://www.addtoany.com/add_to/slashdot?linkurl=http%3A%2F%2Fblog.zerial.org%2Fseguridad%2Fssh-port-forwarding-y-tunneling-saltarse-las-restricciones-del-firewall%2F&amp;linkname=SSH%2C%20Port%20Forwarding%20y%20Tunneling%3A%20Saltarse%20las%20restricciones%20del%20firewall" title="Slashdot" rel="nofollow" target="_blank"><img src="http://blog.zerial.org/wp-content/plugins/add-to-any/icons/slashdot.png" width="16" height="16" alt="Slashdot"/></a> <a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fblog.zerial.org%2Fseguridad%2Fssh-port-forwarding-y-tunneling-saltarse-las-restricciones-del-firewall%2F&amp;linkname=SSH%2C%20Port%20Forwarding%20y%20Tunneling%3A%20Saltarse%20las%20restricciones%20del%20firewall">Compartir/Guardar</a> </p>]]></content:encoded>
			<wfw:commentRss>http://blog.zerial.org/seguridad/ssh-port-forwarding-y-tunneling-saltarse-las-restricciones-del-firewall/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Emulación de consolas en GNU/Linux: NeoGeo, MAME, SNES y PSX</title>
		<link>http://blog.zerial.org/linux/emulacion-de-consolas-en-gnulinux-neogeo-mame-snes-y-psx/</link>
		<comments>http://blog.zerial.org/linux/emulacion-de-consolas-en-gnulinux-neogeo-mame-snes-y-psx/#comments</comments>
		<pubDate>Fri, 15 Jan 2010 01:55:11 +0000</pubDate>
		<dc:creator>Zerial</dc:creator>
				<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[Mis cosas]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[emuladores]]></category>
		<category><![CDATA[gngeo]]></category>
		<category><![CDATA[gnu/linux]]></category>
		<category><![CDATA[juegos]]></category>
		<category><![CDATA[mame]]></category>
		<category><![CDATA[neogeo]]></category>
		<category><![CDATA[play]]></category>
		<category><![CDATA[playstation]]></category>
		<category><![CDATA[ps1]]></category>
		<category><![CDATA[psx]]></category>
		<category><![CDATA[qmc2]]></category>
		<category><![CDATA[snes]]></category>
		<category><![CDATA[super nintendo]]></category>
		<category><![CDATA[xgngeo]]></category>
		<category><![CDATA[zsnes]]></category>

		<guid isPermaLink="false">http://blog.zerial.org/?p=1387</guid>
		<description><![CDATA[No soy muy amante de los juegos pero debo reconocer que hay algunos que si me gustan, especialmente los de consola como NeoGeo, Súper Nintendo y Play 1. En busca de entretención y de distracción, el otro día me compré un joystick que me costó CLP$1.600 (unos USD$3) Y luego me puse a probar distintos [...]]]></description>
			<content:encoded><![CDATA[<p>No soy muy amante de los juegos pero debo reconocer que hay algunos que si me gustan, especialmente los de consola como <a href="http://es.wikipedia.org/wiki/Neogeo" target="_blank">NeoGeo</a>, <a href="http://es.wikipedia.org/wiki/Snes" target="_blank">Súper Nintendo</a> y <a href="http://es.wikipedia.org/wiki/PSX" target="_blank">Play 1</a>. En busca de entretención y de distracción, el otro día me compré un <em>joystick</em> que me costó CLP$1.600 (unos USD$3)</p>
<p><img class="aligncenter size-full wp-image-1390" title="joystick" src="http://blog.zerial.org/wp-content/uploads/2010/01/joystick1.png" alt="" width="400" height="303" /></p>
<p>Y luego me puse a probar distintos emuladores y juegos de consolas: NeoGeo, MAME, SNES, N64, PSX, etc.</p>
<p>Para emular juegos de <strong>NeoGeo</strong> tenemos el <em>gngeo</em> y el <em>mame-sdl</em>, para <strong>snes</strong> el famoso <em>zsnes</em>, para <strong>n64</strong> <em>mupen64</em> y para <strong>psx</strong> el <em>epsxe</em>.<br />
A continuación, una pequeña muestra de cada emulador corriendo algún juego en especial.</p>
<p><span id="more-1387"></span></p>
<p><strong>Primero </strong>les voy a mostrar gngeo con su frontend XGngeo</p>
<p><a href="http://blog.zerial.org/wp-content/uploads/2010/01/xgngeo.png"><img class="aligncenter size-full wp-image-1393" title="xgngeo" src="http://blog.zerial.org/wp-content/uploads/2010/01/xgngeo.png" alt="" width="376" height="245" /></a></p>
<p>Para descargarlo pueden encontarlo en su sitio oficial <a href="http://gngeo.berlios.de/" target="_blank">http://gngeo.berlios.de/</a> o bien buscarlo en los repositorios de la distribución que estén usando. Pueden descargar el frontend XGnGeo desde aquí: <a href="http://www.choplair.org/?XGngeo" target="_blank">http://www.choplair.org/?XGngeo</a></p>
<p>Con el emulador de MAME puedes jugar tambien los juegos de neogeo. Para emular mame tienes el emulador por línea de comando &#8220;<strong>mame-sdl</strong>&#8221; y el frontend llamado <strong>qmc2</strong>.</p>
<p><center><a href="http://blog.zerial.org/wp-content/uploads/2010/01/qmc2.png"><img class="alignnone size-medium wp-image-1408" title="qmc2" src="http://blog.zerial.org/wp-content/uploads/2010/01/qmc2-300x197.png" alt="" width="300" height="197" /></a> <a href="http://blog.zerial.org/wp-content/uploads/2010/01/qmc21.png"><img class="alignnone size-medium wp-image-1409" title="qmc2" src="http://blog.zerial.org/wp-content/uploads/2010/01/qmc21-300x197.png" alt="" width="300" height="197" /></a></p>
<p><a href="http://blog.zerial.org/wp-content/uploads/2010/01/xgngeo_kof.png"><img class="size-medium wp-image-1395 alignnone" title="xgngeo_kof" src="http://blog.zerial.org/wp-content/uploads/2010/01/xgngeo_kof-300x187.png" alt="" width="300" height="187" /></a> <a href="http://blog.zerial.org/wp-content/uploads/2010/01/xgngeo_kof2.png"><img class="size-medium wp-image-1396 alignnone" title="xgngeo_kof2" src="http://blog.zerial.org/wp-content/uploads/2010/01/xgngeo_kof2-300x187.png" alt="" width="300" height="187" /></a></center></p>
<p><strong>Para emular</strong> súper nintendo, uso el conocido zsnes (muuuuy antiguo), que está en la mayoría de los repositorios de las distribuciónes GNU/Linux y también lo podemos encontrar en <a href="http://www.zsnes.com/" target="_blank">zsnes.com</a>.</p>
<p><a href="http://blog.zerial.org/wp-content/uploads/2010/01/zsnes.png"><img class="aligncenter size-full wp-image-1399" title="zsnes" src="http://blog.zerial.org/wp-content/uploads/2010/01/zsnes.png" alt="" width="512" height="448" /></a></p>
<p>Yo recuerdo haber usado este mismo emulador hace muchos años atrás, era uno de mis preferidos, con zsnes pasé varias horas frente al pc jugando. El emulador permite configurar hasta 5 players y además, permite jugar en línea.</p>
<p><center><a href="http://blog.zerial.org/wp-content/uploads/2010/01/zsnes_dkc1.png"><img class="alignnone size-medium wp-image-1400" title="zsnes_dkc1" src="http://blog.zerial.org/wp-content/uploads/2010/01/zsnes_dkc1-300x187.png" alt="" width="300" height="187" /></a> <a href="http://blog.zerial.org/wp-content/uploads/2010/01/zsnes_dkc2.png"><img class="alignnone size-medium wp-image-1401" title="zsnes_dkc2" src="http://blog.zerial.org/wp-content/uploads/2010/01/zsnes_dkc2-300x187.png" alt="" width="300" height="187" /></a></center></p>
<p><center><a href="http://blog.zerial.org/wp-content/uploads/2010/01/zsnes_killer1.png"><img class="alignnone size-medium wp-image-1402" title="zsnes_killer1" src="http://blog.zerial.org/wp-content/uploads/2010/01/zsnes_killer1-300x187.png" alt="" width="300" height="187" /></a> <a href="http://blog.zerial.org/wp-content/uploads/2010/01/zsnes_killer2.png"><img class="alignnone size-medium wp-image-1403" title="zsnes_killer2" src="http://blog.zerial.org/wp-content/uploads/2010/01/zsnes_killer2-300x187.png" alt="" width="300" height="187" /></a></center></p>
<p><strong>Para</strong> PlayStation 1 (PSOne, PSX) uso el <strong>epsxe</strong>. Este emulador es un poco complicado de instalar, necesita un plugin para cada cosa. Por ejemplo, un plugin de video y otro de sonido, aunque generalmente puedes encontrar el emulador con todos sus restos dentro del mismo repositorio. Por ejemplo, en Archlinux lo puedes descargar e instalar <a href="http://aur.archlinux.org/packages.php?O=0&amp;K=epsxe&amp;do_Search=Ir" target="_blank">directamente de AUR</a>. Luego debes <em>intrusear</em> un poco la configuración hasta llegar a la más óptima para tu hardware. En mi caso, me uso este emulador simplemente para jugar <a href="http://en.wikipedia.org/wiki/Silent_Hill_1" target="_blank">Silent Hill 1</a>.</p>
<p><a href="http://blog.zerial.org/wp-content/uploads/2010/01/epsxe.png"><img class="aligncenter size-full wp-image-1405" title="epsxe" src="http://blog.zerial.org/wp-content/uploads/2010/01/epsxe.png" alt="" width="288" height="236" /></a></p>
<p><center><a href="http://blog.zerial.org/wp-content/uploads/2010/01/epsxe_silenthill1.png"><img class="alignnone size-medium wp-image-1406" title="epsxe_silenthill1" src="http://blog.zerial.org/wp-content/uploads/2010/01/epsxe_silenthill1-300x187.png" alt="" width="300" height="187" /></a> <a href="http://blog.zerial.org/wp-content/uploads/2010/01/epsxe_silenthill2.png"><img class="alignnone size-medium wp-image-1407" title="epsxe_silenthill2" src="http://blog.zerial.org/wp-content/uploads/2010/01/epsxe_silenthill2-300x187.png" alt="" width="300" height="187" /></a></center></p>
<p><a href="http://www.addtoany.com/add_to/delicious?linkurl=http%3A%2F%2Fblog.zerial.org%2Flinux%2Femulacion-de-consolas-en-gnulinux-neogeo-mame-snes-y-psx%2F&amp;linkname=Emulaci%C3%B3n%20de%20consolas%20en%20GNU%2FLinux%3A%20NeoGeo%2C%20MAME%2C%20SNES%20y%20PSX" title="Delicious" rel="nofollow" target="_blank"><img src="http://blog.zerial.org/wp-content/plugins/add-to-any/icons/delicious.png" width="16" height="16" alt="Delicious"/></a> <a href="http://www.addtoany.com/add_to/twitter?linkurl=http%3A%2F%2Fblog.zerial.org%2Flinux%2Femulacion-de-consolas-en-gnulinux-neogeo-mame-snes-y-psx%2F&amp;linkname=Emulaci%C3%B3n%20de%20consolas%20en%20GNU%2FLinux%3A%20NeoGeo%2C%20MAME%2C%20SNES%20y%20PSX" title="Twitter" rel="nofollow" target="_blank"><img src="http://blog.zerial.org/wp-content/plugins/add-to-any/icons/twitter.png" width="16" height="16" alt="Twitter"/></a> <a href="http://www.addtoany.com/add_to/facebook?linkurl=http%3A%2F%2Fblog.zerial.org%2Flinux%2Femulacion-de-consolas-en-gnulinux-neogeo-mame-snes-y-psx%2F&amp;linkname=Emulaci%C3%B3n%20de%20consolas%20en%20GNU%2FLinux%3A%20NeoGeo%2C%20MAME%2C%20SNES%20y%20PSX" title="Facebook" rel="nofollow" target="_blank"><img src="http://blog.zerial.org/wp-content/plugins/add-to-any/icons/facebook.png" width="16" height="16" alt="Facebook"/></a> <a href="http://www.addtoany.com/add_to/google_bookmarks?linkurl=http%3A%2F%2Fblog.zerial.org%2Flinux%2Femulacion-de-consolas-en-gnulinux-neogeo-mame-snes-y-psx%2F&amp;linkname=Emulaci%C3%B3n%20de%20consolas%20en%20GNU%2FLinux%3A%20NeoGeo%2C%20MAME%2C%20SNES%20y%20PSX" title="Google Bookmarks" rel="nofollow" target="_blank"><img src="http://blog.zerial.org/wp-content/plugins/add-to-any/icons/google.png" width="16" height="16" alt="Google Bookmarks"/></a> <a href="http://www.addtoany.com/add_to/friendfeed?linkurl=http%3A%2F%2Fblog.zerial.org%2Flinux%2Femulacion-de-consolas-en-gnulinux-neogeo-mame-snes-y-psx%2F&amp;linkname=Emulaci%C3%B3n%20de%20consolas%20en%20GNU%2FLinux%3A%20NeoGeo%2C%20MAME%2C%20SNES%20y%20PSX" title="FriendFeed" rel="nofollow" target="_blank"><img src="http://blog.zerial.org/wp-content/plugins/add-to-any/icons/friendfeed.png" width="16" height="16" alt="FriendFeed"/></a> <a href="http://www.addtoany.com/add_to/digg?linkurl=http%3A%2F%2Fblog.zerial.org%2Flinux%2Femulacion-de-consolas-en-gnulinux-neogeo-mame-snes-y-psx%2F&amp;linkname=Emulaci%C3%B3n%20de%20consolas%20en%20GNU%2FLinux%3A%20NeoGeo%2C%20MAME%2C%20SNES%20y%20PSX" title="Digg" rel="nofollow" target="_blank"><img src="http://blog.zerial.org/wp-content/plugins/add-to-any/icons/digg.png" width="16" height="16" alt="Digg"/></a> <a href="http://www.addtoany.com/add_to/slashdot?linkurl=http%3A%2F%2Fblog.zerial.org%2Flinux%2Femulacion-de-consolas-en-gnulinux-neogeo-mame-snes-y-psx%2F&amp;linkname=Emulaci%C3%B3n%20de%20consolas%20en%20GNU%2FLinux%3A%20NeoGeo%2C%20MAME%2C%20SNES%20y%20PSX" title="Slashdot" rel="nofollow" target="_blank"><img src="http://blog.zerial.org/wp-content/plugins/add-to-any/icons/slashdot.png" width="16" height="16" alt="Slashdot"/></a> <a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fblog.zerial.org%2Flinux%2Femulacion-de-consolas-en-gnulinux-neogeo-mame-snes-y-psx%2F&amp;linkname=Emulaci%C3%B3n%20de%20consolas%20en%20GNU%2FLinux%3A%20NeoGeo%2C%20MAME%2C%20SNES%20y%20PSX">Compartir/Guardar</a> </p>]]></content:encoded>
			<wfw:commentRss>http://blog.zerial.org/linux/emulacion-de-consolas-en-gnulinux-neogeo-mame-snes-y-psx/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Bottom Stack en Dynamic Window Manager (DWM)</title>
		<link>http://blog.zerial.org/linux/bottom-stack-en-dynamic-window-manager-dwm/</link>
		<comments>http://blog.zerial.org/linux/bottom-stack-en-dynamic-window-manager-dwm/#comments</comments>
		<pubDate>Thu, 07 Jan 2010 00:10:49 +0000</pubDate>
		<dc:creator>Zerial</dc:creator>
				<category><![CDATA[Documentacion]]></category>
		<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[dwm]]></category>
		<category><![CDATA[dynamic window manager]]></category>
		<category><![CDATA[gnu/linux]]></category>

		<guid isPermaLink="false">http://blog.zerial.org/?p=1358</guid>
		<description><![CDATA[Hace meses que me decidí por usar DWM y de a poco voy teniendo distintas necesidades, por lo que he ido configurando poco a poco el gestor. Ultimamente, me dieron ganas de querer ordenar las ventanas de forma horizontal y revisando el sitio de DWM he encontrado el llamado &#8220;Bottom Stack&#8221;, que me ayudará a [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-1359" style="margin: 4px;" title="dwm" src="http://blog.zerial.org/wp-content/uploads/2010/01/dwm.png" alt="" width="96" height="40" />Hace meses que me decidí por usar DWM y de a poco voy teniendo distintas necesidades, por lo que he ido configurando poco a poco el gestor. Ultimamente, me dieron ganas de querer ordenar las ventanas de forma horizontal y revisando el sitio de DWM he encontrado el llamado &#8220;Bottom Stack&#8221;, que me ayudará a cumplir mi propósito.</p>
<p><a href="http://blog.zerial.org/wp-content/uploads/2010/01/dwm_ad.png"><img class="aligncenter size-full wp-image-1361" title="dwm_ad" src="http://blog.zerial.org/wp-content/uploads/2010/01/dwm_ad.png" alt="" width="519" height="158" /></a></p>
<p>Para lograrlo, simplemente tenemos que agregar un par de líneas al <em>config.h</em> y volver a compilarlo.</p>
<p><span id="more-1358"></span></p>
<p>Debemos descargar los ficheros <a href="http://dwm.suckless.org/patches/bstack.c">bstack.c</a> y <a href="http://dwm.suckless.org/patches/bstackhoriz.c">bstackhoriz.c</a> y agregar las siguientes líneas a nuestro fichero de configuración <em>config.h</em>, despues de la definición de la variable <strong>mfact</strong> y antes de la definición de <strong>layouts</strong>:</p>
<pre name="code" class="c">
#include "bstack.c"
#include "bstackhoriz.c"
</pre>
<p>Y dentro de la definición de <strong>layouts</strong> debemos agregar:</p>
<pre name="code" class="c">
{ "TTT",      bstack },
{ "===",      bstackhoriz },
</pre>
<p>El fichero <em>config.h</em> se debería ver mas o menos así:</p>
<pre name="code" class="c">
[...]

/* layout(s) */
static const float mfact      = 0.55; /* factor of master area size [0.05..0.95] */
static const Bool resizehints = True; /* False means respect size hints in tiled resizals */

#include "bstack.c"
#include "bstackhoriz.c"

static const Layout layouts[] = {
        /* symbol     arrange function */
        { "TTT",      bstack },
        { "[]=",      tile },    /* first entry is default */
        { "><>",      NULL },    /* no layout function means floating behavior */
        { "[M]",      monocle },
        { "===",      bstackhoriz },
};

/* key definitions */
#define MODKEY Mod1Mask
#define TAGKEYS(KEY,TAG) \

[...]
</pre>
<p><strong>Imágenes:</strong></p>
<p><a href="http://blog.zerial.org/wp-content/uploads/2010/01/dwm_showTILE.png"><img src="http://blog.zerial.org/wp-content/uploads/2010/01/dwm_showTILE-300x187.png" alt="" title="dwm_showTILE" width="300" height="187" class="aligncenter size-medium wp-image-1366" /></a></p>
<p><a href="http://blog.zerial.org/wp-content/uploads/2010/01/dwm_showTTT.png"><img src="http://blog.zerial.org/wp-content/uploads/2010/01/dwm_showTTT-300x187.png" alt="" title="dwm_showTTT" width="300" height="187" class="aligncenter size-medium wp-image-1367" /></a></p>
<p>Pueden encontrar el artículo original en el siguiente link:<br />
<a target="_blank" href="http://dwm.suckless.org/patches/bottom_stack">http://dwm.suckless.org/patches/bottom_stack</a></p>
<p><a href="http://www.addtoany.com/add_to/delicious?linkurl=http%3A%2F%2Fblog.zerial.org%2Flinux%2Fbottom-stack-en-dynamic-window-manager-dwm%2F&amp;linkname=Bottom%20Stack%20en%20Dynamic%20Window%20Manager%20%28DWM%29" title="Delicious" rel="nofollow" target="_blank"><img src="http://blog.zerial.org/wp-content/plugins/add-to-any/icons/delicious.png" width="16" height="16" alt="Delicious"/></a> <a href="http://www.addtoany.com/add_to/twitter?linkurl=http%3A%2F%2Fblog.zerial.org%2Flinux%2Fbottom-stack-en-dynamic-window-manager-dwm%2F&amp;linkname=Bottom%20Stack%20en%20Dynamic%20Window%20Manager%20%28DWM%29" title="Twitter" rel="nofollow" target="_blank"><img src="http://blog.zerial.org/wp-content/plugins/add-to-any/icons/twitter.png" width="16" height="16" alt="Twitter"/></a> <a href="http://www.addtoany.com/add_to/facebook?linkurl=http%3A%2F%2Fblog.zerial.org%2Flinux%2Fbottom-stack-en-dynamic-window-manager-dwm%2F&amp;linkname=Bottom%20Stack%20en%20Dynamic%20Window%20Manager%20%28DWM%29" title="Facebook" rel="nofollow" target="_blank"><img src="http://blog.zerial.org/wp-content/plugins/add-to-any/icons/facebook.png" width="16" height="16" alt="Facebook"/></a> <a href="http://www.addtoany.com/add_to/google_bookmarks?linkurl=http%3A%2F%2Fblog.zerial.org%2Flinux%2Fbottom-stack-en-dynamic-window-manager-dwm%2F&amp;linkname=Bottom%20Stack%20en%20Dynamic%20Window%20Manager%20%28DWM%29" title="Google Bookmarks" rel="nofollow" target="_blank"><img src="http://blog.zerial.org/wp-content/plugins/add-to-any/icons/google.png" width="16" height="16" alt="Google Bookmarks"/></a> <a href="http://www.addtoany.com/add_to/friendfeed?linkurl=http%3A%2F%2Fblog.zerial.org%2Flinux%2Fbottom-stack-en-dynamic-window-manager-dwm%2F&amp;linkname=Bottom%20Stack%20en%20Dynamic%20Window%20Manager%20%28DWM%29" title="FriendFeed" rel="nofollow" target="_blank"><img src="http://blog.zerial.org/wp-content/plugins/add-to-any/icons/friendfeed.png" width="16" height="16" alt="FriendFeed"/></a> <a href="http://www.addtoany.com/add_to/digg?linkurl=http%3A%2F%2Fblog.zerial.org%2Flinux%2Fbottom-stack-en-dynamic-window-manager-dwm%2F&amp;linkname=Bottom%20Stack%20en%20Dynamic%20Window%20Manager%20%28DWM%29" title="Digg" rel="nofollow" target="_blank"><img src="http://blog.zerial.org/wp-content/plugins/add-to-any/icons/digg.png" width="16" height="16" alt="Digg"/></a> <a href="http://www.addtoany.com/add_to/slashdot?linkurl=http%3A%2F%2Fblog.zerial.org%2Flinux%2Fbottom-stack-en-dynamic-window-manager-dwm%2F&amp;linkname=Bottom%20Stack%20en%20Dynamic%20Window%20Manager%20%28DWM%29" title="Slashdot" rel="nofollow" target="_blank"><img src="http://blog.zerial.org/wp-content/plugins/add-to-any/icons/slashdot.png" width="16" height="16" alt="Slashdot"/></a> <a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fblog.zerial.org%2Flinux%2Fbottom-stack-en-dynamic-window-manager-dwm%2F&amp;linkname=Bottom%20Stack%20en%20Dynamic%20Window%20Manager%20%28DWM%29">Compartir/Guardar</a> </p>]]></content:encoded>
			<wfw:commentRss>http://blog.zerial.org/linux/bottom-stack-en-dynamic-window-manager-dwm/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Error de actualización desde WordPress 2.8 a 2.9</title>
		<link>http://blog.zerial.org/tips/error-de-actualizacion-desde-wordpress-2-8-a-2-9/</link>
		<comments>http://blog.zerial.org/tips/error-de-actualizacion-desde-wordpress-2-8-a-2-9/#comments</comments>
		<pubDate>Sat, 19 Dec 2009 20:51:13 +0000</pubDate>
		<dc:creator>Zerial</dc:creator>
				<category><![CDATA[Noticias]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[actualizacion]]></category>
		<category><![CDATA[error]]></category>
		<category><![CDATA[wordpress]]></category>
		<category><![CDATA[wp]]></category>

		<guid isPermaLink="false">http://blog.zerial.org/?p=1272</guid>
		<description><![CDATA[Hace un rato que actualicé la versión de wordpress de mi blog junto a otros wordpress que administro, pero sólo mi versión tuvo un problema. Me mostraba todas las páginas en blanco. Al parecer no soy el único que tuvo ese problema, ya que puedo ver en distintos sitios a mucha gente que le ocurre [...]]]></description>
			<content:encoded><![CDATA[<p><img class="aligncenter size-full wp-image-1273" title="wordpress-250x250" src="http://blog.zerial.org/wp-content/uploads/2009/12/wordpress-250x250.png" alt="" width="250" height="250" /></p>
<p>Hace un rato que actualicé la versión de wordpress de mi blog junto a otros wordpress que administro, pero sólo mi versión tuvo un problema. Me mostraba todas las páginas en blanco. Al parecer no soy el único que tuvo ese problema, ya que puedo ver en distintos sitios a mucha gente que le ocurre lo mismo:</p>
<p><a href="http://es.wordpress.org/2009/12/19/error-de-pagina-en-blanco-tras-actualizar" target="_blank">http://es.wordpress.org/2009/12/19/error-de-pagina-en-blanco-tras-actualizar</a><br />
<a href="http://ayudawordpress.com/wordpress-2-9-espanol-ya-disponible/" target="_blank">http://ayudawordpress.com/wordpress-2-9-espanol-ya-disponible/</a></p>
<p>Algunos hablan de hacer un <em>downgrade</em> y otros hablan de volver a instalar wordpress. Pues yo me di el trabajo de depurar el problema y determinar que archivo era el que estaba generando conflictos.<br />
Al actualizar a wordpress 2.9, al parecerno se está actualizando correctamente el fichero <strong>wp-includes/functions.php</strong>.</p>
<p><strong>¿Qué hice para solucionarlo?</strong><br />
Simplemente me descargué la nueva versión de WordPress (en español o en inglés) y copié el fichero hacia mi instalación.</p>
<p><strong>Actualización:</strong> <a href="http://wordpress.org/development/2009/12/wordpress-2-9-1-beta-1/" target="_blank">Se ha publicado una version 2.9.1 Beta 1 donde corrigen, entre otras cosas, éste error</a>.</p>
<p><a href="http://www.addtoany.com/add_to/delicious?linkurl=http%3A%2F%2Fblog.zerial.org%2Ftips%2Ferror-de-actualizacion-desde-wordpress-2-8-a-2-9%2F&amp;linkname=Error%20de%20actualizaci%C3%B3n%20desde%20WordPress%202.8%20a%202.9" title="Delicious" rel="nofollow" target="_blank"><img src="http://blog.zerial.org/wp-content/plugins/add-to-any/icons/delicious.png" width="16" height="16" alt="Delicious"/></a> <a href="http://www.addtoany.com/add_to/twitter?linkurl=http%3A%2F%2Fblog.zerial.org%2Ftips%2Ferror-de-actualizacion-desde-wordpress-2-8-a-2-9%2F&amp;linkname=Error%20de%20actualizaci%C3%B3n%20desde%20WordPress%202.8%20a%202.9" title="Twitter" rel="nofollow" target="_blank"><img src="http://blog.zerial.org/wp-content/plugins/add-to-any/icons/twitter.png" width="16" height="16" alt="Twitter"/></a> <a href="http://www.addtoany.com/add_to/facebook?linkurl=http%3A%2F%2Fblog.zerial.org%2Ftips%2Ferror-de-actualizacion-desde-wordpress-2-8-a-2-9%2F&amp;linkname=Error%20de%20actualizaci%C3%B3n%20desde%20WordPress%202.8%20a%202.9" title="Facebook" rel="nofollow" target="_blank"><img src="http://blog.zerial.org/wp-content/plugins/add-to-any/icons/facebook.png" width="16" height="16" alt="Facebook"/></a> <a href="http://www.addtoany.com/add_to/google_bookmarks?linkurl=http%3A%2F%2Fblog.zerial.org%2Ftips%2Ferror-de-actualizacion-desde-wordpress-2-8-a-2-9%2F&amp;linkname=Error%20de%20actualizaci%C3%B3n%20desde%20WordPress%202.8%20a%202.9" title="Google Bookmarks" rel="nofollow" target="_blank"><img src="http://blog.zerial.org/wp-content/plugins/add-to-any/icons/google.png" width="16" height="16" alt="Google Bookmarks"/></a> <a href="http://www.addtoany.com/add_to/friendfeed?linkurl=http%3A%2F%2Fblog.zerial.org%2Ftips%2Ferror-de-actualizacion-desde-wordpress-2-8-a-2-9%2F&amp;linkname=Error%20de%20actualizaci%C3%B3n%20desde%20WordPress%202.8%20a%202.9" title="FriendFeed" rel="nofollow" target="_blank"><img src="http://blog.zerial.org/wp-content/plugins/add-to-any/icons/friendfeed.png" width="16" height="16" alt="FriendFeed"/></a> <a href="http://www.addtoany.com/add_to/digg?linkurl=http%3A%2F%2Fblog.zerial.org%2Ftips%2Ferror-de-actualizacion-desde-wordpress-2-8-a-2-9%2F&amp;linkname=Error%20de%20actualizaci%C3%B3n%20desde%20WordPress%202.8%20a%202.9" title="Digg" rel="nofollow" target="_blank"><img src="http://blog.zerial.org/wp-content/plugins/add-to-any/icons/digg.png" width="16" height="16" alt="Digg"/></a> <a href="http://www.addtoany.com/add_to/slashdot?linkurl=http%3A%2F%2Fblog.zerial.org%2Ftips%2Ferror-de-actualizacion-desde-wordpress-2-8-a-2-9%2F&amp;linkname=Error%20de%20actualizaci%C3%B3n%20desde%20WordPress%202.8%20a%202.9" title="Slashdot" rel="nofollow" target="_blank"><img src="http://blog.zerial.org/wp-content/plugins/add-to-any/icons/slashdot.png" width="16" height="16" alt="Slashdot"/></a> <a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fblog.zerial.org%2Ftips%2Ferror-de-actualizacion-desde-wordpress-2-8-a-2-9%2F&amp;linkname=Error%20de%20actualizaci%C3%B3n%20desde%20WordPress%202.8%20a%202.9">Compartir/Guardar</a> </p>]]></content:encoded>
			<wfw:commentRss>http://blog.zerial.org/tips/error-de-actualizacion-desde-wordpress-2-8-a-2-9/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Acceder a una base de datos, que sólo permite conexiones desde localhost, remotamente</title>
		<link>http://blog.zerial.org/seguridad/acceder-a-una-base-de-datos-que-solo-permite-conexiones-desde-localhost-remotamente/</link>
		<comments>http://blog.zerial.org/seguridad/acceder-a-una-base-de-datos-que-solo-permite-conexiones-desde-localhost-remotamente/#comments</comments>
		<pubDate>Fri, 23 Oct 2009 01:06:02 +0000</pubDate>
		<dc:creator>Zerial</dc:creator>
				<category><![CDATA[Hacking]]></category>
		<category><![CDATA[Seguridad]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[auth bypass]]></category>
		<category><![CDATA[base de datos]]></category>
		<category><![CDATA[bypass]]></category>
		<category><![CDATA[hack]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[phpmyadmin]]></category>
		<category><![CDATA[phppgadmin]]></category>
		<category><![CDATA[postgres]]></category>
		<category><![CDATA[rce]]></category>
		<category><![CDATA[rci]]></category>
		<category><![CDATA[remote code execution]]></category>
		<category><![CDATA[remote file include]]></category>

		<guid isPermaLink="false">http://blog.zerial.org/?p=1047</guid>
		<description><![CDATA[Hace unos días recibí un correo preguntandome cómo acceder -remotamente- a un servidor de base de datos que sólo acepta conexiones desde localhost, sin tener phpMy/PgAdmin ni acceso &#8220;directo&#8221; (ssh) al servidor. Responderé publicamente la pregunta. La respuesta a primera vista sería &#8220;Es imposible, ya que sólo tiene permitido ingresar desde localhost y, generalmente, el puerto [...]]]></description>
			<content:encoded><![CDATA[<p>Hace unos días recibí un correo preguntandome cómo acceder <span lang="en-US">-remotamente- </span>a un servidor de base de datos que sólo acepta conexiones desde localhost, sin tener phpMy/PgAdmin ni acceso &#8220;directo&#8221; (ssh) al servidor. Responderé publicamente la pregunta.</p>
<p><img class="aligncenter size-full wp-image-1051" title="s_key" src="http://blog.zerial.org/wp-content/uploads/2009/10/s_key.jpg" alt="s_key" width="260" height="173" /></p>
<p>La respuesta a primera vista sería &#8220;<em>Es imposible, ya que sólo tiene permitido ingresar desde localhost y, generalmente, el puerto no está a la escucha de <strong>0.0.0.0</strong></em>&#8221; pero si vamos más allá y tenemos un poco de imaginación, podemos llegar a pensar de que si es posible; jugando un poco con los conceptos y aplicando distintas técnicas de penetración y de búsqueda de vulnerabilidades que nos lo permitan.</p>
<p>La idea de ingresar &#8220;<em>remotamente</em>&#8221; queda descartada si pensamos en conectarnos directamente a la base de datos desde un client externo, pero podemos pensarlo cómo el hecho de lograr acceder (remotamente)  de una u otra forma para lograr la conexion con el host. Por ejemplo, subiendo un fichero php que tenga las líneas necesarias para conectarse a la base de datos y hacer lo que necesitemos.</p>
<p>No vamos a usar fuerza bruta ni técnicas de robo de información, simplemente nos aprovecharemos de algunas <a target="_blank" href="http://blog.zerial.org/seguridad/vulnerabilidades-mas-comunes-en-los-sitios-web/">vulnerabilidades comunes</a>.</p>
<p><span id="more-1047"></span></p>
<p>Existen muchas vulnerabilidades que nos van a permitir ejecutar algún tipo de código arbitrario de manera tal de poder conectarnos a la base de datos a nuestra manera. A continuación enumeraré las distintas vulnerabildiades que nos podrían permitir lograr nuestro objetivo.</p>
<ul>
<li><strong>Remote Code Execution (RCE):</strong> Mediante ejecución de código remoto, es posible manejar arbitrariamente una conexión a la base de datos y de esta forma obtener y/o modificar los datos que nos interesan. Esta técnica podría permitir al atacante tener un control total sobre la base de datos del usuario en cuestión. Podemos ejecutar comandos como <em>mysqldump</em> o <em>pg_dump</em> en el caso de mysql o postgres, respectivamente. Tambien podemos ejecutar código php usando el la interfáz de línea de comandos (<em>php-cli</em>), python, perl, etc.</li>
<li><strong>Local|Remote File Include (L|RCI):</strong> Incluyendo ficheros remotos tambien es posible ejecutar código arbitrariamente, tal cómo lo describí en el punto anterior. Podemos escribir un script en php que nos haga un <em>dump</em> de la base de datos y que la deje en un directorio al cual tengamos acceso desde internet para luego poder descarga la información. Tambien se puede usar usando la técnica de inclusión de ficheros locale, siempre y cuando tengamos algún tipo de acceso para lograr subir ese fichero (cómo lo que explicaré en el próximo punto).</li>
<li><strong>File Upload by Authentication Bypass:</strong> Esta vulnerabilidad es muy común (lo digo por experiencia) y corresponde nada más ni nada menos al hecho de ingresar en un sistema de gestión de contenido y/o usuarios, el cual permita subir algún archivo sin validarlo (o validandolo incorrectamente). Por ejemplo, típico sistema de gestión de usuario que nos permite adjuntar un curriculum, imágen o sistema de gestión de contenido que nos permite subir alguna imágen adjunta o archivo relacionado a alguna noticia o contenido. Muchas veces estos ficheros no son validados correctamente, aveces simplemente usan una <del datetime="2009-10-23T00:50:48+00:00">triste</del> validación por javascript o simplemente validan la extensión, sin tomar en cuenta el <em>mime</em>. Entonces es cuando debemos subir algún fichero en php o el lenguaje que sea necesario para ejecutar arbitrariamente el código que necesitemos.</li>
<li><strong>FTP password discovery:</strong> Esto es súper sencillo. Con este punto me refiero al intentar descargar ficheros de configuración (mediante Directori Transversal) y tener acceso a distintos usuarios y claves para probar el acceso ftp y poder subir algún fichero que nos permita lograr nuestro propósito.</li>
<li><strong>PhpMy/PgAdmin:</strong> Simplemente, con este último punto, quiero hacer referencia a buscar instalaciones de phpmyadmin o phppgadmin en otros sitios del servidor. Generalmente, un servidor aloja más de un sitio web y más de alguno es vulnerable (nuestra puerta de entrada).</li>
</ul>
<p>Hay veces que hay que recorrer todo el servidor para encontrar una única puerta de entrada. Como bien dije en el último punto, generalmente los servidores alojan más de un sitio web y nunca falta que uno de ellos sea vulnerable, el que nos permita el ingreso directo o indirecto al servidor y de esta forma ejecutar código arbitrariamente.</p>
<p><a href="http://www.addtoany.com/add_to/delicious?linkurl=http%3A%2F%2Fblog.zerial.org%2Fseguridad%2Facceder-a-una-base-de-datos-que-solo-permite-conexiones-desde-localhost-remotamente%2F&amp;linkname=Acceder%20a%20una%20base%20de%20datos%2C%20que%20s%C3%B3lo%20permite%20conexiones%20desde%20localhost%2C%20remotamente" title="Delicious" rel="nofollow" target="_blank"><img src="http://blog.zerial.org/wp-content/plugins/add-to-any/icons/delicious.png" width="16" height="16" alt="Delicious"/></a> <a href="http://www.addtoany.com/add_to/twitter?linkurl=http%3A%2F%2Fblog.zerial.org%2Fseguridad%2Facceder-a-una-base-de-datos-que-solo-permite-conexiones-desde-localhost-remotamente%2F&amp;linkname=Acceder%20a%20una%20base%20de%20datos%2C%20que%20s%C3%B3lo%20permite%20conexiones%20desde%20localhost%2C%20remotamente" title="Twitter" rel="nofollow" target="_blank"><img src="http://blog.zerial.org/wp-content/plugins/add-to-any/icons/twitter.png" width="16" height="16" alt="Twitter"/></a> <a href="http://www.addtoany.com/add_to/facebook?linkurl=http%3A%2F%2Fblog.zerial.org%2Fseguridad%2Facceder-a-una-base-de-datos-que-solo-permite-conexiones-desde-localhost-remotamente%2F&amp;linkname=Acceder%20a%20una%20base%20de%20datos%2C%20que%20s%C3%B3lo%20permite%20conexiones%20desde%20localhost%2C%20remotamente" title="Facebook" rel="nofollow" target="_blank"><img src="http://blog.zerial.org/wp-content/plugins/add-to-any/icons/facebook.png" width="16" height="16" alt="Facebook"/></a> <a href="http://www.addtoany.com/add_to/google_bookmarks?linkurl=http%3A%2F%2Fblog.zerial.org%2Fseguridad%2Facceder-a-una-base-de-datos-que-solo-permite-conexiones-desde-localhost-remotamente%2F&amp;linkname=Acceder%20a%20una%20base%20de%20datos%2C%20que%20s%C3%B3lo%20permite%20conexiones%20desde%20localhost%2C%20remotamente" title="Google Bookmarks" rel="nofollow" target="_blank"><img src="http://blog.zerial.org/wp-content/plugins/add-to-any/icons/google.png" width="16" height="16" alt="Google Bookmarks"/></a> <a href="http://www.addtoany.com/add_to/friendfeed?linkurl=http%3A%2F%2Fblog.zerial.org%2Fseguridad%2Facceder-a-una-base-de-datos-que-solo-permite-conexiones-desde-localhost-remotamente%2F&amp;linkname=Acceder%20a%20una%20base%20de%20datos%2C%20que%20s%C3%B3lo%20permite%20conexiones%20desde%20localhost%2C%20remotamente" title="FriendFeed" rel="nofollow" target="_blank"><img src="http://blog.zerial.org/wp-content/plugins/add-to-any/icons/friendfeed.png" width="16" height="16" alt="FriendFeed"/></a> <a href="http://www.addtoany.com/add_to/digg?linkurl=http%3A%2F%2Fblog.zerial.org%2Fseguridad%2Facceder-a-una-base-de-datos-que-solo-permite-conexiones-desde-localhost-remotamente%2F&amp;linkname=Acceder%20a%20una%20base%20de%20datos%2C%20que%20s%C3%B3lo%20permite%20conexiones%20desde%20localhost%2C%20remotamente" title="Digg" rel="nofollow" target="_blank"><img src="http://blog.zerial.org/wp-content/plugins/add-to-any/icons/digg.png" width="16" height="16" alt="Digg"/></a> <a href="http://www.addtoany.com/add_to/slashdot?linkurl=http%3A%2F%2Fblog.zerial.org%2Fseguridad%2Facceder-a-una-base-de-datos-que-solo-permite-conexiones-desde-localhost-remotamente%2F&amp;linkname=Acceder%20a%20una%20base%20de%20datos%2C%20que%20s%C3%B3lo%20permite%20conexiones%20desde%20localhost%2C%20remotamente" title="Slashdot" rel="nofollow" target="_blank"><img src="http://blog.zerial.org/wp-content/plugins/add-to-any/icons/slashdot.png" width="16" height="16" alt="Slashdot"/></a> <a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fblog.zerial.org%2Fseguridad%2Facceder-a-una-base-de-datos-que-solo-permite-conexiones-desde-localhost-remotamente%2F&amp;linkname=Acceder%20a%20una%20base%20de%20datos%2C%20que%20s%C3%B3lo%20permite%20conexiones%20desde%20localhost%2C%20remotamente">Compartir/Guardar</a> </p>]]></content:encoded>
			<wfw:commentRss>http://blog.zerial.org/seguridad/acceder-a-una-base-de-datos-que-solo-permite-conexiones-desde-localhost-remotamente/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Cómo validar correctamente la descarga de un archivo en php</title>
		<link>http://blog.zerial.org/seguridad/como-validar-correctamente-la-descarga-de-un-archivo-en-php/</link>
		<comments>http://blog.zerial.org/seguridad/como-validar-correctamente-la-descarga-de-un-archivo-en-php/#comments</comments>
		<pubDate>Sun, 18 Oct 2009 13:10:22 +0000</pubDate>
		<dc:creator>Zerial</dc:creator>
				<category><![CDATA[Hacking]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Seguridad]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[directory transversal]]></category>
		<category><![CDATA[fpd]]></category>
		<category><![CDATA[full path disclosure]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://blog.zerial.org/?p=1009</guid>
		<description><![CDATA[Este post es debido a un correo que recibí preguntando como evitar el full path disclosure y el directory transversal desde un fichero php que realiza descargas. El error que plantearé a continuación es muy común en muchos sistemas web y ya he publicado varias webs vulnerables con este mismo problema. Corresponde a la forma [...]]]></description>
			<content:encoded><![CDATA[<p>Este post es debido a un correo que recibí preguntando como evitar el full path disclosure y el directory transversal desde un fichero php que realiza descargas. El error que plantearé a continuación es muy común en muchos sistemas web y ya he publicado varias webs vulnerables con este mismo problema. Corresponde a la forma de descarga tipo <strong>download.php?dir=ficheros/&amp;file=test.pdf</strong>.</p>
<p><img class="aligncenter size-full wp-image-1010" title="secure" src="http://blog.zerial.org/wp-content/uploads/2009/10/secure.png" alt="secure" width="419" height="122" /></p>
<p>Con una URL de este tipo, es posible forzar un FPD modificando las variables &#8220;dir&#8221; y &#8220;test&#8221;, cambiadolas por cualquier cosa que sepamos que no existe y de esta forma obtendremos un fichero php con un error, el cual nos revelará el path de la aplicación. Si cambiamos el valor de la variable &#8220;dir&#8221; a &#8220;../../../../../../etc/&#8221; y &#8220;file&#8221; a &#8220;passwd&#8221;, es muy probable que nos deje descargar el fichero <em>/etc/passwd</em>, lo mismo con cualquier otro fichero. De esta misma forma, podemos ir descargando uno a uno los códigos fuentes del sistema php y poder acceder a los usuarios y claves de conexion a la base de datos y otro tipo de información confidencial.</p>
<p><span id="more-1009"></span></p>
<p>Me voy a basar en casos reales y tomando como ejemplo los típicos errores e irresponsabilidades de programación de los desarrolladores.</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&lt; ?</div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$nombre</span> = <span class="re0">$_GET</span><span class="br0">&#91;</span><span class="st0">&#8216;archivo&#8217;</span><span class="br0">&#93;</span>; <span class="co1">// Nombre del archivo</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$contenido</span> = <span class="st0">&#8216;Texto del archivo&#8217;</span>; <span class="co1">// Contenido del archivo</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$enlace</span> = <span class="re0">$_GET</span><span class="br0">&#91;</span><span class="st0">&#8216;folder&#8217;</span><span class="br0">&#93;</span>.<span class="st0">&quot;/&quot;</span>.<span class="re0">$_GET</span><span class="br0">&#91;</span><span class="st0">&#8216;archivo&#8217;</span><span class="br0">&#93;</span>;</div>
</li>
<li class="li2">
<div class="de2"><a href="http://www.php.net/header"><span class="kw3">header</span></a> <span class="br0">&#40;</span><span class="st0">&quot;Content-Disposition: attachment; filename=&quot;</span>.<span class="re0">$nombre</span>.<span class="st0">&quot;&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><a href="http://www.php.net/header"><span class="kw3">header</span></a> <span class="br0">&#40;</span><span class="st0">&quot;Content-Type: application/octet-stream&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><a href="http://www.php.net/header"><span class="kw3">header</span></a> <span class="br0">&#40;</span><span class="st0">&quot;Content-Length: &quot;</span>.<a href="http://www.php.net/filesize"><span class="kw3">filesize</span></a><span class="br0">&#40;</span><span class="re0">$enlace</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><a href="http://www.php.net/readfile"><span class="kw3">readfile</span></a><span class="br0">&#40;</span><span class="re0">$enlace</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">?&gt;</span></div>
</li>
</ol>
</div>
<p>Este es un script que me descargué hace un tiempo y no recuerdo de que sitio, pero es un ejemplo real y lo más probable es que aún esté en línea. Si nos fijamos línea por línea, el script realiza lo siguiente:</p>
<p>Lee las variables directamente desde la URL (GET) y en primera instancia, obtiene el valor de la variable &#8220;nombre&#8221; y se la asigna a $nombre, esto es para darle el nombre al archivo una vez que lo descarguemos. Luego, en la variable $enlace, guardará el path completo de lo que deseamos descargar, si le pasamos por URL los parametros <strong>folder=archivos/&#038;archivo=test.pdf</strong>, el valor de la variable $enlace será &#8220;archivos/test.pdf&#8221;. Luego se enviarle las cabeceras al navegador, el script php leerá el fichero correspondiente al valor de la variable $enlace y forzará al navegador a descargarlo. De esta forma, si modificamos la url a nuestro modo, podremos descargar el fichero que queramos, ya que el script no tiene <strong>ninguna</strong> validación.</p>
<p>La forma correcta para hacer un script de este tipo, sería sin trabajar directamente con los parametros pasados por url y tenerlos encapsulados en algun lugar, ya sea en una base de datos, un switch o como sea, pero nunca directamente o bien, teniendo definido de forma explícita el directorio donde se trabaja.<br />
Si tomamos el mismo ejemplo anterior y lo corregimos, debería quedar algo así:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&lt; ?</div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$folder</span> = <span class="st0">&quot;archivos_para_descargar&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$nombre</span> = <span class="re0">$_GET</span><span class="br0">&#91;</span><span class="st0">&#8216;archivo&#8217;</span><span class="br0">&#93;</span>; <span class="co1">// Nombre del archivo</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$contenido</span> = <span class="st0">&#8216;Texto del archivo&#8217;</span>; <span class="co1">// Contenido del archivo</span></div>
</li>
<li class="li2">
<div class="de2"><span class="re0">$enlace</span> = <span class="re0">$folder</span>.<span class="st0">&quot;/&quot;</span>.<span class="re0">$_GET</span><span class="br0">&#91;</span><span class="st0">&#8216;archivo&#8217;</span><span class="br0">&#93;</span>;</div>
</li>
<li class="li1">
<div class="de1"><a href="http://www.php.net/header"><span class="kw3">header</span></a> <span class="br0">&#40;</span><span class="st0">&quot;Content-Disposition: attachment; filename=&quot;</span>.<span class="re0">$nombre</span>.<span class="st0">&quot;&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><a href="http://www.php.net/header"><span class="kw3">header</span></a> <span class="br0">&#40;</span><span class="st0">&quot;Content-Type: application/octet-stream&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><a href="http://www.php.net/header"><span class="kw3">header</span></a> <span class="br0">&#40;</span><span class="st0">&quot;Content-Length: &quot;</span>.<a href="http://www.php.net/filesize"><span class="kw3">filesize</span></a><span class="br0">&#40;</span><span class="re0">$enlace</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><a href="http://www.php.net/readfile"><span class="kw3">readfile</span></a><span class="br0">&#40;</span><span class="re0">$enlace</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2"><span class="kw2">?&gt;</span></div>
</li>
</ol>
</div>
<p>De esta forma, jamás podremos cambiar el valor de la variable &#8220;$folder&#8221; y nunca podremos descargar un fichero que esté detrás del directorio de descarga explícitamente definido &#8220;archivos_para_descarga&#8221;. Esto, sería una forma rápida y fácil de solucionarlo, pero creo que la mejor forma es volver a hacerlo y hacerlo bien. Teniendo un &#8220;administrador&#8221; de subidas que almacene la información en una base de datos para luego realizar la descarga sólo con el ID del fichero o bien, hacer las descargas directamente con su path absoluto (<em>http://sitio.com/archivos_para_descarga/2009/mi_documento.pdf</em>).</p>
<p>Como ya he dicho, este error es muy común y basta con preparar una búsqueda con los parámetros necesarios en Google para poder acceder a sitios con estas vulnerabilidades. El problema es que con este bug, no solo comprometes la seguridad de tu sistema y de tu usuario, tambien la seguridad del resto de los usuarios del servidor, ya que el script se ejecutará como usuario <em>www-data</em> o <em>apache</em> (en la mayoría de los servidores) y tiene acceso no solo a tus ficheros.</p>
<p><a href="http://www.addtoany.com/add_to/delicious?linkurl=http%3A%2F%2Fblog.zerial.org%2Fseguridad%2Fcomo-validar-correctamente-la-descarga-de-un-archivo-en-php%2F&amp;linkname=C%C3%B3mo%20validar%20correctamente%20la%20descarga%20de%20un%20archivo%20en%20php" title="Delicious" rel="nofollow" target="_blank"><img src="http://blog.zerial.org/wp-content/plugins/add-to-any/icons/delicious.png" width="16" height="16" alt="Delicious"/></a> <a href="http://www.addtoany.com/add_to/twitter?linkurl=http%3A%2F%2Fblog.zerial.org%2Fseguridad%2Fcomo-validar-correctamente-la-descarga-de-un-archivo-en-php%2F&amp;linkname=C%C3%B3mo%20validar%20correctamente%20la%20descarga%20de%20un%20archivo%20en%20php" title="Twitter" rel="nofollow" target="_blank"><img src="http://blog.zerial.org/wp-content/plugins/add-to-any/icons/twitter.png" width="16" height="16" alt="Twitter"/></a> <a href="http://www.addtoany.com/add_to/facebook?linkurl=http%3A%2F%2Fblog.zerial.org%2Fseguridad%2Fcomo-validar-correctamente-la-descarga-de-un-archivo-en-php%2F&amp;linkname=C%C3%B3mo%20validar%20correctamente%20la%20descarga%20de%20un%20archivo%20en%20php" title="Facebook" rel="nofollow" target="_blank"><img src="http://blog.zerial.org/wp-content/plugins/add-to-any/icons/facebook.png" width="16" height="16" alt="Facebook"/></a> <a href="http://www.addtoany.com/add_to/google_bookmarks?linkurl=http%3A%2F%2Fblog.zerial.org%2Fseguridad%2Fcomo-validar-correctamente-la-descarga-de-un-archivo-en-php%2F&amp;linkname=C%C3%B3mo%20validar%20correctamente%20la%20descarga%20de%20un%20archivo%20en%20php" title="Google Bookmarks" rel="nofollow" target="_blank"><img src="http://blog.zerial.org/wp-content/plugins/add-to-any/icons/google.png" width="16" height="16" alt="Google Bookmarks"/></a> <a href="http://www.addtoany.com/add_to/friendfeed?linkurl=http%3A%2F%2Fblog.zerial.org%2Fseguridad%2Fcomo-validar-correctamente-la-descarga-de-un-archivo-en-php%2F&amp;linkname=C%C3%B3mo%20validar%20correctamente%20la%20descarga%20de%20un%20archivo%20en%20php" title="FriendFeed" rel="nofollow" target="_blank"><img src="http://blog.zerial.org/wp-content/plugins/add-to-any/icons/friendfeed.png" width="16" height="16" alt="FriendFeed"/></a> <a href="http://www.addtoany.com/add_to/digg?linkurl=http%3A%2F%2Fblog.zerial.org%2Fseguridad%2Fcomo-validar-correctamente-la-descarga-de-un-archivo-en-php%2F&amp;linkname=C%C3%B3mo%20validar%20correctamente%20la%20descarga%20de%20un%20archivo%20en%20php" title="Digg" rel="nofollow" target="_blank"><img src="http://blog.zerial.org/wp-content/plugins/add-to-any/icons/digg.png" width="16" height="16" alt="Digg"/></a> <a href="http://www.addtoany.com/add_to/slashdot?linkurl=http%3A%2F%2Fblog.zerial.org%2Fseguridad%2Fcomo-validar-correctamente-la-descarga-de-un-archivo-en-php%2F&amp;linkname=C%C3%B3mo%20validar%20correctamente%20la%20descarga%20de%20un%20archivo%20en%20php" title="Slashdot" rel="nofollow" target="_blank"><img src="http://blog.zerial.org/wp-content/plugins/add-to-any/icons/slashdot.png" width="16" height="16" alt="Slashdot"/></a> <a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fblog.zerial.org%2Fseguridad%2Fcomo-validar-correctamente-la-descarga-de-un-archivo-en-php%2F&amp;linkname=C%C3%B3mo%20validar%20correctamente%20la%20descarga%20de%20un%20archivo%20en%20php">Compartir/Guardar</a> </p>]]></content:encoded>
			<wfw:commentRss>http://blog.zerial.org/seguridad/como-validar-correctamente-la-descarga-de-un-archivo-en-php/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Migración de datos en Drupal</title>
		<link>http://blog.zerial.org/linux/documentacion/migracion-exportacion-importacion-datos-drupal/</link>
		<comments>http://blog.zerial.org/linux/documentacion/migracion-exportacion-importacion-datos-drupal/#comments</comments>
		<pubDate>Fri, 02 Oct 2009 01:25:14 +0000</pubDate>
		<dc:creator>Zerial</dc:creator>
				<category><![CDATA[Documentacion]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[drupal]]></category>
		<category><![CDATA[drupal 6]]></category>
		<category><![CDATA[migracion]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[plataformas]]></category>

		<guid isPermaLink="false">http://blog.zerial.org/?p=926</guid>
		<description><![CDATA[Drupal 6 nos provee de una API que nos permitirá trabajar directamente con el core, usando las funciones, módulos y configuraciones ya existentes. De esta forma, y gracias a los hooks, podemos realizar distintas funciones tales como agregar, eliminar y modificar usuarios y contenidos, manejar los comentarios, configuraciones, etc. La idea de este artículo es [...]]]></description>
			<content:encoded><![CDATA[<p><img class="size-full wp-image-986 alignleft" style="margin: 5px;" title="drupal_migra" src="http://blog.zerial.org/wp-content/uploads/2009/10/drupal_migra.jpg" alt="drupal_migra" width="80" height="104" /> <a href="http://drupal.org" target="_blank">Drupal</a> 6 nos provee de una <a href="http://api.drupal.org" target="_blank">API</a> que nos permitirá trabajar directamente con el <em>core</em>, usando las funciones, módulos y configuraciones ya existentes. De esta forma, y gracias a los <em>hooks</em>, podemos realizar distintas funciones tales como agregar, eliminar y modificar usuarios y contenidos, manejar los comentarios, configuraciones, etc.<br />
La idea de este artículo es ayudar a las personas que necesiten realizar una migración (importación/exportación) desde un sistema distinto hacia Drupal.</p>
<p><span id="more-926"></span></p>
<p>Las funciones que necesitamos de la API de Drupal son:</p>
<ol>
<li><strong><a href="http://api.drupal.org/api/function/user_save/6" target="_blank">user_save()</a></strong>: Permite la manipulación de los usuarios.</li>
<li><strong><a href="http://api.drupal.org/api/function/node_save/6" target="_blank">node_save()</a></strong>: Manipulación de los nodos (contenidos).</li>
<li><strong><a href="http://api.drupal.org/api/function/db_query/6" target="_blank">db_query()</a></strong>: Nos permite realizar consultas a la base de datos usando la configuración de Drupal.</li>
</ol>
<p>Con estas funciones ya podemos pensar en realizar una migración total o partial de un sitio. La lógica del asunto es sencilla, tenemos que hacer un &#8220;wrapper&#8221; que conecte ambas plataformas (hablando de base de datos y ficheros), hacer que por un lado se conecte a la base de datos de la plataforma antigua y por otro lado a Drupal, que vaya leyendo los datos desde la plataforma antigua y luego insertandolos en la nueva plataforma usando las funciones de la API, por ejemplo, si tenemos la tabla <strong>usuarios</strong> con los tipicos campos <em>nombre, email, usuario, password</em>, en Drupal la estructura de la tabla <em>{users}</em> es similar, contiene los campos <em>email, name y pass</em> (los que nos sirven) entre otros. Entonces lo que debemos hacer es un pequeño script que haya un <strong>SELECT email, password, usuario FROM usuarios</strong> y hacer que cada registro que lea, lo inserte en la tabla <em>{users}</em> mediante la API (función user_save()).<br />
Ejemplo:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="re0">$var1</span> = <a href="http://www.php.net/mysql_query"><span class="kw3">mysql_query</span></a><span class="br0">&#40;</span><span class="st0">&quot;SELECT email,password,usuario FROM usuarios&quot;</span>, <span class="re0">$link</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">while</span><span class="br0">&#40;</span><span class="re0">$data</span> = <a href="http://www.php.net/mysql_fetch_array"><span class="kw3">mysql_fetch_array</span></a><span class="br0">&#40;</span><span class="re0">$var1</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="re0">$userdata</span> = <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#8216;status&#8217;</span> =&gt; <span class="nu0">1</span>,</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#8216;name&#8217;</span> =&gt; <span class="re0">$data</span><span class="br0">&#91;</span><span class="st0">&#8216;usuario&#8217;</span><span class="br0">&#93;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#8216;pass&#8217;</span> =&gt; <span class="st0">&#8217;123&#8242;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#8216;picture&#8217;</span> =&gt; <span class="re0">$_avatar</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#8216;mail&#8217;</span> =&gt; <span class="re0">$data</span><span class="br0">&#91;</span><span class="st0">&#8216;email&#8217;</span><span class="br0">&#93;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; user_save<span class="br0">&#40;</span><span class="st0">&#8221;</span>, <span class="re0">$userdata</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>El tema de la contraseña es más complicado, va a depender únicamente de que si la contraseña está en texto plano o encriptada en la base de datos de origen. Si esta en texto plano, entonces basta con agregar al arreglo <em>userdata</em> el valor <strong>$data['password']</strong> a la variable <em>pass</em>. De lo contrario, tendremos que hacer un pequeño truco. Creamos el usuario asignandole una clave <em>fake</em>, por ejemplo <strong>123456</strong> y posteriormente, usando la función db_query, hacemos el UPDATE necesario para cambiarle el password al usuario creado, ingresando directamente el HASH original (pensando que esta en md5).</p>
<p>Para realizar la migración de contenido, el procedimiento es de la misma forma, seleccionar la información de un lado y llevarla a otra usando la función <em>node_save</em>.<br />
Si algo se nos escapa de las manos y no sabemos como hacerlo, basta con que entendamos el modelo de la base de datos e ingresemos directamente las consultas a la base de datos (<strong>no lo recomiendo</strong>).</p>
<p>Hace unos días me tocó la tarea de realizar la migración de una plataforma X a Drupal, para esto diseñe una clase que me permite hacer la migración paso por paso.</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&lt; ?php</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><a href="http://www.php.net/chdir"><span class="kw3">chdir</span></a><span class="br0">&#40;</span><span class="st0">&quot;api/&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">include_once</span> <span class="st0">&#8216;api/includes/bootstrap.inc&#8217;</span>;</div>
</li>
<li class="li2">
<div class="de2">drupal_bootstrap<span class="br0">&#40;</span>DRUPAL_BOOTSTRAP_FULL<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><a href="http://www.php.net/flush"><span class="kw3">flush</span></a><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">class</span> Drupal<span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">private</span> <span class="re0">$user</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">private</span> <span class="re0">$id_uid</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">public</span> <span class="re0">$counter</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">public</span> <span class="kw2">function</span> __construct<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$this</span>-&gt;<span class="me1">id_uid</span> = <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$this</span>-&gt;<span class="me1">counter</span> = <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><span class="st0">&#8216;users&#8217;</span> =&gt; <span class="nu0">0</span>, <span class="st0">&#8216;news&#8217;</span> =&gt; <span class="nu0">0</span>, <span class="st0">&#8216;comments&#8217;</span> =&gt; <span class="nu0">0</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$this</span>-&gt;<span class="me1">clearDatabase</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">public</span> <span class="kw2">function</span> clearDatabase<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$_queries</span> = <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#8216;users&#8217;</span> =&gt; <span class="st0">&#8216;DELETE FROM dp_users WHERE name != <span class="es0">\&#8217;</span>admin<span class="es0">\&#8217;</span> AND name != <span class="es0">\&#8217;</span>asdf<span class="es0">\&#8217;</span>&#8216;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#8216;nodes&#8217;</span> =&gt; <span class="st0">&#8216;DELETE FROM dp_node WHERE type NOT IN (<span class="es0">\&#8217;</span>intro<span class="es0">\&#8217;</span>, <span class="es0">\&#8217;</span>adminpage<span class="es0">\&#8217;</span>)&#8217;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#8216;comments&#8217;</span> =&gt; <span class="st0">&#8216;DELETE FROM dp_comments&#8217;</span>,</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#8216;terms_rel&#8217; =&gt; &#8216;DELETE FROM dp_term_node&#8217;,</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">//&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#8216;terms&#8217; =&gt; &#8216;DELETE FROM dp_term_data WHERE tid NOT IN (3, 6)&#8217;,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#8216;groups&#8217;</span> =&gt; <span class="st0">&#8216;DELETE FROM dp_og&#8217;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#8216;groups_uid&#8217;</span> =&gt; <span class="st0">&#8216;DELETE FROM dp_og_uid&#8217;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#8216;groups_ancestry&#8217;</span> =&gt; <span class="st0">&#8216;DELETE FROM dp_og_ancestry&#8217;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#8216;groups_notifications&#8217;</span> =&gt; <span class="st0">&#8216;DELETE FROM dp_og_notifications&#8217;</span>,</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#8216;dp_job_posting&#8217;</span> =&gt; <span class="st0">&#8216;DELETE FROM dp_job_posting&#8217;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#8216;dp_job_posting_country&#8217;</span> =&gt; <span class="st0">&#8216;DELETE FROM dp_job_posting_country&#8217;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">foreach</span><span class="br0">&#40;</span><span class="re0">$_queries</span> <span class="kw1">as</span> <span class="re0">$query</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.php.net/print"><span class="kw3">print</span></a> <span class="st0">&quot;&gt;&gt;[DP_SQL] &quot;</span>.<span class="re0">$query</span>.<span class="st0">&quot;<span class="es0">\n</span>&quot;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; db_query<span class="br0">&#40;</span><span class="re0">$query</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">public</span> <span class="kw2">function</span> createUser<span class="br0">&#40;</span><span class="re0">$data</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$_avatar_base_path</span> = <span class="st0">&quot;sites/default/files/pictures/&quot;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$_avatar</span> = <span class="br0">&#40;</span><span class="re0">$data</span><span class="br0">&#91;</span><span class="st0">&#8216;avatar&#8217;</span><span class="br0">&#93;</span> == <span class="st0">&quot;usuarioSinAV.jpg&quot;</span><span class="br0">&#41;</span>?<span class="kw2">NULL</span>:<span class="re0">$_avatar_base_path</span>.<span class="re0">$data</span><span class="br0">&#91;</span><span class="st0">&#8216;avatar&#8217;</span><span class="br0">&#93;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$_user</span> = <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#8216;status&#8217;</span> =&gt; <span class="nu0">1</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#8216;access&#8217;</span> =&gt; <a href="http://www.php.net/time"><span class="kw3">time</span></a><span class="br0">&#40;</span><span class="br0">&#41;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#8216;name&#8217;</span> =&gt; <span class="re0">$data</span><span class="br0">&#91;</span><span class="st0">&#8216;username&#8217;</span><span class="br0">&#93;</span>,</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#8216;pass&#8217;</span> =&gt; <span class="st0">&#8217;123&#8242;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#8216;picture&#8217;</span> =&gt; <span class="re0">$_avatar</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#8216;profile_nombres&#8217;</span> =&gt; <span class="re0">$data</span><span class="br0">&#91;</span><span class="st0">&#8216;nombres&#8217;</span><span class="br0">&#93;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#8216;profile_apellido&#8217;</span> =&gt; <span class="re0">$data</span><span class="br0">&#91;</span><span class="st0">&#8216;apellidos&#8217;</span><span class="br0">&#93;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#8216;profile_intereses&#8217;</span> =&gt; <span class="re0">$data</span><span class="br0">&#91;</span><span class="st0">&#8216;about&#8217;</span><span class="br0">&#93;</span>,</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#8216;profesion&#8217;</span> =&gt; <span class="re0">$data</span><span class="br0">&#91;</span><span class="st0">&#8216;profesion&#8217;</span><span class="br0">&#93;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#8216;mail&#8217;</span> =&gt; <span class="re0">$data</span><span class="br0">&#91;</span><span class="st0">&#8216;email&#8217;</span><span class="br0">&#93;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$user</span> = user_save<span class="br0">&#40;</span><span class="st0">&#8221;</span>, <span class="re0">$_user</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; self::_setPassword<span class="br0">&#40;</span><span class="re0">$user</span>-&gt;<span class="me1">uid</span>, <span class="re0">$data</span><span class="br0">&#91;</span><span class="st0">&#8216;password&#8217;</span><span class="br0">&#93;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2"><span class="co1">//&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; self::_setUserRole($user-&gt;uid);</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; self::_configureProfile<span class="br0">&#40;</span><span class="re0">$data</span>, <span class="re0">$user</span>-&gt;<span class="me1">uid</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span><span class="re0">$data</span><span class="br0">&#91;</span><span class="st0">&#8216;admin&#8217;</span><span class="br0">&#93;</span><span class="br0">&#41;</span> self::_setAdmin<span class="br0">&#40;</span><span class="re0">$user</span>-&gt;<span class="me1">uid</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$this</span>-&gt;<span class="me1">user</span> = &amp;<span class="re0">$user</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$this</span>-&gt;<span class="me1">id_uid</span><span class="br0">&#91;</span><span class="re0">$data</span><span class="br0">&#91;</span><span class="st0">&#8216;id&#8217;</span><span class="br0">&#93;</span><span class="br0">&#93;</span> = <span class="re0">$user</span>-&gt;<span class="me1">uid</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$this</span>-&gt;<span class="me1">counter</span><span class="br0">&#91;</span><span class="st0">&#8216;users&#8217;</span><span class="br0">&#93;</span>++;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">public</span> <span class="kw2">function</span> createContent<span class="br0">&#40;</span><span class="re0">$data</span>, <span class="re0">$type</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$node</span> = <span class="kw2">new</span> stdClass<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$node</span>-&gt;<span class="me1">type</span> = <span class="re0">$type</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$node</span>-&gt;<span class="me1">uid</span> = <span class="re0">$this</span>-&gt;<span class="me1">user</span>-&gt;<span class="me1">uid</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$node</span>-&gt;<span class="me1">name</span> = <span class="re0">$user</span>-&gt;<span class="me1">user</span>-&gt;<span class="me1">name</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$node</span>-&gt;<span class="me1">promote</span> = <span class="nu0">1</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$node</span>-&gt;<span class="me1">format</span> = FILTER_FORMAT_DEFAULT;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$node</span>-&gt;<span class="me1">status</span> = <span class="nu0">1</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$node</span>-&gt;<span class="me1">title</span> = <a href="http://www.php.net/html_entity_decode"><span class="kw3">html_entity_decode</span></a><span class="br0">&#40;</span><span class="re0">$data</span><span class="br0">&#91;</span><span class="st0">&#8216;titulo&#8217;</span><span class="br0">&#93;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$node</span>-&gt;<span class="me1">body</span> = <span class="re0">$data</span><span class="br0">&#91;</span><span class="st0">&#8216;cuerpo&#8217;</span><span class="br0">&#93;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$node</span>-&gt;<span class="me1">taxonomy</span> = self::_convertTaxonomy<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$node</span>-&gt;<span class="me1">comment</span> = <span class="nu0">2</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$node</span>-&gt;<span class="me1">created</span> = <a href="http://www.php.net/strtotime"><span class="kw3">strtotime</span></a><span class="br0">&#40;</span><span class="re0">$data</span><span class="br0">&#91;</span><span class="st0">&#8216;fecha&#8217;</span><span class="br0">&#93;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.php.net/print"><span class="kw3">print</span></a> <span class="st0">&quot;&gt;&gt;[node:&quot;</span>.<span class="re0">$type</span>.<span class="st0">&quot;] &quot;</span>.<a href="http://www.php.net/substr"><span class="kw3">substr</span></a><span class="br0">&#40;</span><span class="re0">$node</span>-&gt;<span class="me1">title</span>, <span class="nu0">0</span>, <span class="nu0">30</span><span class="br0">&#41;</span>.<span class="st0">&quot;&#8230; (&quot;</span>.<a href="http://www.php.net/substr"><span class="kw3">substr</span></a><span class="br0">&#40;</span><span class="re0">$node</span>-&gt;<span class="me1">body</span>, <span class="nu0">0</span>, <span class="nu0">20</span><span class="br0">&#41;</span>.<span class="st0">&quot; &#8230;) [tax:{&quot;</span>.<a href="http://www.php.net/implode"><span class="kw3">implode</span></a><span class="br0">&#40;</span><span class="st0">&quot;;&quot;</span>, <span class="re0">$node</span>-&gt;<span class="me1">taxonomy</span><span class="br0">&#41;</span>.<span class="st0">&quot;},uid:&quot;</span>.<span class="re0">$node</span>-&gt;<span class="me1">uid</span>.<span class="st0">&quot;]<span class="es0">\n</span>&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$this</span>-&gt;<span class="me1">counter</span><span class="br0">&#91;</span><span class="st0">&#8216;news&#8217;</span><span class="br0">&#93;</span>++;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; node_save<span class="br0">&#40;</span><span class="re0">$node</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$q</span> = <span class="st0">&quot;INSERT INTO dp_node_access(nid, grant_view, realm) VALUES((SELECT MAX(nid) FROM dp_node),1, &#8216;all&#8217;)&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; db_query<span class="br0">&#40;</span> <span class="re0">$q</span> <span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">public</span> <span class="kw2">function</span> insertCommentProfile<span class="br0">&#40;</span><span class="re0">$data</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.php.net/print"><span class="kw3">print</span></a> <span class="st0">&quot;&gt;&gt;[comment;autor:&quot;</span>.<span class="re0">$this</span>-&gt;<span class="me1">id_uid</span><span class="br0">&#91;</span><span class="re0">$data</span><span class="br0">&#91;</span><span class="st0">'autor'</span><span class="br0">&#93;</span><span class="br0">&#93;</span>.<span class="st0">&quot;,uid:&quot;</span>.<span class="re0">$data</span><span class="br0">&#91;</span><span class="st0">'userid'</span><span class="br0">&#93;</span>.<span class="st0">&quot;] (&quot;</span>.<a href="http://www.php.net/rtrim"><span class="kw3">rtrim</span></a><span class="br0">&#40;</span><a href="http://www.php.net/substr"><span class="kw3">substr</span></a><span class="br0">&#40;</span><span class="re0">$data</span><span class="br0">&#91;</span><span class="st0">&#8216;comentario&#8217;</span><span class="br0">&#93;</span>, <span class="nu0">0</span>, <span class="nu0">30</span><span class="br0">&#41;</span><span class="br0">&#41;</span>.<span class="st0">&quot; &#8230;)<span class="es0">\n</span>&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; db_query<span class="br0">&#40;</span><span class="st0">&quot;INSERT INTO {comments} (pid, uid, hostname, comment, status, name, mail, homepage, timestamp) VALUES(%d, %d, &#8216;%s&#8217;, &#8216;%s&#8217;, %d, &#8216;%s&#8217;, &#8216;%s&#8217;, &#8216;%s&#8217;, %d)&quot;</span>, <span class="re0">$data</span><span class="br0">&#91;</span><span class="st0">&#8216;userid&#8217;</span><span class="br0">&#93;</span>, <span class="re0">$this</span>-&gt;<span class="me1">id_uid</span><span class="br0">&#91;</span><span class="re0">$data</span><span class="br0">&#91;</span><span class="st0">&#8216;autor&#8217;</span><span class="br0">&#93;</span><span class="br0">&#93;</span>, <span class="st0">&#8217;127.0.0.1&#8242;</span>, <span class="re0">$data</span><span class="br0">&#91;</span><span class="st0">&#8216;comentario&#8217;</span><span class="br0">&#93;</span>, <span class="nu0">1</span>, <span class="st0">&#8221;</span>, <span class="st0">&#8221;</span>, <span class="st0">&#8221;</span>, <a href="http://www.php.net/time"><span class="kw3">time</span></a><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$this</span>-&gt;<span class="me1">counter</span><span class="br0">&#91;</span><span class="st0">&#8216;comments&#8217;</span><span class="br0">&#93;</span>++;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">private</span> <span class="kw2">function</span> _convertTaxonomy<span class="br0">&#40;</span><span class="re0">$taxonomy</span> = <span class="kw2">NULL</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$_categories</span> = <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$_categories</span><span class="br0">&#91;</span><span class="br0">&#93;</span> = <span class="nu0">29</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$_categories</span><span class="br0">&#91;</span><span class="br0">&#93;</span> = <span class="nu0">30</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$_categories</span><span class="br0">&#91;</span><span class="br0">&#93;</span> = <span class="nu0">31</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$_categories</span><span class="br0">&#91;</span><span class="br0">&#93;</span> = <span class="nu0">32</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$_categories</span><span class="br0">&#91;</span><span class="br0">&#93;</span> = <span class="nu0">33</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$_categories</span><span class="br0">&#91;</span><span class="br0">&#93;</span> = <span class="nu0">34</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$_categories</span><span class="br0">&#91;</span><span class="br0">&#93;</span> = <span class="nu0">35</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span> <span class="br0">&#40;</span><span class="re0">$taxonomy</span><span class="br0">&#41;</span>?<span class="re0">$_categories</span><span class="br0">&#91;</span>&#8211;<span class="re0">$taxonomy</span><span class="br0">&#93;</span>:<span class="nu0">35</span> <span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">private</span> <span class="kw2">function</span> _setPassword<span class="br0">&#40;</span><span class="re0">$id</span>, <span class="re0">$md5</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$query</span> = <span class="st0">&quot;UPDATE dp_users SET pass = &#8216;&quot;</span>.<span class="re0">$md5</span>.<span class="st0">&quot;&#8217; WHERE (name != &#8216;asdf&#8217; AND name != &#8216;admin&#8217;) AND uid = &quot;</span>.<span class="re0">$id</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.php.net/print"><span class="kw3">print</span></a> <span class="st0">&quot;&gt;&gt;[DP_SQL] &quot;</span>.<span class="re0">$query</span>.<span class="st0">&quot;<span class="es0">\n</span>&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; db_query<span class="br0">&#40;</span><span class="re0">$query</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">private</span> <span class="kw2">function</span> _setAdmin<span class="br0">&#40;</span><span class="re0">$id</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$table</span> = <span class="st0">&quot;dp_users_roles&quot;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//$query = &quot;UPDATE &quot;.$table.&quot; SET rid = 4 WHERE uid = &quot;.$id; # 4 es el que corresponde segun SELECT * FROM dp_role</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$query</span> = <span class="st0">&quot;INSERT INTO &quot;</span>.<span class="re0">$table</span>.<span class="st0">&quot;(rid, uid) VALUES(4, &quot;</span>.<span class="re0">$id</span>.<span class="st0">&quot;)&quot;</span>; <span class="co2"># 2 es el que corresponde segun SELECT * FROM dp_role</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.php.net/print"><span class="kw3">print</span></a> <span class="st0">&quot;&gt;&gt;[DP_SQL] &quot;</span>.<span class="re0">$query</span>.<span class="st0">&quot;<span class="es0">\n</span>&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; db_query<span class="br0">&#40;</span><span class="re0">$query</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">private</span> <span class="kw2">function</span> _setUserRole<span class="br0">&#40;</span><span class="re0">$id</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$table</span> = <span class="st0">&quot;dp_users_roles&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$query</span> = <span class="st0">&quot;INSERT INTO &quot;</span>.<span class="re0">$table</span>.<span class="st0">&quot;(rid, uid) VALUES(2, &quot;</span>.<span class="re0">$id</span>.<span class="st0">&quot;)&quot;</span>; <span class="co2"># 2 es el que corresponde segun SELECT * FROM dp_role</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.php.net/print"><span class="kw3">print</span></a> <span class="st0">&quot;&gt;&gt;[DP_SQL] &quot;</span>.<span class="re0">$query</span>.<span class="st0">&quot;<span class="es0">\n</span>&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; db_query<span class="br0">&#40;</span><span class="re0">$query</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">private</span> <span class="kw2">function</span> _configureProfile<span class="br0">&#40;</span><span class="re0">$info</span>, <span class="re0">$_uid</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$uid</span> = <span class="re0">$info</span><span class="br0">&#91;</span><span class="st0">&#8216;id&#8217;</span><span class="br0">&#93;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$query</span> = <span class="st0">&quot;SELECT a.nombre_esp FROM cat_paises a LEFT JOIN usr_users b ON b.pais = a.id WHERE b.id = &quot;</span>.<span class="re0">$uid</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$_r</span> = <a href="http://www.php.net/mysql_result"><span class="kw3">mysql_result</span></a><span class="br0">&#40;</span>sqlExec<span class="br0">&#40;</span><span class="re0">$query</span>, <span class="st0">&#8216;query&#8217;</span><span class="br0">&#41;</span>, <span class="nu0">0</span>, <span class="st0">&#8216;nombre_esp&#8217;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; db_query<span class="br0">&#40;</span><span class="st0">&quot;INSERT INTO dp_profile_values(fid, uid, value) VALUES(8, &quot;</span>.<span class="re0">$_uid</span>.<span class="st0">&quot;, &#8216;&quot;</span>.<span class="re0">$_r</span>.<span class="st0">&quot;&#8217;)&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$query</span> = <span class="st0">&quot;SELECT a.nombre_esp FROM paises a LEFT JOIN users b ON b.pais_residencia = a.id WHERE b.id = &quot;</span>.<span class="re0">$uid</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$_r</span> = <a href="http://www.php.net/mysql_result"><span class="kw3">mysql_result</span></a><span class="br0">&#40;</span>sqlExec<span class="br0">&#40;</span><span class="re0">$query</span>, <span class="st0">&#8216;query&#8217;</span><span class="br0">&#41;</span>, <span class="nu0">0</span>, <span class="st0">&#8216;nombre_esp&#8217;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; db_query<span class="br0">&#40;</span><span class="st0">&quot;INSERT INTO dp_profile_values(fid, uid, value) VALUES(9, &quot;</span>.<span class="re0">$_uid</span>.<span class="st0">&quot;, &#8216;&quot;</span>.<span class="re0">$_r</span>.<span class="st0">&quot;&#8217;)&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">/* &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$query = &quot;SELECT a.profesion FROM users a WHERE a.id = &quot;.$uid;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $_r = mysql_result(sqlExec($query, &#8216;query&#8217;), 0, &#8216;profesion&#8217;);</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; db_query(&quot;INSERT INTO dp_profile_values(fid, uid, value) VALUES(3, &quot;.$_uid.&quot;, &#8216;&quot;.$_r.&quot;&#8217;)&quot;);*/</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$query</span> = <span class="st0">&quot;SELECT a.nombre FROM cat_usr a LEFT JOIN usr_users b ON b.categoria = a.id WHERE b.id = &quot;</span>.<span class="re0">$uid</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$_r</span> = <a href="http://www.php.net/mysql_result"><span class="kw3">mysql_result</span></a><span class="br0">&#40;</span>sqlExec<span class="br0">&#40;</span><span class="re0">$query</span>, <span class="st0">&#8216;query&#8217;</span><span class="br0">&#41;</span>, <span class="nu0">0</span>, <span class="st0">&#8216;nombre&#8217;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; db_query<span class="br0">&#40;</span><span class="st0">&quot;INSERT INTO dp_profile_values(fid, uid, value) VALUES(4, &quot;</span>.<span class="re0">$_uid</span>.<span class="st0">&quot;, &#8216;&quot;</span>.<span class="re0">$_r</span>.<span class="st0">&quot;&#8217;)&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$query</span> = <span class="st0">&quot;SELECT a.subcategoria_es FROM areas_ciencia_subcat a, usr_users b WHERE b.area_ciencia_subcat != 0 AND b.area_ciencia_subcat = a.id_subcat AND b.id = &quot;</span>.<span class="re0">$_uid</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span><span class="re0">$_r</span> = <a href="http://www.php.net/mysql_result"><span class="kw3">mysql_result</span></a><span class="br0">&#40;</span>sqlExec<span class="br0">&#40;</span><span class="re0">$query</span>, <span class="st0">&#8216;query&#8217;</span><span class="br0">&#41;</span>, <span class="nu0">0</span>, <span class="st0">&#8216;subcategoria_es&#8217;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; db_query<span class="br0">&#40;</span><span class="st0">&quot;UPDATE dp_profile_values SET value = &#8216;&quot;</span>.<span class="re0">$_r</span>.<span class="st0">&quot;&#8217; WHERE fid = 7 AND uid = &quot;</span>.<span class="re0">$_uid</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; db_query(&quot;INSERT INTO dp_profile_values(fid, uid, value) VALUES(7, &quot;.$_uid.&quot;, &#8216;&quot;.$_r.&quot;&#8217;)&quot;);</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Esta clase nos permite crear una instancia para trabajar con Drupal y de esta forma poder migrar usuarios, contenidos, asignar taxonomias/categorias, resetear claves, insertar comentarios, etc. Cada método público debe ser llamado pasando como argumento un <em>array</em> con la información que desea ser insertada. Por ejemplo, una llamda al método <em>createUser</em>:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="re0">$_users</span> = <a href="http://www.php.net/mysql_query"><span class="kw3">mysql_query</span></a><span class="br0">&#40;</span><span class="st0">&quot;SELECT * FROM usuarios&quot;</span>, <span class="re0">$link</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">while</span><span class="br0">&#40;</span><span class="re0">$_users_row</span> = <a href="http://www.php.net/mysql_fetch_array"><span class="kw3">mysql_fetch_array</span></a><span class="br0">&#40;</span><span class="re0">$_users</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Llamada a API drupal para crear usuario</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$drupal</span>-&gt;<span class="me1">createUser</span><span class="br0">&#40;</span><span class="re0">$_users_row</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Sencillamente, lo que hace este pedazo de código es consultar en una base de datos por todos los usuarios y posteriormente, por cada registro encontrado, llamar al método &#8220;createUsers&#8221; pasándole como argumento el row correspondiente al ciclo.</p>
<p>Les dejo el script &#8220;Migrar.php&#8221; que instancia la clase Drupal y hace uso de sus métodos:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&lt; ?php</div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">/* </span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;* Lunes, 21 de Septiembre del 2009.</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;*</span></div>
</li>
<li class="li2">
<div class="de2"><span class="coMULTI">&nbsp;* Migrador de plataformas para</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;* Drupal.</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;*</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;*/</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2"><span class="co1">// Config</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">require_once</span><span class="br0">&#40;</span><span class="st0">&quot;Config.php&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$conexion</span> = <a href="http://www.php.net/mysql_connect"><span class="kw3">mysql_connect</span></a><span class="br0">&#40;</span><span class="re0">$host</span>, <span class="re0">$username</span>, <span class="re0">$password</span><span class="br0">&#41;</span> OR <a href="http://www.php.net/die"><span class="kw3">die</span></a><span class="br0">&#40;</span><span class="st0">&quot;Error al conectar a la base de datos.<span class="es0">\n</span>&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2"><span class="co1">// Llamada a nuestro wrapper</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">require_once</span><span class="br0">&#40;</span><span class="st0">&quot;Drupal.class.php&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">if</span><span class="br0">&#40;</span>!<a href="http://www.php.net/mysql_select_db"><span class="kw3">mysql_select_db</span></a><span class="br0">&#40;</span><span class="re0">$database</span>, <span class="re0">$conexion</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.php.net/print"><span class="kw3">print</span></a> <span class="st0">&quot;Error al seleccionar la base de datos.<span class="es0">\n</span>&quot;</span>;</div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">else</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$start</span> = <a href="http://www.php.net/time"><span class="kw3">time</span></a><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$drupal</span> = <span class="kw2">new</span> Drupal<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Usuarios</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$table</span> = <span class="st0">&quot;usr_users&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$query</span> = <span class="st0">&quot;SELECT * FROM &quot;</span>.<span class="re0">$table</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$_users</span> = sqlExec<span class="br0">&#40;</span><span class="re0">$query</span>, <span class="st0">&quot;print_query&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; getRows<span class="br0">&#40;</span><span class="re0">$_users</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">while</span><span class="br0">&#40;</span><span class="re0">$_users_row</span> = <a href="http://www.php.net/mysql_fetch_array"><span class="kw3">mysql_fetch_array</span></a><span class="br0">&#40;</span><span class="re0">$_users</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Llamada a API drupal para crear usuario</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$drupal</span>-&gt;<span class="me1">createUser</span><span class="br0">&#40;</span><span class="re0">$_users_row</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Fin</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$table</span> = <span class="st0">&quot;infoc_news&quot;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$query</span> = <span class="st0">&quot;SELECT * FROM &quot;</span>.<span class="re0">$table</span>.<span class="st0">&quot; WHERE autor = &quot;</span>.<span class="re0">$_users_row</span><span class="br0">&#91;</span><span class="st0">&#8216;id&#8217;</span><span class="br0">&#93;</span>.<span class="st0">&quot; ORDER BY fecha&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$_news</span> = sqlExec<span class="br0">&#40;</span><span class="re0">$query</span>, <span class="st0">&quot;print_query&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; getRows<span class="br0">&#40;</span><span class="re0">$_news</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">while</span><span class="br0">&#40;</span><span class="re0">$_news_row</span> = <a href="http://www.php.net/mysql_fetch_array"><span class="kw3">mysql_fetch_array</span></a><span class="br0">&#40;</span><span class="re0">$_news</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Llamada a API drupal para crear contenido</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$drupal</span>-&gt;<span class="me1">createContent</span><span class="br0">&#40;</span><span class="re0">$_news_row</span>, <span class="st0">&quot;news&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Fin</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Comentarios en perfiles</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$table</span> = <span class="st0">&quot;usr_comments&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$query</span> = <span class="st0">&quot;SELECT * FROM usr_coments WHERE responseTo = 0&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$_comments</span> = sqlExec<span class="br0">&#40;</span><span class="re0">$query</span>, <span class="st0">&quot;print_query&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; getRows<span class="br0">&#40;</span><span class="re0">$_comments</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">while</span><span class="br0">&#40;</span><span class="re0">$_comments_row</span> = <a href="http://www.php.net/mysql_fetch_array"><span class="kw3">mysql_fetch_array</span></a><span class="br0">&#40;</span><span class="re0">$_comments</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Llamada a API drupal para insertar comentarios en perfiles</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$drupal</span>-&gt;<span class="me1">insertCommentProfile</span><span class="br0">&#40;</span><span class="re0">$_comments_row</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// FIn</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$stop</span> = <a href="http://www.php.net/time"><span class="kw3">time</span></a><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$time</span> = <span class="re0">$stop</span> &#8211; <span class="re0">$start</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.php.net/print"><span class="kw3">print</span></a> <span class="st0">&quot;Migration done.<span class="es0">\n</span>&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.php.net/print"><span class="kw3">print</span></a> <span class="st0">&quot;+ Summary:<span class="es0">\n</span>&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.php.net/print"><span class="kw3">print</span></a> <span class="st0">&quot;|- Users:<span class="es0">\t</span>&quot;</span>.<span class="re0">$drupal</span>-&gt;<span class="me1">counter</span><span class="br0">&#91;</span><span class="st0">&#8216;users&#8217;</span><span class="br0">&#93;</span>.<span class="st0">&quot;<span class="es0">\n</span>&quot;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.php.net/print"><span class="kw3">print</span></a> <span class="st0">&quot;|- Nodes:<span class="es0">\t</span>&quot;</span>.<span class="re0">$drupal</span>-&gt;<span class="me1">counter</span><span class="br0">&#91;</span><span class="st0">&#8216;news&#8217;</span><span class="br0">&#93;</span>.<span class="st0">&quot;<span class="es0">\n</span>&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.php.net/print"><span class="kw3">print</span></a> <span class="st0">&quot;|- Comments:<span class="es0">\t</span>&quot;</span>.<span class="re0">$drupal</span>-&gt;<span class="me1">counter</span><span class="br0">&#91;</span><span class="st0">&#8216;comments&#8217;</span><span class="br0">&#93;</span>.<span class="st0">&quot;<span class="es0">\n</span>&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.php.net/print"><span class="kw3">print</span></a> <span class="st0">&quot;|_ Time:<span class="es0">\t</span>&quot;</span>.<a href="http://www.php.net/date"><span class="kw3">date</span></a><span class="br0">&#40;</span><span class="st0">&quot;s&quot;</span>, <span class="re0">$time</span><span class="br0">&#41;</span>.<span class="st0">&quot; secs.<span class="es0">\n</span>&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">/* sqlExec()</span></div>
</li>
<li class="li2">
<div class="de2"><span class="coMULTI">&nbsp;* Ejecuta y/o imprime una consulta SQL</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;*/</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">function</span> sqlExec<span class="br0">&#40;</span><span class="re0">$query</span>, <span class="re0">$type</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.php.net/global"><span class="kw3">global</span></a> <span class="re0">$conexion</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">switch</span><span class="br0">&#40;</span><span class="re0">$type</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">case</span> <span class="st0">&#8216;print&#8217;</span>:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.php.net/print"><span class="kw3">print</span></a> <span class="st0">&quot;&gt;&gt;[SQL] &quot;</span>.<span class="re0">$query</span>.<span class="st0">&quot;<span class="es0">\n</span>&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">break</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">case</span> <span class="st0">&#8216;query&#8217;</span>:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <a href="http://www.php.net/mysql_query"><span class="kw3">mysql_query</span></a><span class="br0">&#40;</span><span class="re0">$query</span>, <span class="re0">$conexion</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">break</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">case</span> <span class="st0">&#8216;print_query&#8217;</span>:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.php.net/print"><span class="kw3">print</span></a> <span class="st0">&quot;&gt;&gt;[SQL] &quot;</span>.<span class="re0">$query</span>.<span class="st0">&quot;<span class="es0">\n</span>&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <a href="http://www.php.net/mysql_query"><span class="kw3">mysql_query</span></a><span class="br0">&#40;</span><span class="re0">$query</span>, <span class="re0">$conexion</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">break</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">case</span> <span class="st0">&#8216;default&#8217;</span>:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.php.net/print"><span class="kw3">print</span></a> <span class="st0">&quot;Error en el modo de trabajo.<span class="es0">\n</span>&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">break</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">NULL</span>;</div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">/* getRows()</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;* Imprime la cantidad de resultados obtenidas desde una consulta</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;*/</span></div>
</li>
<li class="li2">
<div class="de2"><span class="kw2">function</span> getRows<span class="br0">&#40;</span><span class="re0">$resource</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.php.net/print"><span class="kw3">print</span></a> <span class="st0">&quot;&lt; &lt; &quot;</span>.<a href="http://www.php.net/mysql_num_rows"><span class="kw3">mysql_num_rows</span></a><span class="br0">&#40;</span><span class="re0">$resource</span><span class="br0">&#41;</span>.<span class="st0">&quot; rows.<span class="es0">\n</span>&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">?&gt;</span></div>
</li>
</ol>
</div>
<p><strong>NOTA</strong> Estos scripts son los <em>originales</em> que he usado para migrar una plataforma, si alguien quiere darle un uso personal debe hacer las modificaciones correspondientes que se adapten a su propio modelo de datos y a sus propias necesidades.</p>
<p><a href="http://www.addtoany.com/add_to/delicious?linkurl=http%3A%2F%2Fblog.zerial.org%2Flinux%2Fdocumentacion%2Fmigracion-exportacion-importacion-datos-drupal%2F&amp;linkname=Migraci%C3%B3n%20de%20datos%20en%20Drupal" title="Delicious" rel="nofollow" target="_blank"><img src="http://blog.zerial.org/wp-content/plugins/add-to-any/icons/delicious.png" width="16" height="16" alt="Delicious"/></a> <a href="http://www.addtoany.com/add_to/twitter?linkurl=http%3A%2F%2Fblog.zerial.org%2Flinux%2Fdocumentacion%2Fmigracion-exportacion-importacion-datos-drupal%2F&amp;linkname=Migraci%C3%B3n%20de%20datos%20en%20Drupal" title="Twitter" rel="nofollow" target="_blank"><img src="http://blog.zerial.org/wp-content/plugins/add-to-any/icons/twitter.png" width="16" height="16" alt="Twitter"/></a> <a href="http://www.addtoany.com/add_to/facebook?linkurl=http%3A%2F%2Fblog.zerial.org%2Flinux%2Fdocumentacion%2Fmigracion-exportacion-importacion-datos-drupal%2F&amp;linkname=Migraci%C3%B3n%20de%20datos%20en%20Drupal" title="Facebook" rel="nofollow" target="_blank"><img src="http://blog.zerial.org/wp-content/plugins/add-to-any/icons/facebook.png" width="16" height="16" alt="Facebook"/></a> <a href="http://www.addtoany.com/add_to/google_bookmarks?linkurl=http%3A%2F%2Fblog.zerial.org%2Flinux%2Fdocumentacion%2Fmigracion-exportacion-importacion-datos-drupal%2F&amp;linkname=Migraci%C3%B3n%20de%20datos%20en%20Drupal" title="Google Bookmarks" rel="nofollow" target="_blank"><img src="http://blog.zerial.org/wp-content/plugins/add-to-any/icons/google.png" width="16" height="16" alt="Google Bookmarks"/></a> <a href="http://www.addtoany.com/add_to/friendfeed?linkurl=http%3A%2F%2Fblog.zerial.org%2Flinux%2Fdocumentacion%2Fmigracion-exportacion-importacion-datos-drupal%2F&amp;linkname=Migraci%C3%B3n%20de%20datos%20en%20Drupal" title="FriendFeed" rel="nofollow" target="_blank"><img src="http://blog.zerial.org/wp-content/plugins/add-to-any/icons/friendfeed.png" width="16" height="16" alt="FriendFeed"/></a> <a href="http://www.addtoany.com/add_to/digg?linkurl=http%3A%2F%2Fblog.zerial.org%2Flinux%2Fdocumentacion%2Fmigracion-exportacion-importacion-datos-drupal%2F&amp;linkname=Migraci%C3%B3n%20de%20datos%20en%20Drupal" title="Digg" rel="nofollow" target="_blank"><img src="http://blog.zerial.org/wp-content/plugins/add-to-any/icons/digg.png" width="16" height="16" alt="Digg"/></a> <a href="http://www.addtoany.com/add_to/slashdot?linkurl=http%3A%2F%2Fblog.zerial.org%2Flinux%2Fdocumentacion%2Fmigracion-exportacion-importacion-datos-drupal%2F&amp;linkname=Migraci%C3%B3n%20de%20datos%20en%20Drupal" title="Slashdot" rel="nofollow" target="_blank"><img src="http://blog.zerial.org/wp-content/plugins/add-to-any/icons/slashdot.png" width="16" height="16" alt="Slashdot"/></a> <a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fblog.zerial.org%2Flinux%2Fdocumentacion%2Fmigracion-exportacion-importacion-datos-drupal%2F&amp;linkname=Migraci%C3%B3n%20de%20datos%20en%20Drupal">Compartir/Guardar</a> </p>]]></content:encoded>
			<wfw:commentRss>http://blog.zerial.org/linux/documentacion/migracion-exportacion-importacion-datos-drupal/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Jugando con Festival TTS</title>
		<link>http://blog.zerial.org/tips/jugando-con-festival-tts/</link>
		<comments>http://blog.zerial.org/tips/jugando-con-festival-tts/#comments</comments>
		<pubDate>Mon, 28 Sep 2009 03:30:17 +0000</pubDate>
		<dc:creator>Zerial</dc:creator>
				<category><![CDATA[Tips]]></category>
		<category><![CDATA[festival]]></category>
		<category><![CDATA[ocio]]></category>
		<category><![CDATA[tts]]></category>

		<guid isPermaLink="false">http://blog.zerial.org/?p=979</guid>
		<description><![CDATA[Festival es un software text-to-speech (TTS) o sintetizador de vóz que nos permite lograr que nuestra máquina nos hable o, más bien, nos lea algún texto. Con un poco de imaginación se pueden lograr cosas bastante simpáticas como hacer que nuestro computador nos diga la hora, nos lea los sitios web o el texto seleccionado [...]]]></description>
			<content:encoded><![CDATA[<p>Festival es un software text-to-speech (TTS) o sintetizador de vóz que nos permite lograr que nuestra máquina nos hable o, más bien, nos lea algún texto. Con un poco de imaginación se pueden lograr cosas bastante simpáticas como hacer que nuestro computador nos diga la hora, nos lea los sitios web o el texto seleccionado o simplemente para ocio.<br />
Existen paquetes para distintas distribuciones, como Archlinux o Debian, entre otras, para instalarlo directamente desde el gestor de paquetesa como pacman o apt-get, respectivamente. Podemos buscarlo como festvox o como festival y para ejecutarlo es súper simple:</p>
<p><code>comando | festival --tts</code></p>
<p>Y automaticamente leerá el texto pasado mediante <strong>pipe</strong>.<br />
Por ejemplo, un sencillo script para que nos diga la hora en español:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="re3">#!/bin/bash</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="re2">hora=</span>`<span class="kw2">date</span>`</div>
</li>
<li class="li1">
<div class="de1"><span class="re2">hora=</span>`<span class="kw3">echo</span> <span class="re1">$hora</span> |cut -f4 -d <span class="st0">&quot; &quot;</span>`</div>
</li>
<li class="li2">
<div class="de2"><span class="re2">h=</span>`<span class="kw3">echo</span> <span class="re1">$hora</span> |cut -f1 -d <span class="st0">&quot;:&quot;</span>`</div>
</li>
<li class="li1">
<div class="de1"><span class="re2">m=</span>`<span class="kw3">echo</span> <span class="re1">$hora</span> |cut -f2 -d <span class="st0">&quot;:&quot;</span>`</div>
</li>
<li class="li1">
<div class="de1"><span class="re2">s=</span>`<span class="kw3">echo</span> <span class="re1">$hora</span> |cut -f3 -d <span class="st0">&quot;:&quot;</span>`</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw3">echo</span> <span class="st0">&quot;Son las $h horas, $m minutos con $s segundos.&quot;</span> |festival --tts --language spanish</div>
</li>
</ol>
</div>
<p><span id="more-979"></span></p>
<p>Cuando usaba fluxbox, tenía uno atajo de teclado para hacer que me leyera lo que tenia en el portapapeles:</p>
<p><code>xsel --clipboard |iconv -f utf-8 -t iso-8859-1|festival --tts --language spanish</code></p>
<p>Con esto, pasamos el cotneindo del clipboard a ISO-8869-1 y le decimos a festival que lo lea en español.<br />
Acá hay un video demostrativo de lo que se puede hacer con festival:</p>
<p><span class="youtube">
<object width="480" height="360">
<param name="movie" value="http://www.youtube.com/v/VP3TUDm_9nk&amp;rel=1&amp;color1=d6d6d6&amp;color2=f0f0f0&amp;border=0&amp;fs=1&amp;hl=en&amp;autoplay=0&amp;showinfo=0&amp;iv_load_policy=3&amp;showsearch=0&amp;hd=1" />
<param name="allowFullScreen" value="true" />
<embed wmode="transparent" src="http://www.youtube.com/v/VP3TUDm_9nk&amp;rel=1&amp;color1=d6d6d6&amp;color2=f0f0f0&amp;border=0&amp;fs=1&amp;hl=en&amp;autoplay=0&amp;showinfo=0&amp;iv_load_policy=3&amp;showsearch=0&amp;hd=1" type="application/x-shockwave-flash" allowfullscreen="true" width="480" height="360"></embed>
<param name="wmode" value="transparent" />
</object>
</span><p><a href="http://www.youtube.com/watch?v=VP3TUDm_9nk&fmt=18">www.youtube.com/watch?v=VP3TUDm_9nk</a></p></p>
<p><a href="http://www.addtoany.com/add_to/delicious?linkurl=http%3A%2F%2Fblog.zerial.org%2Ftips%2Fjugando-con-festival-tts%2F&amp;linkname=Jugando%20con%20Festival%20TTS" title="Delicious" rel="nofollow" target="_blank"><img src="http://blog.zerial.org/wp-content/plugins/add-to-any/icons/delicious.png" width="16" height="16" alt="Delicious"/></a> <a href="http://www.addtoany.com/add_to/twitter?linkurl=http%3A%2F%2Fblog.zerial.org%2Ftips%2Fjugando-con-festival-tts%2F&amp;linkname=Jugando%20con%20Festival%20TTS" title="Twitter" rel="nofollow" target="_blank"><img src="http://blog.zerial.org/wp-content/plugins/add-to-any/icons/twitter.png" width="16" height="16" alt="Twitter"/></a> <a href="http://www.addtoany.com/add_to/facebook?linkurl=http%3A%2F%2Fblog.zerial.org%2Ftips%2Fjugando-con-festival-tts%2F&amp;linkname=Jugando%20con%20Festival%20TTS" title="Facebook" rel="nofollow" target="_blank"><img src="http://blog.zerial.org/wp-content/plugins/add-to-any/icons/facebook.png" width="16" height="16" alt="Facebook"/></a> <a href="http://www.addtoany.com/add_to/google_bookmarks?linkurl=http%3A%2F%2Fblog.zerial.org%2Ftips%2Fjugando-con-festival-tts%2F&amp;linkname=Jugando%20con%20Festival%20TTS" title="Google Bookmarks" rel="nofollow" target="_blank"><img src="http://blog.zerial.org/wp-content/plugins/add-to-any/icons/google.png" width="16" height="16" alt="Google Bookmarks"/></a> <a href="http://www.addtoany.com/add_to/friendfeed?linkurl=http%3A%2F%2Fblog.zerial.org%2Ftips%2Fjugando-con-festival-tts%2F&amp;linkname=Jugando%20con%20Festival%20TTS" title="FriendFeed" rel="nofollow" target="_blank"><img src="http://blog.zerial.org/wp-content/plugins/add-to-any/icons/friendfeed.png" width="16" height="16" alt="FriendFeed"/></a> <a href="http://www.addtoany.com/add_to/digg?linkurl=http%3A%2F%2Fblog.zerial.org%2Ftips%2Fjugando-con-festival-tts%2F&amp;linkname=Jugando%20con%20Festival%20TTS" title="Digg" rel="nofollow" target="_blank"><img src="http://blog.zerial.org/wp-content/plugins/add-to-any/icons/digg.png" width="16" height="16" alt="Digg"/></a> <a href="http://www.addtoany.com/add_to/slashdot?linkurl=http%3A%2F%2Fblog.zerial.org%2Ftips%2Fjugando-con-festival-tts%2F&amp;linkname=Jugando%20con%20Festival%20TTS" title="Slashdot" rel="nofollow" target="_blank"><img src="http://blog.zerial.org/wp-content/plugins/add-to-any/icons/slashdot.png" width="16" height="16" alt="Slashdot"/></a> <a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fblog.zerial.org%2Ftips%2Fjugando-con-festival-tts%2F&amp;linkname=Jugando%20con%20Festival%20TTS">Compartir/Guardar</a> </p>]]></content:encoded>
			<wfw:commentRss>http://blog.zerial.org/tips/jugando-con-festival-tts/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Drupal como Content Management Framework</title>
		<link>http://blog.zerial.org/mis-cosas/drupal-como-content-management-framework/</link>
		<comments>http://blog.zerial.org/mis-cosas/drupal-como-content-management-framework/#comments</comments>
		<pubDate>Sun, 27 Sep 2009 19:41:17 +0000</pubDate>
		<dc:creator>Zerial</dc:creator>
				<category><![CDATA[Mis cosas]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[cmf]]></category>
		<category><![CDATA[cms]]></category>
		<category><![CDATA[comunidad]]></category>
		<category><![CDATA[desarrollo]]></category>
		<category><![CDATA[drupal]]></category>
		<category><![CDATA[joomla]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://blog.zerial.org/?p=925</guid>
		<description><![CDATA[Están muy de moda los CMS (Content Management System) tales como WordPress, Joomla y Jaws, entre otros, por la facilidad y extensibilidad que tienen mediante módulos, plugins, widgets, themes, templates, etc. Desde hace 8 meses mas o menos que estoy en un proyecto que involucra la creación de un sistema para una comunidad de cientificos, [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://blog.zerial.org/wp-content/uploads/2009/09/drupal.png" alt="drupal" title="drupal" width="250" height="286" class="alignright size-full wp-image-976" />Están muy de moda los CMS (Content Management System) tales como <a href="http://wordpress.com" target="_blank">WordPress</a>, <a href="http://joomla.org" target="_blank">Joomla</a> y <a href="http://jaws-project.com" target="_blank">Jaws</a>, entre otros, por la facilidad y extensibilidad que tienen mediante módulos, plugins, widgets, themes, templates, etc. Desde hace 8 meses mas o menos que estoy en un proyecto que involucra la creación de un sistema para una comunidad de cientificos, usando <a href="http://drupal.org" target="_blank">Drupal</a>.</p>
<p><strong>¿Por qué Drupal?</strong></p>
<p>Drupal pretende ser mucho más que un gestor de contenidos, lo que busca ser es un gestor de comunidades, un <em>framework</em> para gestionar comunidades, lo que yo llamo CMF. Es extensible, permite la reutilización de código, utilización de templates/themes propios y muchas otras cosas.</p>
<p><strong>¿Por qué NO WordPress, Joomla u otro CMS?</strong></p>
<p>Un CMS, com su nombre lo dice, es un <em>sistema</em> gestor de contenidos, están más orientados a blogs o sitios que no implican una cantidad grande de usuarios y contenido y tipos de contenidos. Lo que yo necesitaba, era un <strong>framework</strong> para gestionar una comunidad.</p>
<p>¿Se entiende?</p>
<p><span id="more-925"></span></p>
<p>El sitio en el que estoy trabajando tiene más de mil usuarios y tiene una cantidad enorme de contenido que se va generando día a día, para esto es necesario <em>algo</em> que me permita gestionarlo y que tenga gran parte del código desarrollado, es decir, que existan plugins o módulos ya hechos y que sólo haga falta modificarlos o adaptarlos a lo que necesitamos. Para <a href="http://drupal.org" target="_blank">Drupal</a> encontramos una serie como por ejemplo el conocido OG:</p>
<blockquote><p><strong>O</strong>rganic <strong>G</strong>roups: Enable users to create and manage their own &#8216;groups&#8217;. Each group can have subscribers, and maintains a group home page where subscribers communicate amongst themselves</p></blockquote>
<p>Con esto tenemos la posibilidad de que los usuarios creen sus propios grupos, manejen sus suscripciones, creen noticias relacionadas al grupo, privadas o públicas, administración y moderación de grupos, etc.<br />
Tambien es posible crear perfiles personalizados para cada usuario usando el módulo ContentProfile:</p>
<blockquote><p><strong>Content Profile</strong>: is module builds user profiles as content (aka nodes), which opens the opportunity to use all the powerful modules for content for user profiles too, e.g. the Content Construction Kit (CCK).</p></blockquote>
<p>La creación de módulos propios es bien sencilla, sólo hay que entender cómo trabaja los templates, páginas, nodos, etc. La tarea de creación de módulos se facilita bastante gracias a los <a href="http://api.drupal.org/api/group/hooks" target="_blank"><strong>hooks</strong></a>, con esto es posible modificar comportamientos de otros módulos (contrib y propios del sistema) y lograr tener un control casi completo del sistema. La idea es, por ningun motivo, <em>tocar</em> el <strong>core</strong> de Drupal, de lo contrario será muy difícil la mantención del sistema (actualizaciones, etc).<br />
Drupal tambien nos provee de una API, muy completa, la cual podemos trabajar usando las funcionalidades y bondades de Drupal sin tener que usar Drupal -<em>valga la redundancia</em>-. Por ejemplo, hace unos meses tuve que usar sólo el módulo &#8220;forum&#8221; de Drupal para integrarlo con un sitio que ya estaba desarrollado, ajeno a Drupal. Tambien es muy útil cuando se necesita hacer migración de usuarios y/o contenido de una plataforma a otra. Para usar la API sólo necesitamos descargar el código fuente y tener las siguientes líneas:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw1">include_once</span> <span class="st0">&#8216;api/includes/bootstrap.inc&#8217;</span>;</div>
</li>
<li class="li1">
<div class="de1">drupal_bootstrap<span class="br0">&#40;</span>DRUPAL_BOOTSTRAP_FULL<span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>(<em>siendo el directorio <strong>api</strong> dónde tenemos el código fuente de Drupal</em>)</p>
<p>Y listo, ya podemos usar todas las funciones o métodos, variables, constantes, etc.</p>
<p>La versión estable actual de Drupal es la 6, se está trabajando en la 7 que será orientada a objetos. El problema de esto, es que cada vez que se lanza una version nueva (4→5, 5→6, 6→7), los desarrolladores deben volver a programar sus módulos, ya que Drupal no tiene compatibilidad retroactiva.</p>
<p><strong>Links:</strong></p>
<p><a href="http://drupalmodules.com" target="_blank">Drupal Modules</a>: Repositorio muy completo con distintos módulos para distintas versiones de Drupal .<br />
<a href="http://api.drupal.org/" target="_blank">Documentación de la API</a></p>
<p><strong>Lectura recomendada</strong>:</p>
<p><a href="http://www.amazon.com/Pro-Drupal-Development-John-VanDyk/dp/1590597559"><img src="http://blog.zerial.org/wp-content/uploads/2009/09/images.jpeg" alt="images" title="images" width="130" height="87" class="aligncenter size-full wp-image-974" /></a></p>
<p><a href="http://www.addtoany.com/add_to/delicious?linkurl=http%3A%2F%2Fblog.zerial.org%2Fmis-cosas%2Fdrupal-como-content-management-framework%2F&amp;linkname=Drupal%20como%20Content%20Management%20Framework" title="Delicious" rel="nofollow" target="_blank"><img src="http://blog.zerial.org/wp-content/plugins/add-to-any/icons/delicious.png" width="16" height="16" alt="Delicious"/></a> <a href="http://www.addtoany.com/add_to/twitter?linkurl=http%3A%2F%2Fblog.zerial.org%2Fmis-cosas%2Fdrupal-como-content-management-framework%2F&amp;linkname=Drupal%20como%20Content%20Management%20Framework" title="Twitter" rel="nofollow" target="_blank"><img src="http://blog.zerial.org/wp-content/plugins/add-to-any/icons/twitter.png" width="16" height="16" alt="Twitter"/></a> <a href="http://www.addtoany.com/add_to/facebook?linkurl=http%3A%2F%2Fblog.zerial.org%2Fmis-cosas%2Fdrupal-como-content-management-framework%2F&amp;linkname=Drupal%20como%20Content%20Management%20Framework" title="Facebook" rel="nofollow" target="_blank"><img src="http://blog.zerial.org/wp-content/plugins/add-to-any/icons/facebook.png" width="16" height="16" alt="Facebook"/></a> <a href="http://www.addtoany.com/add_to/google_bookmarks?linkurl=http%3A%2F%2Fblog.zerial.org%2Fmis-cosas%2Fdrupal-como-content-management-framework%2F&amp;linkname=Drupal%20como%20Content%20Management%20Framework" title="Google Bookmarks" rel="nofollow" target="_blank"><img src="http://blog.zerial.org/wp-content/plugins/add-to-any/icons/google.png" width="16" height="16" alt="Google Bookmarks"/></a> <a href="http://www.addtoany.com/add_to/friendfeed?linkurl=http%3A%2F%2Fblog.zerial.org%2Fmis-cosas%2Fdrupal-como-content-management-framework%2F&amp;linkname=Drupal%20como%20Content%20Management%20Framework" title="FriendFeed" rel="nofollow" target="_blank"><img src="http://blog.zerial.org/wp-content/plugins/add-to-any/icons/friendfeed.png" width="16" height="16" alt="FriendFeed"/></a> <a href="http://www.addtoany.com/add_to/digg?linkurl=http%3A%2F%2Fblog.zerial.org%2Fmis-cosas%2Fdrupal-como-content-management-framework%2F&amp;linkname=Drupal%20como%20Content%20Management%20Framework" title="Digg" rel="nofollow" target="_blank"><img src="http://blog.zerial.org/wp-content/plugins/add-to-any/icons/digg.png" width="16" height="16" alt="Digg"/></a> <a href="http://www.addtoany.com/add_to/slashdot?linkurl=http%3A%2F%2Fblog.zerial.org%2Fmis-cosas%2Fdrupal-como-content-management-framework%2F&amp;linkname=Drupal%20como%20Content%20Management%20Framework" title="Slashdot" rel="nofollow" target="_blank"><img src="http://blog.zerial.org/wp-content/plugins/add-to-any/icons/slashdot.png" width="16" height="16" alt="Slashdot"/></a> <a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fblog.zerial.org%2Fmis-cosas%2Fdrupal-como-content-management-framework%2F&amp;linkname=Drupal%20como%20Content%20Management%20Framework">Compartir/Guardar</a> </p>]]></content:encoded>
			<wfw:commentRss>http://blog.zerial.org/mis-cosas/drupal-como-content-management-framework/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
