Beitrags-Archiv für die Kategory 'Receta'

Extraer tabla de un dump en MySQL

Friday, 22. May 2009 13:46

Una pequeña receta que nos ha tocado hoy hacer en el curro. A veces necesitamos recuperar de un dump de mysql, los datos de una tabla. En este caso, el script que nos ocupa, recupera de un full dump, una tabla completa, con su definición, aunque sería relativamente sencillo recuperar solo los datos (INSERT):

#!/bin/sh
if [ $# -lt 1 ]; then
echo "Use: $0 table_name [filename]"
exit 1
fi

sed -n "/structure for table \`$1\`/,/UNLOCK TABLES/p" $2

Se puede invocar de dos formas:

extract_table.sh nombre_de_tabla fichero_con_el_dump

o

cat fichero_con_el_dump | extract_table.sh nombre_de_tabla
zcat fichero_con_el_dump.gz | extract_table.sh nombre_de_tabla

Un saludo

Thema: Linux, MySql, Receta | Kommentare (0) | Autor: Iñaki

Mi correo no es un ftp

Friday, 22. May 2009 13:23

Existe una creciente oleada de personas dispuestas a quejarse porque cuando mandan ficheros de tropecientos megas, el servidor de correo no va bien. Señores, señoras, el correo no es un ftp. Uno al final se cansa de recibir mensajes enormes y muchos de ellos, inútiles. Así que os dejo una pequeñ receta de procmail para evitar saturaros la cuenta con ppt y demás familia:

# MAXMSG = bytes del mail
MAXMSG=14680064
NL="
"
:0
* $ > $MAXMSG
{
LOG="Mi correo no es un ftp${NL}"
EXITCODE=69
HOST
}

Saludos

Thema: Linux, Receta | Kommentare (0) | Autor: Iñaki

Perla: Contar palabras en un texto

Friday, 5. September 2008 10:53

Hace un par de días, estaba programando un filtro para Spamassassin y necesitaba contar el número de palabras que contenía el mail. El caso es que me dije, esto tiene que estar programado y requeteprogramado ya, por lo que me lancé a buscar ese pedazo de código. Lo bueno de esta mente virtual llamada Internet, es la disparidad de ideas que llevan al mismo sitio, así que decidí poner unas cuantas funciones que hacen lo mismo:

Esta es cosecha propia

sub wc {
	my $words = shift;

	$words =~ s/[;|,|\.|\:|\?|\!|\/|\)|\=]/ /g;
	$words =~ s/\s{2,}/ /g;
	return scalar split(/ /,$words);
}

Visto en http://askville.amazon.com/find-code-sample-Perl-word-count-script/AnswerViewer.do?requestId=1037856

#!/usr/bin/perl
use strict;
use warnings;

my %count_of;
while (my $line = <>) { #read from file or STDIN
foreach my $word (split /\s+/, $line) {
$count_of{$word}++;
}
}
print "All words and their counts: \n";
for my $word (sort keys %count_of) {
print "'$word': $count_of{$word}\n";
}

Visto en http://dada.perl.it/shootout/wc.perl.html

use strict;

my($nl, $nw, $nc);

while() {
    $nc += length;
    $nw += scalar(split);
    $nl += 1;
    # print "$nl $nw $nc\n";
}
print "$nl $nw $nc\n";
exit(0);
while (read(STDIN, $_, 4095)) {
    $_ .= ;
    $nl += scalar(split(/\n/));
    $nc += length;
    $nw += scalar(split);
}
print "$nl $nw $nc\n";

– La forma más completa: http://folk.uio.no/einarro/Comp/download.php?file=texcount.pl
– Otro más: http://foundationstone.com.au/HtmlSupport/WebPage/wordcount.html
– Y otro con explicaciones: http://en.literateprograms.org/Word_count_(Perl)

Thema: Perl, Receta | Kommentare (0) | Autor: Iñaki

Replicar configuración entre dos IIS

Friday, 1. August 2008 8:51

Volvemos con un poco de Perl, esta vez para Windows. Tengo un cliente con un par de frontales web y en su día programé una pequeña utilidad para mantener la configuración de los dos servidores actualizada. Para que funcione es necesario que esté instalado Perl para Windows (Yo uso el de ActiveState) y la utilidad de migración de Internet Information Server que podéis descargar desde el site de Microsoft en esta dirección.

El script utilizada el servicio de componentes para conectarse al servidor remoto y pedirle el listado de sitios del IIS. Os pego aquí el código:

use Win32::OLE;
use Win32::OLE::Enum;

my $host = 'SERVIDORREMOTO';

qx,del "%SYSTEMROOT%\\system32\\inetsrv\\MetaBack\\IIS Migration Tool Backup*",;

my @webs = get_sites();

foreach (@webs) {
	qx,iismt.exe $host w3svc/$_ /overwrite /noninteractive /configonly /siteid replace,;
}

sub get_sites {
	my $IIS = Win32::OLE->GetObject("IIS://$host/W3svc");
	my $enumIIS = Win32::OLE::Enum->new($IIS);
	my @site_id;

	foreach my $site ($enumIIS->All) {

		if($site->{Name} =~ /^\d+$/) {
			push @site_id,$site->{Name};
		}
	}

	return @site_id;
}

Cosas a tener en cuenta:

– El script apenas tiene comprobación de errores (ninguna) así que os dejo a vosotros esa tarea :P
– La utilidad IISMT.EXE tiene que estar en el path o en el propio directorio donde esté el script
– Podéis compilar en un EXE el script para no tener el intérprete de perl en una máquina en producción. Yo uso perl2exe, no es caro ($49) y da muy buenos resultados.

Nos vemos pronto ;)

Thema: IIS, Receta | Kommentare (0) | Autor: Iñaki

Limitar descarga de apt-get

Thursday, 3. July 2008 2:27

Mis compañeros se quejan a veces de que no pueden ver videos de youtube porque algún desaprensivo está usando la adsl de la oficina para actualizarse su Debian. Que falta de respeto. Buscando enmendar tal afrenta, encontré la manera de limitar el ancho de banda que usa apt-get para descargarse los paquetes:


# apt-get install trickle
# dpkg-divert --local --rename /usr/lib/apt/methods/http
# echo '#!/bin/sh' > /usr/lib/apt/methods/http
# echo 'RATE=100' >> /usr/lib/apt/methods/http
# echo '/usr/bin/trickle -s -d $RATE /usr/lib/apt/methods/http.distrib' >> /usr/lib/apt/methods/http
# chmod 755 /usr/lib/apt/methods/http

Esto es posible gracias a trickle, una aplicación que nos permite gestionar el ancho de banda tanto de subida como de descarga. La aplicación funciona en espacio de usuario, por lo que no es necesario tener privilegios de root para usarla en otras aplicaciones. Por lo que se puede leer en su man, parece funcionar "suplantando" las funciones de gestión de sockets del sistema.

Referencia:

http://ubuntuforums.org/showthread.php?t=20342

Thema: Debian, Linux, Receta | Kommentare (0) | Autor: Iñaki

Registrando robots de búsqueda en Apache

Wednesday, 3. October 2007 12:56

Hace unos días, un cliente me comentó su necesidad de loguear las entradas de los robots de búsqueda en un fichero aparte, para después procesarlas. Como me resultó novedoso el tema (en tanto que nunca he hecho algo parecido) me decidí a escribir un post. También han ayudado factores como recordarme que si me pagan el dominio, lo podría ir usando. Melón.

Vamos a ponernos en faena. Apache tiene una directiva para definir variables de entorno en función de una serie de condiciones. Me refiero a la directiva SetEnvIf. Para nuestro ejemplo también nos valdría BrowserMatch pero opté por la primera por ser más genérica. Simplificaré un poco el montaje (mi cliente tenía varios dominios virtuales). En nuestro caso lo vamos a hacer con mi dominio, por ejemplo.

Lo primero que tenemos que hacer es abrir el fichero donde definimos nuestro virtualhost. Sobre la línea que define el CustomLog escribimos:

SetEnvIf User-Agent bot is_a_robot
CustomLog /var/log/apache2/robots_access.log combined env=is_a_robot

Estas dos líneas sirven para definir la variable is_a_robot y activar el log en caso de que esa variable de entorno exista (con el tipo de log combined)

Fácil ¿no? Ya para terminar y rizar el rizo, hice un pequeño script en perl para separar cada bot en un fichero. Os lo pego aquí mismo (y os incluyo un enlace de paso aquí)

#!/usr/bin/perl

#
# Iñaki Rodriguez (2007)
#
# Split robots in separate files (using md5 as filename)
#
# License: GPL

use Digest::MD5 'md5_hex';

my $robot_log = '/var/log/apache2/robots_access.log';
my $output_dir = '/var/log/apache2/robots/';
my %bots;

open BOTLOG, "<$robot_log" or die ("$robot_log: I can't open it");
open INDEX, "<".$output_dir."index.txt";

while() {
    chomp();
    my ($md5,$ua) = split(/\t/);
    $bots{$md5} = $ua;
}
close(INDEX);

while() {

    chomp();
    m/^(.+?) (.+?) (.+?) (\[.+?\]) (".+?") (\d\d\d) (.+?) (".+?") (".*")$/;
    my $md5 = md5_hex($9);
    my $tmpf = $output_dir.$md5.".log";
    open LOG,">> $tmpf" or die ("$tmpf: I can't write it");
    print "Adding entry to $tmpf ($9)\n" if ($ARGV[0] ne '-q');
    $bots{$md5} = $9 if (!$bots{$md5});
    print LOG $_."\n";
    close(LOG);
}

close(BOTLOG);

open INDEX, ">".$output_dir."index.txt" or die($output_dir."index.txt: I can't create it");
foreach $md5 (keys %bots) {
    print INDEX $md5."\t".$bots{$md5}."\n";
}
close(INDEX);

Solo comentar un par de cosas del script. La variable $output_dir especifica el directorio donde va a guardar los logs por separado. En este mismo directorio se creará un fichero index.txt que guarda la correspondencia de cada log con su user agent. El nombre del fichero es la suma md5 del campo User Agent del log. Por último la variable $robot_log es la que establece el fichero donde se almacenan los registros de todos los robots.

Se podría mejorar. Invito al lector a añadir:

  • Registro de la última entrada para no duplicarlas
  • Exclusiones

Y hasta aquí el post del día.

Nota Mental: Arreglar el css que se descuadra (el theme no es mío)

Thema: Linux, Perl, Receta, apache | Kommentare (0) | Autor: Iñaki