#include "SFTPServerManager.h" #include "GlobalDefine.h" #include 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())); } }