42 free(
data->digest_all_calc);
43 free(
data->digest_restart_calc);
44 free(
data->digest_secure_calc);
52attr_not_in_string(xmlAttrPtr a,
void *user_data)
57 if (strstr((
const char *) user_data,
name) == NULL) {
58 crm_trace(
"Filtering %s (not found in '%s')",
59 (
const char *) a->name, (
const char *) user_data);
68attr_in_string(xmlAttrPtr a,
void *user_data)
73 if (strstr((
const char *) user_data,
name) != NULL) {
75 (
const char *) a->name, (
const char *) user_data);
100 const char *task, guint *interval_ms,
101 const xmlNode *xml_op,
const char *op_version,
104 xmlNode *action_config = NULL;
114 if (overrides != NULL) {
117 const char *interval_s = g_hash_table_lookup(overrides, meta_name);
119 if (interval_s != NULL) {
123 && (value_ll >= 0) && (value_ll <= G_MAXUINT)) {
124 *interval_ms = (guint) value_ll;
150 if ((*interval_ms == 0) && (g_hash_table_size(params) > 0)) {
154 g_hash_table_destroy(params);
160 g_hash_table_destroy(params);
169is_fence_param(xmlAttrPtr attr,
void *user_data)
187 GHashTable *params,
const xmlNode *xml_op,
188 const char *op_version, GHashTable *overrides)
191 const char *secure_list = NULL;
194 if (xml_op == NULL) {
195 secure_list =
" passwd password user ";
202 if (overrides != NULL) {
213 if (secure_list != NULL) {
215 attr_in_string, (
void *) secure_list);
226 is_fence_param, NULL);
257 const char *op_version)
259 const char *value = NULL;
262 if (xml_op == NULL) {
278 attr_not_in_string, (
void *) value);
304 const xmlNode *xml_op, GHashTable *overrides,
308 const char *op_version = NULL;
309 GHashTable *params = NULL;
316 "Could not allocate memory for operation digest");
322 if (xml_op != NULL) {
331 if (op_version == NULL) {
336 calculate_main_digest(
data, rsc, node, params, task, interval_ms, xml_op,
339 calculate_secure_digest(
data, rsc, params, xml_op, op_version,
342 calculate_restart_digest(
data, xml_op, op_version);
361rsc_action_digest(
pcmk_resource_t *rsc,
const char *task, guint interval_ms,
395 guint interval_ms = 0;
397 const char *op_version;
399 const char *digest_all;
400 const char *digest_restart;
409 data = rsc_action_digest(rsc, task, interval_ms, node, xml_op,
414 if (!pcmk__str_eq(
data->digest_restart_calc, digest_restart,
417 "Parameter change for %s-interval %s of %s on %s "
418 "requires restart (hash now %s vs. %s "
419 "with op feature set %s for transition %s)",
421 pcmk__node_name(node),
data->digest_restart_calc,
422 pcmk__s(digest_restart,
"missing"), op_version,
426 }
else if (digest_all == NULL) {
430 }
else if (strcmp(digest_all,
data->digest_all_calc) != 0) {
442 "Parameters containing extra ones to %ums-interval"
443 " %s action for %s on %s "
444 "changed: hash was %s vs. now %s (restart:%s) %s",
445 interval_ms, task, rsc->
id, pcmk__node_name(node),
446 pcmk__s(digest_all,
"missing"),
447 data->digest_all_calc, op_version,
453 "Parameters to %ums-interval %s action for %s on %s "
454 "changed: hash was %s vs. now %s (%s:%s) %s",
455 interval_ms, task, rsc->
id, pcmk__node_name(node),
456 pcmk__s(digest_all,
"missing"),
457 data->digest_all_calc,
458 (interval_ms > 0)?
"reschedule" :
"reload",
489create_unfencing_summary(
const char *rsc_id,
const char *agent_type,
490 const char *param_digest)
512unfencing_digest_matches(
const char *rsc_id,
const char *agent,
513 const char *digest_calc,
const char *node_summary)
515 bool matches = FALSE;
517 if (rsc_id && agent && digest_calc && node_summary) {
518 char *search_secure = create_unfencing_summary(rsc_id, agent,
524 matches = (strstr(node_summary, search_secure) != NULL);
525 crm_trace(
"Calculated unfencing digest '%s' %sfound in '%s'",
526 search_secure, matches?
"" :
"not ", node_summary);
536#define STONITH_DIGEST_TASK "stonith-on"
553 const char *node_summary = NULL;
562 if (node_summary == NULL) {
568 if (unfencing_digest_matches(rsc->
id, agent,
data->digest_all_calc,
577 if (unfencing_digest_matches(rsc->
id, agent,
data->digest_secure_calc,
583 out->
info(out,
"Only 'private' parameters to %s "
584 "for unfencing %s changed", rsc->
id,
585 pcmk__node_name(node));
593 && (
data->digest_secure_calc != NULL)) {
597 char *digest = create_unfencing_summary(rsc->
id, agent,
598 data->digest_secure_calc);
600 out->
info(out,
"Parameters to %s for unfencing "
601 "%s changed, try '%s'", rsc->
id,
602 pcmk__node_name(node), digest);
605 char *digest = create_unfencing_summary(rsc->
id, agent,
606 data->digest_secure_calc);
608 printf(
"Parameters to %s for unfencing %s changed, try '%s'\n",
609 rsc->
id, pcmk__node_name(node), digest);
void pcmk__filter_op_for_digest(xmlNode *param_set)
char * pcmk__op_key(const char *rsc_id, const char *op_type, guint interval_ms)
Generate an operation key (RESOURCE_ACTION_INTERVAL)
uint32_t pcmk_get_ra_caps(const char *standard)
Get capabilities of a resource agent standard.
bool pcmk_stonith_param(const char *param)
Check whether a given stonith parameter is handled by Pacemaker.
@ pcmk_ra_cap_fence_params
const char * pcmk__node_attr(const pcmk_node_t *node, const char *name, const char *target, enum pcmk__rsc_node node_type)
int compare_version(const char *version1, const char *version2)
#define pcmk_is_set(g, f)
Convenience alias for pcmk_all_flags_set(), to check single flag.
GHashTable * pe_rsc_params(pcmk_resource_t *rsc, const pcmk_node_t *node, pcmk_scheduler_t *scheduler)
Get a table of resource parameters.
#define CRM_ATTR_DIGESTS_ALL
#define CRM_ATTR_DIGESTS_SECURE
char * pcmk__digest_operation(xmlNode *input)
const char * pcmk__readable_interval(guint interval_ms)
#define CRM_CHECK(expr, failure_action)
#define crm_trace(fmt, args...)
pcmk_scheduler_t * scheduler
void hash2metafield(gpointer key, gpointer value, gpointer user_data)
Set XML attribute based on hash table entry, as meta-attribute name.
void hash2field(gpointer key, gpointer value, gpointer user_data)
Set XML attribute based on hash table entry.
#define PCMK_META_INTERVAL
#define PCMK_REMOTE_RA_ADDR
#define PCMK_META_TIMEOUT
pcmk__op_digest_t * rsc_action_digest_cmp(pcmk_resource_t *rsc, const xmlNode *xml_op, pcmk_node_t *node, pcmk_scheduler_t *scheduler)
#define STONITH_DIGEST_TASK
pcmk__op_digest_t * pe__compare_fencing_digest(pcmk_resource_t *rsc, const char *agent, pcmk_node_t *node, pcmk_scheduler_t *scheduler)
pcmk__op_digest_t * pe__calculate_digests(pcmk_resource_t *rsc, const char *task, guint *interval_ms, const pcmk_node_t *node, const xmlNode *xml_op, GHashTable *overrides, bool calc_secure, pcmk_scheduler_t *scheduler)
void pe__free_digests(gpointer ptr)
GHashTable * pcmk__unpack_action_meta(pcmk_resource_t *rsc, const pcmk_node_t *node, const char *action_name, guint interval_ms, const xmlNode *action_config)
const char * pe__add_bundle_remote_name(pcmk_resource_t *rsc, xmlNode *xml, const char *field)
GHashTable * pcmk__unpack_action_rsc_params(const xmlNode *action_xml, GHashTable *node_attrs, pcmk_scheduler_t *data_set)
xmlNode * pcmk__find_action_config(const pcmk_resource_t *rsc, const char *action_name, guint interval_ms, bool include_disabled)
#define pcmk__assert(expr)
#define pcmk__sched_err(scheduler, fmt...)
#define pcmk__rsc_info(rsc, fmt, args...)
char * crm_strdup_printf(char const *format,...) G_GNUC_PRINTF(1
int pcmk__scan_ll(const char *text, long long *result, long long default_value)
GHashTable * digest_cache
This structure contains everything that makes up a single output formatter.
int(* info)(pcmk__output_t *out, const char *format,...) G_GNUC_PRINTF(2
pcmk__scheduler_private_t * priv
pcmk__node_private_t * priv
Wrappers for and extensions to libxml2.
const char * crm_element_value(const xmlNode *data, const char *name)
Retrieve the value of an XML attribute.
int crm_element_value_ms(const xmlNode *data, const char *name, guint *dest)
Retrieve the millisecond value of an XML attribute.
void pcmk__xe_remove_attr(xmlNode *element, const char *name)
void pcmk__xe_remove_matching_attrs(xmlNode *element, bool force, bool(*match)(xmlAttrPtr, void *), void *user_data)
xmlNode * pcmk__xe_create(xmlNode *parent, const char *name)
xmlNode * pcmk__xml_copy(xmlNode *parent, xmlNode *src)
void pcmk__xml_free(xmlNode *xml)
#define PCMK_XA_OPERATION
#define PCMK_XA_CRM_FEATURE_SET
#define PCMK_XE_PARAMETERS
#define PCMK__XA_OP_DIGEST
#define PCMK__XA_TRANSITION_MAGIC
#define PCMK__XA_OP_RESTART_DIGEST
#define PCMK__XA_OP_FORCE_RESTART
#define PCMK__XA_OP_SECURE_PARAMS