Compare commits

..

7 Commits

Author SHA1 Message Date
f37d6c9128 Merge branch 'pu/ATBUpdateDC_CommandLineParameter' 2026-02-16 16:30:27 +01:00
0464c2ec74 ATBDownloadDC: need single argument: bin-file name 2026-02-16 16:29:57 +01:00
a1ad4a6605 Resolve compiler warnings 2026-02-12 11:50:09 +01:00
ada6da5b5b Merge branch 'includeNewATBUpdateDC' 2026-02-11 10:30:53 +01:00
f7b3344292 main: use configuration for setting variables ...
-> remove wrong default values.
 -> remove dependency for certain host-names
2026-02-10 14:31:18 +01:00
12d65bf372 commandline_parser: add options ...
for sshKeyFile and StrictHostKeyChecking.
Set correct default values.
2026-02-10 14:31:11 +01:00
de1bf61e7c git-client: add note about GIT_SSH_COMMAND env variants 2026-02-10 14:31:02 +01:00
8 changed files with 118 additions and 78 deletions

View File

@@ -98,9 +98,6 @@ OTHER_FILES += \
../ATBUpdateTool.ini
FORMS += \
mainwindow.ui
##########################################################################################
# for running program on target through QtCreator
contains( CONFIG, PTU5 ) {

View File

@@ -4,7 +4,6 @@
#include <QByteArray>
#include <QProcess>
#include <QCommandLineParser>
#include <QStandardPaths>
#include <QSettings>
#include <QDir>
@@ -65,9 +64,7 @@ int main(int argc, char **argv) {
setDebugLevel(LOG_NOTICE);
}
//return 0;
/*
/*
CommandLineParser parser;
parser.process(a);
parser.readSettings();
@@ -129,21 +126,13 @@ int main(int argc, char **argv) {
printf(APP_EXTENDED_VERSION"\n");
return 0;
}
QString const &customerRepo
= QDir::cleanPath(workingDir + QDir::separator() + QString("customer_%1").arg(customerNr));
*/
QString const &psaDcDir = internal::customerRepoDcDir();
QString const &psaRepoRootDir = internal::customerRepoRoot();
QString const &psaRepoDir = internal::customerRepoDir();
QString const &branchName = internal::branchName();
*/
bool debug = false;
bool noaction = true;
QString workingDir;
QString libDir;
QString libca;
QString workingDir;
std::unique_ptr<QSettings> settings = internal::readSettings();
@@ -162,37 +151,37 @@ int main(int argc, char **argv) {
settings->endGroup();
}
// etc/dc: located under mount-path
std::optional<QString> mountPath = System::checkForUSBStick(psaDcDir);
QFileInfo fi;
if (mountPath.has_value()) {
fi.setFile(mountPath.value(), System::getDCFileOnUsbStick(mountPath.value()));
} else
if ((mountPath = System::checkForSDCard(psaDcDir)).has_value()) {
fi.setFile(mountPath.value(), System::getDCFileOnSDCard(mountPath.value()));
} else {
if (debug) {
qInfo() << "using customer repository" << psaRepoDir;
}
std::unique_ptr<QString> c = internal::dcCandidateToInstall("/etc/dc/");
if (c) {
fi.setFile(*c);
if (fi.exists() == false) {
qCritical() << "dc2c.bin candidate" << *c << "does not exist. STOP.";
return -1;
}
qInfo() << "dc2c.bin canditate" << fi.absoluteFilePath();
}
// ------------------- single command line argument is DC-firmware binary file -----------------
QStringList args = a.arguments();
if (args.size() != 2) {
qCritical() << "ERROR: missing parameter <dc-firmware>";
exit(1);
}
if (debug) {
qInfo() << "downloading dc-firmware" << fi.absoluteFilePath();
qInfo() << "dc-firmware size (bytes)" << fi.size();
qInfo() << "dc-version" << Update::dcVersion(fi.absoluteFilePath());
qCritical() << "------------------------------------------------------";
qCritical() << "main: argument dc-firmware: " << args.at(1);
qCritical() << "------------------------------------------------------";
fi.setFile(args.at(1));
if (!fi.isFile()) {
qCritical() << "ERROR: parameter " << fi.absoluteFilePath() << " is not a file";
exit(1);
}
if (!fi.isReadable()) {
qCritical() << "ERROR: parameter " << fi.absoluteFilePath() << " is not readable";
exit(1);
}
qCritical() << "------------------------------------------------------";
qCritical() << "uploading dc-firmware" << fi.absoluteFilePath();
qCritical() << "dc-firmware size (bytes)" << fi.size();
qCritical() << "dc-version" << Update::dcVersion(fi.absoluteFilePath());
qCritical() << "------------------------------------------------------";
Update u(fi.absoluteFilePath(), libca, debug, noaction);
u.run();

View File

@@ -397,9 +397,7 @@ int Update::run() {
qInfo() << "<DC-VERSION>" << Update::dcVersion(m_dcFileName);
}
if (!m_debug) {
m_hw->dc_autoRequest(false);
}
m_hw->dc_autoRequest(false);
qInfo() << "DC auto request OFF";

View File

@@ -6,7 +6,9 @@
#include <QFile>
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_plugInName("libCAslave.so")
, m_workingDir("/opt/app/tools/atbupdate/")
@@ -20,27 +22,36 @@ CommandLineParser::CommandLineParser()
, m_alwaysDownloadDC("false")
, m_repositoryUrlOption(
QCommandLineOption(
QStringList() << "repository-url" << "repository-url",
QStringList() << "repository-url",
QCoreApplication::translate("main", "Where to find a customer repository."),
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(
QCommandLineOption(
QStringList() << "ini-directory" << "ini-directory",
QStringList() << "ini-directory",
QCoreApplication::translate("main", "Where to find an ini-file."),
QCoreApplication::translate("main", "directory")))
, m_iniFileNameOption(
QCommandLineOption(
QStringList() << "ini-filename" << "ini-filename",
QStringList() << "ini-filename",
QCoreApplication::translate("main", "Name of ini-file."),
QCoreApplication::translate("main", "file")))
, m_pluginDirectoryOption(
QCommandLineOption(
QStringList() << "plugin-directory" << "plugin-directory",
QStringList() << "plugin-directory",
QCoreApplication::translate("main", "Where to find dc-plugin."),
QCoreApplication::translate("main", "directory")))
, m_pluginNameOption(
QCommandLineOption(
QStringList() << "plugin-name" << "plugin-name",
QStringList() << "plugin-name",
QCoreApplication::translate("main", "Name of dc-plugin."),
QCoreApplication::translate("main", "directory")))
, m_noDownloadOption(
@@ -57,17 +68,17 @@ CommandLineParser::CommandLineParser()
QCoreApplication::translate("main", "Always download the dc-bin-file to DC).")))
, m_workingDirectoryOption(
QCommandLineOption(
QStringList() << "working-directory" << "working-directory",
QStringList() << "working-directory",
QCoreApplication::translate("main", "working directory of update-script."),
QCoreApplication::translate("main", "directory")))
, m_psaConfigDirectoryOption(
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", "directory")))
, m_psaTariffDirectoryOption(
QCommandLineOption(
QStringList() << "psa-tariff-directory" << "psa-tariff-directory",
QStringList() << "psa-tariff-directory",
QCoreApplication::translate("main", "tariff directory of tariff-json-files."),
QCoreApplication::translate("main", "directory")))
, m_dryRunOption(
@@ -94,8 +105,8 @@ CommandLineParser::CommandLineParser()
, m_readDCVersionOption(
QCommandLineOption(
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();
}
@@ -104,9 +115,15 @@ void CommandLineParser::configure() {
m_parser.addHelpOption();
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_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_parser.addOption(m_iniFileDirectoryOption);
@@ -177,6 +194,12 @@ void CommandLineParser::readSettings() {
if (key.contains("repository-url")) {
m_repositoryUrl = v.toString();
} 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")) {
m_plugInDir = v.toString();
} else
@@ -237,6 +260,21 @@ QString CommandLineParser::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() {
if (m_parser.isSet(m_pluginDirectoryOption)) {
m_plugInDir = m_parser.value(m_pluginDirectoryOption);

View File

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

View File

@@ -400,6 +400,12 @@ std::optional<QString> GitClient::gitPull() {
If remote host keys are changed, then
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
leads to the following warning/error message:

View File

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

View File

@@ -178,6 +178,9 @@ QString Utils::zoneName(quint8 i) {
//if (i < (sizeof(zName)/sizeof(char const *))) {
// return zName[i];
//}
Q_UNUSED(i)
return "---";
}