Probleme perl Net::FTPSSL

[Fermé]
Signaler
Messages postés
1521
Date d'inscription
mardi 14 août 2007
Statut
Membre
Dernière intervention
3 avril 2010
-
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
-
Bonjour,

Voila je suis entrain de réaliser un petit progrmamme qui remplace filezilla pour des gens pas doué en informatique bref.
J'ai réalisé cette application en perl tk objet.

Voila je n'arrive pas a envoyé le fichier précédemment sélectionné je vosu met le code pour que vous puissiez m'aider je suis conscient qu'il y a beaucoup a regarder mais c'est important pour moi car c'est pour passer mon BTS mardi svp aidez moi merci d'avance

Donc le fichier Interface.pl

#!/usr/bin/perl
use strict;
use Tk;
use warnings; 
use Tk::Photo;
use Tk::PNG;

use Transferts;

#Création de la fenêtre principale
my $fenetre = MainWindow->new();

#Définition de la taille min de la fenêtre
$fenetre->minsize('500','300');

#Définition du title de la fenêtre
$fenetre->title("Islo People");

#Création de la barre de menu
my $barre_menu = $fenetre->Frame(-relief => 'groove' , -borderwidth => 2);

#Création de la barre du menu général
my $menu_gen = $barre_menu->Menubutton(
                                     -text => 'Menu' ,
                                     -font => '{Garamond} 10',
                                     -tearoff => 0 ,
                                     -menuitems => [
                                                     [ 'command' => 'Quitter' ,
                                                       -font => '{Garamond} 10',
                                                       -command => \&Quitter
                                                     ]
                                                   ]
                                   );

#  Création d'un cadre
    my $frame1 = $fenetre->Frame()->pack(-side => "bottom",-padx => 0, -pady => 0);

#Affichage du menu général à gauche
$menu_gen->pack(-side => 'left');

#Affichage de la barre de menu en haut de la fenêtre
$barre_menu->pack(-side => 'top', -anchor => 'n', -fill => 'x');

my $ObjImage = $fenetre->Photo( -format => "png", -file => "/home/seb/Desktop/Islo_people/logo.png" );
my $bouton2 = $fenetre -> Button 	(
    				-image => $ObjImage
				)->pack();
				
#parcourir
$frame1 ->Button ( -text => 'Parcourir' ,
                   -command => \&Chemin
            	 ) ->pack () ;

sub new
{
	my $t=new transferts;
	$t->transfert(my $chemin);
}

   	
# Envoyer
$frame1 ->Button 	(
					-text => 'Envoyer' ,
					-command =>sub{Transferts::Transfert()}
					)
					->pack(); 

 #my $status_var =0;
 
    #$frame1->ProgressBar(
     #            -borderwidth => 10,
     #            -relief => 'sunken',
     #            -width => 35,
      #           -length => 500,
      #           -padx => 0,
      #           -pady => 0,
      #           -variable => \$status_var,
     #            -colors => [0, 'green'],
     #            -resolution => 0,
      #           -blocks => 50,
      #           -anchor => 'w',
      #           -from =>'0',
      #           -to => '100'
      #          )->pack(
      #                  -padx => 10,
      #                  -pady => 10,
      ##                  -fill => 'both'
      #                 );

    # La boucle dans laquelle la variable de ProgressBar change

    #for (my $lostime = 0 ; $lostime < 101 ; $lostime += 5)
    #{
    #    sleep 1 ;
    #    $status_var=$lostime ;

        # l'instruction suivante permet la prise en compte
        # des changements de valeurs de $status_var dans Perl/Tk,
        # ici  le widget Progressbar

     #   $fenetre->update;
   # }

   # sleep 5;
   #print "Fin de l'exemple update \n";
   # $fenetre->destroy;

#Création de notre barre de statut à l'aide d'un Label
#my $barre_statut = $fenetre->Label(-relief => 'groove', -text => "Islo people", -font => '{Garamond} 10');

#On l'ajoute en bas de la fenêtre afin de lui donner l'effet barre de statut
#$barre_statut->pack( -side => 'bottom', -fill => 'both');

#Définition de la fonction de fermeture de l'application
sub Quitter 
{
    exit(0);
}

sub Chemin()
{
my $chemin = $fenetre -> getOpenFile ( -initialdir => '/home') ;  
return $chemin;
}

MainLoop;


Le fichier Transferts.pm

#!/usr/bin/perl

use strict;
use warnings;
use Net::FTPSSL;

use Connexion;

package Transferts;

my $photo;
my $connexion;
my $conn;

sub new
{
	#$_[0] etant le premier parametre lors de l'appel de la fonction
	my $picture=$_[0];
	
	$photo = $picture;
	$conn = new ConnectionFTP();
	$connexion = $conn -> ConnectionFTP();
}

sub Transfert()
{
	my $verify;
	my $ftps;
	
	$conn = Connexion::ConnectionFTP();
	$verify = VerifierExtension();
	 
	if($verify == "Connecté")
	{
		$ftps->put($_[0]); 
	}
	else
	{
		print "Mauvaise extension\nAutorise : jpeg, raw\n";
	}
}

sub VerifierExtension()
{
	my $TonFichier = $_[0]; 
 	my $extension = "correct";
 	
# Verification de l'extension
unless ( -e $TonFichier and $TonFichier =~ m{(?:jpe?g|raw)$} ) 
		{
  		die($extension = "incorrect");
		}
	return $extension;
}

1;


le fichier Connexion.pm

#!/usr/bin/perl
use strict;
use warnings;
use Net::FTPSSL;

package Connexion;

# $file correspond au fichier de configuration du FTP
my $file = '/home/seb/workspace/Islo_People/Configuration';
my $user;
my $mdp;
my $server;
my $port;

# Constructeur
sub new
{
	my @parametre = Recherche_parametre();
	$user = $parametre[0];
	$mdp = $parametre[1];
	$server = $parametre[2];
	$port = $parametre[3];
}

# Fonction qui parcours le fichier de configuration et qui les retournent
sub Recherche_parametre()
{
	#Déclaration des variables
	my $lignes;
	my @config;
	my @parametre;

	#Ouverture du fichier de configuration
	open(CONF, "<".$file);
	# $lignes prend la valeur du fichier de configuration
	while(defined($lignes = <CONF>))
	{
			#Séparation des attributs de $lignes 
			@config = split("=", $lignes);
			
			if($config[0] == 'user')
			{
				# Si la première valeur du tableau config est égale 
				#à user alors $user prend la valeur de la deuxième valeur du tableau
				$user=$config[1];
			}
			if($config[2] == 'mdp')
			{
				$mdp=$config[3];
			}
			if($config[4] == 'server') 
			{
				$server=$config[5];
			}
			if($config[6] == 'port')
			{
				$port=$config[7];
			}
		#Construction du tableau parametre avec les valeurs nécessaires à la connection du FTP
		@parametre=($user,$mdp,$server,$port);
	}
	#Fermeture du fichier
	close(CONF);
	
	#On retourne le tableau
	return @parametre;
}

# Fonction Connection qui retourne la valeur de l'état de la connection au FTP
sub ConnectionFTP
{
	# Initialisation de $etat à vrai
	my $etat = "vrai";
	#my $parametre = Recherche_parametre();
	#$user = $parametre[0];
	#$mdp = $parametre[1];
	#$server = $parametre[2];
	
	
	#Connection au FTP
	my $ftps = Net::FTPSSL->new($server,
								Port=> $port,
								Debug => 1)
			or $etat = "faux"; # Si la connection n'est pas effectué $etat prend la valeur faux
	
	$ftps->	login('$user', '$mdp')
		or $etat = "faux"; # Si la connection n'est pas effectué $etat prend la valeur faux
		
	# On retourne $etat
	return $etat;
}

# Fonction Connection au FTP
sub VerifierConnection
{
	my $connexion = ConnectionFTP();
	
	if($connexion == 'vrai')
	{
		$connexion = "Connecté";
	}
	else
	{
		$connexion = "Non Connecté";
	}
	
	return $connexion;		
}
1;


et le fichier de configuration

user=photographe
mdp=passe
server=10.0.2.69
port=21


Voila donc je t'explique le problème il s'avère que comme tu peut le voir je tente de mettre un fichier sur un ftp.
Hélas l'envoi ne fonctionne pas et je ne comprend pas pourquoi ca me met une erreur a la ligne

$ftps->	login('$user', '$mdp')

de Connexion.pm

Et voici l'erreur

<<+ 555 Host undefined
Tk::Error: Can't call method "login" on an undefined value at /home/seb/workspace/Islo_People/Connexion.pm line 86.
Tk callback for .frame1.button1
Tk::__ANON__ at /usr/lib/perl5/Tk.pm line 250
Tk::Button::butUp at /usr/lib/perl5/Tk/Button.pm line 175
<ButtonRelease-1>
(command bound to event)

Donc voila je sais que c'est un peu lourd a regardez mais tu ma demandé de bien situé le problème voila qu'y est fait je pense

Aide moi stp je suis vraiment bloqué stp

merci d'avance

3 réponses

Messages postés
1521
Date d'inscription
mardi 14 août 2007
Statut
Membre
Dernière intervention
3 avril 2010
22
up svp
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 560
Salut,

mais tu ma demandé de bien situé le problème voila qu'y est fait je pense
Je ne sais pas à qui tu t'adresses mais je vais essayer de te répondre.

En fait c'est la lecture de ton fichier de configuration qui n'est pas bon.
J'ai extrait juste la partie en question pour te montrer les erreurs

Voici la partie en question (j'ai supprimer le reste de fichier pour te montrer le test que j'ai fait)
J'ai testé sur le fichier de config
lami20j@debian:~/trash/ccm_perl/drogba7213$ cat Configuration
user=lami20j
mdp=a
server=10.0.0.3
port=21

Donc le code que j'ai testé
lami20j@debian:~/trash/ccm_perl/drogba7213$ cat Connexion2.pm
#!/usr/bin/perl
use strict;
use warnings;

# $file correspond au fichier de configuration du FTP
my $file = '/home/lami20j/trash/ccm_perl/drogba7213/Configuration';
my $user;
my $mdp;
my $server;
my $port;

# Constructeur

        my @parametre = &Recherche_parametre();
        $user = $parametre[0];
        $mdp = $parametre[1];
        $server = $parametre[2];
        $port = $parametre[3];

print "@parametre\n";

# Fonction qui parcours le fichier de configuration et qui les retournent
sub Recherche_parametre()
{
        #Déclaration des variables
        my $lignes;
        my @config;
        my @parametre;

        #Ouverture du fichier de configuration
        open CONF, "$file" or die "E/S : $!\n";
        # $lignes prend la valeur du fichier de configuration
        while(defined($lignes = <CONF>))
        {
                        #Séparation des attributs de $lignes
                        @config = split("=", $lignes);

                        if($config[0] == 'user')
                        {
                                # Si la première valeur du tableau config est égale
                                #à user alors $user prend la valeur de la deuxième valeur du tableau
                                $user=$config[1];
                        }
                        if($config[2] == 'mdp')
                        {
                                $mdp=$config[3];
                        }
                        if($config[4] == 'server')
                        {
                                $server=$config[5];
                        }
                        if($config[6] == 'port')
                        {
                                $port=$config[7];
                        }
                #Construction du tableau parametre avec les valeurs nécessaires à la connection du FTP
                @parametre=($user,$mdp,$server,$port);
        }
        #Fermeture du fichier
        close(CONF);

        #On retourne le tableau
        return @parametre;
}
__END__

Et voici le résultat
lami20j@debian:~/trash/ccm_perl/drogba7213$ perl Connexion2.pm
Argument "user" isn't numeric in numeric eq (==) at Connexion2.pm line 38, <CONF> line 1.
Argument "user" isn't numeric in numeric eq (==) at Connexion2.pm line 38, <CONF> line 1.
Argument "mdp" isn't numeric in numeric eq (==) at Connexion2.pm line 44, <CONF> line 1.
Use of uninitialized value $config[2] in numeric eq (==) at Connexion2.pm line 44, <CONF> line 1.
Argument "server" isn't numeric in numeric eq (==) at Connexion2.pm line 48, <CONF> line 1.
Use of uninitialized value $config[4] in numeric eq (==) at Connexion2.pm line 48, <CONF> line 1.
Argument "port" isn't numeric in numeric eq (==) at Connexion2.pm line 52, <CONF> line 1.
Use of uninitialized value $config[6] in numeric eq (==) at Connexion2.pm line 52, <CONF> line 1.
Argument "mdp" isn't numeric in numeric eq (==) at Connexion2.pm line 38, <CONF> line 2.
Use of uninitialized value $config[2] in numeric eq (==) at Connexion2.pm line 44, <CONF> line 2.
Use of uninitialized value $config[4] in numeric eq (==) at Connexion2.pm line 48, <CONF> line 2.
Use of uninitialized value $config[6] in numeric eq (==) at Connexion2.pm line 52, <CONF> line 2.
Argument "server" isn't numeric in numeric eq (==) at Connexion2.pm line 38, <CONF> line 3.
Use of uninitialized value $config[2] in numeric eq (==) at Connexion2.pm line 44, <CONF> line 3.
Use of uninitialized value $config[4] in numeric eq (==) at Connexion2.pm line 48, <CONF> line 3.
Use of uninitialized value $config[6] in numeric eq (==) at Connexion2.pm line 52, <CONF> line 3.
Argument "port" isn't numeric in numeric eq (==) at Connexion2.pm line 38, <CONF> line 4.
Use of uninitialized value $config[2] in numeric eq (==) at Connexion2.pm line 44, <CONF> line 4.
Use of uninitialized value $config[4] in numeric eq (==) at Connexion2.pm line 48, <CONF> line 4.
Use of uninitialized value $config[6] in numeric eq (==) at Connexion2.pm line 52, <CONF> line 4.
Use of uninitialized value $parametre[1] in join or string at Connexion2.pm line 20.
Use of uninitialized value $parametre[2] in join or string at Connexion2.pm line 20.
Use of uninitialized value $parametre[3] in join or string at Connexion2.pm line 20.
21


En fait @config ne contiendra jamais tous les éléments.
A chaque lecture de $lignes le tableau est vidé.
Bref il contiendra toujours seulement deux éléments.

Pour ne pas dire que == est l'opérateur d'égalité numérique.
Pour les chaînes c'est eq
Mais ça n'a pas trop d'importance vu que ton tableau est mal rempli.

Bref, quand tu essaie la connexion, comme $user,$mdp, etc. ne contiennent rien, c'est normal que tu as erreur de connexion.

Le message suivant je vais te donner une version que tu dois adapter à ton code.

Si je peux me permettre, ton code est aussi mal écrit de point de vue visibilité.

N'oublie pas aussi que ton constructeur va renvoyé le résultat de la dernière expression.
Donc tu dois plutôt faire un return de la liste contenant tes paramètres de connexion.
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 560
Re,

Voici un test qui rempli les paramètres des connexion depuis le fichier de configuration

Le fichier de configuration
lami20j@debian:~/trash/ccm_perl/drogba7213$ cat Configuration
user=lami20j
mdp=a
server=10.0.0.3
port=21
Le script
lami20j@debian:~/trash/ccm_perl/drogba7213$ cat Connexion3.pm
#!/usr/bin/perl
use strict;use warnings;

# $file correspond au fichier de configuration du FTP
my $file = '/home/lami20j/trash/ccm_perl/drogba7213/Configuration';
my ($user,$mdp,$server,$port);

# Juste pour te montrer ce que contiendroit tes paramètres
# Vu que tu utilises les variables, sub new() n'as pas de sens selon moi
($user,$mdp,$server,$port) = &Recherche_parametre;
print "$user\n$mdp\n$server\n$port\n";

# Fonction qui parcours le fichier de configuration et qui les retournent
sub Recherche_parametre()
{
        #Déclaration des variables
        my $lignes;
        my @parametre;

        #Ouverture du fichier de configuration
        open CONF, "$file" or die "E/S : $!\n";
        # $lignes prend la valeur du fichier de configuration
        while(defined($lignes = <CONF>)){
                chomp ($lignes);
                #Séparation des attributs de $lignes
                push @parametre,(split /=/, $lignes)[1];

        }
        #Fermeture du fichier
        close(CONF);

        #On retourne le tableau
        return @parametre;
}
__END__
L'exécution et le résultat
lami20j@debian:~/trash/ccm_perl/drogba7213$ perl Connexion3.pm
lami20j
a
10.0.0.3
21
Il te reste qu'à modifier ton fichier Connexion.pm avec la fonction qui va bien.