v2.0.5-rc (#41)
	
		
			
	
		
	
	
		
	
		
			All checks were successful
		
		
	
	
		
			
				
	
				BlockStorage/repertory/pipeline/head This commit looks good
				
			
		
		
	
	
				
					
				
			
		
			All checks were successful
		
		
	
	BlockStorage/repertory/pipeline/head This commit looks good
				
			Reviewed-on: #41
This commit is contained in:
		@@ -43,8 +43,7 @@ public:
 | 
			
		||||
  [[nodiscard]] static auto default_remote_api_port(const provider_type &prov)
 | 
			
		||||
      -> std::uint16_t;
 | 
			
		||||
 | 
			
		||||
  [[nodiscard]] static auto default_rpc_port(const provider_type &prov)
 | 
			
		||||
      -> std::uint16_t;
 | 
			
		||||
  [[nodiscard]] static auto default_rpc_port() -> std::uint16_t;
 | 
			
		||||
 | 
			
		||||
  [[nodiscard]] static auto get_provider_display_name(const provider_type &prov)
 | 
			
		||||
      -> std::string;
 | 
			
		||||
@@ -52,6 +51,8 @@ public:
 | 
			
		||||
  [[nodiscard]] static auto get_provider_name(const provider_type &prov)
 | 
			
		||||
      -> std::string;
 | 
			
		||||
 | 
			
		||||
  [[nodiscard]] static auto get_root_data_directory() -> std::string;
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
  [[nodiscard]] static auto get_stop_requested() -> bool;
 | 
			
		||||
 | 
			
		||||
@@ -71,7 +72,7 @@ public:
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
  provider_type prov_;
 | 
			
		||||
  atomic<std::string> api_auth_;
 | 
			
		||||
  atomic<std::string> api_password_;
 | 
			
		||||
  std::atomic<std::uint16_t> api_port_;
 | 
			
		||||
  atomic<std::string> api_user_;
 | 
			
		||||
  std::atomic<bool> config_changed_;
 | 
			
		||||
@@ -121,7 +122,7 @@ private:
 | 
			
		||||
  auto set_value(dest &dst, const source &src) -> bool;
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
  [[nodiscard]] auto get_api_auth() const -> std::string;
 | 
			
		||||
  [[nodiscard]] auto get_api_password() const -> std::string;
 | 
			
		||||
 | 
			
		||||
  [[nodiscard]] auto get_api_port() const -> std::uint16_t;
 | 
			
		||||
 | 
			
		||||
@@ -199,7 +200,7 @@ public:
 | 
			
		||||
 | 
			
		||||
  void save();
 | 
			
		||||
 | 
			
		||||
  void set_api_auth(const std::string &value);
 | 
			
		||||
  void set_api_password(const std::string &value);
 | 
			
		||||
 | 
			
		||||
  void set_api_port(std::uint16_t value);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -57,7 +57,7 @@ using json = nlohmann::json;
 | 
			
		||||
inline constexpr const std::string_view REPERTORY = "repertory";
 | 
			
		||||
inline constexpr const std::wstring_view REPERTORY_W = L"repertory";
 | 
			
		||||
 | 
			
		||||
inline constexpr const std::uint64_t REPERTORY_CONFIG_VERSION = 1ULL;
 | 
			
		||||
inline constexpr const std::uint64_t REPERTORY_CONFIG_VERSION = 2ULL;
 | 
			
		||||
inline constexpr const std::string_view REPERTORY_DATA_NAME = "repertory2";
 | 
			
		||||
inline constexpr const std::string_view REPERTORY_MIN_REMOTE_VERSION = "2.0.0";
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -22,6 +22,13 @@
 | 
			
		||||
#ifndef REPERTORY_INCLUDE_PLATFORM_PLATFORM_HPP_
 | 
			
		||||
#define REPERTORY_INCLUDE_PLATFORM_PLATFORM_HPP_
 | 
			
		||||
 | 
			
		||||
#include "types/repertory.hpp"
 | 
			
		||||
 | 
			
		||||
namespace repertory {
 | 
			
		||||
[[nodiscard]] auto create_lock_id(provider_type prov,
 | 
			
		||||
                                  std::string_view unique_id)->std::string;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#if defined(_WIN32)
 | 
			
		||||
#include "platform/win32_platform.hpp"
 | 
			
		||||
#include "utils/windows.hpp"
 | 
			
		||||
 
 | 
			
		||||
@@ -30,38 +30,45 @@ class i_provider;
 | 
			
		||||
 | 
			
		||||
class lock_data final {
 | 
			
		||||
public:
 | 
			
		||||
  explicit lock_data(const provider_type &pt, std::string unique_id /*= ""*/);
 | 
			
		||||
  lock_data(provider_type prov, std::string_view unique_id);
 | 
			
		||||
 | 
			
		||||
  lock_data();
 | 
			
		||||
  lock_data(const lock_data &) = delete;
 | 
			
		||||
  lock_data(lock_data &&) = delete;
 | 
			
		||||
 | 
			
		||||
  auto operator=(const lock_data &) -> lock_data & = delete;
 | 
			
		||||
  auto operator=(lock_data &&) -> lock_data & = delete;
 | 
			
		||||
 | 
			
		||||
  ~lock_data();
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
  const provider_type pt_;
 | 
			
		||||
  const std::string unique_id_;
 | 
			
		||||
  const std::string mutex_id_;
 | 
			
		||||
  int lock_fd_;
 | 
			
		||||
  int lock_status_ = EWOULDBLOCK;
 | 
			
		||||
  std::string mutex_id_;
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
  int handle_{};
 | 
			
		||||
  int lock_status_{EWOULDBLOCK};
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
  [[nodiscard]] static auto get_state_directory() -> std::string;
 | 
			
		||||
 | 
			
		||||
  [[nodiscard]] static auto get_lock_data_file() -> std::string;
 | 
			
		||||
  [[nodiscard]] auto get_lock_data_file() const -> std::string;
 | 
			
		||||
 | 
			
		||||
  [[nodiscard]] auto get_lock_file() -> std::string;
 | 
			
		||||
  [[nodiscard]] auto get_lock_file() const -> std::string;
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
  [[nodiscard]] static auto
 | 
			
		||||
  wait_for_lock(int fd, std::uint8_t retry_count = 30u) -> int;
 | 
			
		||||
  [[nodiscard]] static auto wait_for_lock(int handle,
 | 
			
		||||
                                          std::uint8_t retry_count = 30U)
 | 
			
		||||
      -> int;
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
  [[nodiscard]] auto get_mount_state(json &mount_state) -> bool;
 | 
			
		||||
 | 
			
		||||
  [[nodiscard]] auto grab_lock(std::uint8_t retry_count = 30u) -> lock_result;
 | 
			
		||||
  [[nodiscard]] auto grab_lock(std::uint8_t retry_count = 30U) -> lock_result;
 | 
			
		||||
 | 
			
		||||
  void release();
 | 
			
		||||
 | 
			
		||||
  [[nodiscard]] auto set_mount_state(bool active,
 | 
			
		||||
                                     const std::string &mount_location,
 | 
			
		||||
                                     int pid) -> bool;
 | 
			
		||||
                                     std::string_view mount_location, int pid)
 | 
			
		||||
      -> bool;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
[[nodiscard]] auto create_meta_attributes(
 | 
			
		||||
@@ -76,5 +83,5 @@ public:
 | 
			
		||||
                                         const api_file &file) -> api_error;
 | 
			
		||||
} // namespace repertory
 | 
			
		||||
 | 
			
		||||
#endif // _WIN32
 | 
			
		||||
#endif // !defined(_WIN32)
 | 
			
		||||
#endif // REPERTORY_INCLUDE_PLATFORM_UNIXPLATFORM_HPP_
 | 
			
		||||
 
 | 
			
		||||
@@ -23,7 +23,6 @@
 | 
			
		||||
#define REPERTORY_INCLUDE_PLATFORM_WINPLATFORM_HPP_
 | 
			
		||||
#if defined(_WIN32)
 | 
			
		||||
 | 
			
		||||
#include "app_config.hpp"
 | 
			
		||||
#include "types/repertory.hpp"
 | 
			
		||||
 | 
			
		||||
namespace repertory {
 | 
			
		||||
@@ -31,43 +30,32 @@ class i_provider;
 | 
			
		||||
 | 
			
		||||
class lock_data final {
 | 
			
		||||
public:
 | 
			
		||||
  explicit lock_data(const provider_type &pt, std::string unique_id /*= ""*/)
 | 
			
		||||
      : pt_(pt),
 | 
			
		||||
        unique_id_(std::move(unique_id)),
 | 
			
		||||
        mutex_id_("repertory_" + app_config::get_provider_name(pt) + "_" +
 | 
			
		||||
                  unique_id_),
 | 
			
		||||
        mutex_handle_(::CreateMutex(nullptr, FALSE, &mutex_id_[0u])) {}
 | 
			
		||||
  explicit lock_data(provider_type prov, std::string unique_id);
 | 
			
		||||
  lock_data(const lock_data &) = delete;
 | 
			
		||||
  lock_data(lock_data &&) = delete;
 | 
			
		||||
 | 
			
		||||
  lock_data()
 | 
			
		||||
      : pt_(provider_type::sia),
 | 
			
		||||
        unique_id_(""),
 | 
			
		||||
        mutex_id_(""),
 | 
			
		||||
        mutex_handle_(INVALID_HANDLE_VALUE) {}
 | 
			
		||||
  ~lock_data();
 | 
			
		||||
 | 
			
		||||
  ~lock_data() { release(); }
 | 
			
		||||
  auto operator=(const lock_data &) -> lock_data & = delete;
 | 
			
		||||
  auto operator=(lock_data &&) -> lock_data & = delete;
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
  const provider_type pt_;
 | 
			
		||||
  const std::string unique_id_;
 | 
			
		||||
  const std::string mutex_id_;
 | 
			
		||||
  HANDLE mutex_handle_;
 | 
			
		||||
  DWORD mutex_state_ = WAIT_FAILED;
 | 
			
		||||
  std::string mutex_id_;
 | 
			
		||||
  HANDLE mutex_handle_{INVALID_HANDLE_VALUE};
 | 
			
		||||
  DWORD mutex_state_{WAIT_FAILED};
 | 
			
		||||
 | 
			
		||||
  [[nodiscard]] auto get_current_mount_state(json &mount_state) -> bool;
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
  [[nodiscard]] auto get_mount_state(const provider_type &pt,
 | 
			
		||||
                                     json &mount_state) -> bool;
 | 
			
		||||
 | 
			
		||||
  [[nodiscard]] auto get_mount_state(json &mount_state) -> bool;
 | 
			
		||||
 | 
			
		||||
  [[nodiscard]] auto get_unique_id() const -> std::string { return unique_id_; }
 | 
			
		||||
 | 
			
		||||
  [[nodiscard]] auto grab_lock(std::uint8_t retry_count = 30) -> lock_result;
 | 
			
		||||
  [[nodiscard]] auto grab_lock(std::uint8_t retry_count = 30U) -> lock_result;
 | 
			
		||||
 | 
			
		||||
  void release();
 | 
			
		||||
 | 
			
		||||
  [[nodiscard]] auto set_mount_state(bool active,
 | 
			
		||||
                                     const std::string &mount_location,
 | 
			
		||||
                                     const std::int64_t &pid) -> bool;
 | 
			
		||||
                                     std::string_view mount_location,
 | 
			
		||||
                                     std::int64_t pid) -> bool;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
[[nodiscard]] auto create_meta_attributes(
 | 
			
		||||
 
 | 
			
		||||
@@ -48,9 +48,9 @@ public:
 | 
			
		||||
 | 
			
		||||
  [[nodiscard]] auto get_pinned_files() -> rpc_response;
 | 
			
		||||
 | 
			
		||||
  [[nodiscard]] auto pin_file(const std::string &api_file) -> rpc_response;
 | 
			
		||||
  [[nodiscard]] auto pin_file(const std::string &api_path) -> rpc_response;
 | 
			
		||||
 | 
			
		||||
  [[nodiscard]] auto pinned_status(const std::string &api_file) -> rpc_response;
 | 
			
		||||
  [[nodiscard]] auto pinned_status(const std::string &api_path) -> rpc_response;
 | 
			
		||||
 | 
			
		||||
  [[nodiscard]] auto set_config_value_by_name(const std::string &name,
 | 
			
		||||
                                              const std::string &value)
 | 
			
		||||
@@ -58,7 +58,7 @@ public:
 | 
			
		||||
 | 
			
		||||
  [[nodiscard]] auto unmount() -> rpc_response;
 | 
			
		||||
 | 
			
		||||
  [[nodiscard]] auto unpin_file(const std::string &api_file) -> rpc_response;
 | 
			
		||||
  [[nodiscard]] auto unpin_file(const std::string &api_path) -> rpc_response;
 | 
			
		||||
};
 | 
			
		||||
} // namespace repertory
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										82
									
								
								repertory/librepertory/include/rpc/common.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										82
									
								
								repertory/librepertory/include/rpc/common.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,82 @@
 | 
			
		||||
/*
 | 
			
		||||
  Copyright <2018-2025> <scott.e.graves@protonmail.com>
 | 
			
		||||
 | 
			
		||||
  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_RPC_COMMON_HPP_
 | 
			
		||||
#define REPERTORY_INCLUDE_RPC_COMMON_HPP_
 | 
			
		||||
 | 
			
		||||
#include "utils/base64.hpp"
 | 
			
		||||
#include "utils/error_utils.hpp"
 | 
			
		||||
#include "utils/string.hpp"
 | 
			
		||||
 | 
			
		||||
namespace repertory::rpc {
 | 
			
		||||
[[nodiscard]] auto check_authorization(const auto &cfg,
 | 
			
		||||
                                       const httplib::Request &req) -> bool {
 | 
			
		||||
  REPERTORY_USES_FUNCTION_NAME();
 | 
			
		||||
 | 
			
		||||
  if (cfg.get_api_password().empty() || cfg.get_api_user().empty()) {
 | 
			
		||||
    utils::error::raise_error(function_name,
 | 
			
		||||
                              "authorization user or password is not set");
 | 
			
		||||
    return false;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  auto authorization = req.get_header_value("Authorization");
 | 
			
		||||
  if (authorization.empty()) {
 | 
			
		||||
    utils::error::raise_error(function_name,
 | 
			
		||||
                              "'Authorization' header is not set");
 | 
			
		||||
    return false;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  auto auth_parts = utils::string::split(authorization, ' ', true);
 | 
			
		||||
  if (auth_parts.empty()) {
 | 
			
		||||
    utils::error::raise_error(function_name, "'Authorization' header is empty");
 | 
			
		||||
    return false;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  auto auth_type = auth_parts[0U];
 | 
			
		||||
  if (auth_type != "Basic") {
 | 
			
		||||
    utils::error::raise_error(function_name,
 | 
			
		||||
                              "authorization type is not 'Basic'");
 | 
			
		||||
    return false;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  auto data = macaron::Base64::Decode(authorization.substr(6U));
 | 
			
		||||
  auto auth_str = std::string(data.begin(), data.end());
 | 
			
		||||
 | 
			
		||||
  auto auth = utils::string::split(auth_str, ':', false);
 | 
			
		||||
  if (auth.size() < 2U) {
 | 
			
		||||
    utils::error::raise_error(function_name, "authorization data is not valid");
 | 
			
		||||
    return false;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  auto user = auth.at(0U);
 | 
			
		||||
  auth.erase(auth.begin());
 | 
			
		||||
 | 
			
		||||
  auto pwd = utils::string::join(auth, ':');
 | 
			
		||||
  if ((user != cfg.get_api_user()) || (pwd != cfg.get_api_password())) {
 | 
			
		||||
    utils::error::raise_error(function_name, "authorization failed");
 | 
			
		||||
    return false;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return true;
 | 
			
		||||
}
 | 
			
		||||
} // namespace repertory::rpc
 | 
			
		||||
 | 
			
		||||
#endif // REPERTORY_INCLUDE_RPC_COMMON_HPP_
 | 
			
		||||
@@ -40,8 +40,6 @@ private:
 | 
			
		||||
  std::mutex start_stop_mutex_;
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
  [[nodiscard]] auto check_authorization(const httplib::Request &req) -> bool;
 | 
			
		||||
 | 
			
		||||
  void handle_get_config(const httplib::Request &req, httplib::Response &res);
 | 
			
		||||
 | 
			
		||||
  void handle_get_config_value_by_name(const httplib::Request &req,
 | 
			
		||||
 
 | 
			
		||||
@@ -23,7 +23,7 @@
 | 
			
		||||
#define REPERTORY_INCLUDE_TYPES_REPERTORY_HPP_
 | 
			
		||||
 | 
			
		||||
namespace repertory {
 | 
			
		||||
constexpr const auto default_api_auth_size{48U};
 | 
			
		||||
constexpr const auto default_api_password_size{48U};
 | 
			
		||||
constexpr const auto default_download_timeout_secs{30U};
 | 
			
		||||
constexpr const auto default_eviction_delay_mins{1U};
 | 
			
		||||
constexpr const auto default_high_freq_interval_secs{std::uint16_t{30U}};
 | 
			
		||||
@@ -38,6 +38,7 @@ constexpr const auto default_retry_read_count{6U};
 | 
			
		||||
constexpr const auto default_ring_buffer_file_size{512U};
 | 
			
		||||
constexpr const auto default_task_wait_ms{100U};
 | 
			
		||||
constexpr const auto default_timeout_ms{60000U};
 | 
			
		||||
constexpr const auto default_ui_mgmt_port{std::uint16_t{30000U}};
 | 
			
		||||
constexpr const auto max_ring_buffer_file_size{std::uint16_t(1024U)};
 | 
			
		||||
constexpr const auto max_s3_object_name_length{1024U};
 | 
			
		||||
constexpr const auto min_cache_size_bytes{
 | 
			
		||||
@@ -280,6 +281,8 @@ enum class exit_code : std::int32_t {
 | 
			
		||||
  pin_failed = -16,
 | 
			
		||||
  unpin_failed = -17,
 | 
			
		||||
  init_failed = -18,
 | 
			
		||||
  ui_mount_failed = -19,
 | 
			
		||||
  exception = -20,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
enum http_error_codes : std::int32_t {
 | 
			
		||||
@@ -304,6 +307,18 @@ enum class provider_type : std::size_t {
 | 
			
		||||
  unknown,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
[[nodiscard]] auto
 | 
			
		||||
provider_type_from_string(std::string_view type,
 | 
			
		||||
                          provider_type default_type = provider_type::unknown)
 | 
			
		||||
    -> provider_type;
 | 
			
		||||
 | 
			
		||||
[[nodiscard]] auto provider_type_to_string(provider_type type) -> std::string;
 | 
			
		||||
 | 
			
		||||
void clean_json_config(provider_type prov, nlohmann::json &data);
 | 
			
		||||
 | 
			
		||||
[[nodiscard]] auto clean_json_value(std::string_view name,
 | 
			
		||||
                                    std::string_view data) -> std::string;
 | 
			
		||||
 | 
			
		||||
#if defined(_WIN32)
 | 
			
		||||
struct open_file_data final {
 | 
			
		||||
  PVOID directory_buffer{nullptr};
 | 
			
		||||
@@ -452,7 +467,6 @@ using meta_provider_callback = std::function<void(directory_item &)>;
 | 
			
		||||
 | 
			
		||||
inline constexpr const auto JSON_ACCESS_KEY{"AccessKey"};
 | 
			
		||||
inline constexpr const auto JSON_AGENT_STRING{"AgentString"};
 | 
			
		||||
inline constexpr const auto JSON_API_AUTH{"ApiAuth"};
 | 
			
		||||
inline constexpr const auto JSON_API_PARENT{"ApiParent"};
 | 
			
		||||
inline constexpr const auto JSON_API_PASSWORD{"ApiPassword"};
 | 
			
		||||
inline constexpr const auto JSON_API_PATH{"ApiPath"};
 | 
			
		||||
@@ -487,6 +501,7 @@ inline constexpr const auto JSON_MAX_UPLOAD_COUNT{"MaxUploadCount"};
 | 
			
		||||
inline constexpr const auto JSON_MED_FREQ_INTERVAL_SECS{
 | 
			
		||||
    "MedFreqIntervalSeconds"};
 | 
			
		||||
inline constexpr const auto JSON_META{"Meta"};
 | 
			
		||||
inline constexpr const auto JSON_MOUNT_LOCATIONS{"MountLocations"};
 | 
			
		||||
inline constexpr const auto JSON_ONLINE_CHECK_RETRY_SECS{
 | 
			
		||||
    "OnlineCheckRetrySeconds"};
 | 
			
		||||
inline constexpr const auto JSON_PATH{"Path"};
 | 
			
		||||
 
 | 
			
		||||
@@ -49,6 +49,8 @@ static const option password_option = {"-pw", "--password"};
 | 
			
		||||
static const option remote_mount_option = {"-rm", "--remote_mount"};
 | 
			
		||||
static const option set_option = {"-set", "--set"};
 | 
			
		||||
static const option status_option = {"-status", "--status"};
 | 
			
		||||
static const option ui_option = {"-ui", "--ui"};
 | 
			
		||||
static const option ui_port_option = {"-up", "--ui_port"};
 | 
			
		||||
static const option unmount_option = {"-unmount", "--unmount"};
 | 
			
		||||
static const option unpin_file_option = {"-uf", "--unpin_file"};
 | 
			
		||||
static const option user_option = {"-us", "--user"};
 | 
			
		||||
@@ -75,6 +77,8 @@ static const std::vector<option> option_list = {
 | 
			
		||||
    remote_mount_option,
 | 
			
		||||
    set_option,
 | 
			
		||||
    status_option,
 | 
			
		||||
    ui_option,
 | 
			
		||||
    ui_port_option,
 | 
			
		||||
    unmount_option,
 | 
			
		||||
    unpin_file_option,
 | 
			
		||||
    user_option,
 | 
			
		||||
@@ -87,26 +91,27 @@ void get_api_authentication_data(std::string &user, std::string &password,
 | 
			
		||||
                                 std::uint16_t &port, const provider_type &prov,
 | 
			
		||||
                                 const std::string &data_directory);
 | 
			
		||||
 | 
			
		||||
[[nodiscard]] auto
 | 
			
		||||
get_provider_type_from_args(std::vector<const char *> args) -> provider_type;
 | 
			
		||||
[[nodiscard]] auto get_provider_type_from_args(std::vector<const char *> args)
 | 
			
		||||
    -> provider_type;
 | 
			
		||||
 | 
			
		||||
[[nodiscard]] auto has_option(std::vector<const char *> args,
 | 
			
		||||
                              const std::string &option_name) -> bool;
 | 
			
		||||
 | 
			
		||||
[[nodiscard]] auto has_option(std::vector<const char *> args,
 | 
			
		||||
                              const option &opt) -> bool;
 | 
			
		||||
[[nodiscard]] auto has_option(std::vector<const char *> args, const option &opt)
 | 
			
		||||
    -> bool;
 | 
			
		||||
 | 
			
		||||
[[nodiscard]] auto parse_option(std::vector<const char *> args,
 | 
			
		||||
                                const std::string &option_name,
 | 
			
		||||
                                std::uint8_t count) -> std::vector<std::string>;
 | 
			
		||||
 | 
			
		||||
[[nodiscard]] auto parse_string_option(std::vector<const char *> args,
 | 
			
		||||
                                       const option &opt,
 | 
			
		||||
                                       std::string &value) -> exit_code;
 | 
			
		||||
                                       const option &opt, std::string &value)
 | 
			
		||||
    -> exit_code;
 | 
			
		||||
 | 
			
		||||
[[nodiscard]] auto
 | 
			
		||||
parse_drive_options(std::vector<const char *> args, provider_type &prov,
 | 
			
		||||
                    std::string &data_directory) -> std::vector<std::string>;
 | 
			
		||||
[[nodiscard]] auto parse_drive_options(std::vector<const char *> args,
 | 
			
		||||
                                       provider_type &prov,
 | 
			
		||||
                                       std::string &data_directory)
 | 
			
		||||
    -> std::vector<std::string>;
 | 
			
		||||
} // namespace repertory::utils::cli
 | 
			
		||||
 | 
			
		||||
#endif // REPERTORY_INCLUDE_UTILS_CLI_UTILS_HPP_
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user