Mie Feb 13, 2008 1:16 pm
|
 |
Arielinux
Perlero Nuevo

|
Registrado: 06 Feb 2008
Mensajes: 9
|
|
| Perl, Oracle, Net::Ftp y Digest::MD5 |
|
|
Buenas tardes, muchachos... tengo una consultilla.
En el otro topic puse el script para hacer el download de archivos que iban parametrizados por unas tablas en la DB Oracle.
Bueno, ahora el tema: está en cómo hacer para comparar el md5sum del archivo que está en el servidor ftp remoto y el archivo que ya bajé el día anterior, así sería una forma de controlar que si tienen el mismo md5sum que no baje el archivo para no duplicarlo.
¿Cómo podría revisar el md5sum del archivo del servidor ftp remoto?
Cualquier sugerencia es válida, desde ya gracias y saludos desde py. |
|
|
|
Mie Feb 13, 2008 1:18 pm
|
 |
Arielinux
Perlero Nuevo

|
Registrado: 06 Feb 2008
Mensajes: 9
|
|
|
|
|
Después voy a poner el código completo y más optimizado que el otro, que fue revisado por Uriel  |
|
Mie Feb 13, 2008 4:27 pm
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4222
Ubicación: Valladolid, España
|
|
|
|
|
En principio, no se puede hacer, salvo que el servidor FTP permita la ejecución del comando md5sum por medio del envío del comando quot(), pero no veo claro cómo obtener la respuesta.
Yo lo que solía hacer es pedir un listado largo (con detalles) y comparaba tamaño en bytes y, sobre todo, las fechas. Si en el servidor era más moderno, lo bajaba. |
|
Sab Feb 16, 2008 9:57 am
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4222
Ubicación: Valladolid, España
|
|
|
|
Lun Feb 18, 2008 5:32 am
|
 |
Arielinux
Perlero Nuevo

|
Registrado: 06 Feb 2008
Mensajes: 9
|
|
|
|
|
| Chas gracias... ahora los voy a revisar... lo que estaba pensando era bajar los archivos una vez y guardarlos en un directorio, y después al día siguiente, volverlos a bajar y hacer el md5sum desde el Linux contra los que están en el directorio, y así sucesivamente día a día... |
|
Lun Feb 18, 2008 4:52 pm
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4222
Ubicación: Valladolid, España
|
|
|
|
|
| Si el hecho de hacer el cálculo del md5 es por saber si han cambiado los ficheros, tanto en su contenido como en sus fechas de modificación, te valdría con hacer un dir() para saber si los tienes que bajar o no. No tendrías que bajar ningún fichero en caso de que no hubiese cambios. |
|
Mie Feb 20, 2008 7:41 am
|
 |
Arielinux
Perlero Nuevo

|
Registrado: 06 Feb 2008
Mensajes: 9
|
|
|
|
|
| ¿Cómo usaría el dir() para hacer eso? Medió que no la cacho; si me podes dar una mano te agradecería... |
|

Mie Feb 20, 2008 10:35 am
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4222
Ubicación: Valladolid, España
|
|
|
|
|
Con el siguiente programa
| Perl: | #!/usr/bin/perl -w
use strict;
use Net:: FTP;
my $ftp = Net:: FTP-> new("servidor.ftp.com", Debug => 1)
or die "ERROR: No puedo conectarme al servidor: $@";
$ftp-> login('usuario', 'contraseña')
or die "ERROR: No puedo hacer login: ", $ftp-> message;
$ftp-> cwd("public_html/cgi-bin")
or die "ERROR: No puedo entrar en el directorio: ", $ftp-> message;
my @ficheros = $ftp-> dir();
print join "\n", @ficheros;
print "\n"; |
obtengo el listado largo de los ficheros.
En mi servidor, me devuelve una línea por cada fichero, de este modo:
| Código: |
drwxrwxr-x 2 yo users 4096 Nov 15 2006 My
-rwxr-xr-x 1 yo users 5544 Oct 4 00:20 ajax_combo.pl
-rwxr-xr-x 1 yo users 646 Nov 15 2006 clienteTable.pl
-rwxr-xr-x 1 yo users 260 Aug 28 2006 comando.pl
-rwxr-xr-x 1 yo users 1532 Feb 2 2007 fechas.pl |
Como ves, están los campos separados por espacios.
Puedo ahora sacar las nombres, las fechas y los tamaños de los ficheros con un simple split:
| Perl: | my %ficheros;
chdir ("directorio de trabajo");
foreach ( @ficheros ) {
my ( $nombre, $mes, $dia, $hora, $tamano ) = (split " ")[- 1,- 4,- 3,- 2,- 5];
# Comprobar si son iguales:
# hacer un stat($nombre) para obtener la información del fichero local
# si el $tamano o fecha es distinto, lo bajamos con un get().
#
} |
Además, nos hemos colocado (chdir()) en el directorio donde están los ficheros locales. Para comprobar si tenemos que bajarlo o no, hacemos un stat() del fichero local y de todos los valores que nos devuelve, comparamos el tamaño y las fechas con el que está en el remoto. Con que uno solo de los valores sea distinto, nos lo bajamos.
Aquí hay un problema muy claro: esto fallará si no están sincronizados los relojes del cliente y del servidor. Si solo hay un segundo de diferencia, provocará que se bajen todos los ficheros, siempre. Una forma de solventarlo es haciendo diferencia de fechas: si el fichero que está en el servidor tiene más de... un día, por ejemplo, de diferencia con el local, entonces lo bajamos.
La mayor parte de las veces, bastaba con mirar el tamaño del fichero, porque suele cambiar con cada cambio de los ficheros, salvo en ficheros que siempre tienen el mismo tamaño (ficheros binarios que almacenan información siempre del mismo tamaño).
En CPAN hay más formas de hacer esto mismo. Por ejemplo, el script mirror. |
|

Powered by phpBB © 2001, 2005 phpBB Group
|