🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: es.comp.os.linux.programacion
Article #6845

Re: FTP. Envio de fichero.

#6845
From: Jesús M. NAVARRO
Date: Thu, 08 May 2003 20:15
203 lines
8389 bytes
Hola, jmp:

jmp escribi� en es.comp.os.linux.programacion:

> Hola,
> 
> Tengo que realizar un programa que envie un fichero por FTP de forma
> automatica y que sobre todo compruebe si el envio ha sido correcto.
> 
> � que me aconsejais que utilice: scripts, lenguaje c, ...?

Un script, sin duda: m�s f�cil de implementar y, desde luego, la velocidad
de ejecuci�n no ser� un problema.

Lo que hay que mirar aqu�, son las condiciones del env�o: �es veloz y fiable
la red? �Es muy grande el fichero? �Es uno o son muchos? �Hay que comprobar
solapamientos? (es de suponer que el otro extremo lo querr� para algo, con
lo que hay que buscar la manera de hacerle ver si la transferencia est� en
curso o ha concluido).

En mi experiencia, lftp es f�cilmente automatizable y *sobre todo*
extremadamente robusto a la hora de no perder las conexiones, incluso en
redes deplorables.

> � donde puede encontrar algun programa o ejemplo ?
> 

Veamos...
El ejemplo m�nimo:

Usar lftp puede ser tan sencillo como...
lftp -f FicheroFTP

Siendo FicheroFTP...
open -u [USUARIO],[PASSWORD] ftp.example.com
lcd /ruta/local/
mirror --Remove-source-files


...No vamos a olvidarnos de un ejemplo b�sico en Bash (muy propio lo de
B�shico, en este caso):

#!/bin/bash

echo "FTP AL SITIO x"
ftp -inv <<EOT
passive
open ftp.example.com
user [USUARIO] [PASSWORD]
binary
cd Directorio/remoto
put fichero_de_datos.txt
quit
EOT
echo "Fichero enviado"
exit

Algo m�s complicado incluir�a el uso de ficheros de bloqueo (para coordinar
la acci�n con el otro extremo) y el cruce de sumas MD5 para garantizar el
env�o (si puedes utilizar un shell en el otro extremo, le pedir�as a ese
shell que te la calculara en el lado remoto).  Si no son ficheros muchos y
muy grandes, una alternativa m�s que v�lida es utilizar rsync, ya que
garantiza la suma MD5 autom�ticamente (No obstante, yo he tenido problemas
si lo que hay que mover son miles de ficheros por valor de cientos de
gigas).

Tengo por aqu� un ejemplo de unas 150 l�neas (bash shell) que hace un poco
de todo: utilizar lftp para descargar (en este caso es una descarga, no un
env�o) un pu�ado variable de ficheros; como dos ejecuciones sucesivas
podr�an solaparse, tengo que controlar esto; adem�s, una vez en el extremo
local, una parte de los ficheros son transferidos por scp a otra m�quina de
la red local mientras el resto va a parar a un recurso compartido mediante
Samba para que un programa VBasic (con el consiguiente bloqueo para evitar
ejecuciones sucesivas) importaba finalmente estos ficheros en una base de
datos (no me pregunteis por qu� hab�a que hacerlo as�: hab�a que hacerlo).

Por si lo necesitas, el c�digo de control de ejecuciones podr�a ser tal que
as�:

#!/bin/bash

[...]

# CONSIDERACIONES PREVIAS
# Miramos si ya existe otra copia de este script en ejecuci�n
        if [ -f $PIDFILE ]; then
                echo "El script EUROPA PRESS est� en ejecuci�n"
                exit 1
        fi
# Miramos si el programa VBasic est� en ejecuci�n
        if [ -f $VBRUN ]; then
        #...si lo est�, trataremos de pedir turno:
                if [ -f $VBTURNO ]; then
                # esto es un error: el programa VB no puede estar en ejecuci�n y con el
turno pedido!!!
                        echo "�Qu� extra�o! - El programa VB est� en ejecuci�n, pero tambi�n
tiene pedido el turno!!!"
                        exit 2
                elif [ -f $MITURNO ]; then
                # Bueno, ya hemos pedido el turno en una ejecuci�n previa...
                        #DEPURACI�N:    echo "Ya hab�amos pedido el turno antes"
                        exit 3
                fi
        # podemos pedir turno, entonces
                touch $MITURNO
                #DEPURACI�N:    echo "El programa VB estaba en ejecuci�n"
                exit 4
        fi
# Miramos si el programa VBasic ha pedido el turno
        if [ -f $VBTURNO ]; then
        #...lo tiene pedido
                #DEPURACI�N:    echo "El programa VB tiene pedido el turno"
                exit 7
        fi

# TODO CORRECTO: PODEMOS SEGUIR CON LA EJECUCI�N
# Creamos el fichero con nuestro PID y borramos (si existe) nuestro fichero
de turno pedido
        ( echo $$ > $PIDFILE ) && ( $RM -f $MITURNO )

# Comprobamos que el proceso fue satisfactorio
        if [ $$ != `cat $PIDFILE` ]; then
        #...algo raro ha ocurrido
                echo �QU� RARO! Mi PID \($$\) no coincide con el de $PIDFILE \(`cat
$PIDFILE`\)
                exit 5
        elif [ -f $VBRUN ]; then
        # ...ser� que el script y el programa VB han comenzado la ejecuci�n casi
casi a la vez (�?)
                echo "EJECUCI�N ABORTADA - El programa VB ha comenzado a ejecutarse
*despu�s* que nosotros (�?)"
                #...pues borramos nuestro PID y pedimos turno, si es posible
                        $RM -f $PIDFILE
                        if [ ! -f $VBTURNO ]; then
                                touch $MITURNO
                        fi
                exit 6
        fi

...Si tienes m�s ganas de hacerlo en Perl, pue bueno, aqu� va un esqueleto:

#!/usr/local/bin/perl -w
[...]
##################################
# M�DULOS USADOS POR EL PROGRAMA #
##################################
use strict 'subs';      # protege posibles palabras reservadas, ahora o en el
futuro
use English;            # Permite usar variables predefinidas con sus nombres largos
(legibilidad)
use POSIX qw(strftime); # Para formatear la fecha en castellano
use File::Copy;         # Permite copiar/mover ficheros
use Net::FTP;           # Proporciona un cliente simple de FTP
use Archive::Tar;       # Para comprimir los ficheros en el almac�n
[...]
#####################################
# CONTROL DE FLUJO: BUCLE PRINCIPAL #
#####################################

        &inicializar;           # Revisamos que las condiciones de inicio sean correctas        
        
        &traerFTP;              # Trae mediante FTP los nuevos ficheros
        
        &procesarFondos;        # Se encarga de procesar los datos obtenidos
        
        &backup;                # Copia de seguridad de los ficheros obtenidos, si los hay
        
exit 0;

############################
# COMIENZAN LAS SUBRUTINAS #
############################
[...]
# TRAE LOS FICHEROS DEL SERVIDOR MEDIANTE FTP
sub traerFTP
{
local $ftpH;            # El manejador para la sesi�n FTP
local $fichero;         # Cada fichero a traer

        $ftpH=Net::FTP->new(&FTPSERVER, "Passive", 1);
                $ftpH->login(&FTPLOGIN, &FTPPASSWD);
                $ftpH->cwd(&REMOTEDIR);
                $ftpH->type("ascii");
                foreach $fichero (@ficheros)
                {
                        my $resultado=$ftpH->put($fichero, $fichero);
                        if( ! defined $resultado)
                        {
                                print "No se pudo descargar el archivo $fichero\n";
                        }
                }
        $ftpH->quit;
}

(�Qui�n dijo que Perl era "write only"? ;^D )

Vamos, que creo que ya tienes para entretenerte un rato.
-- 
SALUD,
Jes�s
***
jesus_navarro@undominio.net
***
Technical Details
Message-ID: <2gqqo-0vb.ln1@mithrandir.intranet>
Path: arc1-ca.pugleaf.net!archiver1.google.com!news1.google.com!newsfeed.stanford.edu!cyclone.bc.net!news.mailgate.org!newsfeeder.edisontel.com!fu-berlin.de!uni-berlin.de!212.97.191.94!not-for-mail
References: <b9bfim$t91$1@nsnmpen2-gest.nuria.telefonica-data.net>

Show Full Headers
Complete Article Headers
X-Google-Language: SPANISH,ASCII
X-Google-Thread: f86c8,a8f268797652113d
X-Google-Attributes: gidf86c8,public
X-Google-ArrivalTime: 2003-05-08 17:12:16 PST
Path: arc1-ca.pugleaf.net!archiver1.google.com!news1.google.com!newsfeed.stanford.edu!cyclone.bc.net!news.mailgate.org!newsfeeder.edisontel.com!fu-berlin.de!uni-berlin.de!212.97.191.94!not-for-mail
From: Jesús M. NAVARRO <jesus_navarro@undominio.net>
Newsgroups: es.comp.os.linux.programacion
Subject: Re: FTP. Envio de fichero.
Date: Thu, 08 May 2003 22:15:29 +0200
Lines: 203
Message-ID: <2gqqo-0vb.ln1@mithrandir.intranet>
References: <b9bfim$t91$1@nsnmpen2-gest.nuria.telefonica-data.net>
NNTP-Posting-Host: 212.97.191.94
Mime-Version: 1.0
Content-Type: text/plain; charset=iso-8859-15
Content-Transfer-Encoding: 8Bit
X-Trace: fu-berlin.de 1052439134 18800532 212.97.191.94 (16 [173178])
X-Orig-Path: mithrandir.intranet!news
User-Agent: KNode/0.7.2