dhodovsk / source-git / pacemaker

Forked from source-git/pacemaker 3 years ago
Clone

Blame tools/crm_mon_output.c

rpm-build 3ee90c
/*
rpm-build 3ee90c
 * Copyright 2019 the Pacemaker project contributors
rpm-build 3ee90c
 *
rpm-build 3ee90c
 * The version control history for this file may have further details.
rpm-build 3ee90c
 *
rpm-build 3ee90c
 * This source code is licensed under the GNU General Public License version 2
rpm-build 3ee90c
 * or later (GPLv2+) WITHOUT ANY WARRANTY.
rpm-build 3ee90c
 */
rpm-build 3ee90c
rpm-build 3ee90c
#include <glib.h>
rpm-build 3ee90c
#include <stdarg.h>
rpm-build 3ee90c
rpm-build 3ee90c
#include <crm/stonith-ng.h>
rpm-build 3ee90c
#include <crm/common/iso8601.h>
rpm-build 3ee90c
#include <crm/common/iso8601_internal.h>
rpm-build 3ee90c
#include <crm/common/output.h>
rpm-build 3ee90c
#include <crm/common/util.h>
rpm-build 3ee90c
#include <crm/common/xml.h>
rpm-build 3ee90c
#include <crm/common/internal.h>
rpm-build 3ee90c
#include <crm/pengine/internal.h>
rpm-build 3ee90c
#include <crm/msg_xml.h>
rpm-build 3ee90c
#include <crm/pengine/pe_types.h>
rpm-build 3ee90c
rpm-build 3ee90c
#include "crm_mon.h"
rpm-build 3ee90c
rpm-build 3ee90c
static char *
rpm-build 3ee90c
time_t_string(time_t when) {
rpm-build 3ee90c
    crm_time_t *crm_when = crm_time_new(NULL);
rpm-build 3ee90c
    char *buf = NULL;
rpm-build 3ee90c
rpm-build 3ee90c
    crm_time_set_timet(crm_when, &when);
rpm-build 3ee90c
    buf = crm_time_as_string(crm_when, crm_time_log_date | crm_time_log_timeofday | crm_time_log_with_timezone);
rpm-build 3ee90c
    crm_time_free(crm_when);
rpm-build 3ee90c
    return buf;
rpm-build 3ee90c
}
rpm-build 3ee90c
rpm-build 3ee90c
static char *
rpm-build 3ee90c
failed_action_string(xmlNodePtr xml_op) {
rpm-build 3ee90c
    const char *op_key = crm_element_value(xml_op, XML_LRM_ATTR_TASK_KEY);
rpm-build 3ee90c
    int rc = crm_parse_int(crm_element_value(xml_op, XML_LRM_ATTR_RC), "0");
rpm-build 3ee90c
    int status = crm_parse_int(crm_element_value(xml_op, XML_LRM_ATTR_OPSTATUS), "0");
rpm-build 3ee90c
    const char *exit_reason = crm_element_value(xml_op, XML_LRM_ATTR_EXIT_REASON);
rpm-build 3ee90c
rpm-build 3ee90c
    time_t last_change = 0;
rpm-build 3ee90c
    
rpm-build 3ee90c
    if (crm_element_value_epoch(xml_op, XML_RSC_OP_LAST_CHANGE,
rpm-build 3ee90c
                                &last_change) == pcmk_ok) {
rpm-build 3ee90c
        char *time = time_t_string(last_change);
rpm-build 3ee90c
        char *buf = crm_strdup_printf("%s on %s '%s' (%d): call=%s, status='%s', exitreason='%s', last-rc-change='%s', queued=%sms, exec=%sms",
rpm-build 3ee90c
                                      op_key ? op_key : ID(xml_op),
rpm-build 3ee90c
                                      crm_element_value(xml_op, XML_ATTR_UNAME),
rpm-build 3ee90c
                                      services_ocf_exitcode_str(rc), rc,
rpm-build 3ee90c
                                      crm_element_value(xml_op, XML_LRM_ATTR_CALLID),
rpm-build 3ee90c
                                      services_lrm_status_str(status),
rpm-build 3ee90c
                                      exit_reason ? exit_reason : "none",
rpm-build 3ee90c
                                      time,
rpm-build 3ee90c
                                      crm_element_value(xml_op, XML_RSC_OP_T_QUEUE),
rpm-build 3ee90c
                                      crm_element_value(xml_op, XML_RSC_OP_T_EXEC));
rpm-build 3ee90c
rpm-build 3ee90c
        free(time);
rpm-build 3ee90c
        return buf;
rpm-build 3ee90c
    } else {
rpm-build 3ee90c
        return crm_strdup_printf("%s on %s '%s' (%d): call=%s, status=%s, exitreason='%s'",
rpm-build 3ee90c
                                 op_key ? op_key : ID(xml_op),
rpm-build 3ee90c
                                 crm_element_value(xml_op, XML_ATTR_UNAME),
rpm-build 3ee90c
                                 services_ocf_exitcode_str(rc), rc,
rpm-build 3ee90c
                                 crm_element_value(xml_op, XML_LRM_ATTR_CALLID),
rpm-build 3ee90c
                                 services_lrm_status_str(status),
rpm-build 3ee90c
                                 exit_reason ? exit_reason : "none");
rpm-build 3ee90c
    }
rpm-build 3ee90c
}
rpm-build 3ee90c
rpm-build 3ee90c
static char *
rpm-build 3ee90c
last_changed_string(const char *last_written, const char *user,
rpm-build 3ee90c
                    const char *client, const char *origin) {
rpm-build 3ee90c
    if (last_written != NULL || user != NULL || client != NULL || origin != NULL) {
rpm-build 3ee90c
        return crm_strdup_printf("%s%s%s%s%s%s%s",
rpm-build 3ee90c
                                 last_written ? last_written : "",
rpm-build 3ee90c
                                 user ? " by " : "",
rpm-build 3ee90c
                                 user ? user : "",
rpm-build 3ee90c
                                 client ? " via " : "",
rpm-build 3ee90c
                                 client ? client : "",
rpm-build 3ee90c
                                 origin ? " on " : "",
rpm-build 3ee90c
                                 origin ? origin : "");
rpm-build 3ee90c
    } else {
rpm-build 3ee90c
        return strdup("");
rpm-build 3ee90c
    }
rpm-build 3ee90c
}
rpm-build 3ee90c
rpm-build 3ee90c
static char *
rpm-build 3ee90c
op_history_string(xmlNode *xml_op, const char *task, const char *interval_ms_s,
rpm-build 3ee90c
                  int rc, unsigned int mon_ops) {
rpm-build 3ee90c
    const char *call = crm_element_value(xml_op, XML_LRM_ATTR_CALLID);
rpm-build 3ee90c
    char *interval_str = NULL;
rpm-build 3ee90c
    char *buf = NULL;
rpm-build 3ee90c
rpm-build 3ee90c
    if (interval_ms_s && safe_str_neq(interval_ms_s, "0")) {
rpm-build 3ee90c
        char *pair = pcmk_format_nvpair("interval", interval_ms_s, "ms");
rpm-build 3ee90c
        interval_str = crm_strdup_printf(" %s", pair);
rpm-build 3ee90c
        free(pair);
rpm-build 3ee90c
    }
rpm-build 3ee90c
rpm-build 3ee90c
    if (is_set(mon_ops, mon_op_print_timing)) {
rpm-build 3ee90c
        char *last_change_str = NULL;
rpm-build 3ee90c
        char *last_run_str = NULL;
rpm-build 3ee90c
        char *exec_str = NULL;
rpm-build 3ee90c
        char *queue_str = NULL;
rpm-build 3ee90c
rpm-build 3ee90c
        const char *value = NULL;
rpm-build 3ee90c
rpm-build 3ee90c
        time_t epoch = 0;
rpm-build 3ee90c
rpm-build 3ee90c
        if ((crm_element_value_epoch(xml_op, XML_RSC_OP_LAST_CHANGE, &epoch) == pcmk_ok)
rpm-build 3ee90c
            && (epoch > 0)) {
rpm-build 3ee90c
            char *time = pcmk_format_named_time(XML_RSC_OP_LAST_CHANGE, epoch);
rpm-build 3ee90c
            last_change_str = crm_strdup_printf(" %s", time);
rpm-build 3ee90c
            free(time);
rpm-build 3ee90c
        }
rpm-build 3ee90c
rpm-build 3ee90c
        if ((crm_element_value_epoch(xml_op, XML_RSC_OP_LAST_RUN, &epoch) == pcmk_ok)
rpm-build 3ee90c
            && (epoch > 0)) {
rpm-build 3ee90c
            char *time = pcmk_format_named_time(XML_RSC_OP_LAST_RUN, epoch);
rpm-build 3ee90c
            last_run_str = crm_strdup_printf(" %s", time);
rpm-build 3ee90c
            free(time);
rpm-build 3ee90c
        }
rpm-build 3ee90c
rpm-build 3ee90c
        value = crm_element_value(xml_op, XML_RSC_OP_T_EXEC);
rpm-build 3ee90c
        if (value) {
rpm-build 3ee90c
            char *pair = pcmk_format_nvpair(XML_RSC_OP_T_EXEC, value, "ms");
rpm-build 3ee90c
            exec_str = crm_strdup_printf(" %s", pair);
rpm-build 3ee90c
            free(pair);
rpm-build 3ee90c
        }
rpm-build 3ee90c
rpm-build 3ee90c
        value = crm_element_value(xml_op, XML_RSC_OP_T_QUEUE);
rpm-build 3ee90c
        if (value) {
rpm-build 3ee90c
            char *pair = pcmk_format_nvpair(XML_RSC_OP_T_QUEUE, value, "ms");
rpm-build 3ee90c
            queue_str = crm_strdup_printf(" %s", pair);
rpm-build 3ee90c
            free(pair);
rpm-build 3ee90c
        }
rpm-build 3ee90c
rpm-build 3ee90c
        buf = crm_strdup_printf("(%s) %s:%s%s%s%s%s rc=%d (%s)", call, task,
rpm-build 3ee90c
                                interval_str ? interval_str : "",
rpm-build 3ee90c
                                last_change_str ? last_change_str : "",
rpm-build 3ee90c
                                last_run_str ? last_run_str : "",
rpm-build 3ee90c
                                exec_str ? exec_str : "",
rpm-build 3ee90c
                                queue_str ? queue_str : "",
rpm-build 3ee90c
                                rc, services_ocf_exitcode_str(rc));
rpm-build 3ee90c
rpm-build 3ee90c
        if (last_change_str) {
rpm-build 3ee90c
            free(last_change_str);
rpm-build 3ee90c
        }
rpm-build 3ee90c
rpm-build 3ee90c
        if (last_run_str) {
rpm-build 3ee90c
            free(last_run_str);
rpm-build 3ee90c
        }
rpm-build 3ee90c
rpm-build 3ee90c
        if (exec_str) {
rpm-build 3ee90c
            free(exec_str);
rpm-build 3ee90c
        }
rpm-build 3ee90c
rpm-build 3ee90c
        if (queue_str) {
rpm-build 3ee90c
            free(queue_str);
rpm-build 3ee90c
        }
rpm-build 3ee90c
    } else {
rpm-build 3ee90c
        buf = crm_strdup_printf("(%s) %s:%s", call, task,
rpm-build 3ee90c
                                interval_str ? interval_str : "");
rpm-build 3ee90c
    }
rpm-build 3ee90c
rpm-build 3ee90c
    if (interval_str) {
rpm-build 3ee90c
        free(interval_str);
rpm-build 3ee90c
    }
rpm-build 3ee90c
rpm-build 3ee90c
    return buf;
rpm-build 3ee90c
}
rpm-build 3ee90c
rpm-build 3ee90c
static char *
rpm-build 3ee90c
resource_history_string(resource_t *rsc, const char *rsc_id, gboolean all,
rpm-build 3ee90c
                        int failcount, time_t last_failure) {
rpm-build 3ee90c
    char *buf = NULL;
rpm-build 3ee90c
rpm-build 3ee90c
    if (rsc == NULL) {
rpm-build 3ee90c
        buf = crm_strdup_printf("%s: orphan", rsc_id);
rpm-build 3ee90c
    } else if (all || failcount || last_failure > 0) {
rpm-build 3ee90c
        char *failcount_s = failcount > 0 ? crm_strdup_printf(" %s=%d", CRM_FAIL_COUNT_PREFIX, failcount) : strdup("");
rpm-build 3ee90c
        char *lastfail_s = last_failure > 0 ? crm_strdup_printf(" %s=%s", CRM_LAST_FAILURE_PREFIX,
rpm-build 3ee90c
                                                                crm_now_string(&last_failure)) : strdup("");
rpm-build 3ee90c
rpm-build 3ee90c
        buf = crm_strdup_printf("%s: migration-threshold=%d%s%s",
rpm-build 3ee90c
                                rsc_id, rsc->migration_threshold, failcount_s, lastfail_s);
rpm-build 3ee90c
        free(failcount_s);
rpm-build 3ee90c
        free(lastfail_s);
rpm-build 3ee90c
    } else {
rpm-build 3ee90c
        buf = crm_strdup_printf("%s:", rsc_id);
rpm-build 3ee90c
    }
rpm-build 3ee90c
rpm-build 3ee90c
    return buf;
rpm-build 3ee90c
}
rpm-build 3ee90c
rpm-build 3ee90c
static int
rpm-build 3ee90c
ban_html(pcmk__output_t *out, va_list args) {
rpm-build 3ee90c
    pe_node_t *pe_node = va_arg(args, pe_node_t *);
rpm-build 3ee90c
    pe__location_t *location = va_arg(args, pe__location_t *);
rpm-build 3ee90c
    unsigned int mon_ops = va_arg(args, unsigned int);
rpm-build 3ee90c
rpm-build 3ee90c
    char *node_name = get_node_display_name(pe_node, mon_ops);
rpm-build 3ee90c
    char *buf = crm_strdup_printf("%s\tprevents %s from running %son %s",
rpm-build 3ee90c
                                  location->id, location->rsc_lh->id,
rpm-build 3ee90c
                                  location->role_filter == RSC_ROLE_MASTER ? "as Master " : "",
rpm-build 3ee90c
                                  node_name);
rpm-build 3ee90c
rpm-build 3ee90c
    pcmk__output_create_html_node(out, "li", NULL, NULL, buf);
rpm-build 3ee90c
rpm-build 3ee90c
    free(node_name);
rpm-build 3ee90c
    free(buf);
rpm-build 3ee90c
    return 0;
rpm-build 3ee90c
}
rpm-build 3ee90c
rpm-build 3ee90c
static int
rpm-build 3ee90c
ban_text(pcmk__output_t *out, va_list args) {
rpm-build 3ee90c
    pe_node_t *pe_node = va_arg(args, pe_node_t *);
rpm-build 3ee90c
    pe__location_t *location = va_arg(args, pe__location_t *);
rpm-build 3ee90c
    unsigned int mon_ops = va_arg(args, unsigned int);
rpm-build 3ee90c
rpm-build 3ee90c
    char *node_name = get_node_display_name(pe_node, mon_ops);
rpm-build 3ee90c
    out->list_item(out, NULL, "%s\tprevents %s from running %son %s",
rpm-build 3ee90c
                   location->id, location->rsc_lh->id,
rpm-build 3ee90c
                   location->role_filter == RSC_ROLE_MASTER ? "as Master " : "",
rpm-build 3ee90c
                   node_name);
rpm-build 3ee90c
rpm-build 3ee90c
    free(node_name);
rpm-build 3ee90c
    return 0;
rpm-build 3ee90c
}
rpm-build 3ee90c
rpm-build 3ee90c
static int
rpm-build 3ee90c
ban_xml(pcmk__output_t *out, va_list args) {
rpm-build 3ee90c
    xmlNodePtr node = pcmk__output_create_xml_node(out, "ban");
rpm-build 3ee90c
    pe_node_t *pe_node = va_arg(args, pe_node_t *);
rpm-build 3ee90c
    pe__location_t *location = va_arg(args, pe__location_t *);
rpm-build 3ee90c
rpm-build 3ee90c
    char *weight_s = crm_itoa(pe_node->weight);
rpm-build 3ee90c
rpm-build 3ee90c
    xmlSetProp(node, (pcmkXmlStr) "id", (pcmkXmlStr) location->id);
rpm-build 3ee90c
    xmlSetProp(node, (pcmkXmlStr) "resource", (pcmkXmlStr) location->rsc_lh->id);
rpm-build 3ee90c
    xmlSetProp(node, (pcmkXmlStr) "node", (pcmkXmlStr) pe_node->details->uname);
rpm-build 3ee90c
    xmlSetProp(node, (pcmkXmlStr) "weight", (pcmkXmlStr) weight_s);
rpm-build 3ee90c
    xmlSetProp(node, (pcmkXmlStr) "master_only",
rpm-build 3ee90c
               (pcmkXmlStr) (location->role_filter == RSC_ROLE_MASTER ? "true" : "false"));
rpm-build 3ee90c
rpm-build 3ee90c
    free(weight_s);
rpm-build 3ee90c
    return 0;
rpm-build 3ee90c
}
rpm-build 3ee90c
rpm-build 3ee90c
static int
rpm-build 3ee90c
cluster_counts_html(pcmk__output_t *out, va_list args) {
rpm-build 3ee90c
    xmlNodePtr nodes_node = pcmk__output_create_xml_node(out, "li");
rpm-build 3ee90c
    xmlNodePtr resources_node = pcmk__output_create_xml_node(out, "li");
rpm-build 3ee90c
rpm-build 3ee90c
    unsigned int nnodes = va_arg(args, unsigned int);
rpm-build 3ee90c
    unsigned int nresources = va_arg(args, unsigned int);
rpm-build 3ee90c
    unsigned int ndisabled = va_arg(args, unsigned int);
rpm-build 3ee90c
    unsigned int nblocked = va_arg(args, unsigned int);
rpm-build 3ee90c
rpm-build 3ee90c
    char *nnodes_str = crm_strdup_printf("%d node%s configured", nnodes, s_if_plural(nnodes));
rpm-build 3ee90c
rpm-build 3ee90c
    pcmk_create_html_node(nodes_node, "span", NULL, NULL, nnodes_str);
rpm-build 3ee90c
    free(nnodes_str);
rpm-build 3ee90c
rpm-build 3ee90c
    if (ndisabled && nblocked) {
rpm-build 3ee90c
        char *s = crm_strdup_printf("%d resource instance%s configured (%d ",
rpm-build 3ee90c
                                    nresources, s_if_plural(nresources),
rpm-build 3ee90c
                                    ndisabled);
rpm-build 3ee90c
        pcmk_create_html_node(resources_node, "span", NULL, NULL, s);
rpm-build 3ee90c
        free(s);
rpm-build 3ee90c
rpm-build 3ee90c
        pcmk_create_html_node(resources_node, "span", NULL, "bold", "DISABLED");
rpm-build 3ee90c
rpm-build 3ee90c
        s = crm_strdup_printf(", %d ", nblocked);
rpm-build 3ee90c
        pcmk_create_html_node(resources_node, "span", NULL, NULL, s);
rpm-build 3ee90c
        free(s);
rpm-build 3ee90c
rpm-build 3ee90c
        pcmk_create_html_node(resources_node, "span", NULL, "bold", "BLOCKED");
rpm-build 3ee90c
        pcmk_create_html_node(resources_node, "span", NULL, NULL,
rpm-build 3ee90c
                              " from further action due to failure)");
rpm-build 3ee90c
    } else if (ndisabled && !nblocked) {
rpm-build 3ee90c
        char *s = crm_strdup_printf("%d resource instance%s configured (%d ",
rpm-build 3ee90c
                                    nresources, s_if_plural(nresources),
rpm-build 3ee90c
                                    ndisabled);
rpm-build 3ee90c
        pcmk_create_html_node(resources_node, "span", NULL, NULL, s);
rpm-build 3ee90c
        free(s);
rpm-build 3ee90c
rpm-build 3ee90c
        pcmk_create_html_node(resources_node, "span", NULL, "bold", "DISABLED");
rpm-build 3ee90c
        pcmk_create_html_node(resources_node, "span", NULL, NULL, ")");
rpm-build 3ee90c
    } else if (!ndisabled && nblocked) {
rpm-build 3ee90c
        char *s = crm_strdup_printf("%d resource instance%s configured (%d ",
rpm-build 3ee90c
                                    nresources, s_if_plural(nresources),
rpm-build 3ee90c
                                    nblocked);
rpm-build 3ee90c
        pcmk_create_html_node(resources_node, "span", NULL, NULL, s);
rpm-build 3ee90c
        free(s);
rpm-build 3ee90c
rpm-build 3ee90c
        pcmk_create_html_node(resources_node, "span", NULL, "bold", "BLOCKED");
rpm-build 3ee90c
        pcmk_create_html_node(resources_node, "span", NULL, NULL,
rpm-build 3ee90c
                              " from further action due to failure)");
rpm-build 3ee90c
    } else {
rpm-build 3ee90c
        char *s = crm_strdup_printf("%d resource instance%s configured",
rpm-build 3ee90c
                                    nresources, s_if_plural(nresources));
rpm-build 3ee90c
        pcmk_create_html_node(resources_node, "span", NULL, NULL, s);
rpm-build 3ee90c
        free(s);
rpm-build 3ee90c
    }
rpm-build 3ee90c
rpm-build 3ee90c
    return 0;
rpm-build 3ee90c
}
rpm-build 3ee90c
rpm-build 3ee90c
static int
rpm-build 3ee90c
cluster_counts_text(pcmk__output_t *out, va_list args) {
rpm-build 3ee90c
    unsigned int nnodes = va_arg(args, unsigned int);
rpm-build 3ee90c
    unsigned int nresources = va_arg(args, unsigned int);
rpm-build 3ee90c
    unsigned int ndisabled = va_arg(args, unsigned int);
rpm-build 3ee90c
    unsigned int nblocked = va_arg(args, unsigned int);
rpm-build 3ee90c
rpm-build 3ee90c
    out->list_item(out, NULL, "%d node%s configured", nnodes, s_if_plural(nnodes));
rpm-build 3ee90c
rpm-build 3ee90c
    if (ndisabled && nblocked) {
rpm-build 3ee90c
        out->list_item(out, NULL, "%d resource instance%s configured "
rpm-build 3ee90c
                                  "(%d DISABLED, %d BLOCKED from "
rpm-build 3ee90c
                                  "further action due to failure)",
rpm-build 3ee90c
                       nresources, s_if_plural(nresources), ndisabled,
rpm-build 3ee90c
                       nblocked);
rpm-build 3ee90c
    } else if (ndisabled && !nblocked) {
rpm-build 3ee90c
        out->list_item(out, NULL, "%d resource instance%s configured "
rpm-build 3ee90c
                                  "(%d DISABLED)",
rpm-build 3ee90c
                       nresources, s_if_plural(nresources), ndisabled);
rpm-build 3ee90c
    } else if (!ndisabled && nblocked) {
rpm-build 3ee90c
        out->list_item(out, NULL, "%d resource instance%s configured "
rpm-build 3ee90c
                                  "(%d BLOCKED from further action "
rpm-build 3ee90c
                                  "due to failure)",
rpm-build 3ee90c
                       nresources, s_if_plural(nresources), nblocked);
rpm-build 3ee90c
    } else {
rpm-build 3ee90c
        out->list_item(out, NULL, "%d resource instance%s configured",
rpm-build 3ee90c
                       nresources, s_if_plural(nresources));
rpm-build 3ee90c
    }
rpm-build 3ee90c
rpm-build 3ee90c
    return 0;
rpm-build 3ee90c
}
rpm-build 3ee90c
rpm-build 3ee90c
static int
rpm-build 3ee90c
cluster_counts_xml(pcmk__output_t *out, va_list args) {
rpm-build 3ee90c
    xmlNodePtr nodes_node = pcmk__output_create_xml_node(out, "nodes_configured");
rpm-build 3ee90c
    xmlNodePtr resources_node = pcmk__output_create_xml_node(out, "resources_configured");
rpm-build 3ee90c
rpm-build 3ee90c
    unsigned int nnodes = va_arg(args, unsigned int);
rpm-build 3ee90c
    unsigned int nresources = va_arg(args, unsigned int);
rpm-build 3ee90c
    unsigned int ndisabled = va_arg(args, unsigned int);
rpm-build 3ee90c
    unsigned int nblocked = va_arg(args, unsigned int);
rpm-build 3ee90c
rpm-build 3ee90c
    char *s = crm_itoa(nnodes);
rpm-build 3ee90c
    xmlSetProp(nodes_node, (pcmkXmlStr) "number", (pcmkXmlStr) s);
rpm-build 3ee90c
    free(s);
rpm-build 3ee90c
rpm-build 3ee90c
    s = crm_itoa(nresources);
rpm-build 3ee90c
    xmlSetProp(resources_node, (pcmkXmlStr) "number", (pcmkXmlStr) s);
rpm-build 3ee90c
    free(s);
rpm-build 3ee90c
rpm-build 3ee90c
    s = crm_itoa(ndisabled);
rpm-build 3ee90c
    xmlSetProp(resources_node, (pcmkXmlStr) "disabled", (pcmkXmlStr) s);
rpm-build 3ee90c
    free(s);
rpm-build 3ee90c
rpm-build 3ee90c
    s = crm_itoa(nblocked);
rpm-build 3ee90c
    xmlSetProp(resources_node, (pcmkXmlStr) "blocked", (pcmkXmlStr) s);
rpm-build 3ee90c
    free(s);
rpm-build 3ee90c
rpm-build 3ee90c
    return 0;
rpm-build 3ee90c
}
rpm-build 3ee90c
rpm-build 3ee90c
static int
rpm-build 3ee90c
cluster_dc_html(pcmk__output_t *out, va_list args) {
rpm-build 3ee90c
    xmlNodePtr node = pcmk__output_create_xml_node(out, "li");
rpm-build 3ee90c
rpm-build 3ee90c
    node_t *dc = va_arg(args, node_t *);
rpm-build 3ee90c
    const char *quorum = va_arg(args, const char *);
rpm-build 3ee90c
    const char *dc_version_s = va_arg(args, const char *);
rpm-build 3ee90c
    const char *dc_name = va_arg(args, const char *);
rpm-build 3ee90c
rpm-build 3ee90c
    pcmk_create_html_node(node, "span", NULL, "bold", "Current DC: ");
rpm-build 3ee90c
rpm-build 3ee90c
    if (dc) {
rpm-build 3ee90c
        if (crm_is_true(quorum)) {
rpm-build 3ee90c
            char *buf = crm_strdup_printf("%s (version %s) - partition with quorum",
rpm-build 3ee90c
                                          dc_name, dc_version_s ? dc_version_s : "unknown");
rpm-build 3ee90c
            pcmk_create_html_node(node, "span", NULL, NULL, buf);
rpm-build 3ee90c
            free(buf);
rpm-build 3ee90c
        } else {
rpm-build 3ee90c
            char *buf = crm_strdup_printf("%s (version %s) - partition",
rpm-build 3ee90c
                                          dc_name, dc_version_s ? dc_version_s : "unknown");
rpm-build 3ee90c
            pcmk_create_html_node(node, "span", NULL, NULL, buf);
rpm-build 3ee90c
            free(buf);
rpm-build 3ee90c
rpm-build 3ee90c
            pcmk_create_html_node(node, "span", NULL, "warning", "WITHOUT");
rpm-build 3ee90c
            pcmk_create_html_node(node, "span", NULL, NULL, "quorum");
rpm-build 3ee90c
        }
rpm-build 3ee90c
    } else {
rpm-build 3ee90c
        pcmk_create_html_node(node ,"span", NULL, "warning", "NONE");
rpm-build 3ee90c
    }
rpm-build 3ee90c
rpm-build 3ee90c
    return 0;
rpm-build 3ee90c
}
rpm-build 3ee90c
rpm-build 3ee90c
static int
rpm-build 3ee90c
cluster_dc_text(pcmk__output_t *out, va_list args) {
rpm-build 3ee90c
    node_t *dc = va_arg(args, node_t *);
rpm-build 3ee90c
    const char *quorum = va_arg(args, const char *);
rpm-build 3ee90c
    const char *dc_version_s = va_arg(args, const char *);
rpm-build 3ee90c
    const char *dc_name = va_arg(args, const char *);
rpm-build 3ee90c
rpm-build 3ee90c
    if (dc) {
rpm-build 3ee90c
        out->list_item(out, "Current DC", "%s (version %s) - partition %s quorum",
rpm-build 3ee90c
                       dc_name, dc_version_s ? dc_version_s : "unknown",
rpm-build 3ee90c
                       crm_is_true(quorum) ? "with" : "WITHOUT");
rpm-build 3ee90c
    } else {
rpm-build 3ee90c
        out->list_item(out, "Current DC", "NONE");
rpm-build 3ee90c
    }
rpm-build 3ee90c
rpm-build 3ee90c
    return 0;
rpm-build 3ee90c
}
rpm-build 3ee90c
rpm-build 3ee90c
static int
rpm-build 3ee90c
cluster_dc_xml(pcmk__output_t *out, va_list args) {
rpm-build 3ee90c
    xmlNodePtr node = pcmk__output_create_xml_node(out, "current_dc");
rpm-build 3ee90c
rpm-build 3ee90c
    node_t *dc = va_arg(args, node_t *);
rpm-build 3ee90c
    const char *quorum = va_arg(args, const char *);
rpm-build 3ee90c
    const char *dc_version_s = va_arg(args, const char *);
rpm-build 3ee90c
rpm-build 3ee90c
    if (dc) {
rpm-build 3ee90c
        xmlSetProp(node, (pcmkXmlStr) "present", (pcmkXmlStr) "true");
rpm-build 3ee90c
        xmlSetProp(node, (pcmkXmlStr) "version", (pcmkXmlStr) (dc_version_s ? dc_version_s : ""));
rpm-build 3ee90c
        xmlSetProp(node, (pcmkXmlStr) "name", (pcmkXmlStr) dc->details->uname);
rpm-build 3ee90c
        xmlSetProp(node, (pcmkXmlStr) "id", (pcmkXmlStr) dc->details->id);
rpm-build 3ee90c
        xmlSetProp(node, (pcmkXmlStr) "with_quorum", (pcmkXmlStr) (crm_is_true(quorum) ? "true" : "false"));
rpm-build 3ee90c
    } else {
rpm-build 3ee90c
        xmlSetProp(node, (pcmkXmlStr) "present", (pcmkXmlStr) "false");
rpm-build 3ee90c
    }
rpm-build 3ee90c
rpm-build 3ee90c
    return 0;
rpm-build 3ee90c
}
rpm-build 3ee90c
rpm-build 3ee90c
static int
rpm-build 3ee90c
cluster_options_html(pcmk__output_t *out, va_list args) {
rpm-build 3ee90c
    pe_working_set_t *data_set = va_arg(args, pe_working_set_t *);
rpm-build 3ee90c
rpm-build 3ee90c
    /* Kind of a hack - close the list started by print_cluster_summary so we
rpm-build 3ee90c
     * can put all the options in their own list, but just for HTML output.
rpm-build 3ee90c
     */
rpm-build 3ee90c
    out->end_list(out);
rpm-build 3ee90c
rpm-build 3ee90c
    /* And then this list will be closed by print_cluster_summary since it
rpm-build 3ee90c
     * wants to close the list it created unconditionally.
rpm-build 3ee90c
     */
rpm-build 3ee90c
    out->begin_list(out, NULL, NULL, "Config Options");
rpm-build 3ee90c
rpm-build 3ee90c
    out->list_item(out, NULL, "STONITH of failed nodes %s",
rpm-build 3ee90c
                   is_set(data_set->flags, pe_flag_stonith_enabled) ? "enabled" : "disabled");
rpm-build 3ee90c
rpm-build 3ee90c
    out->list_item(out, NULL, "Cluster is %s",
rpm-build 3ee90c
                   is_set(data_set->flags, pe_flag_symmetric_cluster) ? "symmetric" : "asymmetric");
rpm-build 3ee90c
rpm-build 3ee90c
    switch (data_set->no_quorum_policy) {
rpm-build 3ee90c
        case no_quorum_freeze:
rpm-build 3ee90c
            out->list_item(out, NULL, "No Quorum policy: Freeze resources");
rpm-build 3ee90c
            break;
rpm-build 3ee90c
rpm-build 3ee90c
        case no_quorum_stop:
rpm-build 3ee90c
            out->list_item(out, NULL, "No Quorum policy: Stop ALL resources");
rpm-build 3ee90c
            break;
rpm-build 3ee90c
rpm-build 3ee90c
        case no_quorum_ignore:
rpm-build 3ee90c
            out->list_item(out, NULL, "No Quorum policy: Ignore");
rpm-build 3ee90c
            break;
rpm-build 3ee90c
rpm-build 3ee90c
        case no_quorum_suicide:
rpm-build 3ee90c
            out->list_item(out, NULL, "No Quorum policy: Suicide");
rpm-build 3ee90c
            break;
rpm-build 3ee90c
    }
rpm-build 3ee90c
rpm-build 3ee90c
    if (is_set(data_set->flags, pe_flag_maintenance_mode)) {
rpm-build 3ee90c
        xmlNodePtr node = pcmk__output_create_xml_node(out, "li");
rpm-build 3ee90c
rpm-build 3ee90c
        pcmk_create_html_node(node, "span", NULL, "bold", "DISABLED");
rpm-build 3ee90c
        pcmk_create_html_node(node, "span", NULL, NULL,
rpm-build 3ee90c
                              " (the cluster will not attempt to start, stop, or recover services)");
rpm-build 3ee90c
    } else {
rpm-build 3ee90c
        out->list_item(out, NULL, "Resource management enabled");
rpm-build 3ee90c
    }
rpm-build 3ee90c
rpm-build 3ee90c
    return 0;
rpm-build 3ee90c
}
rpm-build 3ee90c
rpm-build 3ee90c
static int
rpm-build 3ee90c
cluster_options_text(pcmk__output_t *out, va_list args) {
rpm-build 3ee90c
    pe_working_set_t *data_set = va_arg(args, pe_working_set_t *);
rpm-build 3ee90c
rpm-build 3ee90c
    if (is_set(data_set->flags, pe_flag_maintenance_mode)) {
rpm-build 3ee90c
        fprintf(out->dest, "\n              *** Resource management is DISABLED ***");
rpm-build 3ee90c
        fprintf(out->dest, "\n  The cluster will not attempt to start, stop or recover services");
rpm-build 3ee90c
        fprintf(out->dest, "\n");
rpm-build 3ee90c
    }
rpm-build 3ee90c
rpm-build 3ee90c
    return 0;
rpm-build 3ee90c
}
rpm-build 3ee90c
rpm-build 3ee90c
static int
rpm-build 3ee90c
cluster_options_xml(pcmk__output_t *out, va_list args) {
rpm-build 3ee90c
    xmlNodePtr node = pcmk__output_create_xml_node(out, "cluster_options");
rpm-build 3ee90c
    pe_working_set_t *data_set = va_arg(args, pe_working_set_t *);
rpm-build 3ee90c
rpm-build 3ee90c
    xmlSetProp(node, (pcmkXmlStr) "stonith-enabled",
rpm-build 3ee90c
               (pcmkXmlStr) (is_set(data_set->flags, pe_flag_stonith_enabled) ? "true" : "false"));
rpm-build 3ee90c
    xmlSetProp(node, (pcmkXmlStr) "symmetric-cluster",
rpm-build 3ee90c
               (pcmkXmlStr) (is_set(data_set->flags, pe_flag_symmetric_cluster) ? "true" : "false"));
rpm-build 3ee90c
rpm-build 3ee90c
    switch (data_set->no_quorum_policy) {
rpm-build 3ee90c
        case no_quorum_freeze:
rpm-build 3ee90c
            xmlSetProp(node, (pcmkXmlStr) "no-quorum-policy", (pcmkXmlStr) "freeze");
rpm-build 3ee90c
            break;
rpm-build 3ee90c
rpm-build 3ee90c
        case no_quorum_stop:
rpm-build 3ee90c
            xmlSetProp(node, (pcmkXmlStr) "no-quorum-policy", (pcmkXmlStr) "stop");
rpm-build 3ee90c
            break;
rpm-build 3ee90c
rpm-build 3ee90c
        case no_quorum_ignore:
rpm-build 3ee90c
            xmlSetProp(node, (pcmkXmlStr) "no-quorum-policy", (pcmkXmlStr) "ignore");
rpm-build 3ee90c
            break;
rpm-build 3ee90c
rpm-build 3ee90c
        case no_quorum_suicide:
rpm-build 3ee90c
            xmlSetProp(node, (pcmkXmlStr) "no-quorum-policy", (pcmkXmlStr) "suicide");
rpm-build 3ee90c
            break;
rpm-build 3ee90c
    }
rpm-build 3ee90c
rpm-build 3ee90c
    xmlSetProp(node, (pcmkXmlStr) "maintenance-mode",
rpm-build 3ee90c
               (pcmkXmlStr) (is_set(data_set->flags, pe_flag_maintenance_mode) ? "true" : "false"));
rpm-build 3ee90c
rpm-build 3ee90c
    return 0;
rpm-build 3ee90c
}
rpm-build 3ee90c
rpm-build 3ee90c
static int
rpm-build 3ee90c
cluster_stack_html(pcmk__output_t *out, va_list args) {
rpm-build 3ee90c
    xmlNodePtr node = pcmk__output_create_xml_node(out, "li");
rpm-build 3ee90c
    const char *stack_s = va_arg(args, const char *);
rpm-build 3ee90c
rpm-build 3ee90c
    pcmk_create_html_node(node, "span", NULL, "bold", "Stack: ");
rpm-build 3ee90c
    pcmk_create_html_node(node, "span", NULL, NULL, stack_s);
rpm-build 3ee90c
rpm-build 3ee90c
    return 0;
rpm-build 3ee90c
}
rpm-build 3ee90c
rpm-build 3ee90c
static int
rpm-build 3ee90c
cluster_stack_text(pcmk__output_t *out, va_list args) {
rpm-build 3ee90c
    const char *stack_s = va_arg(args, const char *);
rpm-build 3ee90c
    out->list_item(out, "Stack", "%s", stack_s);
rpm-build 3ee90c
    return 0;
rpm-build 3ee90c
}
rpm-build 3ee90c
rpm-build 3ee90c
static int
rpm-build 3ee90c
cluster_stack_xml(pcmk__output_t *out, va_list args) {
rpm-build 3ee90c
    xmlNodePtr node = pcmk__output_create_xml_node(out, "stack");
rpm-build 3ee90c
    const char *stack_s = va_arg(args, const char *);
rpm-build 3ee90c
rpm-build 3ee90c
    xmlSetProp(node, (pcmkXmlStr) "type", (pcmkXmlStr) stack_s);
rpm-build 3ee90c
rpm-build 3ee90c
    return 0;
rpm-build 3ee90c
}
rpm-build 3ee90c
rpm-build 3ee90c
static int
rpm-build 3ee90c
cluster_times_html(pcmk__output_t *out, va_list args) {
rpm-build 3ee90c
    xmlNodePtr updated_node = pcmk__output_create_xml_node(out, "li");
rpm-build 3ee90c
    xmlNodePtr changed_node = pcmk__output_create_xml_node(out, "li");
rpm-build 3ee90c
rpm-build 3ee90c
    const char *last_written = va_arg(args, const char *);
rpm-build 3ee90c
    const char *user = va_arg(args, const char *);
rpm-build 3ee90c
    const char *client = va_arg(args, const char *);
rpm-build 3ee90c
    const char *origin = va_arg(args, const char *);
rpm-build 3ee90c
rpm-build 3ee90c
    char *buf = last_changed_string(last_written, user, client, origin);
rpm-build 3ee90c
rpm-build 3ee90c
    pcmk_create_html_node(updated_node, "span", NULL, "bold", "Last updated: ");
rpm-build 3ee90c
    pcmk_create_html_node(updated_node, "span", NULL, NULL, crm_now_string(NULL));
rpm-build 3ee90c
rpm-build 3ee90c
    pcmk_create_html_node(changed_node, "span", NULL, "bold", "Last change: ");
rpm-build 3ee90c
    pcmk_create_html_node(changed_node, "span", NULL, NULL, buf);
rpm-build 3ee90c
rpm-build 3ee90c
    free(buf);
rpm-build 3ee90c
    return 0;
rpm-build 3ee90c
}
rpm-build 3ee90c
rpm-build 3ee90c
static int
rpm-build 3ee90c
cluster_times_xml(pcmk__output_t *out, va_list args) {
rpm-build 3ee90c
    xmlNodePtr updated_node = pcmk__output_create_xml_node(out, "last_update");
rpm-build 3ee90c
    xmlNodePtr changed_node = pcmk__output_create_xml_node(out, "last_change");
rpm-build 3ee90c
rpm-build 3ee90c
    const char *last_written = va_arg(args, const char *);
rpm-build 3ee90c
    const char *user = va_arg(args, const char *);
rpm-build 3ee90c
    const char *client = va_arg(args, const char *);
rpm-build 3ee90c
    const char *origin = va_arg(args, const char *);
rpm-build 3ee90c
rpm-build 3ee90c
    xmlSetProp(updated_node, (pcmkXmlStr) "time", (pcmkXmlStr) crm_now_string(NULL));
rpm-build 3ee90c
rpm-build 3ee90c
    xmlSetProp(changed_node, (pcmkXmlStr) "time", (pcmkXmlStr) (last_written ? last_written : ""));
rpm-build 3ee90c
    xmlSetProp(changed_node, (pcmkXmlStr) "user", (pcmkXmlStr) (user ? user : ""));
rpm-build 3ee90c
    xmlSetProp(changed_node, (pcmkXmlStr) "client", (pcmkXmlStr) (client ? client : ""));
rpm-build 3ee90c
    xmlSetProp(changed_node, (pcmkXmlStr) "origin", (pcmkXmlStr) (origin ? origin : ""));
rpm-build 3ee90c
rpm-build 3ee90c
    return 0;
rpm-build 3ee90c
}
rpm-build 3ee90c
rpm-build 3ee90c
static int
rpm-build 3ee90c
cluster_times_text(pcmk__output_t *out, va_list args) {
rpm-build 3ee90c
    const char *last_written = va_arg(args, const char *);
rpm-build 3ee90c
    const char *user = va_arg(args, const char *);
rpm-build 3ee90c
    const char *client = va_arg(args, const char *);
rpm-build 3ee90c
    const char *origin = va_arg(args, const char *);
rpm-build 3ee90c
rpm-build 3ee90c
    char *buf = last_changed_string(last_written, user, client, origin);
rpm-build 3ee90c
rpm-build 3ee90c
    out->list_item(out, "Last updated", "%s", crm_now_string(NULL));
rpm-build 3ee90c
    out->list_item(out, "Last change", " %s", buf);
rpm-build 3ee90c
rpm-build 3ee90c
    free(buf);
rpm-build 3ee90c
    return 0;
rpm-build 3ee90c
}
rpm-build 3ee90c
rpm-build 3ee90c
static int
rpm-build 3ee90c
failed_action_console(pcmk__output_t *out, va_list args) {
rpm-build 3ee90c
    xmlNodePtr xml_op = va_arg(args, xmlNodePtr);
rpm-build 3ee90c
    char *s = failed_action_string(xml_op);
rpm-build 3ee90c
rpm-build 3ee90c
    curses_indented_printf(out, "%s\n", s);
rpm-build 3ee90c
    free(s);
rpm-build 3ee90c
    return 0;
rpm-build 3ee90c
}
rpm-build 3ee90c
rpm-build 3ee90c
static int
rpm-build 3ee90c
failed_action_html(pcmk__output_t *out, va_list args) {
rpm-build 3ee90c
    xmlNodePtr xml_op = va_arg(args, xmlNodePtr);
rpm-build 3ee90c
    char *s = failed_action_string(xml_op);
rpm-build 3ee90c
rpm-build 3ee90c
    pcmk__output_create_html_node(out, "li", NULL, NULL, s);
rpm-build 3ee90c
    free(s);
rpm-build 3ee90c
    return 0;
rpm-build 3ee90c
}
rpm-build 3ee90c
rpm-build 3ee90c
static int
rpm-build 3ee90c
failed_action_text(pcmk__output_t *out, va_list args) {
rpm-build 3ee90c
    xmlNodePtr xml_op = va_arg(args, xmlNodePtr);
rpm-build 3ee90c
    char *s = failed_action_string(xml_op);
rpm-build 3ee90c
rpm-build 3ee90c
    pcmk__indented_printf(out, "%s\n", s);
rpm-build 3ee90c
    free(s);
rpm-build 3ee90c
    return 0;
rpm-build 3ee90c
}
rpm-build 3ee90c
rpm-build 3ee90c
static int
rpm-build 3ee90c
failed_action_xml(pcmk__output_t *out, va_list args) {
rpm-build 3ee90c
    xmlNodePtr xml_op = va_arg(args, xmlNodePtr);
rpm-build 3ee90c
rpm-build 3ee90c
    const char *op_key = crm_element_value(xml_op, XML_LRM_ATTR_TASK_KEY);
rpm-build 3ee90c
    const char *last = crm_element_value(xml_op, XML_RSC_OP_LAST_CHANGE);
rpm-build 3ee90c
    int rc = crm_parse_int(crm_element_value(xml_op, XML_LRM_ATTR_RC), "0");
rpm-build 3ee90c
    int status = crm_parse_int(crm_element_value(xml_op, XML_LRM_ATTR_OPSTATUS), "0");
rpm-build 3ee90c
    const char *exit_reason = crm_element_value(xml_op, XML_LRM_ATTR_EXIT_REASON);
rpm-build 3ee90c
rpm-build 3ee90c
    char *rc_s = crm_itoa(rc);
rpm-build 3ee90c
    char *reason_s = crm_xml_escape(exit_reason ? exit_reason : "none");
rpm-build 3ee90c
    xmlNodePtr node = pcmk__output_create_xml_node(out, "failure");
rpm-build 3ee90c
rpm-build 3ee90c
    xmlSetProp(node, (pcmkXmlStr) (op_key ? "op_key" : "id"),
rpm-build 3ee90c
               (pcmkXmlStr) (op_key ? op_key : "id"));
rpm-build 3ee90c
    xmlSetProp(node, (pcmkXmlStr) "node",
rpm-build 3ee90c
               (pcmkXmlStr) crm_element_value(xml_op, XML_ATTR_UNAME));
rpm-build 3ee90c
    xmlSetProp(node, (pcmkXmlStr) "exitstatus",
rpm-build 3ee90c
               (pcmkXmlStr) services_ocf_exitcode_str(rc));
rpm-build 3ee90c
    xmlSetProp(node, (pcmkXmlStr) "exitreason", (pcmkXmlStr) reason_s);
rpm-build 3ee90c
    xmlSetProp(node, (pcmkXmlStr) "exitcode", (pcmkXmlStr) rc_s);
rpm-build 3ee90c
    xmlSetProp(node, (pcmkXmlStr) "call",
rpm-build 3ee90c
               (pcmkXmlStr) crm_element_value(xml_op, XML_LRM_ATTR_CALLID));
rpm-build 3ee90c
    xmlSetProp(node, (pcmkXmlStr) "status",
rpm-build 3ee90c
               (pcmkXmlStr) services_lrm_status_str(status));
rpm-build 3ee90c
rpm-build 3ee90c
    if (last) {
rpm-build 3ee90c
        char *s = crm_itoa(crm_parse_ms(crm_element_value(xml_op, XML_LRM_ATTR_INTERVAL_MS)));
rpm-build 3ee90c
        char *rc_change = time_t_string(crm_parse_int(last, "0"));
rpm-build 3ee90c
rpm-build 3ee90c
        xmlSetProp(node, (pcmkXmlStr) "last-rc-change", (pcmkXmlStr) rc_change);
rpm-build 3ee90c
        xmlSetProp(node, (pcmkXmlStr) "queued",
rpm-build 3ee90c
                   (pcmkXmlStr) crm_element_value(xml_op, XML_RSC_OP_T_QUEUE));
rpm-build 3ee90c
        xmlSetProp(node, (pcmkXmlStr) "exec",
rpm-build 3ee90c
                   (pcmkXmlStr) crm_element_value(xml_op, XML_RSC_OP_T_EXEC));
rpm-build 3ee90c
        xmlSetProp(node, (pcmkXmlStr) "interval", (pcmkXmlStr) s);
rpm-build 3ee90c
        xmlSetProp(node, (pcmkXmlStr) "task",
rpm-build 3ee90c
                   (pcmkXmlStr) crm_element_value(xml_op, XML_LRM_ATTR_TASK));
rpm-build 3ee90c
rpm-build 3ee90c
        free(s);
rpm-build 3ee90c
        free(rc_change);
rpm-build 3ee90c
    }
rpm-build 3ee90c
rpm-build 3ee90c
    free(reason_s);
rpm-build 3ee90c
    free(rc_s);
rpm-build 3ee90c
    return 0;
rpm-build 3ee90c
}
rpm-build 3ee90c
rpm-build 3ee90c
static int
rpm-build 3ee90c
node_html(pcmk__output_t *out, va_list args) {
rpm-build 3ee90c
    node_t *node = va_arg(args, node_t *);
rpm-build 3ee90c
    unsigned int mon_ops = va_arg(args, unsigned int);
rpm-build 3ee90c
    gboolean full = va_arg(args, gboolean);
rpm-build 3ee90c
rpm-build 3ee90c
    char *node_name = get_node_display_name(node, mon_ops);
rpm-build 3ee90c
    char *buf = crm_strdup_printf("Node: %s", node_name);
rpm-build 3ee90c
    int print_opts = get_resource_display_options(mon_ops, mon_output_html);
rpm-build 3ee90c
rpm-build 3ee90c
    if (full) {
rpm-build 3ee90c
        xmlNodePtr item_node = pcmk__output_create_xml_node(out, "li");
rpm-build 3ee90c
rpm-build 3ee90c
        pcmk_create_html_node(item_node, "span", NULL, NULL, buf);
rpm-build 3ee90c
rpm-build 3ee90c
        if (node->details->standby_onfail && node->details->online) {
rpm-build 3ee90c
            pcmk_create_html_node(item_node, "span", NULL, "standby", " standby (on-fail)");
rpm-build 3ee90c
        } else if (node->details->standby && node->details->online) {
rpm-build 3ee90c
            char *s = crm_strdup_printf(" standby%s", node->details->running_rsc ? " (with active resources)" : "");
rpm-build 3ee90c
            pcmk_create_html_node(item_node, "span", NULL, " standby", s);
rpm-build 3ee90c
            free(s);
rpm-build 3ee90c
        } else if (node->details->standby) {
rpm-build 3ee90c
            pcmk_create_html_node(item_node, "span", NULL, "offline", " OFFLINE (standby)");
rpm-build 3ee90c
        } else if (node->details->maintenance && node->details->online) {
rpm-build 3ee90c
            pcmk_create_html_node(item_node, "span", NULL, "maint", " maintenance");
rpm-build 3ee90c
        } else if (node->details->maintenance) {
rpm-build 3ee90c
            pcmk_create_html_node(item_node, "span", NULL, "offline", " OFFLINE (maintenance)");
rpm-build 3ee90c
        } else if (node->details->online) {
rpm-build 3ee90c
            pcmk_create_html_node(item_node, "span", NULL, "online", " online");
rpm-build 3ee90c
        } else {
rpm-build 3ee90c
            pcmk_create_html_node(item_node, "span", NULL, "offline", " OFFLINE");
rpm-build 3ee90c
        }
rpm-build 3ee90c
        if (is_set(mon_ops, mon_op_print_brief) && is_set(mon_ops, mon_op_group_by_node)) {
rpm-build 3ee90c
            out->begin_list(out, NULL, NULL, NULL);
rpm-build 3ee90c
            pe__rscs_brief_output(out, node->details->running_rsc, print_opts | pe_print_rsconly,
rpm-build 3ee90c
                                  FALSE);
rpm-build 3ee90c
            out->end_list(out);
rpm-build 3ee90c
rpm-build 3ee90c
        } else if (is_set(mon_ops, mon_op_group_by_node)) {
rpm-build 3ee90c
            GListPtr lpc2 = NULL;
rpm-build 3ee90c
rpm-build 3ee90c
            out->begin_list(out, NULL, NULL, NULL);
rpm-build 3ee90c
            for (lpc2 = node->details->running_rsc; lpc2 != NULL; lpc2 = lpc2->next) {
rpm-build 3ee90c
                resource_t *rsc = (resource_t *) lpc2->data;
rpm-build 3ee90c
                out->message(out, crm_map_element_name(rsc->xml), print_opts | pe_print_rsconly, rsc);
rpm-build 3ee90c
            }
rpm-build 3ee90c
            out->end_list(out);
rpm-build 3ee90c
        }
rpm-build 3ee90c
    } else {
rpm-build 3ee90c
        out->begin_list(out, NULL, NULL, "%s", buf);
rpm-build 3ee90c
    }
rpm-build 3ee90c
rpm-build 3ee90c
    free(buf);
rpm-build 3ee90c
    free(node_name);
rpm-build 3ee90c
    return 0;
rpm-build 3ee90c
}
rpm-build 3ee90c
rpm-build 3ee90c
static int
rpm-build 3ee90c
node_text(pcmk__output_t *out, va_list args) {
rpm-build 3ee90c
    node_t *node = va_arg(args, node_t *);
rpm-build 3ee90c
    unsigned int mon_ops = va_arg(args, unsigned int);
rpm-build 3ee90c
    gboolean full = va_arg(args, gboolean);
rpm-build 3ee90c
rpm-build 3ee90c
    if (full) {
rpm-build 3ee90c
        const char *node_mode = va_arg(args, const char *);
rpm-build 3ee90c
rpm-build 3ee90c
        char *node_name = get_node_display_name(node, mon_ops);
rpm-build 3ee90c
        int print_opts = get_resource_display_options(mon_ops, mon_output_xml);
rpm-build 3ee90c
        char *buf = NULL;
rpm-build 3ee90c
rpm-build 3ee90c
        /* Print the node name and status */
rpm-build 3ee90c
        if (pe__is_guest_node(node)) {
rpm-build 3ee90c
            buf = crm_strdup_printf("GuestNode %s: %s", node_name, node_mode);
rpm-build 3ee90c
        } else if (pe__is_remote_node(node)) {
rpm-build 3ee90c
            buf = crm_strdup_printf("RemoteNode %s: %s", node_name, node_mode);
rpm-build 3ee90c
        } else {
rpm-build 3ee90c
            buf = crm_strdup_printf("Node %s: %s", node_name, node_mode);
rpm-build 3ee90c
        }
rpm-build 3ee90c
rpm-build 3ee90c
        /* If we're grouping by node, print its resources */
rpm-build 3ee90c
        if (is_set(mon_ops, mon_op_group_by_node)) {
rpm-build 3ee90c
            out->begin_list(out, NULL, NULL, "%s", buf);
rpm-build 3ee90c
            out->begin_list(out, NULL, NULL, "Resources");
rpm-build 3ee90c
rpm-build 3ee90c
            if (is_set(mon_ops, mon_op_print_brief)) {
rpm-build 3ee90c
                pe__rscs_brief_output(out, node->details->running_rsc,
rpm-build 3ee90c
                                      print_opts | pe_print_rsconly, FALSE);
rpm-build 3ee90c
            } else {
rpm-build 3ee90c
                GListPtr gIter2 = NULL;
rpm-build 3ee90c
rpm-build 3ee90c
                for (gIter2 = node->details->running_rsc; gIter2 != NULL; gIter2 = gIter2->next) {
rpm-build 3ee90c
                    resource_t *rsc = (resource_t *) gIter2->data;
rpm-build 3ee90c
                    out->message(out, crm_map_element_name(rsc->xml), print_opts | pe_print_rsconly, rsc);
rpm-build 3ee90c
                }
rpm-build 3ee90c
            }
rpm-build 3ee90c
rpm-build 3ee90c
            out->end_list(out);
rpm-build 3ee90c
            out->end_list(out);
rpm-build 3ee90c
        } else {
rpm-build 3ee90c
            out->list_item(out, NULL, "%s", buf);
rpm-build 3ee90c
        }
rpm-build 3ee90c
rpm-build 3ee90c
        free(buf);
rpm-build 3ee90c
        free(node_name);
rpm-build 3ee90c
    } else {
rpm-build 3ee90c
        out->begin_list(out, NULL, NULL, "Node: %s", get_node_display_name(node, mon_ops));
rpm-build 3ee90c
    }
rpm-build 3ee90c
rpm-build 3ee90c
    return 0;
rpm-build 3ee90c
}
rpm-build 3ee90c
rpm-build 3ee90c
static int
rpm-build 3ee90c
node_xml(pcmk__output_t *out, va_list args) {
rpm-build 3ee90c
    node_t *node = va_arg(args, node_t *);
rpm-build 3ee90c
    unsigned int mon_ops G_GNUC_UNUSED = va_arg(args, unsigned int);
rpm-build 3ee90c
    gboolean full = va_arg(args, gboolean);
rpm-build 3ee90c
rpm-build 3ee90c
    if (full) {
rpm-build 3ee90c
        const char *node_type = "unknown";
rpm-build 3ee90c
        int print_opts = get_resource_display_options(mon_ops, mon_output_xml);
rpm-build 3ee90c
        char *length_s = crm_itoa(g_list_length(node->details->running_rsc));
rpm-build 3ee90c
rpm-build 3ee90c
        switch (node->details->type) {
rpm-build 3ee90c
            case node_member:
rpm-build 3ee90c
                node_type = "member";
rpm-build 3ee90c
                break;
rpm-build 3ee90c
            case node_remote:
rpm-build 3ee90c
                node_type = "remote";
rpm-build 3ee90c
                break;
rpm-build 3ee90c
            case node_ping:
rpm-build 3ee90c
                node_type = "ping";
rpm-build 3ee90c
                break;
rpm-build 3ee90c
        }
rpm-build 3ee90c
        pe__name_and_nvpairs_xml(out, true, "node", 13,
rpm-build 3ee90c
                                 "name", node->details->uname,
rpm-build 3ee90c
                                 "id", node->details->id,
rpm-build 3ee90c
                                 "online", node->details->online ? "true" : "false",
rpm-build 3ee90c
                                 "standby", node->details->standby ? "true" : "false",
rpm-build 3ee90c
                                 "standby_onfail", node->details->standby_onfail ? "true" : "false",
rpm-build 3ee90c
                                 "maintenance", node->details->maintenance ? "true" : "false",
rpm-build 3ee90c
                                 "pending", node->details->pending ? "true" : "false",
rpm-build 3ee90c
                                 "unclean", node->details->unclean ? "true" : "false",
rpm-build 3ee90c
                                 "shutdown", node->details->shutdown ? "true" : "false",
rpm-build 3ee90c
                                 "expected_up", node->details->expected_up ? "true" : "false",
rpm-build 3ee90c
                                 "is_dc", node->details->is_dc ? "true" : "false",
rpm-build 3ee90c
                                 "resources_running", length_s,
rpm-build 3ee90c
                                 "type", node_type);
rpm-build 3ee90c
rpm-build 3ee90c
        if (pe__is_guest_node(node)) {
rpm-build 3ee90c
            xmlNodePtr xml_node = pcmk__output_xml_peek_parent(out);
rpm-build 3ee90c
            xmlSetProp(xml_node, (pcmkXmlStr) "id_as_resource",
rpm-build 3ee90c
                                 (pcmkXmlStr) node->details->remote_rsc->container->id);
rpm-build 3ee90c
        }
rpm-build 3ee90c
rpm-build 3ee90c
        if (is_set(mon_ops, mon_op_group_by_node)) {
rpm-build 3ee90c
            GListPtr lpc = NULL;
rpm-build 3ee90c
rpm-build 3ee90c
            for (lpc = node->details->running_rsc; lpc != NULL; lpc = lpc->next) {
rpm-build 3ee90c
                resource_t *rsc = (resource_t *) lpc->data;
rpm-build 3ee90c
                out->message(out, crm_map_element_name(rsc->xml), print_opts | pe_print_rsconly, rsc);
rpm-build 3ee90c
            }
rpm-build 3ee90c
        }
rpm-build 3ee90c
rpm-build 3ee90c
        free(length_s);
rpm-build 3ee90c
rpm-build 3ee90c
        out->end_list(out);
rpm-build 3ee90c
    } else {
rpm-build 3ee90c
        xmlNodePtr parent = pcmk__output_xml_create_parent(out, "node");
rpm-build 3ee90c
        xmlSetProp(parent, (pcmkXmlStr) "name", (pcmkXmlStr) node->details->uname);
rpm-build 3ee90c
    }
rpm-build 3ee90c
rpm-build 3ee90c
    return 0;
rpm-build 3ee90c
}
rpm-build 3ee90c
rpm-build 3ee90c
static int
rpm-build 3ee90c
node_attribute_text(pcmk__output_t *out, va_list args) {
rpm-build 3ee90c
    const char *name = va_arg(args, const char *);
rpm-build 3ee90c
    const char *value = va_arg(args, const char *);
rpm-build 3ee90c
    gboolean add_extra = va_arg(args, gboolean);
rpm-build 3ee90c
    int expected_score = va_arg(args, int);
rpm-build 3ee90c
rpm-build 3ee90c
rpm-build 3ee90c
    if (add_extra) {
rpm-build 3ee90c
        int v = crm_parse_int(value, "0");
rpm-build 3ee90c
rpm-build 3ee90c
        if (v <= 0) {
rpm-build 3ee90c
            out->list_item(out, NULL, "%-32s\t: %-10s\t: Connectivity is lost", name, value);
rpm-build 3ee90c
        } else if (v < expected_score) {
rpm-build 3ee90c
            out->list_item(out, NULL, "%-32s\t: %-10s\t: Connectivity is degraded (Expected=%d)", name, value, expected_score);
rpm-build 3ee90c
        } else {
rpm-build 3ee90c
            out->list_item(out, NULL, "%-32s\t: %-10s", name, value);
rpm-build 3ee90c
        }
rpm-build 3ee90c
    } else {
rpm-build 3ee90c
        out->list_item(out, NULL, "%-32s\t: %-10s", name, value);
rpm-build 3ee90c
    }
rpm-build 3ee90c
rpm-build 3ee90c
    return 0;
rpm-build 3ee90c
}
rpm-build 3ee90c
rpm-build 3ee90c
static int
rpm-build 3ee90c
node_attribute_html(pcmk__output_t *out, va_list args) {
rpm-build 3ee90c
    const char *name = va_arg(args, const char *);
rpm-build 3ee90c
    const char *value = va_arg(args, const char *);
rpm-build 3ee90c
    gboolean add_extra = va_arg(args, gboolean);
rpm-build 3ee90c
    int expected_score = va_arg(args, int);
rpm-build 3ee90c
rpm-build 3ee90c
    if (add_extra) {
rpm-build 3ee90c
        int v = crm_parse_int(value, "0");
rpm-build 3ee90c
        char *s = crm_strdup_printf("%s: %s", name, value);
rpm-build 3ee90c
        xmlNodePtr item_node = pcmk__output_create_xml_node(out, "li");
rpm-build 3ee90c
rpm-build 3ee90c
        pcmk_create_html_node(item_node, "span", NULL, NULL, s);
rpm-build 3ee90c
        free(s);
rpm-build 3ee90c
rpm-build 3ee90c
        if (v <= 0) {
rpm-build 3ee90c
            pcmk_create_html_node(item_node, "span", NULL, "bold", "(connectivity is lost)");
rpm-build 3ee90c
        } else if (v < expected_score) {
rpm-build 3ee90c
            char *buf = crm_strdup_printf("(connectivity is degraded -- expected %d", expected_score);
rpm-build 3ee90c
            pcmk_create_html_node(item_node, "span", NULL, "bold", buf);
rpm-build 3ee90c
            free(buf);
rpm-build 3ee90c
        }
rpm-build 3ee90c
    } else {
rpm-build 3ee90c
        out->list_item(out, NULL, "%s: %s", name, value);
rpm-build 3ee90c
    }
rpm-build 3ee90c
rpm-build 3ee90c
    return 0;
rpm-build 3ee90c
}
rpm-build 3ee90c
rpm-build 3ee90c
static int
rpm-build 3ee90c
node_attribute_xml(pcmk__output_t *out, va_list args) {
rpm-build 3ee90c
    const char *name = va_arg(args, const char *);
rpm-build 3ee90c
    const char *value = va_arg(args, const char *);
rpm-build 3ee90c
    gboolean add_extra = va_arg(args, gboolean);
rpm-build 3ee90c
    int expected_score = va_arg(args, int);
rpm-build 3ee90c
rpm-build 3ee90c
    xmlNodePtr node = pcmk__output_create_xml_node(out, "attribute");
rpm-build 3ee90c
    xmlSetProp(node, (pcmkXmlStr) "name", (pcmkXmlStr) name);
rpm-build 3ee90c
    xmlSetProp(node, (pcmkXmlStr) "value", (pcmkXmlStr) value);
rpm-build 3ee90c
rpm-build 3ee90c
    if (add_extra) {
rpm-build 3ee90c
        char *buf = crm_itoa(expected_score);
rpm-build 3ee90c
        xmlSetProp(node, (pcmkXmlStr) "expected", (pcmkXmlStr) buf);
rpm-build 3ee90c
        free(buf);
rpm-build 3ee90c
    }
rpm-build 3ee90c
rpm-build 3ee90c
    return 0;
rpm-build 3ee90c
}
rpm-build 3ee90c
rpm-build 3ee90c
static int
rpm-build 3ee90c
op_history_text(pcmk__output_t *out, va_list args) {
rpm-build 3ee90c
    xmlNode *xml_op = va_arg(args, xmlNode *);
rpm-build 3ee90c
    const char *task = va_arg(args, const char *);
rpm-build 3ee90c
    const char *interval_ms_s = va_arg(args, const char *);
rpm-build 3ee90c
    int rc = va_arg(args, int);
rpm-build 3ee90c
    unsigned int mon_ops = va_arg(args, unsigned int);
rpm-build 3ee90c
rpm-build 3ee90c
    char *buf = op_history_string(xml_op, task, interval_ms_s, rc, mon_ops);
rpm-build 3ee90c
rpm-build 3ee90c
    out->list_item(out, NULL, "%s", buf);
rpm-build 3ee90c
rpm-build 3ee90c
    free(buf);
rpm-build 3ee90c
    return 0;
rpm-build 3ee90c
}
rpm-build 3ee90c
rpm-build 3ee90c
static int
rpm-build 3ee90c
op_history_xml(pcmk__output_t *out, va_list args) {
rpm-build 3ee90c
    xmlNode *xml_op = va_arg(args, xmlNode *);
rpm-build 3ee90c
    const char *task = va_arg(args, const char *);
rpm-build 3ee90c
    const char *interval_ms_s = va_arg(args, const char *);
rpm-build 3ee90c
    int rc = va_arg(args, int);
rpm-build 3ee90c
    unsigned int mon_ops = va_arg(args, unsigned int);
rpm-build 3ee90c
rpm-build 3ee90c
    char *rc_s = NULL;
rpm-build 3ee90c
rpm-build 3ee90c
    xmlNodePtr node = pcmk__output_create_xml_node(out, "operation_history");
rpm-build 3ee90c
rpm-build 3ee90c
    xmlSetProp(node, (pcmkXmlStr) "call",
rpm-build 3ee90c
               (pcmkXmlStr) crm_element_value(xml_op, XML_LRM_ATTR_CALLID));
rpm-build 3ee90c
    xmlSetProp(node, (pcmkXmlStr) "task", (pcmkXmlStr) task);
rpm-build 3ee90c
rpm-build 3ee90c
    if (interval_ms_s && safe_str_neq(interval_ms_s, "0")) {
rpm-build 3ee90c
        char *s = crm_strdup_printf("%sms", interval_ms_s);
rpm-build 3ee90c
        xmlSetProp(node, (pcmkXmlStr) "interval", (pcmkXmlStr) s);
rpm-build 3ee90c
        free(s);
rpm-build 3ee90c
    }
rpm-build 3ee90c
rpm-build 3ee90c
    if (is_set(mon_ops, mon_op_print_timing)) {
rpm-build 3ee90c
        const char *value = NULL;
rpm-build 3ee90c
rpm-build 3ee90c
        value = crm_element_value(xml_op, XML_RSC_OP_LAST_CHANGE);
rpm-build 3ee90c
        if (value) {
rpm-build 3ee90c
            time_t int_value = (time_t) crm_parse_int(value, NULL);
rpm-build 3ee90c
            if (int_value > 0) {
rpm-build 3ee90c
                xmlSetProp(node, (pcmkXmlStr) XML_RSC_OP_LAST_CHANGE,
rpm-build 3ee90c
                           (pcmkXmlStr) crm_now_string(&int_value));
rpm-build 3ee90c
            }
rpm-build 3ee90c
        }
rpm-build 3ee90c
rpm-build 3ee90c
        value = crm_element_value(xml_op, XML_RSC_OP_LAST_RUN);
rpm-build 3ee90c
        if (value) {
rpm-build 3ee90c
            time_t int_value = (time_t) crm_parse_int(value, NULL);
rpm-build 3ee90c
            if (int_value > 0) {
rpm-build 3ee90c
                xmlSetProp(node, (pcmkXmlStr) XML_RSC_OP_LAST_RUN,
rpm-build 3ee90c
                           (pcmkXmlStr) crm_now_string(&int_value));
rpm-build 3ee90c
            }
rpm-build 3ee90c
        }
rpm-build 3ee90c
rpm-build 3ee90c
        value = crm_element_value(xml_op, XML_RSC_OP_T_EXEC);
rpm-build 3ee90c
        if (value) {
rpm-build 3ee90c
            char *s = crm_strdup_printf("%sms", value);
rpm-build 3ee90c
            xmlSetProp(node, (pcmkXmlStr) XML_RSC_OP_T_EXEC, (pcmkXmlStr) s);
rpm-build 3ee90c
            free(s);
rpm-build 3ee90c
        }
rpm-build 3ee90c
        value = crm_element_value(xml_op, XML_RSC_OP_T_QUEUE);
rpm-build 3ee90c
        if (value) {
rpm-build 3ee90c
            char *s = crm_strdup_printf("%sms", value);
rpm-build 3ee90c
            xmlSetProp(node, (pcmkXmlStr) XML_RSC_OP_T_QUEUE, (pcmkXmlStr) s);
rpm-build 3ee90c
            free(s);
rpm-build 3ee90c
        }
rpm-build 3ee90c
    }
rpm-build 3ee90c
rpm-build 3ee90c
    rc_s = crm_itoa(rc);
rpm-build 3ee90c
    xmlSetProp(node, (pcmkXmlStr) "rc", (pcmkXmlStr) rc_s);
rpm-build 3ee90c
    xmlSetProp(node, (pcmkXmlStr) "rc_text", (pcmkXmlStr) services_ocf_exitcode_str(rc));
rpm-build 3ee90c
    free(rc_s);
rpm-build 3ee90c
    return 0;
rpm-build 3ee90c
}
rpm-build 3ee90c
rpm-build 3ee90c
static int
rpm-build 3ee90c
resource_history_text(pcmk__output_t *out, va_list args) {
rpm-build 3ee90c
    resource_t *rsc = va_arg(args, resource_t *);
rpm-build 3ee90c
    const char *rsc_id = va_arg(args, const char *);
rpm-build 3ee90c
    gboolean all = va_arg(args, gboolean);
rpm-build 3ee90c
    int failcount = va_arg(args, int);
rpm-build 3ee90c
    time_t last_failure = va_arg(args, int);
rpm-build 3ee90c
rpm-build 3ee90c
    char *buf = resource_history_string(rsc, rsc_id, all, failcount, last_failure);
rpm-build 3ee90c
rpm-build 3ee90c
    out->begin_list(out, NULL, NULL, "%s", buf);
rpm-build 3ee90c
    free(buf);
rpm-build 3ee90c
    return 0;
rpm-build 3ee90c
}
rpm-build 3ee90c
rpm-build 3ee90c
static int
rpm-build 3ee90c
resource_history_xml(pcmk__output_t *out, va_list args) {
rpm-build 3ee90c
    resource_t *rsc = va_arg(args, resource_t *);
rpm-build 3ee90c
    const char *rsc_id = va_arg(args, const char *);
rpm-build 3ee90c
    gboolean all = va_arg(args, gboolean);
rpm-build 3ee90c
    int failcount = va_arg(args, int);
rpm-build 3ee90c
    time_t last_failure = va_arg(args, int);
rpm-build 3ee90c
rpm-build 3ee90c
    xmlNodePtr node = pcmk__output_xml_create_parent(out, "resource_history");
rpm-build 3ee90c
    xmlSetProp(node, (pcmkXmlStr) "id", (pcmkXmlStr) rsc_id);
rpm-build 3ee90c
rpm-build 3ee90c
    if (rsc == NULL) {
rpm-build 3ee90c
        xmlSetProp(node, (pcmkXmlStr) "orphan", (pcmkXmlStr) "true");
rpm-build 3ee90c
    } else if (all || failcount || last_failure > 0) {
rpm-build 3ee90c
        char *migration_s = crm_itoa(rsc->migration_threshold);
rpm-build 3ee90c
rpm-build 3ee90c
        xmlSetProp(node, (pcmkXmlStr) "orphan", (pcmkXmlStr) "false");
rpm-build 3ee90c
        xmlSetProp(node, (pcmkXmlStr) "migration-threshold",
rpm-build 3ee90c
                   (pcmkXmlStr) migration_s);
rpm-build 3ee90c
        free(migration_s);
rpm-build 3ee90c
rpm-build 3ee90c
        if (failcount > 0) {
rpm-build 3ee90c
            char *s = crm_itoa(failcount);
rpm-build 3ee90c
            xmlSetProp(node, (pcmkXmlStr) CRM_FAIL_COUNT_PREFIX, (pcmkXmlStr) s);
rpm-build 3ee90c
            free(s);
rpm-build 3ee90c
        }
rpm-build 3ee90c
rpm-build 3ee90c
        if (last_failure > 0) {
rpm-build 3ee90c
            xmlSetProp(node, (pcmkXmlStr) CRM_LAST_FAILURE_PREFIX,
rpm-build 3ee90c
                       (pcmkXmlStr) crm_now_string(&last_failure));
rpm-build 3ee90c
        }
rpm-build 3ee90c
    }
rpm-build 3ee90c
rpm-build 3ee90c
    return 0;
rpm-build 3ee90c
}
rpm-build 3ee90c
rpm-build 3ee90c
static int
rpm-build 3ee90c
stonith_event_console(pcmk__output_t *out, va_list args) {
rpm-build 3ee90c
    stonith_history_t *event = va_arg(args, stonith_history_t *);
rpm-build 3ee90c
    int full_history = va_arg(args, int);
rpm-build 3ee90c
    gboolean later_succeeded = va_arg(args, gboolean);
rpm-build 3ee90c
rpm-build 3ee90c
    char *buf = NULL;
rpm-build 3ee90c
rpm-build 3ee90c
    buf = time_t_string(event->completed);
rpm-build 3ee90c
rpm-build 3ee90c
    switch (event->state) {
rpm-build 3ee90c
        case st_failed:
rpm-build 3ee90c
            curses_indented_printf(out, "%s of %s failed: delegate=%s, client=%s, origin=%s, %s='%s %s'\n",
rpm-build 3ee90c
                                   stonith_action_str(event->action), event->target,
rpm-build 3ee90c
                                   event->delegate ? event->delegate : "",
rpm-build 3ee90c
                                   event->client, event->origin,
rpm-build 3ee90c
                                   full_history ? "completed" : "last-failed", buf,
rpm-build 3ee90c
                                   later_succeeded ? "(a later attempt succeeded)" : "");
rpm-build 3ee90c
            break;
rpm-build 3ee90c
rpm-build 3ee90c
        case st_done:
rpm-build 3ee90c
            curses_indented_printf(out, "%s of %s successful: delegate=%s, client=%s, origin=%s, %s='%s'\n",
rpm-build 3ee90c
                                   stonith_action_str(event->action), event->target,
rpm-build 3ee90c
                                   event->delegate ? event->delegate : "",
rpm-build 3ee90c
                                   event->client, event->origin,
rpm-build 3ee90c
                                   full_history ? "completed" : "last-successful", buf);
rpm-build 3ee90c
            break;
rpm-build 3ee90c
rpm-build 3ee90c
        default:
rpm-build 3ee90c
            curses_indented_printf(out, "%s of %s pending: client=%s, origin=%s\n",
rpm-build 3ee90c
                                   stonith_action_str(event->action), event->target,
rpm-build 3ee90c
                                   event->client, event->origin);
rpm-build 3ee90c
            break;
rpm-build 3ee90c
    }
rpm-build 3ee90c
rpm-build 3ee90c
    free(buf);
rpm-build 3ee90c
    return 0;
rpm-build 3ee90c
}
rpm-build 3ee90c
rpm-build 3ee90c
static int
rpm-build 3ee90c
ticket_console(pcmk__output_t *out, va_list args) {
rpm-build 3ee90c
    ticket_t *ticket = va_arg(args, ticket_t *);
rpm-build 3ee90c
rpm-build 3ee90c
    if (ticket->last_granted > -1) {
rpm-build 3ee90c
        char *time = pcmk_format_named_time("last-granted", ticket->last_granted);
rpm-build 3ee90c
        out->list_item(out, ticket->id, "\t%s%s %s",
rpm-build 3ee90c
                       ticket->granted ? "granted" : "revoked",
rpm-build 3ee90c
                       ticket->standby ? " [standby]" : "",
rpm-build 3ee90c
                       time);
rpm-build 3ee90c
        free(time);
rpm-build 3ee90c
    } else {
rpm-build 3ee90c
        out->list_item(out, ticket->id, "\t%s%s",
rpm-build 3ee90c
                       ticket->granted ? "granted" : "revoked",
rpm-build 3ee90c
                       ticket->standby ? " [standby]" : "");
rpm-build 3ee90c
    }
rpm-build 3ee90c
rpm-build 3ee90c
    return 0;
rpm-build 3ee90c
}
rpm-build 3ee90c
rpm-build 3ee90c
static pcmk__message_entry_t fmt_functions[] = {
rpm-build 3ee90c
    { "ban", "console", ban_text },
rpm-build 3ee90c
    { "ban", "html", ban_html },
rpm-build 3ee90c
    { "ban", "text", ban_text },
rpm-build 3ee90c
    { "ban", "xml", ban_xml },
rpm-build 3ee90c
    { "bundle", "console", pe__bundle_text },
rpm-build 3ee90c
    { "clone", "console", pe__clone_text },
rpm-build 3ee90c
    { "cluster-counts", "console", cluster_counts_text },
rpm-build 3ee90c
    { "cluster-counts", "html", cluster_counts_html },
rpm-build 3ee90c
    { "cluster-counts", "text", cluster_counts_text },
rpm-build 3ee90c
    { "cluster-counts", "xml", cluster_counts_xml },
rpm-build 3ee90c
    { "cluster-dc", "console", cluster_dc_text },
rpm-build 3ee90c
    { "cluster-dc", "html", cluster_dc_html },
rpm-build 3ee90c
    { "cluster-dc", "text", cluster_dc_text },
rpm-build 3ee90c
    { "cluster-dc", "xml", cluster_dc_xml },
rpm-build 3ee90c
    { "cluster-options", "console", cluster_options_text },
rpm-build 3ee90c
    { "cluster-options", "html", cluster_options_html },
rpm-build 3ee90c
    { "cluster-options", "text", cluster_options_text },
rpm-build 3ee90c
    { "cluster-options", "xml", cluster_options_xml },
rpm-build 3ee90c
    { "cluster-stack", "console", cluster_stack_text },
rpm-build 3ee90c
    { "cluster-stack", "html", cluster_stack_html },
rpm-build 3ee90c
    { "cluster-stack", "text", cluster_stack_text },
rpm-build 3ee90c
    { "cluster-stack", "xml", cluster_stack_xml },
rpm-build 3ee90c
    { "cluster-times", "console", cluster_times_text },
rpm-build 3ee90c
    { "cluster-times", "html", cluster_times_html },
rpm-build 3ee90c
    { "cluster-times", "text", cluster_times_text },
rpm-build 3ee90c
    { "cluster-times", "xml", cluster_times_xml },
rpm-build 3ee90c
    { "failed-action", "console", failed_action_console },
rpm-build 3ee90c
    { "failed-action", "html", failed_action_html },
rpm-build 3ee90c
    { "failed-action", "text", failed_action_text },
rpm-build 3ee90c
    { "failed-action", "xml", failed_action_xml },
rpm-build 3ee90c
    { "group", "console", pe__group_text },
rpm-build 3ee90c
    { "node", "console", node_text },
rpm-build 3ee90c
    { "node", "html", node_html },
rpm-build 3ee90c
    { "node", "text", node_text },
rpm-build 3ee90c
    { "node", "xml", node_xml },
rpm-build 3ee90c
    { "node-attribute", "console", node_attribute_text },
rpm-build 3ee90c
    { "node-attribute", "html", node_attribute_html },
rpm-build 3ee90c
    { "node-attribute", "text", node_attribute_text },
rpm-build 3ee90c
    { "node-attribute", "xml", node_attribute_xml },
rpm-build 3ee90c
    { "op-history", "console", op_history_text },
rpm-build 3ee90c
    { "op-history", "html", op_history_text },
rpm-build 3ee90c
    { "op-history", "text", op_history_text },
rpm-build 3ee90c
    { "op-history", "xml", op_history_xml },
rpm-build 3ee90c
    { "primitive", "console", pe__resource_text },
rpm-build 3ee90c
    { "resource-history", "console", resource_history_text },
rpm-build 3ee90c
    { "resource-history", "html", resource_history_text },
rpm-build 3ee90c
    { "resource-history", "text", resource_history_text },
rpm-build 3ee90c
    { "resource-history", "xml", resource_history_xml },
rpm-build 3ee90c
    { "stonith-event", "console", stonith_event_console },
rpm-build 3ee90c
    { "ticket", "console", ticket_console },
rpm-build 3ee90c
rpm-build 3ee90c
    { NULL, NULL, NULL }
rpm-build 3ee90c
};
rpm-build 3ee90c
rpm-build 3ee90c
void
rpm-build 3ee90c
crm_mon_register_messages(pcmk__output_t *out) {
rpm-build 3ee90c
    pcmk__register_messages(out, fmt_functions);
rpm-build 3ee90c
}