provide for update logging using a file watcher
This commit is contained in:
parent
cf3e1d61dd
commit
d36c7c1f72
@ -19,6 +19,7 @@
|
|||||||
#include <QScopedPointer>
|
#include <QScopedPointer>
|
||||||
#include <QRegularExpression>
|
#include <QRegularExpression>
|
||||||
#include <QJsonArray>
|
#include <QJsonArray>
|
||||||
|
#include <QProgressBar>
|
||||||
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
|
||||||
@ -29,6 +30,7 @@
|
|||||||
#include "mainwindow.h"
|
#include "mainwindow.h"
|
||||||
#include "utils.h" // deprecated
|
#include "utils.h" // deprecated
|
||||||
#include "utils_internal.h"
|
#include "utils_internal.h"
|
||||||
|
#include "log_line_entry.h"
|
||||||
#include "process/command.h"
|
#include "process/command.h"
|
||||||
#include "process/update_command.h"
|
#include "process/update_command.h"
|
||||||
#include "process/check_ismas_connectivity_command.h"
|
#include "process/check_ismas_connectivity_command.h"
|
||||||
@ -193,7 +195,28 @@ Worker::Worker(int customerNr,
|
|||||||
, m_dcDownloadJsonFiles(new Command(
|
, m_dcDownloadJsonFiles(new Command(
|
||||||
QString("/opt/app/tools/atbupdate/ATBDownloadDCJsonFiles --set-ppid %1").arg(QCoreApplication::applicationPid())))
|
QString("/opt/app/tools/atbupdate/ATBDownloadDCJsonFiles --set-ppid %1").arg(QCoreApplication::applicationPid())))
|
||||||
//, m_withoutIsmasDirectPort(true) /* useful for testing */ {
|
//, 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 ***
|
// *** check ISMAS connectivity ***
|
||||||
// NOTE: if the customer repository does not exist, then it does not matter
|
// NOTE: if the customer repository does not exist, then it does not matter
|
||||||
@ -202,8 +225,8 @@ Worker::Worker(int customerNr,
|
|||||||
int next = 1;
|
int next = 1;
|
||||||
m_workList.push_back(
|
m_workList.push_back(
|
||||||
std::make_unique<CheckIsmasConnectivityCommand>(
|
std::make_unique<CheckIsmasConnectivityCommand>(
|
||||||
QString("echo ATBUpdateCheck --ismas-connected")
|
//QString("echo ATBUpdateCheck --ismas-connected")
|
||||||
//QString("/opt/app/tools/atbupdate/ATBUpdateCheck --ismas-connected")
|
QString("/opt/app/tools/atbupdate/ATBUpdateCheck --ismas-connected")
|
||||||
, this, ++next));
|
, this, ++next));
|
||||||
|
|
||||||
// *** check if update activated in ISMAS ***
|
// *** check if update activated in ISMAS ***
|
||||||
@ -211,8 +234,8 @@ Worker::Worker(int customerNr,
|
|||||||
// if the update has been activated via ISMAS.
|
// if the update has been activated via ISMAS.
|
||||||
m_workList.push_back(
|
m_workList.push_back(
|
||||||
std::make_unique<CheckUpdateActivationCommand>(
|
std::make_unique<CheckUpdateActivationCommand>(
|
||||||
QString("echo ATBUpdateCheck --update-requested")
|
// QString("echo ATBUpdateCheck --update-requested")
|
||||||
//QString("/opt/app/tools/atbupdate/ATBUpdateCheck --update-requested")
|
QString("/opt/app/tools/atbupdate/ATBUpdateCheck --update-requested")
|
||||||
, this, ++next));
|
, this, ++next));
|
||||||
|
|
||||||
// *** check and fetch git-customer repository ***
|
// *** check and fetch git-customer repository ***
|
||||||
@ -257,8 +280,8 @@ Worker::Worker(int customerNr,
|
|||||||
// send device-controller firmware down to device-controller-hardware
|
// send device-controller firmware down to device-controller-hardware
|
||||||
m_workList.push_back(
|
m_workList.push_back(
|
||||||
std::make_unique<UpdateDCCommand>(
|
std::make_unique<UpdateDCCommand>(
|
||||||
// QString("echo ATBUpdateDC")
|
QString("echo ATBUpdateDC")
|
||||||
QString("/opt/app/tools/atbupdate/ATBUpdateDC")
|
// QString("/opt/app/tools/atbupdate/ATBUpdateDC")
|
||||||
, this, ++next));
|
, this, ++next));
|
||||||
|
|
||||||
// show/send software-status
|
// 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) {
|
void Worker::displayProgressInMainWindow(int progress) {
|
||||||
if (m_mainWindow) {
|
if (m_mainWindow) {
|
||||||
QApplication::postEvent(m_mainWindow,
|
QProgressBar *progressBar = m_mainWindow->progressBar();
|
||||||
new ProgressEvent(this, progress));
|
if (progressBar) {
|
||||||
|
progressBar->setValue(progress);
|
||||||
|
}
|
||||||
|
//QApplication::postEvent(m_mainWindow,
|
||||||
|
// new ProgressEvent(this, progress));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user