Compare commits
	
		
			47 Commits
		
	
	
		
			f346390631
			...
			improve-is
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 05b68f21c2 | |||
| 9ca394db46 | |||
| 0d268a1d9d | |||
| da102b5ed0 | |||
| 7031c0e349 | |||
| c528ce377d | |||
| 5e7c848fca | |||
| 3165d77f49 | |||
| f0d2d5f958 | |||
| 1da4c3b224 | |||
| f1cedbf1d5 | |||
| 0933274c82 | |||
| 2aa676f18c | |||
| 6c0d49b90c | |||
| 18d04d15cf | |||
| b81120f8dc | |||
| 8b2fcb25db | |||
| 698cf74516 | |||
| 20681b0d6c | |||
| 763647c145 | |||
| 4aad14b181 | |||
| 0a03228dea | |||
| 23551066c1 | |||
| 24f2ba7c44 | |||
| 2ed6768953 | |||
| a1327388bc | |||
| 8d18ae10fe | |||
| 31bc2d0fa2 | |||
| 175b8fd3a1 | |||
| a57fa6c31e | |||
| c22c924e38 | |||
| bdc64920a2 | |||
| 7bc9fa0c04 | |||
| 334da1fe4a | |||
| e5054582c2 | |||
| bbd287c92b | |||
| 5c152c9dc2 | |||
| 367ffaa3a1 | |||
| 2fd004f249 | |||
| 721a156fce | |||
| b7576d04e1 | |||
| 753954ecd7 | |||
| df7cabe2c1 | |||
| cfca8d2ef4 | |||
| 829932f29d | |||
| 8968667c23 | |||
| a5e0154757 | 
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							@@ -1,2 +1,3 @@
 | 
				
			|||||||
tags
 | 
					tags
 | 
				
			||||||
*.tags
 | 
					*.tags
 | 
				
			||||||
 | 
					*.user
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -6,7 +6,7 @@ plugin-directory="/usr/lib/"
 | 
				
			|||||||
working-directory="/opt/app/tools/atbupdate/"
 | 
					working-directory="/opt/app/tools/atbupdate/"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[PLUGINS]
 | 
					[PLUGINS]
 | 
				
			||||||
plugin-name="libCAmaster.so"
 | 
					plugin-name="libCAslave.so"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[FLAGS]
 | 
					[FLAGS]
 | 
				
			||||||
no-psa-hardware-update=false
 | 
					no-psa-hardware-update=false
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -34,6 +34,11 @@ contains( CONFIG, PTU5 ) {
 | 
				
			|||||||
    lessThan(QT_MAJOR_VERSION, 5):   PKGCONFIG += qextserialport
 | 
					    lessThan(QT_MAJOR_VERSION, 5):   PKGCONFIG += qextserialport
 | 
				
			||||||
    QMAKE_CXXFLAGS += -O2 -std=c++17   # for GCC >= 4.7
 | 
					    QMAKE_CXXFLAGS += -O2 -std=c++17   # for GCC >= 4.7
 | 
				
			||||||
    # QMAKE_CXXFLAGS += -Wno-deprecated-copy
 | 
					    # QMAKE_CXXFLAGS += -Wno-deprecated-copy
 | 
				
			||||||
 | 
					    PTU5BASEPATH = /opt/devel/ptu5
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    INCLUDEPATH += $$PTU5BASEPATH/qt/libs/devicecontroller/include
 | 
				
			||||||
 | 
					    LIBS += -L$$PTU5BASEPATH/qt/libs/devicecontroller/library
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ARCH = PTU5
 | 
					    ARCH = PTU5
 | 
				
			||||||
    DEFINES+=PTU5
 | 
					    DEFINES+=PTU5
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -19,7 +19,12 @@ EXTENDED_VERSION="$${VERSION}-$${GIT_COMMIT}"
 | 
				
			|||||||
!contains(CONFIG, INCLUDEINTERFACES) {
 | 
					!contains(CONFIG, INCLUDEINTERFACES) {
 | 
				
			||||||
    INCLUDEINTERFACES=/opt/ptu5/opt/DCLibraries/include
 | 
					    INCLUDEINTERFACES=/opt/ptu5/opt/DCLibraries/include
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
INCLUDEPATH += plugins $${INCLUDEINTERFACES}
 | 
					
 | 
				
			||||||
 | 
					INCLUDEPATH += \
 | 
				
			||||||
 | 
					    plugins \
 | 
				
			||||||
 | 
					    $${INCLUDEINTERFACES} \
 | 
				
			||||||
 | 
					    $${_PRO_FILE_PWD_}/../UpdatePTUDevCtrl \
 | 
				
			||||||
 | 
					    $${_PRO_FILE_PWD_}/../../ATBUpdateTool/common/include
 | 
				
			||||||
 | 
					
 | 
				
			||||||
CONFIG += c++17
 | 
					CONFIG += c++17
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -39,6 +44,12 @@ contains( CONFIG, PTU5 ) {
 | 
				
			|||||||
    lessThan(QT_MAJOR_VERSION, 5):   PKGCONFIG += qextserialport
 | 
					    lessThan(QT_MAJOR_VERSION, 5):   PKGCONFIG += qextserialport
 | 
				
			||||||
    QMAKE_CXXFLAGS += -O2 -std=c++17   # for GCC >= 4.7
 | 
					    QMAKE_CXXFLAGS += -O2 -std=c++17   # for GCC >= 4.7
 | 
				
			||||||
    # QMAKE_CXXFLAGS += -Wno-deprecated-copy
 | 
					    # QMAKE_CXXFLAGS += -Wno-deprecated-copy
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    PTU5BASEPATH = /opt/devel/ptu5
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    INCLUDEPATH += $$PTU5BASEPATH/qt/libs/devicecontroller/include
 | 
				
			||||||
 | 
					    LIBS += -L$$PTU5BASEPATH/qt/libs/devicecontroller/library
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ARCH = PTU5
 | 
					    ARCH = PTU5
 | 
				
			||||||
    DEFINES+=PTU5
 | 
					    DEFINES+=PTU5
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -67,13 +78,16 @@ contains( CONFIG, DesktopLinux ) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
SOURCES += \
 | 
					SOURCES += \
 | 
				
			||||||
        main.cpp \
 | 
					        main.cpp \
 | 
				
			||||||
        message_handler.cpp \
 | 
					        ../UpdatePTUDevCtrl/message_handler.cpp \
 | 
				
			||||||
        process/command.cpp
 | 
					        ../UpdatePTUDevCtrl/commandline_parser.cpp \
 | 
				
			||||||
 | 
					        update.cpp \
 | 
				
			||||||
 | 
					        ../../ATBUpdateTool/common/src/System.cpp
 | 
				
			||||||
 | 
					
 | 
				
			||||||
HEADERS += \
 | 
					HEADERS += \
 | 
				
			||||||
        message_handler.h \
 | 
					        ../UpdatePTUDevCtrl/message_handler.h \
 | 
				
			||||||
        plugins/interfaces.h \
 | 
					        ../UpdatePTUDevCtrl/commandline_parser.h \
 | 
				
			||||||
        process/command.h
 | 
					        update.h \
 | 
				
			||||||
 | 
					        ../../ATBUpdateTool/common/include/System.h
 | 
				
			||||||
 | 
					
 | 
				
			||||||
OTHER_FILES += \
 | 
					OTHER_FILES += \
 | 
				
			||||||
    ATBDownloadDCJsonFiles.ini
 | 
					    ATBDownloadDCJsonFiles.ini
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -3,8 +3,20 @@
 | 
				
			|||||||
#include <QCoreApplication>
 | 
					#include <QCoreApplication>
 | 
				
			||||||
#include <QByteArray>
 | 
					#include <QByteArray>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <QProcess>
 | 
				
			||||||
 | 
					#include <QCommandLineParser>
 | 
				
			||||||
 | 
					#include <QStandardPaths>
 | 
				
			||||||
 | 
					#include <QSettings>
 | 
				
			||||||
 | 
					#include <QDir>
 | 
				
			||||||
 | 
					#include <QDebug>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "message_handler.h"
 | 
					#include "message_handler.h"
 | 
				
			||||||
#include "plugins/interfaces.h"
 | 
					#include "commandline_parser.h"
 | 
				
			||||||
 | 
					#include "utils.h"
 | 
				
			||||||
 | 
					#include "update.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <DeviceController/interfaces.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//#include <unistd.h>
 | 
					//#include <unistd.h>
 | 
				
			||||||
@@ -16,6 +28,20 @@
 | 
				
			|||||||
#define SERIAL_PORT "ttyUSB0"
 | 
					#define SERIAL_PORT "ttyUSB0"
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int read1stLineOfFile(QString fileName) {
 | 
				
			||||||
 | 
					    QFile f(fileName);
 | 
				
			||||||
 | 
					    if (f.exists()) {
 | 
				
			||||||
 | 
					        if (f.open(QIODevice::ReadOnly | QIODevice::Text)) {
 | 
				
			||||||
 | 
					            QTextStream in(&f);
 | 
				
			||||||
 | 
					            in.setCodec("UTF-8");
 | 
				
			||||||
 | 
					            while(!in.atEnd()) {
 | 
				
			||||||
 | 
					                return in.readLine().toInt();
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return -1;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int main(int argc, char **argv) {
 | 
					int main(int argc, char **argv) {
 | 
				
			||||||
    QByteArray const value = qgetenv("LC_ALL");
 | 
					    QByteArray const value = qgetenv("LC_ALL");
 | 
				
			||||||
    if (value != "C") {
 | 
					    if (value != "C") {
 | 
				
			||||||
@@ -34,23 +60,86 @@ int main(int argc, char **argv) {
 | 
				
			|||||||
        setDebugLevel(LOG_NOTICE);
 | 
					        setDebugLevel(LOG_NOTICE);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    int r = std::system("ls -l /proc/[0-9]*/fd/* 2>/dev/null | grep /dev/ttymxc2 > /tmp/slave-or-master.txt");
 | 
					    CommandLineParser parser;
 | 
				
			||||||
    // lrwx------    1 root     root            64 Oct 31 14:55 /proc/884/fd/18 -> /dev/ttymxc2
 | 
					    parser.process(a);
 | 
				
			||||||
 | 
					    parser.readSettings();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    //std::ifstream ifs("/tmp/slave-or-master.txt");
 | 
					    QString repositoryUrl = parser.repositoryUrl();
 | 
				
			||||||
 | 
					    QString plugInDir = parser.plugInDir();
 | 
				
			||||||
 | 
					    QString plugInName = parser.plugInName();
 | 
				
			||||||
 | 
					    QString workingDir = parser.workingDir();
 | 
				
			||||||
 | 
					    QString iniFileName = parser.iniFileName();
 | 
				
			||||||
 | 
					    bool const dryRun = parser.dryRun();
 | 
				
			||||||
 | 
					    bool const noUpdatePsaHardware = parser.noUpdatePsaHardware();
 | 
				
			||||||
 | 
					    bool const showYoctoVersion = parser.yoctoVersion();
 | 
				
			||||||
 | 
					    bool const showYoctoInstallStatus = parser.yoctoInstallStatus();
 | 
				
			||||||
 | 
					    bool const showExtendedVersion = parser.extendedVersion();
 | 
				
			||||||
 | 
					    bool const alwaysDownloadConfig = parser.alwaysDownloadConfig();
 | 
				
			||||||
 | 
					    bool const alwaysDownloadDC = parser.alwaysDownloadDC();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    //if (ifs.is_open()) {
 | 
					    QString const rtPath = QCoreApplication::applicationDirPath();
 | 
				
			||||||
    //    std::string line;
 | 
					 | 
				
			||||||
    //    if (std::getline(ifs, line)) {
 | 
					 | 
				
			||||||
    //        if (line.size() > 0) {
 | 
					 | 
				
			||||||
    //            std::cout << "SLAVE " << line << std::endl;
 | 
					 | 
				
			||||||
    //        }
 | 
					 | 
				
			||||||
    //    } else {
 | 
					 | 
				
			||||||
    //    }
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    //    ifs.close();
 | 
					    int const machineNr = read1stLineOfFile("/mnt/system_data/machine_nr");
 | 
				
			||||||
 | 
					    int const customerNr = read1stLineOfFile("/mnt/system_data/cust_nr");
 | 
				
			||||||
 | 
					    int const zoneNr = read1stLineOfFile("/mnt/system_data/zone_nr");
 | 
				
			||||||
 | 
					    QString const branchName = (zoneNr != 0)
 | 
				
			||||||
 | 
					            ? QString("zg1/zone%1").arg(zoneNr) : "master";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    //}
 | 
					    qInfo() << "pwd ......................" << rtPath;
 | 
				
			||||||
 | 
					    qInfo() << "repositoryUrl ............" << repositoryUrl;
 | 
				
			||||||
 | 
					    qInfo() << "plugInDir ................" << plugInDir;
 | 
				
			||||||
 | 
					    qInfo() << "plugInName ..............." << plugInName;
 | 
				
			||||||
 | 
					    qInfo() << "workingDir ..............." << workingDir;
 | 
				
			||||||
 | 
					    qInfo() << "dryRun ..................." << dryRun;
 | 
				
			||||||
 | 
					    qInfo() << "noUpdatePsaHardware ......" << noUpdatePsaHardware;
 | 
				
			||||||
 | 
					    qInfo() << "alwaysDownloadConfig ....." << alwaysDownloadConfig;
 | 
				
			||||||
 | 
					    qInfo() << "alwaysDownloadDC ........." << alwaysDownloadDC;
 | 
				
			||||||
 | 
					    qInfo() << "showYoctoVersion ........." << showYoctoVersion;
 | 
				
			||||||
 | 
					    qInfo() << "showYoctoInstallStatus ..." << showYoctoInstallStatus;
 | 
				
			||||||
 | 
					    qInfo() << "showExtendedVersion ......" << showExtendedVersion;
 | 
				
			||||||
 | 
					    qInfo() << "iniFileName .............." << iniFileName;
 | 
				
			||||||
 | 
					    qInfo() << "extended-version ........." << APP_EXTENDED_VERSION;
 | 
				
			||||||
 | 
					    qInfo() << "machineNr ................" << machineNr;
 | 
				
			||||||
 | 
					    qInfo() << "customerNr ..............." << customerNr;
 | 
				
			||||||
 | 
					    qInfo() << "zoneNr ..................." << zoneNr;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return a.exec();
 | 
					    if (showExtendedVersion) {
 | 
				
			||||||
 | 
					        printf(APP_EXTENDED_VERSION"\n");
 | 
				
			||||||
 | 
					        return 0;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    QString const customerRepo = QDir::cleanPath(workingDir + QDir::separator() + QString("customer_%1").arg(customerNr));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    qCritical() << "Using customer repository" << customerRepo;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // always execute contents of opkg_commands-file
 | 
				
			||||||
 | 
					    QStringList filesToUpdate;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    QDir dir(QDir::cleanPath(customerRepo + QDir::separator() + "etc/psa_config"));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (dir.exists()) {
 | 
				
			||||||
 | 
					        QStringList jsons = dir.entryList(QStringList() << "DC2C*.json", QDir::Files);
 | 
				
			||||||
 | 
					        if (!jsons.isEmpty()) {
 | 
				
			||||||
 | 
					            for (QStringList::size_type i=0; i<jsons.size(); ++i) {
 | 
				
			||||||
 | 
					                filesToUpdate << QDir::cleanPath(QString("etc/psa_config/") + jsons.at(i));
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					        qCritical() << "DIRECTORY" << dir << "DOES NOT EXIST";
 | 
				
			||||||
 | 
					        return -1;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    qCritical() << "JSON FILES TO UPDATE" << filesToUpdate;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Update update(customerRepo,
 | 
				
			||||||
 | 
					                  QString::number(customerNr),
 | 
				
			||||||
 | 
					                  branchName,
 | 
				
			||||||
 | 
					                  plugInDir,
 | 
				
			||||||
 | 
					                  plugInName,
 | 
				
			||||||
 | 
					                  workingDir);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    update.doUpdate(filesToUpdate);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    //return a.exec();
 | 
				
			||||||
 | 
					    return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										390
									
								
								DownloadDCJsonFiles/update.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										390
									
								
								DownloadDCJsonFiles/update.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,390 @@
 | 
				
			|||||||
 | 
					#include "update.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <QCoreApplication>
 | 
				
			||||||
 | 
					#include <QFile>
 | 
				
			||||||
 | 
					#include <QTemporaryFile>
 | 
				
			||||||
 | 
					#include <QDebug>
 | 
				
			||||||
 | 
					#include <QTextStream>
 | 
				
			||||||
 | 
					#include <QRegularExpression>
 | 
				
			||||||
 | 
					#include <QRegExp>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if defined (Q_OS_UNIX) || defined (Q_OS_LINUX)
 | 
				
			||||||
 | 
					#include "unistd.h"
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <DeviceController/interfaces.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <QSharedMemory>
 | 
				
			||||||
 | 
					#include <QScopedPointer>
 | 
				
			||||||
 | 
					#include <QDir>
 | 
				
			||||||
 | 
					#include <QThread>
 | 
				
			||||||
 | 
					#include <QDateTime>
 | 
				
			||||||
 | 
					#include <QPluginLoader>
 | 
				
			||||||
 | 
					#include <QMap>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define UPDATE_OPKG                 (1)
 | 
				
			||||||
 | 
					#define UPDATE_DC                   (0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static const QMap<QString, int> baudrateMap = {
 | 
				
			||||||
 | 
					  {"1200"   ,   0}, {"9600"   ,   1}, {"19200"  ,   2}, {"38400"  ,   3},
 | 
				
			||||||
 | 
					  {"57600"  ,   4}, {"115200" ,   5}
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					QPluginLoader Update::pluginLoader;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					hwinf *Update::loadDCPlugin(QDir const &plugInDir, QString const &fname) {
 | 
				
			||||||
 | 
					    hwinf *hw = nullptr;
 | 
				
			||||||
 | 
					    if (plugInDir.exists()) {
 | 
				
			||||||
 | 
					        QString pluginLibName(fname);
 | 
				
			||||||
 | 
					        pluginLibName = plugInDir.absoluteFilePath(pluginLibName);
 | 
				
			||||||
 | 
					        QFileInfo info(pluginLibName);
 | 
				
			||||||
 | 
					        if (info.exists()) {
 | 
				
			||||||
 | 
					            pluginLibName = plugInDir.absoluteFilePath(pluginLibName);
 | 
				
			||||||
 | 
					            pluginLoader.setFileName(pluginLibName);
 | 
				
			||||||
 | 
					            // static QPluginLoader pluginLoader(pluginLibName);
 | 
				
			||||||
 | 
					            if (!pluginLoader.load()) {
 | 
				
			||||||
 | 
					                qCritical() << "in directory" << plugInDir.absolutePath();
 | 
				
			||||||
 | 
					                qCritical() << "cannot load plugin" << pluginLoader.fileName();
 | 
				
			||||||
 | 
					                qCritical() << pluginLoader.errorString();
 | 
				
			||||||
 | 
					                exit(-1);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            qCritical() << "loadDCPlugin() plugin directory:" << plugInDir.absolutePath();
 | 
				
			||||||
 | 
					            qCritical() << "loadDCPlugin() plugin file name:" << pluginLoader.fileName();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (!pluginLoader.isLoaded()) {
 | 
				
			||||||
 | 
					                qCritical() << pluginLoader.errorString();
 | 
				
			||||||
 | 
					                exit(-2);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            QObject *plugin = pluginLoader.instance();
 | 
				
			||||||
 | 
					            if (!plugin) {
 | 
				
			||||||
 | 
					                qCritical() << "cannot start instance";
 | 
				
			||||||
 | 
					                exit(-3);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            if (! (hw = qobject_cast<hwinf *>(plugin))) {
 | 
				
			||||||
 | 
					                qCritical() << "cannot cast plugin" << plugin << "to hwinf";
 | 
				
			||||||
 | 
					                exit(-4);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            qCritical() << pluginLibName << "does not exist";
 | 
				
			||||||
 | 
					            exit(-5);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					        qCritical() << "plugins directory" << plugInDir.absolutePath()
 | 
				
			||||||
 | 
					                    << "does not exist";
 | 
				
			||||||
 | 
					        exit(-6);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return hw;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool Update::unloadDCPlugin() {
 | 
				
			||||||
 | 
					    if (pluginLoader.unload()) {
 | 
				
			||||||
 | 
					        qCritical() << "unloaded plugin" << pluginLoader.fileName();
 | 
				
			||||||
 | 
					        // Note: will re-instantiate the library !
 | 
				
			||||||
 | 
					        // QObject *rootObject = pluginLoader.instance();
 | 
				
			||||||
 | 
					        // if (rootObject) {
 | 
				
			||||||
 | 
					        //    qCritical() << "reloaded plugin: root object again available";
 | 
				
			||||||
 | 
					        //    return false;
 | 
				
			||||||
 | 
					        // }
 | 
				
			||||||
 | 
					        // qCritical()unloaded plugin: root object gone";
 | 
				
			||||||
 | 
					        return true;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return false;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class hwapi;
 | 
				
			||||||
 | 
					Update::Update(QString customerRepository,
 | 
				
			||||||
 | 
					               QString customerNrStr,
 | 
				
			||||||
 | 
					               QString branchName,
 | 
				
			||||||
 | 
					               QString plugInDir,
 | 
				
			||||||
 | 
					               QString pluginName,
 | 
				
			||||||
 | 
					               QString workingDir,
 | 
				
			||||||
 | 
					               bool dryRun,
 | 
				
			||||||
 | 
					               QObject *parent,
 | 
				
			||||||
 | 
					               char const *serialInterface,
 | 
				
			||||||
 | 
					               char const *baudrate)
 | 
				
			||||||
 | 
					    : QObject(parent)
 | 
				
			||||||
 | 
					    , m_hw(loadDCPlugin(QDir(plugInDir), pluginName))
 | 
				
			||||||
 | 
					    , m_serialInterface(serialInterface)
 | 
				
			||||||
 | 
					    , m_baudrate(baudrate)
 | 
				
			||||||
 | 
					    , m_customerRepository(customerRepository)
 | 
				
			||||||
 | 
					    , m_customerNrStr(customerNrStr)
 | 
				
			||||||
 | 
					    , m_branchName(branchName)
 | 
				
			||||||
 | 
					    , m_pluginName(pluginName)
 | 
				
			||||||
 | 
					    , m_workingDir(workingDir)
 | 
				
			||||||
 | 
					    , m_dryRun(dryRun)
 | 
				
			||||||
 | 
					    , m_sys_areDCdataValid(false) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (!m_hw) {
 | 
				
			||||||
 | 
					        qCritical() << "(" << __func__ << ":" << __LINE__ << ") m_hw == nullptr -> ca-slave plugin loaded ???";
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					        int tries = 20;
 | 
				
			||||||
 | 
					        while ((m_sys_areDCdataValid = m_hw->sys_areDCdataValid()) == false) {
 | 
				
			||||||
 | 
					            // must deliver 'true', only then are all data from hwapi valid
 | 
				
			||||||
 | 
					            if (--tries < 0) {
 | 
				
			||||||
 | 
					                qCritical() << "ERROR!!! DC DATA NOT VALID -> CA-MASTER-PLUGIN NOT CONNECTED";
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            m_hw->dc_autoRequest(true);
 | 
				
			||||||
 | 
					            QThread::msleep(500);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        qCritical() << "(" << __func__ << ":" << __LINE__ << ") m_sys_areDCDataValid ..."
 | 
				
			||||||
 | 
					                    << m_sys_areDCdataValid;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if 0
 | 
				
			||||||
 | 
					        QObject const *obj = m_hw->getAPI();
 | 
				
			||||||
 | 
					        Q_ASSERT(obj != nullptr);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        QDebug critical = qCritical();
 | 
				
			||||||
 | 
					        critical << "connect() to onReportDCDownloadStatus() ...";
 | 
				
			||||||
 | 
					        if (!connect(obj,
 | 
				
			||||||
 | 
					                     SIGNAL(hwapi_reportDCDownloadStatus(QString const&)),
 | 
				
			||||||
 | 
					                     this,
 | 
				
			||||||
 | 
					                     SLOT(onReportDCDownloadStatus(QString const &)))) {
 | 
				
			||||||
 | 
					            critical << "FAILED";
 | 
				
			||||||
 | 
					        } else critical << "DONE";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        critical = qCritical();
 | 
				
			||||||
 | 
					        critical << "connect() to onReportDCDownloadSuccess() ...";
 | 
				
			||||||
 | 
					        if (!connect(obj,
 | 
				
			||||||
 | 
					            SIGNAL(hwapi_reportDCDownloadSuccess(QString const&)), this,
 | 
				
			||||||
 | 
					            SLOT(onReportDCDownloadSuccess(QString const &)))) {
 | 
				
			||||||
 | 
					            critical << "FAILED";
 | 
				
			||||||
 | 
					        } else critical << "DONE";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        critical = qCritical();
 | 
				
			||||||
 | 
					        critical << "connect() to onReportDCDownloadFailure() ...";
 | 
				
			||||||
 | 
					        if (!connect(obj,
 | 
				
			||||||
 | 
					            SIGNAL(hwapi_reportDCDownloadFailure(QString const &)), this,
 | 
				
			||||||
 | 
					            SLOT(onReportDCDownloadFailure(QString const &)))) {
 | 
				
			||||||
 | 
					            critical << "FAILED";
 | 
				
			||||||
 | 
					        } else critical << "DONE";
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Update::~Update() {
 | 
				
			||||||
 | 
					    // unloadDCPlugin();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool Update::doUpdate(QStringList const &filesToWorkOn) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    int tries = 20;
 | 
				
			||||||
 | 
					    while ((m_sys_areDCdataValid = m_hw->sys_areDCdataValid()) == false) {
 | 
				
			||||||
 | 
					        // must deliver 'true', only then are all data from hwapi valid
 | 
				
			||||||
 | 
					        if (--tries < 0) {
 | 
				
			||||||
 | 
					            qCritical() << "ERROR!!! DC DATA NOT VALID -> CA-SLAVE-PLUGIN NOT CONNECTED";
 | 
				
			||||||
 | 
					            return false;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        qCritical() << "ERROR!!! DC DATA NOT VALID -> CA-SLAVE-PLUGIN NOT CONNECTED (" << tries << ")";
 | 
				
			||||||
 | 
					        m_hw->dc_autoRequest(true);
 | 
				
			||||||
 | 
					        QThread::msleep(500);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    bool res = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    QList<QString>::const_iterator it;
 | 
				
			||||||
 | 
					    for (it = filesToWorkOn.cbegin(); it != filesToWorkOn.cend(); ++it) {
 | 
				
			||||||
 | 
					        QString const &fToWorkOn = QDir::cleanPath(m_customerRepository + QDir::separator() + it->trimmed());
 | 
				
			||||||
 | 
					        if (fToWorkOn.contains("DC2C_print", Qt::CaseInsensitive)
 | 
				
			||||||
 | 
					         && fToWorkOn.endsWith(".json", Qt::CaseInsensitive)) {
 | 
				
			||||||
 | 
					            res = true;
 | 
				
			||||||
 | 
					            int i = fToWorkOn.indexOf("DC2C_print", Qt::CaseInsensitive);
 | 
				
			||||||
 | 
					            int const templateIdx = fToWorkOn.mid(i).midRef(10, 2).toInt();
 | 
				
			||||||
 | 
					            if ((templateIdx < 1) || (templateIdx > 32)) {
 | 
				
			||||||
 | 
					                qCritical() << "WRONG TEMPLATE INDEX" << templateIdx;
 | 
				
			||||||
 | 
					                res = false;
 | 
				
			||||||
 | 
					            } else {
 | 
				
			||||||
 | 
					                if ((res = updatePrinterTemplate(templateIdx, fToWorkOn))) {
 | 
				
			||||||
 | 
					                    qCritical() <<
 | 
				
			||||||
 | 
					                        QString("DOWNLOADED PRINTER TEMPLATE %1 WITH INDEX=%2")
 | 
				
			||||||
 | 
					                            .arg(fToWorkOn)
 | 
				
			||||||
 | 
					                            .arg(templateIdx);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        } else if (fToWorkOn.contains("DC2C_cash", Qt::CaseInsensitive)
 | 
				
			||||||
 | 
					                && fToWorkOn.endsWith(".json", Qt::CaseInsensitive)) {
 | 
				
			||||||
 | 
					            res = true;
 | 
				
			||||||
 | 
					            if ((res = updateCashConf(fToWorkOn))) {
 | 
				
			||||||
 | 
					                qCritical() << QString("DOWNLOADED CASH TEMPLATE %1").arg(fToWorkOn);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        } else if (fToWorkOn.contains("DC2C_conf", Qt::CaseInsensitive)
 | 
				
			||||||
 | 
					                && fToWorkOn.endsWith(".json", Qt::CaseInsensitive)) {
 | 
				
			||||||
 | 
					            res = true;
 | 
				
			||||||
 | 
					            if ((res= updateConfig(fToWorkOn))) {
 | 
				
			||||||
 | 
					                qCritical() << QString("DOWNLOADED CONFIG TEMPLATE %1").arg(fToWorkOn);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        } else if (fToWorkOn.contains("DC2C_device", Qt::CaseInsensitive)
 | 
				
			||||||
 | 
					                && fToWorkOn.endsWith(".json", Qt::CaseInsensitive)) {
 | 
				
			||||||
 | 
					            res = true;
 | 
				
			||||||
 | 
					            if ((res = updateDeviceConf(fToWorkOn))) {
 | 
				
			||||||
 | 
					                qCritical() << QString("DOWNLOADED DEVICE TEMPLATE %1").arg(fToWorkOn);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            qCritical() << "UNKNOWN JSON FILE NAME" << fToWorkOn;
 | 
				
			||||||
 | 
					            res = false;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return res;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool Update::checkDownloadedJsonVersions(QStringList const& jsonFileNames) {
 | 
				
			||||||
 | 
					    for (QStringList::size_type i=0; i < jsonFileNames.size(); ++i) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        uint8_t jsonNr = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        QString const &fName = jsonFileNames[i];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (fName.endsWith("conf.json")) {
 | 
				
			||||||
 | 
					            jsonNr = 1;
 | 
				
			||||||
 | 
					        } else
 | 
				
			||||||
 | 
					        if (fName.endsWith("device.json")) {
 | 
				
			||||||
 | 
					            jsonNr = 2;
 | 
				
			||||||
 | 
					        } else
 | 
				
			||||||
 | 
					        if (fName.endsWith("cash.json")) {
 | 
				
			||||||
 | 
					            jsonNr = 3;
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            QRegularExpressionMatch match;
 | 
				
			||||||
 | 
					            static const QRegularExpression re("^(.*print)([0-3][0-9])\\.json\\s*$");
 | 
				
			||||||
 | 
					            int idx = fName.indexOf(re, 0, &match);
 | 
				
			||||||
 | 
					            if (idx != -1) {
 | 
				
			||||||
 | 
					                QString captured = match.captured(match.lastCapturedIndex());
 | 
				
			||||||
 | 
					                bool ok = false;
 | 
				
			||||||
 | 
					                int n = captured.toInt(&ok);
 | 
				
			||||||
 | 
					                if (ok) {
 | 
				
			||||||
 | 
					                    jsonNr = n + 4;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (jsonNr != 0) {
 | 
				
			||||||
 | 
					#if 0
 | 
				
			||||||
 | 
					            m_hw->sys_requestJsonVersions(jsonNr);
 | 
				
			||||||
 | 
					            QThread::msleep(500);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            char buf[64];
 | 
				
			||||||
 | 
					            memset(buf, 0x00, sizeof(buf));
 | 
				
			||||||
 | 
					            m_hw->sys_getJsonVersions(jsonNr, buf);
 | 
				
			||||||
 | 
					            buf[sizeof(buf)-1] = '\0';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            QString const installedVersion(buf);
 | 
				
			||||||
 | 
					            QString const fileVersion = getFileVersion(jsonFileNames[i]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            qCritical() << "installed version:" << installedVersion;
 | 
				
			||||||
 | 
					            qCritical() << "     file version:" << fileVersion;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (installedVersion == fileVersion) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            qCritical() << "CANNOT FIND JSON-NR FOR" << fName;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return false;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool Update::downloadJson(enum FileTypeJson type,
 | 
				
			||||||
 | 
					                          int templateIdx,
 | 
				
			||||||
 | 
					                          QString jsFileToSendToDC) const {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    m_hw->dc_autoRequest(true); // downloading Json needs the AutoEmission flag
 | 
				
			||||||
 | 
					    qDebug() << "SET AUTO-REQUEST=TRUE";
 | 
				
			||||||
 | 
					    QThread::sleep(1);  // make sure the auto-request flag is acknowledged
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    QStringList lst;
 | 
				
			||||||
 | 
					    bool ready = false;
 | 
				
			||||||
 | 
					    int nTry = 25;
 | 
				
			||||||
 | 
					    while ((ready = m_hw->sys_ready4sending()) == false) {
 | 
				
			||||||
 | 
					        QThread::msleep(200);
 | 
				
			||||||
 | 
					        if (--nTry <= 0) {
 | 
				
			||||||
 | 
					            qCritical() << "SYS NOT READY FOR SENDING AFTER 5 SECONDS";
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    bool ret = false;
 | 
				
			||||||
 | 
					    QString msg;
 | 
				
			||||||
 | 
					    lst.clear();
 | 
				
			||||||
 | 
					    if (ready) {
 | 
				
			||||||
 | 
					        QFile file(jsFileToSendToDC);
 | 
				
			||||||
 | 
					        QFileInfo fi(jsFileToSendToDC); // max. size of template file is 800 bytes
 | 
				
			||||||
 | 
					        if (file.exists()) {
 | 
				
			||||||
 | 
					            if (file.open(QIODevice::ReadOnly)) {
 | 
				
			||||||
 | 
					                if (fi.size() > 0 && fi.size() <= 800) {
 | 
				
			||||||
 | 
					                    QByteArray ba = file.readAll();
 | 
				
			||||||
 | 
					                    // kindOfFile: 1=config, 2=device, 3=cash, 4=serial, 5=time, 6=printer
 | 
				
			||||||
 | 
					                    //      nrOfTemplate=1...32 if kindOfFile==6
 | 
				
			||||||
 | 
					                    //      content = content of the Json file, max 800byte ascii signs
 | 
				
			||||||
 | 
					                    if (m_hw->sys_sendJsonFileToDc((uint8_t)(type),
 | 
				
			||||||
 | 
					                                                   templateIdx,
 | 
				
			||||||
 | 
					                                                   (uint8_t *)ba.data())) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        /*
 | 
				
			||||||
 | 
					                         *  Note: the machine id is contained in DC2C_conf.json.
 | 
				
			||||||
 | 
					                         *  The idea was to use this to check if the download of
 | 
				
			||||||
 | 
					                         *  the json-file was correct. It did not work, as the
 | 
				
			||||||
 | 
					                         *  update of the PSA (to reflect a change in the
 | 
				
			||||||
 | 
					                         *  machine id) did not happen immediately.
 | 
				
			||||||
 | 
					                         *
 | 
				
			||||||
 | 
					                            m_hw->dc_autoRequest(true);
 | 
				
			||||||
 | 
					                            QThread::msleep(500);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                            // testing
 | 
				
			||||||
 | 
					                            m_hw->request_ReadbackMachineID();
 | 
				
			||||||
 | 
					                            QThread::msleep(500);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                            uint8_t data[64];
 | 
				
			||||||
 | 
					                            memset(data, 0x00, sizeof(data));
 | 
				
			||||||
 | 
					                            uint8_t length = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                            m_hw->readback_machineIDdata(&length, data);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                            QThread::msleep(500);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                            QByteArray ba((const char*)data, length);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                            qCritical() << length << "MACHINE ID =" << ba.toHex(':');
 | 
				
			||||||
 | 
					                        */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        ret = true;
 | 
				
			||||||
 | 
					                    } else {
 | 
				
			||||||
 | 
					                        qCritical() << QString("ERROR SEND JSON-FILE %1 TO DC").arg(file.fileName());
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                } else {
 | 
				
			||||||
 | 
					                    qCritical() << QString("SIZE OF %1 TOO BIG (%2 BYTES)").arg(jsFileToSendToDC).arg(fi.size());
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            } else {
 | 
				
			||||||
 | 
					                qCritical() << QString("CAN NOT OPEN ") + jsFileToSendToDC + " FOR READING";
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            qCritical() << (QString(jsFileToSendToDC) + " DOES NOT EXIST");
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    m_hw->dc_autoRequest(false);
 | 
				
			||||||
 | 
					    qDebug() << "SET AUTO-REQUEST=FALSE";
 | 
				
			||||||
 | 
					    QThread::sleep(1);  // make sure the auto-request flag is acknowledged
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return ret;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool Update::updatePrinterTemplate(int templateIdx, QString jsFile) const {
 | 
				
			||||||
 | 
					    return downloadJson(FileTypeJson::PRINTER, templateIdx, jsFile);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool Update::updateConfig(QString jsFile) {
 | 
				
			||||||
 | 
					    return downloadJson(FileTypeJson::CONFIG, 0, jsFile);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool Update::updateCashConf(QString jsFile) {
 | 
				
			||||||
 | 
					    return downloadJson(FileTypeJson::CASH, 0, jsFile);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool Update::updateDeviceConf(QString jsFile) {
 | 
				
			||||||
 | 
					    return downloadJson(FileTypeJson::DEVICE, 0, jsFile);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										107
									
								
								DownloadDCJsonFiles/update.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										107
									
								
								DownloadDCJsonFiles/update.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,107 @@
 | 
				
			|||||||
 | 
					#ifndef UPDATE_H_INCLUDED
 | 
				
			||||||
 | 
					#define UPDATE_H_INCLUDED
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <QObject>
 | 
				
			||||||
 | 
					#include <QString>
 | 
				
			||||||
 | 
					#include <QFile>
 | 
				
			||||||
 | 
					#include <QDir>
 | 
				
			||||||
 | 
					#include <QByteArray>
 | 
				
			||||||
 | 
					#include <QProcess>
 | 
				
			||||||
 | 
					#include <QPluginLoader>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <DeviceController/interfaces.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef PTU5
 | 
				
			||||||
 | 
					#define SERIAL_PORT "ttymxc2"
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					#define SERIAL_PORT "ttyUSB0"
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class Update : public QObject {
 | 
				
			||||||
 | 
					    Q_OBJECT
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    hwinf *m_hw = nullptr;
 | 
				
			||||||
 | 
					    char const *m_serialInterface;
 | 
				
			||||||
 | 
					    char const *m_baudrate;
 | 
				
			||||||
 | 
					    QString m_customerRepository;
 | 
				
			||||||
 | 
					    QString m_customerNrStr;
 | 
				
			||||||
 | 
					    QString m_branchName;
 | 
				
			||||||
 | 
					    QString m_pluginName;
 | 
				
			||||||
 | 
					    QString m_workingDir;
 | 
				
			||||||
 | 
					    bool m_maintenanceMode;
 | 
				
			||||||
 | 
					    bool m_dryRun;
 | 
				
			||||||
 | 
					    bool m_sys_areDCdataValid;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    static QPluginLoader pluginLoader;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public:
 | 
				
			||||||
 | 
					    enum class DownloadResult {OK, ERROR, TIMEOUT, NOP};
 | 
				
			||||||
 | 
					    enum class FileTypeJson {CONFIG=1, DEVICE=2, CASH=3, SERIAL=4, TIME=5, PRINTER=6};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    static hwinf *loadDCPlugin(QDir const &plugInDir, QString const &fn);
 | 
				
			||||||
 | 
					    static bool unloadDCPlugin();
 | 
				
			||||||
 | 
					    static QStringList split(QString line, QChar sep = ',');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    explicit Update(QString customerRepository,
 | 
				
			||||||
 | 
					                    QString customerNrStr,
 | 
				
			||||||
 | 
					                    QString branchName,
 | 
				
			||||||
 | 
					                    QString plugInDir,
 | 
				
			||||||
 | 
					                    QString pluginName,
 | 
				
			||||||
 | 
					                    QString workingDir,
 | 
				
			||||||
 | 
					                    bool dryRun = false,
 | 
				
			||||||
 | 
					                    QObject *parent = nullptr,
 | 
				
			||||||
 | 
					                    char const *serialInterface = SERIAL_PORT,
 | 
				
			||||||
 | 
					                    char const *baudrate = "115200");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    virtual ~Update() override;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    bool doUpdate(QStringList const &jsonFilesToDownload);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    bool updatePrinterTemplate(int templateIdx, QString fname) const;
 | 
				
			||||||
 | 
					    bool updateConfig(QString jsFileToSendToDC);
 | 
				
			||||||
 | 
					    bool updateCashConf(QString jsFileToSendToDC);
 | 
				
			||||||
 | 
					    bool updateDeviceConf(QString jsFileToSendToDC);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    bool downloadJson(enum FileTypeJson type, int templateIdx,
 | 
				
			||||||
 | 
					                      QString jsFileToSendToDC) const;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    bool checkDownloadedJsonVersions(QStringList const& jsonFileNames);
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					    bool checkDownloadedJsonVersions(QStringList const& jsonFileNames);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    hwinf *hw() { return m_hw; }
 | 
				
			||||||
 | 
					    hwinf const *hw() const { return m_hw; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    //QString customerId() { return m_customerId; }
 | 
				
			||||||
 | 
					    //QString const customerId() const { return m_customerId; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    QString branchName() { return m_branchName; }
 | 
				
			||||||
 | 
					    QString const branchName() const { return m_branchName; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    //QString repositoryPath() { return m_repositoryPath; }
 | 
				
			||||||
 | 
					    //QString const repositoryPath() const { return m_repositoryPath; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					private:
 | 
				
			||||||
 | 
					    static QString jsonType(enum FileTypeJson type);
 | 
				
			||||||
 | 
					    bool openSerial(int br, QString baudrate, QString comPort) const;
 | 
				
			||||||
 | 
					    void closeSerial() const;
 | 
				
			||||||
 | 
					    bool isSerialOpen() const;
 | 
				
			||||||
 | 
					    bool resetDeviceController() const;
 | 
				
			||||||
 | 
					    QByteArray loadBinaryDCFile(QString filename) const;
 | 
				
			||||||
 | 
					    bool downloadBinaryToDC(QString const &bFile) const;
 | 
				
			||||||
 | 
					    bool updateBinary(QString const &fileToSendToDC);
 | 
				
			||||||
 | 
					    QStringList getDcSoftAndHardWareVersion();
 | 
				
			||||||
 | 
					    QString getFileVersion(QString const& jsonFile);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					private slots:
 | 
				
			||||||
 | 
					    void readyReadStandardOutput();
 | 
				
			||||||
 | 
					    void readyReadStandardError();
 | 
				
			||||||
 | 
					    void finished(int exitCode, QProcess::ExitStatus exitStatus);
 | 
				
			||||||
 | 
					    void onReportDCDownloadStatus(QString const &status);
 | 
				
			||||||
 | 
					    void onReportDCDownloadSuccess(QString const &msg);
 | 
				
			||||||
 | 
					    void onReportDCDownloadFailure(QString const &errorMsg);
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					#endif // UPDATE_H_INCLUDED
 | 
				
			||||||
@@ -105,7 +105,19 @@ DEFINES += QT_DEPRECATED_WARNINGS
 | 
				
			|||||||
#           checking of the ISMAS-trigger-button (aka WAIT-button).
 | 
					#           checking of the ISMAS-trigger-button (aka WAIT-button).
 | 
				
			||||||
# 1.4.1   : Sync files in the customer repository (under ./etc) as the very
 | 
					# 1.4.1   : Sync files in the customer repository (under ./etc) as the very
 | 
				
			||||||
#           first step
 | 
					#           first step
 | 
				
			||||||
VERSION="1.4.1"
 | 
					# 1.4.2   : Do not check if <repo_dir>/etc/psa_tariff and /etc/psa_tariff are
 | 
				
			||||||
 | 
					#           the same after an rsync. They might be noy after a change of the
 | 
				
			||||||
 | 
					#           customer-number.
 | 
				
			||||||
 | 
					# 1.4.3   : Use global directory for device-controller interfaces.h-file.
 | 
				
			||||||
 | 
					# 1.4.4   : Add additional debug messages when downloading json-files.
 | 
				
			||||||
 | 
					#           Move rsyncing of the customer-repository after the actual fetching
 | 
				
			||||||
 | 
					#           of the repository. Otherwise, the update of, for instance
 | 
				
			||||||
 | 
					#           tariff-files, would always be a step behind.
 | 
				
			||||||
 | 
					# 1.4.5   : In case a new branch has been created in a remote
 | 
				
			||||||
 | 
					#           customer-repository (e.g. origin/zg1/zone101), then fetch/pull
 | 
				
			||||||
 | 
					#           this branch before switching to this now locally existen branch.
 | 
				
			||||||
 | 
					#         : Improve output of GUI/Console and messages sent to ISMAS.
 | 
				
			||||||
 | 
					VERSION="1.4.6"
 | 
				
			||||||
# PLANNED TODOS:
 | 
					# PLANNED TODOS:
 | 
				
			||||||
#   1:  Das Repository wird repariert bwz. neu geklont. Unabhaengig vom WAIT.
 | 
					#   1:  Das Repository wird repariert bwz. neu geklont. Unabhaengig vom WAIT.
 | 
				
			||||||
#   2:  Wenn der WAIT-Button aktiv ist, dann wird ein Repository repariert (neu
 | 
					#   2:  Wenn der WAIT-Button aktiv ist, dann wird ein Repository repariert (neu
 | 
				
			||||||
@@ -194,6 +206,12 @@ contains( CONFIG, PTU5 ) {
 | 
				
			|||||||
    CONFIG += link_pkgconfig
 | 
					    CONFIG += link_pkgconfig
 | 
				
			||||||
    lessThan(QT_MAJOR_VERSION, 5):   PKGCONFIG += qextserialport
 | 
					    lessThan(QT_MAJOR_VERSION, 5):   PKGCONFIG += qextserialport
 | 
				
			||||||
    QMAKE_CXXFLAGS += -O2 -std=c++17   # for GCC >= 4.7
 | 
					    QMAKE_CXXFLAGS += -O2 -std=c++17   # for GCC >= 4.7
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    PTU5BASEPATH = /opt/devel/ptu5
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    INCLUDEPATH += $$PTU5BASEPATH/qt/libs/devicecontroller/include
 | 
				
			||||||
 | 
					    LIBS += -L$$PTU5BASEPATH/qt/libs/devicecontroller/library
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # QMAKE_CXXFLAGS += -Wno-deprecated-copy
 | 
					    # QMAKE_CXXFLAGS += -Wno-deprecated-copy
 | 
				
			||||||
    ARCH = PTU5
 | 
					    ARCH = PTU5
 | 
				
			||||||
    DEFINES+=PTU5
 | 
					    DEFINES+=PTU5
 | 
				
			||||||
@@ -206,8 +224,8 @@ contains( CONFIG, PTU5_YOCTO ) {
 | 
				
			|||||||
    ARCH = PTU5
 | 
					    ARCH = PTU5
 | 
				
			||||||
    DEFINES+=PTU5
 | 
					    DEFINES+=PTU5
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # add qmqtt lib
 | 
					    LIBS += -lCAslave
 | 
				
			||||||
    #LIBS += -lQt5Qmqtt
 | 
					    LIBS += -lCAmaster
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
contains( CONFIG, DesktopLinux ) {
 | 
					contains( CONFIG, DesktopLinux ) {
 | 
				
			||||||
    greaterThan(QT_MAJOR_VERSION, 4): QT += serialport
 | 
					    greaterThan(QT_MAJOR_VERSION, 4): QT += serialport
 | 
				
			||||||
@@ -247,9 +265,7 @@ HEADERS += \
 | 
				
			|||||||
        process/command.h \
 | 
					        process/command.h \
 | 
				
			||||||
        message_handler.h \
 | 
					        message_handler.h \
 | 
				
			||||||
        worker.h \
 | 
					        worker.h \
 | 
				
			||||||
        interfaces.h \
 | 
					        commandline_parser.h
 | 
				
			||||||
        commandline_parser.h \
 | 
					 | 
				
			||||||
        plugins/interfaces.h
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
OTHER_FILES += \
 | 
					OTHER_FILES += \
 | 
				
			||||||
    ATBUpdateTool.ini
 | 
					    ATBUpdateTool.ini
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -6,6 +6,7 @@
 | 
				
			|||||||
#include <QRegularExpression>
 | 
					#include <QRegularExpression>
 | 
				
			||||||
#include <QDebug>
 | 
					#include <QDebug>
 | 
				
			||||||
#include <QDir>
 | 
					#include <QDir>
 | 
				
			||||||
 | 
					#include <QStringList>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
GitClient::GitClient(QString const &customerNrStr,
 | 
					GitClient::GitClient(QString const &customerNrStr,
 | 
				
			||||||
@@ -290,6 +291,100 @@ bool GitClient::gitFsck() {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
    return r;
 | 
					    return r;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool GitClient::branchExistsRemotely() {
 | 
				
			||||||
 | 
					    bool remoteBranchExists = false;
 | 
				
			||||||
 | 
					    if (QDir(m_customerRepository).exists()) {
 | 
				
			||||||
 | 
					        qInfo() << "BRANCH NAME" << m_branchName;
 | 
				
			||||||
 | 
					        QString const cmd = QString("git ls-remote --exit-code --heads origin %1").arg(m_branchName);
 | 
				
			||||||
 | 
					        Command c(cmd);
 | 
				
			||||||
 | 
					        if (c.execute(m_customerRepository)) {
 | 
				
			||||||
 | 
					            // expected result: c16c833c8778c1b3691a74afee5a469177e4e69b refs/heads/zg1/zone1000
 | 
				
			||||||
 | 
					            QString const s = c.getCommandResult().trimmed();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (!s.isEmpty()) {
 | 
				
			||||||
 | 
					                // the result is only one line
 | 
				
			||||||
 | 
					                if ((remoteBranchExists = s.contains(m_branchName)) == true) {
 | 
				
			||||||
 | 
					                    qCritical() << "(" << __func__ << ":" << __LINE__ << ") branch"
 | 
				
			||||||
 | 
					                                << m_branchName << "EXISTS REMOTELY. (" << s << ")";
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            } else {
 | 
				
			||||||
 | 
					                Utils::printCriticalErrorMsg(QString("EMPTY RESULT FOR CMD %1").arg(cmd));
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            Utils::printCriticalErrorMsg(QString("FAILED TO EXEC '%1'").arg(cmd));
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return remoteBranchExists;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool GitClient::branchExistsLocally() {
 | 
				
			||||||
 | 
					    Command c("git branch -l");
 | 
				
			||||||
 | 
					    if (c.execute(m_customerRepository)) {
 | 
				
			||||||
 | 
					        QString const s = c.getCommandResult().trimmed();
 | 
				
			||||||
 | 
					        if (!s.isEmpty()) {
 | 
				
			||||||
 | 
					            QStringList lines = Update::split(s, '\n');
 | 
				
			||||||
 | 
					            if (!lines.empty()) {
 | 
				
			||||||
 | 
					                for (int i=0; i < lines.size(); ++i) {
 | 
				
			||||||
 | 
					                    QString line = lines.at(i);
 | 
				
			||||||
 | 
					                    // expected: * [new branch]      zg1/zone12 -> origin/zg1/zone12"
 | 
				
			||||||
 | 
					                    if (line.contains(m_branchName)) {
 | 
				
			||||||
 | 
					                        if (m_worker) {
 | 
				
			||||||
 | 
					                            QStringList lst(QString("BRANCH-NAME %1 CONTAINED IN RESULT %2").arg(m_branchName).arg(s));
 | 
				
			||||||
 | 
					                            m_worker->CONSOLE(lst) << Worker::UPDATE_STEP::PULL_NEW_BRANCH;
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                        return true;
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                if (m_worker) {
 | 
				
			||||||
 | 
					                    QStringList lst(QString("BRANCH-NAME %1 NOT CONTAINED IN RESULT %2").arg(m_branchName).arg(s));
 | 
				
			||||||
 | 
					                    m_worker->CONSOLE(lst) << Worker::UPDATE_STEP::PULL_NEW_BRANCH_FAILURE;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            } else {
 | 
				
			||||||
 | 
					                if (m_worker) {
 | 
				
			||||||
 | 
					                    QStringList lst(QString("'git branch -l' RETURNED NO LINES"));
 | 
				
			||||||
 | 
					                    m_worker->CONSOLE(lst) << Worker::UPDATE_STEP::PULL_NEW_BRANCH_FAILURE;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            if (m_worker) {
 | 
				
			||||||
 | 
					                QStringList lst(QString("'git branch -l' RETURNED EMPTY RESULT"));
 | 
				
			||||||
 | 
					                m_worker->CONSOLE(lst) << Worker::UPDATE_STEP::PULL_NEW_BRANCH_FAILURE;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					        if (m_worker) {
 | 
				
			||||||
 | 
					            QStringList lst(QString("FAILED TO EXEC 'git branch -l'"));
 | 
				
			||||||
 | 
					            m_worker->CONSOLE(lst) << Worker::UPDATE_STEP::PULL_NEW_BRANCH_FAILURE;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return false;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool GitClient::gitPullNewBranches() {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (QDir(m_customerRepository).exists()) {
 | 
				
			||||||
 | 
					        Command c("git pull");
 | 
				
			||||||
 | 
					        if (c.execute(m_customerRepository)) {
 | 
				
			||||||
 | 
					            QString const s = c.getCommandResult().trimmed();
 | 
				
			||||||
 | 
					            // expected: Already up-to-date.
 | 
				
			||||||
 | 
					            if (!s.isEmpty()) {
 | 
				
			||||||
 | 
					                QStringList lst;
 | 
				
			||||||
 | 
					                QString msg(QString("GIT-PULL-NEW-BRANCH. RESULT=%1").arg(s));
 | 
				
			||||||
 | 
					                if (m_worker) {
 | 
				
			||||||
 | 
					                    m_worker->CONSOLE(lst) << Worker::UPDATE_STEP::PULL_NEW_BRANCH;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                return true;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return false;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 Hat sich nichts geaendert, so werden auch keine Commits <>..<> angezeigt
 | 
					 Hat sich nichts geaendert, so werden auch keine Commits <>..<> angezeigt
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
@@ -316,6 +411,31 @@ std::optional<QString> GitClient::gitPull() {
 | 
				
			|||||||
                        //   6ed893f..5d9882c  zg1/zone2  -> origin/zg1/zone2
 | 
					                        //   6ed893f..5d9882c  zg1/zone2  -> origin/zg1/zone2
 | 
				
			||||||
                        //   4384d17..77045d8  zg1/zone3  -> origin/zg1/zone3
 | 
					                        //   4384d17..77045d8  zg1/zone3  -> origin/zg1/zone3
 | 
				
			||||||
                        //   89d2812..36a0d74  zg1/zone5  -> origin/zg1/zone5
 | 
					                        //   89d2812..36a0d74  zg1/zone5  -> origin/zg1/zone5
 | 
				
			||||||
 | 
					                        //
 | 
				
			||||||
 | 
					                        // More exactly:
 | 
				
			||||||
 | 
					                        // remote: Counting objects: 382, done.
 | 
				
			||||||
 | 
					                        // remote: Compressing objects: 100% (203/203), done.
 | 
				
			||||||
 | 
					                        // remote: Total 278 (delta 177), reused 103 (delta 59)
 | 
				
			||||||
 | 
					                        // Receiving objects: 100% (278/278), 4.89 MiB | 539 KiB/s, done.
 | 
				
			||||||
 | 
					                        // Resolving deltas: 100% (177/177), completed with 40 local objects.
 | 
				
			||||||
 | 
					                        // From ssh://longair@pacific.mpi-cbg.de/srv/git/fiji
 | 
				
			||||||
 | 
					                        // 3036acc..9eb5e40  debian-release-20081030 -> origin/debian-release-20081030
 | 
				
			||||||
 | 
					                        // * [new branch]      debian-release-20081112 -> origin/debian-release-20081112
 | 
				
			||||||
 | 
					                        // * [new branch]      debian-release-20081112.1 -> origin/debian-release-20081112.1
 | 
				
			||||||
 | 
					                        // 3d619e7..6260626  master     -> origin/master
 | 
				
			||||||
 | 
					                        //
 | 
				
			||||||
 | 
					                        // The most important bits here are the lines like these:
 | 
				
			||||||
 | 
					                        //
 | 
				
			||||||
 | 
					                        //     3036acc..9eb5e40  debian-release-20081030 -> origin/debian-release-20081030
 | 
				
			||||||
 | 
					                        //   * [new branch]      debian-release-20081112 -> origin/debian-release-20081112
 | 
				
			||||||
 | 
					                        //
 | 
				
			||||||
 | 
					                        // The first line of these two shows that your remote-tracking branch
 | 
				
			||||||
 | 
					                        // origin/debian-release-20081030 has been advanced from the commit 3036acc to 9eb5e40.
 | 
				
			||||||
 | 
					                        // The bit before the arrow is the name of the branch in the remote repository.
 | 
				
			||||||
 | 
					                        // The second line similarly show that since we last did this, a new remote tracking
 | 
				
			||||||
 | 
					                        // branch has been created. (git fetch may also fetch new tags if they have appeared
 | 
				
			||||||
 | 
					                        // in the remote repository.)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                        bool found = false;
 | 
					                        bool found = false;
 | 
				
			||||||
                        for (int i=0; i < lines.size(); ++i) {
 | 
					                        for (int i=0; i < lines.size(); ++i) {
 | 
				
			||||||
                            if (lines.at(i).contains(m_branchName)) {
 | 
					                            if (lines.at(i).contains(m_branchName)) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -57,6 +57,10 @@ class GitClient : public QObject {
 | 
				
			|||||||
    static QString gitBlob(QString fileName);
 | 
					    static QString gitBlob(QString fileName);
 | 
				
			||||||
    QString gitCommitForBlob(QString blob);
 | 
					    QString gitCommitForBlob(QString blob);
 | 
				
			||||||
    bool gitIsFileTracked(QString file2name);
 | 
					    bool gitIsFileTracked(QString file2name);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    bool branchExistsRemotely();
 | 
				
			||||||
 | 
					    bool branchExistsLocally();
 | 
				
			||||||
 | 
					    bool gitPullNewBranches();
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif // GIT_CLIENT_H_INCLUDED
 | 
					#endif // GIT_CLIENT_H_INCLUDED
 | 
				
			||||||
 
 | 
				
			|||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -384,7 +384,7 @@ QString IsmasClient::errorBackendNotConnected(QString const &info,
 | 
				
			|||||||
                                              QString const &version) {
 | 
					                                              QString const &version) {
 | 
				
			||||||
    return updateNewsToIsmas("U0003",
 | 
					    return updateNewsToIsmas("U0003",
 | 
				
			||||||
                             m_progressInPercent,
 | 
					                             m_progressInPercent,
 | 
				
			||||||
                             RESULT_CODE::INSTALL_ERROR,
 | 
					                             RESULT_CODE::ISMAS_NO_CONNECTION_ERROR,
 | 
				
			||||||
                             "CHECK BACKEND CONNECTIVITY",
 | 
					                             "CHECK BACKEND CONNECTIVITY",
 | 
				
			||||||
                             info.toStdString().c_str(),
 | 
					                             info.toStdString().c_str(),
 | 
				
			||||||
                             version.toStdString().c_str());
 | 
					                             version.toStdString().c_str());
 | 
				
			||||||
@@ -394,7 +394,7 @@ QString IsmasClient::errorGitClone(QString const &info,
 | 
				
			|||||||
                                   QString const &version) {
 | 
					                                   QString const &version) {
 | 
				
			||||||
    return updateNewsToIsmas("U0003",
 | 
					    return updateNewsToIsmas("U0003",
 | 
				
			||||||
                             m_progressInPercent,
 | 
					                             m_progressInPercent,
 | 
				
			||||||
                             RESULT_CODE::INSTALL_ERROR,
 | 
					                             RESULT_CODE::GIT_CLONE_ERROR,
 | 
				
			||||||
                             "CLONE CUSTOMER REPOSITORY FAILED",
 | 
					                             "CLONE CUSTOMER REPOSITORY FAILED",
 | 
				
			||||||
                             info.toStdString().c_str(),
 | 
					                             info.toStdString().c_str(),
 | 
				
			||||||
                             version.toStdString().c_str());
 | 
					                             version.toStdString().c_str());
 | 
				
			||||||
@@ -442,7 +442,7 @@ QString IsmasClient::updateTriggerSet(QString const &info, QString const &versio
 | 
				
			|||||||
QString IsmasClient::errorUpdateTrigger(QString const &info, QString const &version) {
 | 
					QString IsmasClient::errorUpdateTrigger(QString const &info, QString const &version) {
 | 
				
			||||||
    return updateNewsToIsmas("U0003",
 | 
					    return updateNewsToIsmas("U0003",
 | 
				
			||||||
                             m_progressInPercent,
 | 
					                             m_progressInPercent,
 | 
				
			||||||
                             RESULT_CODE::INSTALL_ERROR,
 | 
					                             RESULT_CODE::ISMAS_TRIGGER_ERROR,
 | 
				
			||||||
                             "CHECK UPDATE TRIGGER",
 | 
					                             "CHECK UPDATE TRIGGER",
 | 
				
			||||||
                             info.toStdString().c_str(),
 | 
					                             info.toStdString().c_str(),
 | 
				
			||||||
                             version.toStdString().c_str());
 | 
					                             version.toStdString().c_str());
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -145,13 +145,47 @@ public:
 | 
				
			|||||||
        DIRECT_PORT = 7778
 | 
					        DIRECT_PORT = 7778
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
    enum RESULT_CODE {
 | 
					    enum RESULT_CODE {
 | 
				
			||||||
        SUCCESS=0,
 | 
					        SUCCESS=0,
 | 
				
			||||||
 | 
					        // if between 00:00 - 04:00 Wait-button state not WAIT, then we assume
 | 
				
			||||||
 | 
					        // that's an automatic nightly (not-necessary) update
 | 
				
			||||||
        NO_UPDATE_NECESSARY=1,
 | 
					        NO_UPDATE_NECESSARY=1,
 | 
				
			||||||
        BACKUP_FAILED=2,
 | 
					        // if APISM reports the ISMAS is not available (15x, 6s delay each)
 | 
				
			||||||
        WRONG_PACKAGE=3,
 | 
					        ISMAS_NO_CONNECTION_ERROR=2,
 | 
				
			||||||
        INSTALL_ERROR=4};
 | 
					        // if not within 00:00-04:00 and WAIT-button was not in state WAIT
 | 
				
			||||||
 | 
					        ISMAS_TRIGGER_ERROR=3,
 | 
				
			||||||
 | 
					        // cloning git repo. not possible
 | 
				
			||||||
 | 
					        GIT_CLONE_ERROR=4,
 | 
				
			||||||
 | 
					        // pulling from remote git server not possible
 | 
				
			||||||
 | 
					        GIT_PULL_ERROR=5,
 | 
				
			||||||
 | 
					        // fetching from remote git server not possible
 | 
				
			||||||
 | 
					        GIT_FETCH_ERROR=6,
 | 
				
			||||||
 | 
					        // merging fetched data not possible
 | 
				
			||||||
 | 
					        GIT_MERGE_ERROR=7,
 | 
				
			||||||
 | 
					        // check sanity of local customer-repository failed
 | 
				
			||||||
 | 
					        GIT_CHECK_REPOSITORY_ERROR=8,
 | 
				
			||||||
 | 
					        // switch/checkout of branch (i.e. zone) on error
 | 
				
			||||||
 | 
					        GIT_SWITCH_BRANCH_ERROR=9,
 | 
				
			||||||
 | 
					        // fetch/pull of new branch failed. the new branch was not available
 | 
				
			||||||
 | 
					        // when installing via SD-card followed by intial clone during the
 | 
				
			||||||
 | 
					        // update process.
 | 
				
			||||||
 | 
					        GIT_FETCH_NEW_BRANCH_ERROR=10,
 | 
				
			||||||
 | 
					        // error computing git-blob hash-value
 | 
				
			||||||
 | 
					        GIT_HASH_ERROR=11,
 | 
				
			||||||
 | 
					        // update for general json files failed.
 | 
				
			||||||
 | 
					        JSON_FILES_UPDATE_ERROR=12,
 | 
				
			||||||
 | 
					        // error downloading config-json-files to device controller
 | 
				
			||||||
 | 
					        JSON_FILES_DOWNLOAD_ERROR=13,
 | 
				
			||||||
 | 
					        // error downloading device-controller
 | 
				
			||||||
 | 
					        DC_DOWNLOAD_ERROR=14,
 | 
				
			||||||
 | 
					        // error rsyncing json/ini-files to local filesystem
 | 
				
			||||||
 | 
					        RSYN_ERROR=15,
 | 
				
			||||||
 | 
					        // HASH_VALUE_ERROR=14,
 | 
				
			||||||
 | 
					        // HW_COMPATIBILITY_ERROR=15,
 | 
				
			||||||
 | 
					        OPKG_COMMANDS_ERROR=16,
 | 
				
			||||||
 | 
					        // CLEANUP_ERROR=18,
 | 
				
			||||||
 | 
					        UPDATE_IN_ERROR_STATE=99
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    enum REASON {
 | 
					    enum REASON {
 | 
				
			||||||
        TIME_TRIGGERED = 0,
 | 
					        TIME_TRIGGERED = 0,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -9,7 +9,7 @@
 | 
				
			|||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "message_handler.h"
 | 
					#include "message_handler.h"
 | 
				
			||||||
#include "plugins/interfaces.h"
 | 
					#include <DeviceController/interfaces.h>
 | 
				
			||||||
#include "commandline_parser.h"
 | 
					#include "commandline_parser.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <unistd.h>
 | 
					#include <unistd.h>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -4,7 +4,7 @@
 | 
				
			|||||||
#include "utils.h"
 | 
					#include "utils.h"
 | 
				
			||||||
#include "progress_event.h"
 | 
					#include "progress_event.h"
 | 
				
			||||||
#include "update_dc_event.h"
 | 
					#include "update_dc_event.h"
 | 
				
			||||||
#include "plugins/interfaces.h"
 | 
					#include <DeviceController/interfaces.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <QDateTime>
 | 
					#include <QDateTime>
 | 
				
			||||||
#include <QMessageBox>
 | 
					#include <QMessageBox>
 | 
				
			||||||
 
 | 
				
			|||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							@@ -18,7 +18,7 @@
 | 
				
			|||||||
#include "unistd.h"
 | 
					#include "unistd.h"
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "plugins/interfaces.h"
 | 
					#include <DeviceController/interfaces.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <QSharedMemory>
 | 
					#include <QSharedMemory>
 | 
				
			||||||
#include <QScopedPointer>
 | 
					#include <QScopedPointer>
 | 
				
			||||||
@@ -140,6 +140,7 @@ Update::Update(Worker *worker,
 | 
				
			|||||||
        qCritical() << "(" << __func__ << ":" << __LINE__ << ") m_sys_areDCDataValid ..."
 | 
					        qCritical() << "(" << __func__ << ":" << __LINE__ << ") m_sys_areDCDataValid ..."
 | 
				
			||||||
                    << m_sys_areDCdataValid;
 | 
					                    << m_sys_areDCdataValid;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if 0
 | 
				
			||||||
        QObject const *obj = m_hw->getAPI();
 | 
					        QObject const *obj = m_hw->getAPI();
 | 
				
			||||||
        Q_ASSERT(obj != nullptr);
 | 
					        Q_ASSERT(obj != nullptr);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -167,6 +168,7 @@ Update::Update(Worker *worker,
 | 
				
			|||||||
            SLOT(onReportDCDownloadFailure(QString const &)))) {
 | 
					            SLOT(onReportDCDownloadFailure(QString const &)))) {
 | 
				
			||||||
            critical << "FAILED";
 | 
					            critical << "FAILED";
 | 
				
			||||||
        } else critical << "DONE";
 | 
					        } else critical << "DONE";
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -398,17 +400,26 @@ bool Update::downloadJson(enum FileTypeJson type,
 | 
				
			|||||||
    qDebug() << "SET AUTO-REQUEST=TRUE";
 | 
					    qDebug() << "SET AUTO-REQUEST=TRUE";
 | 
				
			||||||
    QThread::sleep(1);  // make sure the auto-request flag is acknowledged
 | 
					    QThread::sleep(1);  // make sure the auto-request flag is acknowledged
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    QStringList lst;
 | 
				
			||||||
    bool ready = false;
 | 
					    bool ready = false;
 | 
				
			||||||
    int nTry = 25;
 | 
					    int nTry = 25;
 | 
				
			||||||
    while ((ready = m_hw->sys_ready4sending()) == false) {
 | 
					    while ((ready = m_hw->sys_ready4sending()) == false) {
 | 
				
			||||||
        QThread::msleep(200);
 | 
					        QThread::msleep(200);
 | 
				
			||||||
        if (--nTry <= 0) {
 | 
					        if (--nTry <= 0) {
 | 
				
			||||||
            Utils::printCriticalErrorMsg("SYS NOT READY FOR SENDING AFTER 5 SECONDS");
 | 
					            QString msg("SYS NOT READY FOR SENDING AFTER 5 SECONDS");
 | 
				
			||||||
 | 
					            Utils::printCriticalErrorMsg(msg);
 | 
				
			||||||
 | 
					            lst << msg;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (m_worker) {
 | 
				
			||||||
 | 
					                m_worker->ISMAS(lst) << (m_worker->GUI(lst) << (m_worker->CONSOLE(lst) << Worker::UPDATE_STEP::DOWNLOAD_FILES_TO_PSA_HARDWARE));
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
            break;
 | 
					            break;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    bool ret = false;
 | 
					    bool ret = false;
 | 
				
			||||||
 | 
					    QString msg;
 | 
				
			||||||
 | 
					    lst.clear();
 | 
				
			||||||
    if (ready) {
 | 
					    if (ready) {
 | 
				
			||||||
        QFile file(jsFileToSendToDC);
 | 
					        QFile file(jsFileToSendToDC);
 | 
				
			||||||
        QFileInfo fi(jsFileToSendToDC); // max. size of template file is 800 bytes
 | 
					        QFileInfo fi(jsFileToSendToDC); // max. size of template file is 800 bytes
 | 
				
			||||||
@@ -450,20 +461,48 @@ bool Update::downloadJson(enum FileTypeJson type,
 | 
				
			|||||||
                            qCritical() << length << "MACHINE ID =" << ba.toHex(':');
 | 
					                            qCritical() << length << "MACHINE ID =" << ba.toHex(':');
 | 
				
			||||||
                        */
 | 
					                        */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        if (m_worker) {
 | 
				
			||||||
 | 
					                            m_worker->ISMAS(lst) << (m_worker->GUI(lst) << (m_worker->CONSOLE(lst) << Worker::UPDATE_STEP::DOWNLOAD_FILES_TO_PSA_HARDWARE));
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                        ret = true;
 | 
					                        ret = true;
 | 
				
			||||||
 | 
					                    } else {
 | 
				
			||||||
 | 
					                        msg = QString("ERROR SEND JSON-FILE %1 TO DC").arg(file.fileName());
 | 
				
			||||||
 | 
					                        Utils::printCriticalErrorMsg(msg);
 | 
				
			||||||
 | 
					                        lst << msg;
 | 
				
			||||||
 | 
					                        if (m_worker) {
 | 
				
			||||||
 | 
					                            m_worker->ISMAS(lst) <<  (m_worker->GUI(lst) << (m_worker->CONSOLE(lst)
 | 
				
			||||||
 | 
					                                                 << Worker::UPDATE_STEP::DOWNLOAD_FILES_TO_PSA_HARDWARE));
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                } else {
 | 
					                } else {
 | 
				
			||||||
                    Utils::printCriticalErrorMsg(
 | 
					                    msg = QString("SIZE OF %1 TOO BIG (%2 BYTES)").arg(jsFileToSendToDC).arg(fi.size());
 | 
				
			||||||
                        QString("SIZE OF %1 TOO BIG (%2 BYTES)")
 | 
					                    Utils::printCriticalErrorMsg(msg);
 | 
				
			||||||
                            .arg(jsFileToSendToDC).arg(fi.size()));
 | 
					                    lst << msg;
 | 
				
			||||||
 | 
					                    if (m_worker) {
 | 
				
			||||||
 | 
					                        m_worker->ISMAS(lst) <<  (m_worker->GUI(lst) << (m_worker->CONSOLE(lst)
 | 
				
			||||||
 | 
					                                             << Worker::UPDATE_STEP::DOWNLOAD_FILES_TO_PSA_HARDWARE));
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            } else {
 | 
					            } else {
 | 
				
			||||||
                Utils::printCriticalErrorMsg(
 | 
					                msg = QString("CAN NOT OPEN ") + jsFileToSendToDC + " FOR READING";
 | 
				
			||||||
                    QString("CAN NOT OPEN ") + jsFileToSendToDC + " FOR READING");
 | 
					                Utils::printCriticalErrorMsg(msg);
 | 
				
			||||||
 | 
					                lst << msg;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                if (m_worker) {
 | 
				
			||||||
 | 
					                    m_worker->ISMAS(lst) <<  (m_worker->GUI(lst) << (m_worker->CONSOLE(lst)
 | 
				
			||||||
 | 
					                                         << Worker::UPDATE_STEP::DOWNLOAD_FILES_TO_PSA_HARDWARE));
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
            Utils::printCriticalErrorMsg(
 | 
					            msg = QString(jsFileToSendToDC) + " DOES NOT EXIST";
 | 
				
			||||||
                QString(jsFileToSendToDC) + " DOES NOT EXIST");
 | 
					            Utils::printCriticalErrorMsg(msg);
 | 
				
			||||||
 | 
					            lst << msg;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (m_worker) {
 | 
				
			||||||
 | 
					                m_worker->ISMAS(lst) <<  (m_worker->GUI(lst) << (m_worker->CONSOLE(lst)
 | 
				
			||||||
 | 
					                                     << Worker::UPDATE_STEP::DOWNLOAD_FILES_TO_PSA_HARDWARE));
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -631,10 +670,18 @@ bool Update::checkDownloadedJsonVersions(QStringList const& jsonFileNames) {
 | 
				
			|||||||
    return false;
 | 
					    return false;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
bool Update::doUpdate(int &displayIndex, QStringList const &filesToWorkOn) {
 | 
					bool Update::doUpdate(int &displayIndex, QStringList const &filesToWorkOn) {
 | 
				
			||||||
    if (m_sys_areDCdataValid == false) {
 | 
					
 | 
				
			||||||
        qCritical() << "ERROR!!! DC DATA NOT VALID -> CA-MASTER-PLUGIN NOT CONNECTED";
 | 
					    int tries = 20;
 | 
				
			||||||
 | 
					    while ((m_sys_areDCdataValid = m_hw->sys_areDCdataValid()) == false) {
 | 
				
			||||||
 | 
					        // must deliver 'true', only then are all data from hwapi valid
 | 
				
			||||||
 | 
					        if (--tries < 0) {
 | 
				
			||||||
 | 
					            Utils::printCriticalErrorMsg("ERROR!!! DC DATA NOT VALID -> CA-SLAVE-PLUGIN NOT CONNECTED");
 | 
				
			||||||
            return false;
 | 
					            return false;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					        Utils::printCriticalErrorMsg("DC DATA NOT VALID -> CA-SLAVE-PLUGIN NOT CONNECTED");
 | 
				
			||||||
 | 
					        m_hw->dc_autoRequest(true);
 | 
				
			||||||
 | 
					        QThread::msleep(500);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    bool res = false;
 | 
					    bool res = false;
 | 
				
			||||||
    bool dcDownloadPossible = true;
 | 
					    bool dcDownloadPossible = true;
 | 
				
			||||||
@@ -644,6 +691,7 @@ bool Update::doUpdate(int &displayIndex, QStringList const &filesToWorkOn) {
 | 
				
			|||||||
        m_worker->startProgressLoop();
 | 
					        m_worker->startProgressLoop();
 | 
				
			||||||
        QString const &fToWorkOn = QDir::cleanPath(m_customerRepository + QDir::separator() + it->trimmed());
 | 
					        QString const &fToWorkOn = QDir::cleanPath(m_customerRepository + QDir::separator() + it->trimmed());
 | 
				
			||||||
        if (fToWorkOn.endsWith("/dc2c.bin") && dcDownloadPossible) {
 | 
					        if (fToWorkOn.endsWith("/dc2c.bin") && dcDownloadPossible) {
 | 
				
			||||||
 | 
					#if 0
 | 
				
			||||||
            // download for dc possible only once
 | 
					            // download for dc possible only once
 | 
				
			||||||
            // download of device-controller should always be the last step
 | 
					            // download of device-controller should always be the last step
 | 
				
			||||||
            dcDownloadPossible = false;
 | 
					            dcDownloadPossible = false;
 | 
				
			||||||
@@ -709,7 +757,7 @@ bool Update::doUpdate(int &displayIndex, QStringList const &filesToWorkOn) {
 | 
				
			|||||||
                    break;
 | 
					                    break;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
            bool updateBinaryRes = true;
 | 
					            bool updateBinaryRes = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            // CONSOLE()
 | 
					            // CONSOLE()
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -9,7 +9,7 @@
 | 
				
			|||||||
#include <QProcess>
 | 
					#include <QProcess>
 | 
				
			||||||
#include <QPluginLoader>
 | 
					#include <QPluginLoader>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "plugins/interfaces.h"
 | 
					#include <DeviceController/interfaces.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef PTU5
 | 
					#ifdef PTU5
 | 
				
			||||||
#define SERIAL_PORT "ttymxc2"
 | 
					#define SERIAL_PORT "ttymxc2"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -277,21 +277,24 @@ bool Utils::sameFilesInDirs(QDir const &dir1, QDir const &dir2,
 | 
				
			|||||||
        fileNameLst2 << i2.next().fileName();
 | 
					        fileNameLst2 << i2.next().fileName();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    QString dirPath1 = dir1.absolutePath();
 | 
				
			||||||
 | 
					    QString dirPath2 = dir2.absolutePath();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (fileNameLst1.isEmpty()) {
 | 
					    if (fileNameLst1.isEmpty()) {
 | 
				
			||||||
        qCritical() << "DIR1" << dir1.dirName() << " DOES NOT CONTAIN EXPECTED FILES";
 | 
					        qCritical() << "DIR1" << dirPath1 << " DOES NOT CONTAIN EXPECTED FILES";
 | 
				
			||||||
        return false;
 | 
					        return false;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    if (fileNameLst2.isEmpty())  {
 | 
					    if (fileNameLst2.isEmpty())  {
 | 
				
			||||||
        qCritical() << "DIR1" << dir2.dirName() << " DOES NOT CONTAIN EXPECTED FILES";
 | 
					        qCritical() << "DIR1" << dirPath2 << " DOES NOT CONTAIN EXPECTED FILES";
 | 
				
			||||||
        return false;
 | 
					        return false;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    if (fileNameLst1 != fileNameLst2) {
 | 
					    if (fileNameLst1 != fileNameLst2) {
 | 
				
			||||||
        printCriticalErrorMsg(dir1.dirName() + " AND " + dir2.dirName()
 | 
					        printCriticalErrorMsg(dirPath1 + " AND " + dirPath2
 | 
				
			||||||
                            + " DIFFER: [" + fileNameLst1.join(',') + "],["
 | 
					                            + " DIFFER: [" + fileNameLst1.join(',') + "],["
 | 
				
			||||||
                            + fileNameLst2.join(',') + "]");
 | 
					                            + fileNameLst2.join(',') + "]");
 | 
				
			||||||
        return false;
 | 
					        return false;
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
        printInfoMsg(dir1.dirName() + " AND " + dir2.dirName()
 | 
					        printInfoMsg(dirPath1 + " AND " + dirPath2
 | 
				
			||||||
                    + " ARE EQUAL: [" + fileNameLst1.join(',') + "]");
 | 
					                    + " ARE EQUAL: [" + fileNameLst1.join(',') + "]");
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -307,21 +310,21 @@ bool Utils::sameFilesInDirs(QDir const &dir1, QDir const &dir2,
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (gitBlobLst1.isEmpty()) {
 | 
					    if (gitBlobLst1.isEmpty()) {
 | 
				
			||||||
        qCritical() << "DIR1" << dir1.dirName() << " DOES NOT CONTAIN EXPECTED FILES";
 | 
					        qCritical() << "DIR1" << dirPath1 << " DOES NOT CONTAIN EXPECTED FILES";
 | 
				
			||||||
        return false;
 | 
					        return false;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    if (gitBlobLst2.isEmpty())  {
 | 
					    if (gitBlobLst2.isEmpty())  {
 | 
				
			||||||
        qCritical() << "DIR1" << dir2.dirName() << " DOES NOT CONTAIN EXPECTED FILES";
 | 
					        qCritical() << "DIR1" << dirPath2 << " DOES NOT CONTAIN EXPECTED FILES";
 | 
				
			||||||
        return false;
 | 
					        return false;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (gitBlobLst1 != gitBlobLst2) {
 | 
					    if (gitBlobLst1 != gitBlobLst2) {
 | 
				
			||||||
        printCriticalErrorMsg(dir1.dirName() + " AND " + dir2.dirName()
 | 
					        printCriticalErrorMsg(dirPath1 + " AND " + dirPath2
 | 
				
			||||||
                            + " DIFFER: [" + gitBlobLst1.join(',') + "],["
 | 
					                            + " DIFFER: [" + gitBlobLst1.join(',') + "],["
 | 
				
			||||||
                            + gitBlobLst2.join(',') + "]");
 | 
					                            + gitBlobLst2.join(',') + "]");
 | 
				
			||||||
        return false;
 | 
					        return false;
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
        printInfoMsg(dir1.dirName() + " AND " + dir2.dirName()
 | 
					        printInfoMsg(dirPath1 + " AND " + dirPath2
 | 
				
			||||||
                    + " CONTAIN SAME GIT-BLOBS FOR FILES: [" + fileNameLst1.join(',') + "]");
 | 
					                    + " CONTAIN SAME GIT-BLOBS FOR FILES: [" + fileNameLst1.join(',') + "]");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -19,7 +19,7 @@
 | 
				
			|||||||
#include <QScopedPointer>
 | 
					#include <QScopedPointer>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "message_handler.h"
 | 
					#include "message_handler.h"
 | 
				
			||||||
#include "plugins/interfaces.h"
 | 
					#include <DeviceController/interfaces.h>
 | 
				
			||||||
#include "ismas/ismas_client.h"
 | 
					#include "ismas/ismas_client.h"
 | 
				
			||||||
#include "progress_event.h"
 | 
					#include "progress_event.h"
 | 
				
			||||||
#include "mainwindow.h"
 | 
					#include "mainwindow.h"
 | 
				
			||||||
@@ -56,6 +56,9 @@ const QMap<UPDATE_STEP, const char*> Worker::smap (
 | 
				
			|||||||
        INSERT_ELEMENT(UPDATE_STEP::CHECK_ISMAS_TRIGGER_FAILURE),
 | 
					        INSERT_ELEMENT(UPDATE_STEP::CHECK_ISMAS_TRIGGER_FAILURE),
 | 
				
			||||||
        INSERT_ELEMENT(UPDATE_STEP::INITIAL_CLONE_WITHOUT_ACTIVE_ISMAS_TRIGGER),
 | 
					        INSERT_ELEMENT(UPDATE_STEP::INITIAL_CLONE_WITHOUT_ACTIVE_ISMAS_TRIGGER),
 | 
				
			||||||
        INSERT_ELEMENT(UPDATE_STEP::INITIAL_CLONE_WITH_ACTIVE_ISMAS_TRIGGER),
 | 
					        INSERT_ELEMENT(UPDATE_STEP::INITIAL_CLONE_WITH_ACTIVE_ISMAS_TRIGGER),
 | 
				
			||||||
 | 
					        INSERT_ELEMENT(UPDATE_STEP::PULL_NEW_BRANCH),
 | 
				
			||||||
 | 
					        INSERT_ELEMENT(UPDATE_STEP::PULL_NEW_BRANCH_FAILURE),
 | 
				
			||||||
 | 
					        INSERT_ELEMENT(UPDATE_STEP::PULL_NEW_BRANCH_SUCCESS),
 | 
				
			||||||
        INSERT_ELEMENT(UPDATE_STEP::CHECKOUT_BRANCH),
 | 
					        INSERT_ELEMENT(UPDATE_STEP::CHECKOUT_BRANCH),
 | 
				
			||||||
        INSERT_ELEMENT(UPDATE_STEP::CHECKOUT_BRANCH_SUCCESS),
 | 
					        INSERT_ELEMENT(UPDATE_STEP::CHECKOUT_BRANCH_SUCCESS),
 | 
				
			||||||
        INSERT_ELEMENT(UPDATE_STEP::CHECKOUT_BRANCH_FAILURE),
 | 
					        INSERT_ELEMENT(UPDATE_STEP::CHECKOUT_BRANCH_FAILURE),
 | 
				
			||||||
@@ -330,6 +333,7 @@ void Worker::privateUpdate() {
 | 
				
			|||||||
    m_clone = false;
 | 
					    m_clone = false;
 | 
				
			||||||
    m_repairClone = false;
 | 
					    m_repairClone = false;
 | 
				
			||||||
    m_initialClone = false;
 | 
					    m_initialClone = false;
 | 
				
			||||||
 | 
					    m_pulledNewBranch = false;
 | 
				
			||||||
                                    // the customer repository is cloned or
 | 
					                                    // the customer repository is cloned or
 | 
				
			||||||
                                    // repaired/re-cloned without checking the
 | 
					                                    // repaired/re-cloned without checking the
 | 
				
			||||||
                                    // ISMAS-trigger (WAIT-)button.
 | 
					                                    // ISMAS-trigger (WAIT-)button.
 | 
				
			||||||
@@ -439,17 +443,6 @@ void Worker::privateUpdate() {
 | 
				
			|||||||
    ISMAS(lst) << (CONSOLE(lst) << UPDATE_STEP::CHECKOUT_BRANCH);
 | 
					    ISMAS(lst) << (CONSOLE(lst) << UPDATE_STEP::CHECKOUT_BRANCH);
 | 
				
			||||||
    setProgress(_CHECKOUT_BRANCH_SUCCESS);
 | 
					    setProgress(_CHECKOUT_BRANCH_SUCCESS);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ////////////////////////////////////////////////////////////////////////////
 | 
					 | 
				
			||||||
    //
 | 
					 | 
				
			||||||
    //             (R)SYNC THE REPOSITORY WITH THE LOCAL FILEYSTEM
 | 
					 | 
				
			||||||
    //
 | 
					 | 
				
			||||||
    ////////////////////////////////////////////////////////////////////////////
 | 
					 | 
				
			||||||
    if ((continueUpdate = syncCustomerRepositoryAndFS()) == false) {
 | 
					 | 
				
			||||||
        return;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    lst = QStringList(QString(smap[UPDATE_STEP::SYNC_CUSTOMER_REPOSITORY_SUCCESS]));
 | 
					 | 
				
			||||||
    ISMAS(lst) << (GUI(lst) << (CONSOLE(lst) << UPDATE_STEP::SYNC_CUSTOMER_REPOSITORY_SUCCESS));
 | 
					 | 
				
			||||||
    setProgress(_SYNC_CUSTOMER_REPOSITORY_SUCCESS);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ////////////////////////////////////////////////////////////////////////////
 | 
					    ////////////////////////////////////////////////////////////////////////////
 | 
				
			||||||
    //
 | 
					    //
 | 
				
			||||||
@@ -464,6 +457,18 @@ void Worker::privateUpdate() {
 | 
				
			|||||||
    ISMAS() << (GUI() << (CONSOLE() << UPDATE_STEP::UPDATE_REPOSITORY));
 | 
					    ISMAS() << (GUI() << (CONSOLE() << UPDATE_STEP::UPDATE_REPOSITORY));
 | 
				
			||||||
    setProgress(_UPDATE_REPOSITORY_SUCCESS);
 | 
					    setProgress(_UPDATE_REPOSITORY_SUCCESS);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ////////////////////////////////////////////////////////////////////////////
 | 
				
			||||||
 | 
					    //
 | 
				
			||||||
 | 
					    //             (R)SYNC THE REPOSITORY WITH THE LOCAL FILEYSTEM
 | 
				
			||||||
 | 
					    //
 | 
				
			||||||
 | 
					    ////////////////////////////////////////////////////////////////////////////
 | 
				
			||||||
 | 
					    if ((continueUpdate = syncCustomerRepositoryAndFS()) == false) {
 | 
				
			||||||
 | 
					        return;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    lst = QStringList(QString(smap[UPDATE_STEP::SYNC_CUSTOMER_REPOSITORY_SUCCESS]));
 | 
				
			||||||
 | 
					    ISMAS(lst) << (GUI(lst) << (CONSOLE(lst) << UPDATE_STEP::SYNC_CUSTOMER_REPOSITORY_SUCCESS));
 | 
				
			||||||
 | 
					    setProgress(_SYNC_CUSTOMER_REPOSITORY_SUCCESS);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ////////////////////////////////////////////////////////////////////////////
 | 
					    ////////////////////////////////////////////////////////////////////////////
 | 
				
			||||||
    //
 | 
					    //
 | 
				
			||||||
@@ -518,6 +523,8 @@ bool Worker::updateTriggerSet() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    GUI() << (CONSOLE() << UPDATE_STEP::CHECK_ISMAS_TRIGGER);
 | 
					    GUI() << (CONSOLE() << UPDATE_STEP::CHECK_ISMAS_TRIGGER);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    bool const automaticUpdate = (QDateTime::currentDateTime().time().hour() < 4);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    QString triggerValue("NOT CHECKED YET");
 | 
					    QString triggerValue("NOT CHECKED YET");
 | 
				
			||||||
    static constexpr int const repeats = 15;
 | 
					    static constexpr int const repeats = 15;
 | 
				
			||||||
    for (int repeat = 1; repeat <= repeats; ++repeat) {
 | 
					    for (int repeat = 1; repeat <= repeats; ++repeat) {
 | 
				
			||||||
@@ -639,9 +646,17 @@ bool Worker::updateTriggerSet() {
 | 
				
			|||||||
                                ISMAS(lst) << (GUI(lst) << (CONSOLE(lst) << (m_lastFailedUpdateStep = UPDATE_STEP::CHECK_ISMAS_TRIGGER_WRONG_VALUE)));
 | 
					                                ISMAS(lst) << (GUI(lst) << (CONSOLE(lst) << (m_lastFailedUpdateStep = UPDATE_STEP::CHECK_ISMAS_TRIGGER_WRONG_VALUE)));
 | 
				
			||||||
                                                    // if the customer repository has just been cloned
 | 
					                                                    // if the customer repository has just been cloned
 | 
				
			||||||
                                return false;       // it is OK the ISMAS trigger might not be 'WAIT'
 | 
					                                return false;       // it is OK the ISMAS trigger might not be 'WAIT'
 | 
				
			||||||
                            } else {
 | 
					 | 
				
			||||||
                                CONSOLE(lst) << (m_lastFailedUpdateStep = UPDATE_STEP::CHECK_ISMAS_TRIGGER_FAILURE);
 | 
					 | 
				
			||||||
                            }
 | 
					                            }
 | 
				
			||||||
 | 
					                            // not a clone and empty update-trigger
 | 
				
			||||||
 | 
					                            if (automaticUpdate) {
 | 
				
			||||||
 | 
					                                // do not inform ISMAS in case of automatic update, because the
 | 
				
			||||||
 | 
					                                // update is not necessary as the trigger-button is not set to WAIT.
 | 
				
			||||||
 | 
					                                GUI(lst) << (CONSOLE(lst) << (m_lastFailedUpdateStep = UPDATE_STEP::CHECK_ISMAS_TRIGGER_WRONG_VALUE));
 | 
				
			||||||
 | 
					                                return false;
 | 
				
			||||||
 | 
					                            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                            CONSOLE(lst) << (m_lastFailedUpdateStep = UPDATE_STEP::CHECK_ISMAS_TRIGGER_FAILURE);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                            QThread::sleep(6);
 | 
					                            QThread::sleep(6);
 | 
				
			||||||
                            continue;
 | 
					                            continue;
 | 
				
			||||||
                        } else {
 | 
					                        } else {
 | 
				
			||||||
@@ -649,12 +664,22 @@ bool Worker::updateTriggerSet() {
 | 
				
			|||||||
                            if (m_clone) {
 | 
					                            if (m_clone) {
 | 
				
			||||||
                                m_ismasTriggerStatusMessage = QStringList(QString("TRIGGER-VALUE='%1' != 'WAIT'").arg(triggerValue));
 | 
					                                m_ismasTriggerStatusMessage = QStringList(QString("TRIGGER-VALUE='%1' != 'WAIT'").arg(triggerValue));
 | 
				
			||||||
                                QStringList lst = m_ismasTriggerStatusMessage;
 | 
					                                QStringList lst = m_ismasTriggerStatusMessage;
 | 
				
			||||||
 | 
					                                if (automaticUpdate) {
 | 
				
			||||||
 | 
					                                    // do not inform ISMAS in case of automatic update
 | 
				
			||||||
 | 
					                                    GUI(lst) << (CONSOLE(lst) << (m_lastFailedUpdateStep = UPDATE_STEP::CHECK_ISMAS_TRIGGER_WRONG_VALUE));
 | 
				
			||||||
 | 
					                                } else {
 | 
				
			||||||
                                    ISMAS(lst) << (GUI(lst) << (CONSOLE(lst) << (m_lastFailedUpdateStep = UPDATE_STEP::CHECK_ISMAS_TRIGGER_WRONG_VALUE)));
 | 
					                                    ISMAS(lst) << (GUI(lst) << (CONSOLE(lst) << (m_lastFailedUpdateStep = UPDATE_STEP::CHECK_ISMAS_TRIGGER_WRONG_VALUE)));
 | 
				
			||||||
 | 
					                                }
 | 
				
			||||||
                            } else {
 | 
					                            } else {
 | 
				
			||||||
                                m_ismasTriggerStatusMessage = QStringList(QString("TRIGGER-VALUE='%1' != 'WAIT'").arg(triggerValue));
 | 
					                                m_ismasTriggerStatusMessage = QStringList(QString("TRIGGER-VALUE='%1' != 'WAIT'").arg(triggerValue));
 | 
				
			||||||
                                QStringList lst = m_ismasTriggerStatusMessage;
 | 
					                                QStringList lst = m_ismasTriggerStatusMessage;
 | 
				
			||||||
 | 
					                                if (automaticUpdate) {
 | 
				
			||||||
 | 
					                                    // do not inform ISMAS in case of automatic update
 | 
				
			||||||
 | 
					                                    GUI(lst) << (CONSOLE(lst) << (m_lastFailedUpdateStep = UPDATE_STEP::CHECK_ISMAS_TRIGGER_WRONG_VALUE));
 | 
				
			||||||
 | 
					                                } else {
 | 
				
			||||||
                                    ISMAS(lst) << (GUI(lst) << (CONSOLE(lst) << (m_lastFailedUpdateStep = UPDATE_STEP::CHECK_ISMAS_TRIGGER_FAILURE)));
 | 
					                                    ISMAS(lst) << (GUI(lst) << (CONSOLE(lst) << (m_lastFailedUpdateStep = UPDATE_STEP::CHECK_ISMAS_TRIGGER_FAILURE)));
 | 
				
			||||||
                                }
 | 
					                                }
 | 
				
			||||||
 | 
					                            }
 | 
				
			||||||
                            return false;
 | 
					                            return false;
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
                    } else {
 | 
					                    } else {
 | 
				
			||||||
@@ -703,6 +728,35 @@ bool Worker::customerEnvironment() {
 | 
				
			|||||||
    ISMAS() << (GUI() << (CONSOLE() << UPDATE_STEP::CHECKOUT_BRANCH));
 | 
					    ISMAS() << (GUI() << (CONSOLE() << UPDATE_STEP::CHECKOUT_BRANCH));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (QDir(m_customerRepository).exists()) {
 | 
					    if (QDir(m_customerRepository).exists()) {
 | 
				
			||||||
 | 
					        if (m_clone == false) {
 | 
				
			||||||
 | 
					            if (m_gc.branchExistsRemotely()) {
 | 
				
			||||||
 | 
					                QString msg("PULL NEW BRANCH " + m_branchName);
 | 
				
			||||||
 | 
					                QStringList lst(msg);
 | 
				
			||||||
 | 
					                ISMAS(lst) << (GUI(lst) << (CONSOLE(lst) << UPDATE_STEP::PULL_NEW_BRANCH));
 | 
				
			||||||
 | 
					                if (!m_gc.branchExistsLocally()) {
 | 
				
			||||||
 | 
					                    msg = QString("PULLING OF NEW BRANCH " + m_branchName + " DOES NOT EXIST LOCALLY");
 | 
				
			||||||
 | 
					                    QStringList lst(msg);
 | 
				
			||||||
 | 
					                    CONSOLE(lst) << UPDATE_STEP::PULL_NEW_BRANCH;
 | 
				
			||||||
 | 
					                    if (!m_gc.gitPullNewBranches()) {
 | 
				
			||||||
 | 
					                        msg = QString("PULLING OF NEW BRANCH " + m_branchName + "FAILED");
 | 
				
			||||||
 | 
					                        QStringList lst(msg);
 | 
				
			||||||
 | 
					                        ISMAS(lst) << (GUI(lst) << (CONSOLE(lst) << (m_lastFailedUpdateStep = UPDATE_STEP::PULL_NEW_BRANCH_FAILURE)));
 | 
				
			||||||
 | 
					                        return false;
 | 
				
			||||||
 | 
					                    } else {
 | 
				
			||||||
 | 
					                        msg = QString("PULLING OF NEW BRANCH " + m_branchName + "SUCCESS");
 | 
				
			||||||
 | 
					                        QStringList lst(msg);
 | 
				
			||||||
 | 
					                        ISMAS(lst) << (GUI(lst) << (CONSOLE(lst) << (m_lastFailedUpdateStep = UPDATE_STEP::PULL_NEW_BRANCH_SUCCESS)));
 | 
				
			||||||
 | 
					                        m_pulledNewBranch = true;
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                } else {
 | 
				
			||||||
 | 
					                    msg = QString("PULLING ALREADY EXISTING LOCAL BRANCH " + m_branchName + "SUCCESS");
 | 
				
			||||||
 | 
					                    QStringList lst(msg);
 | 
				
			||||||
 | 
					                    ISMAS(lst) << (GUI(lst) << (CONSOLE(lst) << (m_lastFailedUpdateStep = UPDATE_STEP::PULL_NEW_BRANCH_SUCCESS)));
 | 
				
			||||||
 | 
					                    m_pulledNewBranch = true;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (m_gc.gitCheckoutBranch()) {
 | 
					        if (m_gc.gitCheckoutBranch()) {
 | 
				
			||||||
            return true;
 | 
					            return true;
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
@@ -726,7 +780,7 @@ bool Worker::filesToUpdate() {
 | 
				
			|||||||
    // always execute contents of opkg_commands-file
 | 
					    // always execute contents of opkg_commands-file
 | 
				
			||||||
    m_filesToUpdate << "etc/psa_update/opkg_commands";
 | 
					    m_filesToUpdate << "etc/psa_update/opkg_commands";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (m_clone && m_alwaysDownloadConfig) {
 | 
					    if ((m_clone || m_pulledNewBranch) && m_alwaysDownloadConfig) {
 | 
				
			||||||
        // always download all json-config files, even if none of them have been
 | 
					        // always download all json-config files, even if none of them have been
 | 
				
			||||||
        // changed in the git repository. useful for first installation.
 | 
					        // changed in the git repository. useful for first installation.
 | 
				
			||||||
        QDir dir(QDir::cleanPath(m_customerRepository + QDir::separator() + "etc/psa_config"));
 | 
					        QDir dir(QDir::cleanPath(m_customerRepository + QDir::separator() + "etc/psa_config"));
 | 
				
			||||||
@@ -740,7 +794,7 @@ bool Worker::filesToUpdate() {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (m_clone && m_alwaysDownloadDC) {
 | 
					    if ((m_clone || m_pulledNewBranch) && m_alwaysDownloadConfig) {
 | 
				
			||||||
        // always download the last dc-binary, even if not changed in the
 | 
					        // always download the last dc-binary, even if not changed in the
 | 
				
			||||||
        // git repository. useful for first installation.
 | 
					        // git repository. useful for first installation.
 | 
				
			||||||
        QDir dir(QDir::cleanPath(m_customerRepository + QDir::separator() + "etc/dc"));
 | 
					        QDir dir(QDir::cleanPath(m_customerRepository + QDir::separator() + "etc/dc"));
 | 
				
			||||||
@@ -908,7 +962,7 @@ bool Worker::downloadFilesToPSAHardware() {
 | 
				
			|||||||
                return true;
 | 
					                return true;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            CONSOLE(QStringList("NO FILES TO DOWNLOAD TO PSA-HW")) << (m_lastFailedUpdateStep = UPDATE_STEP::DOWNLOAD_FILES_TO_PSA_HARDWARE_FAILURE);
 | 
					            CONSOLE(lst) << (m_lastFailedUpdateStep = UPDATE_STEP::DOWNLOAD_FILES_TO_PSA_HARDWARE_FAILURE);
 | 
				
			||||||
            setProgress(_DOWNLOAD_FILES_TO_PSA_HARDWARE_FAILURE);
 | 
					            setProgress(_DOWNLOAD_FILES_TO_PSA_HARDWARE_FAILURE);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            return false;
 | 
					            return false;
 | 
				
			||||||
@@ -991,13 +1045,15 @@ bool Worker::syncCustomerRepositoryAndFS() {
 | 
				
			|||||||
                QDir dir1(QDir::cleanPath(m_customerRepository + QDir::separator() + "etc/psa_tariff"));
 | 
					                QDir dir1(QDir::cleanPath(m_customerRepository + QDir::separator() + "etc/psa_tariff"));
 | 
				
			||||||
                QDir dir2("/etc/psa_tariff");
 | 
					                QDir dir2("/etc/psa_tariff");
 | 
				
			||||||
                if (Utils::sameFilesInDirs(dir1, dir2)) {
 | 
					                if (Utils::sameFilesInDirs(dir1, dir2)) {
 | 
				
			||||||
 | 
					                    CONSOLE() <<  QDir::cleanPath(m_customerRepository + QDir::separator() + "etc/psa_tariff")
 | 
				
			||||||
 | 
					                              << "AND /etc/psa_tariff ARE DIFFERENT: CHANGED CUSTOMER-NUMBER?";
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
                CONSOLE() << UPDATE_STEP::SYNC_CUSTOMER_REPOSITORY_SUCCESS;
 | 
					                CONSOLE() << UPDATE_STEP::SYNC_CUSTOMER_REPOSITORY_SUCCESS;
 | 
				
			||||||
                setProgress(_SYNC_CUSTOMER_REPOSITORY_SUCCESS);
 | 
					                setProgress(_SYNC_CUSTOMER_REPOSITORY_SUCCESS);
 | 
				
			||||||
                return true;
 | 
					                return true;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    ISMAS() << (GUI() << (CONSOLE() << (m_lastFailedUpdateStep = UPDATE_STEP::SYNC_CUSTOMER_REPOSITORY_FAILURE)));
 | 
					    ISMAS() << (GUI() << (CONSOLE() << (m_lastFailedUpdateStep = UPDATE_STEP::SYNC_CUSTOMER_REPOSITORY_FAILURE)));
 | 
				
			||||||
    setProgress(_SYNC_CUSTOMER_REPOSITORY_FAILURE);
 | 
					    setProgress(_SYNC_CUSTOMER_REPOSITORY_FAILURE);
 | 
				
			||||||
    return false;
 | 
					    return false;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -26,11 +26,21 @@
 | 
				
			|||||||
#define SERIAL_PORT "ttyUSB0"
 | 
					#define SERIAL_PORT "ttyUSB0"
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define _ISMAS_DONE         "U0001" // 100%
 | 
					/*
 | 
				
			||||||
#define _ISMAS_SET_WAIT_OK  "U0002" // empty WAIT-button ("")
 | 
					 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_FAILURE      "U0003" // FAIL
 | 
					#define _ISMAS_FAILURE      "U0003" // FAIL
 | 
				
			||||||
#define _ISMAS_CONTINUE     "U0010" // %-values
 | 
					#define _ISMAS_CONTINUE     "U0010" // %-values: Update laeuft, Resultcodes entsprechend laufender Schritt
 | 
				
			||||||
#define _ISMAS_RESET_WAIT   "ISMAS" // reset WAIT-button to "WAIT"
 | 
					#define _ISMAS_RESET_WAIT   "ISMAS" // reset WAIT-button to "WAIT"
 | 
				
			||||||
 | 
					#define _ISMAS_TEST_TRIGGER "U0099" // check the WAIT-button
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define _STARTED                                    (1)
 | 
					#define _STARTED                                    (1)
 | 
				
			||||||
#define _CHECK_ISMAS_TRIGGER                        (2)
 | 
					#define _CHECK_ISMAS_TRIGGER                        (2)
 | 
				
			||||||
@@ -53,38 +63,41 @@
 | 
				
			|||||||
#define _CHECK_ISMAS_TRIGGER_WRONG_VALUE            (19)
 | 
					#define _CHECK_ISMAS_TRIGGER_WRONG_VALUE            (19)
 | 
				
			||||||
#define _CHECK_ISMAS_TRIGGER_SUCCESS                (20)
 | 
					#define _CHECK_ISMAS_TRIGGER_SUCCESS                (20)
 | 
				
			||||||
#define _CHECK_ISMAS_TRIGGER_FAILURE                (21)
 | 
					#define _CHECK_ISMAS_TRIGGER_FAILURE                (21)
 | 
				
			||||||
#define _CHECKOUT_BRANCH                            (22)
 | 
					#define _PULL_NEW_BRANCH                            (22)
 | 
				
			||||||
#define _CHECKOUT_BRANCH_FAILURE                    (23)
 | 
					#define _PULL_NEW_BRANCH_FAILURE                    (23)
 | 
				
			||||||
#define _CHECKOUT_BRANCH_SUCCESS                    (24)
 | 
					#define _PULL_NEW_BRANCH_SUCCESS                    (24)
 | 
				
			||||||
#define _UPDATE_REPOSITORY                          (25)
 | 
					#define _CHECKOUT_BRANCH                            (25)
 | 
				
			||||||
#define _UPDATE_REPOSITORY_FAILURE                  (26)
 | 
					#define _CHECKOUT_BRANCH_FAILURE                    (26)
 | 
				
			||||||
#define _UPDATE_REPOSITORY_SUCCESS                  (27)
 | 
					#define _CHECKOUT_BRANCH_SUCCESS                    (27)
 | 
				
			||||||
#define _CHECK_FOR_REPOSITORY_CHANGES               (28)
 | 
					#define _UPDATE_REPOSITORY                          (28)
 | 
				
			||||||
#define _CHECK_FOR_REPOSITORY_CHANGES_SUCCESS       (29)
 | 
					#define _UPDATE_REPOSITORY_FAILURE                  (29)
 | 
				
			||||||
#define _SYNC_CUSTOMER_REPOSITORY                   (30)
 | 
					#define _UPDATE_REPOSITORY_SUCCESS                  (30)
 | 
				
			||||||
#define _SYNC_CUSTOMER_REPOSITORY_FAILURE           (31)
 | 
					#define _CHECK_FOR_REPOSITORY_CHANGES               (31)
 | 
				
			||||||
#define _SYNC_CUSTOMER_REPOSITORY_SUCCESS           (32)
 | 
					#define _CHECK_FOR_REPOSITORY_CHANGES_SUCCESS       (32)
 | 
				
			||||||
#define _FILES_TO_UPDATE                            (33)
 | 
					#define _SYNC_CUSTOMER_REPOSITORY                   (33)
 | 
				
			||||||
#define _CHECK_FOR_REPOSITORY_CHANGES_FAILURE       (34)
 | 
					#define _SYNC_CUSTOMER_REPOSITORY_FAILURE           (34)
 | 
				
			||||||
#define _FILES_TO_DOWNLOAD                          (35)
 | 
					#define _SYNC_CUSTOMER_REPOSITORY_SUCCESS           (35)
 | 
				
			||||||
#define _EXEC_OPKG_COMMANDS                         (41)
 | 
					#define _FILES_TO_UPDATE                            (36)
 | 
				
			||||||
#define _EXEC_OPKG_COMMAND_1                        (42)
 | 
					#define _CHECK_FOR_REPOSITORY_CHANGES_FAILURE       (37)
 | 
				
			||||||
#define _EXEC_OPKG_COMMAND_2                        (43)
 | 
					#define _FILES_TO_DOWNLOAD                          (38)
 | 
				
			||||||
#define _EXEC_OPKG_COMMAND_3                        (44)
 | 
					#define _EXEC_OPKG_COMMANDS                         (39)
 | 
				
			||||||
#define _EXEC_OPKG_COMMAND_4                        (45)
 | 
					#define _EXEC_OPKG_COMMAND_1                        (40)
 | 
				
			||||||
#define _EXEC_OPKG_COMMAND_5                        (46)
 | 
					#define _EXEC_OPKG_COMMAND_2                        (41)
 | 
				
			||||||
#define _EXEC_OPKG_COMMAND_6                        (47)
 | 
					#define _EXEC_OPKG_COMMAND_3                        (42)
 | 
				
			||||||
#define _EXEC_OPKG_COMMAND_7                        (48)
 | 
					#define _EXEC_OPKG_COMMAND_4                        (43)
 | 
				
			||||||
#define _EXEC_OPKG_COMMAND_8                        (49)
 | 
					#define _EXEC_OPKG_COMMAND_5                        (44)
 | 
				
			||||||
#define _EXEC_OPKG_COMMAND_9                        (50)
 | 
					#define _EXEC_OPKG_COMMAND_6                        (45)
 | 
				
			||||||
#define _EXEC_OPKG_COMMAND_LAST                     (51)
 | 
					#define _EXEC_OPKG_COMMAND_7                        (46)
 | 
				
			||||||
#define _EXEC_OPKG_COMMAND_FAILURE                  (52)
 | 
					#define _EXEC_OPKG_COMMAND_8                        (47)
 | 
				
			||||||
#define _EXEC_OPKG_COMMAND_SUCCESS                  (53)
 | 
					#define _EXEC_OPKG_COMMAND_9                        (48)
 | 
				
			||||||
#define _DOWNLOAD_FILES_TO_PSA_HARDWARE             (54)
 | 
					#define _EXEC_OPKG_COMMAND_LAST                     (49)
 | 
				
			||||||
#define _DOWNLOAD_CONFIG_FILE                       (55)
 | 
					#define _EXEC_OPKG_COMMAND_FAILURE                  (50)
 | 
				
			||||||
#define _DOWNLOAD_CONFIG_FILE_SUCCESS               (56)
 | 
					#define _EXEC_OPKG_COMMAND_SUCCESS                  (51)
 | 
				
			||||||
#define _DOWNLOAD_CONFIG_FILE_FAILURE               (57)
 | 
					#define _DOWNLOAD_FILES_TO_PSA_HARDWARE             (60)
 | 
				
			||||||
#define _DOWNLOAD_DEVICE_CONTROLLER                 (65)
 | 
					#define _DOWNLOAD_CONFIG_FILE                       (61)
 | 
				
			||||||
 | 
					#define _DOWNLOAD_CONFIG_FILE_SUCCESS               (62)
 | 
				
			||||||
 | 
					#define _DOWNLOAD_CONFIG_FILE_FAILURE               (63)
 | 
				
			||||||
 | 
					#define _DOWNLOAD_DEVICE_CONTROLLER                 (64)
 | 
				
			||||||
#define _DOWNLOAD_DEVICE_CONTROLLER_SUCCESS         (85)
 | 
					#define _DOWNLOAD_DEVICE_CONTROLLER_SUCCESS         (85)
 | 
				
			||||||
#define _DOWNLOAD_DEVICE_CONTROLLER_FAILURE         (86)
 | 
					#define _DOWNLOAD_DEVICE_CONTROLLER_FAILURE         (86)
 | 
				
			||||||
#define _DOWNLOAD_FILES_TO_PSA_HARDWARE_FAILURE     (87)
 | 
					#define _DOWNLOAD_FILES_TO_PSA_HARDWARE_FAILURE     (87)
 | 
				
			||||||
@@ -162,6 +175,7 @@ class Worker : public QThread{
 | 
				
			|||||||
    bool m_ismasTriggerActive = false;
 | 
					    bool m_ismasTriggerActive = false;
 | 
				
			||||||
    bool m_updateNotNecessary = false;
 | 
					    bool m_updateNotNecessary = false;
 | 
				
			||||||
    bool m_automaticUpdate = false;
 | 
					    bool m_automaticUpdate = false;
 | 
				
			||||||
 | 
					    bool m_pulledNewBranch = false;
 | 
				
			||||||
    QStringList m_ismasTriggerStatusMessage;
 | 
					    QStringList m_ismasTriggerStatusMessage;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    MainWindow *m_mainWindow;
 | 
					    MainWindow *m_mainWindow;
 | 
				
			||||||
@@ -225,7 +239,8 @@ class Worker : public QThread{
 | 
				
			|||||||
                    m_worker->setProgress(_FINISHED);
 | 
					                    m_worker->setProgress(_FINISHED);
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            } else {
 | 
					            } else {
 | 
				
			||||||
                QStringList lst = m_worker->m_ismasTriggerStatusMessage;
 | 
					                // QStringList lst = m_worker->m_ismasTriggerStatusMessage;
 | 
				
			||||||
 | 
					                QStringList lst;
 | 
				
			||||||
                UPDATE_STEP last = m_worker->m_lastFailedUpdateStep;
 | 
					                UPDATE_STEP last = m_worker->m_lastFailedUpdateStep;
 | 
				
			||||||
                if (m_worker->smap.contains(last)) {
 | 
					                if (m_worker->smap.contains(last)) {
 | 
				
			||||||
                    lst << QString(" (last failed step: %1)").arg(m_worker->smap[last]);
 | 
					                    lst << QString(" (last failed step: %1)").arg(m_worker->smap[last]);
 | 
				
			||||||
@@ -280,6 +295,9 @@ public:
 | 
				
			|||||||
        CHECK_ISMAS_TRIGGER_FAILURE = _CHECK_ISMAS_TRIGGER_FAILURE,
 | 
					        CHECK_ISMAS_TRIGGER_FAILURE = _CHECK_ISMAS_TRIGGER_FAILURE,
 | 
				
			||||||
        INITIAL_CLONE_WITHOUT_ACTIVE_ISMAS_TRIGGER = _INITIAL_CLONE_WITHOUT_ACTIVE_ISMAS_TRIGGER,
 | 
					        INITIAL_CLONE_WITHOUT_ACTIVE_ISMAS_TRIGGER = _INITIAL_CLONE_WITHOUT_ACTIVE_ISMAS_TRIGGER,
 | 
				
			||||||
        INITIAL_CLONE_WITH_ACTIVE_ISMAS_TRIGGER = _INITIAL_CLONE_WITH_ACTIVE_ISMAS_TRIGGER,
 | 
					        INITIAL_CLONE_WITH_ACTIVE_ISMAS_TRIGGER = _INITIAL_CLONE_WITH_ACTIVE_ISMAS_TRIGGER,
 | 
				
			||||||
 | 
					        PULL_NEW_BRANCH = _PULL_NEW_BRANCH,
 | 
				
			||||||
 | 
					        PULL_NEW_BRANCH_FAILURE = _PULL_NEW_BRANCH_FAILURE,
 | 
				
			||||||
 | 
					        PULL_NEW_BRANCH_SUCCESS = _PULL_NEW_BRANCH_SUCCESS,
 | 
				
			||||||
        CHECKOUT_BRANCH = _CHECKOUT_BRANCH,
 | 
					        CHECKOUT_BRANCH = _CHECKOUT_BRANCH,
 | 
				
			||||||
        CHECKOUT_BRANCH_SUCCESS = _CHECKOUT_BRANCH_SUCCESS,
 | 
					        CHECKOUT_BRANCH_SUCCESS = _CHECKOUT_BRANCH_SUCCESS,
 | 
				
			||||||
        CHECKOUT_BRANCH_FAILURE = _CHECKOUT_BRANCH_FAILURE,
 | 
					        CHECKOUT_BRANCH_FAILURE = _CHECKOUT_BRANCH_FAILURE,
 | 
				
			||||||
@@ -553,6 +571,18 @@ private:
 | 
				
			|||||||
        break;
 | 
					        break;
 | 
				
			||||||
        case UPDATE_STEP::INITIAL_CLONE_WITH_ACTIVE_ISMAS_TRIGGER:
 | 
					        case UPDATE_STEP::INITIAL_CLONE_WITH_ACTIVE_ISMAS_TRIGGER:
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
 | 
					        case UPDATE_STEP::PULL_NEW_BRANCH: {
 | 
				
			||||||
 | 
					            lst << instance->m_debugMsg;
 | 
				
			||||||
 | 
					            Utils::printUpdateStatusMsg(debug, lst);
 | 
				
			||||||
 | 
					        } break;
 | 
				
			||||||
 | 
					        case UPDATE_STEP::PULL_NEW_BRANCH_FAILURE: {
 | 
				
			||||||
 | 
					            lst << instance->m_debugMsg;
 | 
				
			||||||
 | 
					            Utils::printUpdateStatusMsg(debug, lst);
 | 
				
			||||||
 | 
					        } break;
 | 
				
			||||||
 | 
					        case UPDATE_STEP::PULL_NEW_BRANCH_SUCCESS: {
 | 
				
			||||||
 | 
					            lst << instance->m_debugMsg;
 | 
				
			||||||
 | 
					            Utils::printUpdateStatusMsg(debug, lst);
 | 
				
			||||||
 | 
					        } break;
 | 
				
			||||||
        case UPDATE_STEP::CHECKOUT_BRANCH:
 | 
					        case UPDATE_STEP::CHECKOUT_BRANCH:
 | 
				
			||||||
            lst << instance->m_debugMsg;
 | 
					            lst << instance->m_debugMsg;
 | 
				
			||||||
            Utils::printUpdateStatusMsg(debug, lst);
 | 
					            Utils::printUpdateStatusMsg(debug, lst);
 | 
				
			||||||
@@ -719,7 +749,7 @@ private:
 | 
				
			|||||||
            QString const &ismasUpdateNews =
 | 
					            QString const &ismasUpdateNews =
 | 
				
			||||||
                QString("#M=APISM#C=CMD_EVENT#J=") +
 | 
					                QString("#M=APISM#C=CMD_EVENT#J=") +
 | 
				
			||||||
                    ismasClient.updateNewsToIsmas(
 | 
					                    ismasClient.updateNewsToIsmas(
 | 
				
			||||||
                        "U0010",
 | 
					                        _ISMAS_CONTINUE, // U0010
 | 
				
			||||||
                        _CHECKOUT_REPOSITORY_SUCCESS,
 | 
					                        _CHECKOUT_REPOSITORY_SUCCESS,
 | 
				
			||||||
                        IsmasClient::RESULT_CODE::SUCCESS,
 | 
					                        IsmasClient::RESULT_CODE::SUCCESS,
 | 
				
			||||||
                        smap[UPDATE_STEP::CHECK_REPOSITORY],
 | 
					                        smap[UPDATE_STEP::CHECK_REPOSITORY],
 | 
				
			||||||
@@ -735,9 +765,9 @@ private:
 | 
				
			|||||||
            QString const &ismasUpdateNews =
 | 
					            QString const &ismasUpdateNews =
 | 
				
			||||||
                QString("#M=APISM#C=CMD_EVENT#J=") +
 | 
					                QString("#M=APISM#C=CMD_EVENT#J=") +
 | 
				
			||||||
                    ismasClient.updateNewsToIsmas(
 | 
					                    ismasClient.updateNewsToIsmas(
 | 
				
			||||||
                        "U0010",
 | 
					                        _ISMAS_CONTINUE, // U0010
 | 
				
			||||||
                        _CHECKOUT_REPOSITORY_FAILURE,
 | 
					                        _CHECKOUT_REPOSITORY_FAILURE,
 | 
				
			||||||
                        IsmasClient::RESULT_CODE::INSTALL_ERROR,
 | 
					                        IsmasClient::RESULT_CODE::GIT_SWITCH_BRANCH_ERROR,
 | 
				
			||||||
                        smap[UPDATE_STEP::CHECKOUT_REPOSITORY],
 | 
					                        smap[UPDATE_STEP::CHECKOUT_REPOSITORY],
 | 
				
			||||||
                        QString("REPOSITORY %1 and BRANCH %2 ***NOT OK***")
 | 
					                        QString("REPOSITORY %1 and BRANCH %2 ***NOT OK***")
 | 
				
			||||||
                            .arg(instance->m_customerRepository)
 | 
					                            .arg(instance->m_customerRepository)
 | 
				
			||||||
@@ -754,7 +784,7 @@ private:
 | 
				
			|||||||
            QString const &ismasUpdateNews =
 | 
					            QString const &ismasUpdateNews =
 | 
				
			||||||
                QString("#M=APISM#C=CMD_EVENT#J=") +
 | 
					                QString("#M=APISM#C=CMD_EVENT#J=") +
 | 
				
			||||||
                    ismasClient.updateNewsToIsmas(
 | 
					                    ismasClient.updateNewsToIsmas(
 | 
				
			||||||
                        "U0010",
 | 
					                        _ISMAS_CONTINUE, // U0010
 | 
				
			||||||
                        _CHECK_SANITY_SUCCESS,
 | 
					                        _CHECK_SANITY_SUCCESS,
 | 
				
			||||||
                        IsmasClient::RESULT_CODE::SUCCESS,
 | 
					                        IsmasClient::RESULT_CODE::SUCCESS,
 | 
				
			||||||
                        smap[UPDATE_STEP::CHECK_SANITY],
 | 
					                        smap[UPDATE_STEP::CHECK_SANITY],
 | 
				
			||||||
@@ -770,9 +800,9 @@ private:
 | 
				
			|||||||
            QString const &ismasUpdateNews =
 | 
					            QString const &ismasUpdateNews =
 | 
				
			||||||
                QString("#M=APISM#C=CMD_EVENT#J=") +
 | 
					                QString("#M=APISM#C=CMD_EVENT#J=") +
 | 
				
			||||||
                    ismasClient.updateNewsToIsmas(
 | 
					                    ismasClient.updateNewsToIsmas(
 | 
				
			||||||
                        "U0010",
 | 
					                        _ISMAS_CONTINUE, // U0010
 | 
				
			||||||
                        _CHECK_SANITY_FAILURE,
 | 
					                        _CHECK_SANITY_FAILURE,
 | 
				
			||||||
                        IsmasClient::RESULT_CODE::INSTALL_ERROR,
 | 
					                        IsmasClient::RESULT_CODE::GIT_CHECK_REPOSITORY_ERROR,
 | 
				
			||||||
                        smap[UPDATE_STEP::CHECK_SANITY],
 | 
					                        smap[UPDATE_STEP::CHECK_SANITY],
 | 
				
			||||||
                        QString("SANITY OF %1 and BRANCH %2 ***NOT*** OK")
 | 
					                        QString("SANITY OF %1 and BRANCH %2 ***NOT*** OK")
 | 
				
			||||||
                            .arg(instance->m_customerRepository)
 | 
					                            .arg(instance->m_customerRepository)
 | 
				
			||||||
@@ -781,21 +811,21 @@ private:
 | 
				
			|||||||
            ismasClient.sendRequestReceiveResponse(
 | 
					            ismasClient.sendRequestReceiveResponse(
 | 
				
			||||||
                IsmasClient::APISM::DB_PORT, ismasUpdateNews);
 | 
					                IsmasClient::APISM::DB_PORT, ismasUpdateNews);
 | 
				
			||||||
        } break;
 | 
					        } break;
 | 
				
			||||||
        case UPDATE_STEP::REPOSITORY_RECOVERED_SUCCESS:
 | 
					        case UPDATE_STEP::REPOSITORY_RECOVERED_SUCCESS: {
 | 
				
			||||||
            ismasClient.setProgressInPercent(_REPOSITORY_RECOVERED_SUCCESS);
 | 
					            ismasClient.setProgressInPercent(_REPOSITORY_RECOVERED_SUCCESS);
 | 
				
			||||||
        break;
 | 
					        } break;
 | 
				
			||||||
        case UPDATE_STEP::REPOSITORY_RECOVERED_FAILURE:
 | 
					        case UPDATE_STEP::REPOSITORY_RECOVERED_FAILURE: {
 | 
				
			||||||
            ismasClient.setProgressInPercent(_REPOSITORY_RECOVERED_FAILURE);
 | 
					            ismasClient.setProgressInPercent(_REPOSITORY_RECOVERED_FAILURE);
 | 
				
			||||||
        break;
 | 
					        } break;
 | 
				
			||||||
        case UPDATE_STEP::CLONE_REPOSITORY:
 | 
					        case UPDATE_STEP::CLONE_REPOSITORY: {
 | 
				
			||||||
            ismasClient.setProgressInPercent(_CLONE_REPOSITORY);
 | 
					            ismasClient.setProgressInPercent(_CLONE_REPOSITORY);
 | 
				
			||||||
        break;
 | 
					        } break;
 | 
				
			||||||
        case UPDATE_STEP::CLONE_REPOSITORY_SUCCESS: {
 | 
					        case UPDATE_STEP::CLONE_REPOSITORY_SUCCESS: {
 | 
				
			||||||
            ismasClient.setProgressInPercent(_CLONE_REPOSITORY_SUCCESS);
 | 
					            ismasClient.setProgressInPercent(_CLONE_REPOSITORY_SUCCESS);
 | 
				
			||||||
            QString const &ismasUpdateNews =
 | 
					            QString const &ismasUpdateNews =
 | 
				
			||||||
                QString("#M=APISM#C=CMD_EVENT#J=") +
 | 
					                QString("#M=APISM#C=CMD_EVENT#J=") +
 | 
				
			||||||
                    ismasClient.updateNewsToIsmas(
 | 
					                    ismasClient.updateNewsToIsmas(
 | 
				
			||||||
                        "U0010",
 | 
					                        _ISMAS_CONTINUE, // U0010
 | 
				
			||||||
                        _CLONE_REPOSITORY_SUCCESS,
 | 
					                        _CLONE_REPOSITORY_SUCCESS,
 | 
				
			||||||
                        IsmasClient::RESULT_CODE::SUCCESS,
 | 
					                        IsmasClient::RESULT_CODE::SUCCESS,
 | 
				
			||||||
                        smap[UPDATE_STEP::CLONE_REPOSITORY],
 | 
					                        smap[UPDATE_STEP::CLONE_REPOSITORY],
 | 
				
			||||||
@@ -811,9 +841,9 @@ private:
 | 
				
			|||||||
            QString const &ismasUpdateNews =
 | 
					            QString const &ismasUpdateNews =
 | 
				
			||||||
                QString("#M=APISM#C=CMD_EVENT#J=") +
 | 
					                QString("#M=APISM#C=CMD_EVENT#J=") +
 | 
				
			||||||
                    ismasClient.updateNewsToIsmas(
 | 
					                    ismasClient.updateNewsToIsmas(
 | 
				
			||||||
                        "U0003",
 | 
					                        _ISMAS_CONTINUE, // U0010 -> even on error: U0002/3 are sent only once
 | 
				
			||||||
                        _CLONE_REPOSITORY_FAILURE,
 | 
					                        _CLONE_REPOSITORY_FAILURE,
 | 
				
			||||||
                        IsmasClient::RESULT_CODE::INSTALL_ERROR,
 | 
					                        IsmasClient::RESULT_CODE::GIT_CLONE_ERROR,
 | 
				
			||||||
                        smap[UPDATE_STEP::CHECKOUT_REPOSITORY],
 | 
					                        smap[UPDATE_STEP::CHECKOUT_REPOSITORY],
 | 
				
			||||||
                        QString("CLONING REPOSITORY %1 OR CHECKING OUT BRANCH %2 FAILED")
 | 
					                        QString("CLONING REPOSITORY %1 OR CHECKING OUT BRANCH %2 FAILED")
 | 
				
			||||||
                            .arg(instance->m_customerRepository)
 | 
					                            .arg(instance->m_customerRepository)
 | 
				
			||||||
@@ -825,7 +855,7 @@ private:
 | 
				
			|||||||
        case UPDATE_STEP::CHECKOUT_REPOSITORY:
 | 
					        case UPDATE_STEP::CHECKOUT_REPOSITORY:
 | 
				
			||||||
            ismasClient.setProgressInPercent(_CHECKOUT_REPOSITORY);
 | 
					            ismasClient.setProgressInPercent(_CHECKOUT_REPOSITORY);
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
        case UPDATE_STEP::CHECKOUT_REPOSITORY_SUCCESS:
 | 
					        case UPDATE_STEP::CHECKOUT_REPOSITORY_SUCCESS: {
 | 
				
			||||||
            ismasClient.setProgressInPercent(_CHECKOUT_REPOSITORY_SUCCESS);
 | 
					            ismasClient.setProgressInPercent(_CHECKOUT_REPOSITORY_SUCCESS);
 | 
				
			||||||
            ismasClient.sendRequestReceiveResponse(IsmasClient::APISM::DB_PORT,
 | 
					            ismasClient.sendRequestReceiveResponse(IsmasClient::APISM::DB_PORT,
 | 
				
			||||||
                QString("#M=APISM#C=CMD_EVENT#J=") +
 | 
					                QString("#M=APISM#C=CMD_EVENT#J=") +
 | 
				
			||||||
@@ -834,42 +864,133 @@ private:
 | 
				
			|||||||
                            .arg(instance->m_customerRepository)
 | 
					                            .arg(instance->m_customerRepository)
 | 
				
			||||||
                            .arg(instance->m_gc.branchName()),
 | 
					                            .arg(instance->m_gc.branchName()),
 | 
				
			||||||
                        instance->m_versionInfo.size() >= 1 ? instance->m_versionInfo.at(0).toUtf8().constData() : "N/A"));
 | 
					                        instance->m_versionInfo.size() >= 1 ? instance->m_versionInfo.at(0).toUtf8().constData() : "N/A"));
 | 
				
			||||||
        break;
 | 
					        } break;
 | 
				
			||||||
        case UPDATE_STEP::CHECKOUT_REPOSITORY_FAILURE:
 | 
					        case UPDATE_STEP::CHECKOUT_REPOSITORY_FAILURE: {
 | 
				
			||||||
            ismasClient.setProgressInPercent(_CHECKOUT_REPOSITORY_FAILURE);
 | 
					            ismasClient.setProgressInPercent(_CHECKOUT_REPOSITORY_FAILURE);
 | 
				
			||||||
        break;
 | 
					            QString const &ismasUpdateNews =
 | 
				
			||||||
        case UPDATE_STEP::CHECK_ISMAS_TRIGGER:
 | 
					                QString("#M=APISM#C=CMD_EVENT#J=") +
 | 
				
			||||||
 | 
					                    ismasClient.updateNewsToIsmas(
 | 
				
			||||||
 | 
					                        _ISMAS_CONTINUE, // U0010 -> even on error: U0002/3 are sent only once
 | 
				
			||||||
 | 
					                        _CHECKOUT_REPOSITORY_FAILURE,
 | 
				
			||||||
 | 
					                        IsmasClient::RESULT_CODE::GIT_SWITCH_BRANCH_ERROR,
 | 
				
			||||||
 | 
					                        smap[UPDATE_STEP::CHECKOUT_REPOSITORY],
 | 
				
			||||||
 | 
					                        QString("%1: CHECKING OUT BRANCH %2 FAILED")
 | 
				
			||||||
 | 
					                            .arg(instance->m_customerRepository)
 | 
				
			||||||
 | 
					                            .arg(instance->m_gc.branchName()).toStdString().c_str(),
 | 
				
			||||||
 | 
					                        instance->m_versionInfo.size() >= 1 ? instance->m_versionInfo.at(0).toUtf8().constData() : "N/A");
 | 
				
			||||||
 | 
					            ismasClient.sendRequestReceiveResponse(
 | 
				
			||||||
 | 
					                IsmasClient::APISM::DB_PORT, ismasUpdateNews);
 | 
				
			||||||
 | 
					        } break;
 | 
				
			||||||
 | 
					        case UPDATE_STEP::CHECK_ISMAS_TRIGGER: {
 | 
				
			||||||
            ismasClient.setProgressInPercent(_CHECK_ISMAS_TRIGGER);
 | 
					            ismasClient.setProgressInPercent(_CHECK_ISMAS_TRIGGER);
 | 
				
			||||||
        break;
 | 
					        } break;
 | 
				
			||||||
        case UPDATE_STEP::CHECK_ISMAS_TRIGGER_SUCCESS:
 | 
					        case UPDATE_STEP::CHECK_ISMAS_TRIGGER_SUCCESS: {
 | 
				
			||||||
            ismasClient.setProgressInPercent(_CHECK_ISMAS_TRIGGER_SUCCESS);
 | 
					            ismasClient.setProgressInPercent(_CHECK_ISMAS_TRIGGER_SUCCESS);
 | 
				
			||||||
            ismasClient.sendRequestReceiveResponse(IsmasClient::APISM::DB_PORT,
 | 
					            ismasClient.sendRequestReceiveResponse(IsmasClient::APISM::DB_PORT,
 | 
				
			||||||
                QString("#M=APISM#C=CMD_EVENT#J=") +
 | 
					                QString("#M=APISM#C=CMD_EVENT#J=") +
 | 
				
			||||||
                         ismasClient.updateTriggerSet("ISMAS TRIGGER SET",
 | 
					                         ismasClient.updateTriggerSet("ISMAS TRIGGER SET",
 | 
				
			||||||
                            instance->m_versionInfo.size() >= 1 ? instance->m_versionInfo.at(0).toUtf8().constData() : "N/A"));
 | 
					                            instance->m_versionInfo.size() >= 1 ? instance->m_versionInfo.at(0).toUtf8().constData() : "N/A"));
 | 
				
			||||||
        break;
 | 
					        } break;
 | 
				
			||||||
        case UPDATE_STEP::CHECK_ISMAS_TRIGGER_WRONG_VALUE:
 | 
					        case UPDATE_STEP::CHECK_ISMAS_TRIGGER_WRONG_VALUE: {
 | 
				
			||||||
            ismasClient.setProgressInPercent(_CHECK_ISMAS_TRIGGER_WRONG_VALUE);
 | 
					            ismasClient.setProgressInPercent(_CHECK_ISMAS_TRIGGER_WRONG_VALUE);
 | 
				
			||||||
        break;
 | 
					 | 
				
			||||||
        case UPDATE_STEP::CHECK_ISMAS_TRIGGER_FAILURE: {
 | 
					 | 
				
			||||||
            ismasClient.setProgressInPercent(_CHECK_ISMAS_TRIGGER_FAILURE);
 | 
					 | 
				
			||||||
            QString const &ismasUpdateNews =
 | 
					            QString const &ismasUpdateNews =
 | 
				
			||||||
                QString("#M=APISM#C=CMD_EVENT#J=") +
 | 
					                QString("#M=APISM#C=CMD_EVENT#J=") +
 | 
				
			||||||
                    ismasClient.updateNewsToIsmas(
 | 
					                    ismasClient.updateNewsToIsmas(
 | 
				
			||||||
                        "U0003",
 | 
					                        _ISMAS_TEST_TRIGGER, // U0099
 | 
				
			||||||
                        _CHECK_ISMAS_TRIGGER_FAILURE,
 | 
					                        _CHECK_ISMAS_TRIGGER_WRONG_VALUE,
 | 
				
			||||||
                        IsmasClient::RESULT_CODE::INSTALL_ERROR,
 | 
					                        IsmasClient::RESULT_CODE::ISMAS_TRIGGER_ERROR,
 | 
				
			||||||
                        smap[UPDATE_STEP::CHECK_ISMAS_TRIGGER],
 | 
					                        smap[UPDATE_STEP::CHECK_ISMAS_TRIGGER],
 | 
				
			||||||
                        instance->m_ismasMsg.join(' ').toStdString().c_str(),
 | 
					                        instance->m_ismasMsg.join(' ').toStdString().c_str(),
 | 
				
			||||||
                        instance->m_versionInfo.size() >= 1 ? instance->m_versionInfo.at(0).toUtf8().constData() : "N/A");
 | 
					                        instance->m_versionInfo.size() >= 1 ? instance->m_versionInfo.at(0).toUtf8().constData() : "N/A");
 | 
				
			||||||
            ismasClient.sendRequestReceiveResponse(
 | 
					            ismasClient.sendRequestReceiveResponse(
 | 
				
			||||||
                IsmasClient::APISM::DB_PORT, ismasUpdateNews);
 | 
					                IsmasClient::APISM::DB_PORT, ismasUpdateNews);
 | 
				
			||||||
        } break;
 | 
					        } break;
 | 
				
			||||||
        case UPDATE_STEP::INITIAL_CLONE_WITHOUT_ACTIVE_ISMAS_TRIGGER:
 | 
					        case UPDATE_STEP::CHECK_ISMAS_TRIGGER_FAILURE: {
 | 
				
			||||||
 | 
					            ismasClient.setProgressInPercent(_CHECK_ISMAS_TRIGGER_FAILURE);
 | 
				
			||||||
 | 
					            QString const &ismasUpdateNews =
 | 
				
			||||||
 | 
					                QString("#M=APISM#C=CMD_EVENT#J=") +
 | 
				
			||||||
 | 
					                    ismasClient.updateNewsToIsmas(
 | 
				
			||||||
 | 
					                        _ISMAS_TEST_TRIGGER, // U0099
 | 
				
			||||||
 | 
					                        _CHECK_ISMAS_TRIGGER_FAILURE,
 | 
				
			||||||
 | 
					                        IsmasClient::RESULT_CODE::ISMAS_TRIGGER_ERROR,
 | 
				
			||||||
 | 
					                        smap[UPDATE_STEP::CHECK_ISMAS_TRIGGER],
 | 
				
			||||||
 | 
					                        instance->m_ismasMsg.join(' ').toStdString().c_str(),
 | 
				
			||||||
 | 
					                        instance->m_versionInfo.size() >= 1 ? instance->m_versionInfo.at(0).toUtf8().constData() : "N/A");
 | 
				
			||||||
 | 
					            ismasClient.sendRequestReceiveResponse(
 | 
				
			||||||
 | 
					                IsmasClient::APISM::DB_PORT, ismasUpdateNews);
 | 
				
			||||||
 | 
					        } break;
 | 
				
			||||||
 | 
					        case UPDATE_STEP::INITIAL_CLONE_WITHOUT_ACTIVE_ISMAS_TRIGGER: {
 | 
				
			||||||
            ismasClient.setProgressInPercent(_INITIAL_CLONE_WITHOUT_ACTIVE_ISMAS_TRIGGER);
 | 
					            ismasClient.setProgressInPercent(_INITIAL_CLONE_WITHOUT_ACTIVE_ISMAS_TRIGGER);
 | 
				
			||||||
        break;
 | 
					            QString const &ismasUpdateNews =
 | 
				
			||||||
        case UPDATE_STEP::INITIAL_CLONE_WITH_ACTIVE_ISMAS_TRIGGER:
 | 
					                QString("#M=APISM#C=CMD_EVENT#J=") +
 | 
				
			||||||
 | 
					                    ismasClient.updateNewsToIsmas(
 | 
				
			||||||
 | 
					                        _ISMAS_CONTINUE, // U0010
 | 
				
			||||||
 | 
					                        _INITIAL_CLONE_WITHOUT_ACTIVE_ISMAS_TRIGGER,
 | 
				
			||||||
 | 
					                        IsmasClient::RESULT_CODE::SUCCESS,
 | 
				
			||||||
 | 
					                        smap[UPDATE_STEP::INITIAL_CLONE_WITHOUT_ACTIVE_ISMAS_TRIGGER],
 | 
				
			||||||
 | 
					                        instance->m_ismasMsg.join(' ').toStdString().c_str(),
 | 
				
			||||||
 | 
					                        instance->m_versionInfo.size() >= 1 ? instance->m_versionInfo.at(0).toUtf8().constData() : "N/A");
 | 
				
			||||||
 | 
					            ismasClient.sendRequestReceiveResponse(
 | 
				
			||||||
 | 
					                IsmasClient::APISM::DB_PORT, ismasUpdateNews);
 | 
				
			||||||
 | 
					        } break;
 | 
				
			||||||
 | 
					        case UPDATE_STEP::INITIAL_CLONE_WITH_ACTIVE_ISMAS_TRIGGER: {
 | 
				
			||||||
            ismasClient.setProgressInPercent(_INITIAL_CLONE_WITH_ACTIVE_ISMAS_TRIGGER);
 | 
					            ismasClient.setProgressInPercent(_INITIAL_CLONE_WITH_ACTIVE_ISMAS_TRIGGER);
 | 
				
			||||||
 | 
					            QString const &ismasUpdateNews =
 | 
				
			||||||
 | 
					                QString("#M=APISM#C=CMD_EVENT#J=") +
 | 
				
			||||||
 | 
					                    ismasClient.updateNewsToIsmas(
 | 
				
			||||||
 | 
					                        _ISMAS_CONTINUE, // U0010
 | 
				
			||||||
 | 
					                        _INITIAL_CLONE_WITH_ACTIVE_ISMAS_TRIGGER,
 | 
				
			||||||
 | 
					                        IsmasClient::RESULT_CODE::SUCCESS,
 | 
				
			||||||
 | 
					                        smap[UPDATE_STEP::INITIAL_CLONE_WITH_ACTIVE_ISMAS_TRIGGER],
 | 
				
			||||||
 | 
					                        instance->m_ismasMsg.join(' ').toStdString().c_str(),
 | 
				
			||||||
 | 
					                        instance->m_versionInfo.size() >= 1 ? instance->m_versionInfo.at(0).toUtf8().constData() : "N/A");
 | 
				
			||||||
 | 
					            ismasClient.sendRequestReceiveResponse(
 | 
				
			||||||
 | 
					                IsmasClient::APISM::DB_PORT, ismasUpdateNews);
 | 
				
			||||||
 | 
					        } break;
 | 
				
			||||||
 | 
					        case UPDATE_STEP::PULL_NEW_BRANCH: {
 | 
				
			||||||
 | 
					            ismasClient.setProgressInPercent(_PULL_NEW_BRANCH);
 | 
				
			||||||
 | 
					            QString const &ismasUpdateNews =
 | 
				
			||||||
 | 
					                QString("#M=APISM#C=CMD_EVENT#J=") +
 | 
				
			||||||
 | 
					                    ismasClient.updateNewsToIsmas(
 | 
				
			||||||
 | 
					                        _ISMAS_CONTINUE, // U0010
 | 
				
			||||||
 | 
					                        _PULL_NEW_BRANCH,
 | 
				
			||||||
 | 
					                        IsmasClient::RESULT_CODE::SUCCESS,
 | 
				
			||||||
 | 
					                        smap[UPDATE_STEP::CHECKOUT_BRANCH],
 | 
				
			||||||
 | 
					                        instance->m_ismasMsg.join(' ').toStdString().c_str(),
 | 
				
			||||||
 | 
					                        instance->m_versionInfo.size() >= 1 ? instance->m_versionInfo.at(0).toUtf8().constData() : "N/A");
 | 
				
			||||||
 | 
					            ismasClient.sendRequestReceiveResponse(
 | 
				
			||||||
 | 
					                IsmasClient::APISM::DB_PORT, ismasUpdateNews);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					        case UPDATE_STEP::PULL_NEW_BRANCH_FAILURE: {
 | 
				
			||||||
 | 
					            ismasClient.setProgressInPercent(_PULL_NEW_BRANCH_FAILURE);
 | 
				
			||||||
 | 
					            QString const &ismasUpdateNews =
 | 
				
			||||||
 | 
					                QString("#M=APISM#C=CMD_EVENT#J=") +
 | 
				
			||||||
 | 
					                    ismasClient.updateNewsToIsmas(
 | 
				
			||||||
 | 
					                        _ISMAS_CONTINUE, // U0010 -> even on error: U0002/3 are sent only once
 | 
				
			||||||
 | 
					                        _PULL_NEW_BRANCH_FAILURE,
 | 
				
			||||||
 | 
					                        IsmasClient::RESULT_CODE::GIT_PULL_ERROR,
 | 
				
			||||||
 | 
					                        smap[UPDATE_STEP::CHECKOUT_BRANCH],
 | 
				
			||||||
 | 
					                        instance->m_ismasMsg.join(' ').toStdString().c_str(),
 | 
				
			||||||
 | 
					                        instance->m_versionInfo.size() >= 1 ? instance->m_versionInfo.at(0).toUtf8().constData() : "N/A");
 | 
				
			||||||
 | 
					            ismasClient.sendRequestReceiveResponse(
 | 
				
			||||||
 | 
					                IsmasClient::APISM::DB_PORT, ismasUpdateNews);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					        case UPDATE_STEP::PULL_NEW_BRANCH_SUCCESS: {
 | 
				
			||||||
 | 
					            ismasClient.setProgressInPercent(_PULL_NEW_BRANCH_SUCCESS);
 | 
				
			||||||
 | 
					            QString const &ismasUpdateNews =
 | 
				
			||||||
 | 
					                QString("#M=APISM#C=CMD_EVENT#J=") +
 | 
				
			||||||
 | 
					                    ismasClient.updateNewsToIsmas(
 | 
				
			||||||
 | 
					                        _ISMAS_CONTINUE, // U0010
 | 
				
			||||||
 | 
					                        _PULL_NEW_BRANCH_SUCCESS,
 | 
				
			||||||
 | 
					                        IsmasClient::RESULT_CODE::SUCCESS,
 | 
				
			||||||
 | 
					                        smap[UPDATE_STEP::CHECKOUT_BRANCH],
 | 
				
			||||||
 | 
					                        instance->m_ismasMsg.join(' ').toStdString().c_str(),
 | 
				
			||||||
 | 
					                        instance->m_versionInfo.size() >= 1 ? instance->m_versionInfo.at(0).toUtf8().constData() : "N/A");
 | 
				
			||||||
 | 
					            ismasClient.sendRequestReceiveResponse(
 | 
				
			||||||
 | 
					                IsmasClient::APISM::DB_PORT, ismasUpdateNews);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
        case UPDATE_STEP::CHECKOUT_BRANCH: {
 | 
					        case UPDATE_STEP::CHECKOUT_BRANCH: {
 | 
				
			||||||
            ismasClient.setProgressInPercent(_CHECKOUT_BRANCH);
 | 
					            ismasClient.setProgressInPercent(_CHECKOUT_BRANCH);
 | 
				
			||||||
@@ -904,9 +1025,9 @@ private:
 | 
				
			|||||||
            QString const &ismasUpdateNews =
 | 
					            QString const &ismasUpdateNews =
 | 
				
			||||||
                QString("#M=APISM#C=CMD_EVENT#J=") +
 | 
					                QString("#M=APISM#C=CMD_EVENT#J=") +
 | 
				
			||||||
                    ismasClient.updateNewsToIsmas(
 | 
					                    ismasClient.updateNewsToIsmas(
 | 
				
			||||||
                        "U0003",
 | 
					                        _ISMAS_FAILURE, // U0003
 | 
				
			||||||
                        _CHECKOUT_BRANCH_FAILURE,
 | 
					                        _CHECKOUT_BRANCH_FAILURE,
 | 
				
			||||||
                        IsmasClient::RESULT_CODE::INSTALL_ERROR,
 | 
					                        IsmasClient::RESULT_CODE::GIT_SWITCH_BRANCH_ERROR,
 | 
				
			||||||
                        smap[UPDATE_STEP::CHECKOUT_BRANCH],
 | 
					                        smap[UPDATE_STEP::CHECKOUT_BRANCH],
 | 
				
			||||||
                        instance->m_ismasMsg.join(' ').toStdString().c_str(),
 | 
					                        instance->m_ismasMsg.join(' ').toStdString().c_str(),
 | 
				
			||||||
                        instance->m_versionInfo.size() >= 1 ? instance->m_versionInfo.at(0).toUtf8().constData() : "N/A");
 | 
					                        instance->m_versionInfo.size() >= 1 ? instance->m_versionInfo.at(0).toUtf8().constData() : "N/A");
 | 
				
			||||||
@@ -1068,7 +1189,7 @@ private:
 | 
				
			|||||||
                    ismasClient.updateNewsToIsmas(
 | 
					                    ismasClient.updateNewsToIsmas(
 | 
				
			||||||
                        _ISMAS_FAILURE,
 | 
					                        _ISMAS_FAILURE,
 | 
				
			||||||
                        ismasClient.getProgressInPercent(),
 | 
					                        ismasClient.getProgressInPercent(),
 | 
				
			||||||
                        IsmasClient::RESULT_CODE::INSTALL_ERROR,
 | 
					                        IsmasClient::RESULT_CODE::OPKG_COMMANDS_ERROR,
 | 
				
			||||||
                        smap[step],
 | 
					                        smap[step],
 | 
				
			||||||
                        instance->m_ismasMsg.join(' ').toStdString().c_str(),
 | 
					                        instance->m_ismasMsg.join(' ').toStdString().c_str(),
 | 
				
			||||||
                        instance->m_versionInfo.size() >= 1 ? instance->m_versionInfo.at(0).toUtf8().constData() : "N/A");
 | 
					                        instance->m_versionInfo.size() >= 1 ? instance->m_versionInfo.at(0).toUtf8().constData() : "N/A");
 | 
				
			||||||
@@ -1216,7 +1337,7 @@ private:
 | 
				
			|||||||
                    ismasClient.updateNewsToIsmas(
 | 
					                    ismasClient.updateNewsToIsmas(
 | 
				
			||||||
                        _ISMAS_FAILURE,
 | 
					                        _ISMAS_FAILURE,
 | 
				
			||||||
                        ismasClient.getProgressInPercent(),
 | 
					                        ismasClient.getProgressInPercent(),
 | 
				
			||||||
                        IsmasClient::RESULT_CODE::INSTALL_ERROR,
 | 
					                        IsmasClient::RESULT_CODE::UPDATE_IN_ERROR_STATE,
 | 
				
			||||||
                        smap[UPDATE_STEP::UPDATE_FINALIZE],
 | 
					                        smap[UPDATE_STEP::UPDATE_FINALIZE],
 | 
				
			||||||
                        instance->m_ismasMsg.join(' ').toStdString().c_str(),
 | 
					                        instance->m_ismasMsg.join(' ').toStdString().c_str(),
 | 
				
			||||||
                        instance->m_versionInfo.size() >= 1 ? instance->m_versionInfo.at(0).toUtf8().constData() : "N/A");
 | 
					                        instance->m_versionInfo.size() >= 1 ? instance->m_versionInfo.at(0).toUtf8().constData() : "N/A");
 | 
				
			||||||
@@ -1304,6 +1425,12 @@ private:
 | 
				
			|||||||
        break;
 | 
					        break;
 | 
				
			||||||
        case UPDATE_STEP::INITIAL_CLONE_WITH_ACTIVE_ISMAS_TRIGGER:
 | 
					        case UPDATE_STEP::INITIAL_CLONE_WITH_ACTIVE_ISMAS_TRIGGER:
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
 | 
					        case UPDATE_STEP::PULL_NEW_BRANCH:
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					        case UPDATE_STEP::PULL_NEW_BRANCH_FAILURE:
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					        case UPDATE_STEP::PULL_NEW_BRANCH_SUCCESS:
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
        case UPDATE_STEP::CHECKOUT_BRANCH:
 | 
					        case UPDATE_STEP::CHECKOUT_BRANCH:
 | 
				
			||||||
            emit worker->appendText("\nPrepare customer environment ...");
 | 
					            emit worker->appendText("\nPrepare customer environment ...");
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										55
									
								
								common/include/System.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								common/include/System.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,55 @@
 | 
				
			|||||||
 | 
					#ifndef SYSTEM_H
 | 
				
			||||||
 | 
					#define SYSTEM_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <QObject>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class System : public QObject
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    Q_OBJECT
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					private:
 | 
				
			||||||
 | 
					    explicit System(QObject *parent = 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    static QString errorMsg;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    static bool checkForSDCard();
 | 
				
			||||||
 | 
					    static bool umountSDCard();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    static bool checkForUSBStick();
 | 
				
			||||||
 | 
					    static QString getUSBMountPath();
 | 
				
			||||||
 | 
					    static QString getUSBDeviceName();
 | 
				
			||||||
 | 
					    static bool umountUSBStick();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    static bool test_mount(const QString& dev, const QString &mountpoint);
 | 
				
			||||||
 | 
					    static bool test_dir(const QString& dir);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    static quint32 getFreeDiskSpace(const QString& dev);
 | 
				
			||||||
 | 
					    static quint32 getFreeDiskSpaceSDCard();
 | 
				
			||||||
 | 
					    static bool isSDCardWritable();
 | 
				
			||||||
 | 
					    static quint32 getFreeDiskSpaceUSBStick();
 | 
				
			||||||
 | 
					    static bool isUSBStickWritable();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    static quint8 createLogFileBackup(const QString & targzfile, const QString &filelistfile = "");
 | 
				
			||||||
 | 
					    static QString getSDCardMountPath();
 | 
				
			||||||
 | 
					    static QString getSDCardDeviceName();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    static QString getUniqueDeviceId();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    static QString getErrorMessage();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    static QString readStringFromFile(const QString & filename);
 | 
				
			||||||
 | 
					    static int readIntFromFile(const QString & filename);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    static QString getPTU4SerialNumber();
 | 
				
			||||||
 | 
					    static QString getPTU4MACAddress();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif // SYSTEM_H
 | 
				
			||||||
							
								
								
									
										647
									
								
								common/src/System.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										647
									
								
								common/src/System.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,647 @@
 | 
				
			|||||||
 | 
					#include "System.h"
 | 
				
			||||||
 | 
					#include <QFile>
 | 
				
			||||||
 | 
					#include <QFileInfo>
 | 
				
			||||||
 | 
					#include <QDir>
 | 
				
			||||||
 | 
					#include <QTextStream>
 | 
				
			||||||
 | 
					#include <QProcess>
 | 
				
			||||||
 | 
					#include <QRegExp>
 | 
				
			||||||
 | 
					#include <QStringList>
 | 
				
			||||||
 | 
					#include <QDebug>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//#include "version.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					QString System::errorMsg = "";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					System::System(QObject *parent) :
 | 
				
			||||||
 | 
					    QObject(parent)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/********************************************************************************
 | 
				
			||||||
 | 
					 * static function to return error message.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					QString System::getErrorMessage()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    return errorMsg;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/********************************************************************************
 | 
				
			||||||
 | 
					 * static function to check if a writable SD-card is in the cardslot.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * This function only checks a certain path or a mount entry. It does not mount
 | 
				
			||||||
 | 
					 * a SD-card, this must be provided by the OS (automounter).
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * returns 1 if a SD-card is available, 0 otherwise.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					bool System::checkForSDCard()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					#if defined (ARCH_DesktopLinux)
 | 
				
			||||||
 | 
					    // DEBUG / TEST:
 | 
				
			||||||
 | 
					    return true;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (!test_mount(getSDCardDeviceName(), getSDCardMountPath())) {
 | 
				
			||||||
 | 
					        qDebug() << "check for SD-card failed: \n"
 | 
				
			||||||
 | 
					                 << "    device name is: " << getSDCardDeviceName()
 | 
				
			||||||
 | 
					                 << "    mount path is:  " << getSDCardMountPath();
 | 
				
			||||||
 | 
					        return false;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return true;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/********************************************************************************
 | 
				
			||||||
 | 
					 * static function for umount sd-card.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					bool System::umountSDCard()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					#if defined (ARCH_DesktopLinux)
 | 
				
			||||||
 | 
					    // DEBUG / TEST:
 | 
				
			||||||
 | 
					    return true;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    QProcess process;
 | 
				
			||||||
 | 
					    process.setProcessChannelMode(QProcess::MergedChannels);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    QString commandString = "umount " + getSDCardMountPath();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    process.start(commandString);
 | 
				
			||||||
 | 
					    if (!process.waitForStarted()) {
 | 
				
			||||||
 | 
					        errorMsg = "System::umountSDCard(): ERROR: waitForStarted()";
 | 
				
			||||||
 | 
					        return false;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (!process.waitForFinished(600000)) {
 | 
				
			||||||
 | 
					        errorMsg = "System::umountSDCard(): ERROR: " + process.errorString();
 | 
				
			||||||
 | 
					        qDebug() << errorMsg;
 | 
				
			||||||
 | 
					        return false;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    else {
 | 
				
			||||||
 | 
					        QByteArray bytes = process.readAll();
 | 
				
			||||||
 | 
					        QStringList lines = QString(bytes).split("\n");
 | 
				
			||||||
 | 
					        foreach (QString line, lines) {
 | 
				
			||||||
 | 
					            qDebug() << "System::umountSDCard() line:    " << line;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return true;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/********************************************************************************
 | 
				
			||||||
 | 
					 * static function for umount usb-stick.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					bool System::umountUSBStick()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					#if defined (ARCH_DesktopLinux)
 | 
				
			||||||
 | 
					    // DEBUG / TEST:
 | 
				
			||||||
 | 
					    return true;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    QProcess process;
 | 
				
			||||||
 | 
					    process.setProcessChannelMode(QProcess::MergedChannels);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    QString commandString = "umount " + getUSBMountPath();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    process.start(commandString);
 | 
				
			||||||
 | 
					    if (!process.waitForStarted()) {
 | 
				
			||||||
 | 
					        errorMsg = "System::umountUSBStick(): ERROR: waitForStarted()";
 | 
				
			||||||
 | 
					        return false;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (!process.waitForFinished(600000)) {
 | 
				
			||||||
 | 
					        errorMsg = "System::umountUSBStick(): ERROR: " + process.errorString();
 | 
				
			||||||
 | 
					        qDebug() << errorMsg;
 | 
				
			||||||
 | 
					        return false;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    else {
 | 
				
			||||||
 | 
					        QByteArray bytes = process.readAll();
 | 
				
			||||||
 | 
					        QStringList lines = QString(bytes).split("\n");
 | 
				
			||||||
 | 
					        foreach (QString line, lines) {
 | 
				
			||||||
 | 
					            qDebug() << "System::umountUSBStick() line:    " << line;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return true;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*****************************************************************************
 | 
				
			||||||
 | 
					 * test, if a certain device is already mounted
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * e.g. a mounted SD-card on PTU4:
 | 
				
			||||||
 | 
					 *  - device is '/dev/mmcblk0p1'
 | 
				
			||||||
 | 
					 *  - mount path is '/media/mmcblk0p1'
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * e.g. a mounted USB-Stick on PTU4:
 | 
				
			||||||
 | 
					 *  - device is '/dev/sda'
 | 
				
			||||||
 | 
					 *  - mount path is '/media/sda'
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					bool System::test_mount(const QString& dev, const QString& mountpoint)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    bool mounted = false;
 | 
				
			||||||
 | 
					    QProcess process;
 | 
				
			||||||
 | 
					    process.setProcessChannelMode(QProcess::MergedChannels);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    qDebug() << "System::test_mount() dev = " << dev;
 | 
				
			||||||
 | 
					    qDebug() << "System::test_mount() mountpoint = " << mountpoint;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    //normalize mountpoint: (mountpoint is without trailing '/')
 | 
				
			||||||
 | 
					    QString tmp_mountpoint =  QString(mountpoint).remove(QRegExp("/*$"));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    QString commandString = "mount";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    process.start(commandString);
 | 
				
			||||||
 | 
					    if (!process.waitForStarted()) {
 | 
				
			||||||
 | 
					        errorMsg = "System::test_mount(): ERROR: waitForStarted()";
 | 
				
			||||||
 | 
					        return false;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (!process.waitForFinished(600000)) {
 | 
				
			||||||
 | 
					        errorMsg = "System::test_mount(): ERROR: " + process.errorString();
 | 
				
			||||||
 | 
					        qDebug() << errorMsg;
 | 
				
			||||||
 | 
					        return false;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    else {
 | 
				
			||||||
 | 
					        QByteArray bytes = process.readAll();
 | 
				
			||||||
 | 
					        QStringList lines = QString(bytes).split("\n");
 | 
				
			||||||
 | 
					        foreach (QString line, lines) {
 | 
				
			||||||
 | 
					            //qDebug() << "System::test_mount() line:    " << line;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //if (line.contains(dev)) qDebug() << "System::test_mount() line contains dev";
 | 
				
			||||||
 | 
					            //if (line.contains(tmp_mountpoint)) qDebug() << "System::test_mount() line contains mountpoint";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (line.contains(dev) && line.contains(tmp_mountpoint)) {
 | 
				
			||||||
 | 
					                qDebug() << "System::test_mount(): " << dev << " is mounted on " << tmp_mountpoint;
 | 
				
			||||||
 | 
					                mounted = true;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return mounted;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*****************************************************************************
 | 
				
			||||||
 | 
					 *  test, if a certain directory is existing and readable
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					bool System::test_dir(const QString& dir)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    QFileInfo fileInfo(dir);
 | 
				
			||||||
 | 
					    if (! fileInfo.isDir() ) {   return false;  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return true;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool System::checkForUSBStick()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					#if defined (ARCH_DesktopLinux)
 | 
				
			||||||
 | 
					    // DEBUG / TEST:
 | 
				
			||||||
 | 
					    if (QFileInfo(getUSBMountPath()).isDir())
 | 
				
			||||||
 | 
					        return true;
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					        return false;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (getUSBMountPath().isEmpty()) {
 | 
				
			||||||
 | 
					        return false;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return true;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * @brief SupportSystem::getUSBMountPath
 | 
				
			||||||
 | 
					 * @return path where a USB storage device is mounted.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Note, do not return an empty string ("") here because a calling method (which could not be
 | 
				
			||||||
 | 
					 * identified till now) is relying on this!
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					QString System::getUSBMountPath()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if defined (ARCH_DesktopLinux)
 | 
				
			||||||
 | 
					    // DEBUG / TEST:
 | 
				
			||||||
 | 
					    return QDir::homePath().append("/APconfigTest/USB");
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    QProcess process;
 | 
				
			||||||
 | 
					    process.setProcessChannelMode(QProcess::MergedChannels);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    QStringList mountLine;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    qDebug() << "System::getUSBMountPath()";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    QRegExp devRegExp   = QRegExp("dev/sd*",   Qt::CaseSensitive, QRegExp::WildcardUnix);
 | 
				
			||||||
 | 
					    QRegExp mountRegExp = QRegExp("media/sd*", Qt::CaseSensitive, QRegExp::WildcardUnix);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    QString commandString = "mount";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    process.start(commandString);
 | 
				
			||||||
 | 
					    if (!process.waitForStarted()) {
 | 
				
			||||||
 | 
					        errorMsg = "System::getUSBMountPath(): ERROR: waitForStarted()";
 | 
				
			||||||
 | 
					        return "";
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (!process.waitForFinished(600000)) {
 | 
				
			||||||
 | 
					        errorMsg = "System::getUSBMountPath(): ERROR: " + process.errorString();
 | 
				
			||||||
 | 
					        qDebug() << errorMsg;
 | 
				
			||||||
 | 
					        return "";
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    else {
 | 
				
			||||||
 | 
					        QByteArray bytes = process.readAll();
 | 
				
			||||||
 | 
					        QStringList lines = QString(bytes).split("\n");
 | 
				
			||||||
 | 
					        foreach (QString line, lines) {
 | 
				
			||||||
 | 
					            qDebug() << "System::getUSBMountPath() line:    " << line;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (line.contains(devRegExp) && line.contains(mountRegExp)) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                qDebug() << "  -> this line is a usb storage device mount" << line;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                mountLine = line.split(' ');
 | 
				
			||||||
 | 
					                if (mountLine.size() > 3) {
 | 
				
			||||||
 | 
					                    qDebug() << "System::getUSBMountPath(): " << mountLine.at(0) << " is mounted on " << mountLine.at(2);
 | 
				
			||||||
 | 
					                    return mountLine.at(2);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    qDebug() << "System::getUSBMountPath() no mounted usb device found!";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return "";
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/********************************************************************************
 | 
				
			||||||
 | 
					 * static function to check if a mounted sd-card is writable.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Note: the caller must ensure (e.g. by calling checkForSDCard()) that a
 | 
				
			||||||
 | 
					 * sd-card is mounted.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					bool System::isSDCardWritable()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    QFileInfo fi(getSDCardMountPath());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if(fi.isDir() && fi.isWritable()) {
 | 
				
			||||||
 | 
					        return true;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        return false;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/********************************************************************************
 | 
				
			||||||
 | 
					 * static function to check if a mounted usb-stick is writable.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Note: the caller must ensure (e.g. by calling checkForUSBStick()) that a
 | 
				
			||||||
 | 
					 * usb-stick is mounted.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					bool System::isUSBStickWritable()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    QFileInfo fi(getUSBMountPath());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if(fi.isDir() && fi.isWritable()) {
 | 
				
			||||||
 | 
					        return true;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        return false;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/********************************************************************************
 | 
				
			||||||
 | 
					 * wrapper function for getting free space on a sd-card on ptu
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					quint32 System::getFreeDiskSpaceSDCard()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					#if defined (ARCH_DesktopLinux)
 | 
				
			||||||
 | 
					    return getFreeDiskSpace("/home/siegert/server1home");
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					    return getFreeDiskSpace(getSDCardMountPath());
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/********************************************************************************
 | 
				
			||||||
 | 
					 * wrapper function for getting free space on a usb storage device on ptu
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					quint32 System::getFreeDiskSpaceUSBStick()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					#if defined (ARCH_DesktopLinux)
 | 
				
			||||||
 | 
					    return getFreeDiskSpace("/home/siegert/server1home");
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					    return getFreeDiskSpace(getUSBMountPath());
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/********************************************************************************
 | 
				
			||||||
 | 
					 * static function to read free disk space
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * example output of 'df' command on ptu:
 | 
				
			||||||
 | 
					 *   # df
 | 
				
			||||||
 | 
					 *   Filesystem     1K-blocks  Used Available Use% Mounted on
 | 
				
			||||||
 | 
					 *   ubi0:rootfs       111704 78940     32764  71% /
 | 
				
			||||||
 | 
					 *   devtmpfs           62072     0     62072   0% /dev
 | 
				
			||||||
 | 
					 *   tmpfs              62332     0     62332   0% /dev/shm
 | 
				
			||||||
 | 
					 *   tmpfs              62332   416     61916   1% /tmp
 | 
				
			||||||
 | 
					 *   tmpfs              62332    24     62308   1% /run
 | 
				
			||||||
 | 
					 *   ubi0:data         222260  5892    216368   3% /opt
 | 
				
			||||||
 | 
					 *   tmpfs              62332     0     62332   0% /media
 | 
				
			||||||
 | 
					 *   /dev/mmcblk0p1   3878912 87360   3791552   3% /media/mmcblk0p1
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * in this case, if we want to get the free space on the sd-card the methode should
 | 
				
			||||||
 | 
					 * be called:
 | 
				
			||||||
 | 
					 *   getFreeDiskSpace("/dev/mmcblk0p1")
 | 
				
			||||||
 | 
					 * the result should be:
 | 
				
			||||||
 | 
					 *   3791552
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					quint32  System::getFreeDiskSpace(const QString& dev)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    quint32 availableSpace = 0;
 | 
				
			||||||
 | 
					    QProcess process;
 | 
				
			||||||
 | 
					    process.setProcessChannelMode(QProcess::MergedChannels);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    //qDebug() << "System::getFreeDiskSpace() dev = " << dev;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    QString commandString = "df";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    process.start(commandString);
 | 
				
			||||||
 | 
					    if (!process.waitForStarted()) {
 | 
				
			||||||
 | 
					        errorMsg = "System::getFreeDiskSpace(): ERROR: waitForStarted()";
 | 
				
			||||||
 | 
					        return availableSpace;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (!process.waitForFinished(600000)) {
 | 
				
			||||||
 | 
					        errorMsg = "System::getFreeDiskSpace(): ERROR: " + process.errorString();
 | 
				
			||||||
 | 
					        qDebug() << errorMsg;
 | 
				
			||||||
 | 
					        return availableSpace;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    else {
 | 
				
			||||||
 | 
					        QByteArray bytes = process.readAll();
 | 
				
			||||||
 | 
					        QStringList lines = QString(bytes).split("\n");
 | 
				
			||||||
 | 
					        foreach (QString line, lines) {
 | 
				
			||||||
 | 
					            //qDebug() << "System::getFreeDiskSpace() line:    " << line;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (line.contains(dev)) {
 | 
				
			||||||
 | 
					                //qDebug() << "System::getFreeDiskSpace() line contains dev";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                QStringList processResultLine = line.split(' ', QString::SkipEmptyParts);
 | 
				
			||||||
 | 
					                if (processResultLine.size() >= 4) {
 | 
				
			||||||
 | 
					                    bool ok;
 | 
				
			||||||
 | 
					                    availableSpace = processResultLine.at(3).toLong(&ok);
 | 
				
			||||||
 | 
					                    if (!ok) {
 | 
				
			||||||
 | 
					                        return 0;
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    qDebug() << "System::getFreeDiskSpace() availableSpace = " << availableSpace;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                else {
 | 
				
			||||||
 | 
					                    return availableSpace;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return availableSpace;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/********************************************************************************
 | 
				
			||||||
 | 
					 * static function to create a backup of logfiles
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * 'targzfile' is an absolute filename for ar tar.gz file wich will be created
 | 
				
			||||||
 | 
					 * 'filelistfile' is an absolute filename of a file containing all names of files
 | 
				
			||||||
 | 
					 *                which should be backed up.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * returns:
 | 
				
			||||||
 | 
					 *  1 on success
 | 
				
			||||||
 | 
					 *  0 on failure
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					quint8 System::createLogFileBackup(const QString & targzfile, const QString &filelistfile)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    QProcess process;
 | 
				
			||||||
 | 
					    process.setProcessChannelMode(QProcess::MergedChannels);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    qDebug() << "System::createLogFileBackup() targzfile    = " << targzfile;
 | 
				
			||||||
 | 
					    qDebug() << "System::createLogFileBackup() filelistfile = " << filelistfile;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    QString commandString = "tar hczvf " + targzfile + " -T " + filelistfile;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    qDebug() << "System::createLogFileBackup() tar command:" << commandString;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    process.start(commandString);
 | 
				
			||||||
 | 
					    if (!process.waitForStarted()) {
 | 
				
			||||||
 | 
					        errorMsg = "System::createLogFileBackup(): ERROR: waitForStarted()";
 | 
				
			||||||
 | 
					        return 1;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (!process.waitForFinished(600000)) {
 | 
				
			||||||
 | 
					        errorMsg = "System::createLogFileBackup(): ERROR: " + process.errorString();
 | 
				
			||||||
 | 
					        qDebug() << errorMsg;
 | 
				
			||||||
 | 
					        return 1;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    else {
 | 
				
			||||||
 | 
					        // DEBUG
 | 
				
			||||||
 | 
					        //QByteArray bytes = process.readAll();
 | 
				
			||||||
 | 
					        //QStringList lines = QString(bytes).split("\n");
 | 
				
			||||||
 | 
					        //foreach (QString line, lines) {
 | 
				
			||||||
 | 
					        //    qDebug() << "System::createLogFileBackup() line:    " << line;
 | 
				
			||||||
 | 
					        //}
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    QString resultMessage;
 | 
				
			||||||
 | 
					    QProcess::ExitStatus exitStatus = process.exitStatus();
 | 
				
			||||||
 | 
					    int exitCode = process.exitCode();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (exitStatus == QProcess::CrashExit) {
 | 
				
			||||||
 | 
					        resultMessage = "local backup program crashed";
 | 
				
			||||||
 | 
					        qCritical() << resultMessage;
 | 
				
			||||||
 | 
					        return 1;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /**
 | 
				
			||||||
 | 
					         *  note for exit codes of process tar:
 | 
				
			||||||
 | 
					         *  see: http://www.gnu.org/software/tar/manual/html_section/tar_19.html#Synopsis
 | 
				
			||||||
 | 
					         *
 | 
				
			||||||
 | 
					         *  tar returns exitCode 2 if some files in logFileList could not be read (e.g. if they are not existing)
 | 
				
			||||||
 | 
					         *  however, tar-archive is created although!
 | 
				
			||||||
 | 
					         *  This means success for our needs!
 | 
				
			||||||
 | 
					         */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if ( (exitCode != 0) && (exitCode != 2) && (exitStatus == QProcess::NormalExit) ) {
 | 
				
			||||||
 | 
					        resultMessage = "Local Backup file \"" + targzfile + "\" with exit code = " + QString::number(exitCode);
 | 
				
			||||||
 | 
					        qCritical() << resultMessage;
 | 
				
			||||||
 | 
					        return 1;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    else {
 | 
				
			||||||
 | 
					        resultMessage = "Local Backup file \"" + targzfile + "\" was created successfully.";
 | 
				
			||||||
 | 
					        qCritical() << resultMessage;
 | 
				
			||||||
 | 
					        return 0;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*****************************************************************************
 | 
				
			||||||
 | 
					 * get SD-card mount path.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					QString System::getSDCardMountPath()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					#if defined (ARCH_PTU4)
 | 
				
			||||||
 | 
					    return "/media/mmcblk0p1";
 | 
				
			||||||
 | 
					#elif defined (ARCH_PTU5)
 | 
				
			||||||
 | 
					    return "/media/mmcblk0p1";
 | 
				
			||||||
 | 
					#elif defined (ARCH_DesktopLinux)
 | 
				
			||||||
 | 
					    // DEBUG / TEST:
 | 
				
			||||||
 | 
					    return "/home/siegert/APconfigTest";
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					    return "";
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*****************************************************************************
 | 
				
			||||||
 | 
					 * get SD-card device name.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					QString System::getSDCardDeviceName()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					#if defined (ARCH_PTU4)
 | 
				
			||||||
 | 
					    return "/dev/mmcblk0p1";
 | 
				
			||||||
 | 
					#elif defined (ARCH_PTU5)
 | 
				
			||||||
 | 
					    return "/dev/mmcblk0p1";
 | 
				
			||||||
 | 
					#elif defined (ARCH_DesktopLinux)
 | 
				
			||||||
 | 
					    return "/dev/sdf1";
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					    return "";
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/********************************************************************************
 | 
				
			||||||
 | 
					 * static function to build and return a unique device id.
 | 
				
			||||||
 | 
					 * This id consists currently only of the mac-address of network device eth0.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					QString System::getUniqueDeviceId()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    QString filename = "/sys/class/net/eth0/address";
 | 
				
			||||||
 | 
					    QString result;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    QFile file(filename);
 | 
				
			||||||
 | 
					    if(!file.open(QIODevice::ReadOnly)) {
 | 
				
			||||||
 | 
					        qCritical() << "System::getUniqueDeviceId() could not open file: " << filename;
 | 
				
			||||||
 | 
					        result = "0";
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    else {
 | 
				
			||||||
 | 
					        QTextStream in(&file);
 | 
				
			||||||
 | 
					        result = in.readLine(20);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    file.close();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    result.remove(':');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return result;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					QString System::readStringFromFile(const QString & filename)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					#if defined (ARCH_PTU4)
 | 
				
			||||||
 | 
					    QFileInfo fileinfo(filename);
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					    QFileInfo fileinfo(QDir::homePath() + filename);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					    if (! fileinfo.isReadable() ) {
 | 
				
			||||||
 | 
					        qDebug() << "System::readStringFromFile(): \"" << filename << "\" is not readable";
 | 
				
			||||||
 | 
					        return "";
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if defined (ARCH_PTU4)
 | 
				
			||||||
 | 
					    QFile file(filename);
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					    QFile file(QDir::homePath() + filename);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					    if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
 | 
				
			||||||
 | 
					        qDebug() << "System::readStringFromFile() cannot open file: " << filename;
 | 
				
			||||||
 | 
					        return "";
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    QTextStream in(&file);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    QString stringValue = in.readLine(100);
 | 
				
			||||||
 | 
					    qDebug() << "System::readStringFromFile() stringValue = " << stringValue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    file.close();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return stringValue;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int System::readIntFromFile(const QString & filename)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    bool ok;
 | 
				
			||||||
 | 
					    int result = (int)readStringFromFile(filename).toInt(&ok);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (!ok) {
 | 
				
			||||||
 | 
					        result = 0;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return result;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/****************************************************************************
 | 
				
			||||||
 | 
					 * read ptu internal data
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					QString System::getPTU4SerialNumber()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    return readStringFromFile("/sys/bus/i2c/devices/0-0050/SNO");
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					QString System::getPTU4MACAddress()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    return readStringFromFile("/sys/bus/i2c/devices/0-0050/MAC");
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		Reference in New Issue
	
	Block a user