Remove MODULECMD_ARG_OUTPUT argument type

Since the module command interface was expanded to include a JSON output
parameter, there is no longer a need for an output DCB. As the JSON can be
printed by both maxadmin and the REST API, this allows the removal of
explicit output formatting in module commands.
This commit is contained in:
Markus Mäkelä
2017-09-28 13:55:45 +03:00
parent da648387dd
commit 14d8b6a0df
9 changed files with 32 additions and 115 deletions

View File

@ -360,12 +360,6 @@ struct cb_param
bool modulecmd_cb(const MODULECMD *cmd, void *data)
{
if (modulecmd_requires_output_dcb(cmd))
{
/** Module requires an output DCB, don't print it */
return true;
}
cb_param* d = static_cast<cb_param*>(data);
json_t* obj = json_object();

View File

@ -358,12 +358,6 @@ static bool process_argument(const MODULECMD *cmd, modulecmd_arg_type_t *type, c
}
break;
case MODULECMD_ARG_OUTPUT:
arg->type.type = MODULECMD_ARG_OUTPUT;
arg->value.dcb = (DCB*)value;
rval = true;
break;
default:
ss_dassert(false);
MXS_ERROR("Undefined argument type: %0lx", type->type);
@ -713,10 +707,6 @@ const char* modulecmd_argtype_to_str(modulecmd_arg_type_t *type)
rval = format_type(type, "FILTER");
break;
case MODULECMD_ARG_OUTPUT:
rval = format_type(type, "OUTPUT");
break;
default:
ss_dassert(false);
MXS_ERROR("Unknown type");
@ -731,17 +721,3 @@ bool modulecmd_arg_is_present(const MODULECMD_ARG *arg, int idx)
return arg->argc > idx &&
MODULECMD_GET_TYPE(&arg->argv[idx].type) != MODULECMD_ARG_NONE;
}
bool modulecmd_requires_output_dcb(const MODULECMD* cmd)
{
for (int i = 0; i < cmd->arg_count_max; i++)
{
if (cmd->arg_types[i].type == MODULECMD_ARG_OUTPUT)
{
/** We can't call this as it requries a DCB for output so don't show it */
return true;
}
}
return false;
}

View File

@ -638,7 +638,7 @@ HttpResponse cb_modulecmd(const HttpRequest& request)
const MODULECMD* cmd = modulecmd_find_command(module.c_str(), identifier.c_str());
if (cmd && !modulecmd_requires_output_dcb(cmd))
if (cmd)
{
if ((!MODULECMD_MODIFIES_DATA(cmd) && verb == MHD_HTTP_METHOD_GET) ||
(MODULECMD_MODIFIES_DATA(cmd) && verb == MHD_HTTP_METHOD_POST))

View File

@ -90,18 +90,14 @@ void cache_config_reset(CACHE_CONFIG& config)
*/
bool cache_command_show(const MODULECMD_ARG* pArgs, json_t** output)
{
ss_dassert(pArgs->argc == 2);
ss_dassert(MODULECMD_GET_TYPE(&pArgs->argv[0].type) == MODULECMD_ARG_OUTPUT);
ss_dassert(pArgs->argc == 1);
ss_dassert(MODULECMD_GET_TYPE(&pArgs->argv[1].type) == MODULECMD_ARG_FILTER);
DCB* pDcb = pArgs->argv[0].value.dcb;
ss_dassert(pDcb);
const MXS_FILTER_DEF* pFilterDef = pArgs->argv[1].value.filter;
ss_dassert(pFilterDef);
CacheFilter* pFilter = reinterpret_cast<CacheFilter*>(filter_def_get_instance(pFilterDef));
MXS_EXCEPTION_GUARD(pFilter->cache().show(pDcb));
MXS_EXCEPTION_GUARD(*output = pFilter->cache().show_json());
return true;
}
@ -146,7 +142,6 @@ extern "C" MXS_MODULE* MXS_CREATE_MODULE()
{
static modulecmd_arg_type_t show_argv[] =
{
{ MODULECMD_ARG_OUTPUT, "The output dcb" },
{ MODULECMD_ARG_FILTER | MODULECMD_ARG_NAME_MATCHES_DOMAIN, "Cache name" }
};

View File

@ -78,6 +78,7 @@
#include <maxscale/pcre2.h>
#include <maxscale/alloc.h>
#include <maxscale/spinlock.hh>
#include <maxscale/utils.h>
#include "rules.hh"
#include "user.hh"
@ -499,27 +500,17 @@ MXS_MODULE* MXS_CREATE_MODULE()
};
modulecmd_register_command(MXS_MODULE_NAME, "rules/reload", MODULECMD_TYPE_ACTIVE,
dbfw_reload_rules, 2, args_rules_reload,
"Reload dbfwfilter rules");
modulecmd_arg_type_t args_rules_show[] =
{
{MODULECMD_ARG_OUTPUT, "DCB where result is written"},
{MODULECMD_ARG_FILTER | MODULECMD_ARG_NAME_MATCHES_DOMAIN, "Filter to inspect"}
};
modulecmd_register_command(MXS_MODULE_NAME, "rules", MODULECMD_TYPE_PASSIVE,
dbfw_show_rules, 2, args_rules_show,
"(deprecated) Show dbfwfilter rule statistics");
dbfw_reload_rules, MXS_ARRAY_NELEMS(args_rules_reload),
args_rules_reload, "Reload dbfwfilter rules");
modulecmd_arg_type_t args_rules_show_json[] =
{
{MODULECMD_ARG_FILTER | MODULECMD_ARG_NAME_MATCHES_DOMAIN, "Filter to inspect"}
};
modulecmd_register_command(MXS_MODULE_NAME, "rules/json", MODULECMD_TYPE_PASSIVE,
dbfw_show_rules_json, 1, args_rules_show_json,
"Show dbfwfilter rule statistics as JSON");
modulecmd_register_command(MXS_MODULE_NAME, "rules", MODULECMD_TYPE_PASSIVE,
dbfw_show_rules_json, MXS_ARRAY_NELEMS(args_rules_show_json),
args_rules_show_json, "Show dbfwfilter rule statistics");
static MXS_MODULE info =
{

View File

@ -14,6 +14,7 @@
#define MXS_MODULE_NAME "masking"
#include "maskingfilter.hh"
#include <maxscale/json_api.h>
#include <maxscale/modulecmd.h>
#include <maxscale/paths.h>
#include <maxscale/utils.h>
@ -37,20 +38,23 @@ char VERSION_STRING[] = "V1.0.0";
*/
bool masking_command_reload(const MODULECMD_ARG* pArgs, json_t** output)
{
ss_dassert(pArgs->argc == 2);
ss_dassert(MODULECMD_GET_TYPE(&pArgs->argv[0].type) == MODULECMD_ARG_OUTPUT);
ss_dassert(pArgs->argc == 1);
ss_dassert(MODULECMD_GET_TYPE(&pArgs->argv[1].type) == MODULECMD_ARG_FILTER);
DCB* pDcb = pArgs->argv[0].value.dcb;
ss_dassert(pDcb);
const MXS_FILTER_DEF* pFilterDef = pArgs->argv[1].value.filter;
ss_dassert(pFilterDef);
MaskingFilter* pFilter = reinterpret_cast<MaskingFilter*>(filter_def_get_instance(pFilterDef));
MXS_EXCEPTION_GUARD(pFilter->reload(pDcb));
bool rv = false;
MXS_EXCEPTION_GUARD(rv = pFilter->reload());
return true;
if (!rv)
{
modulecmd_set_error("Could not reload the rules. Check the log file "
"for more detailed information.");
}
return rv;
}
}
@ -63,7 +67,6 @@ extern "C" MXS_MODULE* MXS_CREATE_MODULE()
{
static modulecmd_arg_type_t reload_argv[] =
{
{ MODULECMD_ARG_OUTPUT, "The output dcb" },
{ MODULECMD_ARG_FILTER | MODULECMD_ARG_NAME_MATCHES_DOMAIN, "Masking name" }
};
@ -168,19 +171,16 @@ std::tr1::shared_ptr<MaskingRules> MaskingFilter::rules() const
return m_sRules;
}
void MaskingFilter::reload(DCB* pOut)
bool MaskingFilter::reload()
{
bool rval = false;
auto_ptr<MaskingRules> sRules = MaskingRules::load(m_config.rules().c_str());
if (sRules.get())
{
m_sRules = sRules;
rval = true;
}
dcb_printf(pOut, "Rules reloaded.\n");
}
else
{
dcb_printf(pOut, "Could not reload the rules. Check the log file for more "
"detailed information.\n");
}
return rval;
}

View File

@ -38,7 +38,7 @@ public:
uint64_t getCapabilities();
void reload(DCB* pOut);
bool reload();
const Config& config() const
{

View File

@ -303,13 +303,9 @@ bool listfuncs_cb(const MODULECMD *cmd, void *data)
for (int i = 0; i < cmd->arg_count_max; i++)
{
modulecmd_arg_type_t *type = &cmd->arg_types[i];
if (MODULECMD_GET_TYPE(type) != MODULECMD_ARG_OUTPUT)
{
dcb_printf(dcb, "%s%s",
modulecmd_argtype_to_str(&cmd->arg_types[i]),
i < cmd->arg_count_max - 1 ? " " : "");
}
dcb_printf(dcb, "%s%s",
modulecmd_argtype_to_str(&cmd->arg_types[i]),
i < cmd->arg_count_max - 1 ? " " : "");
}
dcb_printf(dcb, "\n\n");
@ -317,13 +313,9 @@ bool listfuncs_cb(const MODULECMD *cmd, void *data)
for (int i = 0; i < cmd->arg_count_max; i++)
{
modulecmd_arg_type_t *type = &cmd->arg_types[i];
if (MODULECMD_GET_TYPE(type) != MODULECMD_ARG_OUTPUT)
{
dcb_printf(dcb, " %s - %s\n",
modulecmd_argtype_to_str(&cmd->arg_types[i]),
cmd->arg_types[i].description);
}
dcb_printf(dcb, " %s - %s\n",
modulecmd_argtype_to_str(&cmd->arg_types[i]),
cmd->arg_types[i].description);
}
dcb_printf(dcb, "\n");
@ -1662,12 +1654,6 @@ struct subcommand alteroptions[] =
}
};
static inline bool requires_output_dcb(const MODULECMD *cmd)
{
modulecmd_arg_type_t *type = &cmd->arg_types[0];
return cmd->arg_count_max > 0 && MODULECMD_GET_TYPE(type) == MODULECMD_ARG_OUTPUT;
}
static void callModuleCommand(DCB *dcb, char *domain, char *id, char *v3,
char *v4, char *v5, char *v6, char *v7, char *v8, char *v9,
char *v10, char *v11, char *v12)
@ -1685,18 +1671,6 @@ static void callModuleCommand(DCB *dcb, char *domain, char *id, char *v3,
if (cmd)
{
if (requires_output_dcb(cmd))
{
/** The command requires a DCB for output, add the client DCB
* as the first argument */
for (int i = valuelen - 1; i > 0; i--)
{
values[i] = values[i - 1];
}
values[0] = dcb;
numargs += numargs + 1 < valuelen - 1 ? 1 : 0;
}
MODULECMD_ARG *arg = modulecmd_arg_parse(cmd, numargs, values);
if (arg)