provide for update logging using a file watcher
This commit is contained in:
		@@ -19,6 +19,7 @@
 | 
			
		||||
#include <QScopedPointer>
 | 
			
		||||
#include <QRegularExpression>
 | 
			
		||||
#include <QJsonArray>
 | 
			
		||||
#include <QProgressBar>
 | 
			
		||||
 | 
			
		||||
#include <memory>
 | 
			
		||||
 | 
			
		||||
@@ -29,6 +30,7 @@
 | 
			
		||||
#include "mainwindow.h"
 | 
			
		||||
#include "utils.h"  // deprecated
 | 
			
		||||
#include "utils_internal.h"
 | 
			
		||||
#include "log_line_entry.h"
 | 
			
		||||
#include "process/command.h"
 | 
			
		||||
#include "process/update_command.h"
 | 
			
		||||
#include "process/check_ismas_connectivity_command.h"
 | 
			
		||||
@@ -193,7 +195,28 @@ Worker::Worker(int customerNr,
 | 
			
		||||
  , m_dcDownloadJsonFiles(new Command(
 | 
			
		||||
        QString("/opt/app/tools/atbupdate/ATBDownloadDCJsonFiles --set-ppid %1").arg(QCoreApplication::applicationPid())))
 | 
			
		||||
  //, m_withoutIsmasDirectPort(true) /* useful for testing */ {
 | 
			
		||||
  , m_withoutIsmasDirectPort(false) /* useful for testing */  {
 | 
			
		||||
  , m_withoutIsmasDirectPort(false) /* useful for testing */
 | 
			
		||||
  , m_updateLog("/opt/app/tools/atbupdate/update.log") // TODO: in ini-file eintragen
 | 
			
		||||
  , m_updateLogBackup("/opt/app/tools/atbupdate/updateBackup.log") { // TODO: in ini-file eintragen
 | 
			
		||||
 | 
			
		||||
    if (!m_updateLog.exists()) {
 | 
			
		||||
        qCritical() << "ERROR" << m_updateLog.fileName() << "does not exist";
 | 
			
		||||
    } else {
 | 
			
		||||
        if (!m_updateLog.open(QIODevice::ReadWrite | QIODevice::Unbuffered)) {
 | 
			
		||||
            qCritical() << "ERROR can not open" << m_updateLog.fileName();
 | 
			
		||||
        } else {
 | 
			
		||||
            m_updateLog.resize(0);
 | 
			
		||||
            m_fileWatcher.addPath(QFileInfo(m_updateLog).absoluteFilePath());
 | 
			
		||||
            connect(&m_fileWatcher, SIGNAL(fileChanged(QString const&)), this, SLOT(onFileChanged(QString const&)));
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (!m_updateLogBackup.open(QIODevice::ReadWrite | QIODevice::Unbuffered)) {
 | 
			
		||||
        qCritical() << "ERROR can not open" << m_updateLogBackup.fileName();
 | 
			
		||||
    } else {
 | 
			
		||||
        m_updateLogBackup.resize(0);
 | 
			
		||||
        m_updateLogBackup.close();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // *** check ISMAS connectivity ***
 | 
			
		||||
    // NOTE: if the customer repository does not exist, then it does not matter
 | 
			
		||||
@@ -202,8 +225,8 @@ Worker::Worker(int customerNr,
 | 
			
		||||
    int next = 1;
 | 
			
		||||
    m_workList.push_back(
 | 
			
		||||
                std::make_unique<CheckIsmasConnectivityCommand>(
 | 
			
		||||
                    QString("echo ATBUpdateCheck --ismas-connected")
 | 
			
		||||
                    //QString("/opt/app/tools/atbupdate/ATBUpdateCheck --ismas-connected")
 | 
			
		||||
                    //QString("echo ATBUpdateCheck --ismas-connected")
 | 
			
		||||
                    QString("/opt/app/tools/atbupdate/ATBUpdateCheck --ismas-connected")
 | 
			
		||||
                    , this, ++next));
 | 
			
		||||
 | 
			
		||||
    // *** check if update activated in ISMAS ***
 | 
			
		||||
@@ -211,8 +234,8 @@ Worker::Worker(int customerNr,
 | 
			
		||||
    // if the update has been activated via ISMAS.
 | 
			
		||||
    m_workList.push_back(
 | 
			
		||||
                std::make_unique<CheckUpdateActivationCommand>(
 | 
			
		||||
                    QString("echo ATBUpdateCheck --update-requested")
 | 
			
		||||
                    //QString("/opt/app/tools/atbupdate/ATBUpdateCheck --update-requested")
 | 
			
		||||
                    // QString("echo ATBUpdateCheck --update-requested")
 | 
			
		||||
                    QString("/opt/app/tools/atbupdate/ATBUpdateCheck --update-requested")
 | 
			
		||||
                    , this, ++next));
 | 
			
		||||
 | 
			
		||||
    // *** check and fetch git-customer repository ***
 | 
			
		||||
@@ -257,8 +280,8 @@ Worker::Worker(int customerNr,
 | 
			
		||||
    // send device-controller firmware down to device-controller-hardware
 | 
			
		||||
    m_workList.push_back(
 | 
			
		||||
                std::make_unique<UpdateDCCommand>(
 | 
			
		||||
                    // QString("echo ATBUpdateDC")
 | 
			
		||||
                    QString("/opt/app/tools/atbupdate/ATBUpdateDC")
 | 
			
		||||
                    QString("echo ATBUpdateDC")
 | 
			
		||||
                    // QString("/opt/app/tools/atbupdate/ATBUpdateDC")
 | 
			
		||||
                    , this, ++next));
 | 
			
		||||
 | 
			
		||||
    // show/send software-status
 | 
			
		||||
@@ -301,10 +324,91 @@ Worker::~Worker() {
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#if 0
 | 
			
		||||
struct LogLineEntry {
 | 
			
		||||
    char receiver;      // 1    receiver can be: ISMAS
 | 
			
		||||
    char reason[5];     // 6    SW_UP
 | 
			
		||||
    char timestamp[19]; // 25   ISO-format: 1900-xx-xxT00:00:00
 | 
			
		||||
    char eventId;       // 26
 | 
			
		||||
    char event[5];      // 31
 | 
			
		||||
    /*
 | 
			
		||||
        Note:
 | 
			
		||||
        ! After U0002 immer ein CMD_SENDVERSION
 | 
			
		||||
        ! Only U0002 and U0003 finish the Update process.
 | 
			
		||||
        ! U0001: Update finished but not activated
 | 
			
		||||
        ! U0002: Update finished and activated
 | 
			
		||||
        ! U0003: Update finished but FAILed.
 | 
			
		||||
    */
 | 
			
		||||
 | 
			
		||||
    // #define _ISMAS_DONE                 "U0001" // 100%, Check: Resultcode: 0
 | 
			
		||||
    // #define _ISMAS_SET_WAIT_OK          "U0002" // empty WAIT-button (""), ResultCode: 0
 | 
			
		||||
    // #define _ISMAS_NO_UPDATE_NECESSARY  "M0100" // empty WAIT-button (""), ResultCode: 0
 | 
			
		||||
    // #define _ISMAS_FAILURE              "U0003" // FAIL
 | 
			
		||||
    // #define _ISMAS_CONTINUE             "U0010" // %-values: Update laeuft, Resultcodes entsprechend laufender Schritt
 | 
			
		||||
    // #define _ISMAS_RESET_WAIT           "ISMAS" // reset WAIT-button to "WAIT"
 | 
			
		||||
    // #define _ISMAS_TEST_TRIGGER         "U0099" // check the WAIT-button
 | 
			
		||||
    char eventState;    // 32
 | 
			
		||||
    char percent;       // 33   percent in progressbar of update-tool
 | 
			
		||||
    char resultCode;    // 34
 | 
			
		||||
    char step[40];      // 74   step executed
 | 
			
		||||
    char stepResult[40];// 114  result for step
 | 
			
		||||
    char version[14];   // 128
 | 
			
		||||
};
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
void Worker::onFileChanged(QString const& fname) {
 | 
			
		||||
 | 
			
		||||
    QFile f(fname);
 | 
			
		||||
    //if (m_updateLog.fileName().contains(fname)) {
 | 
			
		||||
    //    if (f.exists() && m_updateLogBackup.exists()) {
 | 
			
		||||
    if (!m_updateLogBackup.open(QIODevice::ReadWrite | QIODevice::Unbuffered)) {
 | 
			
		||||
        qCritical() << "ERROR can not open" << m_updateLogBackup.fileName();
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
    if (f.open(QIODevice::ReadOnly)) {
 | 
			
		||||
        QByteArray const &backup = m_updateLogBackup.readAll();
 | 
			
		||||
        QByteArray const &data = f.readAll();
 | 
			
		||||
        int const diff = data.size() - backup.size();
 | 
			
		||||
        if (diff > 0) {
 | 
			
		||||
            QByteArray const &newLines = data.mid(backup.size());
 | 
			
		||||
            int const size = newLines.size();
 | 
			
		||||
            if (size > 0) {
 | 
			
		||||
                LogLineEntry logLine;
 | 
			
		||||
                int pos = 0;
 | 
			
		||||
                while (pos < size) {
 | 
			
		||||
                    QByteArray const &a = newLines.mid(pos, sizeof(logLine));
 | 
			
		||||
                    if (a.size() == sizeof(logLine)) {
 | 
			
		||||
                        memcpy(&logLine, a.data(), sizeof(logLine));
 | 
			
		||||
 | 
			
		||||
                        qCritical() << "    reason:" << QString(QByteArray(logLine.reason, sizeof(logLine.reason)));
 | 
			
		||||
                        qCritical() << " timestamp:" << QString(QByteArray(logLine.timestamp, sizeof(logLine.timestamp)));
 | 
			
		||||
                        qCritical() << "     event:" << QString(QByteArray(logLine.event, sizeof(logLine.event)));
 | 
			
		||||
                        qCritical() << "      step:" << QString(QByteArray(logLine.step, sizeof(logLine.step)));
 | 
			
		||||
                        qCritical() << "stepResult:" << QString(QByteArray(logLine.stepResult, sizeof(logLine.stepResult)));
 | 
			
		||||
                        qCritical() << "   percent:" << (int)logLine.percent;
 | 
			
		||||
 | 
			
		||||
                        displayProgressInMainWindow(logLine.percent);
 | 
			
		||||
                    }
 | 
			
		||||
                    pos += sizeof(logLine);
 | 
			
		||||
                }
 | 
			
		||||
                m_updateLogBackup.write(newLines);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        f.close();
 | 
			
		||||
    }
 | 
			
		||||
    //}
 | 
			
		||||
    m_updateLogBackup.close();
 | 
			
		||||
    // TODO: daten an ISMAS senden
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Worker::displayProgressInMainWindow(int progress) {
 | 
			
		||||
    if (m_mainWindow) {
 | 
			
		||||
        QApplication::postEvent(m_mainWindow,
 | 
			
		||||
            new ProgressEvent(this, progress));
 | 
			
		||||
        QProgressBar *progressBar = m_mainWindow->progressBar();
 | 
			
		||||
        if (progressBar) {
 | 
			
		||||
            progressBar->setValue(progress);
 | 
			
		||||
        }
 | 
			
		||||
        //QApplication::postEvent(m_mainWindow,
 | 
			
		||||
        //    new ProgressEvent(this, progress));
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user