summaryrefslogtreecommitdiffstats
path: root/include/crm/common/xml.h
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--include/crm/common/xml.h224
1 files changed, 20 insertions, 204 deletions
diff --git a/include/crm/common/xml.h b/include/crm/common/xml.h
index ac839d3..fd7e185 100644
--- a/include/crm/common/xml.h
+++ b/include/crm/common/xml.h
@@ -1,5 +1,5 @@
/*
- * Copyright 2004-2023 the Pacemaker project contributors
+ * Copyright 2004-2024 the Pacemaker project contributors
*
* The version control history for this file may have further details.
*
@@ -8,22 +8,25 @@
*/
#ifndef PCMK__CRM_COMMON_XML__H
-# define PCMK__CRM_COMMON_XML__H
+#define PCMK__CRM_COMMON_XML__H
-# include <stdio.h>
-# include <sys/types.h>
-# include <unistd.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <unistd.h>
-# include <stdlib.h>
-# include <errno.h>
-# include <fcntl.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <fcntl.h>
-# include <libxml/tree.h>
-# include <libxml/xpath.h>
+#include <libxml/tree.h>
+#include <libxml/xpath.h>
-# include <crm/crm.h>
-# include <crm/common/nvpair.h>
+#include <crm/crm.h>
+#include <crm/common/nvpair.h>
+#include <crm/common/schemas.h>
+#include <crm/common/xml_io.h>
+#include <crm/common/xml_names.h>
#ifdef __cplusplus
extern "C" {
@@ -35,218 +38,35 @@ extern "C" {
* \ingroup core
*/
-/* Define compression parameters for IPC messages
- *
- * Compression costs a LOT, so we don't want to do it unless we're hitting
- * message limits. Currently, we use 128KB as the threshold, because higher
- * values don't play well with the heartbeat stack. With an earlier limit of
- * 10KB, compressing 184 of 1071 messages accounted for 23% of the total CPU
- * used by the cib.
- */
-# define CRM_BZ2_BLOCKS 4
-# define CRM_BZ2_WORK 20
-# define CRM_BZ2_THRESHOLD 128 * 1024
-
typedef const xmlChar *pcmkXmlStr;
-gboolean add_message_xml(xmlNode * msg, const char *field, xmlNode * xml);
-xmlNode *get_message_xml(const xmlNode *msg, const char *field);
-
-/*
- * \brief xmlCopyPropList ACLs-sensitive replacement expading i++ notation
- *
- * The gist is the same as with \c{xmlCopyPropList(target, src->properties)}.
- * The function exits prematurely when any attribute cannot be copied for
- * ACLs violation. Even without bailing out, the result can possibly be
- * incosistent with expectations in that case, hence the caller shall,
- * aposteriori, verify that no document-level-tracked denial was indicated
- * with \c{xml_acl_denied(target)} and drop whole such intermediate object.
- *
- * \param[in,out] target Element to receive attributes from #src element
- * \param[in] src Element carrying attributes to copy over to #target
- *
- * \note Original commit 1c632c506 sadly haven't stated which otherwise
- * assumed behaviours of xmlCopyPropList were missing beyond otherwise
- * custom extensions like said ACLs and "atomic increment" (that landed
- * later on, anyway).
- */
-void copy_in_properties(xmlNode *target, const xmlNode *src);
-
-void expand_plus_plus(xmlNode * target, const char *name, const char *value);
-void fix_plus_plus_recursive(xmlNode * target);
-
-/*
- * Create a node named "name" as a child of "parent"
- * If parent is NULL, creates an unconnected node.
- *
- * Returns the created node
- *
- */
-xmlNode *create_xml_node(xmlNode * parent, const char *name);
-
-/*
- * Create a node named "name" as a child of "parent", giving it the provided
- * text content.
- * If parent is NULL, creates an unconnected node.
- *
- * Returns the created node
- *
- */
-xmlNode *pcmk_create_xml_text_node(xmlNode * parent, const char *name, const char *content);
-
-/*
- * Create a new HTML node named "element_name" as a child of "parent", giving it the
- * provided text content. Optionally, apply a CSS #id and #class.
- *
- * Returns the created node.
- */
-xmlNode *pcmk_create_html_node(xmlNode * parent, const char *element_name, const char *id,
- const char *class_name, const char *text);
-
-/*
- *
- */
-void purge_diff_markers(xmlNode * a_node);
-
-/*
- * Returns a deep copy of src_node
- *
- */
-xmlNode *copy_xml(xmlNode * src_node);
-
-/*
- * Add a copy of xml_node to new_parent
- */
-xmlNode *add_node_copy(xmlNode * new_parent, xmlNode * xml_node);
-
-/*
- * XML I/O Functions
- *
- * Whitespace between tags is discarded.
- */
-xmlNode *filename2xml(const char *filename);
-
-xmlNode *stdin2xml(void);
-
-xmlNode *string2xml(const char *input);
-
-int write_xml_fd(const xmlNode *xml, const char *filename, int fd,
- gboolean compress);
-int write_xml_file(const xmlNode *xml, const char *filename, gboolean compress);
-
-char *dump_xml_formatted(const xmlNode *xml);
-char *dump_xml_formatted_with_text(const xmlNode *xml);
-char *dump_xml_unformatted(const xmlNode *xml);
-
-/*
- * Diff related Functions
- */
-xmlNode *diff_xml_object(xmlNode * left, xmlNode * right, gboolean suppress);
-
-xmlNode *subtract_xml_object(xmlNode * parent, xmlNode * left, xmlNode * right,
- gboolean full, gboolean * changed, const char *marker);
-
-gboolean can_prune_leaf(xmlNode * xml_node);
/*
* Searching & Modifying
*/
-xmlNode *find_xml_node(const xmlNode *root, const char *search_path,
- gboolean must_find);
-
-void xml_remove_prop(xmlNode * obj, const char *name);
-
-gboolean replace_xml_child(xmlNode * parent, xmlNode * child, xmlNode * update,
- gboolean delete_only);
-
-gboolean update_xml_child(xmlNode * child, xmlNode * to_update);
-
-int find_xml_children(xmlNode ** children, xmlNode * root,
- const char *tag, const char *field, const char *value,
- gboolean search_matches);
+// NOTE: sbd (as of at least 1.5.2) uses this
xmlNode *get_xpath_object(const char *xpath, xmlNode * xml_obj, int error_level);
-xmlNode *get_xpath_object_relative(const char *xpath, xmlNode * xml_obj, int error_level);
-
-static inline const char *
-crm_map_element_name(const xmlNode *xml)
-{
- if (xml == NULL) {
- return NULL;
- } else if (strcmp((const char *) xml->name, "master") == 0) {
- return "clone";
- } else {
- return (const char *) xml->name;
- }
-}
char *calculate_on_disk_digest(xmlNode * local_cib);
char *calculate_operation_digest(xmlNode * local_cib, const char *version);
char *calculate_xml_versioned_digest(xmlNode * input, gboolean sort, gboolean do_filter,
const char *version);
-/* schema-related functions (from schemas.c) */
-gboolean validate_xml(xmlNode * xml_blob, const char *validation, gboolean to_logs);
-gboolean validate_xml_verbose(const xmlNode *xml_blob);
-
-/*!
- * \brief Update CIB XML to most recent schema version
- *
- * "Update" means either actively employ XSLT-based transformation(s)
- * (if intermediate product to transform valid per its declared schema version,
- * transformation available, proceeded successfully with a result valid per
- * expectated newer schema version), or just try to bump the marked validating
- * schema until all gradually rising schema versions attested or the first
- * such attempt subsequently fails to validate. Which of the two styles will
- * be used depends on \p transform parameter (positive/negative, respectively).
- *
- * \param[in,out] xml_blob XML tree representing CIB, may be swapped with
- * an "updated" one
- * \param[out] best The highest configuration version (per its index
- * in the global schemas table) it was possible to
- * reach during the update steps while ensuring
- * the validity of the result; if no validation
- * success was observed against possibly multiple
- * schemas, the value is less or equal the result
- * of \c get_schema_version applied on the input
- * \p xml_blob value (unless that function maps it
- * to -1, then 0 would be used instead)
- * \param[in] max When \p transform is positive, this allows to
- * set upper boundary schema (per its index in the
- * global schemas table) beyond which it's forbidden
- * to update by the means of XSLT transformation
- * \param[in] transform Whether to employ XSLT-based transformation so
- * as to allow overcoming possible incompatibilities
- * between major schema versions (see above)
- * \param[in] to_logs If true, output notable progress info to
- * internal log streams; if false, to stderr
- *
- * \return \c pcmk_ok if no non-recoverable error encountered (up to
- * caller to evaluate if the update satisfies the requirements
- * per returned \p best value), negative value carrying the reason
- * otherwise
- */
-int update_validation(xmlNode **xml_blob, int *best, int max,
- gboolean transform, gboolean to_logs);
-
-int get_schema_version(const char *name);
-const char *get_schema_name(int version);
-const char *xml_latest_schema(void);
-gboolean cli_config_update(xmlNode ** xml, int *best_version, gboolean to_logs);
-
+// NOTE: sbd (as of at least 1.5.2) uses this
/*!
* \brief Initialize the CRM XML subsystem
*
* This method sets global XML settings and loads pacemaker schemas into the cache.
*/
void crm_xml_init(void);
+
void crm_xml_cleanup(void);
void pcmk_free_xml_subtree(xmlNode *xml);
-void free_xml(xmlNode * child);
-xmlNode *first_named_child(const xmlNode *parent, const char *name);
-xmlNode *crm_next_same_xml(const xmlNode *sibling);
+// NOTE: sbd (as of at least 1.5.2) uses this
+void free_xml(xmlNode * child);
xmlNode *sorted_xml(xmlNode * input, xmlNode * parent, gboolean recursive);
xmlXPathObjectPtr xpath_search(const xmlNode *xml_top, const char *path);
@@ -280,10 +100,6 @@ int xml_apply_patchset(xmlNode *xml, xmlNode *patchset, bool check_version);
void patchset_process_digest(xmlNode *patch, xmlNode *source, xmlNode *target, bool with_digest);
-void save_xml_to_file(const xmlNode *xml, const char *desc,
- const char *filename);
-
-char * crm_xml_escape(const char *text);
void crm_xml_sanitize_id(char *id);
void crm_xml_set_id(xmlNode *xml, const char *format, ...) G_GNUC_PRINTF(2, 3);