Compare commits

..

11 Commits

Author SHA1 Message Date
8a564b9538 main: use configuration for setting variables ...
-> remove wrong default values.
 -> remove dependency for certain host-names
2026-02-10 14:28:13 +01:00
d5e62e72d3 commandline_parser: add options ...
for sshKeyFile and StrictHostKeyChecking.
Set correct default values.
2026-02-10 14:26:19 +01:00
0155d51d3d git-client: add note about GIT_SSH_COMMAND env variants 2026-02-10 14:25:17 +01:00
843ac23770 Build: remove lib dependency on Yocto build 2026-02-10 10:16:20 +01:00
c3b2db7797 Set version 1.5.99 2026-02-10 10:10:34 +01:00
51640b70e9 Merge branch '281/Szeged_without_LibDC' into 281/Szeged 2026-02-10 09:55:35 +01:00
be84c96953 Fix: remove test code 2026-02-10 09:53:58 +01:00
24bf190c90 281/Szeged: Skip updating json files ...
... because this is not supported in currently installed DC-FW version
and DC-lib version.
2026-02-09 15:57:22 +01:00
b656b5eab6 281/Szeged: compile only main program ATBUpdateTool
... because current installed DC-FW version or current installed DClib
in Szeged do not support updating DC-json-files and DC-FW.
2026-02-09 15:55:01 +01:00
6681e61f59 Szeged is still using libCAmaster 2026-02-09 15:21:45 +01:00
7ec6ab00b1 Use interfaces.h from version 1.3.5 2026-02-09 15:19:42 +01:00
13 changed files with 1542 additions and 45 deletions

View File

@@ -9,7 +9,7 @@ psa-tariff-directory="etc/psa_tariff/"
[PLUGINS] [PLUGINS]
plugin-name="libCAslave.so" plugin-name="libCAmaster.so"
[FLAGS] [FLAGS]
no-psa-hardware-update=false no-psa-hardware-update=false

View File

@@ -1,3 +1,4 @@
TEMPLATE = subdirs TEMPLATE = subdirs
CONFIG += ordered CONFIG += ordered
SUBDIRS = DownloadDCFirmware DownloadDCJsonFiles UpdatePTUDevCtrl #SUBDIRS = DownloadDCFirmware DownloadDCJsonFiles UpdatePTUDevCtrl
SUBDIRS = UpdatePTUDevCtrl

View File

@@ -2,6 +2,9 @@ QT += core serialport
TARGET = ATBUpdateDC TARGET = ATBUpdateDC
include(../common.pri)
VERSION="0.1.0" VERSION="0.1.0"
win32 { win32 {
BUILD_DATE=$$system("date /t") BUILD_DATE=$$system("date /t")

View File

@@ -1,6 +1,8 @@
QT += core QT += core
QT += serialport network QT += serialport network
include(../common.pri)
TARGET = ATBDownloadDCJsonFiles TARGET = ATBDownloadDCJsonFiles
VERSION="0.1.0" VERSION="0.1.0"

View File

@@ -1,6 +1,8 @@
QT += core gui QT += core gui
QT += widgets serialport network QT += widgets serialport network
include(../common.pri)
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = ATBUpdateTool TARGET = ATBUpdateTool
@@ -150,7 +152,10 @@ DEFINES += QT_DEPRECATED_WARNINGS
# 1.5.7 : Add support for dynamic portrait / landscape. # 1.5.7 : Add support for dynamic portrait / landscape.
# 1.5.8 : Use EVENT_ID=<pid of update-tool> for CMD_EVENT. # 1.5.8 : Use EVENT_ID=<pid of update-tool> for CMD_EVENT.
# 1.5.9 : Removed restart of Apism if ISMAS unreachable. # 1.5.9 : Removed restart of Apism if ISMAS unreachable.
VERSION="1.5.9" # 1.5.99 : Special version for 281/Szeged: remove all DC-library dependencies, as
# DC-firmware in Szeged does not support uploading json-files or uploading
# DC-firmware binaries.
VERSION="1.5.99"
# 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
@@ -256,9 +261,6 @@ contains( CONFIG, PTU5_YOCTO ) {
PTU5BASEPATH = /opt/devel/ptu5 PTU5BASEPATH = /opt/devel/ptu5
ARCH = PTU5 ARCH = PTU5
DEFINES+=PTU5 DEFINES+=PTU5
LIBS += -lCAslave
LIBS += -lCAmaster
} }
contains( CONFIG, DesktopLinux ) { contains( CONFIG, DesktopLinux ) {
greaterThan(QT_MAJOR_VERSION, 4): QT += serialport greaterThan(QT_MAJOR_VERSION, 4): QT += serialport

View File

@@ -6,7 +6,9 @@
#include <QFile> #include <QFile>
CommandLineParser::CommandLineParser() CommandLineParser::CommandLineParser()
: m_repositoryUrl("https://git.mimbach49.de/GerhardHoffmann") : m_repositoryUrl("gitea@ptu-config.atb-comm.de:ATB/")
, m_sshKeyFile("/opt/app/tools/atbupdate/.keys/id_ed25519_ptuConfig")
, m_sshOptionStrictHostKeyChecking("false")
, m_plugInDir("/usr/lib/") , m_plugInDir("/usr/lib/")
, m_plugInName("libCAslave.so") , m_plugInName("libCAslave.so")
, m_workingDir("/opt/app/tools/atbupdate/") , m_workingDir("/opt/app/tools/atbupdate/")
@@ -20,27 +22,36 @@ CommandLineParser::CommandLineParser()
, m_alwaysDownloadDC("false") , m_alwaysDownloadDC("false")
, m_repositoryUrlOption( , m_repositoryUrlOption(
QCommandLineOption( QCommandLineOption(
QStringList() << "repository-url" << "repository-url", QStringList() << "repository-url",
QCoreApplication::translate("main", "Where to find a customer repository."), QCoreApplication::translate("main", "Where to find a customer repository."),
QCoreApplication::translate("main", "directory"))) QCoreApplication::translate("main", "directory")))
, m_sshKeyFileOption(
QCommandLineOption(
QStringList() << "sshKeyFile",
QCoreApplication::translate("main", "Used ssh key."),
QCoreApplication::translate("main", "file")))
, m_sshOptionStrictHostKeyCheckingOption(
QCommandLineOption(
QStringList() << "sshStrictHostKeyChecking",
QCoreApplication::translate("main", "Enable ssh strict host key checking")))
, m_iniFileDirectoryOption( , m_iniFileDirectoryOption(
QCommandLineOption( QCommandLineOption(
QStringList() << "ini-directory" << "ini-directory", QStringList() << "ini-directory",
QCoreApplication::translate("main", "Where to find an ini-file."), QCoreApplication::translate("main", "Where to find an ini-file."),
QCoreApplication::translate("main", "directory"))) QCoreApplication::translate("main", "directory")))
, m_iniFileNameOption( , m_iniFileNameOption(
QCommandLineOption( QCommandLineOption(
QStringList() << "ini-filename" << "ini-filename", QStringList() << "ini-filename",
QCoreApplication::translate("main", "Name of ini-file."), QCoreApplication::translate("main", "Name of ini-file."),
QCoreApplication::translate("main", "file"))) QCoreApplication::translate("main", "file")))
, m_pluginDirectoryOption( , m_pluginDirectoryOption(
QCommandLineOption( QCommandLineOption(
QStringList() << "plugin-directory" << "plugin-directory", QStringList() << "plugin-directory",
QCoreApplication::translate("main", "Where to find dc-plugin."), QCoreApplication::translate("main", "Where to find dc-plugin."),
QCoreApplication::translate("main", "directory"))) QCoreApplication::translate("main", "directory")))
, m_pluginNameOption( , m_pluginNameOption(
QCommandLineOption( QCommandLineOption(
QStringList() << "plugin-name" << "plugin-name", QStringList() << "plugin-name",
QCoreApplication::translate("main", "Name of dc-plugin."), QCoreApplication::translate("main", "Name of dc-plugin."),
QCoreApplication::translate("main", "directory"))) QCoreApplication::translate("main", "directory")))
, m_noDownloadOption( , m_noDownloadOption(
@@ -57,17 +68,17 @@ CommandLineParser::CommandLineParser()
QCoreApplication::translate("main", "Always download the dc-bin-file to DC)."))) QCoreApplication::translate("main", "Always download the dc-bin-file to DC).")))
, m_workingDirectoryOption( , m_workingDirectoryOption(
QCommandLineOption( QCommandLineOption(
QStringList() << "working-directory" << "working-directory", QStringList() << "working-directory",
QCoreApplication::translate("main", "working directory of update-script."), QCoreApplication::translate("main", "working directory of update-script."),
QCoreApplication::translate("main", "directory"))) QCoreApplication::translate("main", "directory")))
, m_psaConfigDirectoryOption( , m_psaConfigDirectoryOption(
QCommandLineOption( QCommandLineOption(
QStringList() << "psa-config-directory" << "psa-config-directory", QStringList() << "psa-config-directory",
QCoreApplication::translate("main", "config directory of json-files sent to dc."), QCoreApplication::translate("main", "config directory of json-files sent to dc."),
QCoreApplication::translate("main", "directory"))) QCoreApplication::translate("main", "directory")))
, m_psaTariffDirectoryOption( , m_psaTariffDirectoryOption(
QCommandLineOption( QCommandLineOption(
QStringList() << "psa-tariff-directory" << "psa-tariff-directory", QStringList() << "psa-tariff-directory",
QCoreApplication::translate("main", "tariff directory of tariff-json-files."), QCoreApplication::translate("main", "tariff directory of tariff-json-files."),
QCoreApplication::translate("main", "directory"))) QCoreApplication::translate("main", "directory")))
, m_dryRunOption( , m_dryRunOption(
@@ -94,8 +105,8 @@ CommandLineParser::CommandLineParser()
, m_readDCVersionOption( , m_readDCVersionOption(
QCommandLineOption( QCommandLineOption(
QStringList() << "D" << "read-dc-version", QStringList() << "D" << "read-dc-version",
QCoreApplication::translate("main", "Show version of device controller."), QCoreApplication::translate("main", "Show version of device controller.")))
QCoreApplication::translate("main", "Show version of device controller."))) { {
configure(); configure();
} }
@@ -104,9 +115,15 @@ void CommandLineParser::configure() {
m_parser.addHelpOption(); m_parser.addHelpOption();
m_parser.addVersionOption(); m_parser.addVersionOption();
m_repositoryUrlOption.setDefaultValue("https://git.mimbach49.de/GerhardHoffmann"); m_repositoryUrlOption.setDefaultValue("gitea@ptu-config.atb-comm.de:ATB/");
m_parser.addOption(m_repositoryUrlOption); m_parser.addOption(m_repositoryUrlOption);
m_sshKeyFileOption.setDefaultValue("/opt/app/tools/atbupdate/.keys/id_ed25519_ptuConfig");
m_parser.addOption(m_sshKeyFileOption);
m_sshOptionStrictHostKeyCheckingOption.setDefaultValue("");
m_parser.addOption(m_sshOptionStrictHostKeyCheckingOption);
m_iniFileDirectoryOption.setDefaultValue(QCoreApplication::applicationDirPath()); m_iniFileDirectoryOption.setDefaultValue(QCoreApplication::applicationDirPath());
m_parser.addOption(m_iniFileDirectoryOption); m_parser.addOption(m_iniFileDirectoryOption);
@@ -177,6 +194,12 @@ void CommandLineParser::readSettings() {
if (key.contains("repository-url")) { if (key.contains("repository-url")) {
m_repositoryUrl = v.toString(); m_repositoryUrl = v.toString();
} else } else
if (key.contains("sshKeyFile")) {
m_sshKeyFile = v.toString();
} else
if (key.contains("sshOptionStrictHostKeyChecking")) {
m_sshOptionStrictHostKeyChecking = (v.toBool() ? "true" : "false");
} else
if (key.contains("plugin-directory")) { if (key.contains("plugin-directory")) {
m_plugInDir = v.toString(); m_plugInDir = v.toString();
} else } else
@@ -237,6 +260,21 @@ QString CommandLineParser::repositoryUrl() {
return m_repositoryUrl; return m_repositoryUrl;
} }
QString CommandLineParser::sshKeyFile() {
if (m_parser.isSet(m_sshKeyFileOption)) {
m_sshKeyFile = m_parser.value(m_sshKeyFileOption);
}
return m_sshKeyFile;
}
bool CommandLineParser::sshOptionStrictHostKeyChecking()
{
if (m_parser.isSet(m_sshOptionStrictHostKeyCheckingOption)) {
m_sshOptionStrictHostKeyChecking = m_parser.value(m_sshOptionStrictHostKeyCheckingOption);
}
return m_sshOptionStrictHostKeyChecking == "false" ? false : true;
}
QString CommandLineParser::plugInDir() { QString CommandLineParser::plugInDir() {
if (m_parser.isSet(m_pluginDirectoryOption)) { if (m_parser.isSet(m_pluginDirectoryOption)) {
m_plugInDir = m_parser.value(m_pluginDirectoryOption); m_plugInDir = m_parser.value(m_pluginDirectoryOption);

View File

@@ -8,6 +8,8 @@
class CommandLineParser : public QCommandLineParser { class CommandLineParser : public QCommandLineParser {
QString m_repositoryUrl; QString m_repositoryUrl;
QString m_sshKeyFile;
QString m_sshOptionStrictHostKeyChecking;
QString m_plugInDir; QString m_plugInDir;
QString m_plugInName; QString m_plugInName;
QString m_workingDir; QString m_workingDir;
@@ -25,6 +27,8 @@ class CommandLineParser : public QCommandLineParser {
QString m_dcDir{"etc/dc/"}; QString m_dcDir{"etc/dc/"};
QCommandLineOption m_repositoryUrlOption; QCommandLineOption m_repositoryUrlOption;
QCommandLineOption m_sshKeyFileOption;
QCommandLineOption m_sshOptionStrictHostKeyCheckingOption;
QCommandLineOption m_iniFileDirectoryOption; QCommandLineOption m_iniFileDirectoryOption;
QCommandLineOption m_iniFileNameOption; QCommandLineOption m_iniFileNameOption;
QCommandLineOption m_pluginDirectoryOption; QCommandLineOption m_pluginDirectoryOption;
@@ -57,6 +61,8 @@ public:
QString const &iniFileName() const { return m_iniFileName; } QString const &iniFileName() const { return m_iniFileName; }
void readSettings(); void readSettings();
QString repositoryUrl(); QString repositoryUrl();
QString sshKeyFile();
bool sshOptionStrictHostKeyChecking();
QString plugInDir(); QString plugInDir();
QString plugInName(); QString plugInName();
QString workingDir(); QString workingDir();

View File

@@ -400,6 +400,12 @@ std::optional<QString> GitClient::gitPull() {
If remote host keys are changed, then If remote host keys are changed, then
export GIT_SSH_COMMAND="ssh -i /opt/app/tools/atbupdate/.keys/id_ed25519_ptuConfig" export GIT_SSH_COMMAND="ssh -i /opt/app/tools/atbupdate/.keys/id_ed25519_ptuConfig"
... or ignore host key checking:
export GIT_SSH_COMMAND="ssh -i /opt/app/tools/atbupdate/.keys/id_ed25519_ptuConfig -o StrictHostKeyChecking=no"
... or use separate known_hosts file:
export GIT_SSH_COMMAND="ssh -i /mypath/.keys/id_ed25519 -o StrictHostKeyChecking=yes -o UserKnownHostsFile=/opt/app/tools/atbupdate/.keys/known_hosts
git pull git pull
leads to the following warning/error message: leads to the following warning/error message:

View File

@@ -72,39 +72,43 @@ int main(int argc, char *argv[]) {
CommandLineParser parser; CommandLineParser parser;
parser.process(a); parser.process(a);
if (parser.isSet(parser.addHelpOption())) {
parser.showHelp(0);
return 0;
}
parser.readSettings(); parser.readSettings();
QString repositoryUrl = parser.repositoryUrl(); QString repositoryUrl = parser.repositoryUrl();
QString sshKeyFile = parser.sshKeyFile();
bool strictHostKeyChecking = parser.sshOptionStrictHostKeyChecking();
if (repositoryUrl.endsWith('/')) { if (repositoryUrl.endsWith('/')) {
repositoryUrl.chop(1); repositoryUrl.chop(1);
} }
QString gitSSHCommand(""); // default for gitSSHCommand
QString gitSSHCommand = "ssh -i " + sshKeyFile;
if (repositoryUrl.contains("ptu-config.atb-comm.de")) { strictHostKeyChecking ? gitSSHCommand.append(" -o StrictHostKeyChecking=yes")
QByteArray const v = qgetenv("GIT_SSH_COMMAND"); : gitSSHCommand.append(" -o StrictHostKeyChecking=no");
if (v.isEmpty()) {
QString sshKeyFile("/opt/app/tools/atbupdate/.keys/id_ed25519_ptuConfig"); QByteArray const v = qgetenv("GIT_SSH_COMMAND");
if (QFileInfo(sshKeyFile).exists()) { if (v.isEmpty()) {
gitSSHCommand = "ssh -i /opt/app/tools/atbupdate/.keys/id_ed25519_ptuConfig"; if (QFileInfo(sshKeyFile).exists()) {
if (!qputenv("GIT_SSH_COMMAND", QByteArray(gitSSHCommand.toStdString().c_str()))) { if (!qputenv("GIT_SSH_COMMAND", QByteArray(gitSSHCommand.toStdString().c_str()))) {
qCritical() << "ERROR: GIT_SSH_COMMAND not put into env. Exiting..."; qCritical() << "ERROR: GIT_SSH_COMMAND not put into env. Exiting...";
return -1;
}
} else {
qCritical() << "ERROR ssh-key-file" << sshKeyFile << "does not exists. Exiting...";
return -1; return -1;
} }
} else { } else {
gitSSHCommand = QString(v.toStdString().c_str()); qCritical() << "ERROR ssh-key-file" << sshKeyFile << "does not exists. Exiting...";
qCritical() << "WARNING GIT_SSH_COMMAND already set in enviroment:" return -1;
<< gitSSHCommand;
if (gitSSHCommand != "ssh -i /opt/app/tools/atbupdate/.keys/id_ed25519_ptuConfig") {
qCritical() << "ERROR" << gitSSHCommand << "wrong. Exiting...";
return -1;
}
} }
} else {
gitSSHCommand = QString(v.toStdString().c_str());
qCritical() << "WARNING GIT_SSH_COMMAND already set in enviroment:"
<< gitSSHCommand;
} }
QString plugInDir = parser.plugInDir(); QString plugInDir = parser.plugInDir();
@@ -161,7 +165,6 @@ int main(int argc, char *argv[]) {
return 0; return 0;
} }
QThread::currentThread()->setObjectName("main thread"); QThread::currentThread()->setObjectName("main thread");
qInfo() << "Main thread" << QThread::currentThreadId(); qInfo() << "Main thread" << QThread::currentThreadId();

View File

@@ -40,6 +40,7 @@ QPluginLoader Update::pluginLoader;
hwinf *Update::loadDCPlugin(QDir const &plugInDir, QString const &fname) { hwinf *Update::loadDCPlugin(QDir const &plugInDir, QString const &fname) {
hwinf *hw = nullptr; hwinf *hw = nullptr;
#if 0
if (plugInDir.exists()) { if (plugInDir.exists()) {
QString pluginLibName(fname); QString pluginLibName(fname);
pluginLibName = plugInDir.absoluteFilePath(pluginLibName); pluginLibName = plugInDir.absoluteFilePath(pluginLibName);
@@ -74,6 +75,7 @@ hwinf *Update::loadDCPlugin(QDir const &plugInDir, QString const &fname) {
qCritical() << "plugins directory" << plugInDir.absolutePath() qCritical() << "plugins directory" << plugInDir.absolutePath()
<< "does not exist"; << "does not exist";
} }
#endif
return hw; return hw;
} }
@@ -117,6 +119,7 @@ Update::Update(Worker *worker,
, m_dryRun(dryRun) , m_dryRun(dryRun)
, m_sys_areDCdataValid(false) { , m_sys_areDCdataValid(false) {
#if 0
if (!m_hw) { if (!m_hw) {
qCritical() << "(" << __func__ << ":" << __LINE__ << ") m_hw == nullptr -> ca-slave plugin not loaded"; qCritical() << "(" << __func__ << ":" << __LINE__ << ") m_hw == nullptr -> ca-slave plugin not loaded";
} else { } else {
@@ -134,6 +137,7 @@ Update::Update(Worker *worker,
qCritical() << "(" << __func__ << ":" << __LINE__ << ") m_sys_areDCDataValid ..." qCritical() << "(" << __func__ << ":" << __LINE__ << ") m_sys_areDCDataValid ..."
<< m_sys_areDCdataValid; << m_sys_areDCdataValid;
} }
#endif
} }
Update::~Update() { Update::~Update() {
@@ -606,6 +610,8 @@ QString Update::getFileVersion(QString const& jsonFileName) {
} }
bool Update::checkDownloadedJsonVersions(QStringList const& jsonFileNames) { bool Update::checkDownloadedJsonVersions(QStringList const& jsonFileNames) {
// note: 2026-02-09: this method is not used!
#if 0
for (QStringList::size_type i=0; i < jsonFileNames.size(); ++i) { for (QStringList::size_type i=0; i < jsonFileNames.size(); ++i) {
@@ -679,14 +685,14 @@ bool Update::checkDownloadedJsonVersions(QStringList const& jsonFileNames) {
qCritical() << "CANNOT FIND JSON-NR FOR" << fName; qCritical() << "CANNOT FIND JSON-NR FOR" << fName;
} }
} }
#endif
return false; return false;
} }
QMap<QString, QString> QMap<QString, QString>
Update::getInstalledJsonVersions(QStringList const& jsonFileNames) { Update::getInstalledJsonVersions(QStringList const& jsonFileNames) {
QMap<QString, QString> map; QMap<QString, QString> map;
#if 0
if (!m_hw) { if (!m_hw) {
qCritical() << "(" << __func__ << ":" << __LINE__ << "):" qCritical() << "(" << __func__ << ":" << __LINE__ << "):"
<< "ERROR!!! m_hw == nullptr"; << "ERROR!!! m_hw == nullptr";
@@ -786,6 +792,7 @@ Update::getInstalledJsonVersions(QStringList const& jsonFileNames) {
} }
} }
#endif
return map; return map;
} }

View File

@@ -290,7 +290,7 @@ void Worker::privateUpdate() {
return; return;
} }
return; //return;
QString func(__PRETTY_FUNCTION__); QString func(__PRETTY_FUNCTION__);
@@ -541,9 +541,10 @@ void Worker::privateUpdate() {
// UPDATE THE PSA USING THE CHANGED FILES // UPDATE THE PSA USING THE CHANGED FILES
// //
//////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////
if ((continueUpdate = downloadFilesToPSAHardware()) == false) { // for 281/Szeged: skip uploading files to DeviceController
return; //if ((continueUpdate = downloadFilesToPSAHardware()) == false) {
} // return;
//}
lst = QStringList(QString("DONE")); lst = QStringList(QString("DONE"));
ISMAS(lst) << (GUI(lst) << (CONSOLE(lst) << UPDATE_STEP::DOWNLOAD_FILES_TO_PSA_HARDWARE_SUCCESS)); ISMAS(lst) << (GUI(lst) << (CONSOLE(lst) << UPDATE_STEP::DOWNLOAD_FILES_TO_PSA_HARDWARE_SUCCESS));

1
common.pri Normal file
View File

@@ -0,0 +1 @@
INCLUDEPATH += $$PWD/common/include

File diff suppressed because it is too large Load Diff