MXS-1441 Expose monitor_launch_command

So that a specific monitor may create the command and replace
monitor specific script variables before giving the command
for execution.
This commit is contained in:
Johan Wikman 2017-10-03 10:32:42 +03:00
parent 8d1c4bdd56
commit cf0a87e7f2
2 changed files with 36 additions and 15 deletions

View File

@ -17,6 +17,7 @@
*/
#include <maxscale/monitor.h>
#include "externcmd.h"
MXS_BEGIN_DECLS
@ -104,4 +105,17 @@ MXS_MONITOR* monitor_server_in_use(const SERVER *server);
*/
int monitor_launch_script(MXS_MONITOR* mon, MXS_MONITORED_SERVER* ptr, const char* script, uint32_t timeout);
/**
* Launch a command
*
* @param mon Owning monitor
* @param ptr The server which has changed state
* @param cmd The command to execute.
*
* @note All default script variables will be replaced.
*
* @return Return value of the executed script or -1 on error.
*/
int monitor_launch_command(MXS_MONITOR* mon, MXS_MONITORED_SERVER* ptr, EXTERNCMD* cmd);
MXS_END_DECLS

View File

@ -1235,20 +1235,8 @@ static std::string child_nodes(MXS_MONITORED_SERVER* servers,
return ss.str();
}
int monitor_launch_script(MXS_MONITOR* mon, MXS_MONITORED_SERVER* ptr, const char* script, uint32_t timeout)
int monitor_launch_command(MXS_MONITOR* mon, MXS_MONITORED_SERVER* ptr, EXTERNCMD* cmd)
{
char arg[strlen(script) + 1];
strcpy(arg, script);
EXTERNCMD* cmd = externcmd_allocate(arg, timeout);
if (cmd == NULL)
{
MXS_ERROR("Failed to initialize script '%s'. See previous errors for the "
"cause of this failure.", script);
return -1;
}
if (externcmd_matches(cmd, "$INITIATOR"))
{
char initiator[strlen(ptr->server->name) + 24]; // Extra space for port
@ -1325,13 +1313,13 @@ int monitor_launch_script(MXS_MONITOR* mon, MXS_MONITORED_SERVER* ptr, const cha
{
// Internal error
MXS_ERROR("Failed to execute script '%s' on server state change event '%s'",
script, mon_get_event_name(ptr));
cmd->argv[0], mon_get_event_name(ptr));
}
else
{
// Script returned a non-zero value
MXS_ERROR("Script '%s' returned %d on event '%s'",
script, rv, mon_get_event_name(ptr));
cmd->argv[0], rv, mon_get_event_name(ptr));
}
}
else
@ -1382,6 +1370,25 @@ int monitor_launch_script(MXS_MONITOR* mon, MXS_MONITORED_SERVER* ptr, const cha
}
}
return rv;
}
int monitor_launch_script(MXS_MONITOR* mon, MXS_MONITORED_SERVER* ptr, const char* script, uint32_t timeout)
{
char arg[strlen(script) + 1];
strcpy(arg, script);
EXTERNCMD* cmd = externcmd_allocate(arg, timeout);
if (cmd == NULL)
{
MXS_ERROR("Failed to initialize script '%s'. See previous errors for the "
"cause of this failure.", script);
return -1;
}
int rv = monitor_launch_command(mon, ptr, cmd);
externcmd_free(cmd);
return rv;