#include "NetDriveMgr.h" #include #include "GlobalDefine.h" #include /// 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) { if(mIsNetDriveEnabled == false) return RET_ERROR; if(mNetDriveSMState != NET_DRIVE_STANDBY_STATE) { return RET_ERROR; } QString DestFilePath = NewLogFileName; DestFilePath.prepend(mFilesPrefix + "-"); 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; QString("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) { TransferTrainLogToNetDrive(filename); }