IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Réseau/Web Python Discussion :

Telnet et FTP


Sujet :

Réseau/Web Python

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Telnet et FTP
    Bonjour ,
    dans le cadre de mon travail je dois effectuer des transfert de fichier assez gros (entre 25 et 80 mo) vers un serveur FTP via une ligne RNIS.

    Le problème est que cette ligne est assez mauvaise et à la fin du 1ere transfert je n'ai pas de réponse du serveur.

    Pour cela, j'ai concu un programme python que je n'ai pas encore testé mais j'aimerai avoir l'avis de personne plus expirementé que moi en python ou pourriez vous m'orienter pour que le programme detecte les pertes de liaisons avec le serveur ?
    Il faut savoir que la class GDDFTP herite d'une autre classe concu par un de mes collègues.
    Merci d'avance pour votre aide
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
     
    #!/usr/bin/python2
    # -*- coding: iso_8859-1 -*-
     
    import sys
    import os
    import telnetlib
    import timedFtp as ftplib
    import getopt
    import traceback
    import signal
    import re
    import getpass
    from Singleton import Singleton
     
    class TransfertError(Exception): pass
    class SizeError(TransfertError) : pass
    class TimeoutError(TransfertError) : pass
     
    def handleTimeOut(signum, frame):
        raise TimeoutError
     
    class GDDFTP(ftplib.FTP):
      def __init__(self, adresse, user, password):
        ftplib.FTP.__init__(self, adresse, user, password)
        self.user = user
        self.password = password
     
      def Reconnect(self):
        self.connect(self.host)
        self.login(self.user, self.password)
     
      def sendcmd(self, cmd):
        try: return ftplib.FTP.sendcmd(self, cmd)
        except:
            self.Reconnect()
            return ftplib.FTP.sendcmd(self, cmd)
     
     
    class paramEnvoi(Singleton):
     
      server = "toto"
      user = "titi"
      psswd = "grosminet"
      verbose = False
      rdir = None
      log = None
      command = sys.argv[0]
      files = None
      timeout = None
     
      stdout = sys.stdout
      stderr = sys.stderr
     
      options = {
            "server=" : ("host", "Le serveur sur lequel se connecter"),
            "user=" : ("user", "Utilisateur distant"),
            "passwd=" : ("passwd", "Mot de passe pour l'utilisateur"),
            "rdir=" : ("rep","Le repertoire distant"),
            "log=" : ("file", "Le fichier de log. Pour l'instant inactif"),
            "verbose" : ("", "Affiche les messages de transfert."),
            "help" : ("", "Affiche ce message d'aide"),
            "timeout=" : ("delai", "delai max. d'attente de transmission de données")
            }
     
      usage1 = "%s [options] file..." % command
      usage2 = "Utilisez %s --help pour obtenir de plus amples imformations" % command
     
      longhelp = """Programme de transfert securisé du mieux possible
    Utilisation : %s [options] fichier1 (fichier2....]
     
    Les options sont :"""
     
      diagnostics = ""
     
      def __init__(self) :
         self.parseOpts(sys.argv[1:])
     
      def printUsage(self):
            print >> sys.stderr, self.usage1
            print >> sys.stderr, self.usage2
            sys.exit(1)
     
      def parseOpts(self, args) :
     
            excpt = None
            try:
                (opts, ar) = getopt.getopt(args, "", self.options.keys())
            except getopt.GetoptError, e :
                # Ce n'est pas fatal si on a --help....
                excpt = e
                if "--help" in args :
                    opts = ['--help']
                else :
                    print >> sys.stderr, excpt
                    self.printUsage()
     
            # On tente de recuperer les differentes options
            for i in opts :
                if i[0] == "--help" :
                    # Affiche l'aide, termine normalement
                    self.help()
                    sys.exit(0)
                elif i[0] == "--server" :
                    self.server = i[1]
                elif i[0] == "--user" :
                    self.user = i[1]
                elif i[0] == "--passwd" :
                    self.psswd = i[1]
                elif i[0] == "--log" :
                    self.log = i[1]
                elif i[0] == "--rdir" :
                    self.rdir = i[1]
                elif i[0] == "--verbose" :
                    self.verbose = True
                elif i[0] == "--timeout" :
                    print "Here"
                    self.timeout = int(i[1])
                else:
                    raise ValueError(i)
                    # Never get there
                    pass
            if len(ar) < 1 :
                print >> sys.stderr, "Vous devez specifier au moins un argument"
                self.printUsage()
            else :
                self.files = ar
     
      def help(self) :
            print self.usage1
            print self.longhelp
            for i in self.options.items() :
                if i[1][0] :
                    opt = i[0] + "<" + i[1][0] + ">"
                else :
                    opt = i[0]
                print "  --" + opt + " : " + i[1][1]
     
            print self.diagnostics
     
     
    def sendFile(fname) :
        param  = paramEnvoi()
     
        ## FIXME enlever la restriction
        if fname.find("/") >= 0:
            raise ValueError("Le nom du fichier ne doit pas contenir de '/'")
        size = os.stat(fname).st_size
        f = file(fname)
     
        # Determination du nom du fichier temporaire : on doit prendre en compte l'"extension" .tgz
        if fname.endswith(".tgz") :
            tmpfile = re.sub("\.tgz", ".tmp", fname)
        else :
            (base, ext) = os.path.splitext(fname)
            tmpfile = base + ".tmp"
        try:
            #Connexion
     
     
            ftp = GDDFTP(param.server, param.user, param.psswd)
     
            if param.timeout :
                ftp.set_timeout(param.timeout)
            if param.verbose :
                ftp.set_debuglevel(3)
            if param.rdir :
                ftp.cwd(param.rdir)
            # Envoi
            # On convertit un alarm clock en exception
            signal.signal(signal.SIGALRM, handleTimeOut)
    #        print "************************************* ici *************************************"
            rep = ftp.storbinary("STOR " + tmpfile, f)
            if rep != "226 Transfer complete." :
                raise TransfertError("Probleme lors du transfert : " + rep)
            # Controle de la taille
            for i in range(3) :
                try:
                    st = ftp.size(tmpfile)
                    break
                except ftplib.error_perm, e:
                    raise SizeError(str(e))
                except TimeoutError :
                    print "Time out sur le controle de la taille"
            else :
                raise TimeoutError("On n'a pas reussi a determiner la taille")
            if st != size  :
                raise TransfertError("Tailles differentes")
            # Nommage definitif du fichier
            for i in range(3):
                try:
                    ftp.rename(tmpfile, fname)
                    break
                except TimeoutError :
                    print "Timeout lors du move"
            else :
                raise TimeoutError("On n'a pas reussi a faire le move")
        finally:
            f.close()
            # On ne veut pas des exceptions qui seraient renvoyees ici
            # Utile en cas de pepin de connection
            try:
     
     
                ftp.quit()
                ftp.close()
            except :
                pass
     
     
    def main() :
     
        param= paramEnvoi()
        if param.log :
            l = file(param.log, 'w')
            sys.stdout = l
            sys.stderr = l
     
        for i in param.files :
            try:
                sendFile(i)
            except SizeError :
                print >> param.stderr, "Attention: impossible de determiner la taille de", i
                print >> param.stderr, "Abandon. Le fichier %s a du etre transfere correctement." % i
                traceback.print_exc()
                sys.exit(3)
     
            except :
                print >> param.stderr, "Erreur lors du transfert de", i
                print >> param.stderr, "Abandon"
                traceback.print_exc()
                sys.exit(2)
     
     
    if __name__ == "__main__" :
        main()

  2. #2
    Membre éclairé
    Avatar de parp1
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    829
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Mai 2005
    Messages : 829
    Points : 872
    Points
    872
    Par défaut
    Euh Si tu utilisais les SOCKET pour ecouter ta ligne?

    Dans ce post, j'ai essayer de mettre au point un systeme pour rebooter mon routeur qui doit etre rebooter parce que ma ligne est suceptible.

    LA partie de test de la ligne fonctionne c'est juste pour me loguer sur la page de mon routeur qui me demande login et pass qui merdouille. C'est dommage. Voila

    Bon ba toi au lieu d'ecouter Google tu essaie de te connecter a ton FTP.
    [SIZE="2"]Dis moi qui tu suis, je te dirais qui je Hais!
    Heureux est l'étudiant, qui comme la rivière suit son cours sans sortir de son lit

    Mon premier Tutoriel


    A 80% des cas je résouts mon problème en rédigeant une nouvelle discussion, du coup je ne poste que 20% de mes problèmes...

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Ok !
    je vais essayer d'ecouter les Sockets !
    je te tiendrai au courant
    et encore merci du tuyau

  4. #4
    Membre expérimenté Avatar de pacificator
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 074
    Points : 1 728
    Points
    1 728
    Par défaut
    Salut, sur cette page, j'ai trouvé ça:
    STATUS (STAT)
    STATUT

    Cette commande provoque l'envoi d'un message d'état (statut) de réponse sur le canal de contrôle. Cette commande peut être utilisée en cours de transfert (avec les signaux IP et Synch de Telnet - voir la Section traitant des commandes FTP) auquel cas le serveur doit répondre avec l'état de la transaction en cours, ou bine elle peut être envoyée entre deux transferts. Dans ce dernier cas, la commande devra être utilisée avec un argument. Si cet argument est un chemin d'accès, la commande résultante équivaut à une commande "list" à l'exception près que la réponse sera transmise par le canal de connexion au lieu du canal de données. Si un chemin partiel est donné, Le serveur répondra par une liste de noms de fichiers ou d'attributs associés à cette spécification. Si aucun argument n'est donné, le serveur renverra une information générale concernant le processus serveur FTP. Ceci pourra inclure l'ensemble des paramètres de connexion actuellement utilisé ainsi que l'état de toutes les connexions.
    NOOP (NOOP)
    PAS D'ACTION

    Cette commande n'affecte aucun paramètre ni n'interagit avec aucune des commandes précédemment lancées. Elle provoque aucune autre action qu'une simple réponse "OK" de la part du serveur.
    En esperant que cela puisse te servir.
    "Etre conscient de la difficulté permet de l'éviter.."
    Lao-Tseu.

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Merci !
    Justement je pensais envoyé une requete en cours de traitement en utilisant un thread (plus précisement un timer) pour eviter que le serveur tombe en timeout (qui est de 900 sec) alors que mes transferts durent entre 45 min et 1h

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Debutant : Programme transfert ftp et execution telnet
    Par funkysoulfunk dans le forum Windows
    Réponses: 0
    Dernier message: 04/08/2008, 17h49
  2. Vista FTP et Telnet
    Par Webmann dans le forum Windows Vista
    Réponses: 2
    Dernier message: 12/11/2007, 16h15
  3. proxy http (s?)+ ftp autorisé, comment utiliser telnet ou ssh?
    Par TabrisLeFol dans le forum Applications
    Réponses: 7
    Dernier message: 12/07/2006, 14h58
  4. telnet et ftp sans modules Net::Telnet et Net::Ftp
    Par jmarclacroix dans le forum Modules
    Réponses: 2
    Dernier message: 05/05/2006, 20h14
  5. configuration telnet/ftp
    Par peppena dans le forum Serveurs (Apache, IIS,...)
    Réponses: 1
    Dernier message: 13/04/2006, 14h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo