ZT/sources/NetDriveMgr.cpp

382 lines
11 KiB
C++

#include "NetDriveMgr.h"
#include <QFile>
#include "GlobalDefine.h"
#include <QDate>
/// sudo mount -t cifs -o domain=TID,user=JF,password=signal77240,vers=2.1 //192.168.50.110/TestZT /home/zonetest/ZT/NetDrive
/// /proc/self/mountinfo
/// /proc/self/mounts
/// /sys/class/net/eth0
///
CNetDriveMgr::CNetDriveMgr(QObject *parent) :
QObject(parent)
{
mNetDriveSMState = NET_DRIVE_MOUNTING_STATE;
mProcessTimer = new QTimer();
mProcessTimer->setSingleShot(true);
connect(mProcessTimer,SIGNAL(timeout()),this,SLOT(ProcessExecTimerExpired()));
mNASMountPath = NAS_MOUNT_POINT;
mNASMountPath.append("/");
mTransferProcess = new QProcess(this);
connect(mTransferProcess,SIGNAL(finished(int,QProcess::ExitStatus)),this,SLOT(ProcessFinished(int,QProcess::ExitStatus)));
mIsNetDriveEnabled = false;
}
CNetDriveMgr::~CNetDriveMgr()
{
delete mProcessTimer;
delete mTransferProcess;
}
bool CNetDriveMgr::IsNetworkDriveAvailable()
{
bool ret = false;
QFile *SysFile = new QFile("/sys/class/net/eth0/carrier");
if(SysFile)
{
SysFile->open(QIODevice::ReadOnly | QIODevice::Text | QIODevice::Unbuffered);
QString FileData = QString(SysFile->readAll());
SysFile->close();
if(FileData.isEmpty() == false)
{
if(FileData.left(1) == "1")
{
ret = true;
}
else if(FileData.left(1) == "0")
{
ret = false;
}
else
{
ret = false;
qDebug("CNetDriveMgr: Valeur inatendue dans/sys/class/net/eth0/carrier");
}
}
}
delete SysFile;
return ret;
}
bool CNetDriveMgr::IsNetworkDriveMounted()
{
bool ret = false;
QFile *MountInfo = new QFile("/proc/self/mounts");
if(MountInfo)
{
MountInfo->open(QIODevice::ReadOnly | QIODevice::Text | QIODevice::Unbuffered);
QString FileData = QString(MountInfo->readAll());
MountInfo->close();
if(FileData.contains(NAS_MOUNT_POINT) == true)
{
ret = true;
}
}
delete MountInfo;
return ret;
}
int CNetDriveMgr::CopyFileToNetworkDrive(QString FilePath)
{
if(mIsNetDriveEnabled == false)
return RET_ERROR;
return RET_OK;
}
int CNetDriveMgr::TransferTrainLogToNetDrive(QString NewLogFileName, bool Detection)
{
if(mIsNetDriveEnabled == false)
return RET_ERROR;
if(mNetDriveSMState != NET_DRIVE_STANDBY_STATE)
{
return RET_ERROR;
}
QString DestFilePath = NewLogFileName;
if(Detection == true)
{
DestFilePath.prepend(mFilesPrefix + "-D-"); //Flag indiquant que ce passage contient des détections (D)
}
else
{
DestFilePath.prepend(mFilesPrefix + "-N-"); //Flag inidiquant un passage normal (sans détection) (N)
}
DestFilePath.prepend(mNASMountPath);
QString OriginFilePath = NewLogFileName;
OriginFilePath.prepend("./Trains/");
QString Cmd = QString ("cp -f %1 %2").arg(OriginFilePath).arg(DestFilePath);
mTransferProcess->start(Cmd);
mProcessTimer->start(PROCESS_TIMEOUT); //Allow some time to copy the file
mNetDriveSMState = NET_DRIVE_TRANSFERRING_TRAIN_LOG_STATE;
return RET_OK;
}
int CNetDriveMgr::TransferZTLogToNetDrive()
{
if(mIsNetDriveEnabled == false)
return RET_ERROR;
QString DestFileDate = QDate::currentDate().toString("yyyyMMdd");
QString DestFilePath = QString("%1%2%3_LogZT.txt").arg(mNASMountPath).arg(mFilesPrefix).arg(DestFileDate);
QString OriginFilePath = QString("./LOG/LogZT.txt");
QString Cmd = QString ("cp -f %1 %2").arg(OriginFilePath).arg(DestFilePath);
mTransferProcess->start(Cmd);
mProcessTimer->start(PROCESS_TIMEOUT); //Allow some time to copy the file
mNetDriveSMState = NET_DRIVE_TRANSFERRING_ZT_LOG_STATE;
return RET_OK;
}
int CNetDriveMgr::NetworkDriveStateMachine(int Event)
{
switch(mNetDriveSMState)
{
case NET_DRIVE_STANDBY_STATE:
{
break;
}
case NET_DRIVE_TRANSFERRING_TRAIN_LOG_STATE:
{
switch(Event)
{
case NET_DRIVE_SM_PROCESS_TIMER_EXPIRED_EVENT:
{
//The network drive is stale or disconnected
mTransferProcess->kill();
mNetDriveSMState = NET_DRIVE_STANDBY_STATE;
qDebug("Failed to transfer train log file to NAS");
break;
}
case NET_DRIVE_SM_PROCESS_FINISHED_EVENT:
{
mProcessTimer->stop();
TransferZTLogToNetDrive();
qDebug("NAS transfer result: %s @ %s",qPrintable(mTransferProcess->readAllStandardOutput()),qPrintable(mTransferProcess->readAllStandardError()));
break;
}
}
break;
}
case NET_DRIVE_TRANSFERRING_ZT_LOG_STATE:
{
switch(Event)
{
case NET_DRIVE_SM_PROCESS_TIMER_EXPIRED_EVENT:
{
//The network drive is stale or disconnected
mTransferProcess->kill();
mNetDriveSMState = NET_DRIVE_STANDBY_STATE;
qDebug("Failed to transfer ZT log file to NAS");
break;
}
case NET_DRIVE_SM_PROCESS_FINISHED_EVENT:
{
mNetDriveSMState = NET_DRIVE_STANDBY_STATE;
qDebug("NAS transfer result: %s @ %s",qPrintable(mTransferProcess->readAllStandardOutput()),qPrintable(mTransferProcess->readAllStandardError()));
mProcessTimer->stop();
break;
}
}
break;
}
case NET_DRIVE_TRASFERRING_MISC_FILE_STATE:
{
switch(Event)
{
case NET_DRIVE_SM_PROCESS_TIMER_EXPIRED_EVENT:
{
break;
}
case NET_DRIVE_SM_PROCESS_FINISHED_EVENT:
{
break;
}
}
break;
}
case NET_DRIVE_MOUNTING_STATE:
{
switch(Event)
{
case NET_DRIVE_SM_PROCESS_TIMER_EXPIRED_EVENT:
{
qDebug("Failed to mount network drive within allowed period. Will retry later %s @ %s",qPrintable(mTransferProcess->readAllStandardOutput()),qPrintable(mTransferProcess->readAllStandardError()));
QString stdout = QString(mTransferProcess->readAllStandardOutput());
QString stderr = QString(mTransferProcess->readAllStandardError());
mTransferProcess->kill();
mNetDriveSMState = NET_DRIVE_RETRY_MOUNTING_STATE;
MountNetworkDrive();
break;
}
case NET_DRIVE_SM_PROCESS_FINISHED_EVENT:
{
QString StdOut = mTransferProcess->readAllStandardOutput();
qDebug("%s",qPrintable(StdOut));
mProcessTimer->stop();
if(IsNetworkDriveMounted())
{
qDebug("Drive mounted successfuly");
mNetDriveSMState = NET_DRIVE_STANDBY_STATE;
}
else
{
qDebug("Mount command failed: %s @ %s",qPrintable(mTransferProcess->readAllStandardOutput()),qPrintable(mTransferProcess->readAllStandardError()));
mNetDriveSMState = NET_DRIVE_RETRY_MOUNTING_STATE;
mProcessTimer->start(MOUNT_TIMEOUT);
}
break;
}
}
break;
}
case NET_DRIVE_RETRY_MOUNTING_STATE:
{
switch(Event)
{
case NET_DRIVE_SM_PROCESS_TIMER_EXPIRED_EVENT:
{
qDebug("Retrying to mount net drive");
MountNetworkDrive();
break;
}
case NET_DRIVE_SM_PROCESS_FINISHED_EVENT:
{
//Should not come here...
break;
}
}
break;
}
}
return RET_OK;
}
void CNetDriveMgr::ProcessFinished(int exitCode, QProcess::ExitStatus exitStatus)
{
Q_UNUSED(exitCode)
Q_UNUSED(exitStatus)
qDebug("Process finished %d - %d",exitCode,exitStatus);
NetworkDriveStateMachine(NET_DRIVE_SM_PROCESS_FINISHED_EVENT);
}
void CNetDriveMgr::ProcessExecTimerExpired()
{
NetworkDriveStateMachine(NET_DRIVE_SM_PROCESS_TIMER_EXPIRED_EVENT);
}
int CNetDriveMgr::InitNetDriveMgr(bool Enabled, QString RemoteAccessPath, QString RemoteLogin, QString RemotePwd, QString RemoteDomain, QString FilenamePrefix)
{
if(Enabled == false)
{
mIsNetDriveEnabled = false;
return RET_OK;
}
mIsNetDriveEnabled = true;
mRemoteDriveAccessPath = RemoteAccessPath;
mRemoteDriveLogin = RemoteLogin;
mRemoteDrivePassword = RemotePwd;
mRemoteDriveDomain = RemoteDomain;
mFilesPrefix = FilenamePrefix;
MountNetworkDrive();
}
int CNetDriveMgr::MountNetworkDrive()
{
if(mIsNetDriveEnabled == false)
return RET_ERROR;
if(IsNetworkDriveMounted())
{
qDebug("Network drive already mounted, aborting mount operation");
mNetDriveSMState = NET_DRIVE_STANDBY_STATE;
return RET_ERROR; //drive already mounted.
}
if(IsNetworkDriveAvailable() == false) //Network is disconnected... retry later.
{
qDebug("Network interface not connected. Cannot mount network drive. Will retry later");
mNetDriveSMState = NET_DRIVE_RETRY_MOUNTING_STATE;
mProcessTimer->start(MOUNT_TIMEOUT);
return RET_ERROR;
}
//sudo mount -t cifs -o domain=TID,user=JF,password=signal77240,vers=2.1 //192.168.50.110/TestZT /home/zonetest/ZT/NetDrive
qDebug("Trying to mount network drive");
QString Cmd;
if(mRemoteDriveDomain.isEmpty())
Cmd = QString("mount -t cifs -o user=%2,password=%3,vers=2.1 %4 %5").arg(mRemoteDriveLogin).arg(mRemoteDrivePassword).arg(mRemoteDriveAccessPath).arg(NAS_MOUNT_POINT);
else
Cmd = QString("mount -t cifs -o domain=%1,user=%2,password=%3,vers=2.1 %4 %5").arg(mRemoteDriveDomain).arg(mRemoteDriveLogin).arg(mRemoteDrivePassword).arg(mRemoteDriveAccessPath).arg(NAS_MOUNT_POINT);
mTransferProcess->start(Cmd);
mNetDriveSMState = NET_DRIVE_MOUNTING_STATE;
mProcessTimer->start(MOUNT_TIMEOUT);
return RET_OK;
}
int CNetDriveMgr::UnMountNetworkDrive()
{
if(mIsNetDriveEnabled == false)
return RET_ERROR;
if(IsNetworkDriveMounted() == false)
{
qDebug("Network drive not mounted, aborting unmount operation");
mNetDriveSMState = NET_DRIVE_MOUNTING_STATE;
return RET_ERROR; //drive already mounted.
}
QString Cmd = QString("umount %1").arg(NAS_MOUNT_POINT);
QProcess::startDetached(Cmd);
mNetDriveSMState = NET_DRIVE_MOUNTING_STATE;
return RET_OK;
}
void CNetDriveMgr::NewTrainFileSaved(QString filename, bool Detection)
{
TransferTrainLogToNetDrive(filename,Detection);
}