152 lines
5.0 KiB
C++
152 lines
5.0 KiB
C++
#include "SFTPServerManager.h"
|
|
#include "GlobalDefine.h"
|
|
#include <QFile>
|
|
#include "EngLog.h"
|
|
|
|
|
|
CSFTPServerManager::CSFTPServerManager()
|
|
{
|
|
mEnableSFTPClient = false;
|
|
}
|
|
|
|
int CSFTPServerManager::InitFTPServerManager(bool EnableSFTPClient, QString SFTPLogin, QString SFTPPassword, QString SFTPServerAddress, QString SFTPRemoteDir, QString FilenamePrefix, bool CopyEngLog)
|
|
{
|
|
if(EnableSFTPClient == false)
|
|
{
|
|
mEnableSFTPClient = false;
|
|
return RET_OK;
|
|
}
|
|
|
|
mEnableSFTPClient = true;
|
|
mSFTPLogin = SFTPLogin;
|
|
mSFTPPassword = SFTPPassword;
|
|
mSFTPServerAddress = SFTPServerAddress;
|
|
mSFTPRemoteDir = SFTPRemoteDir;
|
|
mFilenamePrefix = FilenamePrefix;
|
|
mCopyEngLog = CopyEngLog;
|
|
|
|
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)));
|
|
|
|
QFile *PWDFile = new QFile("./password");
|
|
if(PWDFile->open(QFile::ReadWrite | QFile::Truncate | QFile::Text | QFile::Unbuffered) == false)
|
|
{
|
|
CEngLog::instance()->AddLogString(QString("Gestionnaire de client SFTP: Impossible de mettre à jour le password dans le fichier"));
|
|
PWDFile->close();
|
|
delete PWDFile;
|
|
}
|
|
|
|
PWDFile->write(qPrintable(SFTPPassword));
|
|
PWDFile->close();
|
|
delete PWDFile;
|
|
|
|
CEngLog::instance()->AddLogString(QString("Gestionnaire de client SFTP initialisé."));
|
|
|
|
return RET_OK;
|
|
}
|
|
|
|
CSFTPServerManager::~CSFTPServerManager()
|
|
{
|
|
delete mTransferProcess;
|
|
delete mProcessTimer;
|
|
}
|
|
|
|
int CSFTPServerManager::TransferTrainLogToSFTPServer(QString FileName, bool Detection)
|
|
{
|
|
if(mEnableSFTPClient == false)
|
|
{
|
|
return RET_ERROR;
|
|
}
|
|
|
|
|
|
|
|
QString DestFilePath = FileName;
|
|
if(Detection == true)
|
|
{
|
|
DestFilePath.prepend(mFilenamePrefix + "-D-"); //Flag indiquant que ce passage contient des détections (D)
|
|
}
|
|
else
|
|
{
|
|
DestFilePath.prepend(mFilenamePrefix + "-N-"); //Flag inidiquant un passage normal (sans détection) (N)
|
|
}
|
|
|
|
|
|
DestFilePath.prepend(mSFTPRemoteDir);
|
|
QString OriginFilePath = FileName;
|
|
OriginFilePath.prepend("./Trains/");
|
|
|
|
QString Cmd;
|
|
|
|
#ifdef USE_SCP
|
|
Cmd = QString ("sshpass -p \"%1\" scp %2 %3@%4:%5").arg(mSFTPPassword).arg(OriginFilePath).arg(mSFTPLogin).arg(mSFTPServerAddress).arg(DestFilePath);
|
|
#else
|
|
QFile *SFTPBatchFile = new QFile("./sftpbatch");
|
|
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;
|
|
}
|
|
|
|
QString BatchCmds;
|
|
BatchCmds.clear();
|
|
|
|
BatchCmds.append(QString("put %1 %2\n").arg(OriginFilePath).arg(DestFilePath));
|
|
QString DestLogFileName = QString("%1%2-LogZT.txt").arg(mSFTPRemoteDir).arg(mFilenamePrefix);
|
|
BatchCmds.append(QString("put ./LOG/LogZT.txt %1").arg(DestLogFileName));
|
|
if(mCopyEngLog == true)
|
|
{
|
|
DestLogFileName = QString("%1%2-IngLog.txt").arg(mSFTPRemoteDir).arg(mFilenamePrefix);
|
|
BatchCmds.append(QString("\n"));
|
|
BatchCmds.append(QString("put ./ING/IngLog.txt %1").arg(DestLogFileName));
|
|
}
|
|
|
|
SFTPBatchFile->write(qPrintable(BatchCmds));
|
|
SFTPBatchFile->close();
|
|
delete SFTPBatchFile;
|
|
|
|
Cmd = QString ("sshpass -f ./password sftp -oBatchMode=no -b ./sftpbatch %1@%2").arg(mSFTPLogin).arg(mSFTPServerAddress);
|
|
|
|
#endif
|
|
|
|
// qDebug("Commande pour copie du fichier log: %s",qPrintable(Cmd));
|
|
|
|
if(mTransferProcess->state() != QProcess::NotRunning)
|
|
{
|
|
CEngLog::instance()->AddLogString("Copie de fichier log avortée car QProcess roule");
|
|
return RET_ERROR;
|
|
}
|
|
|
|
mTransferProcess->start(Cmd);
|
|
mProcessTimer->start(SFTP_PROCESS_TIMEOUT); //Allow some time to copy the file
|
|
|
|
|
|
return RET_OK;
|
|
}
|
|
|
|
void CSFTPServerManager::NewTrainFileSaved(QString Filename, bool Detection)
|
|
{
|
|
TransferTrainLogToSFTPServer(Filename,Detection);
|
|
}
|
|
|
|
void CSFTPServerManager::ProcessFinished(int ExitCode, QProcess::ExitStatus ExitStatus)
|
|
{
|
|
CEngLog::instance()->AddLogString(QString("Process SFTP terminé. Exit code: %1 || Exit status: %2 || Output: %3 || Erreur: %4 || stdout: %5").arg(ExitCode).arg(ExitStatus).arg(qPrintable(mTransferProcess->readAllStandardOutput())).arg(qPrintable(mTransferProcess->readAllStandardError())).arg(qPrintable(mTransferProcess->readAll())));
|
|
mProcessTimer->stop();
|
|
// qDebug("stdout: %s",qPrintable(mTransferProcess->readAll()));
|
|
}
|
|
|
|
void CSFTPServerManager::ProcessTimerExpired()
|
|
{
|
|
if(mTransferProcess->state() != QProcess::NotRunning)
|
|
{
|
|
mTransferProcess->terminate();
|
|
CEngLog::instance()->AddLogString(QString("Timer du process SFTP expiré Output: %1 || Erreur: %2").arg(qPrintable(mTransferProcess->readAllStandardOutput())).arg(qPrintable(mTransferProcess->readAllStandardError())),2);
|
|
}
|
|
}
|