38timespec_string(time_t sec,
long nsec,
bool show_usec) {
39 const struct timespec ts = {
68 return pcmk__s(history->
action,
"fencing");
84 switch (history->
state) {
86 case st_done:
return "successful";
87 default:
return "pending";
110 bool full_history,
const char *later_succeeded,
113 GString *str = g_string_sized_new(256);
114 char *completed_time_s = NULL;
117 completed_time_s = timespec_string(history->
completed,
134 g_string_append(str,
" last");
138 pcmk__add_word(&str, 0, state_str(history));
147 g_string_append(str,
": ");
163 if (completed_time_s != NULL) {
165 g_string_append(str,
", completed");
167 g_string_append(str,
", last-failed");
169 g_string_append(str,
", last-successful");
173 }
else if (completed_time_s != NULL) {
180 " (a later attempt from ", later_succeeded,
181 " succeeded)", NULL);
184 free(completed_time_s);
185 return g_string_free(str, FALSE);
188PCMK__OUTPUT_ARGS(
"failed-fencing-list",
"stonith_history_t *",
"GList *",
189 "uint32_t",
"uint32_t",
"bool")
194 GList *only_node = va_arg(args, GList *);
195 uint32_t section_opts = va_arg(args, uint32_t);
196 uint32_t show_opts = va_arg(args, uint32_t);
197 bool print_spacer = va_arg(args,
int);
211 out->message(out,
"stonith-event", hp,
214 out->increment_list(out);
221PCMK__OUTPUT_ARGS(
"fencing-list",
"stonith_history_t *",
"GList *",
"uint32_t",
227 GList *only_node = va_arg(args, GList *);
228 uint32_t section_opts = va_arg(args, uint32_t);
229 uint32_t show_opts = va_arg(args, uint32_t);
230 bool print_spacer = va_arg(args,
int);
241 out->message(out,
"stonith-event", hp,
242 pcmk_all_flags_set(section_opts,
245 out->increment_list(out);
253PCMK__OUTPUT_ARGS(
"full-fencing-list",
"crm_exit_t",
"stonith_history_t *",
254 "GList *",
"uint32_t",
"uint32_t",
"bool")
260 GList *only_node = va_arg(args, GList *);
261 uint32_t section_opts = va_arg(args, uint32_t);
262 uint32_t show_opts = va_arg(args, uint32_t);
263 bool print_spacer = va_arg(args,
int);
273 out->message(out,
"stonith-event", hp,
276 out->increment_list(out);
283PCMK__OUTPUT_ARGS(
"full-fencing-list",
"crm_exit_t",
"stonith_history_t *",
284 "GList *",
"uint32_t",
"uint32_t",
"bool")
290 GList *only_node = va_arg(args, GList *);
291 uint32_t section_opts = va_arg(args, uint32_t);
292 uint32_t show_opts = va_arg(args, uint32_t);
293 bool print_spacer G_GNUC_UNUSED = va_arg(args,
int);
297 if (history_rc == 0) {
304 out->message(out,
"stonith-event", hp,
305 pcmk_all_flags_set(section_opts,
308 out->increment_list(out);
313 char *rc_s = pcmk__itoa(history_rc);
326PCMK__OUTPUT_ARGS(
"last-fenced",
"const char *",
"time_t")
329 const char *
target = va_arg(args,
const char *);
330 time_t when = va_arg(args, time_t);
342PCMK__OUTPUT_ARGS(
"last-fenced",
"const char *",
"time_t")
345 const char *
target = va_arg(args,
const char *);
346 time_t when = va_arg(args, time_t);
357PCMK__OUTPUT_ARGS(
"last-fenced",
"const char *",
"time_t")
360 const char *
target = va_arg(args,
const char *);
361 time_t when = va_arg(args, time_t);
364 char *buf = timespec_string(when, 0,
false);
378PCMK__OUTPUT_ARGS(
"pending-fencing-list",
"stonith_history_t *",
"GList *",
379 "uint32_t",
"uint32_t",
"bool")
384 GList *only_node = va_arg(args, GList *);
385 uint32_t section_opts = va_arg(args, uint32_t);
386 uint32_t show_opts = va_arg(args, uint32_t);
387 bool print_spacer = va_arg(args,
int);
402 out->message(out,
"stonith-event", hp,
405 out->increment_list(out);
412PCMK__OUTPUT_ARGS(
"stonith-event",
"stonith_history_t *",
"bool",
"bool",
413 "const char *",
"uint32_t")
418 bool full_history = va_arg(args,
int);
419 bool completed_only G_GNUC_UNUSED = va_arg(args,
int);
420 const char *succeeded = va_arg(args,
const char *);
421 uint32_t show_opts = va_arg(args, uint32_t);
426 switch(event->state) {
428 out->list_item(out,
"successful-stonith-event",
"%s", desc);
432 out->list_item(out,
"failed-stonith-event",
"%s", desc);
436 out->list_item(out,
"pending-stonith-event",
"%s", desc);
443PCMK__OUTPUT_ARGS(
"stonith-event",
"stonith_history_t *",
"bool",
"bool",
444 "const char *",
"uint32_t")
449 bool full_history = va_arg(args,
int);
450 bool completed_only = va_arg(args,
int);
451 const char *succeeded = va_arg(args,
const char *);
452 uint32_t show_opts = va_arg(args, uint32_t);
454 if (completed_only) {
467PCMK__OUTPUT_ARGS(
"stonith-event",
"stonith_history_t *",
"bool",
"bool",
468 "const char *",
"uint32_t")
473 bool full_history G_GNUC_UNUSED = va_arg(args,
int);
474 bool completed_only G_GNUC_UNUSED = va_arg(args,
int);
475 const char *succeeded G_GNUC_UNUSED = va_arg(args,
const char *);
476 uint32_t show_opts G_GNUC_UNUSED = va_arg(args, uint32_t);
478 xmlNodePtr node = NULL;
487 switch (event->state) {
500 char *state = pcmk__itoa(event->state);
510 if (event->delegate != NULL) {
515 char *time_s = timespec_string(event->completed, event->completed_nsec,
525PCMK__OUTPUT_ARGS(
"validate",
"const char *",
"const char *",
"const char *",
526 "const char *",
"int")
529 const char *agent = va_arg(args,
const char *);
530 const char *device = va_arg(args,
const char *);
531 const char *output = va_arg(args,
const char *);
532 const char *error_output = va_arg(args,
const char *);
533 int rc = va_arg(args,
int);
537 rc ?
"failed" :
"succeeded");
542 rc ?
"failed" :
"succeeded");
547 out->subprocess_output(out, rc, output, error_output);
551PCMK__OUTPUT_ARGS(
"validate",
"const char *",
"const char *",
"const char *",
552 "const char *",
"int")
555 const char *agent = va_arg(args,
const char *);
556 const char *device = va_arg(args,
const char *);
557 const char *output = va_arg(args,
const char *);
558 const char *error_output = va_arg(args,
const char *);
559 int rc = va_arg(args,
int);
563 rc ?
"failed" :
"succeeded");
566 rc ?
"failed" :
"succeeded");
569 out->subprocess_output(out, rc, output, error_output);
573PCMK__OUTPUT_ARGS(
"validate",
"const char *",
"const char *",
"const char *",
574 "const char *",
"int")
577 const char *agent = va_arg(args,
const char *);
578 const char *device = va_arg(args,
const char *);
579 const char *output = va_arg(args,
const char *);
580 const char *error_output = va_arg(args,
const char *);
581 int rc = va_arg(args,
int);
583 const char *valid = pcmk__btoa(rc ==
pcmk_ok);
589 if (device != NULL) {
594 out->subprocess_output(out, rc, output, error_output);
601 {
"failed-fencing-list",
"default", failed_history },
602 {
"fencing-list",
"default", stonith_history },
603 {
"full-fencing-list",
"default", full_history },
604 {
"full-fencing-list",
"xml", full_history_xml },
605 {
"last-fenced",
"html", last_fenced_html },
606 {
"last-fenced",
"log", last_fenced_text },
607 {
"last-fenced",
"text", last_fenced_text },
608 {
"last-fenced",
"xml", last_fenced_xml },
609 {
"pending-fencing-list",
"default", pending_actions },
610 {
"stonith-event",
"html", stonith_event_html },
611 {
"stonith-event",
"log", stonith_event_text },
612 {
"stonith-event",
"text", stonith_event_text },
613 {
"stonith-event",
"xml", stonith_event_xml },
614 {
"validate",
"html", validate_agent_html },
615 {
"validate",
"log", validate_agent_text },
616 {
"validate",
"text", validate_agent_text },
617 {
"validate",
"xml", validate_agent_xml },
#define pcmk_is_set(g, f)
Convenience alias for pcmk_all_flags_set(), to check single flag.
const char * stonith__later_succeeded(const stonith_history_t *event, const stonith_history_t *top_history)
#define crm_time_log_timeofday
#define crm_time_log_with_timezone
#define crm_time_log_date
char * pcmk__timespec2str(const struct timespec *ts, uint32_t flags)
#define PCMK_VALUE_SUCCESS
#define PCMK_VALUE_PENDING
#define PCMK_VALUE_FAILED
Control output from tools.
@ pcmk_show_failed_detail
#define pcmk_section_fencing_all
Formatted output for pacemaker tools.
void pcmk__output_xml_pop_parent(pcmk__output_t *out)
void pcmk__output_xml_push_parent(pcmk__output_t *out, xmlNodePtr parent)
void pcmk__register_messages(pcmk__output_t *out, const pcmk__message_entry_t *table)
#define PCMK__OUTPUT_LIST_HEADER(out_obj, cond, retcode, title...)
xmlNodePtr pcmk__output_create_html_node(pcmk__output_t *out, const char *element_name, const char *id, const char *class_name, const char *text)
void pcmk__indented_printf(pcmk__output_t *out, const char *format,...) G_GNUC_PRINTF(2
xmlNodePtr pcmk__output_create_xml_node(pcmk__output_t *out, const char *name,...) G_GNUC_NULL_TERMINATED
void void void pcmk__formatted_printf(pcmk__output_t *out, const char *format,...) G_GNUC_PRINTF(2
#define PCMK__OUTPUT_LIST_FOOTER(out_obj, retcode)
enum crm_exit_e crm_exit_t
Exit status codes for tools and daemons.
gchar * stonith__history_description(const stonith_history_t *history, bool full_history, const char *later_succeeded, uint32_t show_opts)
void stonith__register_messages(pcmk__output_t *out)
char * crm_strdup_printf(char const *format,...) G_GNUC_PRINTF(1
gboolean pcmk__str_in_list(const gchar *s, const GList *lst, uint32_t flags)
void pcmk__g_strcat(GString *buffer,...) G_GNUC_NULL_TERMINATED
This structure contains everything that makes up a single output formatter.
struct stonith_history_s * next
Wrappers for and extensions to libxml2.
const char * crm_xml_add(xmlNode *node, const char *name, const char *value)
Create an XML attribute with specified name and value.
void pcmk__xe_set_props(xmlNodePtr node,...) G_GNUC_NULL_TERMINATED
#define PCMK_XA_EXTENDED_STATUS
#define PCMK_XE_FENCE_EVENT
#define PCMK_XA_EXIT_REASON
#define PCMK_XE_LAST_FENCED
#define PCMK_XE_FENCE_HISTORY
#define PCMK_XA_COMPLETED