ZT/sources/SFTPServerManager.cpp
2023-11-24 13:19:55 -05:00

128 lines
3.7 KiB
C++

#include "SFTPServerManager.h"
#include "GlobalDefine.h"
#include <QFile>
CSFTPServerManager::CSFTPServerManager()
{
mEnableSFTPClient = false;
}
int CSFTPServerManager::InitFTPServerManager(bool EnableSFTPClient, QString SFTPLogin, QString SFTPPassword, QString SFTPServerAddress, QString SFTPRemoteDir, QString FilenamePrefix)
{
if(EnableSFTPClient == false)
{
mEnableSFTPClient = false;
return RET_OK;
}
mEnableSFTPClient = true;
mSFTPLogin = SFTPLogin;
mSFTPPassword = SFTPPassword;
mSFTPServerAddress = SFTPServerAddress;
mSFTPRemoteDir = SFTPRemoteDir;
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;
}
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").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;
}
void CSFTPServerManager::NewTrainFileSaved(QString Filename, bool 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()));
}
}