46 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
a45e552d90 set version to 1.2.0 2023-08-25 08:46:29 +02:00
be28570d23 Minor change for output in status bar. 2023-08-23 16:27:47 +02:00
1509e8619c Send message to ISMAS when rsyncing a traiff-file 2023-08-23 16:26:55 +02:00
a8df026a80 Added rsyncFile() method. 2023-08-23 16:26:11 +02:00
a803907449 Refined information shown in status bar. 2023-08-22 13:49:42 +02:00
afd31f1b27 Fill in opkg related info. 2023-08-22 13:49:09 +02:00
f8fef38009 Add last-commit for traiff and add info for opkg_commands. 2023-08-22 13:47:57 +02:00
cbe1fd387d After "rsync", compare etc/psa_tariff and /etc/psa_tariff, if they contain the
same traiff-files (as they should).
2023-08-22 12:31:15 +02:00
1620b73d01 Added sameFilesInDirs(): check for two different directories if the contain the
same files (comparison by name and by git-blob).
2023-08-22 12:29:52 +02:00
4ebdcf56a0 Clear message before showing a new one. 2023-08-22 12:21:17 +02:00
99b9419150 Made gitBlob() static and execute in /tmp as this command can be executed
for every file not only the files contained in a git repository.
2023-08-22 12:19:25 +02:00
4307fb96a6 Add status bar instead of using an message box for displaying error messages. 2023-08-22 09:27:59 +02:00
c35390b6d6 removed commented code plannned for future use -> did not work 2023-08-22 09:27:20 +02:00
fff6bd2b49 Make room for status bar 2023-08-22 09:25:02 +02:00
631ade1954 Show the executed opkg-commands in the text edit. 2023-08-18 11:53:32 +02:00
337bdd1bb0 Add some debug output when restarting APISM. APISM is give a delay of 20s when restarting. 2023-08-18 11:52:34 +02:00
978cc16304 added signal onReplaceLast for QStringList 2023-08-18 11:51:27 +02:00
bea8242d6f Add some changes to the message box (to be chenged anyways later). 2023-08-18 11:50:14 +02:00
56daa84a14 Streamlined the connects (without any whitespace) to silence clang. 2023-08-18 11:49:34 +02:00
17ddfd0ddd Added slot onReplaceLast() to handle adding a QStringList to the text edit. 2023-08-18 11:48:29 +02:00
2ac8c4cfc6 Added scrollDownTextEdit() -> text edit is supposed to scroll down autmatically
in case too much info has to be displayed.
2023-08-18 11:46:57 +02:00
0559ff64e2 Extended some debug output 2023-08-18 11:42:47 +02:00
385a7b7b00 Added utility rstrip() to remove whitespace at the right end of a string. 2023-08-18 11:41:16 +02:00
503b7c64f9 Added some comments to prepare for future change. 2023-08-18 11:39:00 +02:00
beec9c2f9d Added properties to text edit:
Qt::ScrollBarAsNeeded, Qt::ScrollBarAsNeeded, QAbstractScrollArea::AdjustToContents.
2023-08-18 11:37:24 +02:00
5263b7de0f Removed some DEBUG-output. 2023-08-16 12:42:10 +02:00
9b4d0494c8 Streamlined handling of UPDATE_STATUS. 2023-08-16 12:41:42 +02:00
0f2ee0349f Improved debug output. 2023-08-16 10:39:46 +02:00
e700a40875 Initialize psaInstalled.versionInfo to be sent to ISMAS in sendLastVersion(). 2023-08-16 10:38:36 +02:00
1eba5338e4 Removed obsolete sendCmdSendVersionToIsmas(). 2023-08-16 10:37:59 +02:00
f20be9ddcf Removed obsolete sendCmdSendVersionToIsmas(). 2023-08-16 10:37:31 +02:00
7631c05e22 Insert last commit-id, message and date of last commit into sendLastVersion-message to ISMAS. 2023-08-16 10:34:55 +02:00
ad93e536f0 Added gitShowReason(): get lastCommit, message and date of last commit to insert inti
sendLastVersion-message to ISMAS.
2023-08-16 10:33:08 +02:00
259da8200e Fixed known defaults for starting ATBUpdateTool. 2023-08-14 15:08:00 +02:00
8d528f0f55 SO_SNDTIMEO and SO_RCVTIMEO socket options have turned out not to be reliable.
Use select() for detecting timeout on socket (read and write).
2023-08-14 14:35:54 +02:00
66d0214720 Always look for {"error": "ISMAS is offline"} first.
Allow for empty update-trgger (try again)
rsync: mkdir -p the necessary directories.
2023-08-14 14:33:12 +02:00
86064979b4 Add memeber-variable for exitCode of executed process. 2023-08-14 14:28:23 +02:00
86c996d7ac Set final version to 1.1.1w 2023-08-11 12:24:51 +02:00
15 changed files with 875 additions and 548 deletions

View File

@@ -15,7 +15,7 @@ DEFINES += QT_DEPRECATED_WARNINGS
# In order to do so, uncomment the following line. # 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. # 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 #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
VERSION=1.0.0 VERSION=1.3.0
INCLUDEPATH += plugins INCLUDEPATH += plugins

View File

@@ -114,6 +114,50 @@ bool GitClient::gitCloneAndCheckoutBranch() {
return false; return false;
} }
QStringList GitClient::gitShowReason() {
QStringList lst;
if (QDir(m_customerRepository).exists()) {
// %h: commit (short form)
// %s: commit message
// %cI: commit date, strict ISO 8601 format
// 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=");
int const m = s.indexOf("m=");
int const d = s.indexOf("d=");
QString commit{""}, msg{""}, date{""};
if (c != -1) {
int start = c + 2;
if (m >= start) {
int length = m - start;
commit = s.mid(start, length).trimmed();
start = m + 2;
if (d >= start) {
length = d - start;
msg = s.mid(start, length).trimmed();
start = d + 2;
date = s.mid(start);
}
}
if (!commit.isEmpty() && !msg.isEmpty() && !date.isEmpty()) {
lst << commit << msg << date;
}
}
}
} else {
qCritical() << "CUSTOMER_REPOSITORY" << m_customerRepository
<< "DOES NOT EXIST";
}
return lst;
}
/* /*
Zu beachten: wird eine datei neu hinzugefuegt (git add/commit) dann aber gleich Zu beachten: wird eine datei neu hinzugefuegt (git add/commit) dann aber gleich
wieder geloscht, so wird sie im diff nicht angezeigt. wieder geloscht, so wird sie im diff nicht angezeigt.
@@ -289,7 +333,7 @@ QString GitClient::gitBlob(QString fileName) {
if (fi.exists()) { if (fi.exists()) {
QString const gitCommand = QString("git hash-object %1").arg(fileName); QString const gitCommand = QString("git hash-object %1").arg(fileName);
Command c(gitCommand); Command c(gitCommand);
if (c.execute(m_workingDirectory)) { if (c.execute("/tmp")) {
return c.getCommandResult().trimmed(); return c.getCommandResult().trimmed();
} }
} }

View File

@@ -50,7 +50,8 @@ class GitClient : public QObject {
std::optional<QStringList> gitMerge(); std::optional<QStringList> gitMerge();
QString gitLastCommit(QString fileName); QString gitLastCommit(QString fileName);
QString gitBlob(QString fileName); QStringList gitShowReason();
static QString gitBlob(QString fileName);
QString gitCommitForBlob(QString blob); QString gitCommitForBlob(QString blob);
bool gitIsFileTracked(QString file2name); bool gitIsFileTracked(QString file2name);
}; };

View File

@@ -137,7 +137,12 @@ IsmasClient::sendRequestReceiveResponse(int port, QString const &request) {
so_linger.l_onoff = 1; so_linger.l_onoff = 1;
so_linger.l_linger = 0; so_linger.l_linger = 0;
int maxfdp1;
fd_set rset;
fd_set wset;
setsockopt(sockfd, SOL_SOCKET, SO_LINGER, &so_linger, sizeof(so_linger)); setsockopt(sockfd, SOL_SOCKET, SO_LINGER, &so_linger, sizeof(so_linger));
// no reliable, but does not harm, as we use select() as well
setsockopt(sockfd, SOL_SOCKET, SO_SNDTIMEO, &tv, sizeof(tv)); setsockopt(sockfd, SOL_SOCKET, SO_SNDTIMEO, &tv, sizeof(tv));
setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv)); setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv));
int flag = 1; int flag = 1;
@@ -151,24 +156,56 @@ IsmasClient::sendRequestReceiveResponse(int port, QString const &request) {
int loop = 0; int loop = 0;
int bytesWritten = 0; int bytesWritten = 0;
while (bytesWritten < bytesToWrite) { while (bytesWritten < bytesToWrite) {
int n = ::sendto(sockfd, buf+bytesWritten, bytesToWrite-bytesWritten, 0, NULL, 0); errno = 0;
if (n >= 0) { FD_ZERO(&wset);
bytesWritten += n; FD_SET(sockfd, &wset);
} else { maxfdp1 = sockfd + 1;
if (errno == EWOULDBLOCK) { tv.tv_sec = 60; /* 60 secs timeout for read and write -> APISM cuts the connection after 30s */
if (++loop < 10) { tv.tv_usec = 0;
QThread::msleep(500);
continue; int const w = select(maxfdp1, NULL, &wset, NULL, &tv);
} if (w < 0) { // error
printErrorMessage(port, clientIP, clientPort,
QString("WRITE TIMEOUT %1(").arg(loop) + strerror(errno) + ")");
::close(sockfd);
return std::nullopt;
} else
if (errno == EINTR) { if (errno == EINTR) {
printErrorMessage(port, clientIP, clientPort, printErrorMessage(port, clientIP, clientPort,
QString("WRITE INTERRUPTED BY SIGNAL (1) (") + strerror(errno) + ")"); QString("INTERRUPTED BY SIGNAL (1) (") + strerror(errno) + ")");
continue; continue;
} else {
printErrorMessage(port, clientIP, clientPort,
QString("SELECT-ERROR (WRITE) %1(").arg(loop) + strerror(errno) + ")");
::close(sockfd);
return std::nullopt;
}
} else
if (w == 0) { // timeout
printErrorMessage(port, clientIP, clientPort,
QString("SELECT-TIMEOUT (WRITE) %1(").arg(loop) + strerror(errno) + ")");
if (++loop < 10) {
QThread::msleep(500);
continue;
}
::close(sockfd);
return std::nullopt;
} else
if (w > 0) {
int n = ::sendto(sockfd, buf+bytesWritten, bytesToWrite-bytesWritten, 0, NULL, 0);
if (n >= 0) {
bytesWritten += n;
} else {
if (errno == EWOULDBLOCK) {
if (++loop < 10) {
QThread::msleep(500);
continue;
}
printErrorMessage(port, clientIP, clientPort,
QString("WRITE TIMEOUT %1(").arg(loop) + strerror(errno) + ")");
::close(sockfd);
return std::nullopt;
} else
if (errno == EINTR) {
printErrorMessage(port, clientIP, clientPort,
QString("WRITE INTERRUPTED BY SIGNAL (1) (") + strerror(errno) + ")");
continue;
}
} }
} }
} }
@@ -180,7 +217,7 @@ IsmasClient::sendRequestReceiveResponse(int port, QString const &request) {
// QString("CANNOT CLOSE WRITING END (") + strerror(errno) + ")"); // QString("CANNOT CLOSE WRITING END (") + strerror(errno) + ")");
// } // }
printInfoMessage(port, clientIP, clientPort, QString("MESSAGE SENT ") + buf); printInfoMessage(port, clientIP, clientPort, QString("MESSAGE SENT <<<") + buf + ">>>");
loop = 0; loop = 0;
bzero(buf, sizeof(buf)); bzero(buf, sizeof(buf));
@@ -188,33 +225,69 @@ IsmasClient::sendRequestReceiveResponse(int port, QString const &request) {
int bytesRead = 0; int bytesRead = 0;
while (bytesRead < bytesToRead) { while (bytesRead < bytesToRead) {
errno = 0; errno = 0;
int n = ::recvfrom(sockfd, buf+bytesRead, bytesToRead-bytesRead, FD_ZERO(&rset);
0, NULL, NULL); FD_SET(sockfd, &rset);
if (n > 0) { // maxfdp1 = sockfd + 1;
bytesRead += n; tv.tv_sec = 60; /* 60 secs timeout for read and write */
} else tv.tv_usec = 0;
if (n == 0) {
// The return value will be 0 when the peer has performed an orderly shutdown. QString const selectStart = QDateTime::currentDateTime().toString(Qt::ISODateWithMs);
printErrorMessage(port, clientIP, clientPort,
QString("PEER CLOSED CONNECTION (") + strerror(errno) + ")"); int const r = select(maxfdp1, &rset, NULL, NULL, &tv);
::close(sockfd); if (r < 0) { // error
return std::nullopt;
} else
if (n < 0) {
if (errno == EWOULDBLOCK) {
if (++loop < 10) {
QThread::msleep(500);
continue;
}
printErrorMessage(port, clientIP, clientPort,
QString("READ TIMEOUT %1(").arg(loop) + strerror(errno) + ")");
::close(sockfd);
return std::nullopt;
}
if (errno == EINTR) { if (errno == EINTR) {
printErrorMessage(port, clientIP, clientPort, printErrorMessage(port, clientIP, clientPort,
QString("INTERRUPTED BY SIGNAL (2) (") + strerror(errno) + ")"); QString("INTERRUPTED BY SIGNAL (2) (") + strerror(errno) + ")");
continue; continue;
} else {
printErrorMessage(port, clientIP, clientPort,
QString("SELECT-ERROR (READ) %1(").arg(loop) + strerror(errno) + ")");
::close(sockfd);
return std::nullopt;
}
} else
if (r == 0) { // timeout
printErrorMessage(port, clientIP, clientPort,
QString("SELECT-TIMEOUT (READ) %1(").arg(loop) + strerror(errno) + ")");
if (++loop < 10) {
QThread::msleep(500);
continue;
}
::close(sockfd);
return std::nullopt;
} else
if (r > 0) {
if (FD_ISSET(sockfd, &rset)) {
int n = ::recvfrom(sockfd, buf+bytesRead, bytesToRead-bytesRead,
0, NULL, NULL);
if (n > 0) { //
bytesRead += n;
} else
if (n == 0) {
// The return value will be 0 when the peer has performed an orderly shutdown.
printErrorMessage(port, clientIP, clientPort,
QString("PEER CLOSED CONNECTION (") + strerror(errno) + ") START AT" +
selectStart + " NOW " + QDateTime::currentDateTime().toString(Qt::ISODateWithMs));
::close(sockfd);
return std::nullopt;
} else
if (n < 0) {
if (errno == EWOULDBLOCK) { // check just in case
if (++loop < 10) {
QThread::msleep(500);
continue;
}
printErrorMessage(port, clientIP, clientPort,
QString("READ TIMEOUT %1(").arg(loop) + strerror(errno) + ")");
::close(sockfd);
return std::nullopt;
}
if (errno == EINTR) {
printErrorMessage(port, clientIP, clientPort,
QString("INTERRUPTED BY SIGNAL (2) (") + strerror(errno) + ")");
continue;
}
}
} }
} }
@@ -320,6 +393,15 @@ QString IsmasClient::execOpkgCommand(QString const &info, QString const &version
version.toStdString().c_str()); version.toStdString().c_str());
} }
QString IsmasClient::rsyncFile(QString const &info, QString const &version) {
return updateNewsToIsmas("U0010",
m_progressInPercent,
RESULT_CODE::SUCCESS,
"RSYNC FILE",
info.toStdString().c_str(),
version.toStdString().c_str());
}
QString IsmasClient::updateTriggerSet(QString const &info, QString const &version) { QString IsmasClient::updateTriggerSet(QString const &info, QString const &version) {
return updateNewsToIsmas("U0010", return updateNewsToIsmas("U0010",
m_progressInPercent, m_progressInPercent,
@@ -345,13 +427,11 @@ QString IsmasClient::updateOfPSASendVersion(PSAInstalled const &psa) {
static char buf[4096*2]; static char buf[4096*2];
memset(buf, 0, sizeof(buf)); memset(buf, 0, sizeof(buf));
QString const ts = QDateTime::currentDateTime().toString(Qt::ISODateWithMs);
QString sendVersionHash = "N/A";
// local data="#M=APISM#C=CMD_SENDVERSION#J= // local data="#M=APISM#C=CMD_SENDVERSION#J=
snprintf(buf, sizeof(buf)-1, snprintf(buf, sizeof(buf)-1,
"{" "{"
"\"VERSION_INFO\" : {" "\"VERSION_INFO\" : {"
"\"REASON\":\"%s\","
"\"CREATED\":\"%s\"," "\"CREATED\":\"%s\","
"\"HASH\":\"%s\"" "\"HASH\":\"%s\""
"}," "},"
@@ -361,6 +441,13 @@ QString IsmasClient::updateOfPSASendVersion(PSAInstalled const &psa) {
"\"ZONE\" : %d," "\"ZONE\" : %d,"
"\"INFO\" : \"%s\"," "\"INFO\" : \"%s\","
"\"BLOB\" : \"%s\"," "\"BLOB\" : \"%s\","
"\"LAST-COMMIT\" : \"%s\","
"\"SIZE\" : %d,"
"\"LOADED\" : \"%s\""
"},"
"\"OPKG_COMMANDS\" : {"
"\"BLOB\" : \"%s\","
"\"LAST-COMMIT\" : \"%s\","
"\"SIZE\" : %d," "\"SIZE\" : %d,"
"\"LOADED\" : \"%s\"" "\"LOADED\" : \"%s\""
"}," "},"
@@ -529,8 +616,9 @@ QString IsmasClient::updateOfPSASendVersion(PSAInstalled const &psa) {
"}" "}"
"}," "},"
"\"SOFTWARE\": {" "\"SOFTWARE\": {"
"\"RAUC\" : \"%s\"," "\"APISM\" : {"
"\"OPKG\" : \"%s\"," "\"VERSION\" : \"%s\""
"},"
"\"ATBQT\" : {" "\"ATBQT\" : {"
"\"VERSION\" : \"%s\"" "\"VERSION\" : \"%s\""
"}" "}"
@@ -559,17 +647,24 @@ QString IsmasClient::updateOfPSASendVersion(PSAInstalled const &psa) {
"}" "}"
"}" "}"
"}", "}",
ts.toStdString().c_str(), psa.versionInfo.reason.toStdString().c_str(),
sendVersionHash.toStdString().c_str(), psa.versionInfo.created.toStdString().c_str(),
psa.versionInfo.lastCommit.toStdString().c_str(),
psa.tariff.version.toStdString().c_str(), psa.tariff.version.toStdString().c_str(),
psa.tariff.project.toStdString().c_str(), psa.tariff.project.toStdString().c_str(),
psa.tariff.zone, psa.tariff.zone,
psa.tariff.info.toStdString().c_str(), psa.tariff.info.toStdString().c_str(),
psa.tariff.blob.toStdString().c_str(), psa.tariff.blob.toStdString().c_str(),
psa.tariff.lastCommit.toStdString().c_str(),
psa.tariff.size, psa.tariff.size,
psa.tariff.loadTime.toStdString().c_str(), psa.tariff.loadTime.toStdString().c_str(),
psa.opkg.blob.toStdString().c_str(),
psa.opkg.lastCommit.toStdString().c_str(),
psa.opkg.size,
psa.opkg.loadTime.toStdString().c_str(),
psa.cash.blob.toStdString().c_str(), psa.cash.blob.toStdString().c_str(),
psa.cash.size, psa.cash.size,
psa.conf.blob.toStdString().c_str(), psa.conf.blob.toStdString().c_str(),
@@ -651,8 +746,7 @@ QString IsmasClient::updateOfPSASendVersion(PSAInstalled const &psa) {
psa.dc.gitBlob.toStdString().c_str(), psa.dc.gitBlob.toStdString().c_str(),
psa.dc.gitLastCommit.toStdString().c_str(), psa.dc.gitLastCommit.toStdString().c_str(),
psa.sw.raucVersion.toStdString().c_str(), psa.sw.apismVersion.toStdString().c_str(),
psa.sw.opkgVersion.toStdString().c_str(),
psa.sw.atbQTVersion.toStdString().c_str(), psa.sw.atbQTVersion.toStdString().c_str(),
psa.pluginVersion.deviceController.toStdString().c_str(), psa.pluginVersion.deviceController.toStdString().c_str(),
@@ -735,7 +829,7 @@ QString IsmasClient::updateOfPSAActivated(QString const &version) { // sent ev
} }
QString IsmasClient::updateOfPSASucceeded(QString const &version) { QString IsmasClient::updateOfPSASucceeded(QString const &version) {
m_progressInPercent = 0; m_progressInPercent = 100;
return updateNewsToIsmas("U0001", return updateNewsToIsmas("U0001",
m_progressInPercent, m_progressInPercent,
RESULT_CODE::SUCCESS, RESULT_CODE::SUCCESS,
@@ -763,13 +857,13 @@ QString IsmasClient::jsonParseFailed(int resultCode, QString reason, QString con
} }
std::optional<QString> IsmasClient::finalResult(int resultCode, QString reason, QString const &version) { std::optional<QString> IsmasClient::finalResult(int resultCode, QString reason, QString const &version) {
m_progressInPercent = 0; m_progressInPercent = 100;
if (resultCode == RESULT_CODE::SUCCESS) { if (resultCode == RESULT_CODE::SUCCESS) {
return updateNewsToIsmas("U0002", return updateNewsToIsmas("U0002",
m_progressInPercent, m_progressInPercent,
RESULT_CODE::SUCCESS, resultCode,
"FINAL-UPDATE-RESULT", "FINAL-UPDATE-RESULT",
"(re-)set WAIT state", reason.toStdString().c_str(),
version.toStdString().c_str()); version.toStdString().c_str());
} }
if (resultCode == RESULT_CODE::INSTALL_ERROR) { if (resultCode == RESULT_CODE::INSTALL_ERROR) {

View File

@@ -7,6 +7,12 @@
#include <optional> #include <optional>
struct PSAInstalled { struct PSAInstalled {
struct VersionInfo {
QString created;
QString reason;
QString lastCommit;
} versionInfo;
struct Tariff { struct Tariff {
QString name; QString name;
QString version; QString version;
@@ -24,6 +30,13 @@ struct PSAInstalled {
QString cpuSerial; QString cpuSerial;
} hw; } hw;
struct Opkg {
int size;
QString blob;
QString lastCommit;
QString loadTime;
} opkg;
struct DC { struct DC {
QString versionHW; QString versionHW;
QString versionSW; QString versionSW;
@@ -33,8 +46,7 @@ struct PSAInstalled {
} dc; } dc;
struct SoftWare { struct SoftWare {
QString raucVersion; QString apismVersion;
QString opkgVersion;
QString atbQTVersion; QString atbQTVersion;
} sw; } sw;
@@ -73,14 +85,18 @@ struct PSAInstalled {
hw.linuxVersion = "N/A"; hw.linuxVersion = "N/A";
hw.cpuSerial = "N/A"; hw.cpuSerial = "N/A";
opkg.size = -1;
opkg.blob = "N/A";
opkg.lastCommit = "N/A";
opkg.loadTime = "N/A";
dc.versionHW = "N/A"; dc.versionHW = "N/A";
dc.versionSW = "N/A"; dc.versionSW = "N/A";
dc.gitBlob = "N/A"; dc.gitBlob = "N/A";
dc.gitLastCommit = "N/A"; dc.gitLastCommit = "N/A";
dc.size = -1; dc.size = -1;
sw.raucVersion = "N/A"; sw.apismVersion = "N/A";
sw.opkgVersion = "N/A";
sw.atbQTVersion = "N/A"; sw.atbQTVersion = "N/A";
pluginVersion.deviceController = "N/A"; pluginVersion.deviceController = "N/A";
@@ -153,6 +169,7 @@ public:
QString errorUpdateTrigger(QString const &info, QString const &version = QString()); QString errorUpdateTrigger(QString const &info, QString const &version = QString());
QString gitFetch(QString const &info, QString const &version = QString()); QString gitFetch(QString const &info, QString const &version = QString());
QString execOpkgCommand(QString const &info, QString const &version = QString()); QString execOpkgCommand(QString const &info, QString const &version = QString());
QString rsyncFile(QString const &info, QString const &version = QString());
QString errorGitFetch(int resultCode, QString const &info, QString const &version = QString()); QString errorGitFetch(int resultCode, QString const &info, QString const &version = QString());
QString updateOfPSAActivated(QString const &version = QString()); QString updateOfPSAActivated(QString const &version = QString());
// and update accepted // and update accepted

View File

@@ -31,6 +31,7 @@
#include "utils.h" #include "utils.h"
#include <QThread> #include <QThread>
#include <QtWidgets>
#ifdef PTU5 #ifdef PTU5
#define SERIAL_PORT "ttymxc2" #define SERIAL_PORT "ttymxc2"
@@ -65,7 +66,7 @@ int main(int argc, char *argv[]) {
QCommandLineOption pluginDirectoryOption(QStringList() << "plugin-directory" << "plugin-directory", QCommandLineOption pluginDirectoryOption(QStringList() << "plugin-directory" << "plugin-directory",
QCoreApplication::translate("main", "Where to find dc-plugin."), QCoreApplication::translate("main", "Where to find dc-plugin."),
QCoreApplication::translate("main", "directory")); QCoreApplication::translate("main", "directory"));
QString const pluginDefault = "./plugins"; QString const pluginDefault = "/usr/lib";
pluginDirectoryOption.setDefaultValue(pluginDefault); pluginDirectoryOption.setDefaultValue(pluginDefault);
parser.addOption(pluginDirectoryOption); parser.addOption(pluginDirectoryOption);
@@ -79,7 +80,7 @@ int main(int argc, char *argv[]) {
QCommandLineOption workingDirectoryOption(QStringList() << "working-directory" << "working-directory", QCommandLineOption workingDirectoryOption(QStringList() << "working-directory" << "working-directory",
QCoreApplication::translate("main", "working directory of update-script."), QCoreApplication::translate("main", "working directory of update-script."),
QCoreApplication::translate("main", "directory")); QCoreApplication::translate("main", "directory"));
QString const workingDirectoryDefault = "."; QString const workingDirectoryDefault = "/opt/app/tools/atbupdate";
workingDirectoryOption.setDefaultValue(workingDirectoryDefault); workingDirectoryOption.setDefaultValue(workingDirectoryDefault);
parser.addOption(workingDirectoryOption); parser.addOption(workingDirectoryOption);
@@ -87,14 +88,6 @@ int main(int argc, char *argv[]) {
QCoreApplication::translate("main", "Start ATBUpdateTool in dry-run-mode. No actual actions.")); QCoreApplication::translate("main", "Start ATBUpdateTool in dry-run-mode. No actual actions."));
parser.addOption(dryRunOption); parser.addOption(dryRunOption);
// TODO:
// add some additional parameters
// --dry-run
// -d: only update device-controller firmware
// -j: only update json-files
// -o: only execute opkg-commnds
// -f: force. update_psa shall always perform a 'git pull'
// Process the actual command line arguments given by the user // Process the actual command line arguments given by the user
parser.process(a); parser.process(a);
QString plugInDir = parser.value(pluginDirectoryOption); QString plugInDir = parser.value(pluginDirectoryOption);
@@ -103,9 +96,6 @@ int main(int argc, char *argv[]) {
bool dryRun = parser.isSet(dryRunOption); bool dryRun = parser.isSet(dryRunOption);
QString const rtPath = QCoreApplication::applicationDirPath(); QString const rtPath = QCoreApplication::applicationDirPath();
if (plugInDir == pluginDefault) {
plugInDir = (rtPath + "/" + pluginDefault);
}
if (!QDir(plugInDir).exists()) { if (!QDir(plugInDir).exists()) {
qCritical() << plugInDir qCritical() << plugInDir
<< "does not exists, but has to contain dc-library"; << "does not exists, but has to contain dc-library";
@@ -137,6 +127,7 @@ int main(int argc, char *argv[]) {
QThread::currentThread()->setObjectName("main thread"); QThread::currentThread()->setObjectName("main thread");
qInfo() << "Main thread" << QThread::currentThreadId(); qInfo() << "Main thread" << QThread::currentThreadId();
Worker worker(hw, Worker worker(hw,
customerNr, customerNr,
machineNr, machineNr,

View File

@@ -7,6 +7,7 @@
#include <QDateTime> #include <QDateTime>
#include <QMessageBox> #include <QMessageBox>
#include <QDebug> #include <QDebug>
#include <QScrollBar>
MainWindow::MainWindow(Worker *worker, QWidget *parent) MainWindow::MainWindow(Worker *worker, QWidget *parent)
: QMainWindow(parent) : QMainWindow(parent)
@@ -15,6 +16,16 @@ MainWindow::MainWindow(Worker *worker, QWidget *parent)
, m_width(70) , m_width(70)
, m_progressRunning(false) , m_progressRunning(false)
, m_progressValue(0) { , m_progressValue(0) {
this->setStatusBar(new QStatusBar(this));
QFont f;
f.setStyleHint(QFont::Monospace);
f.setWeight(QFont::Bold);
f.setFamily("Misc Fixed");
f.setPixelSize(12);
this->statusBar()->setFont(f);
ui->setupUi(this); ui->setupUi(this);
ui->updateProgress->setRange(0, 100); ui->updateProgress->setRange(0, 100);
@@ -27,8 +38,10 @@ MainWindow::MainWindow(Worker *worker, QWidget *parent)
lst << QString("Machine number : %1 ").arg(m_worker->machineNr()).leftJustified(m_width-3); 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("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("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, '='); lst << QString("").leftJustified(m_width-3, '=');
ui->updateStatus->setText(lst.join('\n')); ui->updateStatus->setText(lst.join('\n'));
ui->updateStatus->setEnabled(true); ui->updateStatus->setEnabled(true);
@@ -42,17 +55,15 @@ MainWindow::MainWindow(Worker *worker, QWidget *parent)
m_exitTimer->setSingleShot(true); m_exitTimer->setSingleShot(true);
m_exitTimer->start(1800 * 1000); m_exitTimer->start(1800 * 1000);
connect(ui->exit, SIGNAL(clicked()), this, SLOT(onQuit())); connect(ui->exit, SIGNAL(clicked()),this,SLOT(onQuit()));
connect(m_worker, SIGNAL(disableExit()), this, SLOT(onDisableExit())); connect(m_worker, SIGNAL(disableExit()),this,SLOT(onDisableExit()));
connect(m_worker, SIGNAL(enableExit()), this, SLOT(onEnableExit())); connect(m_worker, SIGNAL(enableExit()),this,SLOT(onEnableExit()));
connect(m_worker, SIGNAL(stopStartTimer()), this, SLOT(onStopStartTimer())); connect(m_worker, SIGNAL(stopStartTimer()),this,SLOT(onStopStartTimer()));
connect(m_worker, SIGNAL(restartExitTimer()), this, SLOT(onRestartExitTimer())); connect(m_worker, SIGNAL(restartExitTimer()),this,SLOT(onRestartExitTimer()));
connect(m_worker, SIGNAL(appendText(QString, QString)), this, SLOT(onAppendText(QString, QString))); connect(m_worker, SIGNAL(appendText(QString,QString)),this,SLOT(onAppendText(QString,QString)));
connect(m_worker, SIGNAL(showErrorMessage(QString,QString)), this, SLOT(onShowErrorMessage(QString,QString))); connect(m_worker, SIGNAL(showErrorMessage(QString,QString)),this, SLOT(onShowErrorMessage(QString,QString)));
connect(m_worker, SIGNAL(replaceLast(QString, QString)), this, SLOT(onReplaceLast(QString,QString))); connect(m_worker, SIGNAL(replaceLast(QString,QString)),this,SLOT(onReplaceLast(QString,QString)));
connect(m_worker, SIGNAL(replaceLast(QStringList,QString)),this, SLOT(onReplaceLast(QStringList,QString)));
ui->updateStatus->setText(lst.join('\n'));
ui->updateStatus->setEnabled(true);
} }
MainWindow::~MainWindow() { MainWindow::~MainWindow() {
@@ -137,10 +148,19 @@ void MainWindow::onQuit() {
qApp->exit(m_worker->returnCode()); qApp->exit(m_worker->returnCode());
} }
void MainWindow::scrollDownTextEdit() {
ui->updateStatus->setEnabled(true);
QTextCursor tmpCursor = ui->updateStatus->textCursor();
tmpCursor.movePosition(QTextCursor::End);
ui->updateStatus->setTextCursor(tmpCursor);
ui->updateStatus->ensureCursorVisible();
}
void MainWindow::onAppendText(QString text, QString suffix) { void MainWindow::onAppendText(QString text, QString suffix) {
QString editText = ui->updateStatus->toPlainText(); QString editText = ui->updateStatus->toPlainText();
if (!suffix.isNull() && suffix.size() > 0) { if (!suffix.isNull() && suffix.size() > 0) {
qInfo() << "TEXT" << text << "SUFFIX" << suffix; //qInfo() << "TEXT" << text << "SUFFIX" << suffix;
if (suffix == Worker::UPDATE_STEP_SUCCESS || suffix == Worker::UPDATE_STEP_FAIL) { if (suffix == Worker::UPDATE_STEP_SUCCESS || suffix == Worker::UPDATE_STEP_FAIL) {
editText += QString("\n").leftJustified(m_width-3, '='); editText += QString("\n").leftJustified(m_width-3, '=');
editText += " "; editText += " ";
@@ -151,14 +171,44 @@ void MainWindow::onAppendText(QString text, QString suffix) {
} }
Utils::printLineEditInfo(editText.split('\n')); Utils::printLineEditInfo(editText.split('\n'));
ui->updateStatus->setPlainText(editText.trimmed()); ui->updateStatus->setPlainText(editText.trimmed());
ui->updateStatus->setEnabled(true); scrollDownTextEdit();
}
void MainWindow::onReplaceLast(QStringList newTextLines, QString suffix) {
int const s = newTextLines.size();
if (s > 0) {
QString editText = ui->updateStatus->toPlainText();
QStringList lines = editText.split('\n');
QString newText;
if (lines.size() >= s) {
for (int i = 0; i < s; ++i) {
lines.removeLast();
}
if (lines.size() > 0) {
newText = lines.join('\n');
newText += '\n';
}
QStringList newLines;
for (int i = 0; i < s; ++i) {
if (i == 0 && !suffix.isNull() && suffix.size() > 0 && suffix != "\n") {
newLines += Utils::rstrip(newTextLines.at(i).leftJustified(m_width-10) + suffix);
} else {
newLines += Utils::rstrip(newTextLines.at(i).leftJustified(m_width-10));
}
}
lines += newLines;
newText += newLines.join(' ');
}
ui->updateStatus->setText(newText);
Utils::printLineEditInfo(lines);
scrollDownTextEdit();
}
} }
void MainWindow::onReplaceLast(QString text, QString suffix) { void MainWindow::onReplaceLast(QString text, QString suffix) {
qInfo() << "REPL TEXT" << text << "SUFFIX" << suffix; //qInfo() << "REPL TEXT" << text << "SUFFIX" << suffix;
QString editText = ui->updateStatus->toPlainText(); QString editText = ui->updateStatus->toPlainText();
QStringList lines = editText.split('\n'); QStringList lines = editText.split('\n');
if (lines.size() > 0) { if (lines.size() > 0) {
@@ -171,27 +221,12 @@ void MainWindow::onReplaceLast(QString text, QString suffix) {
} }
Utils::printLineEditInfo(lines); Utils::printLineEditInfo(lines);
ui->updateStatus->setText(lines.join('\n').trimmed()); ui->updateStatus->setText(lines.join('\n').trimmed());
ui->updateStatus->setEnabled(true); scrollDownTextEdit();
} }
void MainWindow::onShowErrorMessage(QString title, QString text) { void MainWindow::onShowErrorMessage(QString title, QString text) {
text = text.leftJustified(50, ' '); this->statusBar()->clearMessage();
QMessageBox msgBox(QMessageBox::NoIcon, title, this->statusBar()->showMessage( // timeout: 10000
text, QMessageBox::Ok, QString(title + " " + text).leftJustified(80, ' '), 10000);
nullptr, Qt::FramelessWindowHint);
msgBox.setDefaultButton(QMessageBox::Ok);
msgBox.defaultButton()->setVisible(false);
QTimer *t = new QTimer(this);
connect(t, SIGNAL(timeout()), msgBox.defaultButton(), SLOT(click()));
t->setSingleShot(true);
t->start(5 * 1000);
if(msgBox.exec() == QMessageBox::Ok) {
// do something
} else {
// do something else
}
} }

View File

@@ -3,6 +3,7 @@
#include <QMainWindow> #include <QMainWindow>
#include <QTimer> #include <QTimer>
#include <QStatusBar>
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; } namespace Ui { class MainWindow; }
@@ -27,6 +28,7 @@ public:
public slots: public slots:
void onAppendText(QString, QString suffix = ""); void onAppendText(QString, QString suffix = "");
void onReplaceLast(QStringList, QString suffix = "");
void onReplaceLast(QString, QString suffix = ""); void onReplaceLast(QString, QString suffix = "");
void onShowErrorMessage(QString, QString); void onShowErrorMessage(QString, QString);
void onStopStartTimer(); void onStopStartTimer();
@@ -38,6 +40,8 @@ private slots:
void onQuit(); void onQuit();
private: private:
void scrollDownTextEdit();
Ui::MainWindow *ui; Ui::MainWindow *ui;
Worker *m_worker; Worker *m_worker;
int m_width; int m_width;

View File

@@ -25,7 +25,7 @@
<x>10</x> <x>10</x>
<y>10</y> <y>10</y>
<width>781</width> <width>781</width>
<height>461</height> <height>441</height>
</rect> </rect>
</property> </property>
<layout class="QGridLayout" name="gridLayout"> <layout class="QGridLayout" name="gridLayout">
@@ -55,6 +55,15 @@
<bold>true</bold> <bold>true</bold>
</font> </font>
</property> </property>
<property name="verticalScrollBarPolicy">
<enum>Qt::ScrollBarAsNeeded</enum>
</property>
<property name="horizontalScrollBarPolicy">
<enum>Qt::ScrollBarAsNeeded</enum>
</property>
<property name="sizeAdjustPolicy">
<enum>QAbstractScrollArea::AdjustToContents</enum>
</property>
</widget> </widget>
</item> </item>
</layout> </layout>

View File

@@ -2,13 +2,15 @@
#include <QProcess> #include <QProcess>
#include <QDebug> #include <QDebug>
#include <QDir>
#include <QRegularExpression> #include <QRegularExpression>
Command::Command(QString const &command, int start_timeout, int finish_timeout) Command::Command(QString const &command, int start_timeout, int finish_timeout)
: m_command(command.trimmed()) : m_command(command.trimmed())
, m_commandResult("") , m_commandResult("")
, m_waitForStartTimeout(start_timeout) , m_waitForStartTimeout(start_timeout)
, m_waitForFinishTimeout(finish_timeout) { , m_waitForFinishTimeout(finish_timeout)
, m_exitCode(-1) {
} }
QString Command::getCommandResult() const { QString Command::getCommandResult() const {
@@ -39,46 +41,64 @@ void Command::finished(int /*exitCode*/, QProcess::ExitStatus /*exitStatus*/) {
} }
bool Command::execute(QString workingDirectory, QStringList args) { bool Command::execute(QString workingDirectory, QStringList args) {
if (!QDir::setCurrent(workingDirectory)) {
qCritical() << "SET WORKING_DIRECTORY" << workingDirectory
<< "FAILED FOR" << m_command;
return false;
}
QScopedPointer<QProcess> p(new QProcess(this)); QScopedPointer<QProcess> p(new QProcess(this));
p->setWorkingDirectory(workingDirectory);
p->setProcessChannelMode(QProcess::MergedChannels); p->setProcessChannelMode(QProcess::MergedChannels);
connect(&(*p), SIGNAL(readyReadStandardOutput()), this, SLOT(readyReadStandardOutput())); connect(&(*p), SIGNAL(readyReadStandardOutput()), this, SLOT(readyReadStandardOutput()));
connect(&(*p), SIGNAL(readyReadStandardError()), this, SLOT(readyReadStandardError())); connect(&(*p), SIGNAL(readyReadStandardError()), this, SLOT(readyReadStandardError()));
//qCritical() << "START COMMAND" << m_command << "WITH ARGS" << args
// << "IN" << workingDirectory;
p->setWorkingDirectory(workingDirectory);
if (!args.isEmpty()) { if (!args.isEmpty()) {
qDebug() << "START COMMAND" << m_command << "WITH ARGS" << args
<< "IN" << p->workingDirectory();
p->start(m_command, args); p->start(m_command, args);
} else { } else {
qDebug() << "START COMMAND" << m_command
<< "IN" << p->workingDirectory();
p->start(m_command); p->start(m_command);
} }
if (p->waitForStarted(m_waitForStartTimeout)) { if (p->waitForStarted(m_waitForStartTimeout)) {
//qDebug() << "PROCESS" << m_command << "STARTED"; qDebug() << "PROCESS" << m_command << "STARTED IN" << p->workingDirectory();
if (p->state() == QProcess::ProcessState::Running) { if (p->state() == QProcess::ProcessState::Running) {
//qDebug() << "PROCESS" << m_command << "RUNNING"; qDebug() << "PROCESS" << m_command << "RUNNING IN" << p->workingDirectory();
if (p->waitForFinished(m_waitForFinishTimeout)) { if (p->waitForFinished(m_waitForFinishTimeout)) {
//qDebug() << "PROCESS" << m_command << "FINISHED"; qDebug() << "PROCESS" << m_command << "FINISHED IN" << p->workingDirectory();
if (p->exitStatus() == QProcess::NormalExit) { if (p->exitStatus() == QProcess::NormalExit) {
if (p->exitCode() == 0) { if ((m_exitCode = p->exitCode()) == 0) {
qDebug() << "EXECUTED" << m_command
<< "with code" << m_exitCode
<< "IN" << p->workingDirectory();
return true; return true;
} else { } else {
qCritical() << "EXECUTED" << m_command << "with code" << p->exitCode(); qCritical() << "EXECUTED" << m_command
<< "with code" << m_exitCode
<< "IN" << p->workingDirectory();
} }
} else { } else {
qCritical() << "PROCESS" << m_command << "CRASHED with code" qCritical() << "PROCESS" << m_command << "CRASHED with code"
<< p->exitCode(); << p->exitCode()
<< "IN" << p->workingDirectory();
} }
} else { } else {
qCritical() << "PROCESS" << m_command << "DID NOT FINISH"; qCritical() << "PROCESS" << m_command
<< "DID NOT FINISH"
<< "IN" << p->workingDirectory();
} }
} else { } else {
qCritical() << "WRONG PROCESS STATE" << p->state(); qCritical() << "WRONG PROCESS STATE" << p->state()
<< "IN" << p->workingDirectory();
} }
} else { } else {
qCritical() << "PROCESS" << m_command << "TIMEOUT AT START"; qCritical() << "PROCESS" << m_command << "TIMEOUT AT START"
<< "IN" << p->workingDirectory();
} }
return false; return false;
} }

View File

@@ -16,15 +16,17 @@ class Command : public QObject {
QString m_commandResult; QString m_commandResult;
int m_waitForStartTimeout; int m_waitForStartTimeout;
int m_waitForFinishTimeout; int m_waitForFinishTimeout;
int m_exitCode;
public: public:
explicit Command(QString const &command, explicit Command(QString const &command,
int start_timeout = 100000, int start_timeout = 100000,
int finish_timeout = 100000); int finish_timeout = 100000);
QString getCommandResult() const; QString getCommandResult() const;
QString command() const { return m_command; }
bool execute(QString workingDirectory, QStringList args = QStringList()); bool execute(QString workingDirectory, QStringList args = QStringList());
int exitCode() const { return m_exitCode; }
private slots: private slots:
void readyReadStandardOutput(); void readyReadStandardOutput();

View File

@@ -1,5 +1,6 @@
#include "utils.h" #include "utils.h"
#include "message_handler.h" #include "message_handler.h"
#include "git/git_client.h"
#include <QFile> #include <QFile>
#include <QTextStream> #include <QTextStream>
@@ -77,3 +78,94 @@ QString Utils::getTariffLoadTime(QString fileName) {
return "N/A"; return "N/A";
} }
QString Utils::rstrip(QString const &str) {
int n = str.size() - 1;
for (; n >= 0; --n) {
if (!str.at(n).isSpace()) {
return str.left(n + 1);
}
}
return "";
}
bool Utils::sameFilesInDirs(QDir const &dir1, QDir const &dir2,
QStringList const &nameFilters) {
if (!dir1.exists()) {
printCriticalErrorMsg(dir1.dirName() + " DOES NOT EXIST");
return false;
}
if (!dir2.exists()) {
printCriticalErrorMsg(dir2.dirName() + " DOES NOT EXIST");
return false;
}
if (dir1.absolutePath() == dir2.absolutePath()) {
printCriticalErrorMsg(dir1.dirName() + " AND "+ dir2.dirName() + " HAVE SAME PATH");
return false;
}
// files, sorted by name
QFileInfoList const &lst1 = dir1.entryInfoList(nameFilters, QDir::Files, QDir::Name);
QFileInfoList const &lst2 = dir2.entryInfoList(nameFilters, QDir::Files, QDir::Name);
QStringList fileNameLst1{};
QStringList fileNameLst2{};
QListIterator<QFileInfo> i1(lst1);
while (i1.hasNext()) {
fileNameLst1 << i1.next().fileName();
}
QListIterator<QFileInfo> i2(lst2);
while (i2.hasNext()) {
fileNameLst2 << i2.next().fileName();
}
if (fileNameLst1.isEmpty()) {
qCritical() << "DIR1" << dir1.dirName() << " DOES NOT CONTAIN EXPECTED FILES";
return false;
}
if (fileNameLst2.isEmpty()) {
qCritical() << "DIR1" << dir2.dirName() << " DOES NOT CONTAIN EXPECTED FILES";
return false;
}
if (fileNameLst1 != fileNameLst2) {
printCriticalErrorMsg(dir1.dirName() + " AND " + dir2.dirName()
+ " DIFFER: [" + fileNameLst1.join(',') + "],["
+ fileNameLst2.join(',') + "]");
return false;
} else {
printInfoMsg(dir1.dirName() + " AND " + dir2.dirName()
+ " ARE EQUAL: [" + fileNameLst1.join(',') + "]");
}
QStringList gitBlobLst1{};
QStringList gitBlobLst2{};
QListIterator<QFileInfo> i3(lst1);
while (i3.hasNext()) {
gitBlobLst1 << GitClient::gitBlob(i3.next().fileName());
}
QListIterator<QFileInfo> i4(lst2);
while (i4.hasNext()) {
gitBlobLst2 << GitClient::gitBlob(i4.next().fileName());
}
if (gitBlobLst1.isEmpty()) {
qCritical() << "DIR1" << dir1.dirName() << " DOES NOT CONTAIN EXPECTED FILES";
return false;
}
if (gitBlobLst2.isEmpty()) {
qCritical() << "DIR1" << dir2.dirName() << " DOES NOT CONTAIN EXPECTED FILES";
return false;
}
if (gitBlobLst1 != gitBlobLst2) {
printCriticalErrorMsg(dir1.dirName() + " AND " + dir2.dirName()
+ " DIFFER: [" + gitBlobLst1.join(',') + "],["
+ gitBlobLst2.join(',') + "]");
return false;
} else {
printInfoMsg(dir1.dirName() + " AND " + dir2.dirName()
+ " CONTAIN SAME GIT-BLOBS FOR FILES: [" + fileNameLst1.join(',') + "]");
}
return true;
}

View File

@@ -7,6 +7,7 @@
#include <QFile> #include <QFile>
#include <QFileInfo> #include <QFileInfo>
#include <QDateTime> #include <QDateTime>
#include <QDir>
namespace Utils { namespace Utils {
int read1stLineOfFile(QString fileName); int read1stLineOfFile(QString fileName);
@@ -15,6 +16,9 @@ namespace Utils {
void printInfoMsg(QString const &infoMsg); void printInfoMsg(QString const &infoMsg);
void printLineEditInfo(QStringList const &lines); void printLineEditInfo(QStringList const &lines);
QString getTariffLoadTime(QString fileName); QString getTariffLoadTime(QString fileName);
QString rstrip(QString const &str);
bool sameFilesInDirs(QDir const &dir1, QDir const &dir2,
QStringList const &nameFilters = {"*.json"});
} }
#endif // UTILS_H_INCLUDED #endif // UTILS_H_INCLUDED

File diff suppressed because it is too large Load Diff

View File

@@ -9,6 +9,8 @@
#include <QJsonObject> #include <QJsonObject>
#include <QHash> #include <QHash>
#include <optional>
#include "worker_thread.h" #include "worker_thread.h"
#include "update.h" #include "update.h"
#include "git/git_client.h" #include "git/git_client.h"
@@ -23,55 +25,28 @@
enum class UPDATE_STATUS : quint8 { enum class UPDATE_STATUS : quint8 {
NOT_DEFINED, NOT_DEFINED,
STEP_OK,
STEP_DONE,
STEP_FAIL,
ISMAS_WAIT_STATE_CHECK_PENDING, ISMAS_WAIT_STATE_CHECK_PENDING,
ISMAS_WAIT_STATE_CHECK_FAILURE, ISMAS_WAIT_STATE_CHECK_FAILURE,
ISMAS_WAIT_STATE_CHECK_TIMEOUT,
ISMAS_WAIT_STATE_CHECK_SUCCESS,
ISMAS_RESPONSE_RECEIVED, ISMAS_RESPONSE_RECEIVED,
BACKEND_CONNECTED,
BACKEND_CHECK, BACKEND_CHECK,
BACKEND_CHECK_FAILURE, BACKEND_CHECK_FAILURE,
ISMAS_BACKEND_CHECK_FAILURE,
BACKEND_NOT_CONNECTED, BACKEND_NOT_CONNECTED,
UPDATE_TRIGGER_SET, ISMAS_UPDATE_TRIGGER_SET,
UPDATE_TRIGGER_NOT_SET_OR_WRONG, ISMAS_UPDATE_TRIGGER_NOT_SET_OR_WRONG,
GIT_CLONE_AND_CHECKOUT_SUCCESS, GIT_CLONE_AND_CHECKOUT_SUCCESS,
GIT_CLONE_AND_CHECKOUT_FAILURE, GIT_CLONE_AND_CHECKOUT_FAILURE,
GIT_CHECKOUT_BRANCH, GIT_CHECKOUT_BRANCH,
GIT_CHECKOUT_BRANCH_REQUEST_FAILURE, GIT_CHECKOUT_BRANCH_FAILURE,
GIT_CHECKOUT_BRANCH_NOT_EXISTS,
GIT_CHECKOUT_BRANCH_CHECKOUT_ERROR,
GIT_FETCH_UPDATES, GIT_FETCH_UPDATES,
GIT_FETCH_UPDATES_REQUEST_FAILURE, GIT_FETCH_UPDATES_REQUEST_FAILURE,
GIT_FETCH_UPDATES_REQUEST_SUCCESS,
GIT_PULL_UPDATES_SUCCESS,
GIT_PULL_UPDATES_FAILURE,
EXEC_OPKG_COMMAND, EXEC_OPKG_COMMAND,
EXEC_OPKG_COMMANDS, EXEC_OPKG_COMMANDS,
EXEC_OPKG_COMMAND_FAILURE,
EXEC_OPKG_COMMAND_SUCCESS,
EXEC_OPKG_COMMANDS_SUCCESS,
RSYNC_UPDATES,
RSYNC_UPDATES_FAILURE, RSYNC_UPDATES_FAILURE,
RSYNC_UPDATES_SUCESS, RSYNC_UPDATES_SUCCESS,
DEVICE_CONTROLLER_UPDATE, RSYNC_FILE_SUCCESS,
DEVICE_CONTROLLER_UPDATE_FAILURE,
DEVICE_CONTROLLER_UPDATE_SUCCESS,
JSON_UPDATE,
JSON_UPDATE_FAILURE,
JSON_PARSE_FAILURE, JSON_PARSE_FAILURE,
JSON_UPDATE_SUCCESS,
UPDATE_PROCESS_SUCCESS, UPDATE_PROCESS_SUCCESS,
UPDATE_PROCESS_FAILURE, UPDATE_PROCESS_FAILURE,
ISMAS_UPDATE_INFO_CONFIRM,
ISMAS_UPDATE_INFO_CONFIRM_FAILURE,
ISMAS_UPDATE_INFO_CONFIRM_SUCCESS,
ISMAS_CURRENT_PSA_STATUS_CONFIRM,
ISMAS_CURRENT_PSA_STATUS_CONFIRM_FAILURE,
ISMAS_CURRENT_PSA_STATUS_CONFIRM_SUCCESS,
ISMAS_SANITY_CHECK_OK, ISMAS_SANITY_CHECK_OK,
ISMAS_UPDATE_TRIGGER_SET_FAILURE, ISMAS_UPDATE_TRIGGER_SET_FAILURE,
PSA_UPDATE_FILES_FAILED, PSA_UPDATE_FILES_FAILED,
@@ -115,8 +90,6 @@ class Worker : public QObject {
QString const m_osVersion; QString const m_osVersion;
QString const m_atbqtVersion; QString const m_atbqtVersion;
QString const m_cpuSerial; QString const m_cpuSerial;
QString const m_raucVersion;
QString const m_opkgVersion;
QString const m_pluginVersionATBDeciceController; QString const m_pluginVersionATBDeciceController;
QString const m_pluginVersionIngenicoISelf; QString const m_pluginVersionIngenicoISelf;
QString const m_pluginVersionMobilisisCalc; QString const m_pluginVersionMobilisisCalc;
@@ -138,6 +111,7 @@ class Worker : public QObject {
MainWindow *m_mainWindow; MainWindow *m_mainWindow;
int m_progressValue; int m_progressValue;
bool m_withoutIsmasDirectPort; bool m_withoutIsmasDirectPort;
QString m_apismVersion;
bool executeOpkgCommand(QString opkgCommand); bool executeOpkgCommand(QString opkgCommand);
QString getOsVersion() const; QString getOsVersion() const;
@@ -182,6 +156,7 @@ public:
int machineNr() const { return m_machineNr; } int machineNr() const { return m_machineNr; }
int customerNr() const { return m_customerNr; } int customerNr() const { return m_customerNr; }
int zoneNr() const { return m_zoneNr; } int zoneNr() const { return m_zoneNr; }
QString apismVersion() const { return m_apismVersion; }
//friend QDebug operator<<(QDebug debug, Worker const &w) { //friend QDebug operator<<(QDebug debug, Worker const &w) {
// Q_UNUSED(w); // Q_UNUSED(w);
@@ -195,6 +170,7 @@ public:
signals: signals:
void appendText(QString, QString suffix = ""); void appendText(QString, QString suffix = "");
void replaceLast(QString, QString); void replaceLast(QString, QString);
void replaceLast(QStringList, QString);
void showErrorMessage(QString title, QString description); void showErrorMessage(QString title, QString description);
void stopStartTimer(); void stopStartTimer();
void restartExitTimer(); void restartExitTimer();
@@ -205,7 +181,6 @@ public slots:
void update(); void update();
private slots: private slots:
bool backendConnected();
bool updateTriggerSet(); bool updateTriggerSet();
bool customerEnvironment(); bool customerEnvironment();
bool filesToUpdate(); bool filesToUpdate();
@@ -216,8 +191,8 @@ private slots:
private: private:
PSAInstalled getPSAInstalled(); PSAInstalled getPSAInstalled();
QString sendCmdSendVersionToIsmas();
void privateUpdate(); void privateUpdate();
std::optional<QString> getApismVersion();
}; };
#endif // WORKER_H_INCLUDED #endif // WORKER_H_INCLUDED