diff options
author | Iikka Eklund <iikka.eklund@qt.io> | 2024-03-27 12:51:59 +0200 |
---|---|---|
committer | Iikka Eklund <iikka.eklund@qt.io> | 2024-04-12 09:44:14 +0300 |
commit | 4da766b1e190537546a74450bca60df6420fb29d (patch) | |
tree | 53dca2f5ac36f9f7dfc56d1c62f7683f0c7277b2 | |
parent | a14565b8fcf130d0a04c410167b8291f31dea8cd (diff) |
Purge installations.ini file
The user may manually delete License Service installations
for on-demand launch. Also the user may manually edit (should not)
the installations file and leave it in inconsistent state.
Delete orphan/invalid registrations from the installations.ini
file. Check the presence of each License Service installation
in the config file and remove those sections which contained
invalid entries.
Perform the clean-up during the License Service shut down.
Pick-to: 3.0
Task-number: QLS-850
Change-Id: I1f65f72c2a745215cfa33098bc8476842675785a
Reviewed-by: Arttu Tarkiainen <arttu.tarkiainen@qt.io>
-rw-r--r-- | src/libs/qlicensecore/inifileparser.cpp | 3 | ||||
-rw-r--r-- | src/libs/qlicensecore/licdsetup.cpp | 22 | ||||
-rw-r--r-- | src/libs/qlicensecore/licdsetup.h | 3 | ||||
-rw-r--r-- | src/libs/qlicenseservice/licenser.cpp | 11 | ||||
-rw-r--r-- | tests/auto/licdsetup/CMakeLists.txt | 7 | ||||
-rw-r--r-- | tests/auto/licdsetup/qtlicd | 1 | ||||
-rw-r--r-- | tests/auto/licdsetup/testdata.h.in | 8 | ||||
-rw-r--r-- | tests/auto/licdsetup/tst_licdsetup.cpp | 36 |
8 files changed, 85 insertions, 6 deletions
diff --git a/src/libs/qlicensecore/inifileparser.cpp b/src/libs/qlicensecore/inifileparser.cpp index 035a707..fe4c699 100644 --- a/src/libs/qlicensecore/inifileparser.cpp +++ b/src/libs/qlicensecore/inifileparser.cpp @@ -1,4 +1,4 @@ -/* Copyright (C) 2023 The Qt Company Ltd. +/* Copyright (C) 2024 The Qt Company Ltd. * * SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 */ @@ -46,6 +46,7 @@ std::map<std::string, std::map<std::string, std::string>> IniFileParser::readSec if (isSection(line)) { currentSection = line.substr(1, line.size() - 2); + results[currentSection] = std::map<std::string, std::string>(); continue; } else { size_t separatorPos = line.find('='); diff --git a/src/libs/qlicensecore/licdsetup.cpp b/src/libs/qlicensecore/licdsetup.cpp index 69549a5..7c0d190 100644 --- a/src/libs/qlicensecore/licdsetup.cpp +++ b/src/libs/qlicensecore/licdsetup.cpp @@ -1,4 +1,4 @@ -/* Copyright (C) 2023 The Qt Company Ltd. +/* Copyright (C) 2024 The Qt Company Ltd. * * SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 */ @@ -15,6 +15,8 @@ #include <algorithm> #include <iostream> #include <sstream> +#include <fstream> + namespace QLicenseCore { @@ -344,6 +346,24 @@ void LicdSetup::unregisterInstallation() } +void LicdSetup::purgeInstallationsConfig(const std::string &path) +{ + if (!utils::fileExists(path)) + return; + + IniFileParser parser(path); + auto sections = parser.readSections(); + for (const auto §ion : sections) { + const std::string &foundPath = sections[section.first]["path"]; + if (!utils::fileExists(foundPath)) { + parser.removeSection(section.first); + logDebug("Purged non-existent service installation '%s' from: %s", + section.first.c_str(), path.c_str()); + } + } +} + + int LicdSetup::appendNewSection(const std::string &contentStr) { // Append new section in the file diff --git a/src/libs/qlicensecore/licdsetup.h b/src/libs/qlicensecore/licdsetup.h index b6a9bac..0406f53 100644 --- a/src/libs/qlicensecore/licdsetup.h +++ b/src/libs/qlicensecore/licdsetup.h @@ -1,4 +1,4 @@ -/* Copyright (C) 2023 The Qt Company Ltd. +/* Copyright (C) 2024 The Qt Company Ltd. * * SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 */ @@ -42,6 +42,7 @@ public: const std::string &version); static void registerInstallation(const std::string &installSource); static void unregisterInstallation(); + static void purgeInstallationsConfig(const std::string &path); private: std::string m_settingsFilePath; diff --git a/src/libs/qlicenseservice/licenser.cpp b/src/libs/qlicenseservice/licenser.cpp index 7c0b996..f87f3e5 100644 --- a/src/libs/qlicenseservice/licenser.cpp +++ b/src/libs/qlicenseservice/licenser.cpp @@ -1,4 +1,4 @@ -/* Copyright (C) 2023 The Qt Company Ltd. +/* Copyright (C) 2024 The Qt Company Ltd. * * SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 */ @@ -103,6 +103,15 @@ Licenser::Licenser(DaemonRunMode runMode, uint16_t tcpPort, const std::string &w Licenser::~Licenser() { + if (m_runMode == DaemonRunMode::OnDemand || m_runMode == DaemonRunMode::CLIMode) { + // Purge non-existent service installations from installations.ini for on-demand start. + // The user may have removed installations without unregistering the service installation(s) + // so let's try to keep the config file up-to-date. + const std::string installationsConfigPath = LicdSetup::getQtAppDataLocation() + + USER_SETTINGS_FOLDER_NAME + DIR_SEPARATOR + DAEMON_INSTALLATIONS_FILE; + LicdSetup::purgeInstallationsConfig(installationsConfigPath); + } + // Remove port number information utils::deleteFile(m_portFilePath); diff --git a/tests/auto/licdsetup/CMakeLists.txt b/tests/auto/licdsetup/CMakeLists.txt index 1d11269..4d16eba 100644 --- a/tests/auto/licdsetup/CMakeLists.txt +++ b/tests/auto/licdsetup/CMakeLists.txt @@ -1,9 +1,14 @@ -# Copyright (C) 2023 The Qt Company Ltd. +# Copyright (C) 2024 The Qt Company Ltd. # # SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 # +set(MOCK_QTLICD_PATH ${CMAKE_CURRENT_LIST_DIR}/qtlicd) +configure_file(testdata.h.in testdata.h) + add_executable(tst_licdsetup tst_licdsetup.cpp) target_link_libraries(tst_licdsetup PRIVATE Catch2 qlicensecore) add_test(NAME tst_licdsetup COMMAND tst_licdsetup) + +include_directories("${CMAKE_BINARY_DIR}/tests/auto/licdsetup") diff --git a/tests/auto/licdsetup/qtlicd b/tests/auto/licdsetup/qtlicd new file mode 100644 index 0000000..e99d382 --- /dev/null +++ b/tests/auto/licdsetup/qtlicd @@ -0,0 +1 @@ +mock executable diff --git a/tests/auto/licdsetup/testdata.h.in b/tests/auto/licdsetup/testdata.h.in new file mode 100644 index 0000000..d7d473b --- /dev/null +++ b/tests/auto/licdsetup/testdata.h.in @@ -0,0 +1,8 @@ +/* Copyright (C) 2024 The Qt Company Ltd. + * + * SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 +*/ + +#pragma once + +#cmakedefine MOCK_QTLICD_PATH "@MOCK_QTLICD_PATH@" diff --git a/tests/auto/licdsetup/tst_licdsetup.cpp b/tests/auto/licdsetup/tst_licdsetup.cpp index f0a278d..8bd45c3 100644 --- a/tests/auto/licdsetup/tst_licdsetup.cpp +++ b/tests/auto/licdsetup/tst_licdsetup.cpp @@ -1,4 +1,4 @@ -/* Copyright (C) 2023 The Qt Company Ltd. +/* Copyright (C) 2024 The Qt Company Ltd. * * SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 */ @@ -6,6 +6,8 @@ #define CATCH_CONFIG_MAIN #include <catch.hpp> +#include "testdata.h" + #include <string> #include <iostream> @@ -57,3 +59,35 @@ TEST_CASE("Read matching service installation from installations.ini", "[licdset } +TEST_CASE("Remove orphans from installations.ini", "[licdsetup]") +{ + INFO("TEST_INI_FILE: " << TEST_INI_FILE); + std::remove(TEST_INI_FILE); + + { + IniFileParser iniHandler(TEST_INI_FILE); + + iniHandler.writeKeyValue("path_1", { + {"path", "/home/foo/bar1/bin/qtlicd"}, + {"version", "3.1.0"} + }); + + iniHandler.writeKeyValue("path_2", { + {"path", MOCK_QTLICD_PATH}, + {"version", "3.0.1"} + }); + + iniHandler.writeKeyValue("path_3", { + {"path", "/home/foo/bar4/bin/qtlicd"}, + {"version", "3.2.0"} + }); + } + + LicdSetup::purgeInstallationsConfig(TEST_INI_FILE); + + IniFileParser iniHandler(TEST_INI_FILE); + REQUIRE(iniHandler.readSection("path_1").empty() == true); + REQUIRE(iniHandler.readSection("path_2").empty() == false); + REQUIRE(iniHandler.readSection("path_3").empty() == true); +} + |