From d0152079aed43a551b158da0e08801d35036d62e Mon Sep 17 00:00:00 2001 From: DSiekmeier Date: Mon, 6 Nov 2023 10:01:35 +0100 Subject: [PATCH] (wip) feature: add diagnostic data to --version flag --- CMakeLists.txt | 1 + src/cli.cc | 18 ++++++++++++++++- src/sysinfoaggregator.cc | 42 ++++++++++++++++++++++++++++++++++++++++ src/sysinfoaggregator.h | 37 +++++++++++++++++++++++++++++++++++ 4 files changed, 97 insertions(+), 1 deletion(-) create mode 100644 src/sysinfoaggregator.cc create mode 100644 src/sysinfoaggregator.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 508b2e4..885daea 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -40,6 +40,7 @@ add_library(${PROJECT_NAME}-lib OBJECT src/details.cc src/library.cc src/statistics.cc + src/sysinfoaggregator.cc src/utilities.cc ) diff --git a/src/cli.cc b/src/cli.cc index 40758af..6c8d68c 100644 --- a/src/cli.cc +++ b/src/cli.cc @@ -1,4 +1,5 @@ #include "cli.h" +#include "sysinfoaggregator.h" using namespace booktrack_cli; @@ -10,7 +11,22 @@ void AddMainOptions(CLI::App& app, CliOptions& opt) { version_string << BOOKTRACK_CLI_VERSION_MAJOR << "." << BOOKTRACK_CLI_VERSION_MINOR << "." << BOOKTRACK_CLI_VERSION_PATCH; - return "booktrack-cli v" + version_string.str(); + const auto booktrack_version = + "booktrack-cli v" + version_string.str() + '\n'; + + SysInfo system_information{"", ""}; + try { + SysInfoAggregator sysinfo("/etc/os-release"); + system_information = sysinfo.GetSysInfo(); + } catch (const std::runtime_error& ex) { + std::cout << ex.what() << '\n'; + } + const auto os_release_name = + "OS name : " + system_information.os_release_name + '\n'; + const auto os_release_version = + "OS version: " + system_information.os_release_version + '\n'; + + return booktrack_version + '\n' + os_release_name + os_release_version; }); app.add_option("-l,--library,", opt.library_file_path, diff --git a/src/sysinfoaggregator.cc b/src/sysinfoaggregator.cc new file mode 100644 index 0000000..f721f2f --- /dev/null +++ b/src/sysinfoaggregator.cc @@ -0,0 +1,42 @@ +#include +#include + +#include "sysinfoaggregator.h" +using namespace booktrack_cli; + +SysInfo SysInfoAggregator::GetSysInfo() { + SysInfo value; + std::ifstream input_file{"/etc/os-release"}; + + if (input_file.good()) { + std::string line; + while (getline(input_file, line)) { + auto splitted = split_entries(line); + if (splitted[0] == "NAME") { + value.os_release_name = splitted[1]; + } + if (splitted[0] == "VERSION") { + value.os_release_version = splitted[1]; + } + } + input_file.close(); + } else { + throw std::runtime_error("Could not open file."); + } + + return value; +} + +std::vector SysInfoAggregator::split_entries( + const std::string& s) { + std::vector result; + std::string::size_type start{0}; + std::string::size_type position; + do { + position = s.find_first_of("=", start); + result.push_back(s.substr(start, position - start)); + start = position + 1; + } while (position != std::string::npos); + + return result; +} diff --git a/src/sysinfoaggregator.h b/src/sysinfoaggregator.h new file mode 100644 index 0000000..71a710a --- /dev/null +++ b/src/sysinfoaggregator.h @@ -0,0 +1,37 @@ +#ifndef BOOKTRACK_CLI_SYSINFOAGGREGATOR_H +#define BOOKTRACK_CLI_SYSINFOAGGREGATOR_H + +#include +#include +#include + +namespace fs = std::filesystem; + +namespace booktrack_cli { + +struct SysInfo { + std::string os_release_name; + std::string os_release_version; +}; + +class SysInfoAggregator { + public: + explicit SysInfoAggregator(fs::path release_file) + : release_file_{release_file} {}; + + /** + * @brief Get the Sys Info object + * + * @return SysInfo + * @throws std::runtime_error + */ + SysInfo GetSysInfo(); + + private: + std::vector split_entries(const std::string& s); + + fs::path release_file_; +}; +} // namespace booktrack_cli + +#endif