pacemaker 2.1.7-2.1.7
Scalable High-Availability cluster resource manager
Loading...
Searching...
No Matches
xml.h
Go to the documentation of this file.
1/*
2 * Copyright 2004-2023 the Pacemaker project contributors
3 *
4 * The version control history for this file may have further details.
5 *
6 * This source code is licensed under the GNU Lesser General Public License
7 * version 2.1 or later (LGPLv2.1+) WITHOUT ANY WARRANTY.
8 */
9
10#ifndef PCMK__CRM_COMMON_XML__H
11# define PCMK__CRM_COMMON_XML__H
12
13
14# include <stdio.h>
15# include <sys/types.h>
16# include <unistd.h>
17
18# include <stdlib.h>
19# include <errno.h>
20# include <fcntl.h>
21
22# include <libxml/tree.h>
23# include <libxml/xpath.h>
24
25# include <crm/crm.h>
26# include <crm/common/nvpair.h>
27
28#ifdef __cplusplus
29extern "C" {
30#endif
31
38/* Define compression parameters for IPC messages
39 *
40 * Compression costs a LOT, so we don't want to do it unless we're hitting
41 * message limits. Currently, we use 128KB as the threshold, because higher
42 * values don't play well with the heartbeat stack. With an earlier limit of
43 * 10KB, compressing 184 of 1071 messages accounted for 23% of the total CPU
44 * used by the cib.
45 */
46# define CRM_BZ2_BLOCKS 4
47# define CRM_BZ2_WORK 20
48# define CRM_BZ2_THRESHOLD 128 * 1024
49
50typedef const xmlChar *pcmkXmlStr;
51
52gboolean add_message_xml(xmlNode * msg, const char *field, xmlNode * xml);
53xmlNode *get_message_xml(const xmlNode *msg, const char *field);
54
55/*
56 * \brief xmlCopyPropList ACLs-sensitive replacement expading i++ notation
57 *
58 * The gist is the same as with \c{xmlCopyPropList(target, src->properties)}.
59 * The function exits prematurely when any attribute cannot be copied for
60 * ACLs violation. Even without bailing out, the result can possibly be
61 * incosistent with expectations in that case, hence the caller shall,
62 * aposteriori, verify that no document-level-tracked denial was indicated
63 * with \c{xml_acl_denied(target)} and drop whole such intermediate object.
64 *
65 * \param[in,out] target Element to receive attributes from #src element
66 * \param[in] src Element carrying attributes to copy over to #target
67 *
68 * \note Original commit 1c632c506 sadly haven't stated which otherwise
69 * assumed behaviours of xmlCopyPropList were missing beyond otherwise
70 * custom extensions like said ACLs and "atomic increment" (that landed
71 * later on, anyway).
72 */
73void copy_in_properties(xmlNode *target, const xmlNode *src);
74
75void expand_plus_plus(xmlNode * target, const char *name, const char *value);
76void fix_plus_plus_recursive(xmlNode * target);
77
78/*
79 * Create a node named "name" as a child of "parent"
80 * If parent is NULL, creates an unconnected node.
81 *
82 * Returns the created node
83 *
84 */
85xmlNode *create_xml_node(xmlNode * parent, const char *name);
86
87/*
88 * Create a node named "name" as a child of "parent", giving it the provided
89 * text content.
90 * If parent is NULL, creates an unconnected node.
91 *
92 * Returns the created node
93 *
94 */
95xmlNode *pcmk_create_xml_text_node(xmlNode * parent, const char *name, const char *content);
96
97/*
98 * Create a new HTML node named "element_name" as a child of "parent", giving it the
99 * provided text content. Optionally, apply a CSS #id and #class.
100 *
101 * Returns the created node.
102 */
103xmlNode *pcmk_create_html_node(xmlNode * parent, const char *element_name, const char *id,
104 const char *class_name, const char *text);
105
106/*
107 *
108 */
109void purge_diff_markers(xmlNode * a_node);
110
111/*
112 * Returns a deep copy of src_node
113 *
114 */
115xmlNode *copy_xml(xmlNode * src_node);
116
117/*
118 * Add a copy of xml_node to new_parent
119 */
120xmlNode *add_node_copy(xmlNode * new_parent, xmlNode * xml_node);
121
122/*
123 * XML I/O Functions
124 *
125 * Whitespace between tags is discarded.
126 */
127xmlNode *filename2xml(const char *filename);
128
129xmlNode *stdin2xml(void);
130
131xmlNode *string2xml(const char *input);
132
133int write_xml_fd(const xmlNode *xml, const char *filename, int fd,
134 gboolean compress);
135int write_xml_file(const xmlNode *xml, const char *filename, gboolean compress);
136
137char *dump_xml_formatted(const xmlNode *xml);
138char *dump_xml_formatted_with_text(const xmlNode *xml);
139char *dump_xml_unformatted(const xmlNode *xml);
140
141/*
142 * Diff related Functions
143 */
144xmlNode *diff_xml_object(xmlNode * left, xmlNode * right, gboolean suppress);
145
146xmlNode *subtract_xml_object(xmlNode * parent, xmlNode * left, xmlNode * right,
147 gboolean full, gboolean * changed, const char *marker);
148
149gboolean can_prune_leaf(xmlNode * xml_node);
150
151/*
152 * Searching & Modifying
153 */
154xmlNode *find_xml_node(const xmlNode *root, const char *search_path,
155 gboolean must_find);
156
157void xml_remove_prop(xmlNode * obj, const char *name);
158
159gboolean replace_xml_child(xmlNode * parent, xmlNode * child, xmlNode * update,
160 gboolean delete_only);
161
162gboolean update_xml_child(xmlNode * child, xmlNode * to_update);
163
164int find_xml_children(xmlNode ** children, xmlNode * root,
165 const char *tag, const char *field, const char *value,
166 gboolean search_matches);
167
168xmlNode *get_xpath_object(const char *xpath, xmlNode * xml_obj, int error_level);
169xmlNode *get_xpath_object_relative(const char *xpath, xmlNode * xml_obj, int error_level);
170
171static inline const char *
172crm_map_element_name(const xmlNode *xml)
173{
174 if (xml == NULL) {
175 return NULL;
176 } else if (strcmp((const char *) xml->name, "master") == 0) {
177 return "clone";
178 } else {
179 return (const char *) xml->name;
180 }
181}
182
183char *calculate_on_disk_digest(xmlNode * local_cib);
184char *calculate_operation_digest(xmlNode * local_cib, const char *version);
185char *calculate_xml_versioned_digest(xmlNode * input, gboolean sort, gboolean do_filter,
186 const char *version);
187
188/* schema-related functions (from schemas.c) */
189gboolean validate_xml(xmlNode * xml_blob, const char *validation, gboolean to_logs);
190gboolean validate_xml_verbose(const xmlNode *xml_blob);
191
229int update_validation(xmlNode **xml_blob, int *best, int max,
230 gboolean transform, gboolean to_logs);
231
232int get_schema_version(const char *name);
233const char *get_schema_name(int version);
234const char *xml_latest_schema(void);
235gboolean cli_config_update(xmlNode ** xml, int *best_version, gboolean to_logs);
236
242void crm_xml_init(void);
243void crm_xml_cleanup(void);
244
245void pcmk_free_xml_subtree(xmlNode *xml);
246void free_xml(xmlNode * child);
247
248xmlNode *first_named_child(const xmlNode *parent, const char *name);
249xmlNode *crm_next_same_xml(const xmlNode *sibling);
250
251xmlNode *sorted_xml(xmlNode * input, xmlNode * parent, gboolean recursive);
252xmlXPathObjectPtr xpath_search(const xmlNode *xml_top, const char *path);
253void crm_foreach_xpath_result(xmlNode *xml, const char *xpath,
254 void (*helper)(xmlNode*, void*), void *user_data);
255xmlNode *expand_idref(xmlNode * input, xmlNode * top);
256
257void freeXpathObject(xmlXPathObjectPtr xpathObj);
258xmlNode *getXpathResult(xmlXPathObjectPtr xpathObj, int index);
259void dedupXpathResults(xmlXPathObjectPtr xpathObj);
260
261static inline int numXpathResults(xmlXPathObjectPtr xpathObj)
262{
263 if(xpathObj == NULL || xpathObj->nodesetval == NULL) {
264 return 0;
265 }
266 return xpathObj->nodesetval->nodeNr;
267}
268
269bool xml_tracking_changes(xmlNode * xml);
270bool xml_document_dirty(xmlNode *xml);
271void xml_track_changes(xmlNode * xml, const char *user, xmlNode *acl_source, bool enforce_acls);
272void xml_calculate_changes(xmlNode *old_xml, xmlNode *new_xml);
273void xml_calculate_significant_changes(xmlNode *old_xml, xmlNode *new_xml);
274void xml_accept_changes(xmlNode * xml);
275bool xml_patch_versions(const xmlNode *patchset, int add[3], int del[3]);
276
277xmlNode *xml_create_patchset(
278 int format, xmlNode *source, xmlNode *target, bool *config, bool manage_version);
279int xml_apply_patchset(xmlNode *xml, xmlNode *patchset, bool check_version);
280
281void patchset_process_digest(xmlNode *patch, xmlNode *source, xmlNode *target, bool with_digest);
282
283void save_xml_to_file(const xmlNode *xml, const char *desc,
284 const char *filename);
285
286char * crm_xml_escape(const char *text);
287void crm_xml_sanitize_id(char *id);
288void crm_xml_set_id(xmlNode *xml, const char *format, ...) G_GNUC_PRINTF(2, 3);
289
290#if !defined(PCMK_ALLOW_DEPRECATED) || (PCMK_ALLOW_DEPRECATED == 1)
292#endif
293
294#ifdef __cplusplus
295}
296#endif
297
298#endif
const char * parent
Definition cib.c:27
const char * path
Definition cib.c:28
const char * name
Definition cib.c:26
uint32_t version
Definition remote.c:1
A dumping ground.
xmlNode * input
Functionality for manipulating name/value pairs.
const char * target
Definition pcmk_fence.c:29
gboolean update_xml_child(xmlNode *child, xmlNode *to_update)
Definition xml.c:2307
const char * get_schema_name(int version)
Definition schemas.c:958
int get_schema_version(const char *name)
Definition schemas.c:967
int write_xml_fd(const xmlNode *xml, const char *filename, int fd, gboolean compress)
Write XML to a file descriptor.
Definition xml.c:1255
gboolean replace_xml_child(xmlNode *parent, xmlNode *child, xmlNode *update, gboolean delete_only)
Definition xml.c:2374
int update_validation(xmlNode **xml_blob, int *best, int max, gboolean transform, gboolean to_logs)
Update CIB XML to most recent schema version.
Definition schemas.c:984
xmlNode * filename2xml(const char *filename)
Definition xml.c:990
void dedupXpathResults(xmlXPathObjectPtr xpathObj)
Definition xpath.c:101
char * dump_xml_formatted_with_text(const xmlNode *xml)
Definition xml.c:1632
xmlNode * expand_idref(xmlNode *input, xmlNode *top)
Definition xml.c:2555
char * calculate_on_disk_digest(xmlNode *local_cib)
Calculate and return digest of XML tree, suitable for storing on disk.
Definition digest.c:131
void crm_foreach_xpath_result(xmlNode *xml, const char *xpath, void(*helper)(xmlNode *, void *), void *user_data)
Run a supplied function for each result of an xpath search.
Definition xpath.c:170
xmlNode * first_named_child(const xmlNode *parent, const char *name)
Definition xml.c:2484
xmlNode * pcmk_create_xml_text_node(xmlNode *parent, const char *name, const char *content)
Definition xml.c:672
void save_xml_to_file(const xmlNode *xml, const char *desc, const char *filename)
Definition xml.c:1718
void copy_in_properties(xmlNode *target, const xmlNode *src)
Definition xml.c:456
bool xml_patch_versions(const xmlNode *patchset, int add[3], int del[3])
Definition patchset.c:572
void fix_plus_plus_recursive(xmlNode *target)
Parse integer assignment statements on this node and all its child nodes.
Definition xml.c:489
const xmlChar * pcmkXmlStr
Definition xml.h:50
xmlNode * get_xpath_object(const char *xpath, xmlNode *xml_obj, int error_level)
Definition xpath.c:211
void xml_accept_changes(xmlNode *xml)
Definition xml.c:359
void patchset_process_digest(xmlNode *patch, xmlNode *source, xmlNode *target, bool with_digest)
Definition patchset.c:385
xmlNode * getXpathResult(xmlXPathObjectPtr xpathObj, int index)
Definition xpath.c:58
void crm_xml_init(void)
Initialize the CRM XML subsystem.
Definition xml.c:2524
const char * xml_latest_schema(void)
Definition schemas.c:113
void crm_xml_set_id(xmlNode *xml, const char *format,...) G_GNUC_PRINTF(2
int write_xml_file(const xmlNode *xml, const char *filename, gboolean compress)
Write XML to a file.
Definition xml.c:1284
xmlNode * crm_next_same_xml(const xmlNode *sibling)
Get next instance of same XML tag.
Definition xml.c:2510
int xml_apply_patchset(xmlNode *xml, xmlNode *patchset, bool check_version)
Definition patchset.c:1099
void xml_calculate_changes(xmlNode *old_xml, xmlNode *new_xml)
Definition xml.c:2068
gboolean cli_config_update(xmlNode **xml, int *best_version, gboolean to_logs)
Definition schemas.c:1134
void freeXpathObject(xmlXPathObjectPtr xpathObj)
Definition xpath.c:39
char * crm_xml_escape(const char *text)
Replace special characters with their XML escape sequences.
Definition xml.c:1329
gboolean add_message_xml(xmlNode *msg, const char *field, xmlNode *xml)
Definition messages.c:160
xmlNode * string2xml(const char *input)
Definition xml.c:800
void purge_diff_markers(xmlNode *a_node)
Definition patchset.c:1172
bool xml_tracking_changes(xmlNode *xml)
Definition xml.c:278
xmlNode * stdin2xml(void)
Definition xml.c:871
void crm_xml_cleanup(void)
Definition xml.c:2546
bool xml_document_dirty(xmlNode *xml)
Definition xml.c:285
char * calculate_xml_versioned_digest(xmlNode *input, gboolean sort, gboolean do_filter, const char *version)
Calculate and return digest of XML tree.
Definition digest.c:167
xmlNode * pcmk_create_html_node(xmlNode *parent, const char *element_name, const char *id, const char *class_name, const char *text)
Definition xml.c:684
void xml_track_changes(xmlNode *xml, const char *user, xmlNode *acl_source, bool enforce_acls)
Definition xml.c:263
void xml_calculate_significant_changes(xmlNode *old_xml, xmlNode *new_xml)
Definition xml.c:2060
void free_xml(xmlNode *child)
Definition xml.c:783
void crm_xml_sanitize_id(char *id)
Sanitize a string so it is usable as an XML ID.
Definition xml.c:1106
xmlNode * get_xpath_object_relative(const char *xpath, xmlNode *xml_obj, int error_level)
Definition xpath.c:189
gboolean validate_xml_verbose(const xmlNode *xml_blob)
Definition schemas.c:645
char * dump_xml_unformatted(const xmlNode *xml)
Definition xml.c:1662
xmlNode * find_xml_node(const xmlNode *root, const char *search_path, gboolean must_find)
Definition xml.c:384
xmlNode * diff_xml_object(xmlNode *left, xmlNode *right, gboolean suppress)
Definition patchset.c:1186
gboolean validate_xml(xmlNode *xml_blob, const char *validation, gboolean to_logs)
Definition schemas.c:673
xmlNode * xml_create_patchset(int format, xmlNode *source, xmlNode *target, bool *config, bool manage_version)
Definition patchset.c:328
gboolean can_prune_leaf(xmlNode *xml_node)
Definition xml.c:2083
xmlNode * add_node_copy(xmlNode *new_parent, xmlNode *xml_node)
Definition xml.c:622
xmlNode * get_message_xml(const xmlNode *msg, const char *field)
Definition messages.c:154
void pcmk_free_xml_subtree(xmlNode *xml)
Definition xml.c:706
char * dump_xml_formatted(const xmlNode *xml)
Definition xml.c:1649
xmlXPathObjectPtr xpath_search(const xmlNode *xml_top, const char *path)
Definition xpath.c:139
xmlNode * copy_xml(xmlNode *src_node)
Definition xml.c:789
xmlNode * create_xml_node(xmlNode *parent, const char *name)
Definition xml.c:638
void xml_remove_prop(xmlNode *obj, const char *name)
Definition xml.c:1696
void expand_plus_plus(xmlNode *target, const char *name, const char *value)
Update current XML attribute value per parsed integer assignment statement.
Definition xml.c:523
xmlNode * sorted_xml(xmlNode *input, xmlNode *parent, gboolean recursive)
Definition xml.c:2456
char * calculate_operation_digest(xmlNode *local_cib, const char *version)
Calculate and return digest of XML operation.
Definition digest.c:150
xmlNode * subtract_xml_object(xmlNode *parent, xmlNode *left, xmlNode *right, gboolean full, gboolean *changed, const char *marker)
Definition patchset.c:1235
int find_xml_children(xmlNode **children, xmlNode *root, const char *tag, const char *field, const char *value, gboolean search_matches)
Definition xml.c:2341
Deprecated Pacemaker XML API.