<?xml version="1.0" encoding="utf-8"?>
        <?xml-stylesheet type="text/css" href="http://www.orvtech.com/styles/feed.css"?>
<rss version="2.0"
 xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
 xmlns:dc="http://purl.org/dc/elements/1.1/"
 xmlns:admin="http://webns.net/mvcb/"
 xmlns:atom="http://www.w3.org/2005/Atom"
>
<channel>
<title>Categorizado como: Scripts | Linux y el NSLU2</title>
<atom:link href="http://www.orvtech.com/archives/scripts/index-rss.xml" rel="self" type="application/rss+xml" />
<link>http://www.orvtech.com</link>
<description></description>
<dc:language>es-ve</dc:language>
<dc:creator>orvtech</dc:creator>
<dc:date>2010-09-02T18:22:06-04:00</dc:date>
<admin:generatorAgent rdf:resource="http://nanoblogger.sourceforge.net" />
<image><link>http://www.orvtech.com</link><url>http://www.orvtech.com/images/feedicon.png</url><title>Categorizado como: Scripts | Linux y el NSLU2</title></image>
<item>
<link>http://www.orvtech.com/archives/2010/08/02/recolectar_emails_de_comunidades_en_internet/index.html</link>
<guid isPermaLink="true">http://www.orvtech.com/archives/2010/08/02/recolectar_emails_de_comunidades_en_internet/index.html</guid>
<title>Recolectar emails de comunidades en internet.</title>
<dc:date>2010-08-02T05:07:56-04:00</dc:date>
<dc:creator>orvtech</dc:creator>
<dc:subject> Linux, Scripts</dc:subject>
<description><![CDATA[
<p>
Desde hace un par de años me llamo la atención como se colaron a <a href="http://www.noolvidaremos.com/?IncludeBlogs=1&s=lista+de+emails">internet</a> los correos electrónicos de miles de internautas afectos al actual gobierno venezolanor. Revisando los comentarios y usando google me pude dar cuenta que la fuente podría ser alguna comunidad web (foro) orientada específicamente a usuarios oficialistas, no veo otra forma de asociar una dirección de correo electrónica con una tendencia política.
<br />

Para duplicar estos resultados escribí un script que permite obtener estos emails y se adapta a cualquier comunidad que use phpBB como software para foros. echemos un vistazo.
</p>

<pre>
TEMP_URL="/tmp/spider_url.tmp"
MAX_SLEEP=1
TMP_EMAILS="/tmp/spider_emails.tmp"
CONFIG=$1
EMAIL_OUTPUT="/tmp/emails.txt"

rm -f $TEMP_URL
rm -f $TMP_EMAILS
rm -f $EMAIL_OUTPUT

for COMUNIDAD in `cat $CONFIG`
do
COMUNIDAD_URL=`echo $COMUNIDAD | awk -F, '{print $1}'`
PERFILMIN=`echo $COMUNIDAD | awk -F, '{print $2}'`
PERFILMAX=`echo $COMUNIDAD | awk -F, '{print $3}'`
PERFIL=$PERFILMIN
while [ "$PERFIL" -lt "$PERFILMAX" ]
  do echo "http://$COMUNIDAD_URL/profile.php?mode=viewprofile&amp;u="$PERFIL
  PERFIL=`expr $PERFIL + 1`
  done 
done | sort -R | grep -i [a-z] &gt;&gt; $TEMP_URL

for URL_DE_PERFIL in `cat $TEMP_URL`
do curl -s --referer `shuf -n1 $TEMP_URL` $URL_DE_PERFIL |\
grep -i "@" | \
sed -e 's/&lt;/ /g' -e 's/&gt;/ /g' -e 's/\:/ /g' -e 's/\=/ /g' -e 's/&amp;amp;/ /g' | sed s/\"/\ /g |\
tr ' ' '\n' | \
grep "@" | sort | uniq | tr 'A-Z' 'a-z'  
SEGUNDOS=$[ ( $RANDOM % $MAX_SLEEP )  + 1 ]
sleep $SEGUNDOS
done &gt;&gt; $TMP_EMAILS

cat `echo $TMP_EMAILS` | grep -i -E '[a-zA-Z0-9_]*@[a-zA-Z0-9]*\.*\.(com|edu|net|org|info|ve)' | sort | uniq &gt; $EMAIL_OUTPUT</pre>

<br />

<p>
El script toma información que es publica y la filtra hasta obtener una cadena que semejé una dirección de correo electrónico, como pueden ver en las siguientes imagenes el perfil de los usuarios son públicos y es predecible cual es la URL de estos perfiles ya que son numerados de forma secuencial.
</p>

<div style="text-align:center;"><a href="http://www.orvtech.com/images/galleries/foros-phpbb-emails/index.html" alt="foros de phpbb que revelan informacion de usuarios"><img src="http://www.orvtech.com/images/galleries/foros-phpbb-emails/thumbs/foros-aporrea-1.gif" height="100px" width="100px" /></a>
<a href="http://www.orvtech.com/images/galleries/foros-phpbb-emails/index.html" alt="foros de phpbb que revelan informacion de usuarios"><img src="http://www.orvtech.com/images/galleries/foros-phpbb-emails/thumbs/foros-aporrea-2.gif" height="100px" width="100px" /></a>
<a href="http://www.orvtech.com/images/galleries/foros-phpbb-emails/index.html" alt="foros de phpbb que revelan informacion de usuarios"><img src="http://www.orvtech.com/images/galleries/foros-phpbb-emails/thumbs/foros-noticiero-1.gif" height="100px" width="100px" /></a>
<a href="http://www.orvtech.com/images/galleries/foros-phpbb-emails/index.html" alt="foros de phpbb que revelan informacion de usuarios"><img src="http://www.orvtech.com/images/galleries/foros-phpbb-emails/thumbs/foros-noticiero-3.gif" height="100px" width="100px" /></a>
<a href="http://www.orvtech.com/images/galleries/foros-phpbb-emails/index.html" alt="foros de phpbb que revelan informacion de usuarios"><img src="http://www.orvtech.com/images/galleries/foros-phpbb-emails/thumbs/foros-noticiero-4.gif" height="100px" width="100px" /></a>
</div>

<br />
<p>
Al ejecutar el script no arroja ninguna salida, tendríamos que hacer un <i>cat</i> a <i title="/tmp/emails.txt">$EMAIL_OUTPUT</i> como lo vemos aquí:
<div style="text-align:center;"><img src="http://www.orvtech.com/images/galleries/foros-phpbb-emails/foros-run.png" alt="vista del script ejecutandose"/></div>
</p>

<p>
Si se fijan el el script el recibe un parámetro cuando lo ejecutamos, ese parámetro es la ruta a un archivo que va a contener la información de la URL del foro a escanear, el primer perfil a escanear y el ultimo perfil, todo separado por comas sin espacios en blanco <i>(comunidad,minimo,maximo)</i> el archivo se vería algo así:
</p>
<pre>www.noticierodigital.com/forum,1001,1010
aporrealos.com/forum,1000,1020</pre>
<br />

<p>
Para llegar a cual es el perfil numero del perfil del ultimo usuario registrado por demos jugar en nuestro navegador web con el parámetro <i title="perfil del usuario en los foros de aporrealos.com">u=17015</i> y cambiar ese numero por uno mas alto hasta que recibamos una pantalla de error del foro diciendo que ese perfil no existe. 
</p>

<div style="text-align:center;"><img src="http://www.orvtech.com/images/galleries/foros-phpbb-emails/foros-aporrea-1.png" width="700px" alt="foro aporrealos.com exponiendo informacion de sus usuarios"></div>

<br />
<br />

<p>
<b>Evitando Patrones.</b>
<br />
Si volvemos al script que publique, pueden ver que tome algunas medidas para evitar crear patrones el archivos de registro (log files) alterando el orden de los perfiles y cambiando aleatoriamente el tiempo a esperar entre visita y visita a los perfiles adicionalmente estoy enviando un 'referrer' perteneciente a estas comunidades con cada petición HTTP. 
</p>

<p>
El producto final de este script es una lista de direcciones de correo, una dirección por linea y luce así:
</p>
<pre>ferminmittilo@gmail.com
ivanmarcanolopez@hotmail.com
jjguillen@cantv.net
monje902@hotmail.com
psichofra@hotmail.com</pre>
<br />

<p>
Este script no funciona con todos los foros phpBB, algunos requieren una sesión valida para acedar la pagina de los perfiles. En la segunda parte de este script (que publicare en los próximos días) usare este mismo script pero implementando cookies, sesiones, proxies y recurriendo a la cache de algunos buscadores web.
</p>
<br />
<p>
<b title="Actualizado el Martes 3 de Agosto del 2010">UPDATE:</b> El script corre sin problemas en el <a href="http://www.orvtech.com/archives/apple/index.html" style="text-decoration:none;" alt="Articulos vinculados con apple y el iPhone">iPhone</a> asi que se puede ejecutar desde cualquier parte que se tenga internet bien sea vía Edge, 3G o WIFI. Aquí una captura de pantalla y un video de el script con algunas modificaciones después de ejecutarse:
<div style="text-align:center;"><br /><object width="700" height="418"><param name="movie" value="http://www.youtube.com/v/1dhaO702QKE&amp;hl=en_US&amp;fs=1?rel=0"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/1dhaO702QKE&amp;hl=en_US&amp;fs=1?rel=0" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="700" height="418"></embed></object><img src="http://www.orvtech.com/images/galleries/foros-phpbb-emails/spider_terminal.png" alt="el script colector de emails ejecutandose en el iPhone de orvtech" /><div>
</p>
<br />
<p><i>
<b>Galería vinculada:</b> <a href="http://www.orvtech.com/images/galleries/foros-phpbb-emails/index.html">Recolectar emails de comunidades basadas en phpBB</a>
</i></p>]]></description>

</item>
<item>
<link>http://www.orvtech.com/archives/2010/07/29/mas_de_170_millones_de_registros_de_facebook_expuestos_en_un_torrent_de_mas_de_2_8gb/index.html</link>
<guid isPermaLink="true">http://www.orvtech.com/archives/2010/07/29/mas_de_170_millones_de_registros_de_facebook_expuestos_en_un_torrent_de_mas_de_2_8gb/index.html</guid>
<title>Mas de 170 millones de registros de Facebook expuestos en un torrent de mas de 2.8GB.</title>
<dc:date>2010-07-29T12:44:30-04:00</dc:date>
<dc:creator>orvtech</dc:creator>
<dc:subject> Linux, Scripts</dc:subject>
<description><![CDATA[<p>
El día de ayer salio la noticia de que en los torrents estaba circulando un archivo con mas de cien mil registros de facebook cosa que me llamo la atención. Cinco minutos mas tarde ya estaba descargando este archivo y 2 horas mas tarde me estaba llevando la sorpresa de que son solo nombres y URLs, información pública concentrada en un grupo de archivos.<br /> 
<div style="text-align:center;"><img src="http://www.orvtech.com/images/facebook-privacy.png" alt="facebok privacy" width="700px" heigh="131px" /></div>
<br />Perfecto para aquellos interesados en crear scripts y atacar específicamente vía brutforce estos perfiles. 
Si aun no lo han descargado, pueden hacerlo de <a href="http://thepiratebay.org/torrent/5722635/Facebook_directory_-_personal_details_for_100_million_users" rel="nofollow">thepiratebay.org</a> y si la curiosidad los mata aquí tienen 10 lineas de cada archivo para que tengan una idea de su contenido:
</p>
<br />
<p>
<b>El script:</b>
<pre>for X in `ls *.bz2`
  do echo $X
  bzcat $X | head -n 100 | tail -n 10
  echo "---------------------------------------------"
done</pre><br />
</p>
<br />
<p>
<b>El producto:</b>
<pre>facebook-first.l-withcount.txt.bz2
40265 jasonc
39901 davidd
39717 johnk
39634 scottm
39481 ryanb
39388 scotts
39188 chrisd
39093 kevinb
38983 chrisg
38881 mattb
--------------------------------------------- </pre><br />

<pre>facebook-firstnames-withcount.txt.bz2
192998 jeremy
192256 debbie
191329 christine
190512 rebecca
189062 kathy
187478 jay
183156 sandra
181704 andrea
180265 megan
179456 lauren
--------------------------------------------- </pre><br />

<pre>facebook-f.last-withcount.txt.bz2
27522 aahmed
27426 agupta
27301 jlopez
26912 mdavis
26887 jmartinez
26758 arodriguez
26729 bwilliams
26705 vkumar
26543 jjackson
26445 cmiller
--------------------------------------------- </pre><br />

<pre>facebook-lastnames-withcount.txt.bz2
90871 ahmad
90245 hughes
89172 bennett
89105 love
88912 kim
88332 mohamed
88071 gomez
87216 mendoza
86555 gray
86346 richardson
--------------------------------------------- </pre><br />

<pre>facebook-names-original.txt.bz2
157 vk vinki
157 yean
19 lazio 19
1b emin yilmaz 1b
1bsalih yilmaz1b
1dlfred ogbonmwan
1fc140d9
1o sankalp rajan garg
1o smart stunt 1o
1u amarjot kaur 1u
--------------------------------------------- </pre><br />

<pre>facebook-names-unique.txt.bz2
david miller
vinod kumar
sameer khan
rahul singh
karen smith
senthil kumar
alex smith
mary smith
michael miller
richard smith
--------------------------------------------- </pre><br />

<pre>facebook-names-withcount.txt.bz2
3048 david miller
3046 vinod kumar
3021 sameer khan
3010 rahul singh
2954 karen smith
2934 senthil kumar
2934 alex smith
2921 mary smith
2901 michael miller
2886 richard smith
--------------------------------------------- </pre><br />

<pre>facebook-urls.txt.bz2
http://en-us.facebook.com/people/-AR-Alinea-Doza/100000264666779
http://en-us.facebook.com/people/-AR-Marchan/100000029667593
http://en-us.facebook.com/people/-ARPaettyBoy-Paeston-/1396447251
http://en-us.facebook.com/people/-ARaiin-Amiir/1329674643
http://en-us.facebook.com/people/-ARichKidd-Bell/725782861
http://en-us.facebook.com/people/-ARiich-Kiid-Pierre-Kdsshinout-Page-two/100000978229535
http://en-us.facebook.com/people/-Aa-Xdie/1603519156
http://en-us.facebook.com/people/-AaMior-Ahmad-/100000384112127
http://en-us.facebook.com/people/-Aaachh-Mcloughlin/100001042156076
http://en-us.facebook.com/people/-Aaaoqantazz-Lexhii/1029276376
--------------------------------------------- </pre>
</p>]]></description>

</item>
<item>
<link>http://www.orvtech.com/archives/2010/07/07/clonar_discos_sin_importar_si_tienen_errores/index.html</link>
<guid isPermaLink="true">http://www.orvtech.com/archives/2010/07/07/clonar_discos_sin_importar_si_tienen_errores/index.html</guid>
<title>Clonar discos sin importar si tienen errores.</title>
<dc:date>2010-07-07T15:24:44-04:00</dc:date>
<dc:creator></dc:creator>
<dc:subject> Linux, Scripts, EnUnaSolaLinea</dc:subject>
<description><![CDATA[<div align="center" style="text-align:center;"><a href="http://www.orvtech.com/images/dd-clone-xp.png"><img src="http://www.orvtech.com/images/dd-clone-xp.gif" alt="dd recupera con Linux una instalacion de Windows XP" height="194px" width="599px" /></a></div>
<p>A un compa&ntilde;ero de trabajo se le da&ntilde;o el disco de su laptop (una Lenovo con Windows XP instalado). y tenia dias tratando de clonar el disco usando ghost, seagate tools, y una infinidad de herramientas especializadas para Windows. Hoy que yo tenia un poco mas de tiempo le propuse que intentara bootear desde un Live CD de Fedora y lo clonara bit por bit usando el comando <i>dd</i>. Para clonar el disco actual lo que hicimos fue conectar el nuevo disco v&iacute;a USB y ejecutamos:</p>
<pre>dd if=/dev/sda of=/dev/sdb conv=notrunc,noerror</pre>
<br />
<p>Las opciones <i>notrunc</i> y <i>noerror</i> le dicen a <i>dd</i> que no trunque el archivo a cero bytes y evita que se detenga cuando encuentre errores respectivamente.<br />
Si tenemos suerte y no hay data critica para el sistema operativo en los sectores da&ntilde;ados podemos recuperar la instalaci&oacute;n.</p>
<br />
<br />
<div align="center" style="text-align:center;"><a href="http://www.orvtech.com/images/dd-done-xp.png"><img src="http://www.orvtech.com/images/dd-done-xp.gif" width="599px" height="218px" /></a></div>
<p>
Casi 130 horas después <i>dd</i> termino, Windows corrió un <i>chkdisk</i> y la computadora inicio con algunos problemas como era de esperarse.
</p>]]></description>

</item>
<item>
<link>http://www.orvtech.com/archives/2010/06/25/limitar_el_espacio_de_una_carpeta_sin_usar_cuotas_en_samba/index.html</link>
<guid isPermaLink="true">http://www.orvtech.com/archives/2010/06/25/limitar_el_espacio_de_una_carpeta_sin_usar_cuotas_en_samba/index.html</guid>
<title>Limitar el espacio de una carpeta sin usar cuotas en Samba.</title>
<dc:date>2010-06-25T13:55:58-04:00</dc:date>
<dc:creator>orvtech</dc:creator>
<dc:subject> Linux, Scripts</dc:subject>
<description><![CDATA[
<p>Hace poco me consultaron si se podía limitar el espacio de una carpeta Samba (samba share) sin tener control de usuarios es decir hay una carpeta por usuario que esta a su vez es 'mapeada' a su estación de trabajo (que corre windows) pero todos los usuarios usan el mismo usuario y el mismo password para acceder cada una de sus carpetas. La pregunta me dejo cabezón, yo nunca trabaje con Samba pero se que debe de haber forma de hacer esto. Por ahora me dispuse a crear un script que le ayudara.</p>

<p>El script lee un archivo de texto separado por comas el cual tiene dos columnas una para el nombre del usuario y la cantidad de Megabytes que se le va a asignar a cada usuario. Usando el comando dd el script crear archivos que son formateados como EXT3 y seguidamente los monta. El archivo de texto plano luce así:</p>

<pre># cat /tmp/usuarios.txt 
maria.perez,5
arnaldo.hernandez,5
gustavo.flores,10
jesus.boss,5
marta.hernandez,5
wilkneman.pascoski,5
tatiana.siu,5
alexandra.delarosa,5</pre>
<br />

<p>Aparte de crear, formatear y montar estos archivos el script también crea la configuración base que se le va a anexar a al <i>smb.conf</i> con el siguiente formato para cada usuario:</p>


<pre>[alexandra.delarosa]
   comment = alexandra.delarosa with 5MB
   path = /mnt/smb_discs/alexandra.delarosa
   read only = no
   browseable = yes
   guest ok = yes

[arnaldo.hernandez]
   comment = arnaldo.hernandez with 5MB
   path = /mnt/smb_discs/arnaldo.hernandez
   read only = no
   browseable = yes
   guest ok = yes


[gustavo.flores]
   comment = gustavo.flores with 10MB
   path = /mnt/smb_discs/gustavo.flores
   read only = no
   browseable = yes
   guest ok = yes</pre>
<br />

<p>Luego seria cuestión de retocar el <i>/etc/Samba/smb.conf</i> y reiniciar el servicio, re-mapear esto <i title="Carpetas Samba">Samba share</i> a los usuarios y listo.<br />
Aquí esta el script:</p>

<pre>LISTAUSUARIOS=`cat /tmp/usuarios.txt|sort`
RUTA_DISCOS="/smb_disks/smb_drives"
MOUNT_SMB="/mnt/smb_discs"
TMPSAMBACONF="/tmp/samba.virt.conf"
echo &gt; $TMPSAMBACONF
mkdir -p `echo $RUTA_DISCOS`
for X in $LISTAUSUARIOS
do echo $X | awk -F , '{print "asignando " $2 "MB a usuario "$1}'
  USUARIO=`echo $X | awk -F , '{print $1}'`
  PRE_ESPACIO=`echo $X | awk -F , '{print $2}'`
  let ESPACIO=`echo $PRE_ESPACIO`*1024
  dd if=/dev/zero of=$RUTA_DISCOS/$USUARIO.img bs=1024 count=$ESPACIO
  /sbin/mke2fs -L $USUARIO -j $RUTA_DISCOS/$USUARIO.img 
  mkdir -p $MOUNT_SMB/$USUARIO
  mount -t ext3 $RUTA_DISCOS/$USUARIO.img -o loop $MOUNT_SMB/$USUARIO
  echo "[$USUARIO]
     comment = `echo $USUARIO" with "$PRE_ESPACIO"MB"`
     path = /mnt/smb_discs/$USUARIO
     read only = no
     browseable = yes
     guest ok = yes
   " &gt;&gt; $TMPSAMBACONF
done
echo "espacio usado en $RUTA_DISCOS: "
du -smh $RUTA_DISCOS/*.img
du -smh $RUTA_DISCOS/
mount -l | grep $MOUNT_SMB
echo "CHECK $TMPSAMBACONF AND ADD IT TO YOUR /etc/samba/smb.conf"</pre>
<br />

<p>
Como mencione anteriormente, yo nunca he trabajado con <i title="Samba Shares">Samba</i> en ambiente de producción yo practique o jugué un poco con Samba hace unos 5 anhos. este script no incluye configuraciones para estos Samba shares que proporcionen algo de seguridad. Si alguien tiene sugerencias pueden dejarlas en los comentarios.
</p>]]></description>

</item>
<item>
<link>http://www.orvtech.com/archives/2010/06/10/respaldar_nanoblogger/index.html</link>
<guid isPermaLink="true">http://www.orvtech.com/archives/2010/06/10/respaldar_nanoblogger/index.html</guid>
<title>Respaldar NanoBlogger</title>
<dc:date>2010-06-10T10:07:24-04:00</dc:date>
<dc:creator>orvtech</dc:creator>
<dc:subject> Linux, Scripts, NanoBlogger</dc:subject>
<description><![CDATA[
<p>Los directorios mas importantes de NanoBlogger son data templates styles images y plugins. Anoche decidí a automatizar el respaldo de mi blog, como no tengo problemas de espacio decidí solo dejar por fuera el directorio cache. Este es el script para crear un archivo comprimido y subirlo a otro server vía SCP:</p>

<pre>#!/bin/bash
BLOG_PATH="/path/to/the/directory/that/contains/your/blog.conf/"
BLOG_NAME="orvtech.com"
DATE=`date +%d%b%Y-h%Hm%M`
NO_BAKUP="cache/*"
SCP_SERVER=""
SCP_USER=""
SCP_PORT="22"

cd $BLOG_PATH
tar -czpsf ~/$BLOG_NAME-nanoblogger.$DATE.tar.gz --exclude "$NO_BAKUP" *
ls -lah  ~/$BLOG_NAME-nanoblogger.$DATE.tar.gz
scp -P$SCP_PORT ~/$BLOG_NAME-nanoblogger.$DATE.tar.gz $SCP_USER@$SCP_SERVER:~/</pre>]]></description>

</item>
<item>
<link>http://www.orvtech.com/archives/2010/05/18/descargas_automatizadas_de_torrents_en_el_nslu2/index.html</link>
<guid isPermaLink="true">http://www.orvtech.com/archives/2010/05/18/descargas_automatizadas_de_torrents_en_el_nslu2/index.html</guid>
<title>Descargas automatizadas de torrents en el NSLU2</title>
<dc:date>2010-05-18T15:19:35-04:00</dc:date>
<dc:creator>orvtech</dc:creator>
<dc:subject> Linux, Scripts, NSLU2</dc:subject>
<description><![CDATA[
<p>Como dice el titulo, automatizado (gracias a cron) y con una consola para monitorear las descargas. La consola luce algo así:</p><div style="text-align:center">
<a href="http://www.orvtech.com/images/torrents_cron_script.png"><img src="http://www.orvtech.com/images/thumb_torrents_cron_script.gif" width="450px" height="297px"></a>
</div>

<p>	
Este es el script que uso para descargar torrents a horas y días pre-determinadas, es un wrapper de btlaunchmanycurses.py y lo llamo en un cronjob a distintas horas y días. Demosle un vistazo y luego hablamos de las opciones:
</p>
<pre>
#!/bin/bash
DESCARGA_VELOCIDAD=1458
COMPARTE_VELOCIDAD=113
LIMPIAR_INTERVALO=5
MIN_PUERTO=27777
MAX_PUERTO=27799
TORRENTS_CARPETA="/home/TU_USUARIO_AQUI/descargas"
DESCARGAS_DESTINO="/home/TU_USUARIO_AQUI/descargas"
test -d $TORRENTS_CARPETA || mkdir -p $TORRENTS_CARPETA
test -d $DESCARGAS_DESTINO || mkdir -p $DESCARGAS_DESTINO
cd $TORRENTS_CARPETA
nice /usr/bin/btlaunchmanycurses.py $TORRENTS_CARPETA \
--saveas_style 3 \
--upnp_nat_access 0 \
--minport $MIN_PUERTO \
--maxport $MAX_PUERTO \
--max_upload_rate $COMPARTE_VELOCIDAD \
--max_download_rate $DESCARGA_VELOCIDAD \
--auto_flush $LIMPIAR_INTERVALO
</pre>
<p>
Para empezar la descarga solo basta poner los *.torrent en <i>~/descargas/</i> y el script hará el resto. 
<br />
<br />
<b>saveas_style:</b>
Que nombre le va a poner a la descarga del torrent. Acepta hasta tres valores del 1 al 3:
<ul>
<li>1= Lo renombra al nombre que el torrent especifica.</li>
<li>2= Lo salva bajo el nombre del torrent.</li>
<li>3= Lo salva dentro de un directorio que tiene el nombre especificado en el torrent.</li>
La ultima (3) es la opcion que usaremos para tener todo mas ordenado.
</ul>
</p>

<p>
<b>upnp_nat_access:</b>
Intenta autoconfigurar un puerto UPnP en el router para que le haga foward al server. En mi caso uso la primera opción que lo deshabilita. Pero aquí tienen la lista completa de opciones:
<ul>
<li>0= deshabilitada.</li>
<li>1= modo 1, esta es rápida y es la que btlaunchmanycurses usa como predeterminada.</li>
<li>2= modo 2, esta es un poco mas lenta.</li> 
</ul>
</p>

<p>
<b>minport:</b>
El puerto que va a usar para escuchar, en caso de que este puerto este ocupado o no este disponible, btlaunchmanycurses utilizara el siguiente puerto y así de manera sucesiva hasta llegar al maxport.
</p>

<p>
<b>maxport:</b>
El número de puerto máximo en el que puede escuchar, el predeterminado es el 60000.
</p>

<p>
<b>max_upload_rate:</b>
El máximo de ancho de banda a usar para compartir nuestros torrents, este acepta el numero máximo de kB/s o estas dos opciones:
<ul>
<li>0= Sin limites.</li>
<li>-1= Automático.</li>
</ul>
El valor predeterminado es 0 (sin limites).
</p>


<p>
<b>max_download_rate:</b>
El máximo de kB/s que se pueden descargar, el valor predeterminado es 0 que indica que no tiene limites.
</p>
<p>
<b>auto_flush:</b>
Los minutos entre cada flush al disco, el predeterminado es 0 que indica deshabilitado.
</p>
<p>
Una opcion que Uds pueden considerar es <i>--random_port</i> que toma los valores 0 o 1, esta opción le dice a btlaunchmanycurses que use un puerto aleatoriamente seleccionado dentro del rango de <i>minport</i> y <i>maxport</i>.
</p>

<br />

<p>
<b>El Cronjob.</b><br />
<pre>
30 0  *   *   *     /home/TU_USUARIO_AQUI/descargas/cron_torrent.sh >/dev/null 2>&1
8  8  *   *   *     /home/TU_USUARIO_AQUI/descargas/killbtlaunch.sh >/dev/null 2>&1
</pre>
Como verán ejecuto dos scripts distintos, uno que levanta el torrent y otro que lo mata. veamos el primero, cron_torrent.sh:
<pre>
#!/bin/bash
screen -D -m -S "torrents-nightly" /home/TU_USUARIO_AQUI/descargas/download.sh
</pre>
Este a las 12:30am creara un screen de nombre <i>torrents-nightly</i> y dentro de ese screen ejecutara el script que discutimos arriba el cual lo llamo download.sh. El segundo script que se ejecuta a las 8:08am termina las descargas. Aquí esta el cod
igo fuente de <i>killbtlaunch.sh</i>:
<pre>
#!/bin/bash
for X in `ps ax | grep -i -E 'btlaunchmanycurses|bittornado|irssi|torrents-nightly' | grep -v grep |awk '{print $1}'`
do kill -9 $X
done
</pre>
</p>]]></description>

</item>
<item>
<link>http://www.orvtech.com/archives/2010/05/16/encontrar_los_directorios_y_archivos_mas_grandes_en_una_carpeta/index.html</link>
<guid isPermaLink="true">http://www.orvtech.com/archives/2010/05/16/encontrar_los_directorios_y_archivos_mas_grandes_en_una_carpeta/index.html</guid>
<title>Encontrar los directorios y archivos mas grandes en una carpeta </title>
<dc:date>2010-05-16T01:42:52-04:00</dc:date>
<dc:creator>orvtech</dc:creator>
<dc:subject> Linux, Scripts, EnUnaSolaLinea</dc:subject>
<description><![CDATA[<p>Usando `du` podemos encontrar los directorios y archivos mas grande dentro de un directorio. el siguiente ejemplo muestra como listar los 10 archivos y carpetas mas grande dentro del directorio 'HOME'</p>
<pre>du -a ~/ | sort -n -r | head -n 10</pre>

<br />

<p>
Con `find` podemos conseguir los 10 archivos mas grandes recursivamente dentro de un directorio.
</p>
<pre>find ~/ -type f -exec ls -ls {} \; | awk '{print $6"\t"$9}' | sort -k1 -n -r | head -n 10</pre>]]></description>

</item>
<item>
<link>http://www.orvtech.com/archives/2010/05/11/monitorear_ataques_a_nuestro_nslu2_desde_el_iphone/index.html</link>
<guid isPermaLink="true">http://www.orvtech.com/archives/2010/05/11/monitorear_ataques_a_nuestro_nslu2_desde_el_iphone/index.html</guid>
<title>Monitorear ataques a nuestro NSLU2 desde el iPhone.</title>
<dc:date>2010-05-11T18:25:22-04:00</dc:date>
<dc:creator>orvtech</dc:creator>
<dc:subject> Linux, Scripts, NSLU2, Apple</dc:subject>
<description><![CDATA[<p>
Un poco cansado ya de ver los logs todas las mañanas de mi NSLU2, decidí hacer un script que me permita monitorear los ataques mas recientes a mi NSLU2. Para no limitarme decidí hacerlo de tal forma que presentara la información via web. El script aun se puede mejorar almacenando información en un array o incluso en una base de datos sqlite. Pero por ahora me funciona y he estado un tanto ocupado como para optimizarlo. 
</p>
<p>
<b>El Script.</b><br />
Es algo simple, de hecho no hay loops, llamadas a sub-rutinas, condicionales ni nada extraño.
</p>
<pre>#!/bin/bash
FECHA=`date +%d/%b/%Y`

echo &quot;&lt;body&gt;&lt;head&gt;&lt;link href=\&quot;l33t.css\&quot; rel=\&quot;stylesheet\&quot; type=\&quot;text/css\&quot; /&gt;&lt;/head&gt;&lt;textarea name=\&quot;textarea\&quot; cols=\&quot;80\&quot; rows=\&quot;80\&quot; wrap=\&quot;off\&quot;&gt;&quot; &gt; /var/www/public/www/htdocs/stats.html
date &gt;&gt; /var/www/public/www/htdocs/stats.html
echo &quot;-------------------------------&quot; &gt;&gt; /var/www/public/www/htdocs/stats.html
for X in `ls /var/www`
do echo -e $X&quot; &quot; | \
tr '\n' ' '; grep ` date +%d/%b/%Y` /var/www/$X/logs/acces*.log | \
grep -i -E  'html HTTP|htm HTTP|xml HTTP|\/ HTTP|php' | grep -v -E 'rss.xml|\.png|\.gif|\.jpg|\.js|\.css|\.ico|\.css|\.js|rss.xml|stats.html|wp-admin|stats.html|crawl|slurp|msnbot|googlebot|192.168.1.[0-9]|arm-unknown-linux-gnu|localhost' | awk '{print $1&quot; &quot;$12}' | sort | uniq | wc -l 
done  &gt;&gt; /var/www/public/www/htdocs/stats.html

echo &quot;-------------------------------&quot; &gt;&gt; /var/www/public/www/htdocs/stats.html

free &gt;&gt; /var/www/public/www/htdocs/stats.html

uptime &gt;&gt; /var/www/public/www/htdocs/stats.html

echo &quot;-------------------------------&quot; &gt;&gt; /var/www/public/www/htdocs/stats.html

echo `grep $FECHA /var/www/public/logs/acces*.log | grep '/livecasts/js/test.js' | awk '{print $1&quot; &quot;$12}' | wc -l | awk '{print &quot;Livecast Hits: &quot;$1}'` &gt;&gt; /var/www/public/www/htdocs/stats.html
echo `grep $FECHA /var/www/public/logs/acces*.log | grep '/livecasts/js/test.js' | awk '{print $1&quot; &quot;$12}' | sort |uniq | wc -l | awk '{print &quot;Livecast Uniq Hits: &quot;$1}'` &gt;&gt; /var/www/public/www/htdocs/stats.html

echo &quot;-------------------------------&quot; &gt;&gt; /var/www/public/www/htdocs/stats.html

grep `date +%m/%d/%Y` /etc/portsentry/portsentry.history  &gt;&gt; /var/www/public/www/htdocs/stats.html

echo &quot;&lt;/textarea&gt;&lt;/body&gt;&quot; &gt;&gt; /var/www/public/www/htdocs/stats.html</pre>

<p>
Como pueden ver, hace analiza los logs, descartando peticiones de imágenes, archivos xml, javascripts, hojas de estilo, peticiones por host locales, spiders de buscadores, etc. luego solo toma la IP y el URL que se esta pidiendo y se asegura que sea único para dar lo mas cercano a 'uniq hits'. En las dos siguientes lineas se imprimen estadísticas de uso de memoria, tiempo de prendido y carga.<br />
En las próximas 2 lineas saco estadistas de una aplicación (que ya esta en producción) para hacer livecast, luego publicare el código y mas detalles pero por lo pronto puedo decirles lo siguiente, el Live Cast este es una aplicación que permite a transmitir en tiempo semi-real (retraso de 2 a 5 minutos) fotos de un evento con un foro. Esta optimizado para eventos de automovilismo donde la temperatura, presión barométrica y hora son importantes tener. <br />
Aquí les dejo una de las imágenes que publica esta aplicación, en esa oportunidad la usamos unas 7 personas al mismo tiempo:
</p>
<a href="http://www.orvtech.com/images/iphone_livecast_demo.png"><img src="http://www.orvtech.com/images/iphone_livecast_demo.png" width="480px" height="320"/></a>
<p>
Retomando el tema y directo al grano, las ultimas lineas del script buscan los eventos del día registrados por portsentry y los publica. El resto de las lineas son solo para formateo y maquillaje del archivo HTML que este crea. En mi caso lo tengo corriendo en este cronjob: 
</p>
<pre># m h  dom mon dow   command
*/10  *  *  *  *  /home/linuxevolution.org/scripts/uniqhits.sh</pre>
<p>
El script se puede ver en el iPhone con esta apariencia:
</p>
<img src="http://www.orvtech.com/images/iphone_view_site_stats.png" />
<br />]]></description>

</item>
<item>
<link>http://www.orvtech.com/archives/2010/04/16/script_de_arranque_para_znc_bouncer/index.html</link>
<guid isPermaLink="true">http://www.orvtech.com/archives/2010/04/16/script_de_arranque_para_znc_bouncer/index.html</guid>
<title>Script de arranque para ZNC Bouncer.</title>
<dc:date>2010-04-16T16:06:45-04:00</dc:date>
<dc:creator>orvtech</dc:creator>
<dc:subject> Linux, Scripts, NSLU2, Apple, IRC</dc:subject>
<description><![CDATA[<p>
Hace un par de artículos publique como tener el servicio de push desde un canal de <a href="http://www.orvtech.com/archives/2010/03/03/el_nslu2_como_puente_para_tener_push_de_un_servidor_irc_en_el_iphone/index.html">IRC para el iPhone</a>. Después de esa instalación quede inconforme con la forma en que hay que arrancar y parar ZNC en el servidor así que decidí crear un script de arranque. 
</p>
<p>
El siguiente script permite arrancar, parar, recargar la configuración y reiniciar el servicio. Echemosle una ojeada a /etc/init.d/zncd
</p>
<textarea class="bashcode">
#!/bin/bash

ZNC_FOLDER="/usr/bin"
ZNC_OWNR="orvtech"

if [ ! -f $ZNC_FOLDER/znc -o ! -d $ZNC_FOLDER ]
then
        echo "ZNC startup: cannot start, it appears that it is not installed"
        exit 1
fi

case "$1" in
    start)
            echo -n "Starting ZNC: "
            su - $ZNC_OWNR -c "$ZNC_FOLDER/znc"
            touch /var/lock/subsys/ZNC
            echo "OK"
            ;;
    stop)
        echo -n "Shutdown ZNC: "
        kill -9 `ps -C znc | awk '{print $1}' | grep ^[0-9]`
        rm -f /var/lock/subsys/ZNC
        echo "OK"
        ;;
    reload)
        echo -n "Reloading ZNC:"
	kill -HUP `ps -C znc | awk '{print $1}' | grep ^[0-9]`
	echo "OK"
    	;;
    status)
        if ps -C znc > /dev/null
	then 
	  echo "ZNC Bouncer is running"
	else 
	  echo "ZNC Bouncer is not running"
	fi
        ;;
    restart)
            $0 stop
	    sleep 2
            $0 start
            ;;
        *)
        echo "Usage: $0 start|stop|restart|reload|status"
        exit 1
esac
exit 0</textarea>
<p>
Si su NSLU2/Servidor esta corriendo gentoo pueden agregar el servicio así:
</p>
<textarea style="height: 18px" class="bashcode">
rc-update add zncd default</textarea>


<p>El output debería de ser algo parecido a esto</p>

<textarea style="height: 18px" class="bashcode"> * zncd added to runlevel default</textarea>]]></description>

</item>
<item>
<link>http://www.orvtech.com/archives/2010/04/14/cgi_para_obtener_el_bbcode_de_flickr_y_picasaweb_hecha_en_bash/index.html</link>
<guid isPermaLink="true">http://www.orvtech.com/archives/2010/04/14/cgi_para_obtener_el_bbcode_de_flickr_y_picasaweb_hecha_en_bash/index.html</guid>
<title>CGI para obtener el BBCode de Flickr y Picasaweb hecha en BASH. </title>
<dc:date>2010-04-14T18:00:14-04:00</dc:date>
<dc:creator>orvtech</dc:creator>
<dc:subject> Linux, Scripts</dc:subject>
<description><![CDATA[<p>
No hace mucho publique dos scripts para obtener el código BBCode a partir de la URL de un álbum de Picasa o de un set de flickr, luego de jugar un poco logre unirlos en un CGI hecho en BASH. pueden ojearlo en esta URL:
<a href="http://www.orvtech.com/album2bbcode.cgi">http://www.orvtech.com/album2bbcode.cgi</a>
</p>
<p>
El script primero evalua si la URL es de picasa o flickr, luego procede a diseccionar la data del REQUEST_URI a el script que le toque dependiendo de si es de Flickr o si es de Picasa. El CGI puede ser mejorado, actualmente no controlo si los servidores de flickr o picasa devuelven un Status distinto a 200. También se podría implementar un método de cache o regular el acceso (hacerle throtle).
</p>
<p>
El código base del CGI es el siguiente:
</p>
<textarea class="bashcode">
#!/bin/bash
echo "Content-type: text/html"
echo -e "Status: 200 \n"
GET_DATA=`env | grep REQUEST_URI |sed -e 's/\?/\ /g' | awk '{print $2}'`
ALBUM_DATA=`echo "$GET_DATA" | sed -e 's/%3A/\:/g' -e 's/%2F/\//g' -e 's/\&/ /g' |grep -i -E 'http\:\/\/picasaweb\.google\.com\/[a-z 0-9]?.*/[a-z 0-9]?|http://(www\.)*flickr.com/photos/.*/sets/[0-9]?*[0-9]'`

SIZE=`echo "$GET_DATA" | sed -e 's/%3A/\:/g' -e 's/%2F/\//g' -e 's/\&/ /g' |grep [0-9][0-9]px| sed -e 's/\=/ /g'| awk '{print $4}'`

if `echo $ALBUM_DATA | grep -i -q -E 'http\:\/\/picasaweb\.google\.com\/[a-z 0-9]?.*/[a-z 0-9]?'`
then
ALBUM_TYPE="picasa"
else
  if `echo $ALBUM_DATA | grep -i -q -E 'http://(www\.)*flickr.com/photos/.*/sets/[0-9]?*[0-9]'`
  then 
  ALBUM_TYPE="flickr"
  else
  ALBUM_TYPE="unknown"
  fi
fi

echo "
<html>
<body>
<table>
<tr>
<td>
<b>Album o Set URL:</b>
<form method=get action=\"/album2bbcode.cgi\"><input type=text name=albumoset />
</td>
<td>
<select name=\"SIZE\">"
for X in 640px 144px 288px 320px 400px 512px 576px 800px 1024px
do echo "<option value=\"$X\"> $X </option>"
done
echo "</select>
</td>
</tr>
<tr colspan=2><td>
<input type=submit>
</td></tr></table>
</form>"
echo -e "<b>Album:</b> <i>$ALBUM_DATA</i>" | sed -e 's/=/ /g'
echo "<br />< textarea class=\"bashcode\" style=\"width: 700px; height: 280px;\">"
if [[ "$ALBUM_TYPE" == picasa ]]
then
PICASA_DATA=`echo -e " $ALBUM_DATA"|sed -e 's/=/ /g'|awk '{print $2}'`
echo -e " $PICASA_DATA" | curl -s `awk -F / '{print "http://picasaweb.google.com/data/feed/api/user/"$4"/album/"$5}'` | sed -e 's/\"/\ /g' -e s/\'/\ /g | tr ' ' '\n' | grep 's72' | awk '{print "[url='$PICASA_DATA'][img]"$0"[/img][/url]\n"}' | sed s/s72/s$SIZE/g 
fi

if [[ "$ALBUM_TYPE" == flickr ]]
then
FLICKR_DATA=`echo $ALBUM_DATA |sed -e 's/=/ /g'| awk '{print $2}'`
curl -s `echo $FLICKR_DATA`| tr ' ' '\n' | grep '_s.jpg' | sed "s/\"/\ /g" |sed -e 's/_s\.jpg/\.jpg/g'| awk '{print "[url='$FLICKR_DATA'][img]"$2"[/img][/url]\n"}'
fi


if [[ "$ALBUM_TYPE" == unknown ]]
then
UNKNOWN=`echo -e " $ALBUM_DATA"|sed -e 's/=/ /g'|awk '{print $2}'`
echo "Hasta ahora solo soportamos Flickr y Picasa. Lo que Ud. introdujo $UNKNOWN no parece ser de ninguno de estos.
*El formato de URL para los sets de flickr es:
http://www.flickr.com/photos/USUARIO/sets/SET/
*El formato de URL para los álbum de Picasa es:
http://picasaweb.google.com/USUARIO/ALBUM"
fi
echo "</ textarea><br />"
echo "</ body></ html>"
</textarea>
<br />
<p>
<b>Hipervinculos relacionados:</b>
<br />
<a href="http://www.orvtech.com/archives/2010/03/17/de_picasa_a_bbcode/index.html">Script: De Picasa a BBCode.</a>
<br />
<a href="http://www.orvtech.com/archives/2010/03/16/de_flickr_a_bbcode/index.html">Script: De Flickr a BBCode.</a>
</p>]]></description>

</item>
</channel>
</rss>
