diff options
author | Arttu Tarkiainen <arttu.tarkiainen@qt.io> | 2024-05-07 14:49:03 +0300 |
---|---|---|
committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2024-05-07 16:12:57 +0000 |
commit | 1fd7f5f1d71ca60610ccd739a9479871864303c0 (patch) | |
tree | 8ce7c019e3ff1a2186eba6525c4fac965fdb60aa | |
parent | ec80a59572352e07ed1086fcb3da06d4a99cec75 (diff) |
installations.ini: differentiate preview releases3.0
Add contextual --add-key-value option used in pair with --register,
which can be used for inserting additional key-value pairs to the
installations.ini section written when registering the installation.
The supported key-value pair at the moment is "preview=true", which
indicates a pre-release of the license service.
In the CIP side, when looking for matching service installation to
kick start, preview sections are preferred only if no same version
exists in a non-preview section.
Change-Id: I0dbc7c05dfeff81162e36cb5a13cf6f2682157c6
Reviewed-by: Arttu Tarkiainen <arttu.tarkiainen@qt.io>
(cherry picked from commit b8d173a7899ffeaa044ffed2cb9458a0ecdec5f4)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
(cherry picked from commit 69274e5f5f9cbeca5ae2065377a48e689fb8d140)
-rw-r--r-- | src/daemons/daemon.h | 36 | ||||
-rw-r--r-- | src/libs/qlicensecore/licdsetup.cpp | 30 | ||||
-rw-r--r-- | src/libs/qlicensecore/licdsetup.h | 3 | ||||
-rw-r--r-- | tests/auto/licdsetup/tst_licdsetup.cpp | 23 |
4 files changed, 81 insertions, 11 deletions
diff --git a/src/daemons/daemon.h b/src/daemons/daemon.h index a2bc26b..a3ba824 100644 --- a/src/daemons/daemon.h +++ b/src/daemons/daemon.h @@ -79,6 +79,8 @@ void printHelp() printf(" --register <source> : Registers itself in the 'installations.ini' file\n"); printf(" The <source> defines the entity calling this. E.g. 'installer'.\n"); printf(" --unregister : Unregister itself from the 'installations.ini' file\n"); + printf(" --add-key-value <key=value>\n"); + printf(" : Add additional key-value pair to the installations.ini on register\n"); printf(" --help : This help\n"); #ifdef _WIN32 printf(" --install : Installs the daemon executable as system service\n"); @@ -107,7 +109,8 @@ void printHelp() } -bool handleArgs(int argc, char *argv[], uint16_t& tcpPort, DaemonRunMode &daemonRunMode, std::string &workDir, std::string &message) { +bool handleArgs(int argc, char *argv[], uint16_t& tcpPort, DaemonRunMode &daemonRunMode, std::string &workDir, std::string &message) +{ // Parse env vars if (const char* logLevel = std::getenv("QTLICD_LOG_LEVEL")) { if (!parseLogLevel(logLevel, message)) { @@ -129,12 +132,39 @@ bool handleArgs(int argc, char *argv[], uint16_t& tcpPort, DaemonRunMode &daemon std::cout << "Build date: " << BUILD_DATE << std::endl; exit(EXIT_SUCCESS); } else if (arg == "--register") { + static const std::string sc_optionPrefix = "--"; + std::string installSource; - if (argc == i + 1) + if ((argc == i + 1) || std::string(argv[i + 1]).substr(0, sc_optionPrefix.size()) == sc_optionPrefix) installSource = "undefined"; else installSource = argv[i + 1]; - LicdSetup::registerInstallation(installSource); + + // Second iteration to find the contextual option + std::string valuesString; + for (int j = 1; j < argc; ++j) { + std::string arg = argv[j]; + if (arg == "--add-key-value" && (j + 1 < argc)) { + valuesString = argv[j + 1]; + break; + } + } + + std::map<std::string, std::string> keyValues; + if (!valuesString.empty()) { + std::istringstream iss(valuesString); + std::string pair; + + while (std::getline(iss, pair, ',')) { + std::istringstream pairIss(pair); + std::string key; + std::string value; + if (std::getline(pairIss, key, '=') && std::getline(pairIss, value)) + keyValues[key] = value; + } + } + + LicdSetup::registerInstallation(installSource, keyValues); exit(EXIT_SUCCESS); } else if (arg == "--unregister") { LicdSetup::unregisterInstallation(); diff --git a/src/libs/qlicensecore/licdsetup.cpp b/src/libs/qlicensecore/licdsetup.cpp index eeda7f7..331d071 100644 --- a/src/libs/qlicensecore/licdsetup.cpp +++ b/src/libs/qlicensecore/licdsetup.cpp @@ -289,9 +289,11 @@ std::string LicdSetup::parseMatchingServiceInstallation(const std::string &confi return ""; } std::map<std::string, std::string> suitableMatches; + std::map<std::string, std::string> suitablePreviewMatches; for (const auto §ion : sections) { const std::string &foundVersion = sections[section.first]["version"]; const std::string &foundPath = sections[section.first]["path"]; + const std::string &foundPreview = sections[section.first]["preview"]; if (foundVersion.empty()) { logDebug("Misconfiguration in '%s'. Version not found for: %s", configPath.c_str(), foundPath.c_str()); @@ -304,9 +306,15 @@ std::string LicdSetup::parseMatchingServiceInstallation(const std::string &confi } // we can replace existing match if the version number matches as if the versions match // then they should be identical - suitableMatches[foundVersion] = foundPath; + if (foundPreview == "true") + suitablePreviewMatches[foundVersion] = foundPath; + else + suitableMatches[foundVersion] = foundPath; } + // Insert preview elements, if the container doesn't already contain the same version key + suitableMatches.insert(suitablePreviewMatches.begin(), suitablePreviewMatches.end()); + if (!suitableMatches.empty()) { auto bestMatch = *suitableMatches.rbegin(); const std::string foundVersion = bestMatch.first; @@ -322,7 +330,8 @@ std::string LicdSetup::parseMatchingServiceInstallation(const std::string &confi } -void LicdSetup::registerInstallation(const std::string &installSource) +void LicdSetup::registerInstallation(const std::string &installSource, + const std::map<std::string, std::string> &keyValues) { const std::string installationsFile = LicdSetup::getQtAppDataLocation() + USER_SETTINGS_FOLDER_NAME + DIR_SEPARATOR @@ -330,12 +339,19 @@ void LicdSetup::registerInstallation(const std::string &installSource) const std::string currentTime = utils::localTimeToString(utils::localTime()); const std::string programPath = utils::getProgramPath(); const std::string formattedProgramPath = utils::replaceCharacters(programPath, ":/\\", '_'); + + std::map<std::string, std::string> installationContent = { + { "path", programPath }, + { "source", installSource }, + { "version", DAEMON_VERSION }, + { "timestamp", currentTime } + }; + + if (!keyValues.empty()) + installationContent.insert(keyValues.begin(), keyValues.end()); + IniFileParser parser(installationsFile); - if (parser.writeKeyValue(formattedProgramPath, - { { "path", programPath }, - { "source", installSource }, - { "version", DAEMON_VERSION }, - { "timestamp", currentTime } })) { + if (parser.writeKeyValue(formattedProgramPath, installationContent)) { logInfo("%s registered into: %s by: %s", programPath.c_str(), installationsFile.c_str(), installSource.c_str()); } else { diff --git a/src/libs/qlicensecore/licdsetup.h b/src/libs/qlicensecore/licdsetup.h index 0406f53..88ef9e4 100644 --- a/src/libs/qlicensecore/licdsetup.h +++ b/src/libs/qlicensecore/licdsetup.h @@ -40,7 +40,8 @@ public: static std::string getMatchingServiceInstallation(const std::string &version); static std::string parseMatchingServiceInstallation(const std::string &configPath, const std::string &version); - static void registerInstallation(const std::string &installSource); + static void registerInstallation(const std::string &installSource, + const std::map<std::string, std::string> &keyValues); static void unregisterInstallation(); static void purgeInstallationsConfig(const std::string &path); diff --git a/tests/auto/licdsetup/tst_licdsetup.cpp b/tests/auto/licdsetup/tst_licdsetup.cpp index b8100c3..463df48 100644 --- a/tests/auto/licdsetup/tst_licdsetup.cpp +++ b/tests/auto/licdsetup/tst_licdsetup.cpp @@ -37,6 +37,17 @@ TEST_CASE("Read matching service installation from installations.ini", "[licdset })); REQUIRE( + iniHandler.writeKeyValue("_home_foo_bar6_bin_qtlicd", { + {"path", "/home/foo/bar6/bin/qtlicd"}, + {"version", "3.1.0"}, + {"preview", "true"} + })); + + // Test non-preview is preferred when same version is available + REQUIRE(LicdSetup::parseMatchingServiceInstallation(TEST_INI_FILE, "3.1.0") + == "/home/foo/bar1/bin/qtlicd"); + + REQUIRE( iniHandler.writeKeyValue("_home_foo_bar4_bin_qtlicd", { {"path", "/home/foo/bar4/bin/qtlicd"}, {"version", "3.2.0"} @@ -59,6 +70,18 @@ TEST_CASE("Read matching service installation from installations.ini", "[licdset REQUIRE(LicdSetup::parseMatchingServiceInstallation(TEST_INI_FILE, "2.2.0") == "/home/foo/bar3/bin/qtlicd"); + + REQUIRE( + iniHandler.writeKeyValue("_home_foo_bar7_bin_qtlicd", { + {"path", "/home/foo/bar7/bin/qtlicd"}, + {"version", "4.2.0"}, + {"preview", "true"} + })); + + // Test preview is preferred when greater version is available + REQUIRE(LicdSetup::parseMatchingServiceInstallation(TEST_INI_FILE, "4.1.0") + == "/home/foo/bar7/bin/qtlicd"); + REQUIRE(LicdSetup::parseMatchingServiceInstallation(TEST_INI_FILE, "5.2.0") == ""); } |