mysqlshdk/include/shellcore/shell_options.h (224 lines of code) (raw):

/* * Copyright (c) 2014, 2024, Oracle and/or its affiliates. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License, version 2.0, * as published by the Free Software Foundation. * * This program is designed to work with certain software (including * but not limited to OpenSSL) that is licensed under separate terms, * as designated in a particular file or component or in included license * documentation. The authors of MySQL hereby grant you an additional * permission to link the program and your derivative works with the * separately licensed software that they have either included with * the program or referenced in the documentation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See * the GNU General Public License, version 2.0, for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef MYSQLSHDK_INCLUDE_SHELLCORE_SHELL_OPTIONS_H_ #define MYSQLSHDK_INCLUDE_SHELLCORE_SHELL_OPTIONS_H_ #include "mysqlshdk/libs/utils/enumset.h" #include "mysqlshdk/libs/utils/utils_general.h" #define SN_SHELL_OPTION_CHANGED "SN_SHELL_OPTION_CHANGED" #define SHCORE_RESULT_FORMAT "resultFormat" #define SHCORE_INTERACTIVE "interactive" #define SHCORE_SHOW_WARNINGS "showWarnings" #define SHCORE_BATCH_CONTINUE_ON_ERROR "batchContinueOnError" #define SHCORE_USE_WIZARDS "useWizards" #define SHCORE_SANDBOX_DIR "sandboxDir" #define SHCORE_DBA_GTID_WAIT_TIMEOUT "dba.gtidWaitTimeout" #define SHCORE_DBA_RESTART_WAIT_TIMEOUT "dba.restartWaitTimeout" #define SHCORE_DBA_LOG_SQL "dba.logSql" #define SHCORE_DBA_CONNECTIVITY_CHECKS "dba.connectivityChecks" #define SHCORE_LOG_FILE_NAME "logFile" #define SHCORE_LOG_SQL "logSql" #define SHCORE_LOG_SQL_IGNORE "logSql.ignorePattern" #define SHCORE_LOG_SQL_IGNORE_UNSAFE "logSql.ignorePatternUnsafe" #define SHCORE_HISTORY_MAX_SIZE "history.maxSize" #define SHCORE_HISTIGNORE "history.sql.ignorePattern" #define SHCORE_HISTORY_SQL_SYSLOG "history.sql.syslog" #define SHCORE_HISTORY_AUTOSAVE "history.autoSave" #define SHCORE_DB_NAME_CACHE "autocomplete.nameCache" #define SHCORE_DEVAPI_DB_OBJECT_HANDLES "devapi.dbObjectHandles" #define SHCORE_PAGER "pager" #define SHCORE_DEFAULT_COMPRESS "defaultCompress" #define SHCORE_VERBOSE "verbose" #define SHCORE_DEBUG "debug" #define SHCORE_MYSQL_PLUGIN_DIR "mysqlPluginDir" #define SHCORE_CONNECT_TIMEOUT "connectTimeout" #define SHCORE_DBA_CONNECT_TIMEOUT "dba.connectTimeout" #define SHCORE_PROGRESS_REPORTING "progressReporting" #include <stdlib.h> #include <array> #include <iostream> #include <memory> #include <optional> #include <string> #include <tuple> #include <vector> #include "mysqlshdk/libs/db/connection_options.h" #include "mysqlshdk/libs/ssh/ssh_connection_options.h" #include "mysqlshdk/libs/utils/options.h" #include "mysqlshdk/shellcore/shell_cli_operation.h" #include "shellcore/ishell_core.h" struct MEM_ROOT; namespace mysqlsh { class Shell_options final : public shcore::Options { public: enum class Quiet_start { NOT_SET, SUPRESS_BANNER, SUPRESS_INFO }; #ifdef _WIN32 using ssize_t = __int64; #endif // _WIN32 struct Ssh_settings { std::string known_hosts_file; std::string identity_file; std::string config_file; int timeout = 10; unsigned int buffer_size = 10240; std::string uri; std::string pwd; mysqlshdk::ssh::Ssh_connection_options uri_data; }; struct Storage { shcore::IShell_core::Mode initial_mode = shcore::IShell_core::Mode::None; std::string run_file; std::string run_module; // Individual connection parameters std::string fido_register_factor; std::string oci_profile; std::string oci_config_file; std::string protocol; mysqlshdk::db::Connection_options connection_data; Ssh_settings ssh; std::string result_format; std::string wrap_json; bool force = false; bool interactive = false; bool full_interactive = false; bool passwords_from_stdin = false; bool prompt_password = false; bool no_password = false; //< Do not ask for password bool recreate_database = false; bool show_warnings = true; bool trace_protocol = false; bool log_to_stderr = false; bool devapi_schema_object_handles = true; bool db_name_cache = true; bool db_name_cache_set = false; std::string execute_statement; std::string execute_dba_statement; std::string sandbox_directory; int dba_gtid_wait_timeout = 60; int dba_restart_wait_timeout = 60; int dba_log_sql = 0; bool dba_connectivity_checks = false; std::string log_sql; //< Global SQL logging level std::string log_sql_ignore; std::string log_sql_ignore_unsafe; shcore::Logger::LOG_LEVEL log_level = shcore::Logger::LOG_INFO; std::string log_file; int verbose_level = 0; bool wizards = true; bool admin_mode = false; std::string histignore; int history_max_size = 1000; bool history_autosave = false; bool history_sql_syslog = false; enum class Redirect_to { None, Primary, Secondary } redirect_session = Redirect_to::None; std::string default_cluster; bool default_cluster_set = false; bool default_replicaset_set = false; bool get_server_public_key = false; std::string server_public_key_path; // cmdline params to be passed to script std::vector<std::string> script_argv; std::vector<std::string> import_args; std::vector<std::string> import_opts; std::string pager; Quiet_start quiet_start = Quiet_start::NOT_SET; bool show_column_type_info = false; bool default_compress = false; std::string dbug_options; // override default plugin search path ; separated in windows, : elsewhere mysqlshdk::null_string plugins_path; std::string mysql_plugin_dir; double connect_timeout = 10.0; double dba_connect_timeout = 5.0; // This should probably a command line option that determines how much bytes // should be included when returning binary data, 0 means no limits // Eventually this should be turned as a command line argument, i.e. // --binary-limit size_t binary_limit = 0; // Indicates the Shell trunning for the GUI bool gui_mode = false; // TODO(anyone): Expose the option enum class Progress_reporting { DISABLED, SIMPLE, PROGRESSBAR } progress_reporting = isatty(STDOUT_FILENO) ? Progress_reporting::PROGRESSBAR : Progress_reporting::SIMPLE; int exit_code = 0; bool has_connection_data(bool require_main_options = false) const; mysqlshdk::db::Connection_options connection_options() const; bool has_multi_passwords() const { auto &mfa_passwords = connection_data.get_mfa_passwords(); return (mfa_passwords[1].has_value() || mfa_passwords[2].has_value()); } void set_uri(const std::string &uri); mysqlsh::SessionType check_option_session_type_conflict( const std::string &option); private: std::list<std::string> m_session_type_options; }; enum class Option_flags { CONNECTION_ONLY, READ_MYCNF }; using Option_flags_set = mysqlshdk::utils::Enum_set<Option_flags, Option_flags::READ_MYCNF>; Shell_options( int argc = 0, char **argv = nullptr, const std::string &configuration_file = "", Option_flags_set flags = {}, const std::function<void(const std::string &)> &on_error = {}, const std::function<void(const std::string &)> &on_warning = {}); void set(const std::string &option, const std::string &value) { Options::set(option, value); } void set(const std::string &option, const shcore::Value &value); void set_and_notify(const std::string &option, const std::string &value, bool save_to_file = false); void set_and_notify(const std::string &option, const shcore::Value &value, bool save_to_file = false); void unset(const std::string &option, bool save_to_file = false); shcore::Value get(const std::string &option); const Storage &get() const { return storage; } bool has_key(const std::string &option) const { return named_options.find(option) != named_options.end(); } shcore::cli::Shell_cli_operation *get_shell_cli_operation() { return m_shell_cli_operation.get(); } void set_interactive(bool value) { storage.interactive = value; } void set_wizards(bool value) { storage.wizards = value; } void set_db_name_cache(bool value) { storage.db_name_cache = value; } void set_result_format(const std::string &format) { storage.result_format = format; } void set_binary_limit(size_t value) { storage.binary_limit = value; } void set_gui_mode(bool value) { storage.gui_mode = value; } void set_oci_config_file(const std::string &path) { storage.oci_config_file = path; } void set_json_output() { storage.wrap_json = "json/raw"; storage.result_format = "json/raw"; } std::vector<std::string> get_details() { return get_cmdline_help(33, 45); } bool action_print_help() const { return print_cmd_line_helper; } bool action_print_version() const { return print_cmd_line_version; } bool action_print_version_extra() const { return print_cmd_line_version_extra; } std::vector<std::string> get_named_options(); bool got_cmdline_password = false; private: void handle_mycnf_options(int *argc, char ***argv, MEM_ROOT *argv_alloc); bool custom_cmdline_handler(Iterator *iterator); void override_session_type(const std::string &option, const char *value); void set_ssl_mode(const std::string &option, const char *value); void check_password_conflicts(); void check_result_format(); void check_file_execute_conflicts(); void check_ssh_conflicts(); /** * --import option require default schema to be provided in connection * options. */ void check_import_options(); void check_connection_options(); Storage storage; std::unique_ptr<shcore::cli::Shell_cli_operation> m_shell_cli_operation; std::function<void(const std::string &)> m_on_error; std::function<void(const std::string &)> m_on_warning; bool print_cmd_line_helper = false; bool print_cmd_line_version = false; bool print_cmd_line_version_extra = false; private: void notify(const std::string &option); }; std::shared_ptr<Shell_options> current_shell_options(bool allow_empty = false); } // namespace mysqlsh #endif // MYSQLSHDK_INCLUDE_SHELLCORE_SHELL_OPTIONS_H_