From 61241f9e0754dc4c5011a00b9868d16f9bcf6aff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Markus=20M=C3=A4kel=C3=A4?= Date: Sat, 8 Jul 2017 05:18:47 +0300 Subject: [PATCH] Remove old feedback system The feedback system wasn't used and was starting to cause problems on Debian 9 where the libcurl required different version of OpenSSL than what MaxScale was linked against. --- BUILD/install_build_deps.sh | 8 +- CMakeLists.txt | 8 - .../Building-MaxScale-from-Source-Code.md | 9 +- Documentation/Reference/MaxAdmin.md | 3 - .../Tutorials/Notification-Service.md | 75 ---- include/maxscale/config.h | 11 - include/maxscale/notification.h | 56 --- server/core/CMakeLists.txt | 1 - server/core/config.cc | 131 ------ server/core/load_utils.cc | 423 +----------------- server/core/maxscale/modules.h | 29 -- server/core/service.cc | 2 - server/core/test/CMakeLists.txt | 9 - server/core/test/testfeedback.cc | 120 ----- server/modules/routing/debugcli/debugcmd.c | 68 --- 15 files changed, 9 insertions(+), 944 deletions(-) delete mode 100644 Documentation/Tutorials/Notification-Service.md delete mode 100644 include/maxscale/notification.h delete mode 100644 server/core/test/testfeedback.cc diff --git a/BUILD/install_build_deps.sh b/BUILD/install_build_deps.sh index 4a99d9d98..b913d0cd5 100755 --- a/BUILD/install_build_deps.sh +++ b/BUILD/install_build_deps.sh @@ -14,8 +14,8 @@ then sudo apt-get install -y --force-yes dpkg-dev git wget \ build-essential libssl-dev ncurses-dev bison flex \ - perl libtool libcurl4-openssl-dev libpcre3-dev tcl tcl-dev uuid \ - uuid-dev libsqlite3-dev + perl libtool libpcre3-dev tcl tcl-dev uuid \ + uuid-dev libsqlite3-dev ## separatelibgnutls installation process for Ubuntu Trusty cat /etc/*release | grep "Trusty" if [ $? == 0 ] @@ -41,7 +41,7 @@ else then # We need zypper here sudo zypper -n install gcc gcc-c++ ncurses-devel bison glibc-devel libgcc_s1 perl \ - make libtool libopenssl-devel libaio libaio-devel flex libcurl-devel \ + make libtool libopenssl-devel libaio libaio-devel flex \ pcre-devel git wget tcl libuuid-devel \ xz-devel sqlite3 sqlite3-devel pkg-config lua lua-devel \ gnutls-devel libgcrypt-devel @@ -57,7 +57,7 @@ else sudo yum clean all sudo yum install -y --nogpgcheck gcc gcc-c++ ncurses-devel bison glibc-devel \ libgcc perl make libtool openssl-devel libaio libaio-devel libedit-devel \ - libedit-devel libcurl-devel curl-devel systemtap-sdt-devel rpm-sign wget \ + libedit-devel systemtap-sdt-devel rpm-sign wget \ gnupg pcre-devel flex rpmdevtools git wget tcl openssl libuuid-devel xz-devel \ sqlite sqlite-devel pkgconfig lua lua-devel rpm-build createrepo yum-utils \ gnutls-devel libgcrypt-devel diff --git a/CMakeLists.txt b/CMakeLists.txt index 84b36d030..1f7df2c39 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -38,7 +38,6 @@ find_package(Pandoc) find_package(TCMalloc) find_package(Jemalloc) find_package(Git) -find_package(CURL) find_package(RabbitMQ) find_package(LibUUID) find_package(Avro) @@ -66,13 +65,6 @@ include(cmake/BuildMicroHttpd.cmake) include_directories(${JANSSON_INCLUDE_DIR}) -# You can find the variables set by this in the FindCURL.cmake file -# which is a default module in CMake. - -if(NOT CURL_FOUND) - message(FATAL_ERROR "Failed to locate dependency: libcurl") -endif() - if(NOT OPENSSL_FOUND) message(FATAL_ERROR "Failed to locate dependency: OpenSSL") else() diff --git a/Documentation/Getting-Started/Building-MaxScale-from-Source-Code.md b/Documentation/Getting-Started/Building-MaxScale-from-Source-Code.md index 7304020cf..952f98dd0 100644 --- a/Documentation/Getting-Started/Building-MaxScale-from-Source-Code.md +++ b/Documentation/Getting-Started/Building-MaxScale-from-Source-Code.md @@ -6,7 +6,6 @@ requirements are as follows: * CMake version 2.8 or later (Packaging requires version 2.8.12 or later) * GCC version 4.4.7 or later * SQLite3 version 3.3 or later -* libcurl * OpenSSL * Bison 2.7 or later * Flex 2.5.35 or later @@ -23,7 +22,7 @@ CentOS 7: ``` sudo yum install git gcc gcc-c++ ncurses-devel bison flex glibc-devel cmake \ - libgcc perl make libtool openssl openssl-devel libcurl-devel pcre-devel \ + libgcc perl make libtool openssl openssl-devel pcre-devel \ tcl tcl-devel systemtap-sdt-devel libuuid libuuid-devel sqlite sqlite-devel \ gnutls-devel libgcrypt-devel ``` @@ -33,7 +32,7 @@ Ubuntu 16.04: ``` sudo apt-get update sudo apt-get install git build-essential libssl-dev ncurses-dev bison flex \ - cmake perl libtool libcurl4-openssl-dev libpcre3-dev tcl tcl-dev uuid \ + cmake perl libtool libpcre3-dev tcl tcl-dev uuid \ uuid-dev libsqlite3-dev gnutls-dev libgcrypt20-dev ``` @@ -58,7 +57,7 @@ other packages in addition to these. ``` git gcc gcc-c++ ncurses-devel bison flex glibc-devel cmake libgcc perl make \ -libtool openssl openssl-devel libcurl-devel pcre-devel tcl tcl-devel \ +libtool openssl openssl-devel pcre-devel tcl tcl-devel \ systemtap-sdt-devel libuuid libuuid-devel sqlite sqlite-devel gnutls-devel libgcrypt-devel ``` @@ -70,7 +69,7 @@ require other packages in addition to these. ``` git build-essential libssl-dev ncurses-dev bison flex cmake perl libtool \ -libcurl4-openssl-dev libpcre3-dev tlc tcl-dev uuid uuid-dev sqlite3-dev + libpcre3-dev tlc tcl-dev uuid uuid-dev sqlite3-dev libgnutls30 libgcrypt20 ``` diff --git a/Documentation/Reference/MaxAdmin.md b/Documentation/Reference/MaxAdmin.md index 129287750..8328a8ca9 100644 --- a/Documentation/Reference/MaxAdmin.md +++ b/Documentation/Reference/MaxAdmin.md @@ -371,7 +371,6 @@ disable: disable log-priority - Disable a logging priority disable sessionlog-priority - [Deprecated] Disable a logging priority for a particular session disable root - Disable root access - disable feedback - Disable MaxScale feedback to notification service disable syslog - Disable syslog logging disable maxlog - Disable MaxScale logging disable account - Disable Linux user @@ -380,7 +379,6 @@ enable: enable log-priority - Enable a logging priority enable sessionlog-priority - [Deprecated] Enable a logging priority for a session enable root - Enable root user access to a service - enable feedback - Enable MaxScale feedback to notification service enable syslog - Enable syslog logging enable maxlog - Enable MaxScale logging enable account - Activate a Linux user account for MaxAdmin use @@ -423,7 +421,6 @@ show: show authenticators - Show authenticator diagnostics for a service show epoll - Show the polling system statistics show eventstats - Show event queue statistics - show feedbackreport - Show the report of MaxScale loaded modules, suitable for Notification Service show filter - Show filter details show filters - Show all filters show log_throttling - Show the current log throttling setting (count, window (ms), suppression (ms)) diff --git a/Documentation/Tutorials/Notification-Service.md b/Documentation/Tutorials/Notification-Service.md deleted file mode 100644 index 92f733d54..000000000 --- a/Documentation/Tutorials/Notification-Service.md +++ /dev/null @@ -1,75 +0,0 @@ -# MariaDB MaxScale Notification Service and Feedback Support - -## Overview - -The purpose of Notification Service in MariaDB MaxScale is for a customer registered for the service to receive update notices, security bulletins, fixes and workarounds that are tailored to the database server configuration. - -## MariaDB MaxScale Setup - -MariaDB MaxScale may collect the installed plugins and send the information's nightly, between 2:00 AM and 4:59 AM. - -It tries to send data and if there is any failure (timeout, server is down, etc), the next retry is in 1800 seconds (30 minutes). - -This feature is not enabled by default: MariaDB MaxScale must be configured in `[feedback]` section: - -``` -[feedback] -feedback_enable=1 -feedback_url=https://enterprise.mariadb.com/feedback/post -feedback_user_info=x-y-z-w -``` - -The activation code that will be provided by MariaDB Corporation Ab upon request by the customer and it should be put in feedback_user_info. - -Example: -``` -feedback_user_info=0467009f-b04d-45b1-a77b-b6b2ec9c6cf4 -``` - -MariaDB MaxScale generates the feedback report containing following information: - - - The activation code used to enable feedback - - MariaDB MaxScale Version - - An identifier of the MariaDB MaxScale installation, i.e. the HEX encoding of SHA1 digest of the first network interface MAC address - - Operating System (i.e Linux) - - Operating System Distribution (i.e. CentOS release 6.5 (Final)) - - All the modules in use in MariaDB MaxScale and their API and version - - MariaDB MaxScale server UNIX_TIME at generation time - -MariaDB MaxScale shall send the generated feedback report to a feedback server specified in _feedback_url_. - - -## Manual Operation - -If it’s not possible to send data due to firewall or security settings the report could be generated manually (feedback_user_info is required) via MaxAdmin. - -``` -MaxScale>show feedbackreport -``` - -Report could be saved to report.txt file: - -``` -$ maxadmin show feedbackreport > ./report.txt - -curl -F data=@./report.txt https://mariadb.org/feedback_plugin/post -``` - -Report Example: -``` -FEEDBACK_SERVER_UID 6B5C44AEA73137D049B02E6D1C7629EF431A350F -FEEDBACK_USER_INFO 0467009f-b04d-45b1-a77b-b6b2ec9c6cf4 -VERSION 1.0.6-unstable -NOW 1425914890 -PRODUCT maxscale -Uname_sysname Linux -Uname_distribution CentOS release 6.5 (Final) -module_maxscaled_type Protocol -module_maxscaled_version V1.0.0 -module_maxscaled_api 1.0.0 -module_maxscaled_releasestatus GA -module_telnetd_type Protocol -module_telnetd_version V1.0.1 -module_telnetd_api 1.0.0 -module_telnetd_releasestatus GA -``` diff --git a/include/maxscale/config.h b/include/maxscale/config.h index 45dd8b9e1..1e089ecac 100644 --- a/include/maxscale/config.h +++ b/include/maxscale/config.h @@ -96,7 +96,6 @@ extern const char CN_DATA[]; extern const char CN_DEFAULT[]; extern const char CN_DESCRIPTION[]; extern const char CN_ENABLE_ROOT_USER[]; -extern const char CN_FEEDBACK[]; extern const char CN_FILTERS[]; extern const char CN_FILTER[]; extern const char CN_GATEWAY[]; @@ -460,16 +459,6 @@ unsigned int config_nbpolls(void); */ unsigned int config_pollsleep(void); -/** - * @brief Enable feedback task - */ -void config_enable_feedback_task(void); - -/** - * @brief Disable feedback task - */ -void config_disable_feedback_task(void); - /** * @brief Reload the configuration * diff --git a/include/maxscale/notification.h b/include/maxscale/notification.h deleted file mode 100644 index 051e80a44..000000000 --- a/include/maxscale/notification.h +++ /dev/null @@ -1,56 +0,0 @@ -#pragma once -/* - * Copyright (c) 2016 MariaDB Corporation Ab - * - * Use of this software is governed by the Business Source License included - * in the LICENSE.TXT file and at www.mariadb.com/bsl11. - * - * Change Date: 2020-01-01 - * - * On the date above, in accordance with the Business Source License, use - * of this software will be governed by version 2 or later of the General - * Public License. - */ - -/** - * @file notification.h - * - * The configuration stuct for notification/feedback service - */ - -#include - -MXS_BEGIN_DECLS - -#define _NOTIFICATION_CONNECT_TIMEOUT 30 -#define _NOTIFICATION_OPERATION_TIMEOUT 30 -#define _NOTIFICATION_SEND_PENDING 0 -#define _NOTIFICATION_SEND_OK 1 -#define _NOTIFICATION_SEND_ERROR 2 -#define _NOTIFICATION_REPORT_ROW_LEN 255 - -#include - -/** - * The configuration and usage information data for feeback service - */ - -typedef struct -{ - int feedback_enable; /**< Enable/Disable Notification feedback */ - char *feedback_url; /**< URL to which the data is sent */ - char *feedback_user_info; /**< User info included in the feedback data sent */ - int feedback_timeout; /**< An attempt to write/read the data times out and fails after this many seconds */ - int feedback_connect_timeout;/**< An attempt to send the data times out and fails after this many seconds */ - int feedback_last_action; /**< Holds the feedback last send action status */ - int feedback_frequency; /*< Frequency of the housekeeper task */ - char *release_info; /**< Operating system Release name */ - char *sysname; /**< Operating system name */ - uint8_t *mac_sha1; /**< First available MAC address*/ -} FEEDBACK_CONF; - -extern char *gw_bin2hex(char *out, const uint8_t *in, unsigned int len); -extern void gw_sha1_str(const uint8_t *in, int in_len, uint8_t *out); -extern FEEDBACK_CONF * config_get_feedback_data(); - -MXS_END_DECLS diff --git a/server/core/CMakeLists.txt b/server/core/CMakeLists.txt index 93df3874f..1d80cddbb 100644 --- a/server/core/CMakeLists.txt +++ b/server/core/CMakeLists.txt @@ -65,7 +65,6 @@ target_link_libraries(maxscale-common ${MARIADB_CONNECTOR_LIBRARIES} ${LZMA_LINK_FLAGS} ${PCRE2_LIBRARIES} - ${CURL_LIBRARIES} ${JANSSON_LIBRARIES} ssl pthread diff --git a/server/core/config.cc b/server/core/config.cc index f30889067..36c920bff 100644 --- a/server/core/config.cc +++ b/server/core/config.cc @@ -35,7 +35,6 @@ #include #include #include -#include #include #include #include @@ -78,7 +77,6 @@ const char CN_DATA[] = "data"; const char CN_DEFAULT[] = "default"; const char CN_DESCRIPTION[] = "description"; const char CN_ENABLE_ROOT_USER[] = "enable_root_user"; -const char CN_FEEDBACK[] = "feedback"; const char CN_FILTERS[] = "filters"; const char CN_FILTER[] = "filter"; const char CN_GATEWAY[] = "gateway"; @@ -158,9 +156,7 @@ static char *config_get_value(MXS_CONFIG_PARAMETER *, const char *); static char *config_get_password(MXS_CONFIG_PARAMETER *); static const char* config_get_value_string(const MXS_CONFIG_PARAMETER *params, const char *name); static int handle_global_item(const char *, const char *); -static int handle_feedback_item(const char *, const char *); static void global_defaults(); -static void feedback_defaults(); static bool check_config_objects(CONFIG_CONTEXT *context); static int maxscale_getline(char** dest, int* size, FILE* file); static bool check_first_last_char(const char* string, char expected); @@ -171,7 +167,6 @@ static pcre2_code* compile_regex_string(const char* regex_string, bool jit_enabl int config_get_ifaddr(unsigned char *output); static int config_get_release_string(char* release); -FEEDBACK_CONF *config_get_feedback_data(); bool config_has_duplicate_sections(const char* config, DUPLICATE_CONTEXT* context); int create_new_service(CONFIG_CONTEXT *obj); int create_new_server(CONFIG_CONTEXT *obj); @@ -183,7 +178,6 @@ void config_fix_param(const MXS_MODULE_PARAM *params, MXS_CONFIG_PARAMETER *p); static const char *config_file = NULL; static MXS_CONFIG gateway; -static FEEDBACK_CONF feedback; char *version_string = NULL; static bool is_persisted_config = false; /**< True if a persisted configuration file is being parsed */ @@ -466,10 +460,6 @@ ini_handler(void *userdata, const char *section, const char *name, const char *v { return handle_global_item(name, value); } - else if (strcasecmp(section, CN_FEEDBACK) == 0) - { - return handle_feedback_item(name, value); - } else if (strlen(section) == 0) { MXS_ERROR("Parameter '%s=%s' declared outside a section.", name, value); @@ -837,7 +827,6 @@ config_load(const char *filename) ss_dassert(!config_file); global_defaults(); - feedback_defaults(); config_file = filename; bool rval = config_load_and_process(filename, process_config_context); @@ -862,7 +851,6 @@ bool config_reload() } global_defaults(); - feedback_defaults(); rval = config_load_and_process(config_file, process_config_update); } @@ -1370,17 +1358,6 @@ config_pollsleep() return gateway.pollsleep; } -/** - * Return the feedback config data pointer - * - * @return The feedback config data pointer - */ -FEEDBACK_CONF * -config_get_feedback_data() -{ - return &feedback; -} - static struct { const char* name; @@ -1798,44 +1775,6 @@ SSL_LISTENER* make_ssl_structure (CONFIG_CONTEXT *obj, bool require_cert, int *e return NULL; } -/** - * Configuration handler for items in the feedback [feedback] section - * - * @param name The item name - * @param value The item value - * @return 0 on error - */ -static int -handle_feedback_item(const char *name, const char *value) -{ - int i; - if (strcmp(name, "feedback_enable") == 0) - { - feedback.feedback_enable = config_truth_value(value); - } - else if (strcmp(name, "feedback_user_info") == 0) - { - feedback.feedback_user_info = MXS_STRDUP_A(value); - } - else if (strcmp(name, "feedback_url") == 0) - { - feedback.feedback_url = MXS_STRDUP_A(value); - } - if (strcmp(name, "feedback_timeout") == 0) - { - feedback.feedback_timeout = atoi(value); - } - if (strcmp(name, "feedback_connect_timeout") == 0) - { - feedback.feedback_connect_timeout = atoi(value); - } - if (strcmp(name, "feedback_frequency") == 0) - { - feedback.feedback_frequency = atoi(value); - } - return 1; -} - /** * Set the defaults for the global configuration options */ @@ -1903,24 +1842,6 @@ global_defaults() gateway.qc_sql_mode = QC_SQL_MODE_DEFAULT; } -/** - * Set the defaults for the feedback configuration options - */ -static void -feedback_defaults() -{ - feedback.feedback_enable = 0; - feedback.feedback_user_info = NULL; - feedback.feedback_last_action = _NOTIFICATION_SEND_PENDING; - feedback.feedback_timeout = _NOTIFICATION_OPERATION_TIMEOUT; - feedback.feedback_connect_timeout = _NOTIFICATION_CONNECT_TIMEOUT; - feedback.feedback_url = NULL; - feedback.feedback_frequency = 1800; - feedback.release_info = gateway.release_string; - feedback.sysname = gateway.sysname; - feedback.mac_sha1 = gateway.mac_sha1; -} - /** * Process a configuration context update and turn it into the set of object * we need. @@ -2445,58 +2366,6 @@ config_get_release_string(char* release) } } -/** - * Add the 'send_feedback' task to the task list - */ -void -config_enable_feedback_task(void) -{ - FEEDBACK_CONF *cfg = config_get_feedback_data(); - int url_set = 0; - int user_info_set = 0; - int enable_set = cfg->feedback_enable; - - url_set = cfg->feedback_url != NULL && strlen(cfg->feedback_url); - user_info_set = cfg->feedback_user_info != NULL && strlen(cfg->feedback_user_info); - - if (enable_set && url_set && user_info_set) - { - /* Add the task to the tasl list */ - if (hktask_add("send_feedback", module_feedback_send, cfg, cfg->feedback_frequency)) - { - MXS_NOTICE("Notification service feedback task started: URL=%s, User-Info=%s, " - "Frequency %u seconds", - cfg->feedback_url, - cfg->feedback_user_info, - cfg->feedback_frequency); - } - } - else - { - if (enable_set) - { - MXS_ERROR("Notification service feedback cannot start: feedback_enable=1 but" - " some required parameters are not set: %s%s%s", - url_set == 0 ? "feedback_url is not set" : "", - (user_info_set == 0 && url_set == 0) ? ", " : "", - user_info_set == 0 ? "feedback_user_info is not set" : ""); - } - else - { - MXS_INFO("Notification service feedback is not enabled."); - } - } -} - -/** - * Remove the 'send_feedback' task - */ -void -config_disable_feedback_task(void) -{ - hktask_remove("send_feedback"); -} - unsigned long config_get_gateway_id() { return gateway.id; diff --git a/server/core/load_utils.cc b/server/core/load_utils.cc index 86dcabadd..f677c80b5 100644 --- a/server/core/load_utils.cc +++ b/server/core/load_utils.cc @@ -12,21 +12,7 @@ */ /** - * @file load_utils.c Utility functions to aid the loading of dynamic - * modules into the gateway - * - * @verbatim - * Revision History - * - * Date Who Description - * 13/06/13 Mark Riddoch Initial implementation - * 14/06/13 Mark Riddoch Updated to add call to ModuleInit if one is - * defined in the loaded module. - * Also updated to call fixed GetModuleObject - * 02/06/14 Mark Riddoch Addition of module info - * 26/02/15 Massimiliano Pinto Addition of module_feedback_send - * - * @endverbatim + * @file load_utils.c Utility functions for loading of modules */ #include "maxscale/modules.h" @@ -37,14 +23,10 @@ #include #include #include -#include -#include -#include #include #include #include -#include #include #include #include @@ -72,45 +54,6 @@ static LOADED_MODULE* register_module(const char *module, void *dlhandle, MXS_MODULE *mod_info); static void unregister_module(const char *module); -int module_create_feedback_report(GWBUF **buffer, LOADED_MODULE *modules, FEEDBACK_CONF *cfg); -int do_http_post(GWBUF *buffer, void *cfg); - -struct MemoryStruct -{ - char *data; - size_t size; -}; - -/** - * Callback write routine for curl library, getting remote server reply - * - * @param contents New data to add - * @param size Data size - * @param nmemb Elements in the buffer - * @param userp Pointer to the buffer - * @return 0 on failure, memory size on success - * - */ -static size_t -WriteMemoryCallback(void *contents, size_t size, size_t nmemb, void *userp) -{ - size_t realsize = size * nmemb; - struct MemoryStruct *mem = (struct MemoryStruct *)userp; - - char *data = (char*)MXS_REALLOC(mem->data, mem->size + realsize + 1); - - if (data == NULL) - { - return 0; - } - - mem->data = data; - memcpy(&(mem->data[mem->size]), contents, realsize); - mem->size += realsize; - mem->data[mem->size] = 0; - - return realsize; -} static bool check_module(const MXS_MODULE *mod_info, const char *type, const char *module) { @@ -548,22 +491,6 @@ json_t* module_list_to_json(const char* host) return mxs_json_resource(host, MXS_JSON_API_MODULES, arr); } -void moduleShowFeedbackReport(DCB *dcb) -{ - GWBUF *buffer; - LOADED_MODULE *modules_list = registered; - FEEDBACK_CONF *feedback_config = config_get_feedback_data(); - - if (!module_create_feedback_report(&buffer, modules_list, feedback_config)) - { - MXS_ERROR("Error in module_create_feedback_report(): gwbuf_alloc() failed to allocate memory"); - - return; - } - dcb_printf(dcb, "%s", (char *)GWBUF_DATA(buffer)); - gwbuf_free(buffer); -} - /** * Provide a row to the result set that defines the set of modules * @@ -638,354 +565,6 @@ RESULTSET *moduleGetList() return set; } -void module_feedback_send(void* data) -{ - LOADED_MODULE *modules_list = registered; - CURL *curl = NULL; - CURLcode res; - struct curl_httppost *formpost = NULL; - struct curl_httppost *lastptr = NULL; - GWBUF *buffer = NULL; - void *data_ptr = NULL; - long http_code = 0; - int last_action = _NOTIFICATION_SEND_PENDING; - time_t now; - struct tm *now_tm; - int hour; - int n_mod = 0; - char hex_setup_info[2 * SHA_DIGEST_LENGTH + 1] = ""; - int http_send = 0; - - now = time(NULL); - struct tm now_result; - now_tm = localtime_r(&now, &now_result); - hour = now_tm->tm_hour; - - FEEDBACK_CONF *feedback_config = (FEEDBACK_CONF *) data; - - /* Configuration check */ - - if (feedback_config->feedback_enable == 0 || - feedback_config->feedback_url == NULL || - feedback_config->feedback_user_info == NULL) - { - MXS_ERROR("Error in module_feedback_send(): some mandatory parameters are not set" - " feedback_enable=%u, feedback_url=%s, feedback_user_info=%s", - feedback_config->feedback_enable, - feedback_config->feedback_url == NULL ? "NULL" : feedback_config->feedback_url, - feedback_config->feedback_user_info == NULL ? - "NULL" : feedback_config->feedback_user_info); - - feedback_config->feedback_last_action = _NOTIFICATION_SEND_ERROR; - - return; - } - - /** - * Task runs nightly, from 2 AM to 4 AM - * - * If it's done in that time interval, it will be skipped - */ - - if (hour > 4 || hour < 2) - { - /* It's not the rigt time, mark it as to be done and return */ - feedback_config->feedback_last_action = _NOTIFICATION_SEND_PENDING; - - MXS_INFO("module_feedback_send(): execution skipped, current hour [%d]" - " is not within the proper interval (from 2 AM to 4 AM)", - hour); - - return; - } - - /* Time to run the task: if a previous run was succesfull skip next runs */ - if (feedback_config->feedback_last_action == _NOTIFICATION_SEND_OK) - { - /* task was done before, return */ - - MXS_INFO("module_feedback_send(): execution skipped because of previous " - "succesful run: hour is [%d], last_action [%d]", - hour, feedback_config->feedback_last_action); - - return; - } - - MXS_INFO("module_feedback_send(): task now runs: hour is [%d], last_action [%d]", - hour, feedback_config->feedback_last_action); - - if (!module_create_feedback_report(&buffer, modules_list, feedback_config)) - { - MXS_ERROR("Error in module_create_feedback_report(): gwbuf_alloc() failed to allocate memory"); - - feedback_config->feedback_last_action = _NOTIFICATION_SEND_ERROR; - - return; - } - - /* try sending data via http/https post */ - http_send = do_http_post(buffer, feedback_config); - - if (http_send == 0) - { - feedback_config->feedback_last_action = _NOTIFICATION_SEND_OK; - } - else - { - feedback_config->feedback_last_action = _NOTIFICATION_SEND_ERROR; - - MXS_INFO("Error in module_create_feedback_report(): do_http_post ret_code is %d", http_send); - } - - MXS_INFO("module_feedback_send(): task completed: hour is [%d], last_action [%d]", - hour, - feedback_config->feedback_last_action); - - gwbuf_free(buffer); - -} - -/** - * Create the feedback report as string. - * I t could be sent to notification service - * or just printed via maxadmin/telnet - * - * @param buffe The pointr for GWBUF allocation, to be freed by the caller - * @param modules The mouleds list - * @param cfg The feedback configuration - * @return 0 on failure, 1 on success - * - */ - -int -module_create_feedback_report(GWBUF **buffer, LOADED_MODULE *modules, FEEDBACK_CONF *cfg) -{ - LOADED_MODULE *ptr = modules; - int n_mod = 0; - char *data_ptr = NULL; - char hex_setup_info[2 * SHA_DIGEST_LENGTH + 1] = ""; - time_t now; - struct tm *now_tm; - int report_max_bytes = 0; - - if (buffer == NULL) - { - return 0; - } - - now = time(NULL); - - /* count loaded modules */ - while (ptr) - { - ptr = ptr->next; - n_mod++; - } - - /* module lists pointer is set back to the head */ - ptr = modules; - - /** - * allocate gwbuf for data to send - * - * each module gives 4 rows - * product and release rows add 7 rows - * row is _NOTIFICATION_REPORT_ROW_LEN bytes long - */ - - report_max_bytes = ((n_mod * 4) + 7) * (_NOTIFICATION_REPORT_ROW_LEN + 1); - *buffer = gwbuf_alloc(report_max_bytes); - - if (*buffer == NULL) - { - return 0; - } - - /* encode MAC-sha1 to HEX */ - gw_bin2hex(hex_setup_info, cfg->mac_sha1, SHA_DIGEST_LENGTH); - - data_ptr = (char *)GWBUF_DATA(*buffer); - - snprintf(data_ptr, _NOTIFICATION_REPORT_ROW_LEN, "FEEDBACK_SERVER_UID\t%s\n", hex_setup_info); - data_ptr += strlen(data_ptr); - snprintf(data_ptr, _NOTIFICATION_REPORT_ROW_LEN, "FEEDBACK_USER_INFO\t%s\n", - cfg->feedback_user_info == NULL ? "not_set" : cfg->feedback_user_info); - data_ptr += strlen(data_ptr); - snprintf(data_ptr, _NOTIFICATION_REPORT_ROW_LEN, "VERSION\t%s\n", MAXSCALE_VERSION); - data_ptr += strlen(data_ptr); - snprintf(data_ptr, _NOTIFICATION_REPORT_ROW_LEN * 2, "NOW\t%lu\nPRODUCT\t%s\n", now, "maxscale"); - data_ptr += strlen(data_ptr); - snprintf(data_ptr, _NOTIFICATION_REPORT_ROW_LEN, "Uname_sysname\t%s\n", cfg->sysname); - data_ptr += strlen(data_ptr); - snprintf(data_ptr, _NOTIFICATION_REPORT_ROW_LEN, "Uname_distribution\t%s\n", cfg->release_info); - data_ptr += strlen(data_ptr); - - while (ptr) - { - snprintf(data_ptr, _NOTIFICATION_REPORT_ROW_LEN * 2, - "module_%s_type\t%s\nmodule_%s_version\t%s\n", - ptr->module, ptr->type, ptr->module, ptr->version); - data_ptr += strlen(data_ptr); - - if (ptr->info) - { - snprintf(data_ptr, _NOTIFICATION_REPORT_ROW_LEN, "module_%s_api\t%d.%d.%d\n", - ptr->module, - ptr->info->api_version.major, - ptr->info->api_version.minor, - ptr->info->api_version.patch); - - data_ptr += strlen(data_ptr); - snprintf(data_ptr, _NOTIFICATION_REPORT_ROW_LEN, "module_%s_releasestatus\t%s\n", - ptr->module, - ptr->info->status == MXS_MODULE_IN_DEVELOPMENT - ? "In Development" - : (ptr->info->status == MXS_MODULE_ALPHA_RELEASE - ? "Alpha" - : (ptr->info->status == MXS_MODULE_BETA_RELEASE - ? "Beta" - : (ptr->info->status == MXS_MODULE_GA - ? "GA" - : (ptr->info->status == MXS_MODULE_EXPERIMENTAL - ? "Experimental" : "Unknown"))))); - data_ptr += strlen(data_ptr); - } - ptr = ptr->next; - } - - return 1; -} - -/** - * Send data to notification service via http/https - * - * @param buffer The GWBUF with data to send - * @param cfg The configuration details of notification service - * @return 0 on success, != 0 on failure - */ -int -do_http_post(GWBUF *buffer, void *cfg) -{ - CURL *curl = NULL; - CURLcode res; - struct curl_httppost *formpost = NULL; - struct curl_httppost *lastptr = NULL; - long http_code = 0; - struct MemoryStruct chunk; - int ret_code = 1; - - FEEDBACK_CONF *feedback_config = (FEEDBACK_CONF *) cfg; - - /* allocate first memory chunck for httpd servr reply */ - chunk.data = (char*)MXS_MALLOC(1); /* will be grown as needed by the realloc above */ - MXS_ABORT_IF_NULL(chunk.data); - chunk.size = 0; /* no data at this point */ - - /* Initializing curl library for data send via HTTP */ - curl_global_init(CURL_GLOBAL_DEFAULT); - - curl = curl_easy_init(); - - if (curl) - { - char error_message[CURL_ERROR_SIZE] = ""; - - curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, error_message); - curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1); - curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, feedback_config->feedback_connect_timeout); - curl_easy_setopt(curl, CURLOPT_TIMEOUT, feedback_config->feedback_timeout); - - /* curl API call for data send via HTTP POST using a "file" type input */ - curl_formadd(&formpost, - &lastptr, - CURLFORM_COPYNAME, "data", - CURLFORM_BUFFER, "report.txt", - CURLFORM_BUFFERPTR, (char *)GWBUF_DATA(buffer), - CURLFORM_BUFFERLENGTH, strlen((char *)GWBUF_DATA(buffer)), - CURLFORM_CONTENTTYPE, "text/plain", - CURLFORM_END); - - curl_easy_setopt(curl, CURLOPT_HEADER, 1); - - /* some servers don't like requests that are made without a user-agent field, so we provide one */ - curl_easy_setopt(curl, CURLOPT_USERAGENT, "MaxScale-agent/http-1.0"); - /* Force HTTP/1.0 */ - curl_easy_setopt(curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0); - - curl_easy_setopt(curl, CURLOPT_URL, feedback_config->feedback_url); - curl_easy_setopt(curl, CURLOPT_HTTPPOST, formpost); - - /* send all data to this function */ - curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteMemoryCallback); - - /* we pass our 'chunk' struct to the callback function */ - curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&chunk); - - /* Perform the request, res will get the return code */ - res = curl_easy_perform(curl); - - /* Check for errors */ - if (res != CURLE_OK) - { - ret_code = 2; - MXS_ERROR("do_http_post(), curl call for [%s] failed due: %s, %s", - feedback_config->feedback_url, - curl_easy_strerror(res), - error_message); - goto cleanup; - } - else - { - curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &http_code); - } - - if (http_code == 302) - { - char *from = strstr(chunk.data, "

ok

"); - if (from) - { - ret_code = 0; - } - else - { - ret_code = 3; - goto cleanup; - } - } - else - { - MXS_ERROR("do_http_post(), Bad HTTP Code from remote server: %lu", http_code); - ret_code = 4; - goto cleanup; - } - } - else - { - MXS_ERROR("do_http_post(), curl object not initialized"); - ret_code = 1; - goto cleanup; - } - - MXS_INFO("do_http_post() ret_code [%d], HTTP code [%ld]", - ret_code, http_code); -cleanup: - - if (chunk.data) - { - MXS_FREE(chunk.data); - } - - if (curl) - { - curl_easy_cleanup(curl); - curl_formfree(formpost); - } - - curl_global_cleanup(); - - return ret_code; -} - const MXS_MODULE *get_module(const char *name, const char *type) { LOADED_MODULE *mod = find_module(name); diff --git a/server/core/maxscale/modules.h b/server/core/maxscale/modules.h index f962543db..d87315ef7 100644 --- a/server/core/maxscale/modules.h +++ b/server/core/maxscale/modules.h @@ -14,21 +14,6 @@ /** * @file modules.h Utilities for loading modules - * - * The module interface used within the gateway - * - * @verbatim - * Revision History - * - * Date Who Description - * 13/06/13 Mark Riddoch Initial implementation - * 08/07/13 Mark Riddoch Addition of monitor modules - * 29/05/14 Mark Riddoch Addition of filter modules - * 01/10/14 Mark Riddoch Addition of call to unload all modules on shutdown - * 19/02/15 Mark Riddoch Addition of moduleGetList - * 26/02/15 Massimiliano Pinto Addition of module_feedback_send - * - * @endverbatim */ #include @@ -107,20 +92,6 @@ void dprintAllModules(DCB *); */ RESULTSET *moduleGetList(); -/** - * @brief Send loaded modules info to notification service - * - * @param data The configuration details of notification service - */ -void module_feedback_send(void*); - -/** - * @brief Show feedback report - * - * Prints the feedback report to a DCB - */ -void moduleShowFeedbackReport(DCB *dcb); - typedef struct mxs_module_iterator { const char* type; diff --git a/server/core/service.cc b/server/core/service.cc index 4fe793024..72a21013a 100644 --- a/server/core/service.cc +++ b/server/core/service.cc @@ -596,8 +596,6 @@ int service_launch_all() int n = 0, i; bool error = false; - config_enable_feedback_task(); - ptr = allServices; while (ptr && !ptr->svc_do_shutdown) { diff --git a/server/core/test/CMakeLists.txt b/server/core/test/CMakeLists.txt index e265a3cc8..0696b650d 100644 --- a/server/core/test/CMakeLists.txt +++ b/server/core/test/CMakeLists.txt @@ -18,7 +18,6 @@ add_executable(test_spinlock testspinlock.cc) add_executable(test_trxcompare testtrxcompare.cc ../../../query_classifier/test/testreader.cc) add_executable(test_trxtracking testtrxtracking.cc) add_executable(test_users testusers.cc) -add_executable(testfeedback testfeedback.cc) add_executable(testmaxscalepcre2 testmaxscalepcre2.cc) add_executable(testmodulecmd testmodulecmd.cc) add_executable(testconfig testconfig.cc) @@ -45,7 +44,6 @@ target_link_libraries(test_spinlock maxscale-common) target_link_libraries(test_trxcompare maxscale-common) target_link_libraries(test_trxtracking maxscale-common) target_link_libraries(test_users maxscale-common) -target_link_libraries(testfeedback maxscale-common) target_link_libraries(testmaxscalepcre2 maxscale-common) target_link_libraries(testmodulecmd maxscale-common) target_link_libraries(testconfig maxscale-common) @@ -86,11 +84,4 @@ add_test(TestTrxCompare_MaxScale test_trxcompare ${CMAKE_CURRENT_SOURCE_DIR}/../ add_test(TestJson testjson) add_test(TestHttp testhttp) -# This test requires external dependencies and thus cannot be run -# as a part of the core test set -if(TEST_FEEDBACK) - add_test(TestFeedback testfeedback) - set_tests_properties(TestFeedback PROPERTIES TIMEOUT 30) -endif() - add_subdirectory(rest-api) diff --git a/server/core/test/testfeedback.cc b/server/core/test/testfeedback.cc deleted file mode 100644 index de1dd8e0f..000000000 --- a/server/core/test/testfeedback.cc +++ /dev/null @@ -1,120 +0,0 @@ -/* - * Copyright (c) 2016 MariaDB Corporation Ab - * - * Use of this software is governed by the Business Source License included - * in the LICENSE.TXT file and at www.mariadb.com/bsl11. - * - * Change Date: 2020-01-01 - * - * On the date above, in accordance with the Business Source License, use - * of this software will be governed by version 2 or later of the General - * Public License. - */ - -/** - * - * @verbatim - * Revision History - * - * Date Who Description - * 09-03-2015 Markus Mäkelä Initial implementation - * 10-03-2015 Massimiliano Pinto Added http_check - * - * @endverbatim - */ - -// To ensure that ss_info_assert asserts also when builing in non-debug mode. -#if !defined(SS_DEBUG) -#define SS_DEBUG -#endif -#if defined(NDEBUG) -#undef NDEBUG -#endif -#define FAILTEST(s) printf("TEST FAILED: " s "\n");return 1; -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "../maxscale/config.h" - -#include "../load_utils.cc" - -static const char* server_options[] = -{ - "MariaDB Corporation MaxScale", - "--no-defaults", - "--datadir=.", - "--language=.", - "--skip-innodb", - "--default-storage-engine=myisam", - NULL -}; - -const int num_elements = (sizeof(server_options) / sizeof(char *)) - 1; - -static const char* server_groups[] = -{ - "embedded", - "server", - "server", - "embedded", - "server", - "server", - NULL -}; - -int main(int argc, char** argv) -{ - FEEDBACK_CONF* fc; - GWBUF* buf; - regex_t re; - char* home; - char* cnf; - - hkinit(); - - cnf = (char*)MXS_MALLOC(sizeof(char) * (strlen(TEST_DIR) + strlen("/maxscale.cnf") + 1)); - MXS_ABORT_IF_NULL(cnf); - sprintf(cnf, "%s/maxscale.cnf", TEST_DIR); - - printf("Config: %s\n", cnf); - - - if (mysql_library_init(num_elements, (char**)server_options, (char**)server_groups)) - { - FAILTEST("Failed to initialize embedded library."); - } - - config_load(cnf); - config_enable_feedback_task(); - if ((fc = config_get_feedback_data()) == NULL) - { - FAILTEST("Configuration for Feedback was NULL."); - } - - - regcomp(&re, fc->feedback_user_info, 0); - - module_create_feedback_report(&buf, NULL, fc); - - if (regexec(&re, (char*)buf->start, 0, NULL, 0)) - { - FAILTEST("Regex match of 'user_info' failed."); - } - - if (do_http_post(buf, fc) != 0) - { - FAILTEST("Http send failed\n"); - } - mysql_library_end(); - return 0; -} diff --git a/server/modules/routing/debugcli/debugcmd.c b/server/modules/routing/debugcli/debugcmd.c index 1f6dbb2f1..0acebfa1c 100644 --- a/server/modules/routing/debugcli/debugcmd.c +++ b/server/modules/routing/debugcli/debugcmd.c @@ -24,27 +24,6 @@ * * There are two "built in" commands, the help command and the quit * command. - * - * @verbatim - * Revision History - * - * Date Who Description - * 20/06/13 Mark Riddoch Initial implementation - * 17/07/13 Mark Riddoch Additional commands - * 09/08/13 Massimiliano Pinto Added enable/disable commands (now only for log) - * 20/05/14 Mark Riddoch Added ability to give server and service names rather - * than simply addresses - * 23/05/14 Mark Riddoch Added support for developer and user modes - * 29/05/14 Mark Riddoch Add Filter support - * 16/10/14 Mark Riddoch Add show eventq - * 05/03/15 Massimiliano Pinto Added enable/disable feedback - * 27/05/15 Martin Brampton Add show persistent [server] - * 06/11/15 Martin Brampton Add show buffers (conditional compilation) - * 23/05/16 Massimiliano Pinto 'add user' and 'remove user' - * no longer accept password parameter - * 27/06/16 Martin Brampton Modify to work with list manager sessions - * - * @endverbatim */ #include @@ -170,12 +149,6 @@ struct subcommand showoptions[] = "Usage: show eventstats", {0} }, - { - "feedbackreport", 0, 0, moduleShowFeedbackReport, - "Show the report of MaxScale loaded modules, suitable for Notification Service", - "Usage: show feedbackreport", - {0} - }, { "filter", 1, 1, dprintFilter, "Show filter details", @@ -723,8 +696,6 @@ static void enable_sess_log_priority(DCB *dcb, char *arg1, char *arg2); static void disable_sess_log_priority(DCB *dcb, char *arg1, char *arg2); static void enable_service_root(DCB *dcb, SERVICE *service); static void disable_service_root(DCB *dcb, SERVICE *service); -static void enable_feedback_action(); -static void disable_feedback_action(); static void enable_syslog(); static void disable_syslog(); static void enable_maxlog(); @@ -771,14 +742,6 @@ struct subcommand enableoptions[] = "Example: enable root my-service", {ARG_TYPE_SERVICE} }, - { - "feedback", - 0, 0, - enable_feedback_action, - "Enable MaxScale feedback to notification service", - "Usage: enable feedback", - {0} - }, { "syslog", 0, 0, @@ -854,14 +817,6 @@ struct subcommand disableoptions[] = "Example: disable root my-service", {ARG_TYPE_SERVICE} }, - { - "feedback", - 0, 0, - disable_feedback_action, - "Disable MaxScale feedback to notification service", - "Usage: disable feedback", - {0} - }, { "syslog", 0, 0, @@ -2550,29 +2505,6 @@ set_log_throttling(DCB *dcb, int count, int window_ms, int suppress_ms) } } -/** - * Re-enable sendig MaxScale module list via http - * Proper [feedback] section in MaxSclale.cnf - * is required. - */ -static void -enable_feedback_action(void) -{ - config_enable_feedback_task(); - return; -} - -/** - * Disable sendig MaxScale module list via http - */ - -static void -disable_feedback_action(void) -{ - config_disable_feedback_task(); - return; -} - /** * Enable syslog logging. */