<?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; Documentacion</title>
	<atom:link href="http://blog.zerial.org/category/linux/documentacion/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, 03 Jan 2012 00:13:53 +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>Manipular volúmenes lógicos (LVM) en discos virtuales</title>
		<link>http://blog.zerial.org/linux/manipular-volumenes-logicos-lvm-en-discos-virtuales/</link>
		<comments>http://blog.zerial.org/linux/manipular-volumenes-logicos-lvm-en-discos-virtuales/#comments</comments>
		<pubDate>Wed, 14 Sep 2011 07:48:50 +0000</pubDate>
		<dc:creator>Zerial</dc:creator>
				<category><![CDATA[Documentacion]]></category>
		<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[gnu]]></category>
		<category><![CDATA[gnu/linux]]></category>
		<category><![CDATA[kpartx]]></category>
		<category><![CDATA[losetup]]></category>
		<category><![CDATA[lvm]]></category>
		<category><![CDATA[virtual machine]]></category>
		<category><![CDATA[virtualizacion]]></category>
		<category><![CDATA[vm]]></category>
		<category><![CDATA[xen]]></category>

		<guid isPermaLink="false">http://blog.zerial.org/?p=2673</guid>
		<description><![CDATA[Me refiero a discos virtuales a los que creamos usando dd. Cuando creamos un disco utilizando por ejemplo dd if=/dev/zero of=imagen.img y lo usamos para crear una máquina virtual, en este caso con Xen, luego le instalamos un sistema operativo que maneje ya sea CentOS, RHEL, Debian o cualquier otro que maneje LVM en la [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.zerial.org/wp-content/uploads/2011/09/quantum-bigfoot.jpg"><img class="alignleft size-full wp-image-2680" style="margin: 4px;" title="quantum-bigfoot" src="http://blog.zerial.org/wp-content/uploads/2011/09/quantum-bigfoot.jpg" alt="" width="181" height="154" /></a>Me refiero a <strong>discos virtuales</strong> a los que creamos usando <strong>dd</strong>. Cuando creamos un disco utilizando por ejemplo <em>dd if=/dev/zero of=imagen.img</em> y lo usamos para crear una máquina virtual, en este caso con Xen, luego le instalamos un sistema operativo que maneje ya sea CentOS, RHEL, Debian o cualquier otro que maneje LVM en la instalación, hay veces que necesitamos manipularlo ya sea para clonarlo, hacerle mantención o simplemente montarlo para ver los archivos. En mi caso, tuve que clonar la máquina virtual en caliente y quedó el FS corrupto, por lo que tuve que corregirlo, tambien sirve para hacer tareas de mantención como aumentar o disminuir el tamaño del disco o volúmenes lógicos.</p>
<p>Tengo mi disco original llamado &#8220;<em>vm1.img</em>&#8221; y la clono simplemente con un <strong>cp</strong> o bien con &#8220;<strong>dd if=vm1.img vm1_clon.img</strong>&#8220;, paso a paso, lo que tenemos que hacer es:</p>
<ol>
<li>Crear un dispositivo &#8220;loop&#8221; en base a nuestro disco virtual</li>
<li>Mapear el dispositivo loop creado</li>
<li>Revisar los dispositivos creados en /dev/mapper/</li>
<li>Activar el volúmen y realizar las tareas necesarias</li>
</ol>
<p>Las herramientas que usé son <a href="http://linux.die.net/man/8/losetup">losetup</a>, <a href="http://linux.die.net/man/8/kpartx">kpartx</a> y <a href="http://linux.die.net/man/8/vgchange">vgchange</a>.</p>
<p><span id="more-2673"></span></p>
<p>Primero, ya tenemos nuestro disco creado, en este caso lo llamaré &#8220;testing&#8221; y tiene un tamaño de 80GB.<br />
<code># fdisk -l testing</p>
<p>Disk testing: 85.9 GB, 85899345920 bytes<br />
255 heads, 63 sectors/track, 10443 cylinders, total 167772160 sectors<br />
Units = sectors of 1 * 512 = 512 bytes<br />
Sector size (logical/physical): 512 bytes / 512 bytes<br />
I/O size (minimum/optimal): 512 bytes / 512 bytes<br />
Disk identifier: 0x0007759f</p>
<p>  Device Boot      Start         End      Blocks   Id  System<br />
testing1   *          63      208844      104391   83  Linux<br />
testing2          208845   167766794    83778975   8e  Linux LVM</code></p>
<p>Para comenzar vamos a usar el comando <strong>losetup</strong> para crear un dispositivo &#8220;loop&#8221; en base a nuestra imagen de disco, para esto ejecutamos:</p>
<p><code># losetup -f testing</code></p>
<p>Y verificamos con el mismo comando losetup que se haya creado</p>
<p><code># losetup -a<br />
/dev/loop0: [fe01]:24577 (/mnt/vardata/testing)</code></p>
<p>Ya tenemos nuestro dispositivo &#8220;loop&#8221; en /dev/loop0 mapeado a la imagen de disco virtual ubicada en /mnt/vardata/testing. </p>
<p>Ahora debemos usar la herramienta <strong>kpartx</strong> para <em>mapear</em> ese dispositivo que hemos mapeado a nuestro disco virtual hacia nuestro administrador de volúmenes lógicos</p>
<p><code># kpartx -a -v /dev/loop0<br />
add map loop0p1 (254:2): 0 208782 linear /dev/loop0 63<br />
add map loop0p2 (254:3): 0 167557950 linear /dev/loop0 208845</code></p>
<p>Ahora tenemos otros dispositivos creados en /dev/mapper, corresponden a &#8220;loop0p1&#8243; y &#8220;loop0p2&#8243; correspondientes a las particiones de nuestro disco virtual. Así debería ser presentarse:</p>
<p><code># ls -lia /dev/mapper/<br />
total 0<br />
   1072 drwxr-xr-x  2 root root     140 sep 13 15:19 .<br />
      3 drwxr-xr-x 15 root root    3260 sep 13 15:19 ..<br />
   1073 crw-------  1 root root 10, 236 ago 11 12:12 control<br />
2672529 lrwxrwxrwx  1 root root       7 sep 13 15:19 loop0p1 -&gt; ../dm-2<br />
2671232 lrwxrwxrwx  1 root root       7 sep 13 15:19 loop0p2 -&gt; ../dm-3<br />
   3655 lrwxrwxrwx  1 root root       7 ago 11 12:12 VolGroup_ID_15211-backup -&gt; ../dm-0<br />
   3672 lrwxrwxrwx  1 root root       7 ago 11 12:12 VolGroup_ID_15211-vardata -&gt; ../dm-1</code></p>
<p>Y el comando <strong>vgdisplay</strong> debería mostrar la información del grupo</p>
<p><code># vgdisplay<br />
  --- Volume group ---<br />
  VG Name               VolGroup00<br />
  System ID<br />
  Format                lvm2<br />
  Metadata Areas        1<br />
  Metadata Sequence No  3<br />
  VG Access             read/write<br />
  VG Status             resizable<br />
  MAX LV                0<br />
  Cur LV                2<br />
  Open LV               0<br />
  Max PV                0<br />
  Cur PV                1<br />
  Act PV                1<br />
  VG Size               79,88 GiB<br />
  PE Size               32,00 MiB<br />
  Total PE              2556<br />
  Alloc PE / Size       2556 / 79,88 GiB<br />
  Free  PE / Size       0 / 0<br />
  VG UUID               yAIBPd-1PD6-IN1U-aoK7-bLSW-rz08-ERktCp</code></p>
<p>Y con <strong>lvdisplay</strong> revisamos la información de los volúmenes dentro del grupo VolGroup00</p>
<p><code># lvdisplay VolGroup00<br />
  --- Logical volume ---<br />
  LV Name                /dev/VolGroup00/LogVol00<br />
  VG Name                VolGroup00<br />
  LV UUID                Du8Hwj-BUff-RhS3-lNTZ-KsxS-jvEp-S71om4<br />
  LV Write Access        read/write<br />
  LV Status              NOT available<br />
  LV Size                77,84 GiB<br />
  Current LE             2491<br />
  Segments               1<br />
  Allocation             inherit<br />
  Read ahead sectors     auto</p>
<p>  --- Logical volume ---<br />
  LV Name                /dev/VolGroup00/LogVol01<br />
  VG Name                VolGroup00<br />
  LV UUID                Sg3KQG-F3Ad-kgIx-yJi0-OSxm-fBUg-bKUR3O<br />
  LV Write Access        read/write<br />
  LV Status              NOT available<br />
  LV Size                2,03 GiB<br />
  Current LE             65<br />
  Segments               1<br />
  Allocation             inherit<br />
  Read ahead sectors     auto</code></p>
<p>Si te fijan en un detalle, en ambos volúmenes, el estado es &#8220;<strong>NOT available</strong>&#8220;, pues debemos activarlo</p>
<p><code># vgchange VolGroup00 -a y<br />
  2 logical volume(s) in volume group "VolGroup00" now active</code></p>
<p>Y volvemos a revisar</p>
<p><code># lvdisplay VolGroup00<br />
  --- Logical volume ---<br />
  LV Name                /dev/VolGroup00/LogVol00<br />
  VG Name                VolGroup00<br />
  LV UUID                Du8Hwj-BUff-RhS3-lNTZ-KsxS-jvEp-S71om4<br />
  LV Write Access        read/write<br />
<strong>  LV Status              available</strong><br />
  # open                 0<br />
  LV Size                77,84 GiB<br />
  Current LE             2491<br />
  Segments               1<br />
  Allocation             inherit<br />
  Read ahead sectors     auto<br />
  - currently set to     256<br />
  Block device           254:4</p>
<p>  --- Logical volume ---<br />
  LV Name                /dev/VolGroup00/LogVol01<br />
  VG Name                VolGroup00<br />
  LV UUID                Sg3KQG-F3Ad-kgIx-yJi0-OSxm-fBUg-bKUR3O<br />
  LV Write Access        read/write<br />
<strong>  LV Status              available</strong><br />
  # open                 0<br />
  LV Size                2,03 GiB<br />
  Current LE             65<br />
  Segments               1<br />
  Allocation             inherit<br />
  Read ahead sectors     auto<br />
  - currently set to     256<br />
  Block device           254:5</code></p>
<p>Ya los tenemos disponibles y ahora podemos trabajar con ese volúmen como si fuese un &#8220;lvm&#8221; normal, realizar tareas de mantención, montar el volumen, disminuir o aumentar su tamaño, etc.</p>
<p>Cuando ya terminemos de hacer todo lo que queramos con el disco virtual, hay que volver todo a la normalidad, haciendo los pasos inversos:</p>
<p><strong>Desactivar el volumen</strong><br />
<code># vgchange VolGroup00 -a n<br />
  0 logical volume(s) in volume group "VolGroup00" now active</code></p>
<p><strong>Remover el mapeo de los dispositivos loop0p1 y loop0p2</strong> creados desde loop0<br />
<code># kpartx -d /dev/loop0</code></p>
<p><strong>Remover el mapeo de /dev/loop0</strong> creado desde nuestro disco virtual &#8220;testing&#8221;<br />
<code># losetup -v -d /dev/loop0</code></p>
<p>Ya dejamos todo como estaba y podemos volver a utilizar nuestro disco virtual.</p>
<div id="bottomcontainerBox" style="border:1px solid #808080;">
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fblog.zerial.org%2Flinux%2Fmanipular-volumenes-logicos-lvm-en-discos-virtuales%2F&amp;layout=button_count&amp;show_faces=false&amp;width=85&amp;action=like&amp;font=verdana&amp;colorscheme=light&amp;height=21" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width=85px; height:21px;" allowTransparency="true"></iframe></div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<g:plusone size="medium" href="http://blog.zerial.org/linux/manipular-volumenes-logicos-lvm-en-discos-virtuales/"></g:plusone>
			</div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<a href="http://twitter.com/share" class="twitter-share-button" data-url="http://blog.zerial.org/linux/manipular-volumenes-logicos-lvm-en-discos-virtuales/"  data-text="Manipular volúmenes lógicos (LVM) en discos virtuales" data-count="horizontal" data-via="Zerial">Tweet</a>
			</div>			
			</div><div style="clear:both"></div><div style="padding-bottom:4px;"></div>]]></content:encoded>
			<wfw:commentRss>http://blog.zerial.org/linux/manipular-volumenes-logicos-lvm-en-discos-virtuales/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>[PoC] Cifrado del historial de bash (.bash_history)</title>
		<link>http://blog.zerial.org/linux/poc-cifrado-del-historial-de-bash-bash_history/</link>
		<comments>http://blog.zerial.org/linux/poc-cifrado-del-historial-de-bash-bash_history/#comments</comments>
		<pubDate>Thu, 03 Feb 2011 14:18:16 +0000</pubDate>
		<dc:creator>Zerial</dc:creator>
				<category><![CDATA[Documentacion]]></category>
		<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[Privacidad]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[bash_history]]></category>
		<category><![CDATA[cifrado]]></category>
		<category><![CDATA[comandos]]></category>
		<category><![CDATA[gnu/linux]]></category>
		<category><![CDATA[gnupg]]></category>
		<category><![CDATA[gpg]]></category>
		<category><![CDATA[pgp]]></category>
		<category><![CDATA[privacidad]]></category>
		<category><![CDATA[root]]></category>
		<category><![CDATA[Seguridad]]></category>
		<category><![CDATA[unix]]></category>

		<guid isPermaLink="false">http://blog.zerial.org/?p=2077</guid>
		<description><![CDATA[El otro día, en mis momentos de ocio, se me ocurrio buscar una forma de cifrar el historial de comandos que guarda bash. Hay servidores que sólo tenemos -o hemos ganado- acceso como usuarios, y no nos gusta que el administrador (root) vea lo que hacemos o los comandos que hemos ejecutado. Existen varias formas [...]]]></description>
			<content:encoded><![CDATA[<p>El otro día, en mis momentos de ocio, se me ocurrio buscar una forma de cifrar el historial de comandos que guarda bash. Hay servidores que sólo tenemos -o hemos ganado- acceso como usuarios, y no nos gusta que el administrador (root) vea lo que hacemos o los comandos que hemos ejecutado. Existen varias formas de ir contra eso, por ejemplo eliminar el bash_history o bien editarlo cada vez que hacemos algo que no queremos que sepan. Esta forma es un poco mas rebuscada y busca cifrar mediante GPG el historial, de manera tal que el root no podrá leer lo que dice el archivo.</p>
<p>La logica es bastante simple:</p>
<ol>
<li>Cuando ingresamos (login) a nuestra cuenta desciframos el bash history usando nuestra clave privada</li>
<li>Cuando salimos (logout) ciframos el archivo con nuestra clave publica.</li>
</ol>
<p>Para lograrlo vamos a necesitar tener una clave gpg y configurar el comportamiento del login y logout con unos scripts que les mostraré a continuación.</p>
<p><span id="more-2077"></span></p>
<p>Vamos a usar el usuario &#8220;usuario&#8221; de prueba. Primero, creamos la clave GPG:</p>
<p><code>[usuario@belcebu ~]$ gpg --gen-key</code></p>
<p>En mi caso, generé una clave de 2048 bits con el UID<strong> Usuario de Prueba (Historial Cifrado) &lt;test@zerial.org&gt;</strong></p>
<p>Editamos el archivo .<strong>bashrc</strong> y agregamos las siguientes lineas</p>
<pre class="c" name="code">gpg -d -r "Usuario de Prueba (Historial Cifrado) &lt;test@zerial.org>" $HISTFILE >$HOME/._bash_history
mv $HOME/._bash_history $HISTFILE</pre>
<p>Luego creamos el siguiente script, lo llamaremos <strong>.crypt_history.sh</strong>:</p>
<pre class="c" name="code">#!/bin/bash

sleep 2;
gpg -e -r "Usuario de Prueba (Historial Cifrado) &lt;test@zerial.org>" $HOME/.bash_history
mv $HOME/.bash_history.gpg $HOME/.bash_history</pre>
<p>Y agregamos la línea</p>
<pre name="code" class="c">nohup sh $HOME/.crypt_history.sh &#038;</pre>
<p>Al archivo <strong>.bash_logout</strong></p>
<p>De esta forma, al ingresar como <em>usuario</em> se ejecutará automaticamente el comando que descifra el .bash_history y cuando salimos, será cifrado.</p>
<blockquote><p>[root@belcebu ~]# cat /home/usuario/.bash_history<br />
zå¬ÈùrèÿJx¨¸QÕ{¥	±5#ºcHb¶÷çFÀ®ú4ÞÃØÝ­xbZúF çïkågµNÒ¸5îÅ£	³KÝ0U¯º±YHú#ÙÞ©Ù&#038;¶þ¢Lyug<br />
                                                                                                þ<br />
ÓL¹ðú®&#038;°í¾vI?V\9Õx&#8217;{4hÐaÜdÛPÅ©²¦öcñm¾O&#8217;µÔ2Éªðá¸ó²ëÕÁ²Nª<n æq#È`>OÈ`A²U´¬Uîkï<br />
u:÷ÛASþdè¶]1ê¬GBXLT¥3þ0Ñ_8uóâEQ¯`.¾Kn3AÒy»çÌ¡øyà$ßÙkíKzÜ§¸×&#8217;Øx¿S¥<br />
                                                                 ÂâÆâveó´Î/¸)aýü4µÅ:mCú}1Á$äãÑõæ>¥ÈM9IÈÛ³=PË^q{Ñ<br />
3º ë]Å¿74ë*Ø<br />
Öuå¦<br />
   [root@belcebu ~]#</n></p></blockquote>
<p>Y si ingresamos como usuario &#8230;</p>
<blockquote><p>gpg: encrypted with 2048-bit RSA key, ID C8F972E8, created 2011-02-03<br />
      &#8220;Usuario de Prueba (Historial Cifrado) <test @zerial.org>&#8221;<br />
[usuario@belcebu ~]$ history<br />
    1  cat nohup.out<br />
    2  vim .bashrc<br />
    3  vim .crypt_history.sh<br />
    4  ls<br />
    5  history<br />
    6  ls -lia<br />
    7  history<br />
[usuario@belcebu ~]$ </test></p></blockquote>
<p>Existe un pequeño detalle, es que el root puede ingresar como usuario y de esta forma poder el historial. Pero para esto, nosotros debemos proteger nuestro cifrado con un passphrase, asi cuando el root quiera ingresar como usuario, éste le pedira una clave para poder descifrar el archivo bash_history, si el root no maneja esa clave no podrá ver lo que hay.</p>
<p>Esto es solo una prueba de concepto (PoC), se puede hacer cualquier modificación a los scripts usados para adaptarlos a otras necesidades y obviamente mejorar el cifrado mismo del bash_history.<br />
<strong>Nota: </strong>Existen varios <em>peros</em> en esta forma de cifrar, que obviamente pueden ser mejoradas, por ejemplo, podria existir algun conflicto cuando se inicia mas de una vez la sesion del usuario.</p>
<div id="bottomcontainerBox" style="border:1px solid #808080;">
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fblog.zerial.org%2Flinux%2Fpoc-cifrado-del-historial-de-bash-bash_history%2F&amp;layout=button_count&amp;show_faces=false&amp;width=85&amp;action=like&amp;font=verdana&amp;colorscheme=light&amp;height=21" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width=85px; height:21px;" allowTransparency="true"></iframe></div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<g:plusone size="medium" href="http://blog.zerial.org/linux/poc-cifrado-del-historial-de-bash-bash_history/"></g:plusone>
			</div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<a href="http://twitter.com/share" class="twitter-share-button" data-url="http://blog.zerial.org/linux/poc-cifrado-del-historial-de-bash-bash_history/"  data-text="[PoC] Cifrado del historial de bash (.bash_history)" data-count="horizontal" data-via="Zerial">Tweet</a>
			</div>			
			</div><div style="clear:both"></div><div style="padding-bottom:4px;"></div>]]></content:encoded>
			<wfw:commentRss>http://blog.zerial.org/linux/poc-cifrado-del-historial-de-bash-bash_history/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Tethering con un BlackBerry 8520 en Archlinux via bluetooth</title>
		<link>http://blog.zerial.org/linux/thethering-bluetooth-usar-como-modem-telefono-gnu-linux/</link>
		<comments>http://blog.zerial.org/linux/thethering-bluetooth-usar-como-modem-telefono-gnu-linux/#comments</comments>
		<pubDate>Wed, 05 Jan 2011 17:09:10 +0000</pubDate>
		<dc:creator>Zerial</dc:creator>
				<category><![CDATA[Documentacion]]></category>
		<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[wireless]]></category>
		<category><![CDATA[3g]]></category>
		<category><![CDATA[archlinux]]></category>
		<category><![CDATA[blackberry]]></category>
		<category><![CDATA[bluetooth]]></category>
		<category><![CDATA[gnu/linux]]></category>
		<category><![CDATA[howto]]></category>
		<category><![CDATA[internet]]></category>
		<category><![CDATA[manual]]></category>
		<category><![CDATA[modem]]></category>
		<category><![CDATA[movil]]></category>
		<category><![CDATA[tethering]]></category>
		<category><![CDATA[trucos]]></category>

		<guid isPermaLink="false">http://blog.zerial.org/?p=2058</guid>
		<description><![CDATA[Si bien lo probé con Archlinux, tambien hay evidencias que funciona en Debian aunque, independiente de la distribución, debería funcionar para cualquiera. Tambien debería funcionar con cualquier celular que soporte &#8220;Dial Up&#8220;. Debemos tener instaladas las herramientas de bluetooth: bluez-utils bluez-libs dbus wvdial Primero, debemos poner el bluetooth del teléfono en modo escucha y escanearlo [...]]]></description>
			<content:encoded><![CDATA[<p>Si bien lo probé con Archlinux, tambien hay evidencias que funciona en Debian aunque, independiente de la distribución, debería funcionar para cualquiera. Tambien debería funcionar con cualquier celular que soporte &#8220;<em>Dial Up</em>&#8220;.<br />
Debemos tener instaladas las herramientas de bluetooth: <strong>bluez-utils bluez-libs dbus wvdial</strong></p>
<p>Primero, debemos poner el bluetooth del teléfono en modo <em>escucha</em> y escanearlo con nuestro disponisitivo, para ver si soporte el modo.</p>
<p><code>[root@balcebu zerial]# hcitool scan<br />
Scanning ...<br />
        F4:0B:93:DB:90:FF       BlackBerry 8520<br />
[root@balcebu zerial]#</code></p>
<p>Y vemos si soporta el modo <em>Dial Up</em></p>
<p><code>root@balcebu zerial]# sdptool browse F4:0B:93:DB:90:FF<br />
Browsing F4:0B:93:DB:90:FF ...<br />
[...]<br />
Service Name: Dialup Networking<br />
Service RecHandle: 0x10000<br />
Service Class ID List:<br />
  "<strong>Dialup Networking</strong>" (0x1103)<br />
  "Generic Networking" (0x1201)<br />
Protocol Descriptor List:<br />
  "L2CAP" (0x0100)<br />
  "RFCOMM" (0x0003)<br />
<strong>    Channel: 1</strong><br />
Profile Descriptor List:<br />
  "<strong>Dialup Networking</strong>" (0x1103)<br />
    Version: 0x0100<br />
[...]</code></p>
<p>En este caso soporta, en el canal 1.</p>
<p><span id="more-2058"></span></p>
<p>Hay que configurar el archivo /etc/bluetooth/rfcomm.conf</p>
<pre name="code" class="c">#
# RFCOMM configuration file.
#

rfcomm0 {
#       # Automatically bind the device at startup
        bind yes;
#
#       # Bluetooth address of the device
        device F4:0B:93:DB:90:FF;
#
#       # RFCOMM channel for the connection
        channel 1;
#
#       # Description of the connection
        comment "BlackBerry 8520";
}</pre>
<p>&#8220;device&#8221; corresponde a la MAC encontrada al hacer el scan, es decir, la de nuestro dispositivo movil y Channel, el canal en el cual está soportado el &#8220;Dial Up&#8221;.</p>
<p>Luego ejecutamos <strong>hidd &#8211;connect F4:0B:93:DB:90:FF</strong> y <strong>rfcomm connect 0</strong> para establecer la conexion con el telefono.</p>
<p><code>[root@balcebu bluetooth]# hidd --connect F4:0B:93:DB:90:FF<br />
[root@balcebu bluetooth]# rfcomm connect 0<br />
Connected /dev/rfcomm0 to F4:0B:93:DB:90:FF on channel 1<br />
Press CTRL-C for hangup</code></p>
<p>En el telefono debería aparecer la opción de &#8220;emparejamiento&#8221;. Ahora debemos configurar <strong>wvdial</strong>, editamos el archivo <strong>/etc/wvdial.conf</strong> y agregamos:</p>
<pre name="code" class="c">[Dialer blackberry]
Modem = /dev/rfcomm0
Baud = 115200
Dial Command = ATDT
Init2 = AT+CGDCONT=1,"IP","imovil.entelpcs.cl"
FlowControl = crtscts
Modem Type = Analog Modem
Username = entelpcs
Password = entelpcs
Stupid Mode = 1
New PPPD = yes
Phone = *99#</pre>
<p>En este caso, estoy conectado con el operador &#8220;entelpcs&#8221; y los datos corresponden a ésta compañía, en el caso de pertenecer a otro proveedor, deben camiar los datos&#8221; Init2, Username y Password por los que correspondan.<br />
Una vez añadida la configuración al archivo, ejecutamos</p>
<p><code># wvdial blackberry<br />
--&gt; WvDial: Internet dialer version 1.61<br />
--&gt; Cannot get information for serial port.<br />
--&gt; Initializing modem.<br />
--&gt; Sending: ATZ<br />
ATZ<br />
OK<br />
--&gt; Sending: AT+CGDCONT=1,"IP","imovil.entelpcs.cl"<br />
AT+CGDCONT=1,"IP","imovil.entelpcs.cl"<br />
OK<br />
--&gt; Modem initialized.<br />
--&gt; Sending: ATDT*99#<br />
--&gt; Waiting for carrier.<br />
ATDT*99#<br />
CONNECT<br />
--&gt; Carrier detected.  Starting PPP immediately.<br />
--&gt; Starting pppd at Wed Jan  5 09:52:13 2011<br />
--&gt; Pid of pppd: 24392<br />
--&gt; Using interface ppp0<br />
--&gt; pppd: Ð¶·¸[12][10]<br />
--&gt; pppd: Ð¶·¸[12][10]<br />
--&gt; pppd: Ð¶·¸[12][10]<br />
--&gt; pppd: Ð¶·¸[12][10]<br />
--&gt; local  IP address 186.10.247.119<br />
--&gt; pppd: Ð¶·¸[12][10]<br />
--&gt; remote IP address 169.254.1.1<br />
--&gt; pppd: Ð¶·¸[12][10]<br />
--&gt; primary   DNS address 200.63.56.3<br />
--&gt; pppd: Ð¶·¸[12][10]<br />
--&gt; secondary DNS address 200.63.56.4<br />
--&gt; pppd: Ð¶·¸[12][10] </code></p>
<p>Listo, el proveedor ya me asignó una ip publica y puedo navegar a traves de mi celular.</p>
<p>Referencias:</p>
<p>Bluetooth GPRS Howto: <a href="https://wiki.archlinux.org/index.php/Bluetooth_GPRS_Howto">https://wiki.archlinux.org/index.php/Bluetooth_GPRS_Howto</a><br />
Configurando un Blackberry como Modem en Debian: <a href="http://apostols.net/?p=176">http://apostols.net/?p=176</a><br />
Guía Bluetooth de Gentoo Linux: <a href="http://www.gentoo.org/doc/es/bluetooth-guide.xml">http://www.gentoo.org/doc/es/bluetooth-guide.xml</a></p>
<div id="bottomcontainerBox" style="border:1px solid #808080;">
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fblog.zerial.org%2Flinux%2Fthethering-bluetooth-usar-como-modem-telefono-gnu-linux%2F&amp;layout=button_count&amp;show_faces=false&amp;width=85&amp;action=like&amp;font=verdana&amp;colorscheme=light&amp;height=21" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width=85px; height:21px;" allowTransparency="true"></iframe></div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<g:plusone size="medium" href="http://blog.zerial.org/linux/thethering-bluetooth-usar-como-modem-telefono-gnu-linux/"></g:plusone>
			</div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<a href="http://twitter.com/share" class="twitter-share-button" data-url="http://blog.zerial.org/linux/thethering-bluetooth-usar-como-modem-telefono-gnu-linux/"  data-text="Tethering con un BlackBerry 8520 en Archlinux via bluetooth" data-count="horizontal" data-via="Zerial">Tweet</a>
			</div>			
			</div><div style="clear:both"></div><div style="padding-bottom:4px;"></div>]]></content:encoded>
			<wfw:commentRss>http://blog.zerial.org/linux/thethering-bluetooth-usar-como-modem-telefono-gnu-linux/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Esteganografía: Ofuscación de archivos (parte 2)</title>
		<link>http://blog.zerial.org/seguridad/esteganografia-ofuscacion-de-archivos-parte-2/</link>
		<comments>http://blog.zerial.org/seguridad/esteganografia-ofuscacion-de-archivos-parte-2/#comments</comments>
		<pubDate>Fri, 19 Nov 2010 14:10:22 +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[bash]]></category>
		<category><![CDATA[esconder archivos]]></category>
		<category><![CDATA[esteganografia]]></category>
		<category><![CDATA[hack]]></category>
		<category><![CDATA[ofuscacion]]></category>
		<category><![CDATA[ofuscacion de archivos]]></category>
		<category><![CDATA[scripting]]></category>
		<category><![CDATA[split]]></category>

		<guid isPermaLink="false">http://blog.zerial.org/?p=1935</guid>
		<description><![CDATA[Luego de haber enseñado como ofuscar un archivo dentro de otro, llegó el momento de saber como &#8220;separarlos&#8221;. En la primera parte, hubo comentarios de quienes tenian problemas porque se corrompía el archivo y no todas las versiones de unrar o unzip lo podían descomprimir, ya que obviamente, el archivo tiene muchos bits y bytes [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-1970" style="margin: 3px;" title="Microsoft Word - Document1" src="http://blog.zerial.org/wp-content/uploads/2010/11/fsplit.jpg" alt="" width="128" height="83" />Luego de haber enseñado como<em> ofuscar</em> un archivo dentro de otro, llegó el momento de saber como &#8220;separarlos&#8221;. En la primera parte, hubo comentarios de quienes tenian problemas porque se corrompía el archivo y no todas las versiones de unrar o unzip lo podían descomprimir, ya que obviamente, el archivo tiene muchos bits y bytes extras que no corresponden al zip, al rar o al archivo que escondimos. Una vez <em>separado</em> el archivo que hemos <em>escondido</em>, evitaremos todos estos problemas y tendremos nuestro archivo íntegro.</p>
<p>Para separar el archivo vamos a usar el comando <strong>split</strong>, que nos permite &#8220;dividir&#8221; o &#8220;cortar&#8221; un archivo por líneas, bytes, etc. En este caso, separaremos por bytes el archivo.<br />
La sintaxis de split para separar un archivo es tan simple como:</p>
<p><code>$ split --bytes=XXX archivo</code><br />
o tambien<br />
<code>$ split -b XXX archivo</code></p>
<p>De esta forma, el <strong>split</strong> separará el <strong>archivo</strong> cada <strong>XXX</strong> bytes, creando archivos de la forma <em>xab, xac, xad, &#8230; xaN</em>.<br />
Ejemplo:<br />
<code>[zerial@balcebu ejemplo_split]$ du -sh archivo.jpg<br />
48K	archivo.jpg<br />
[zerial@balcebu ejemplo_split]$ split -b 10000 archivo.jpg<br />
[zerial@balcebu ejemplo_split]$ ls<br />
archivo.jpg  xaa  xab  xac  xad  xae<br />
[zerial@balcebu ejemplo_split]$  du -csh *<br />
48K	archivo.jpg<br />
12K	xaa<br />
12K	xab<br />
12K	xac<br />
12K	xad<br />
8.0K	xae<br />
104K	total<br />
[zerial@balcebu ejemplo_split]$ </code></p>
<p>Para poder separar el archivo <em>ofuscado</em>, vamos a necesitar saber de antemano el tamaño del archivo original, para poder separarlo por esa cantidad de bytes.</p>
<p><span id="more-1935"></span></p>
<p>Siguiendo con el mismo ejemplo del primer post, aquí vamos:</p>
<p>Tenemos los tres archivos; el archivo principal, el archivo que queremos ofuscar y el archivo ya ofuscado<br />
<code>[zerial@balcebu ofuscar]$ ls -l<br />
total 816<br />
-rw-r--r-- 1 zerial users 408482 Oct 27 09:54 archivo.zip<br />
-rw-r--r-- 1 zerial users 414523 Oct 27 09:54 archivo_ofuscado.jpg<br />
-rw-r--r-- 1 zerial users   6041 Oct 27 09:52 dummie.jpg<br />
[zerial@balcebu ofuscar]$ </code></p>
<p>Nuestro fin es separar el archivo &#8220;archivo.zip&#8221; de &#8220;archivo_ofuscado.jpg&#8221;.<br />
<code>[zerial@balcebu ofuscar]$ mv archivo_ofuscado.jpg separacion/<br />
[zerial@balcebu ofuscar]$ cd separacion/<br />
[zerial@balcebu separacion]$ ls<br />
archivo_ofuscado.jpg<br />
[zerial@balcebu separacion]$ </code></p>
<p>Vemos el tamaño en bytes del archivo principal &#8220;dummie.jpg&#8221;<br />
<code>-rw-r--r-- 1 zerial users 6041 Oct 27 09:52 dummie.jpg</code></p>
<p>6041 bytes. Por tanto, tenemos que decirle a split, que nos divida el archivo_ofuscado.jpg en pequeños trozos de 6041 bytes cada uno.</p>
<p><code>[zerial@balcebu separacion]$ split -b 6041 archivo_ofuscado.jpg<br />
[zerial@balcebu separacion]$ ls -l<br />
total 956<br />
-rw-r--r-- 1 zerial users 414523 Oct 27 09:54 archivo_ofuscado.jpg<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xaa<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xab<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xac<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xad<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xae<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xaf<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xag<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xah<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xai<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xaj<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xak<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xal<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xam<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xan<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xao<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xap<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xaq<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xar<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xas<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xat<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xau<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xav<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xaw<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xax<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xay<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xaz<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xba<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xbb<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xbc<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xbd<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xbe<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xbf<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xbg<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xbh<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xbi<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xbj<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xbk<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xbl<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xbm<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xbn<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xbo<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xbp<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xbq<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xbr<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xbs<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xbt<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xbu<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xbv<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xbw<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xbx<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xby<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xbz<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xca<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xcb<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xcc<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xcd<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xce<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xcf<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xcg<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xch<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xci<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xcj<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xck<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xcl<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xcm<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xcn<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xco<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xcp<br />
-rw-r--r-- 1 zerial users   3735 Nov 19 10:57 xcq<br />
[zerial@balcebu separacion]$ </code></p>
<p>Ya tenemos dividido el archivo_ofuscado en pequeños trozos. Como nuestro archivo dummie.jpg teina un tamaño de 6041 bytes y es este archivo el que está por sobre el archivo ofuscado, el primer archivo que nos extrajo split corresponde a dummie.jpg; por tanto, renombramos <strong>xaa</strong> a <strong>dummie.jpg</strong> y concatenamos todos los demas archivos y lo llamamos <strong>archivo.zip</strong> (corresponde a nuestro archivo ofuscado)</p>
<p><code>[zerial@balcebu separacion]$ mv xaa dummie.jpg<br />
[zerial@balcebu separacion]$ cat x* &gt;archivo.zip<br />
[zerial@balcebu separacion]$ rm x*<br />
[zerial@balcebu separacion]$ ls -l<br />
total 816<br />
-rw-r--r-- 1 zerial users 408482 Nov 19 10:59 archivo.zip<br />
-rw-r--r-- 1 zerial users 414523 Oct 27 09:54 archivo_ofuscado.jpg<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 dummie.jpg<br />
[zerial@balcebu separacion]$ </code></p>
<p>Con esto ya hemos extraído nuestro archivo ofuscado. Para comparar que está íntegro y que realmente corresponde al original, comparemos los md5:</p>
<p><code>5c29dbb3975a5ffe31768b79548e1884  archivo.zip<br />
ded467af5a22134c44da18bc8d4fed1b  dummie.jpg<br />
5c29dbb3975a5ffe31768b79548e1884  ../archivo.zip<br />
ded467af5a22134c44da18bc8d4fed1b  ../dummie.jpg</code></p>
<p>Los dos primeros archivos corresponden a los archivos extraídos con split y los dos últimos a los archivos originales. Los md5 coinciden, por lo que lo hemos conseguido. Si ahora <em>unzipeamos</em> nuestro <strong>archivo.zip</strong>, no nos mostrará ningun warning, lo mismo pasara con winrar, etc.</p>
<p><code>[zerial@balcebu separacion]$ unzip archivo.zip<br />
Archive:  archivo.zip<br />
   creating: tipografias/<br />
  inflating: tipografias/Aller_Bd.ttf<br />
  inflating: tipografias/Aller_BdIt.ttf<br />
  inflating: tipografias/Aller_It.ttf<br />
  inflating: tipografias/Aller_Lt.ttf<br />
  inflating: tipografias/Aller_LtIt.ttf<br />
  inflating: tipografias/Aller_Rg.ttf<br />
  inflating: tipografias/AllerDisplay.ttf<br />
[zerial@balcebu separacion]$ </code></p>
<p>Sin warnings ni errores.</p>
<div id="bottomcontainerBox" style="border:1px solid #808080;">
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fblog.zerial.org%2Fseguridad%2Festeganografia-ofuscacion-de-archivos-parte-2%2F&amp;layout=button_count&amp;show_faces=false&amp;width=85&amp;action=like&amp;font=verdana&amp;colorscheme=light&amp;height=21" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width=85px; height:21px;" allowTransparency="true"></iframe></div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<g:plusone size="medium" href="http://blog.zerial.org/seguridad/esteganografia-ofuscacion-de-archivos-parte-2/"></g:plusone>
			</div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<a href="http://twitter.com/share" class="twitter-share-button" data-url="http://blog.zerial.org/seguridad/esteganografia-ofuscacion-de-archivos-parte-2/"  data-text="Esteganografía: Ofuscación de archivos (parte 2)" data-count="horizontal" data-via="Zerial">Tweet</a>
			</div>			
			</div><div style="clear:both"></div><div style="padding-bottom:4px;"></div>]]></content:encoded>
			<wfw:commentRss>http://blog.zerial.org/seguridad/esteganografia-ofuscacion-de-archivos-parte-2/feed/</wfw:commentRss>
		<slash:comments>4</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>
<div id="bottomcontainerBox" style="border:1px solid #808080;">
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fblog.zerial.org%2Fseguridad%2Fssh-port-forwarding-y-tunneling-saltarse-las-restricciones-del-firewall%2F&amp;layout=button_count&amp;show_faces=false&amp;width=85&amp;action=like&amp;font=verdana&amp;colorscheme=light&amp;height=21" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width=85px; height:21px;" allowTransparency="true"></iframe></div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<g:plusone size="medium" href="http://blog.zerial.org/seguridad/ssh-port-forwarding-y-tunneling-saltarse-las-restricciones-del-firewall/"></g:plusone>
			</div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<a href="http://twitter.com/share" class="twitter-share-button" data-url="http://blog.zerial.org/seguridad/ssh-port-forwarding-y-tunneling-saltarse-las-restricciones-del-firewall/"  data-text="SSH, Port Forwarding y Tunneling: Saltarse las restricciones del firewall" data-count="horizontal" data-via="Zerial">Tweet</a>
			</div>			
			</div><div style="clear:both"></div><div style="padding-bottom:4px;"></div>]]></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>mpd-twitter: Publicar en twitter lo que estas escuchando</title>
		<link>http://blog.zerial.org/linux/mpd-twitter-publicar-en-twitter-lo-que-estas-escuchando/</link>
		<comments>http://blog.zerial.org/linux/mpd-twitter-publicar-en-twitter-lo-que-estas-escuchando/#comments</comments>
		<pubDate>Sun, 10 Jan 2010 19:56:18 +0000</pubDate>
		<dc:creator>Zerial</dc:creator>
				<category><![CDATA[Documentacion]]></category>
		<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[archlinux]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[gnu/linux]]></category>
		<category><![CDATA[mpc]]></category>
		<category><![CDATA[mpd]]></category>
		<category><![CDATA[music player daemon]]></category>
		<category><![CDATA[pkgbuild]]></category>
		<category><![CDATA[script]]></category>
		<category><![CDATA[twtiter]]></category>

		<guid isPermaLink="false">http://blog.zerial.org/?p=1370</guid>
		<description><![CDATA[Ultimamente he estado usando el Music Player Daemon (MPD) para escuchar música. Tambien me he dado cuenta que en Twitter hace varios días está de trending topic el hashtag #nowplaying, donde la gente publica lo que está escuchando. En base a ésto y a un poco de imaginación y tiempo libre, cree un script en [...]]]></description>
			<content:encoded><![CDATA[<p>Ultimamente he estado usando el <a href="http://mpd.wikia.com/" target="_blank">Music Player Daemon (MPD)</a> para escuchar música. Tambien me he dado cuenta que en Twitter hace varios días está de <a href="http://twitter.com/#search?q=%23nowplaying" target="_blank"><em>trending topic</em> el hashtag #nowplaying</a>, donde la gente publica lo que está escuchando. En base a ésto y a un poco de imaginación y tiempo libre, cree un script en bash que me permite publicar lo que estoy escuchando.</p>
<p><a href="http://blog.zerial.org/wp-content/uploads/2010/01/shot_nowplaying.png"><img class="aligncenter size-full wp-image-1371" title="shot_nowplaying" src="http://blog.zerial.org/wp-content/uploads/2010/01/shot_nowplaying.png" alt="" width="600" height="200" /></a></p>
<p>El script, llamado <a href="http://dev.zerial.org/mpd-twitter" target="_blank">mpd-twitter</a>,  usa el cliente <strong>mpc</strong> para conectarse a <strong>mpd</strong> y obtener el artista y nombre de la reproducción actual, hacer el <em>parseo</em> necesario y posteriormente publica un estado en twitter.</p>
<p><span id="more-1370"></span></p>
<pre name="code" class="c">
#!/bin/bash
#
# Author: Zerial <fernando @zerial.org>
# Version: 0.1
# URL: http://dev.zerial.org/mpd-twitter
# License: GPL
#

CONF_FILE=$HOME/.mpd-twitter
USER=$(grep ^USERNAME $CONF_FILE |cut -f 2 -d "=")
PASS=$(grep ^PASSWORD $CONF_FILE |cut -f 2 -d "=")

if [ -f $CONF_FILE ]; then
	BEFORE=$(grep ^BEFORE $CONF_FILE |cut -f 2 -d "=")
	AFTER=$(grep ^AFTER $CONF_FILE |cut -f 2 -d "=")
else
	Xdialog --title "Error" --beep --msgbox "Can't read your local config file. Please copy the /usr/local/share/mpd-twitter/mpd-twitter.local to $HOME/.mpd-twitter" 200 100
	exit
fi

CURRENT_SONG=$(mpc current)
MY_UPDATE="$BEFORE $CURRENT_SONG $AFTER"

curl -u "$USER:$PASS" -d "status=$MY_UPDATE" -d "source=mpd-twit" "http://twitter.com/statuses/update.json"
exit
</fernando></pre>
<p>El archivo de configuración, que debe estar ubicado en <strong>~/.mpd-twitter</strong>, es:</p>
<pre name="code" class="c">
#
# Local Config file for mpd-twitter
#
#
# Config the username and password
#
USERNAME=your_username
PASSWORD=your_password
#
# Text before and text after the song.
# example:
# if BEFORE=Listening and AFTER=(powered by xxx)
# mpd-twitter will send "Listening <current song> (powered by xxx)"
#
BEFORE=#nowplaying
AFTER=(powered by mpd)
</current></pre>
<p>Para los usuarios de Archlinux que quieran probarlo, he creado un PKGBUILD:</p>
<pre name="code" class="php">
# Contributor: Zerial <fernando @zerial.org>
pkgname=mpd-twitter
pkgver=0.1
pkgrel=4
pkgdesc="Publish on twitter what you are listening on MPD"
arch=('i686' 'x86_64')
url="http://dev.zerial.org/mpd-twitter"
license=('GPL')
depends=('xdialog' 'curl' 'mpc')
source=(http://dev.zerial.org/mpd-twitter/${pkgname}_${pkgver}.tar.gz)
md5sums=('3d73b79fa38bd60f637386146137999b')

build(){
	cd $startdir/src/$pkgname
	install -d $startdir/pkg/usr/local/share/mpd-twitter
	mkdir $startdir/pkg/usr/bin
	install -m744 $startdir/src/$pkgname/mpd-twitter.local $startdir/pkg/usr/local/share/mpd-twitter/
	install -m755 $startdir/src/$pkgname/mpd-twitter $startdir/pkg/usr/bin/
}
</fernando></pre>
<p>Tambien lo pueden encontrar <a href="http://aur.archlinux.org/packages.php?ID=33483">en el repositorio AUR</a>.</p>
<p>La idea es lanzar el script con algun hotkey de nuestro gestor de ventanas y asi, cada véz que quieras mostrar lo que estás escuchando, simplemente precionas la combinacion de teclas que configuraste. Por ejemplo, en DWM la he configurado asi:</p>
<pre name="code" class="c">
[...]
/* commands */
static const char *mpdtwittercmd[] = { "mpd-twitter", NULL };
static Key keys[] = {
[...]
      { MODKEY|ShiftMask,                     XK_t,   spawn,  {.v = mpdtwittercmd } },
[...]
</pre>
<p>De esta forma, cada vez que presiono Alt+Shift + T, aparece en twitter lo que estoy escuchando.</p>
<div id="bottomcontainerBox" style="border:1px solid #808080;">
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fblog.zerial.org%2Flinux%2Fmpd-twitter-publicar-en-twitter-lo-que-estas-escuchando%2F&amp;layout=button_count&amp;show_faces=false&amp;width=85&amp;action=like&amp;font=verdana&amp;colorscheme=light&amp;height=21" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width=85px; height:21px;" allowTransparency="true"></iframe></div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<g:plusone size="medium" href="http://blog.zerial.org/linux/mpd-twitter-publicar-en-twitter-lo-que-estas-escuchando/"></g:plusone>
			</div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<a href="http://twitter.com/share" class="twitter-share-button" data-url="http://blog.zerial.org/linux/mpd-twitter-publicar-en-twitter-lo-que-estas-escuchando/"  data-text="mpd-twitter: Publicar en twitter lo que estas escuchando" data-count="horizontal" data-via="Zerial">Tweet</a>
			</div>			
			</div><div style="clear:both"></div><div style="padding-bottom:4px;"></div>]]></content:encoded>
			<wfw:commentRss>http://blog.zerial.org/linux/mpd-twitter-publicar-en-twitter-lo-que-estas-escuchando/feed/</wfw:commentRss>
		<slash:comments>6</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>
<div id="bottomcontainerBox" style="border:1px solid #808080;">
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fblog.zerial.org%2Flinux%2Fbottom-stack-en-dynamic-window-manager-dwm%2F&amp;layout=button_count&amp;show_faces=false&amp;width=85&amp;action=like&amp;font=verdana&amp;colorscheme=light&amp;height=21" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width=85px; height:21px;" allowTransparency="true"></iframe></div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<g:plusone size="medium" href="http://blog.zerial.org/linux/bottom-stack-en-dynamic-window-manager-dwm/"></g:plusone>
			</div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<a href="http://twitter.com/share" class="twitter-share-button" data-url="http://blog.zerial.org/linux/bottom-stack-en-dynamic-window-manager-dwm/"  data-text="Bottom Stack en Dynamic Window Manager (DWM)" data-count="horizontal" data-via="Zerial">Tweet</a>
			</div>			
			</div><div style="clear:both"></div><div style="padding-bottom:4px;"></div>]]></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>Cruzando la información en un sitio web vulnerable</title>
		<link>http://blog.zerial.org/seguridad/cruzando-la-informacion-en-un-sitio-web-vulnerable/</link>
		<comments>http://blog.zerial.org/seguridad/cruzando-la-informacion-en-un-sitio-web-vulnerable/#comments</comments>
		<pubDate>Sat, 05 Dec 2009 12:49:55 +0000</pubDate>
		<dc:creator>Zerial</dc:creator>
				<category><![CDATA[Documentacion]]></category>
		<category><![CDATA[Hacking]]></category>
		<category><![CDATA[Seguridad]]></category>
		<category><![CDATA[cross-site scripting]]></category>
		<category><![CDATA[vulnerabilidades]]></category>
		<category><![CDATA[vulnerabilidades web]]></category>
		<category><![CDATA[xss]]></category>

		<guid isPermaLink="false">http://blog.zerial.org/?p=1170</guid>
		<description><![CDATA[En los artículos que he escrito relacionado a vulnerabilidades webs más comunes siempre aparece el legendario Cross-Site Scripting o XSS. Una vulnerabilidad tan fácil de corregir y a la véz tan común, puede ser muy peligrosa ya que nos permite cruzar la información a través del sitio para luego poder manipularla, por ejemplo el robo [...]]]></description>
			<content:encoded><![CDATA[<p>En los artículos que he escrito relacionado a vulnerabilidades webs más comunes siempre aparece el legendario Cross-Site Scripting o <strong>XSS</strong>. Una vulnerabilidad tan fácil de corregir y a la véz tan común, puede ser muy peligrosa ya que nos permite <em>cruzar la información</em> a través del sitio para luego poder manipularla, por ejemplo el <strong>robo de credenciales</strong> de un sitio web con un login o inicio de sesion.</p>
<p><a href="http://itfreekzone.blogspot.com/" target="_blank"><strong>d3m4s1@d0v1v0</strong></a> escribió un artículo titulado &#8220;<a href="http://itfreekzone.blogspot.com/2009/12/cruzando-informacion-cross-site.html" target="_blank">Cruzando Información, Cross-Site Scripting (XSS)</a>&#8221; en el que, luego de aclarar el fín del artículo</p>
<blockquote><p><span style="font-weight: bold;">ACLARACION:</span> el artículo está dirigido a aquellos que quieran aprender programación web segura, gente dedicada a la seguridad que utiliza el hacking ético para descubrir problemas a solucionar y reportarlos. Para hacer este tipo de ataque deben contar con la aprobación del encargado de la web o quién corresponda.</p></blockquote>
<p>explica detalladamente el por qué del nombre XSS, que es el XSS, cómo se puede &#8220;usar&#8221; el XSS, lograr que el usuario ejecute lo que queremos, entre otras cosas.<br />
Recomiendo el artículo a quienes quieran informarse un poco más sobre el tema.</p>
<div id="bottomcontainerBox" style="border:1px solid #808080;">
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fblog.zerial.org%2Fseguridad%2Fcruzando-la-informacion-en-un-sitio-web-vulnerable%2F&amp;layout=button_count&amp;show_faces=false&amp;width=85&amp;action=like&amp;font=verdana&amp;colorscheme=light&amp;height=21" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width=85px; height:21px;" allowTransparency="true"></iframe></div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<g:plusone size="medium" href="http://blog.zerial.org/seguridad/cruzando-la-informacion-en-un-sitio-web-vulnerable/"></g:plusone>
			</div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<a href="http://twitter.com/share" class="twitter-share-button" data-url="http://blog.zerial.org/seguridad/cruzando-la-informacion-en-un-sitio-web-vulnerable/"  data-text="Cruzando la información en un sitio web vulnerable" data-count="horizontal" data-via="Zerial">Tweet</a>
			</div>			
			</div><div style="clear:both"></div><div style="padding-bottom:4px;"></div>]]></content:encoded>
			<wfw:commentRss>http://blog.zerial.org/seguridad/cruzando-la-informacion-en-un-sitio-web-vulnerable/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>kismet + gpsd + gpsdrive = wardriving!</title>
		<link>http://blog.zerial.org/linux/documentacion/kismet-gpsd-gpsdrive-wardriving/</link>
		<comments>http://blog.zerial.org/linux/documentacion/kismet-gpsd-gpsdrive-wardriving/#comments</comments>
		<pubDate>Sat, 21 Nov 2009 12:33:50 +0000</pubDate>
		<dc:creator>Zerial</dc:creator>
				<category><![CDATA[Documentacion]]></category>
		<category><![CDATA[Hacking]]></category>
		<category><![CDATA[gps]]></category>
		<category><![CDATA[gpsd]]></category>
		<category><![CDATA[gpsdrive]]></category>
		<category><![CDATA[wardriving]]></category>
		<category><![CDATA[wep]]></category>
		<category><![CDATA[wifi]]></category>
		<category><![CDATA[wireless]]></category>
		<category><![CDATA[wpa]]></category>

		<guid isPermaLink="false">http://blog.zerial.org/?p=1130</guid>
		<description><![CDATA[Antes que todo, quisiera agradecer a Leo_, quien donó prestó el GPS para que los del hacklab pudieramos jugar. Y para los que no saben lo que es el Wardriving: Se llama wardriving a la búsqueda de redes inalámbricas Wi-Fi desde un vehículo en movimiento. Implica usar un coche o camioneta y un ordenador equipado [...]]]></description>
			<content:encoded><![CDATA[<p>Antes que todo, quisiera agradecer a <a href="http://twitter.com/acrossmovil" target="_blank">Leo_</a>, quien <span style="text-decoration: line-through;">donó</span> prestó el GPS para que los del <a href="http://hacklab.cl" target="_blank">hacklab</a> pudieramos jugar.<br />
Y para los que no saben lo que es el Wardriving:</p>
<blockquote><p>Se llama <em><strong>wardriving</strong></em> a la búsqueda de <a title="Red inalámbrica" href="http://es.wikipedia.org/wiki/Red_inal%C3%A1mbrica">redes inalámbricas</a> <a title="Wi-Fi" href="http://es.wikipedia.org/wiki/Wi-Fi">Wi-Fi</a> desde un <a title="Vehículo" href="http://es.wikipedia.org/wiki/Veh%C3%ADculo">vehículo</a> en movimiento. Implica usar un coche o camioneta y un ordenador equipado con Wi-Fi, como un <a title="Ordenador portátil" href="http://es.wikipedia.org/wiki/Ordenador_port%C3%A1til">portátil</a> o una <a title="PDA" href="http://es.wikipedia.org/wiki/PDA">PDA</a>, para detectar las redes. Esta actividad es parecida al uso de un escáner para <a title="Radio" href="http://es.wikipedia.org/wiki/Radio">radio</a>.<br />
<em>(Citado textualmente desde Wikipedia.)</em></p></blockquote>
<p>La idea de este post, es hacer un mini tutorial de cómo hice funcionar (gracias a la ayuda de <a href="http://twitter.com/nozelf" target="_blank">Nozelf</a>) el GPS en GNU/Linux junto a las herramientas de <em>sniffing</em> <a href="http://www.kismetwireless.net/" target="_blank">kismet</a> y a <a href="http://gpsdrive.de/" target="_blank">gpsdrive</a>. Debo dejar claro que no enseñaré a configurar el bluetooth ni nada por el estilo, asumo que todo eso ya está configurado.</p>
<p><span id="more-1130"></span></p>
<p>Lo primero que haremos será buscar el dispositivo y asociarlo a nuestra máquina, para esto usaremos <strong>hcitool</strong> y <strong>rfcomm</strong>.</p>
<p><code>[root@balcebu ~]# hcitool scan<br />
Scanning ...<br />
	00:02:C7:15:B3:A3	BTGPS 15B3A3<br />
[root@balcebu ~]# rfcomm bind /dev/rfcomm0 00:02:C7:15:B3:A3<br />
[root@balcebu ~]#</code></p>
<p>Para ver si el GPS está entregando algún tipo de información, podemos hacer un <em>cat</em> directamente al dispositivo.</p>
<p><code>[root@balcebu ~]# cat /dev/rfcomm0<br />
PGSA,A,1,,,,,,,,,,,,,50.0,50.0,50.0*05<br />
$GPRMC,000211.991,V,0000.0000,N,00000.0000,E,0.000000,,101102,,*0A<br />
$GPVTG,,T,,M,0.000000,N,0.000000,K*4E<br />
$GPGGA,000212.991,0000.0000,N,00000.0000,E,0,00,50.0,0.0,M,0.0,M,0.0,0000*76<br />
$GPGSA,A,1,,,,,,,,,,,,,50.0,50.0,50.0*05<br />
$GPRMC,000212.991,V,0000.0000,N,00000.0000,E,0.000000,,101102,,*09<br />
$GPVTG,,T,,M,0.000000,N,0.000000,K*4E<br />
$GPGGA,000213.991,0000.0000,N,00000.0000,E,0,00,50.0,0.0,M,0.0,M,0.0,0000*77<br />
$GPGSA,A,1,,,,,,,,,,,,,50.0,50.0,50.0*05<br />
$GPRMC,000213.991,V,0000.0000,N,00000.0000,E,0.000000,,101102,,*08<br />
$GPVTG,,T,,M,0.000000,N,0.000000,K*4E<br />
$GPGGA,000214.991,0000.0000,N,00000.0000,E,0,00,50.0,0.0,M,0.0,M,0.0,0000*70<br />
$GPGSA,A,1,,,,,,,,,,,,,50.0,50.0,50.0*05<br />
$GPRMC,000214.991,V,0000.0000,N,00000.0000,E,0.000000,,101102,,*0F<br />
$GPVTG,,T,,M,0.000000,N,0.000000,K*4E<br />
$GPGGA,000215.991,0000.0000,N,00000.0000,E,0,00,50.0,0.0,M,0.0,M,0.0,0000*71</code></p>
<p>Hasta ahora todo en orden. Ahora debemos configurar el <em>kismet</em>, el fichero de configuración que tengo yo es:</p>
<blockquote><p>version=2007.09.R1<br />
servername=Kismet<br />
suiduser=zerial<br />
networkmanagersleep=true<br />
source=iwlagn,wlan0,iwl<br />
vapdestroy=true<br />
channelhop=true<br />
channelvelocity=5<br />
channelsplit=true<br />
defaultchannels=IEEE80211b:1,6,11,2,7,3,8,4,9,5,10<br />
defaultchannels=IEEE80211g:1,6,11,2,7,3,8,4,9,5,10<br />
defaultchannels=IEEE80211a:36,40,44,48,52,56,60,64<br />
defaultchannels=IEEE80211ab:1,6,11,2,7,3,8,4,9,5,10,36,40,44,48,52,56,60,64<br />
tcpport=2501<br />
allowedhosts=127.0.0.1<br />
bindaddress=127.0.0.1<br />
maxclients=5<br />
gps=true<br />
gpshost=localhost:2947<br />
gpsmodelock=false<br />
alert=NETSTUMBLER,10/min,1/sec<br />
alert=WELLENREITER,10/min,1/sec<br />
alert=LUCENTTEST,10/min,1/sec<br />
alert=DEAUTHFLOOD,10/min,2/sec<br />
alert=BCASTDISCON,10/min,2/sec<br />
alert=CHANCHANGE,5/min,1/sec<br />
alert=AIRJACKSSID,5/min,1/sec<br />
alert=PROBENOJOIN,10/min,1/sec<br />
alert=DISASSOCTRAFFIC,10/min,1/sec<br />
alert=NULLPROBERESP,10/min,1/sec<br />
alert=BSSTIMESTAMP,10/min,1/sec<br />
alert=MSFBCOMSSID,10/min,1/sec<br />
alert=LONGSSID,10/min,1/sec<br />
alert=MSFDLINKRATE,10/min,1/sec<br />
alert=MSFNETGEARBEACON,10/min,1/sec<br />
alert=DISCONCODEINVALID,10/min,1/sec<br />
alert=DEAUTHCODEINVALID,10/min,1/sec<br />
allowkeytransmit=true<br />
writeinterval=300<br />
trackivs=false<br />
sound=false<br />
soundplay=/usr/bin/play<br />
sound_new=${prefix}/share/kismet/wav/new_network.wav<br />
sound_traffic=${prefix}/share/kismet/wav/traffic.wav<br />
sound_junktraffic=${prefix}/share/kismet/wav/junk_traffic.wav<br />
sound_alert=${prefix}/share/kismet/wav/alert.wav<br />
speech=false<br />
festival=/usr/bin/festival<br />
flite=false<br />
darwinsay=false<br />
speech_voice=default<br />
speech_type=nato<br />
speech_encrypted=New network detected, s.s.i.d. %s, channel %c, network encrypted.<br />
speech_unencrypted=New network detected, s.s.i.d. %s, channel %c, network open.<br />
ap_manuf=ap_manuf<br />
client_manuf=client_manuf<br />
metric=false<br />
waypoints=true<br />
waypointdata=/home/zerial/.gpsdrive/way.txt<br />
waypoint_essid=true<br />
alertbacklog=50<br />
logtypes=dump,network,csv,xml,weak,cisco,gps<br />
trackprobenets=true<br />
noiselog=false<br />
corruptlog=true<br />
beaconlog=true<br />
phylog=true<br />
mangledatalog=true<br />
fuzzycrypt=wtapfile,wlanng,wlanng_legacy,wlanng_avs,hostap,wlanng_wext,ipw2200,ipw2915<br />
fuzzydecode=wtapfile,radiotap_bsd_a,radiotap_bsd_g,radiotap_bsd_bg,radiotap_bsd_b,pcapfile<br />
netfuzzycrypt=true<br />
dumptype=wiretap<br />
dumplimit=0<br />
logdefault=Kismet<br />
logtemplate=%n-%d-%i.%l<br />
piddir=/var/run/<br />
configdir=%h/.kismet/<br />
ssidmap=ssid_map<br />
groupmap=group_map<br />
ipmap=ip_map</p></blockquote>
<p><em><strong>Nota</strong>: Tuve que instalar una version antigua de Kismet ya que tuve conflictos con la más nueva.</em><br />
Cuando tengamos configurado kismet y, antes de ejecutarlo, debemos setear nuestra interfáz en modo monitor y correr <strong>gpsd</strong>. Lo primero va a depender del driver que estemos usando.<br />
En los casos más comunes son:</p>
<p>Intel, broadcom, ralink, realtek, entre otas:<br />
<code># iwconfig wlan0 mode monitor</code><br />
En la mayoría:<br />
<code># airmon-ng wlan0 start</code><br />
En las con madwifi  (atheros, zydass)<br />
<code># wlanconfig ath create wlandev wifi0 wlanmode monitor</code><br />
Y el <strong>gpsd</strong> lo corremos:<br />
<code># gpsd -F /tmp/gps.socket /dev/rfcomm0</code><br />
Ya podemos arrancar el kismet. La pantalla que veremos será algo similar a:</p>
<p><a href="http://blog.zerial.org/wp-content/uploads/2009/11/kismet.png"><img src="http://blog.zerial.org/wp-content/uploads/2009/11/kismet-300x141.png" alt="kismet" title="kismet" width="300" height="141" class="aligncenter size-medium wp-image-1135" /></a></p>
<p>Son todas las redes que captura nuestra interfáz wireless. Pero a lo que nosotros nos interesa, es el fichero <strong>Way Points</strong> que se está guardando, según nuestro <em>kismet.conf</em>, en el directorio <strong>~/.gpsdrive/way.txt</strong>.</p>
<p><code>[zerial@balcebu ~]$ cat ~/.gpsdrive/way-ssid.txt<br />
GASPAR	-33.442875  -70.598656<br />
RED_ANDRES	-33.442886  -70.598724<br />
EDSOIT	-33.442875  -70.598656<br />
jaguar house	0.000000  0.000000<br />
Visitas Jaguar	0.000000  0.000000<br />
Rodrigo_2008	-33.442875  -70.598656<br />
&lt;no ssid&gt;	-33.442886  -70.598724<br />
costa2	-33.442881  -70.598656<br />
SUPERTALDO	-33.442886  -70.598724<br />
Fidelizador.com	-33.442881  -70.598656<br />
CDAguilucho	-33.442875  -70.598656<br />
CDAguilucho	-33.442875  -70.598656<br />
CDAguilucho	-33.442881  -70.598656<br />
CDAguilucho	-33.442881  -70.598656<br />
WebSTAR	-33.442875  -70.598656<br />
Prueba	-33.442881  -70.598656&lt;/no&gt;</code></p>
<p>Lo que vemos son los nombres de las señales, longitud y latitud. Ya con toda ésta información, podemos &#8220;graficarla&#8221; en algun mapa, por ejemplo, el de gpsdrive.</p>
<p><a href="http://blog.zerial.org/wp-content/uploads/2009/11/gpsdrive.png"><img src="http://blog.zerial.org/wp-content/uploads/2009/11/gpsdrive-300x187.png" alt="gpsdrive" title="gpsdrive" width="300" height="187" class="aligncenter size-medium wp-image-1137" /></a></p>
<p>Aún no configuro bien ni cargo los mapas que corresponden, por lo que el GPSDrive me muestra la información un tanto ilegible, pero podemos ver que si está posicionando la información capturada por kismet. Lamentablemente no puedo hacer más zoom.<br />
Otra opción sería traspasar los datos de WayPoints a KML para que pueda ser interpretado por Google Earth, tambien podemos introducir las coordinadas manualmente para ir graficando.</p>
<p>La idea es la siguiente, montar una antena en un auto y salir con los portátiles a recorrer la ciudad capturando éste tipo de información y graficandolo en un mapa para luego compartirla y tener un mapa con las redes de la ciudad. El próximo post relacionado a este tema, será cuando haga wardriving, subiré fotos y todo eso.</p>
<div id="bottomcontainerBox" style="border:1px solid #808080;">
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fblog.zerial.org%2Flinux%2Fdocumentacion%2Fkismet-gpsd-gpsdrive-wardriving%2F&amp;layout=button_count&amp;show_faces=false&amp;width=85&amp;action=like&amp;font=verdana&amp;colorscheme=light&amp;height=21" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width=85px; height:21px;" allowTransparency="true"></iframe></div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<g:plusone size="medium" href="http://blog.zerial.org/linux/documentacion/kismet-gpsd-gpsdrive-wardriving/"></g:plusone>
			</div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<a href="http://twitter.com/share" class="twitter-share-button" data-url="http://blog.zerial.org/linux/documentacion/kismet-gpsd-gpsdrive-wardriving/"  data-text="kismet + gpsd + gpsdrive = wardriving!" data-count="horizontal" data-via="Zerial">Tweet</a>
			</div>			
			</div><div style="clear:both"></div><div style="padding-bottom:4px;"></div>]]></content:encoded>
			<wfw:commentRss>http://blog.zerial.org/linux/documentacion/kismet-gpsd-gpsdrive-wardriving/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Crackeando redes Wi-Fi usando aircrack</title>
		<link>http://blog.zerial.org/seguridad/crackeando-redes-wi-fi-usando-aircrack/</link>
		<comments>http://blog.zerial.org/seguridad/crackeando-redes-wi-fi-usando-aircrack/#comments</comments>
		<pubDate>Mon, 16 Nov 2009 23:42:19 +0000</pubDate>
		<dc:creator>Zerial</dc:creator>
				<category><![CDATA[Documentacion]]></category>
		<category><![CDATA[Hacking]]></category>
		<category><![CDATA[Seguridad]]></category>
		<category><![CDATA[aircrack]]></category>
		<category><![CDATA[crack]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[wifi]]></category>

		<guid isPermaLink="false">http://blog.zerial.org/?p=1104</guid>
		<description><![CDATA[En el Hackmeeting 2009 se tenía pensado realizar una charla o taller de cómo crackear redes Wifi usando aircrack lo que, lamentablemente, no se realizó. Los chicos que nos visitaron desde Bolivia estában bastante entusiasmados por este taller y cuando se fueron me dijieron ¡acuerdate de enviaros un manual de aircrack!. El siguiente tutorial o [...]]]></description>
			<content:encoded><![CDATA[<p>En el <a href="http://hackmeeting.kernelhouse.org" target="_blank">Hackmeeting</a> 2009 se tenía pensado realizar una charla o taller de cómo crackear redes Wifi usando <a href="http://aircrack-ng.org" target="_blank">aircrack</a> lo que, lamentablemente, no se realizó. Los chicos que nos visitaron desde Bolivia estában bastante entusiasmados por este taller y cuando se fueron me dijieron <em>¡acuerdate de enviaros un manual de aircrack!</em>. El siguiente tutorial o guía rápida para crackear redes wifi está dedicado a ellos.</p>
<p><img class="aligncenter size-full wp-image-1106" title="aircrack-logo" src="http://blog.zerial.org/wp-content/uploads/2009/11/aircrack-logo.jpg" alt="aircrack-logo" width="226" height="110" /></p>
<blockquote><p>Aircrack-ng is an 802.11 WEP and WPA-PSK keys cracking program that can recover keys once enough data packets have been captured. It implements the standard FMS attack along with some optimizations like KoreK attacks, as well as the all-new PTW attack, thus making the attack much faster compared to other WEP cracking tools.</p>
<p>In fact, Aircrack-ng is a set of tools for auditing wireless networks.</p>
<p>http://aircrack-ng.org</p></blockquote>
<p>En español y en simples palabras, aircrack-ng es una suite de herramientas que nos permiten auditar redes inalámbricas.</p>
<p>Básicamente, lo que voy a mostrar es cómo encontrar la clave de una red wifi cifrada con WEP. Las herramientas que utilizaremos serán <strong>airmon-ng</strong>, <strong>airodump-ng</strong>, <strong>aireplay-ng</strong> y <strong>aircrack-ng</strong>.</p>
<p><span id="more-1104"></span></p>
<ol>
<li><strong>airmon</strong>: La usaremos para levantar nuestra interfáz wifi en modo monitor</li>
<li><strong>airodump</strong>: Para capturar los paquetes que recibe nuestra intefáz en modo monitor</li>
<li><strong>aireplay</strong>: Para crear una autentificación falsa y poder inyectar paquetes, si es que nuestro hardware lo permite</li>
<li><strong>aircrack</strong>: Para interpretar los datos capturados con airodump y poder obtener la clave</li>
</ol>
<p>El primer paso será <em>setear</em> nuestra interfáz wifi en modo monitor, ejecutamos:<br />
<code># airmon-ng start <em>wlan0</em></code><br />
Cambiamos <em>wlan0</em> por el nombre de nuestra interfáz de red wireless (la podemos ver ejecutando <em>iwconfig</em>). Yo usaré <em>wlan0</em> para todos los ejemplos. Veremos que se creo otra interface llamada <em>mon0</em> o algo similar.<br />
Este paso se puede realizar de varias formas dependiendo del driver que usemos, generalmente para las atheros o para las que usen el driver madwifi, tenemos que usar wlanconfig.<br />
<code># wlanconfig ath0 create wlandev wifi0 wlanmode monitor</code><br />
Algunos drivers nos permiten cambiar el estado a monitor directamente usando iwconfig:<br />
<code># iwconfig wlan0 mode monitor</code><br />
Bueno, una véz lista nuestra interfáz en modo monitor tenemos que ejecutar la utilidad que nos permitirá capturar los datos que están volando. Ejecutamos:</p>
<p><code># airodump-ng wlan0</code><br />
Veremos una pantalla similar a:</p>
<p><img src="http://blog.zerial.org/wp-content/uploads/2009/11/1.png" alt="1" title="1" width="543" height="274" class="aligncenter size-full wp-image-1114" /></p>
<p>De izq. a derecha tenemos:<br />
<strong>bssid</strong>: mac del access point<br />
<strong>beacons</strong>: paquetes &#8220;basura&#8221;<br />
<strong>#Data</strong>: paquetes útiles<br />
<strong>#/s</strong>: paquetes por segundo<br />
<strong>CH</strong>: canal<br />
<strong>Enc</strong>: cifrado<br />
<strong>ESSID</strong>: nombre de la señal</p>
<p>Nuestro objetivo es la red llamada &#8220;club&#8221;. Entonces ejecutamos <em>airodump-ng</em> con los parámetros necesarios para que se encoque unicamente en su mac y su canal.</p>
<p><code># airodump-ng -w output --channel 6 --bssid 00:02:CF:B4:DC:5B wlan0</code></p>
<p><strong>-w </strong>: archivo para guardar los datos capturados<br />
<strong>&#8211;channel</strong>: el canal<br />
<strong>&#8211;bssid</strong>: la mac del access point</p>
<p>Utilizaremos dos herramientas más para la inyección de paquetes. La inyección de paquetes nos sirve par &#8220;obligar&#8221; al roueter a que trafique y nos envie los #Data que necesitamos.<br />
Primero, utilizaremos <strong>aireplay-ng</strong> para generar una autentificación falsa.</p>
<p><code># aireplay-ng -1 64 -a 00:02:CF:B4:DC:5B -h 00:1E:65:CB:29:64  wlan0</code></p>
<p>Pasamos la MAC de nuestro objetivo bajo el parametro <em>-a</em> y nuestra MAC mediante <em>-h</em>. Con <strong>-1</strong> indicamos que usaremos el modo de ataque numero 1.</p>
<p>Mientras esperamos que se generere la autentificación false, dejamos corriendo el aireplay en modo de ataque 3, para que inyecte paquetes.</p>
<p><code># aireplay-ng -3 -b 00:02:CF:B4:DC:5B -h 00:1E:65:CB:29:64  wlan0</code></p>
<p>No explicaré detalladamente los tipos de ataques o los argumentos del aireplay, para eso pueden hacer<br />
<code># aireplay-ng --help</code><br />
o bien leer el man.</p>
<p>Cuando tengamos todos los ataques corriendo y el airodump capturando paquetes, podremos ver una pantalla como:</p>
<p><img src="http://blog.zerial.org/wp-content/uploads/2009/11/2.png" alt="2" title="2" width="501" height="135" class="aligncenter size-full wp-image-1117" /></p>
<p>Si nos damos cuenta, podemos ver que el campo <strong>#/s</strong> esta en 500 lo que quiere decir que esta capturando 500 paquetes por segundo. Con 5 mil o 10 mil paquetes, ya deberiamos tener la password. En el peor de los casos con 20 o 40 mil. El campo <strong>#Data</strong> nos indica cuantos paquetes hemos capturado.</p>
<p>Por mientras, en otra consola podemos ejecutar el aircrack para que interprete los datos capturados y nos muestre la password WEP.</p>
<p><code># aircrack-ng output*.cap</code></p>
<p><img src="http://blog.zerial.org/wp-content/uploads/2009/11/3.png" alt="3" title="3" width="501" height="206" class="aligncenter size-full wp-image-1119" /></p>
<p>Listo, ya tenemos la clave.</p>
<div id="bottomcontainerBox" style="border:1px solid #808080;">
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fblog.zerial.org%2Fseguridad%2Fcrackeando-redes-wi-fi-usando-aircrack%2F&amp;layout=button_count&amp;show_faces=false&amp;width=85&amp;action=like&amp;font=verdana&amp;colorscheme=light&amp;height=21" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width=85px; height:21px;" allowTransparency="true"></iframe></div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<g:plusone size="medium" href="http://blog.zerial.org/seguridad/crackeando-redes-wi-fi-usando-aircrack/"></g:plusone>
			</div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<a href="http://twitter.com/share" class="twitter-share-button" data-url="http://blog.zerial.org/seguridad/crackeando-redes-wi-fi-usando-aircrack/"  data-text="Crackeando redes Wi-Fi usando aircrack" data-count="horizontal" data-via="Zerial">Tweet</a>
			</div>			
			</div><div style="clear:both"></div><div style="padding-bottom:4px;"></div>]]></content:encoded>
			<wfw:commentRss>http://blog.zerial.org/seguridad/crackeando-redes-wi-fi-usando-aircrack/feed/</wfw:commentRss>
		<slash:comments>29</slash:comments>
		</item>
		<item>
		<title>Clonación de máquinas virtuales en serie</title>
		<link>http://blog.zerial.org/linux/clonacion-de-maquinas-virtuales-en-serie/</link>
		<comments>http://blog.zerial.org/linux/clonacion-de-maquinas-virtuales-en-serie/#comments</comments>
		<pubDate>Wed, 28 Oct 2009 00:55:34 +0000</pubDate>
		<dc:creator>Zerial</dc:creator>
				<category><![CDATA[Documentacion]]></category>
		<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[paravirtualizacion]]></category>
		<category><![CDATA[virtualizacion]]></category>
		<category><![CDATA[xen]]></category>

		<guid isPermaLink="false">http://blog.zerial.org/?p=1066</guid>
		<description><![CDATA[En el lugar donde trabajo, he estado montando y monitoreando muchas máquinas virtuales (gnu/linux sobre gnu/linux). En un principio, las máquinas estaban virtualizadas con VMWare, eran sólo 3 máquinas. Luego estas máquinas fueron aumentando a 5, 10 y actualmente ya son 20 máqiunas. La empresa donde trabajo ofrece el servicio de email marketing en base  [...]]]></description>
			<content:encoded><![CDATA[<p>En el <a href="http://www.fidelizador.com" target="_blank">lugar donde trabajo</a>, he estado montando y monitoreando muchas máquinas virtuales (<em>gnu/linux</em> sobre <em>gnu/linux</em>). En un principio, las máquinas estaban virtualizadas con VMWare, eran sólo 3 máquinas. Luego estas máquinas fueron aumentando a 5, 10 y actualmente ya son 20 máqiunas. La empresa donde trabajo ofrece el servicio de <a href="http://es.wikipedia.org/wiki/E-mail_marketing" target="_blank">email marketing</a> en base  a newsletter y &#8220;<em>fidelización de clientes</em>&#8220;, y soy yo quien debe administrar los servidores de envios de correos. Se envían más de 500 mil emails semanales por lo que el <em>uptime</em> y la disponibilidad del servicio debe ser la más alta.</p>
<p style="text-align: center;"><a href="http://blog.zerial.org/wp-content/uploads/2009/10/fide.png"><img class="aligncenter size-full wp-image-1069" title="fide" src="http://blog.zerial.org/wp-content/uploads/2009/10/fide.png" alt="fide" width="478" height="249" /></a></p>
<p>Para ésto, decidí migrar todas las máquinas a Xen y comenzar a para-virtualizar todos los servidores de envios (nosotros les llamamos &#8220;<em>smtp</em>&#8220;). Si pensamos que su única función es enviar correos (ya que, de la lógica del servicio se encarga otro servidor), las caracteristicas de cada <em>smtp</em> son muy básicas:</p>
<ul>
<li>128MB ram</li>
<li>2Gb disco</li>
<li>Servicios: postfix, ssh</li>
</ul>
<p>Para lograr el objetivo, me dediqué a crear un script que me automatiza la creación y configuración de máquinas virtuales.</p>
<p><span id="more-1066"></span></p>
<p>El script esta hecho en bash y lo único que necesitamos es tener una imágen del sistema (por ej. debian) base, con postfix instalado y la configuración que necesitemos, para luego clonarla en serie. El único trabajo que tenemos que hacer es montar una sola maquina, con todo lo que necesitemos, que sea funcional y luego de hacer pruebas y que todo ande bien, entonces usamos el script para clonarla:</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">VM_LIST=</span>machines <span class="re3"># <span class="kw2">file</span> <span class="kw2">which</span> contains list of ip and hostnames</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2"><span class="kw1">for</span> line <span class="kw1">in</span> $<span class="br0">&#40;</span><span class="kw2">grep</span> -v ^<span class="re3"># <span class="re1">$VM_LIST</span><span class="br0">&#41;</span>;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">do</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re2">IP_ADDR=</span>$<span class="br0">&#40;</span><span class="kw3">echo</span> <span class="re1">$line</span> |awk -F <span class="st0">&#8216;|&#8217;</span> <span class="st0">&#8216;{print $1}&#8217;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re2">HOST_NAME=</span>$<span class="br0">&#40;</span><span class="kw3">echo</span> <span class="re1">$line</span> |awk -F <span class="st0">&#8216;|&#8217;</span> <span class="st0">&#8216;{print $2}&#8217;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re2">MAC=</span>$<span class="br0">&#40;</span><span class="kw3">echo</span> <span class="re1">$line</span> |awk -F <span class="st0">&#8216;|&#8217;</span> <span class="st0">&#8216;{print $3}&#8217;</span><span class="br0">&#41;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re2">NAME=</span>$<span class="br0">&#40;</span><span class="kw3">echo</span> <span class="re1">$HOST_NAME</span> |awk -F . <span class="st0">&#8216;{print $1}&#8217;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re2">CFG=</span><span class="re1">$NAME</span>.cfg</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re2">IMG=</span><span class="re1">$NAME</span>.img</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re2">FULLPATH_CFG=</span><span class="re1">$DIR</span>\/<span class="re1">$HOST_NAME</span>\/<span class="re1">$CFG</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re2">FULLPATH_IMG=</span><span class="re1">$DIR</span><span class="st0">&quot;<span class="es0">\/</span>&quot;</span><span class="re1">$HOST_NAME</span><span class="st0">&quot;<span class="es0">\/</span>&quot;</span><span class="re1">$IMG</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re2">FULLPATH_SWAP=</span><span class="re1">$DIR</span>/<span class="re1">$HOST_NAME</span>/<span class="st0">&quot;swap.img&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">mkdir</span> <span class="re1">$HOST_NAME</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">echo</span> <span class="st0">&quot;Created $HOST_NAME directory.&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">echo</span> <span class="st0">&quot;&gt;&gt; Copying files &#8230;&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">cp</span> draft/swap.img draft/draft.img draft/draft.cfg <span class="re1">$HOST_NAME</span>/</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">mv</span> <span class="re1">$HOST_NAME</span>/draft.img <span class="re1">$HOST_NAME</span>/<span class="re1">$IMG</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">mv</span> <span class="re1">$HOST_NAME</span>/draft.cfg <span class="re1">$HOST_NAME</span>/<span class="re1">$CFG</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">echo</span> -n <span class="st0">&quot;&gt;&gt; Parsing $CFG &#8230;&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">sed</span> -i <span class="st0">&#8216;s/DIR_TO_DISK/<span class="es0">\/</span>vm<span class="es0">\/</span>mailers<span class="es0">\/</span>&#8216;</span><span class="re1">$HOST_NAME</span><span class="st0">&#8216;<span class="es0">\/</span>&#8216;</span><span class="re1">$IMG</span><span class="st0">&#8216;/g&#8217;</span> <span class="re1">$HOST_NAME</span>/<span class="re1">$CFG</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">sed</span> -i <span class="st0">&#8216;s/DIR_TO_SWAP/<span class="es0">\/</span>vm<span class="es0">\/</span>mailers<span class="es0">\/</span>&#8216;</span><span class="re1">$HOST_NAME</span><span class="st0">&#8216;<span class="es0">\/</span>swap.img/g&#8217;</span> <span class="re1">$HOST_NAME</span>/<span class="re1">$CFG</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">sed</span> -i <span class="st0">&#8216;s/HOSTNAME/&#8217;</span><span class="re1">$NAME</span><span class="st0">&#8216;/g&#8217;</span> <span class="re1">$HOST_NAME</span>/<span class="re1">$CFG</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">sed</span> -i <span class="st0">&#8216;s/IP_ADDR/&#8217;</span><span class="re1">$IP_ADDR</span><span class="st0">&#8216;/g&#8217;</span> <span class="re1">$HOST_NAME</span>/<span class="re1">$CFG</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">sed</span> -i <span class="st0">&#8216;s/MAC/&#8217;</span><span class="re1">$MAC</span><span class="st0">&#8216;/g&#8217;</span> <span class="re1">$HOST_NAME</span>/<span class="re1">$CFG</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">echo</span> <span class="st0">&quot; &nbsp;Done.&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">mount</span> -oloop -tauto <span class="re1">$HOST_NAME</span>/<span class="re1">$IMG</span> temp/</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">echo</span> <span class="st0">&quot;&gt;&gt; Setting up hostname &#8230;&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">echo</span> <span class="re1">$HOST_NAME</span> &gt; temp/etc/<span class="kw2">hostname</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">echo</span> <span class="st0">&quot;&gt;&gt; Setting up postfix (main.cf) &#8230;&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">sed</span> -i <span class="st0">&#8216;s/mail[0-9]./&#8217;</span><span class="re1">$NAME</span><span class="st0">&#8216;/g&#8217;</span> temp/etc/postfix/main.cf</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">echo</span> <span class="st0">&quot;&gt;&gt; Setting up ethernet &#8230;&quot;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">sed</span> -i <span class="st0">&#8216;s/aaa.bbb.ccc.ddd/&#8217;</span><span class="re1">$IP_ADDR</span><span class="st0">&#8216;/&#8217;</span> temp/etc/network/interfaces</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">echo</span> <span class="st0">&quot;&gt;&gt; Adding RSA Public Key &#8230;&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">cat</span> /home/admin/.<span class="kw2">ssh</span>/id_rsa.pub &gt;&gt; temp/root/.<span class="kw2">ssh</span>/authorized_keys</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">umount</span> temp</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">echo</span> <span class="st0">&quot;Done.&quot;</span></div>
</li>
<li class="li2">
<div class="de2"><span class="kw1">done</span></div>
</li>
</ol>
</div>
<p>Lo que hace el script, en sencillos pasos es:</p>
<p>- Crear el directorio donde guardaremos nustro fichero de configuración y cosas necesarias.<br />
- Copiar los ficheros necesarios (configuracion de la máquina, imagen del sistema operativo, etc)<br />
- Toma el fichero de configuración y lo <em>parsea</em> para adaptarlo según la configuración que necesitemos.<br />
- Monta la imagen (usando <em>loop</em>)de nuestra nueva máquina.<br />
- Edita y configura los ficheros necesarios dentro de esa máquina virtual.<br />
- Desmontamos y pasamos a la siguiente máquina.</p>
<p>El script se basa en un fichero de &#8220;configuración&#8221;, el cual nos debe proveer de la dirección IP, la mac y el hostname, en el siguiente formato:</p>
<blockquote><p>aaa.bbb.ccc.ddd:hostname.tld:ma:c:a:dd:re:ss</p></blockquote>
<p>Con este post no busco enseñar como migrar o clonar máquinas, simplemente demostrar que se puede automatizar la tarea de clonación de máquinas en serie. Claramente este script no funcionará para los requerimientos de todos nosotros, pero se puede adaptar.</p>
<div id="bottomcontainerBox" style="border:1px solid #808080;">
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fblog.zerial.org%2Flinux%2Fclonacion-de-maquinas-virtuales-en-serie%2F&amp;layout=button_count&amp;show_faces=false&amp;width=85&amp;action=like&amp;font=verdana&amp;colorscheme=light&amp;height=21" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width=85px; height:21px;" allowTransparency="true"></iframe></div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<g:plusone size="medium" href="http://blog.zerial.org/linux/clonacion-de-maquinas-virtuales-en-serie/"></g:plusone>
			</div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<a href="http://twitter.com/share" class="twitter-share-button" data-url="http://blog.zerial.org/linux/clonacion-de-maquinas-virtuales-en-serie/"  data-text="Clonación de máquinas virtuales en serie" data-count="horizontal" data-via="Zerial">Tweet</a>
			</div>			
			</div><div style="clear:both"></div><div style="padding-bottom:4px;"></div>]]></content:encoded>
			<wfw:commentRss>http://blog.zerial.org/linux/clonacion-de-maquinas-virtuales-en-serie/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>[Proof-of-Concept] DoS gracias al script wp-trackbacks de wordpress</title>
		<link>http://blog.zerial.org/seguridad/proof-of-concept-dos-gracias-al-script-wp-trackbacks-de-wordpress/</link>
		<comments>http://blog.zerial.org/seguridad/proof-of-concept-dos-gracias-al-script-wp-trackbacks-de-wordpress/#comments</comments>
		<pubDate>Sun, 18 Oct 2009 22:48:54 +0000</pubDate>
		<dc:creator>Zerial</dc:creator>
				<category><![CDATA[Documentacion]]></category>
		<category><![CDATA[Hacking]]></category>
		<category><![CDATA[Seguridad]]></category>
		<category><![CDATA[poc]]></category>
		<category><![CDATA[proof-of-concept]]></category>
		<category><![CDATA[pwnpress]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://blog.zerial.org/?p=1033</guid>
		<description><![CDATA[Un par de horas atrás, publiqué un artículo luego de haber leído una publicación de jcarlosn. Me di el tiempo de realizar una prueba de concepto (PoC) usando el exploit que él mismo propone. Si bien el código que él publicó tiene algunos problemas, luego de hacerle un par de modificaciones logré ejecutarlo y analizar [...]]]></description>
			<content:encoded><![CDATA[<p>Un par de horas atrás, <a href="http://blog.zerial.org/seguridad/denial-of-service-dos-rapido-y-de-una-forma-muy-sencilla-en-wordpress/">publiqué un artículo</a> luego de haber leído <a href="http://rooibo.wordpress.com/2009/10/17/agujero-de-seguridad-en-wordpress/" target="_blank">una publicación de jcarlosn</a>. Me di el tiempo de realizar una prueba de concepto (PoC) usando el exploit que él mismo propone. Si bien el código que él publicó tiene algunos problemas, luego de hacerle un par de modificaciones logré ejecutarlo y analizar su comportamiento y ver cómo <em>sufre</em> el servidor objetivo.</p>
<p>Duración de la prueba de concepto: <strong>2 minutos</strong><br />
Sitio o servidor objetivo: <strong>blog.zerial.org</strong><br />
Tipo de exploit: <strong>remoto</strong><br />
Vulnerabilidad: <strong>Resource Exhaustion (DoS)</strong><br />
Descripción: <strong>El servidor comienza a consumir recursos hasta agotarlos, provocando la denegación del servicio.</strong></p>
<p><img class="aligncenter size-full wp-image-1035" title="wpress-test" src="http://blog.zerial.org/wp-content/uploads/2009/10/wpress-test.png" alt="wpress-test" width="344" height="358" /></p>
<p>Ejecuté el exploit en tres consolas distintas de forma simultanea, y al pasar 10 o 15 segundos ya se comenzó a notar el consumo de recursos en el servidor.</p>
<p><span id="more-1033"></span></p>
<p><img class="aligncenter size-full wp-image-1036" title="wpress" src="http://blog.zerial.org/wp-content/uploads/2009/10/wpress.png" alt="wpress" width="521" height="96" /></p>
<p>La carga promedio ya va en <strong>2.83</strong> y el consumo del/los CPU llegando al <strong>100%</strong>, un par de segundos más y &#8230;</p>
<p><img class="aligncenter size-full wp-image-1037" title="wpress2" src="http://blog.zerial.org/wp-content/uploads/2009/10/wpress2.png" alt="wpress2" width="524" height="86" /></p>
<p>La carga promedio ya va en <strong>3.75</strong> y los procesadores están a su <strong>100%</strong>, si se fijan en la memoria está consumiendo <em>408MB de 540</em>, es decir, el servidor ya se está quedando sin recursos. Siguen pasando los segundos &#8230;</p>
<p><img class="aligncenter size-full wp-image-1038" title="wpress3" src="http://blog.zerial.org/wp-content/uploads/2009/10/wpress3.png" alt="wpress3" width="324" height="15" /></p>
<p><img class="aligncenter size-full wp-image-1039" title="wpress4" src="http://blog.zerial.org/wp-content/uploads/2009/10/wpress4.png" alt="wpress4" width="171" height="16" /></p>
<p><strong>458Mb</strong> de ram y <strong>4.25</strong> de carga.</p>
<p>Los logs de apache me muestran las distintas peticiones simultaneas que hace el exploit:</p>
<p><img class="aligncenter size-full wp-image-1040" title="wpress-log" src="http://blog.zerial.org/wp-content/uploads/2009/10/wpress-log.png" alt="wpress-log" width="584" height="54" /></p>
<p>Esta prueba de concepto la realicé con 3 peticiones simultaneas y durante 2 míseros minutos, si aumentamos las instancias del exploit y alargamos un poco mas el periodo de prueba, fácilmente podremos lograr la denegación de servicio en el servidor.</p>
<div id="bottomcontainerBox" style="border:1px solid #808080;">
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fblog.zerial.org%2Fseguridad%2Fproof-of-concept-dos-gracias-al-script-wp-trackbacks-de-wordpress%2F&amp;layout=button_count&amp;show_faces=false&amp;width=85&amp;action=like&amp;font=verdana&amp;colorscheme=light&amp;height=21" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width=85px; height:21px;" allowTransparency="true"></iframe></div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<g:plusone size="medium" href="http://blog.zerial.org/seguridad/proof-of-concept-dos-gracias-al-script-wp-trackbacks-de-wordpress/"></g:plusone>
			</div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<a href="http://twitter.com/share" class="twitter-share-button" data-url="http://blog.zerial.org/seguridad/proof-of-concept-dos-gracias-al-script-wp-trackbacks-de-wordpress/"  data-text="[Proof-of-Concept] DoS gracias al script wp-trackbacks de wordpress" data-count="horizontal" data-via="Zerial">Tweet</a>
			</div>			
			</div><div style="clear:both"></div><div style="padding-bottom:4px;"></div>]]></content:encoded>
			<wfw:commentRss>http://blog.zerial.org/seguridad/proof-of-concept-dos-gracias-al-script-wp-trackbacks-de-wordpress/feed/</wfw:commentRss>
		<slash:comments>7</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>
<div id="bottomcontainerBox" style="border:1px solid #808080;">
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fblog.zerial.org%2Flinux%2Fdocumentacion%2Fmigracion-exportacion-importacion-datos-drupal%2F&amp;layout=button_count&amp;show_faces=false&amp;width=85&amp;action=like&amp;font=verdana&amp;colorscheme=light&amp;height=21" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width=85px; height:21px;" allowTransparency="true"></iframe></div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<g:plusone size="medium" href="http://blog.zerial.org/linux/documentacion/migracion-exportacion-importacion-datos-drupal/"></g:plusone>
			</div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<a href="http://twitter.com/share" class="twitter-share-button" data-url="http://blog.zerial.org/linux/documentacion/migracion-exportacion-importacion-datos-drupal/"  data-text="Migración de datos en Drupal" data-count="horizontal" data-via="Zerial">Tweet</a>
			</div>			
			</div><div style="clear:both"></div><div style="padding-bottom:4px;"></div>]]></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>Paper: Hacking Automatizado</title>
		<link>http://blog.zerial.org/seguridad/paper-hacking-automatizado/</link>
		<comments>http://blog.zerial.org/seguridad/paper-hacking-automatizado/#comments</comments>
		<pubDate>Tue, 15 Sep 2009 13:20:17 +0000</pubDate>
		<dc:creator>Zerial</dc:creator>
				<category><![CDATA[Documentacion]]></category>
		<category><![CDATA[Mis cosas]]></category>
		<category><![CDATA[Seguridad]]></category>
		<category><![CDATA[charlas]]></category>
		<category><![CDATA[Hacking]]></category>
		<category><![CDATA[hacking automatizado]]></category>
		<category><![CDATA[hackmeeting]]></category>
		<category><![CDATA[paper]]></category>

		<guid isPermaLink="false">http://blog.zerial.org/?p=884</guid>
		<description><![CDATA[Como les comenté en el post anterior, una de las charlas con las que participaré en el Hackmeeting será &#8220;Hacking Automatizado&#8220;, les dejo los enlaces para que puedan descargar la primera revisión de este paper. Hacking Automatizado [PDF &#124; ODP] Tweet]]></description>
			<content:encoded><![CDATA[<p><img src="http://blog.zerial.org/wp-content/uploads/2009/09/ha_1-300x109.png" alt="ha_1" title="ha_1" width="300" height="109" class="aligncenter size-medium wp-image-886" /></p>
<p>Como les comenté en el <a href="http://blog.zerial.org/seguridad/charlas-hacking-automatizado-y-live-hacking/">post anterior</a>, una de las charlas con las que participaré en el <a href="http://hackmeeting.kernelhouse.org">Hackmeeting</a> será &#8220;<strong>Hacking Automatizado</strong>&#8220;, les dejo los enlaces para que puedan descargar la primera revisión de este <em>paper</em>.</p>
<p><strong>Hacking Automatizado</strong> [<a href="http://zerial.org/charlas/seguridad/hacking_automatizado_rev1.pdf">PDF</a> | <a href="http://zerial.org/charlas/seguridad/hacking_automatizado_rev1.odp">ODP</a>]</p>
<div id="bottomcontainerBox" style="border:1px solid #808080;">
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fblog.zerial.org%2Fseguridad%2Fpaper-hacking-automatizado%2F&amp;layout=button_count&amp;show_faces=false&amp;width=85&amp;action=like&amp;font=verdana&amp;colorscheme=light&amp;height=21" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width=85px; height:21px;" allowTransparency="true"></iframe></div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<g:plusone size="medium" href="http://blog.zerial.org/seguridad/paper-hacking-automatizado/"></g:plusone>
			</div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<a href="http://twitter.com/share" class="twitter-share-button" data-url="http://blog.zerial.org/seguridad/paper-hacking-automatizado/"  data-text="Paper: Hacking Automatizado" data-count="horizontal" data-via="Zerial">Tweet</a>
			</div>			
			</div><div style="clear:both"></div><div style="padding-bottom:4px;"></div>]]></content:encoded>
			<wfw:commentRss>http://blog.zerial.org/seguridad/paper-hacking-automatizado/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Lectura recomendada: Software libre para una sociedad libre</title>
		<link>http://blog.zerial.org/linux/documentacion/lectura-recomendada-software-libre-para-una-sociedad-libre/</link>
		<comments>http://blog.zerial.org/linux/documentacion/lectura-recomendada-software-libre-para-una-sociedad-libre/#comments</comments>
		<pubDate>Fri, 11 Sep 2009 17:39:31 +0000</pubDate>
		<dc:creator>Zerial</dc:creator>
				<category><![CDATA[Documentacion]]></category>
		<category><![CDATA[Interes general]]></category>
		<category><![CDATA[free software]]></category>
		<category><![CDATA[lectura]]></category>
		<category><![CDATA[libro]]></category>
		<category><![CDATA[rms]]></category>
		<category><![CDATA[Software Libre]]></category>

		<guid isPermaLink="false">http://blog.zerial.org/?p=848</guid>
		<description><![CDATA[La semana pasada estuvo por KernelHouse, daniche, un amigo de Bolivia quien dejó un libro titulado &#8211; y autografiado &#8211; &#8220;Software Libre para una sociedad libre&#8221; por Richard M. Stallman, se trata de la primera version en castellano de su libro &#8220;Free Software, Free Society&#8221; . Este libro describe el lado filosófico y teórico del [...]]]></description>
			<content:encoded><![CDATA[<p>La semana pasada estuvo por <a href="http://kernelhouse.org" target="_blank">KernelHouse</a>, daniche, un amigo de Bolivia quien dejó un libro titulado &#8211; y <em>autografiado</em> &#8211; &#8220;<em>Software Libre para una sociedad libre</em>&#8221; por Richard M. Stallman, se trata de la primera version en <em>castellano</em> de su libro &#8220;<em>Free Software, Free Society</em>&#8221; . Este libro describe el lado filosófico y teórico del movimiento del Software Libre, tocando temas como el copyleft, licencias libres, propiedad intelectual, copyright, etc.</p>
<p><img class="aligncenter size-full wp-image-849" title="software_libre_para_una_sociedad_libre_portada_completa" src="http://blog.zerial.org/wp-content/uploads/2009/09/software_libre_para_una_sociedad_libre_portada_completa.png" alt="software_libre_para_una_sociedad_libre_portada_completa" width="200" height="290" /></p>
<p>Para algunos este tipo de lecturas suele ser fome y aburrida, pero la verdad es queno cro que busque entretener a la gente, mas bien educar y promover la libertad del software.</p>
<p>Links de descarga:</p>
<p>Mirror 1: <a href="http://blog.zerial.org/files/software_libre_para_una_sociedad_libre.pdf">Desde este blog [PDF]</a><br />
Mirror 2: <a href="http://www.traficantes.net/index.php/trafis/content/download/18110/185232/file/softlibre%20enriquecido.pdf">Traficantes de sueños [PDF]</a></p>
<div id="bottomcontainerBox" style="border:1px solid #808080;">
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fblog.zerial.org%2Flinux%2Fdocumentacion%2Flectura-recomendada-software-libre-para-una-sociedad-libre%2F&amp;layout=button_count&amp;show_faces=false&amp;width=85&amp;action=like&amp;font=verdana&amp;colorscheme=light&amp;height=21" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width=85px; height:21px;" allowTransparency="true"></iframe></div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<g:plusone size="medium" href="http://blog.zerial.org/linux/documentacion/lectura-recomendada-software-libre-para-una-sociedad-libre/"></g:plusone>
			</div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<a href="http://twitter.com/share" class="twitter-share-button" data-url="http://blog.zerial.org/linux/documentacion/lectura-recomendada-software-libre-para-una-sociedad-libre/"  data-text="Lectura recomendada: Software libre para una sociedad libre" data-count="horizontal" data-via="Zerial">Tweet</a>
			</div>			
			</div><div style="clear:both"></div><div style="padding-bottom:4px;"></div>]]></content:encoded>
			<wfw:commentRss>http://blog.zerial.org/linux/documentacion/lectura-recomendada-software-libre-para-una-sociedad-libre/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

