Implémentation du client SFTP
This commit is contained in:
parent
f35cb3cfee
commit
76f0fa79bc
@ -106,18 +106,29 @@ NETWORK_SHARE_PASSWORD=SigN4lisat10n!77240TraNsf3Rt
|
|||||||
NETWORK_SHARE_DOMAIN=metro
|
NETWORK_SHARE_DOMAIN=metro
|
||||||
|
|
||||||
|
|
||||||
|
#----------------------------------
|
||||||
|
#Paramètres du serveur SFTP pour la copie des fichiers logs
|
||||||
|
#Activation de la copie des fichiers sur le réseau (OUI ou NON)
|
||||||
|
#ACTIVER_SFTP=OUI
|
||||||
|
#Login pour accéder au serveur SFTP
|
||||||
|
#SFTP_LOGIN=service.ct
|
||||||
|
#Password pour accéder au serveur SFTP
|
||||||
|
#SFTP_PASSWORD=SigN4lisat10n!77240TraNsf3Rt
|
||||||
|
#Adresse du serveur
|
||||||
|
#SFTP_SERVER_ADDRESS=127.0.0.1
|
||||||
|
#Répertoire de destination sur le serveur (doit finir par un "/")
|
||||||
|
#SFTP_DESTINATION=/Transfert$/vers_corpo/CT/
|
||||||
|
|
||||||
#----------------------------------
|
#----------------------------------
|
||||||
#Paramètres du serveur SFTP pour la copie des fichiers logs
|
#Paramètres du serveur SFTP pour la copie des fichiers logs
|
||||||
#Activation de la copie des fichiers sur le réseau (OUI ou NON)
|
#Activation de la copie des fichiers sur le réseau (OUI ou NON)
|
||||||
ACTIVER_SFTP=OUI
|
ACTIVER_SFTP=OUI
|
||||||
#Login pour accéder au serveur SFTP
|
#Login pour accéder au serveur SFTP
|
||||||
SFTP_LOGIN=service.ct
|
SFTP_LOGIN=zonetest
|
||||||
#Password pour accéder au serveur SFTP
|
#Password pour accéder au serveur SFTP
|
||||||
SFTP_PASSWORD=SigN4lisat10n!77240TraNsf3Rt
|
SFTP_PASSWORD=zonetest
|
||||||
#Adresse du serveur
|
#Adresse du serveur
|
||||||
SFTP_SERVER_ADDRESS=127.0.0.1
|
SFTP_SERVER_ADDRESS=127.0.0.1
|
||||||
#Répertoire de destination sur le serveur (doit finir par un "/")
|
#Répertoire de destination sur le serveur (doit finir par un "/")
|
||||||
SFTP_DESTINATION=/Transfert$/vers_corpo/CT/
|
SFTP_DESTINATION=/home/zonetest/DevZT/test/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
1
sftpbatch
Normal file
1
sftpbatch
Normal file
@ -0,0 +1 @@
|
|||||||
|
put ./Trains/LOGZT2_2023-11-24-13-19-04-944.bin /home/zonetest/DevZT/test/CVRT-N-LOGZT2_2023-11-24-13-19-04-944.bin
|
||||||
@ -1,5 +1,7 @@
|
|||||||
#include "SFTPServerManager.h"
|
#include "SFTPServerManager.h"
|
||||||
#include "GlobalDefine.h"
|
#include "GlobalDefine.h"
|
||||||
|
#include <QFile>
|
||||||
|
|
||||||
|
|
||||||
CSFTPServerManager::CSFTPServerManager()
|
CSFTPServerManager::CSFTPServerManager()
|
||||||
{
|
{
|
||||||
@ -21,9 +23,23 @@ int CSFTPServerManager::InitFTPServerManager(bool EnableSFTPClient, QString SFTP
|
|||||||
mSFTPRemoteDir = SFTPRemoteDir;
|
mSFTPRemoteDir = SFTPRemoteDir;
|
||||||
mFilenamePrefix = FilenamePrefix;
|
mFilenamePrefix = FilenamePrefix;
|
||||||
|
|
||||||
|
mProcessTimer = new QTimer;
|
||||||
|
mProcessTimer->setSingleShot(true);
|
||||||
|
connect(mProcessTimer,SIGNAL(timeout()),this,SLOT(ProcessTimerExpired()));
|
||||||
|
|
||||||
|
mTransferProcess = new QProcess(this);
|
||||||
|
connect(mTransferProcess,SIGNAL(finished(int,QProcess::ExitStatus)),this,SLOT(ProcessFinished(int,QProcess::ExitStatus)));
|
||||||
|
|
||||||
|
|
||||||
return RET_OK;
|
return RET_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CSFTPServerManager::~CSFTPServerManager()
|
||||||
|
{
|
||||||
|
delete mTransferProcess;
|
||||||
|
delete mProcessTimer;
|
||||||
|
}
|
||||||
|
|
||||||
int CSFTPServerManager::TransferTrainLogToSFTPServer(QString FileName, bool Detection)
|
int CSFTPServerManager::TransferTrainLogToSFTPServer(QString FileName, bool Detection)
|
||||||
{
|
{
|
||||||
if(mEnableSFTPClient == false)
|
if(mEnableSFTPClient == false)
|
||||||
@ -53,12 +69,38 @@ int CSFTPServerManager::TransferTrainLogToSFTPServer(QString FileName, bool Dete
|
|||||||
#ifdef USE_SCP
|
#ifdef USE_SCP
|
||||||
Cmd = QString ("sshpass -p \"%1\" scp %2 %3@%4:%5").arg(mSFTPPassword).arg(OriginFilePath).arg(mSFTPLogin).arg(mSFTPServerAddress).arg(DestFilePath);
|
Cmd = QString ("sshpass -p \"%1\" scp %2 %3@%4:%5").arg(mSFTPPassword).arg(OriginFilePath).arg(mSFTPLogin).arg(mSFTPServerAddress).arg(DestFilePath);
|
||||||
#else
|
#else
|
||||||
#endif
|
QFile *SFTPBatchFile = new QFile("./sftpbatch");
|
||||||
qDebug("%s",qPrintable(Cmd));
|
if(SFTPBatchFile->open(QFile::ReadWrite | QFile::Truncate | QFile::Text | QFile::Unbuffered) == false)
|
||||||
|
{
|
||||||
|
qDebug("Imposible d'ouvrir le fichier sftpbatch");
|
||||||
|
SFTPBatchFile->close();
|
||||||
|
delete SFTPBatchFile;
|
||||||
|
return RET_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
// mTransferProcess->start(Cmd);
|
QString BatchCmds;
|
||||||
// mProcessTimer->start(PROCESS_TIMEOUT); //Allow some time to copy the file
|
BatchCmds.clear();
|
||||||
// mNetDriveSMState = NET_DRIVE_TRANSFERRING_TRAIN_LOG_STATE;
|
|
||||||
|
BatchCmds.append(QString("put %1 %2").arg(OriginFilePath).arg(DestFilePath));
|
||||||
|
|
||||||
|
SFTPBatchFile->write(qPrintable(BatchCmds));
|
||||||
|
SFTPBatchFile->close();
|
||||||
|
delete SFTPBatchFile;
|
||||||
|
|
||||||
|
Cmd = QString ("sshpass -p \"%1\" sftp -oBatchMode=no -b ./sftpbatch %2@%3").arg(mSFTPPassword).arg(mSFTPLogin).arg(mSFTPServerAddress);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
qDebug("Commande pour copie du fichier log: %s",qPrintable(Cmd));
|
||||||
|
|
||||||
|
if(mTransferProcess->state() != QProcess::NotRunning)
|
||||||
|
{
|
||||||
|
qDebug("Copie de fichier log avortée car QProcess roule");
|
||||||
|
return RET_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
mTransferProcess->start(Cmd);
|
||||||
|
mProcessTimer->start(PROCESS_TIMEOUT); //Allow some time to copy the file
|
||||||
|
|
||||||
|
|
||||||
return RET_OK;
|
return RET_OK;
|
||||||
@ -68,3 +110,18 @@ void CSFTPServerManager::NewTrainFileSaved(QString Filename, bool Detection)
|
|||||||
{
|
{
|
||||||
TransferTrainLogToSFTPServer(Filename,Detection);
|
TransferTrainLogToSFTPServer(Filename,Detection);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CSFTPServerManager::ProcessFinished(int ExitCode, QProcess::ExitStatus ExitStatus)
|
||||||
|
{
|
||||||
|
qDebug("Process SFTP terminé. Exit code - status %d - %d || Output %s || Erreur %s",ExitCode,ExitStatus,qPrintable(mTransferProcess->readAllStandardOutput()),qPrintable(mTransferProcess->readAllStandardError()));
|
||||||
|
qDebug("stdout: %s",qPrintable(mTransferProcess->readAll()));
|
||||||
|
}
|
||||||
|
|
||||||
|
void CSFTPServerManager::ProcessTimerExpired()
|
||||||
|
{
|
||||||
|
if(mTransferProcess->state() != QProcess::NotRunning)
|
||||||
|
{
|
||||||
|
mTransferProcess->terminate();
|
||||||
|
qDebug("Timer du process SFTP expiré Output %s || Erreur %s",qPrintable(mTransferProcess->readAllStandardOutput()),qPrintable(mTransferProcess->readAllStandardError()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@ -2,8 +2,11 @@
|
|||||||
#define SFTPSERVERMANAGER_H
|
#define SFTPSERVERMANAGER_H
|
||||||
|
|
||||||
#include <QObject>
|
#include <QObject>
|
||||||
|
#include <QProcess>
|
||||||
|
#include <QTimer>
|
||||||
|
|
||||||
#define USE_SCP
|
//#define USE_SCP
|
||||||
|
#define PROCESS_TIMEOUT 2000 //millisecs
|
||||||
|
|
||||||
class CSFTPServerManager : public QObject
|
class CSFTPServerManager : public QObject
|
||||||
{
|
{
|
||||||
@ -11,6 +14,7 @@ class CSFTPServerManager : public QObject
|
|||||||
public:
|
public:
|
||||||
CSFTPServerManager();
|
CSFTPServerManager();
|
||||||
|
|
||||||
|
~CSFTPServerManager();
|
||||||
int InitFTPServerManager(bool EnableSFTPClient, QString SFTPLogin, QString SFTPPassword, QString SFTPServerAddress, QString SFTPRemoteDir, QString FilenamePrefix);
|
int InitFTPServerManager(bool EnableSFTPClient, QString SFTPLogin, QString SFTPPassword, QString SFTPServerAddress, QString SFTPRemoteDir, QString FilenamePrefix);
|
||||||
int TransferTrainLogToSFTPServer(QString Filename, bool Detection);
|
int TransferTrainLogToSFTPServer(QString Filename, bool Detection);
|
||||||
|
|
||||||
@ -22,8 +26,14 @@ private:
|
|||||||
QString mSFTPRemoteDir;
|
QString mSFTPRemoteDir;
|
||||||
QString mFilenamePrefix;
|
QString mFilenamePrefix;
|
||||||
|
|
||||||
|
|
||||||
|
QProcess *mTransferProcess;
|
||||||
|
QTimer *mProcessTimer;
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
void NewTrainFileSaved(QString,bool);
|
void NewTrainFileSaved(QString,bool);
|
||||||
|
void ProcessTimerExpired();
|
||||||
|
void ProcessFinished(int ExitCode, QProcess::ExitStatus ExitStatus);
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@ -107,103 +107,103 @@ unsigned int CSimulationScenario::CreateScenario()
|
|||||||
/// //ZT2
|
/// //ZT2
|
||||||
|
|
||||||
|
|
||||||
// InsertNewStep(STEP_ACTION_REGISTER_ZT2_ITI,300);
|
InsertNewStep(STEP_ACTION_REGISTER_ZT2_ITI,300);
|
||||||
// InsertNewStep(STEP_ACTION_OCCUPY_ZT2,300);
|
InsertNewStep(STEP_ACTION_OCCUPY_ZT2,300);
|
||||||
|
|
||||||
// for(int bogie = 1; bogie <= 18; bogie++)
|
for(int bogie = 1; bogie <= 18; bogie++)
|
||||||
// {
|
{
|
||||||
// InsertNewStep(STEP_ACTION_ACTIVATE_ZT2_S1,SENSOR_DELAY);
|
InsertNewStep(STEP_ACTION_ACTIVATE_ZT2_S1,SENSOR_DELAY);
|
||||||
// InsertNewStep(STEP_ACTION_DEACTIVATE_ZT2_S1,BOGIE_DELAY);
|
InsertNewStep(STEP_ACTION_DEACTIVATE_ZT2_S1,BOGIE_DELAY);
|
||||||
|
|
||||||
// // if(bogie == 5 || bogie == 2)
|
// if(bogie == 5 || bogie == 2)
|
||||||
// {
|
{
|
||||||
// // InsertNewStep(STEP_ACTION_ACTIVATE_ZT2_PPE,5);
|
// InsertNewStep(STEP_ACTION_ACTIVATE_ZT2_PPE,5);
|
||||||
// // InsertNewStep(STEP_ACTION_DEACTIVATE_ZT2_PPE,1);
|
// InsertNewStep(STEP_ACTION_DEACTIVATE_ZT2_PPE,1);
|
||||||
|
|
||||||
// }
|
}
|
||||||
|
|
||||||
// // if(bogie == 3 || bogie == 10)
|
// if(bogie == 3 || bogie == 10)
|
||||||
// {
|
{
|
||||||
//// InsertNewStep(STEP_ACTION_ACTIVATE_ZT2_PPI,3);
|
// InsertNewStep(STEP_ACTION_ACTIVATE_ZT2_PPI,3);
|
||||||
//// InsertNewStep(STEP_ACTION_DEACTIVATE_ZT2_PPI,1);
|
// InsertNewStep(STEP_ACTION_DEACTIVATE_ZT2_PPI,1);
|
||||||
|
|
||||||
// }
|
}
|
||||||
|
|
||||||
// //if(bogie != 3)
|
//if(bogie != 3)
|
||||||
// {
|
{
|
||||||
// InsertNewStep(STEP_ACTION_ACTIVATE_ZT2_S1,SENSOR_DELAY);
|
InsertNewStep(STEP_ACTION_ACTIVATE_ZT2_S1,SENSOR_DELAY);
|
||||||
// InsertNewStep(STEP_ACTION_DEACTIVATE_ZT2_S1,BOGIE_DELAY);
|
InsertNewStep(STEP_ACTION_DEACTIVATE_ZT2_S1,BOGIE_DELAY);
|
||||||
// }
|
}
|
||||||
|
|
||||||
|
|
||||||
// }
|
}
|
||||||
|
|
||||||
// InsertNewStep(STEP_ACTION_DESTROY_ZT2_ITI,800);
|
InsertNewStep(STEP_ACTION_DESTROY_ZT2_ITI,800);
|
||||||
// InsertNewStep(STEP_ACTION_FREE_ZT2,800);
|
InsertNewStep(STEP_ACTION_FREE_ZT2,800);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//// MR
|
//// MR
|
||||||
// InsertNewStep(STEP_ACTION_REGISTER_ZT1_ITI,300);
|
// // InsertNewStep(STEP_ACTION_REGISTER_ZT1_ITI,300);
|
||||||
InsertNewStep(STEP_ACTION_OCCUPY_ZT1_APPROACH,300);
|
// InsertNewStep(STEP_ACTION_OCCUPY_ZT1_APPROACH,300);
|
||||||
InsertNewStep(STEP_ACTION_OCCUPY_ZT1,300);
|
// InsertNewStep(STEP_ACTION_OCCUPY_ZT1,300);
|
||||||
|
|
||||||
InsertNewStep(STEP_ACTION_DEACTIVATE_PGE,0);
|
// InsertNewStep(STEP_ACTION_DEACTIVATE_PGE,0);
|
||||||
|
|
||||||
for(int bogie = 1; bogie <= 18; bogie++)
|
// for(int bogie = 1; bogie <= 18; bogie++)
|
||||||
{
|
// {
|
||||||
// if(bogie != 5 && bogie != 7)
|
// // if(bogie != 5 && bogie != 7)
|
||||||
// InsertNewStep(STEP_ACTION_ACTIVATE_PGI,0);
|
// // InsertNewStep(STEP_ACTION_ACTIVATE_PGI,0);
|
||||||
// InsertNewStep(STEP_ACTION_ACTIVATE_PGE,0);
|
// // InsertNewStep(STEP_ACTION_ACTIVATE_PGE,0);
|
||||||
//V00 DETECTION
|
////V00 DETECTION
|
||||||
// if(bogie != 9)
|
//// if(bogie != 9)
|
||||||
// {
|
//// {
|
||||||
InsertNewStep(STEP_ACTION_ACTIVATE_S1,SENSOR_DELAY);
|
// InsertNewStep(STEP_ACTION_ACTIVATE_S1,SENSOR_DELAY);
|
||||||
// }
|
//// }
|
||||||
InsertNewStep(STEP_ACTION_DEACTIVATE_S1,BOGIE_DELAY);
|
// InsertNewStep(STEP_ACTION_DEACTIVATE_S1,BOGIE_DELAY);
|
||||||
// InsertNewStep(STEP_ACTION_DEACTIVATE_PGI,0);
|
// // InsertNewStep(STEP_ACTION_DEACTIVATE_PGI,0);
|
||||||
// InsertNewStep(STEP_ACTION_DEACTIVATE_PGE,0);
|
// // InsertNewStep(STEP_ACTION_DEACTIVATE_PGE,0);
|
||||||
|
|
||||||
//FN DETECTION
|
////FN DETECTION
|
||||||
if(bogie != 7 /*&& bogie != 8 && bogie != 3*/)
|
// if(bogie != 7 /*&& bogie != 8 && bogie != 3*/)
|
||||||
InsertNewStep(STEP_ACTION_ACTIVATE_FN,0);
|
// InsertNewStep(STEP_ACTION_ACTIVATE_FN,0);
|
||||||
|
|
||||||
InsertNewStep(STEP_ACTION_ACTIVATE_S1,SENSOR_DELAY);
|
// InsertNewStep(STEP_ACTION_ACTIVATE_S1,SENSOR_DELAY);
|
||||||
InsertNewStep(STEP_ACTION_ACTIVATE_S2,SENSOR_DELAY);
|
// InsertNewStep(STEP_ACTION_ACTIVATE_S2,SENSOR_DELAY);
|
||||||
InsertNewStep(STEP_ACTION_DEACTIVATE_S1,BOGIE_DELAY);
|
// InsertNewStep(STEP_ACTION_DEACTIVATE_S1,BOGIE_DELAY);
|
||||||
|
|
||||||
//PPI DETECTION
|
////PPI DETECTION
|
||||||
// if(bogie == 6 || bogie == 9)
|
//// if(bogie == 6 || bogie == 9)
|
||||||
// InsertNewStep(STEP_ACTION_ACTIVATE_PPI,0);
|
//// InsertNewStep(STEP_ACTION_ACTIVATE_PPI,0);
|
||||||
|
|
||||||
//FN DETECTION
|
////FN DETECTION
|
||||||
if(bogie != 7 /*&& bogie != 8 && bogie != 3*/)
|
// if(bogie != 7 /*&& bogie != 8 && bogie != 3*/)
|
||||||
InsertNewStep(STEP_ACTION_DEACTIVATE_FN,0);
|
// InsertNewStep(STEP_ACTION_DEACTIVATE_FN,0);
|
||||||
|
|
||||||
// InsertNewStep(STEP_ACTION_ACTIVATE_S2,SENSOR_DELAY);
|
//// InsertNewStep(STEP_ACTION_ACTIVATE_S2,SENSOR_DELAY);
|
||||||
InsertNewStep(STEP_ACTION_DEACTIVATE_S2,BOGIE_DELAY);
|
// InsertNewStep(STEP_ACTION_DEACTIVATE_S2,BOGIE_DELAY);
|
||||||
|
|
||||||
//PPI DETECTION
|
////PPI DETECTION
|
||||||
// if(bogie == 6 || bogie == 9)
|
//// if(bogie == 6 || bogie == 9)
|
||||||
// InsertNewStep(STEP_ACTION_DEACTIVATE_PPI,0);
|
//// InsertNewStep(STEP_ACTION_DEACTIVATE_PPI,0);
|
||||||
|
|
||||||
// if(bogie != 2 && bogie != 11)
|
// // if(bogie != 2 && bogie != 11)
|
||||||
// InsertNewStep(STEP_ACTION_ACTIVATE_PGI,0);
|
// // InsertNewStep(STEP_ACTION_ACTIVATE_PGI,0);
|
||||||
// if(bogie != 2 && bogie != 11)
|
// // if(bogie != 2 && bogie != 11)
|
||||||
// InsertNewStep(STEP_ACTION_ACTIVATE_PGE,0);
|
// // InsertNewStep(STEP_ACTION_ACTIVATE_PGE,0);
|
||||||
InsertNewStep(STEP_ACTION_ACTIVATE_S2,SENSOR_DELAY);
|
// InsertNewStep(STEP_ACTION_ACTIVATE_S2,SENSOR_DELAY);
|
||||||
InsertNewStep(STEP_ACTION_DEACTIVATE_S2,BOGIE_DELAY);
|
// InsertNewStep(STEP_ACTION_DEACTIVATE_S2,BOGIE_DELAY);
|
||||||
// InsertNewStep(STEP_ACTION_DEACTIVATE_PGI,0);
|
// // InsertNewStep(STEP_ACTION_DEACTIVATE_PGI,0);
|
||||||
// InsertNewStep(STEP_ACTION_DEACTIVATE_PGE,0);
|
// // InsertNewStep(STEP_ACTION_DEACTIVATE_PGE,0);
|
||||||
|
|
||||||
}
|
// }
|
||||||
|
|
||||||
|
|
||||||
// InsertNewStep(STEP_ACTION_DESTROY_ZT1_ITI,800);
|
// InsertNewStep(STEP_ACTION_DESTROY_ZT1_ITI,800);
|
||||||
|
|
||||||
InsertNewStep(STEP_ACTION_FREE_ZT1,800);
|
// InsertNewStep(STEP_ACTION_FREE_ZT1,800);
|
||||||
|
|
||||||
InsertNewStep(STEP_ACTION_FREE_ZT1_APPROACH,800);
|
// InsertNewStep(STEP_ACTION_FREE_ZT1_APPROACH,800);
|
||||||
|
|
||||||
return RET_OK;
|
return RET_OK;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -270,7 +270,7 @@ ZTConfigResult CZTConfigMgr::LoadZTConfig()
|
|||||||
mActivateSAMBADrive = true;
|
mActivateSAMBADrive = true;
|
||||||
CEngLog::instance()->AddLogString(QString().sprintf("Copie sur répertoire SAMBA activée"),1);
|
CEngLog::instance()->AddLogString(QString().sprintf("Copie sur répertoire SAMBA activée"),1);
|
||||||
}
|
}
|
||||||
else if(string.mid(pos) == "NON")
|
else
|
||||||
{
|
{
|
||||||
mActivateSAMBADrive = false;
|
mActivateSAMBADrive = false;
|
||||||
CEngLog::instance()->AddLogString(QString().sprintf("Copie sur répertoire SAMBA désactivée"),1);
|
CEngLog::instance()->AddLogString(QString().sprintf("Copie sur répertoire SAMBA désactivée"),1);
|
||||||
@ -303,7 +303,7 @@ ZTConfigResult CZTConfigMgr::LoadZTConfig()
|
|||||||
mActivateSFTPClient = true;
|
mActivateSFTPClient = true;
|
||||||
CEngLog::instance()->AddLogString(QString().sprintf("Copie sur serveur SFTP activée"),1);
|
CEngLog::instance()->AddLogString(QString().sprintf("Copie sur serveur SFTP activée"),1);
|
||||||
}
|
}
|
||||||
else if(string.mid(pos) == "NON")
|
else
|
||||||
{
|
{
|
||||||
mActivateSFTPClient = false;
|
mActivateSFTPClient = false;
|
||||||
CEngLog::instance()->AddLogString(QString().sprintf("Copie sur serveur SFTP désactivée"),1);
|
CEngLog::instance()->AddLogString(QString().sprintf("Copie sur serveur SFTP désactivée"),1);
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user