Line data Source code
1 : /*
2 : * Copyright 2020-2024 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 : #include <crm_internal.h>
11 : #include <stdarg.h>
12 :
13 : #include <crm/lrmd_internal.h>
14 : #include <crm/common/xml.h>
15 : #include <crm/common/output_internal.h>
16 :
17 : static int
18 0 : default_list(pcmk__output_t *out, lrmd_list_t *list, const char *title) {
19 0 : lrmd_list_t *iter = NULL;
20 :
21 0 : out->begin_list(out, NULL, NULL, "%s", title);
22 :
23 0 : for (iter = list; iter != NULL; iter = iter->next) {
24 0 : out->list_item(out, NULL, "%s", iter->val);
25 : }
26 :
27 0 : out->end_list(out);
28 0 : lrmd_list_freeall(list);
29 0 : return pcmk_rc_ok;
30 : }
31 :
32 : static int
33 0 : xml_list(pcmk__output_t *out, lrmd_list_t *list, const char *ele) {
34 0 : lrmd_list_t *iter = NULL;
35 :
36 0 : for (iter = list; iter != NULL; iter = iter->next) {
37 0 : pcmk__output_create_xml_text_node(out, ele, iter->val);
38 : }
39 :
40 0 : lrmd_list_freeall(list);
41 0 : return pcmk_rc_ok;
42 : }
43 :
44 : PCMK__OUTPUT_ARGS("alternatives-list", "lrmd_list_t *", "const char *")
45 : static int
46 0 : lrmd__alternatives_list_xml(pcmk__output_t *out, va_list args) {
47 0 : lrmd_list_t *list = va_arg(args, lrmd_list_t *);
48 0 : const char *agent_spec = va_arg(args, const char *);
49 :
50 0 : int rc = pcmk_rc_ok;
51 :
52 0 : pcmk__output_xml_create_parent(out, PCMK_XE_PROVIDERS,
53 : PCMK_XA_FOR, agent_spec,
54 : NULL);
55 0 : rc = xml_list(out, list, PCMK_XE_PROVIDER);
56 0 : pcmk__output_xml_pop_parent(out);
57 0 : return rc;
58 : }
59 :
60 : PCMK__OUTPUT_ARGS("alternatives-list", "lrmd_list_t *", "const char *")
61 : static int
62 0 : lrmd__alternatives_list(pcmk__output_t *out, va_list args) {
63 0 : lrmd_list_t *list = va_arg(args, lrmd_list_t *);
64 0 : const char *agent_spec G_GNUC_UNUSED = va_arg(args, const char *);
65 :
66 0 : return default_list(out, list, "Providers");
67 : }
68 :
69 : PCMK__OUTPUT_ARGS("agents-list", "lrmd_list_t *", "const char *", "const char *")
70 : static int
71 0 : lrmd__agents_list_xml(pcmk__output_t *out, va_list args) {
72 0 : lrmd_list_t *list = va_arg(args, lrmd_list_t *);
73 0 : const char *agent_spec = va_arg(args, const char *);
74 0 : const char *provider = va_arg(args, const char *);
75 :
76 0 : int rc = pcmk_rc_ok;
77 0 : xmlNodePtr node = NULL;
78 :
79 0 : node = pcmk__output_xml_create_parent(out, PCMK_XE_AGENTS,
80 : PCMK_XA_STANDARD, agent_spec,
81 : NULL);
82 :
83 0 : if (!pcmk__str_empty(provider)) {
84 0 : crm_xml_add(node, PCMK_XA_PROVIDER, provider);
85 : }
86 :
87 0 : rc = xml_list(out, list, PCMK_XE_AGENT);
88 0 : pcmk__output_xml_pop_parent(out);
89 0 : return rc;
90 : }
91 :
92 : PCMK__OUTPUT_ARGS("agents-list", "lrmd_list_t *", "const char *", "const char *")
93 : static int
94 0 : lrmd__agents_list(pcmk__output_t *out, va_list args) {
95 0 : lrmd_list_t *list = va_arg(args, lrmd_list_t *);
96 0 : const char *agent_spec = va_arg(args, const char *);
97 0 : const char *provider = va_arg(args, const char *);
98 :
99 : int rc;
100 0 : char *title = crm_strdup_printf("%s agents", pcmk__str_empty(provider) ? agent_spec : provider);
101 :
102 0 : rc = default_list(out, list, title);
103 0 : free(title);
104 0 : return rc;
105 : }
106 :
107 : PCMK__OUTPUT_ARGS("providers-list", "lrmd_list_t *", "const char *")
108 : static int
109 0 : lrmd__providers_list_xml(pcmk__output_t *out, va_list args) {
110 0 : lrmd_list_t *list = va_arg(args, lrmd_list_t *);
111 0 : const char *agent_spec = va_arg(args, const char *);
112 :
113 0 : int rc = pcmk_rc_ok;
114 0 : xmlNodePtr node = pcmk__output_xml_create_parent(out, PCMK_XE_PROVIDERS,
115 : PCMK_XA_STANDARD, "ocf",
116 : NULL);
117 :
118 0 : if (agent_spec != NULL) {
119 0 : crm_xml_add(node, PCMK_XA_AGENT, agent_spec);
120 : }
121 :
122 0 : rc = xml_list(out, list, PCMK_XE_PROVIDER);
123 0 : pcmk__output_xml_pop_parent(out);
124 0 : return rc;
125 : }
126 :
127 : PCMK__OUTPUT_ARGS("providers-list", "lrmd_list_t *", "const char *")
128 : static int
129 0 : lrmd__providers_list(pcmk__output_t *out, va_list args) {
130 0 : lrmd_list_t *list = va_arg(args, lrmd_list_t *);
131 0 : const char *agent_spec G_GNUC_UNUSED = va_arg(args, const char *);
132 :
133 0 : return default_list(out, list, "Providers");
134 : }
135 :
136 : PCMK__OUTPUT_ARGS("standards-list", "lrmd_list_t *")
137 : static int
138 0 : lrmd__standards_list(pcmk__output_t *out, va_list args) {
139 0 : lrmd_list_t *list = va_arg(args, lrmd_list_t *);
140 :
141 0 : return default_list(out, list, "Standards");
142 : }
143 :
144 : static pcmk__message_entry_t fmt_functions[] = {
145 : { "alternatives-list", "default", lrmd__alternatives_list },
146 : { "alternatives-list", "xml", lrmd__alternatives_list_xml },
147 : { "agents-list", "default", lrmd__agents_list },
148 : { "agents-list", "xml", lrmd__agents_list_xml },
149 : { "providers-list", "default", lrmd__providers_list },
150 : { "providers-list", "xml", lrmd__providers_list_xml },
151 : { "standards-list", "default", lrmd__standards_list },
152 :
153 : { NULL, NULL, NULL }
154 : };
155 :
156 : void
157 0 : lrmd__register_messages(pcmk__output_t *out) {
158 0 : pcmk__register_messages(out, fmt_functions);
159 0 : }
|