From 8c0bbe05eefce99ef545d42da80d9c4333a82d10 Mon Sep 17 00:00:00 2001 From: "Scott E. Graves" Date: Mon, 28 Jul 2025 08:01:38 -0500 Subject: [PATCH] Remove 'default' as initial bucket name for Sia #54 --- .../librepertory/include/types/repertory.hpp | 3 +- repertory/repertory/include/cli/ui.hpp | 58 ----- repertory/repertory/main.cpp | 220 ++++++++++-------- 3 files changed, 124 insertions(+), 157 deletions(-) delete mode 100644 repertory/repertory/include/cli/ui.hpp diff --git a/repertory/librepertory/include/types/repertory.hpp b/repertory/librepertory/include/types/repertory.hpp index 9e59cad3..a1cc93f0 100644 --- a/repertory/librepertory/include/types/repertory.hpp +++ b/repertory/librepertory/include/types/repertory.hpp @@ -286,7 +286,8 @@ enum class exit_code : std::int32_t { init_failed = -18, ui_mount_failed = -19, exception = -20, - provider_offline = -21 + provider_offline = -21, + ui_failed = -22 }; enum http_error_codes : std::int32_t { diff --git a/repertory/repertory/include/cli/ui.hpp b/repertory/repertory/include/cli/ui.hpp deleted file mode 100644 index 1cbfa1e2..00000000 --- a/repertory/repertory/include/cli/ui.hpp +++ /dev/null @@ -1,58 +0,0 @@ -/* - Copyright <2018-2025> - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE. -*/ -#ifndef REPERTORY_INCLUDE_CLI_UI_HPP_ -#define REPERTORY_INCLUDE_CLI_UI_HPP_ - -#include "cli/common.hpp" -#include "ui/handlers.hpp" -#include "ui/mgmt_app_config.hpp" - -namespace repertory::cli::actions { -[[nodiscard]] inline auto -ui(std::vector args, const std::string & /*data_directory*/, - const provider_type & /* prov */, const std::string & /* unique_id */, - std::string /* user */, std::string /* password */) -> exit_code { - - ui::mgmt_app_config config{}; - - std::string data; - auto res = utils::cli::parse_string_option( - args, utils::cli::options::ui_port_option, data); - if (res == exit_code::success && not data.empty()) { - config.set_api_port(utils::string::to_uint16(data)); - } - - if (not utils::file::change_to_process_directory()) { - return exit_code::ui_mount_failed; - } - - httplib::Server server; - if (not server.set_mount_point("/ui", "./web")) { - return exit_code::ui_mount_failed; - } - - ui::handlers handlers(&config, &server); - return exit_code::success; -} -} // namespace repertory::cli::actions - -#endif // REPERTORY_INCLUDE_CLI_UI_HPP_ diff --git a/repertory/repertory/main.cpp b/repertory/repertory/main.cpp index 1794b289..996f0727 100644 --- a/repertory/repertory/main.cpp +++ b/repertory/repertory/main.cpp @@ -26,6 +26,8 @@ #include "cli/actions.hpp" #include "initialize.hpp" #include "types/repertory.hpp" +#include "ui/handlers.hpp" +#include "ui/mgmt_app_config.hpp" #include "utils/cli_utils.hpp" #include "utils/polling.hpp" @@ -51,121 +53,143 @@ auto main(int argc, char **argv) -> int { args.push_back("-h"); } - auto prov = utils::cli::get_provider_type_from_args(args); + int ret{0}; + if (utils::cli::has_option(args, utils::cli::options::ui_option)) { + ui::mgmt_app_config config{}; - std::string data_directory; - auto res = utils::cli::parse_string_option( - args, utils::cli::options::data_directory_option, data_directory); + std::string data; + auto res = utils::cli::parse_string_option( + args, utils::cli::options::ui_port_option, data); + if (res == exit_code::success && not data.empty()) { + config.set_api_port(utils::string::to_uint16(data)); + } - std::string password; - res = (res == exit_code::success) - ? utils::cli::parse_string_option( - args, utils::cli::options::password_option, password) - : res; + if (not utils::file::change_to_process_directory()) { + ret = static_cast(exit_code::ui_failed); + } else { + httplib::Server server; + if (not server.set_mount_point("/ui", "./web")) { + ret = static_cast(exit_code::ui_failed); + } else { + ui::handlers handlers(&config, &server); + } + } + } else { + auto prov = utils::cli::get_provider_type_from_args(args); - std::string user; - res = (res == exit_code::success) - ? utils::cli::parse_string_option( - args, utils::cli::options::user_option, user) - : res; + std::string data_directory; + auto res = utils::cli::parse_string_option( + args, utils::cli::options::data_directory_option, data_directory); - std::string remote_host; - std::uint16_t remote_port{}; - std::string unique_id; - if (res == exit_code::success) { - if (prov == provider_type::remote) { - std::string data; - res = utils::cli::parse_string_option( - args, utils::cli::options::remote_mount_option, data); - if (res == exit_code::success) { - const auto parts = utils::string::split(data, ':', false); - if (parts.size() != 2) { - std::cerr << "Invalid syntax for host/port '-rm " - "host:port,--remote_mount host:port'" - << std::endl; - res = exit_code::invalid_syntax; - } else { - unique_id = parts.at(0U) + ':' + parts.at(1U); - remote_host = parts.at(0U); - try { - remote_port = utils::string::to_uint16(parts.at(1U)); - data_directory = - data_directory.empty() - ? utils::path::combine( - app_config::default_data_directory(prov), - { - utils::string::replace_copy(unique_id, ':', '_'), - }) - : utils::path::absolute(data_directory); - } catch (const std::exception &e) { - std::cerr << (e.what() == nullptr ? "Unable to parse port" - : e.what()) + std::string password; + res = (res == exit_code::success) + ? utils::cli::parse_string_option( + args, utils::cli::options::password_option, password) + : res; + + std::string user; + res = (res == exit_code::success) + ? utils::cli::parse_string_option( + args, utils::cli::options::user_option, user) + : res; + + std::string remote_host; + std::uint16_t remote_port{}; + std::string unique_id; + if (res == exit_code::success) { + if (prov == provider_type::remote) { + std::string data; + res = utils::cli::parse_string_option( + args, utils::cli::options::remote_mount_option, data); + if (res == exit_code::success) { + const auto parts = utils::string::split(data, ':', false); + if (parts.size() != 2) { + std::cerr << "Invalid syntax for host/port '-rm " + "host:port,--remote_mount host:port'" << std::endl; res = exit_code::invalid_syntax; + } else { + unique_id = parts.at(0U) + ':' + parts.at(1U); + remote_host = parts.at(0U); + try { + remote_port = utils::string::to_uint16(parts.at(1U)); + data_directory = + data_directory.empty() + ? utils::path::combine( + app_config::default_data_directory(prov), + { + utils::string::replace_copy(unique_id, ':', + '_'), + }) + : utils::path::absolute(data_directory); + } catch (const std::exception &e) { + std::cerr << (e.what() == nullptr ? "Unable to parse port" + : e.what()) + << std::endl; + res = exit_code::invalid_syntax; + } + } + } + } else if ((prov == provider_type::s3) || (prov == provider_type::sia) || + (prov == provider_type::encrypt)) { + std::string data; + res = utils::cli::parse_string_option( + args, utils::cli::options::name_option, data); + if (res == exit_code::success) { + unique_id = utils::string::trim(data); + if (unique_id.empty()) { + std::cerr << "Configuration name for '" + << app_config::get_provider_display_name(prov) + << "' was not provided" << std::endl; + res = exit_code::invalid_syntax; } } - } - } else if ((prov == provider_type::s3) || (prov == provider_type::sia) || - (prov == provider_type::encrypt)) { - std::string data; - res = utils::cli::parse_string_option( - args, utils::cli::options::name_option, data); - if (res == exit_code::success) { - unique_id = utils::string::trim(data); - if (unique_id.empty()) { - std::cerr << "Configuration name for '" - << app_config::get_provider_display_name(prov) - << "' was not provided" << std::endl; - res = exit_code::invalid_syntax; + + if (res == exit_code::success) { + data_directory = + data_directory.empty() + ? utils::path::combine( + app_config::default_data_directory(prov), {unique_id}) + : utils::path::absolute(data_directory); } } - - if (res == exit_code::success) { - data_directory = - data_directory.empty() - ? utils::path::combine(app_config::default_data_directory(prov), - {unique_id}) - : utils::path::absolute(data_directory); - } } - } - int mount_result{}; - if (res == exit_code::success) { - if (utils::cli::has_option(args, utils::cli::options::help_option)) { - cli::actions::help(args); - } else if (utils::cli::has_option(args, - utils::cli::options::version_option)) { - cli::actions::version(args); - } else { - res = exit_code::option_not_found; - for (std::size_t idx = 0U; - (res == exit_code::option_not_found) && - (idx < utils::cli::options::option_list.size()); - idx++) { - try { - res = cli::actions::perform_action( - utils::cli::options::option_list[idx], args, data_directory, prov, - unique_id, user, password); - } catch (const std::exception &ex) { - res = exit_code::exception; - } catch (...) { - res = exit_code::exception; + int mount_result{}; + if (res == exit_code::success) { + if (utils::cli::has_option(args, utils::cli::options::help_option)) { + cli::actions::help(args); + } else if (utils::cli::has_option(args, + utils::cli::options::version_option)) { + cli::actions::version(args); + } else { + res = exit_code::option_not_found; + for (std::size_t idx = 0U; + (res == exit_code::option_not_found) && + (idx < utils::cli::options::option_list.size()); + idx++) { + try { + res = cli::actions::perform_action( + utils::cli::options::option_list[idx], args, data_directory, + prov, unique_id, user, password); + } catch (const std::exception &ex) { + res = exit_code::exception; + } catch (...) { + res = exit_code::exception; + } + } + + if (res == exit_code::option_not_found) { + res = cli::actions::mount(args, data_directory, mount_result, prov, + remote_host, remote_port, unique_id); } } - - if (res == exit_code::option_not_found) { - res = cli::actions::mount(args, data_directory, mount_result, prov, - remote_host, remote_port, unique_id); - } } - } - auto ret = - ((res == exit_code::mount_result) ? mount_result - : static_cast(res)); + ret = ((res == exit_code::mount_result) ? mount_result + : static_cast(res)); + } repertory::project_cleanup(); - return ret; }