/*
Run scripts in a directory with specific event arguments
Copyright (C) Amitay Isaacs 2017
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
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 for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, see .
*/
#ifndef __CTDB_RUN_EVENT_H__
#define __CTDB_RUN_EVENT_H__
#include
#include
#include "common/run_proc.h"
/**
* @file run_event.h
*
* @brief Run scripts in a directory with specific event arguments.
*
* This abstraction allows one to execute multiple scripts in a directory
* (specified by script_dir) with given event and arguments.
*
* At one time, only one event can be run. Multiple run_event calls
* will cause events to be queued up. They will be run sequentially.
*
* A "monitor" event is special and has special semantics.
*
* If a monitor event is running and another event is scheduled, the
* currently running monitor event is cancelled.
*
* If an event (not monitor) is running and monitor event is scheduled,
* then the monior event will be cancelled immediately.
*/
/**
* @brief The run process context
*/
struct run_event_context;
struct run_event_script {
char *name;
struct timeval begin, end;
struct run_proc_result result;
int summary;
char *output;
};
struct run_event_script_list {
uint32_t num_scripts;
struct run_event_script *script;
int summary;
};
/**
* @brief Initialize the context for running events
*
* @param[in] mem_ctx Talloc memory context
* @param[in] ev Tevent context
* @param[in] script_dir Directory containing script to run
* @param[in] debug_prog Path of a program to run if a script hangs
* @param[out] result New run_event context
* @return 0 on success, errno on error
*/
int run_event_init(TALLOC_CTX *mem_ctx, struct run_proc_context *run_proc_ctx,
const char *script_dir, const char *debug_prog,
struct run_event_context **result);
/**
* @brief Get a list of scripts
*
* @param[in] run_ctx Run_event context
* @param[in] mem_ctx Talloc memory context
* @param[out] output List of valid scripts
* @return 0 on success, errno on failure
*/
int run_event_list(struct run_event_context *run_ctx,
TALLOC_CTX *mem_ctx,
struct run_event_script_list **output);
/**
* @brief Enable a script
*
* @param[in] run_ctx Run_event context
* @param[in] script_name Name of the script to enable
* @return 0 on success, errno on failure
*/
int run_event_script_enable(struct run_event_context *run_ctx,
const char *script_name);
/**
* @brief Disable a script
*
* @param[in] run_ctx Run_event context
* @param[in] script_name Name of the script to disable
* @return 0 on success, errno on failure
*/
int run_event_script_disable(struct run_event_context *run_ctx,
const char *script_name);
/**
* @brief Async computation start to run an event
*
* @param[in] mem_ctx Talloc memory context
* @param[in] ev Tevent context
* @param[in] run_ctx Run_event context
* @param[in] event_str The event argument to the script
* @param[in] arg_str Event arguments to the script
* @param[in] timeout How long to wait for execution
* @param[in] continue_on_failure Whether to continue to run events on failure
* @return new tevent request, or NULL on failure
*
* arg_str contains optional arguments for an event.
*/
struct tevent_req *run_event_send(TALLOC_CTX *mem_ctx,
struct tevent_context *ev,
struct run_event_context *run_ctx,
const char *event_str,
const char *arg_str,
struct timeval timeout,
bool continue_on_failure);
/**
* @brief Async computation end to run an event
*
* @param[in] req Tevent request
* @param[out] perr errno in case of failure
* @param[in] mem_ctx Talloc memory context
* @param[out] output List of scripts executed and their status
* @return true on success, false on failure
*/
bool run_event_recv(struct tevent_req *req, int *perr,
TALLOC_CTX *mem_ctx,
struct run_event_script_list **output);
#endif /* __CTDB_RUN_EVENT_H__ */