From 37ca32f874cb458d7f4cb892ef59370bf3782489 Mon Sep 17 00:00:00 2001 From: "K. Isom" Date: Sun, 4 Feb 2024 07:00:46 +0000 Subject: [PATCH] adding support for RPMs --- CMakeLists.txt | 6 +- cmake/packaging.cmake | 2 +- include/RPM.h | 33 ++++++++++ install-development-tools.sh | 2 +- src/RPM.cc | 117 +++++++++++++++++++++++++++++++++++ src/packager.cc | 2 + 6 files changed, 158 insertions(+), 4 deletions(-) create mode 100644 include/RPM.h create mode 100644 src/RPM.cc diff --git a/CMakeLists.txt b/CMakeLists.txt index ea84b81..b9bcb2e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -46,13 +46,15 @@ add_compile_definitions(SCSL_DESKTOP_BUILD) set(HEADERS include/Debian.h - include/Utility.h + include/RPM.h include/Generic.h + include/Utility.h ) set(SOURCES src/Debian.cc - src/Utility.cc + src/RPM.cc src/Generic.cc + src/Utility.cc ) file(GLOB SCRIPTS *.sh) diff --git a/cmake/packaging.cmake b/cmake/packaging.cmake index 5b20442..66b4f86 100644 --- a/cmake/packaging.cmake +++ b/cmake/packaging.cmake @@ -21,7 +21,7 @@ set(CPACK_DEBIAN_PACKAGE_GENERATE_SHLIBS ON) set(CPACK_DEBIAN_FILE_NAME DEB-DEFAULT) if (LINUX) - set(CPACK_GENERATOR "DEB;STGZ;TGZ") + set(CPACK_GENERATOR "DEB;RPM;STGZ;TGZ") elseif (APPLE) set(CPACK_GENERATOR "productbuild") elseif (MSVC OR MSYS OR MINGW) diff --git a/include/RPM.h b/include/RPM.h new file mode 100644 index 0000000..8e21f8e --- /dev/null +++ b/include/RPM.h @@ -0,0 +1,33 @@ +/// +/// \file RPM.h +/// \author K. Isom +/// \date 2024-02-03 +/// \brief Functionality for interacting with RPM packages on Gitea. +/// Copyright 2024 K. Isom +/// +/// Permission to use, copy, modify, and/or distribute this software for +/// any purpose with or without fee is hereby granted, provided that +/// the above copyright notice and this permission notice appear in all /// copies. +/// +/// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL +/// WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED +/// WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE +/// AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL +/// DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA +/// OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +/// TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +/// PERFORMANCE OF THIS SOFTWARE. +/// + +#ifndef SC3DEV_RPM_H +#define SC3DEV_RPM_H + + +#include +#include + + +bool rpmPackager(std::vector args); + + +#endif// SC3DEV_RPM_H diff --git a/install-development-tools.sh b/install-development-tools.sh index e69f28b..207fc35 100755 --- a/install-development-tools.sh +++ b/install-development-tools.sh @@ -86,7 +86,7 @@ install_redhat () { $DNF_INSTALL ca-certificates gzip openssh tar \ clang clang-tools-extra cmake cppcheck doxygen \ gcc-c++ git graphviz libstdc++-devel make scdoc \ - valgrind + valgrind fedora-packager rpmdevtools } install_unsupported () { diff --git a/src/RPM.cc b/src/RPM.cc new file mode 100644 index 0000000..1be49b8 --- /dev/null +++ b/src/RPM.cc @@ -0,0 +1,117 @@ +/// +/// \file RPM.cc +/// \author K. Isom +/// \date 2024-02-03 +/// \brief Functionality for interacting with RPM packages on Gitea. +/// +/// Copyright 2024 K. Isom +/// +/// Permission to use, copy, modify, and/or distribute this software for +/// any purpose with or without fee is hereby granted, provided that +/// the above copyright notice and this permission notice appear in all /// copies. +/// +/// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL +/// WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED +/// WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE +/// AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL +/// DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA +/// OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +/// TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +/// PERFORMANCE OF THIS SOFTWARE. +/// + +#include +#include +#include +#include +#include + +#include +#include +#include + +#include "RPM.h" +#include "Utility.h" + + +namespace { +std::string +rpmEndpoint(std::string endpoint) +{ + if (!endpoint.empty() && endpoint.at(0) != '/') { + endpoint.insert(endpoint.cbegin(), '/'); + } + + auto urlBase = "https://" + scsl::SimpleConfig::GetGlobal("server"); + return urlBase + "/api/packages/" + + scsl::SimpleConfig::GetGlobal("owner", defaultOwner) + + "/rpm/" + endpoint; +} + + +std::string +endpointForPackage(std::string package) +{ + const std::filesystem::path pkgAsPath(package); + + auto stem = pkgAsPath.stem(); + auto parts = scsl::scstring::SplitN(stem, "_", 3); + if (parts.size() != 3) { + return ""; + } + return parts[0] + "/" + parts[1] + "/" + parts[2]; +} + + +bool +putRPM(std::vector args) +{ + auto ok = true; + for (auto &arg: args) { + auto url = rpmEndpoint("upload"); + auto result = PutFile(url, arg); + std::cout << "\t[*] PUT " << std::filesystem::path(arg).filename() << ": "; + std::cout << ResultToString(result) << "\n"; + ok &= ResultSuccess(result); + } + + return ok; +} + + +bool +deleteRPM(std::vector args) +{ + auto ok = true; + + for (auto &arg: args) { + auto endpoint = endpointForPackage(arg); + if (endpoint.empty()) { + std::cerr << arg << ": invalid filename\n"; + ok &= false; + continue; + } + auto url = rpmEndpoint(endpoint); + std::cerr << "URL: " << url << "\n"; + auto result = DeleteFile(url); + std::cout << "\t[*] DELETE " << std::filesystem::path(arg).filename() << ": "; + std::cout << ResultToString(result) << "\n"; + ok &= ResultSuccess(result); + } + + return ok; +} +}// anonymous namespace + + +bool +rpmPackager(std::vector args) +{ + scsl::Commander commander; + commander.Register(scsl::Subcommand("del", 1, deleteRPM)); + commander.Register(scsl::Subcommand("put", 1, putRPM)); + + auto command = args[0]; + args.erase(args.cbegin()); + return commander.Run(command, args) == scsl::Subcommand::Status::OK; +} diff --git a/src/packager.cc b/src/packager.cc index 302bb04..3b37af1 100644 --- a/src/packager.cc +++ b/src/packager.cc @@ -30,6 +30,7 @@ #include "Debian.h" #include "Generic.h" +#include "RPM.h" #include "Utility.h" @@ -105,6 +106,7 @@ main(int argc, char *argv[]) scsl::Commander commander; commander.Register(scsl::Subcommand("debian", 2, debianPackager)); commander.Register(scsl::Subcommand("generic", 2, genericPackager)); + commander.Register(scsl::Subcommand("rpm", 2, rpmPackager)); flags->GetString("--config", configFile); if (std::filesystem::exists(std::filesystem::path(configFile))) {