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

Modules Perl Discussion :

Etre averti du dépôt d'un fichier sur mon FTP ? avec Perl ?


Sujet :

Modules Perl

  1. #1
    Nouveau membre du Club
    Inscrit en
    Août 2005
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 47
    Points : 28
    Points
    28
    Par défaut Etre averti du dépôt d'un fichier sur mon FTP ? avec Perl ?
    Bonsoir à tous,

    je cherche à pouvoir être averti par mail lorsqu'un fichier est déposé sur mon FTP ? L'upload ne se fait pas via un formulaire mais grâce à un client .

    Je voudrai pouvoir recevoir un email à chaque nouveau dépôt de fichier .

    Quelq'un a t'il une solution a proposer ? Script perl ? ....

    merci,
    panaone

  2. #2
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Ton FTP est-il en local ? As-tu accès au log du serveur ?

    --
    Jedaï

  3. #3
    Nouveau membre du Club
    Inscrit en
    Août 2005
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 47
    Points : 28
    Points
    28
    Par défaut
    oui il sera en local et j'aurai accès au log.

    En faite je ne l'ai pas encore ouvert j'attends que quelqu'un me propose une solution : je peux utiliser IIS ou autres ... mais il faut que je puisse être prévenu lors de l'upload d'un fichier et j'aimerai de surcroit utiliser perl pour réaliser un script dans ce sens ?

    c'est pour un usage pro !

    merci,
    panaone

  4. #4
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    A priori, le daemon ftpd (ou autre serveur FTP) va inscrire les transfert de fichier dans son log, il te suffit donc de coupler File::Tail avec quelques regexs pour faire ce que tu veux très simplement (quelques dizaines de lignes au plus, tout dépend de la complexité du parsing du log) et très efficacement.
    (Et Net::SMTP pour l'envoi de mail, à moins que tu ne préfères une alternative plus compliquée et friendly)

    --
    Jedaï

  5. #5
    Nouveau membre du Club
    Inscrit en
    Août 2005
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 47
    Points : 28
    Points
    28
    Par défaut
    merci Jedaï,

    je suis un partisan du "fait simple ce qui peut être fait simplement" alors je vais décortiquer tes conseils ... et je te tiens au courant car à mon avis je vais un peu galérer ...

    Déja j'ai une question du genre le log va être de ce type par exemple :


    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
     
     
    #Software: Microsoft Internet Information Services 5.1
    #Version: 1.0
    #Date: 2005-08-26 21:37:56
    #Fields: time c-ip cs-method cs-uri-stem sc-status 
    21:37:56 127.0.0.1 [1]closed - 426
    21:37:56 127.0.0.1 [2]closed - 426
    #Software: Microsoft Internet Information Services 5.1
    #Version: 1.0
    #Date: 2005-08-26 21:38:54
    #Fields: time c-ip cs-method cs-uri-stem sc-status 
    21:38:54 127.0.0.1 [3]USER anonymous 331
    21:38:54 127.0.0.1 [3]PASS user@anonymous.com 230
    21:38:54 127.0.0.1 [3]sent /INPUT/files_test1.pl 550
    21:38:54 127.0.0.1 [3]created files_test1.pl  226
    21:42:33 127.0.0.1 [3]sent /INPUT/files_test2.pl  550
    21:42:33 127.0.0.1 [3]created files_test2.pl.pl 226

    Comment je peux arriver a définir que je veux être informer à chaque nouveaux fichiers ? je dois stocker qqpart l'antériorité ? ou apposer un tag dans le fichier de log pour chaque fichier me permettant ainsi de ne récupérer que les nouveaux ?


    merci,
    panaone

  6. #6
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    21:38:54 127.0.0.1 [3]sent /INPUT/files_test1.pl 550
    21:38:54 127.0.0.1 [3]created files_test1.pl  226
    21:42:33 127.0.0.1 [3]sent /INPUT/files_test2.pl  550
    21:42:33 127.0.0.1 [3]created files_test2.pl.pl 226
    A priori là tu as deux création de fichiers, as-tu la même chose lorsque le fichier existe préalablement ? Veux tu envoyer un mail à chaque fois qu'on crée un nouveau fichier, à chaque fois qu'on en met un à jour ? Je pense que le log te permet de différencier tous ces cas, il suffit ensuite de le parser puis d'envoyer un résumé par mail.

    --
    Jedaï

  7. #7
    Nouveau membre du Club
    Inscrit en
    Août 2005
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 47
    Points : 28
    Points
    28
    Par défaut
    Je veux recevoir le mail à chaque création, je n'aurai que des créations ! peux tu juste me mettre sur la voie avec File::Tail ? pour ce qui est du mail no prob mais je vois pas trop comment partir avec File::Tail pour ne récupérer que les nouvelles création de fichiers ??

    en tout cas ce module semble corresponde exactement à ce que je souhaite faire !

    merci,
    panaone

  8. #8
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Citation Envoyé par panaone
    Je veux recevoir le mail à chaque création, je n'aurai que des créations ! (...) ne récupérer que les nouvelles création de fichiers ??
    D'un côté tu me dis que tu n'auras que des créations de fichiers, de l'autre tu me demandes comment ne récupérer que les créations de nouveaux fichiers ?
    Je ne comprends pas exactement... Explique toi plus clairement et si tu veux que je t'aide il faut que j'ai des échantillons du log avec la plupart des opération de transfert (à partir du serveur, vers le serveur, création, mise à jour, etc...).

    --
    Jedaï

  9. #9
    Nouveau membre du Club
    Inscrit en
    Août 2005
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 47
    Points : 28
    Points
    28
    Par défaut
    Desolé Jedaï,

    je m'exprime mal ! en faite lorsque je parle de créatin c'est à cause du log qui écrit "Created" mais en faite pour être plus clair je veux être averti à chaque fois qu'un User "sent" un fichier. Le log ensuite va être renseigné par "created", mais il n'y aura aucune création de ma part sur l'espace FTP.

    Pour le log il sera toujours pareil :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
    21:38:54 127.0.0.1 [3]sent /INPUT/files_test1.pl 550 
    21:38:54 127.0.0.1 [3]created files_test1.pl  226 
    21:42:33 127.0.0.1 [3]sent /INPUT/files_test2.pl  550 
    21:42:33 127.0.0.1 [3]created files_test2.pl.pl 226


    merci,
    panaone

  10. #10
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    A priori, un script simple pour faire ça serait :
    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
     
    #! /usr/bin/perl
    use strict; use warnings;
     
    ############################################################################
    #~ Import des modules
    ############################################################################
    use File::Tail;
    use Net::SMTP;
     
     
    ############################################################################
    #~ Configuration du script
    ############################################################################
    use constant {
      LOG_PATH => '/mon/log/de/ftpd',
      SMTP_SERVER => 'smtp.mon_serveur_a_moi.com',
      EMAIL => 'mon_adresse@mon_serveur.com',
      MAX_INTERVAL_BETWEEN_CHECK => 40,
    };
    $| = 1;
     
     
    ############################################################################
    #~ Fonctions
    ############################################################################
    {
      my $smtp = Net::SMTP->new(SMTP_SERVER);
      $smtp->quit();
     
      sub send_report {
        my $hour = shift;
        my $ip = shift;
        my $file = shift;
        $smtp->hello();
     
        $smtp->mail(EMAIL);
        $smtp->to(EMAIL);
     
        $smtp->data();
        $smtp->datasend("To: ".EMAIL."\n");
        $smtp->datasend("From: ".EMAIL."\n");
        $smtp->datasend("Subject: Report file upload\n");
        $smtp->datasend("\n");
        $smtp->datasend("The file $file was uploaded on your FTP at $hour by $ip.\n");
        $smtp->dataend();
     
        $smtp->quit;
      }
    }
     
     
    ############################################################################
    #~ Main
    ############################################################################
    my $tail = File::Tail->new(name => LOG_PATH, maxinterval => MAX_INTERVAL_BETWEEN_CHECK, interval => 10);
     
    while( defined(my $line = $tail->read()) ){
      send_report( $1, $2, $3 ) 
        if $line =~ m/^(\d\d:\d\d:\d\d)\s+(\d{1,3}\.\d{1,3}\.\d{1,3}).+?sent\s+(.+)\s+\d+$/;
    }
     
    __END__
    A toi de vérifier qu'il marche !

    --
    Jedaï

  11. #11
    Nouveau membre du Club
    Inscrit en
    Août 2005
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 47
    Points : 28
    Points
    28
    Par défaut
    Merci Jedaï !

    je teste ce soir et je te tiens au courant !

    panaone

  12. #12
    Nouveau membre du Club
    Inscrit en
    Août 2005
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 47
    Points : 28
    Points
    28
    Par défaut
    Salut Jedaï,

    le script ne marche pas ? rien ne se passe même si je simule des ajouts de fichiers ?

    Comment je peux tester chaque paramètre ? je me demande si les modules Net::Mail et File::Tail sont bien installés ?


    Merci pour ton aide,
    panaone

  13. #13
    Expert confirmé
    Avatar de GLDavid
    Homme Profil pro
    Service Delivery Manager
    Inscrit en
    Janvier 2003
    Messages
    2 852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Service Delivery Manager
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 852
    Points : 4 759
    Points
    4 759
    Par défaut
    Salut

    Si tu as des erreurs, alors quelles sont ces erreurs ?

    @++
    GLDavid
    Consultez la FAQ Perl ainsi que mes cours de Perl.
    N'oubliez pas les balises code ni le tag

    Je ne répond à aucune question technique par MP.

  14. #14
    Nouveau membre du Club
    Inscrit en
    Août 2005
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 47
    Points : 28
    Points
    28
    Par défaut
    Je n'ai aucune erreur mais rien ne se passe : pas d'envoi de mail lors de l'insertion d'un fichier sur le FTP ? donc je voudrais tester pas à pas le script nottament l'envoi d'un mail via mon serveur smtp avec Perl ?

    merci,
    panaone

  15. #15
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Il n'a pas d'erreur... Désolé, c'était une petite erreur de ma part dans ma compréhension de Net::SMTP : j'ai assumé qu'il recréerai tout seul la connexion si je lui faisais faire un hello() après un quit(), mais ce n'est pas le cas , voici donc une version qui marche parfaitement elle (j'ai testé !) :
    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
     
    #! /usr/bin/perl
    use strict; use warnings;
     
    ############################################################################
    #~ Import des modules
    ############################################################################
    use File::Tail;
    use Net::SMTP;
     
     
    ############################################################################
    #~ Configuration du script
    ############################################################################
    use constant {
      LOG_PATH => '/mon/log/de/ftpd',
      SMTP_SERVER => 'smtp.mon_serveur_a_moi.com',
      EMAIL => 'mon_adresse@mon_serveur.com',
      MAX_INTERVAL_BETWEEN_CHECK => 40,
    };
    $| = 1;
     
     
    ############################################################################
    #~ Fonctions
    ############################################################################
    sub send_report {
      my $hour = shift;
      my $ip = shift;
      my $file = shift;
      my $smtp = Net::SMTP->new(SMTP_SERVER);
     
      $smtp->mail(EMAIL);
      $smtp->to(EMAIL);
     
      $smtp->data();
      $smtp->datasend("To: ".EMAIL."\n");
      $smtp->datasend("From: ".EMAIL."\n");
      $smtp->datasend("Subject: Report file upload\n");
      $smtp->datasend("\n");
      $smtp->datasend("The file $file was uploaded on your FTP at $hour by $ip.\n");
      $smtp->dataend();
     
      $smtp->quit;
    }
     
     
    ############################################################################
    #~ Main
    ############################################################################
    my $tail = File::Tail->new(name => LOG_PATH, maxinterval => MAX_INTERVAL_BETWEEN_CHECK, interval => 10);
     
    while( defined(my $line = $tail->read()) ){
      send_report( $1, $2, $3 ) 
        if $line =~ m/^(\d\d?:\d\d?:\d\d?)\s+(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}).+?sent\s+(.+)\s+\d+$/;
    }
     
    __END__
    Bonne continuation.

    --
    Jedaï

  16. #16
    Nouveau membre du Club
    Inscrit en
    Août 2005
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 47
    Points : 28
    Points
    28
    Par défaut
    encore et toujours merci Jedaï !

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 18/05/2011, 20h06
  2. Réponses: 1
    Dernier message: 14/12/2006, 23h06
  3. Déposer un fichier sur un ftp
    Par sebclick dans le forum C
    Réponses: 2
    Dernier message: 19/01/2006, 16h26
  4. Upload de fichiers sur un ftp
    Par Crazyblinkgirl dans le forum ASP
    Réponses: 10
    Dernier message: 20/06/2004, 11h55
  5. [] [Réseau] Transfert fichier sur un FTP
    Par CYFL dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 26/02/2003, 17h33

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