Compare commits

...

8 Commits

Author SHA1 Message Date
1ef9853876 Set version of UpdateTool to 1.3.0.
1.3.0: main change: add fetching info for current apiism-version and send
if to ISMAS.
2023-08-30 11:47:56 +02:00
01d8312aa8 Removed rauc/opkg-members. Added m_apismVersion member. 2023-08-30 11:46:55 +02:00
507586f9dc Added fetching apism-version. Fixed calls to final_result(). 2023-08-30 11:46:00 +02:00
12ffa71455 Removed rauc/opkg-versions. Added fetching of apism-version. 2023-08-30 11:44:20 +02:00
a84f495d43 Removed output of rauc/opkg-versions, and added output of apism-version. 2023-08-30 11:42:05 +02:00
7e4b5006eb Fixed return string of final result(). 2023-08-30 11:41:23 +02:00
0a28f0d82c Add message for current APISM version 2023-08-30 11:39:37 +02:00
5427844977 For each customer repository change the file ChangeLog in branch master
as last step. The git commit for this file will be used as output, so this file
has always be the last to be checked in.
2023-08-30 11:36:28 +02:00
7 changed files with 141 additions and 229 deletions

View File

@ -15,7 +15,7 @@ DEFINES += QT_DEPRECATED_WARNINGS
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
VERSION=1.2.0
VERSION=1.3.0
INCLUDEPATH += plugins

View File

@ -120,7 +120,10 @@ QStringList GitClient::gitShowReason() {
// %h: commit (short form)
// %s: commit message
// %cI: commit date, strict ISO 8601 format
Command c("git show -s --format=\"c=%h m=%s d=%cI\"");
// Note: use master branch. By convention, there is a ChangeLog file
// in the root of the repository, which has to be always the last file
// to be checked in when the customer repository somehow changed.
Command c("git show origin/master -s --format=\"c=%h m=%s d=%cI\"");
if (c.execute(m_customerRepository)) {
QString const s = c.getCommandResult().trimmed();
int const c = s.indexOf("c=");

View File

@ -616,8 +616,9 @@ QString IsmasClient::updateOfPSASendVersion(PSAInstalled const &psa) {
"}"
"},"
"\"SOFTWARE\": {"
"\"RAUC\" : \"%s\","
"\"OPKG\" : \"%s\","
"\"APISM\" : {"
"\"VERSION\" : \"%s\""
"},"
"\"ATBQT\" : {"
"\"VERSION\" : \"%s\""
"}"
@ -745,8 +746,7 @@ QString IsmasClient::updateOfPSASendVersion(PSAInstalled const &psa) {
psa.dc.gitBlob.toStdString().c_str(),
psa.dc.gitLastCommit.toStdString().c_str(),
psa.sw.raucVersion.toStdString().c_str(),
psa.sw.opkgVersion.toStdString().c_str(),
psa.sw.apismVersion.toStdString().c_str(),
psa.sw.atbQTVersion.toStdString().c_str(),
psa.pluginVersion.deviceController.toStdString().c_str(),
@ -829,7 +829,7 @@ QString IsmasClient::updateOfPSAActivated(QString const &version) { // sent ev
}
QString IsmasClient::updateOfPSASucceeded(QString const &version) {
m_progressInPercent = 0;
m_progressInPercent = 100;
return updateNewsToIsmas("U0001",
m_progressInPercent,
RESULT_CODE::SUCCESS,
@ -857,13 +857,13 @@ QString IsmasClient::jsonParseFailed(int resultCode, QString reason, QString con
}
std::optional<QString> IsmasClient::finalResult(int resultCode, QString reason, QString const &version) {
m_progressInPercent = 0;
m_progressInPercent = 100;
if (resultCode == RESULT_CODE::SUCCESS) {
return updateNewsToIsmas("U0002",
m_progressInPercent,
RESULT_CODE::SUCCESS,
resultCode,
"FINAL-UPDATE-RESULT",
"(re-)set WAIT state",
reason.toStdString().c_str(),
version.toStdString().c_str());
}
if (resultCode == RESULT_CODE::INSTALL_ERROR) {

View File

@ -46,8 +46,7 @@ struct PSAInstalled {
} dc;
struct SoftWare {
QString raucVersion;
QString opkgVersion;
QString apismVersion;
QString atbQTVersion;
} sw;
@ -97,8 +96,7 @@ struct PSAInstalled {
dc.gitLastCommit = "N/A";
dc.size = -1;
sw.raucVersion = "N/A";
sw.opkgVersion = "N/A";
sw.apismVersion = "N/A";
sw.atbQTVersion = "N/A";
pluginVersion.deviceController = "N/A";

View File

@ -38,8 +38,10 @@ MainWindow::MainWindow(Worker *worker, QWidget *parent)
lst << QString("Machine number : %1 ").arg(m_worker->machineNr()).leftJustified(m_width-3);
lst << QString("Customer number : %1 ").arg(m_worker->customerNr()).leftJustified(m_width-3);
lst << QString("Zone number : %1 (%2)").arg(m_worker->zoneNr()).arg(Utils::zoneName(m_worker->zoneNr())).leftJustified(m_width-3);
lst << QString("APISM version : %1").arg(m_worker->apismVersion()).leftJustified(m_width-3);
lst << QString("").leftJustified(m_width-3, '=');
ui->updateStatus->setText(lst.join('\n'));
ui->updateStatus->setEnabled(true);

View File

@ -57,8 +57,6 @@ Worker::Worker(hwinf *hw,
, m_osVersion(getOsVersion())
, m_atbqtVersion(getATBQTVersion())
, m_cpuSerial(getCPUSerial())
, m_raucVersion(getRaucVersion())
, m_opkgVersion(getOpkgVersion())
, m_pluginVersionATBDeciceController(getPluginVersion("/opt/app/ATBAPP/plugins/libATBDeviceControllerPlugin.so"))
, m_pluginVersionIngenicoISelf(getPluginVersion("/opt/app/ATBAPP/plugins/libIngenicoISelf_CCPlugin.so"))
, m_pluginVersionMobilisisCalc(getPluginVersion("/opt/app/ATBAPP/plugins/libMOBILISIS_CalculatePricePlugin.so"))
@ -76,6 +74,16 @@ Worker::Worker(hwinf *hw,
QDir::setCurrent(m_workingDirectory);
// restart apism to make sure it is running ?
// Command c("systemctl restart apism");
// if (c.execute("/tmp")) {
// QThread::sleep(10); // give APISM some time to reconnect
// }
if (std::optional<QString> v = getApismVersion()) {
m_apismVersion = v.value();
}
qInfo() << "CURRENT TIME ..............." << QDateTime::currentDateTime().toString(Qt::ISODate);
qInfo() << "OS VERSION ................." << m_osVersion;
qInfo() << "ATBQT VERSION .............." << m_atbqtVersion;
@ -88,6 +96,7 @@ Worker::Worker(hwinf *hw,
qInfo() << "ZONE_NR ...................." << m_zoneNr;
qInfo() << "BRANCH_NAME ................" << m_branchName;
qInfo() << "WORKING_DIRECTORY .........." << m_workingDirectory;
qInfo() << "APISM VERSION .............." << m_apismVersion;
this->moveToThread(&m_workerThread);
m_workerThread.start();
@ -141,20 +150,8 @@ void Worker::update() {
void Worker::privateUpdate() {
m_updateProcessRunning = true;
bool sentIsmasLastVersionNotification = false;
//emit appendText("\nRestart APISM ...");
//startProgressLoop();
//Command c("systemctl restart apism");
//if (c.execute("/tmp")) {
// QThread::sleep(10); // give APISM some time to reconnect
// stopProgressLoop();
// emit replaceLast("Restart APISM ...", UPDATE_STEP_DONE);
//} else {
// stopProgressLoop();
// emit replaceLast("Restart APISM ...", UPDATE_STEP_FAIL);
//}
emit disableExit();
@ -208,12 +205,10 @@ void Worker::privateUpdate() {
}
} else {
m_ismasClient.setProgressInPercent(10);
if (backendConnected()) {
m_ismasClient.setProgressInPercent(20);
if (updateTriggerSet()) {
m_ismasClient.setProgressInPercent(30);
m_ismasClient.setProgressInPercent(20);
if (customerEnvironment()) {
m_ismasClient.setProgressInPercent(40);
m_ismasClient.setProgressInPercent(30);
if (filesToUpdate()) {
// send message to ISMAS about files which have been
// checked in into git repository
@ -223,16 +218,16 @@ void Worker::privateUpdate() {
QString("#M=APISM#C=CMD_EVENT#J=") +
m_ismasClient.updateOfPSAContinues("CHECK-FILES-TO-UPDATE",
m_updateStatus.m_statusDescription));
m_ismasClient.setProgressInPercent(50);
m_ismasClient.setProgressInPercent(40);
if (updateFiles(50)) {
m_ismasClient.setProgressInPercent(60);
m_ismasClient.setProgressInPercent(50);
if (syncCustomerRepositoryAndFS()) {
m_ismasClient.setProgressInPercent(70);
m_ismasClient.setProgressInPercent(60);
if (sendIsmasLastVersionNotification()) {
m_ismasClient.setProgressInPercent(80);
m_ismasClient.setProgressInPercent(70);
sentIsmasLastVersionNotification = true;
if (saveLogFile()) {
m_ismasClient.setProgressInPercent(90);
m_ismasClient.setProgressInPercent(80);
IsmasClient::sendRequestReceiveResponse(IsmasClient::APISM::DB_PORT,
QString("#M=APISM#C=CMD_EVENT#J=") +
@ -315,16 +310,6 @@ void Worker::privateUpdate() {
m_updateStatus.m_statusDescription));
m_returnCode = -5;
}
} else {
m_updateStatus = UpdateStatus(UPDATE_STATUS::BACKEND_CHECK_FAILURE,
QString("ISMAS backend not available"));
IsmasClient::sendRequestReceiveResponse(IsmasClient::APISM::DB_PORT,
QString("#M=APISM#C=CMD_EVENT#J=") +
m_ismasClient.updateOfPSAFailed(IsmasClient::RESULT_CODE::INSTALL_ERROR,
"ISMAS-BACKEND-CHECK",
m_updateStatus.m_statusDescription));
m_returnCode = -4;
}
}
m_ismasClient.setProgressInPercent(100);
@ -337,7 +322,6 @@ void Worker::privateUpdate() {
m_updateStatus = UpdateStatus(UPDATE_STATUS::UPDATE_PROCESS_FAILURE,
QString("Update process failed"));
if (std::optional<QString> s = m_ismasClient.finalResult(IsmasClient::RESULT_CODE::INSTALL_ERROR,
"FINAL-UPDATE-RESULT",
m_updateStatus.m_statusDescription)) {
IsmasClient::sendRequestReceiveResponse(IsmasClient::APISM::DB_PORT,
QString("#M=APISM#C=CMD_EVENT#J=") + s.value());
@ -346,9 +330,8 @@ void Worker::privateUpdate() {
emit appendText(QString("UPDATE "), UPDATE_STEP_SUCCESS);
m_updateStatus = UpdateStatus(UPDATE_STATUS::UPDATE_PROCESS_SUCCESS,
QString("Update process succeeded"));
QString("Update process succeeded. Reset WAIT."));
if (std::optional<QString> s = m_ismasClient.finalResult(IsmasClient::RESULT_CODE::SUCCESS,
"FINAL-UPDATE-RESULT",
m_updateStatus.m_statusDescription)) {
IsmasClient::sendRequestReceiveResponse(IsmasClient::APISM::DB_PORT,
QString("#M=APISM#C=CMD_EVENT#J=") + s.value());
@ -365,34 +348,20 @@ void Worker::privateUpdate() {
emit restartExitTimer();
}
bool Worker::backendConnected() {
// deactivated: REQ_SELF does not really help. Observation was that even
// id ISMAS is reported as 'true', a following check of the update-trigger
// button has no access to ISMAS.
return true;
emit appendText("\nConnecting backend ...");
if (false) { // so linker removes dead code
for (int repeat = 0; repeat < 100; ++repeat) {
qInfo() << "REPEAT" << repeat << "In backendConnected() -> #M=APISM#C=REQ_SELF#J={}";
startProgressLoop();
std::optional<QString> Worker::getApismVersion() {
for (int repeat = 0; repeat < 10; ++repeat) {
qInfo() << "REPEAT" << repeat << "In getApismVersion() -> #M=APISM#C=REQ_SELF#J={}";
std::optional<QString> result
= IsmasClient::sendRequestReceiveResponse(
IsmasClient::APISM::DIRECT_PORT, "#M=APISM#C=REQ_SELF#J={}");
if (result) {
stopProgressLoop();
int progress = (m_mainWindow->progressValue()/10) + 10;
setProgress(progress);
QString msg = result.value();
qInfo() << "In backendConnected() -> APISM response" << msg;
qInfo() << "In getApismVersion() -> APISM response" << msg;
QJsonParseError parseError;
QJsonDocument document(QJsonDocument::fromJson(msg.toUtf8(), &parseError));
if (parseError.error != QJsonParseError::NoError) {
qCritical() << "(1) INVALID JSON MSG: PARSING FAILED (msg=" << msg << "):"
<< parseError.error << parseError.errorString();
setProgress(100);
m_updateStatus = UpdateStatus(UPDATE_STATUS::JSON_PARSE_FAILURE,
QString("(2) INVALID JSON %1 %2 %3")
.arg(msg)
@ -402,100 +371,39 @@ bool Worker::backendConnected() {
QString("#M=APISM#C=CMD_EVENT#J=") +
m_ismasClient.jsonParseFailed(IsmasClient::RESULT_CODE::INSTALL_ERROR,
m_updateStatus.m_statusDescription));
emit replaceLast("Connecting backend ...", UPDATE_STEP_FAIL);
return false;
return std::nullopt;
}
if (!document.isObject()) {
qCritical() << "FILE IS NOT A JSON OBJECT!";
setProgress(100);
m_updateStatus = UpdateStatus(UPDATE_STATUS::JSON_PARSE_FAILURE,
QString("NOT A JSON-OBJECT %1").arg(msg));
IsmasClient::sendRequestReceiveResponse(IsmasClient::APISM::DB_PORT,
QString("#M=APISM#C=CMD_EVENT#J=") +
m_ismasClient.jsonParseFailed(IsmasClient::RESULT_CODE::INSTALL_ERROR,
m_updateStatus.m_statusDescription));
emit replaceLast("Connecting backend ...", UPDATE_STEP_FAIL);
return false;
return std::nullopt;
}
setProgress(progress + 1);
QJsonObject obj = document.object();
QStringList keys = obj.keys().filter("CMD_GET_APISMSTATUS_RESPONSE");
if (keys.size() == 1) {
QString const key = keys.at(0);
QJsonValue v = obj.value(key);
if (v.isObject()) {
obj = v.toObject();
bool ismas = obj.value("ISMAS").toBool();
QString status = obj.value("Broker").toString();
qInfo() << "REPEAT" << repeat << "In backendConnected() Broker=<"
<< status << ">, ISMAS=<" << (ismas ? "true>" : "false>");
if (ismas) {
if (status == "Connected") {
// do not send, as this would result in a corrupted wait button
// but update the user-interface
setProgress(100);
emit replaceLast("Connecting backend ...", UPDATE_STEP_OK);
return true;
}
}
m_updateStatus = UpdateStatus(UPDATE_STATUS::BACKEND_CHECK,
QString ("REPEAT %1 Broker=<").arg(repeat)
+ status + ">, ISMAS=<" + (ismas ? "true>" : "false>"));
//IsmasClient::sendRequestReceiveResponse(IsmasClient::APISM::DB_PORT,
// QString("#M=APISM#C=CMD_EVENT#J=") +
// m_ismasClient.updateOfPSAContinues("BACKEND-CHECK", m_updateStatus.m_statusDescription));
qInfo() << "BACKEND-CHECK" << m_updateStatus.m_statusDescription;
emit showErrorMessage("Check backend connection", m_updateStatus.m_statusDescription);
QThread::sleep(6);
continue;
} else {
setProgress(100);
m_updateStatus = UpdateStatus(UPDATE_STATUS::BACKEND_CHECK_FAILURE,
"CMD_GET_APISM_STATUS_RESPONSE KEY NOT A JSON-OBJECT");
IsmasClient::sendRequestReceiveResponse(IsmasClient::APISM::DB_PORT,
QString("#M=APISM#C=CMD_EVENT#J=") +
m_ismasClient.sanityCheckFailed(IsmasClient::RESULT_CODE::INSTALL_ERROR,
m_updateStatus.m_statusDescription));
emit showErrorMessage("check backend connection", m_updateStatus.m_statusDescription);
emit replaceLast("Connecting backend ...", UPDATE_STEP_FAIL);
return false;
}
} else {
setProgress(100);
if (keys.size() != 1) {
m_updateStatus = UpdateStatus(UPDATE_STATUS::BACKEND_CHECK_FAILURE,
"CMD_GET_APISMSTATUS_RESPONSE KEY NOT AVAILABLE");
IsmasClient::sendRequestReceiveResponse(IsmasClient::APISM::DB_PORT,
QString("#M=APISM#C=CMD_EVENT#J=") +
m_ismasClient.sanityCheckFailed(IsmasClient::RESULT_CODE::INSTALL_ERROR,
m_updateStatus.m_statusDescription));
emit showErrorMessage("check backend connection", m_updateStatus.m_statusDescription);
emit replaceLast("Connecting backend ...", UPDATE_STEP_FAIL);
return false;
}
emit showErrorMessage("apism response", m_updateStatus.m_statusDescription);
return std::nullopt;
} else {
stopProgressLoop();
int progress = (m_mainWindow->progressValue()/10) + 10;
setProgress(progress);
QString const key = keys.at(0);
QJsonValue v = obj.value(key);
return v.toObject().value("Version").toString();
}
} else {
QThread::sleep(1);
}
}
setProgress(100);
emit replaceLast("Connecting backend", UPDATE_STEP_FAIL);
emit showErrorMessage("Error", "Backend not available");
m_updateStatus = UpdateStatus(UPDATE_STATUS::BACKEND_NOT_CONNECTED,
QString("NO BACKEND CONNECTION"));
IsmasClient::sendRequestReceiveResponse(IsmasClient::APISM::DB_PORT,
QString("#M=APISM#C=CMD_EVENT#J=") +
m_ismasClient.errorBackendNotConnected(m_updateStatus.m_statusDescription, ""));
}
return false;
return std::nullopt;
}
#define CHECK_UPDATE_TRIGGER_SET "Check update trigger ..."
@ -1212,8 +1120,7 @@ PSAInstalled Worker::getPSAInstalled() {
psaInstalled.dc.gitLastCommit = "N/A";
psaInstalled.dc.size = -1;
psaInstalled.sw.raucVersion = m_raucVersion;
psaInstalled.sw.opkgVersion = m_opkgVersion;
psaInstalled.sw.apismVersion = m_apismVersion;
psaInstalled.sw.atbQTVersion = m_atbqtVersion;
psaInstalled.pluginVersion.deviceController = m_pluginVersionATBDeciceController;

View File

@ -9,6 +9,8 @@
#include <QJsonObject>
#include <QHash>
#include <optional>
#include "worker_thread.h"
#include "update.h"
#include "git/git_client.h"
@ -88,8 +90,6 @@ class Worker : public QObject {
QString const m_osVersion;
QString const m_atbqtVersion;
QString const m_cpuSerial;
QString const m_raucVersion;
QString const m_opkgVersion;
QString const m_pluginVersionATBDeciceController;
QString const m_pluginVersionIngenicoISelf;
QString const m_pluginVersionMobilisisCalc;
@ -111,6 +111,7 @@ class Worker : public QObject {
MainWindow *m_mainWindow;
int m_progressValue;
bool m_withoutIsmasDirectPort;
QString m_apismVersion;
bool executeOpkgCommand(QString opkgCommand);
QString getOsVersion() const;
@ -155,6 +156,7 @@ public:
int machineNr() const { return m_machineNr; }
int customerNr() const { return m_customerNr; }
int zoneNr() const { return m_zoneNr; }
QString apismVersion() const { return m_apismVersion; }
//friend QDebug operator<<(QDebug debug, Worker const &w) {
// Q_UNUSED(w);
@ -179,7 +181,6 @@ public slots:
void update();
private slots:
bool backendConnected();
bool updateTriggerSet();
bool customerEnvironment();
bool filesToUpdate();
@ -191,6 +192,7 @@ private slots:
private:
PSAInstalled getPSAInstalled();
void privateUpdate();
std::optional<QString> getApismVersion();
};
#endif // WORKER_H_INCLUDED