This source file includes following definitions.
- create_request_adv
- create_reply_adv
- get_message_xml
- add_message_xml
- pcmk__message_name
- pcmk__register_handlers
- pcmk__process_request
- pcmk__reset_request
   1 
   2 
   3 
   4 
   5 
   6 
   7 
   8 
   9 
  10 #include <crm_internal.h>
  11 
  12 #include <stdio.h>
  13 #include <sys/types.h>
  14 
  15 #include <glib.h>
  16 #include <libxml/tree.h>
  17 
  18 #include <crm/msg_xml.h>
  19 #include <crm/common/xml_internal.h>
  20 
  21 
  22 
  23 
  24 
  25 
  26 
  27 
  28 
  29 
  30 
  31 
  32 
  33 
  34 
  35 
  36 
  37 
  38 
  39 xmlNode *
  40 create_request_adv(const char *task, xmlNode *msg_data,
     
  41                    const char *host_to, const char *sys_to,
  42                    const char *sys_from, const char *uuid_from,
  43                    const char *origin)
  44 {
  45     static uint ref_counter = 0;
  46 
  47     char *true_from = NULL;
  48     xmlNode *request = NULL;
  49     char *reference = crm_strdup_printf("%s-%s-%lld-%u",
  50                                         (task? task : "_empty_"),
  51                                         (sys_from? sys_from : "_empty_"),
  52                                         (long long) time(NULL), ref_counter++);
  53 
  54     if (uuid_from != NULL) {
  55         true_from = crm_strdup_printf("%s_%s", uuid_from,
  56                                       (sys_from? sys_from : "none"));
  57     } else if (sys_from != NULL) {
  58         true_from = strdup(sys_from);
  59     } else {
  60         crm_err("Cannot create IPC request: No originating system specified");
  61     }
  62 
  63     
  64     request = create_xml_node(NULL, __func__);
  65     crm_xml_add(request, F_CRM_ORIGIN, origin);
  66     crm_xml_add(request, F_TYPE, T_CRM);
  67     crm_xml_add(request, F_CRM_VERSION, CRM_FEATURE_SET);
  68     crm_xml_add(request, F_CRM_MSG_TYPE, XML_ATTR_REQUEST);
  69     crm_xml_add(request, F_CRM_REFERENCE, reference);
  70     crm_xml_add(request, F_CRM_TASK, task);
  71     crm_xml_add(request, F_CRM_SYS_TO, sys_to);
  72     crm_xml_add(request, F_CRM_SYS_FROM, true_from);
  73 
  74     
  75     if (host_to != NULL && strlen(host_to) > 0) {
  76         crm_xml_add(request, F_CRM_HOST_TO, host_to);
  77     }
  78 
  79     if (msg_data != NULL) {
  80         add_message_xml(request, F_CRM_DATA, msg_data);
  81     }
  82     free(reference);
  83     free(true_from);
  84 
  85     return request;
  86 }
  87 
  88 
  89 
  90 
  91 
  92 
  93 
  94 
  95 
  96 
  97 
  98 
  99 
 100 
 101 xmlNode *
 102 create_reply_adv(const xmlNode *original_request, xmlNode *xml_response_data,
     
 103                  const char *origin)
 104 {
 105     xmlNode *reply = NULL;
 106 
 107     const char *host_from = crm_element_value(original_request, F_CRM_HOST_FROM);
 108     const char *sys_from = crm_element_value(original_request, F_CRM_SYS_FROM);
 109     const char *sys_to = crm_element_value(original_request, F_CRM_SYS_TO);
 110     const char *type = crm_element_value(original_request, F_CRM_MSG_TYPE);
 111     const char *operation = crm_element_value(original_request, F_CRM_TASK);
 112     const char *crm_msg_reference = crm_element_value(original_request, F_CRM_REFERENCE);
 113 
 114     if (type == NULL) {
 115         crm_err("Cannot create new_message, no message type in original message");
 116         CRM_ASSERT(type != NULL);
 117         return NULL;
 118 #if 0
 119     } else if (strcasecmp(XML_ATTR_REQUEST, type) != 0) {
 120         crm_err("Cannot create new_message, original message was not a request");
 121         return NULL;
 122 #endif
 123     }
 124     reply = create_xml_node(NULL, __func__);
 125     if (reply == NULL) {
 126         crm_err("Cannot create new_message, malloc failed");
 127         return NULL;
 128     }
 129 
 130     crm_xml_add(reply, F_CRM_ORIGIN, origin);
 131     crm_xml_add(reply, F_TYPE, T_CRM);
 132     crm_xml_add(reply, F_CRM_VERSION, CRM_FEATURE_SET);
 133     crm_xml_add(reply, F_CRM_MSG_TYPE, XML_ATTR_RESPONSE);
 134     crm_xml_add(reply, F_CRM_REFERENCE, crm_msg_reference);
 135     crm_xml_add(reply, F_CRM_TASK, operation);
 136 
 137     
 138     crm_xml_add(reply, F_CRM_SYS_TO, sys_from);
 139     crm_xml_add(reply, F_CRM_SYS_FROM, sys_to);
 140 
 141     
 142     if (host_from != NULL && strlen(host_from) > 0) {
 143         crm_xml_add(reply, F_CRM_HOST_TO, host_from);
 144     }
 145 
 146     if (xml_response_data != NULL) {
 147         add_message_xml(reply, F_CRM_DATA, xml_response_data);
 148     }
 149 
 150     return reply;
 151 }
 152 
 153 xmlNode *
 154 get_message_xml(const xmlNode *msg, const char *field)
     
 155 {
 156     return pcmk__xml_first_child(first_named_child(msg, field));
 157 }
 158 
 159 gboolean
 160 add_message_xml(xmlNode *msg, const char *field, xmlNode *xml)
     
 161 {
 162     xmlNode *holder = create_xml_node(msg, field);
 163 
 164     add_node_copy(holder, xml);
 165     return TRUE;
 166 }
 167 
 168 
 169 
 170 
 171 
 172 
 173 
 174 
 175 
 176 
 177 
 178 
 179 const char *
 180 pcmk__message_name(const char *name)
     
 181 {
 182     if (name == NULL) {
 183         return "unknown";
 184 
 185     } else if (!strcmp(name, "pacemaker-attrd")) {
 186         return "attrd";
 187 
 188     } else if (!strcmp(name, "pacemaker-based")) {
 189         return CRM_SYSTEM_CIB;
 190 
 191     } else if (!strcmp(name, "pacemaker-controld")) {
 192         return CRM_SYSTEM_CRMD;
 193 
 194     } else if (!strcmp(name, "pacemaker-execd")) {
 195         return CRM_SYSTEM_LRMD;
 196 
 197     } else if (!strcmp(name, "pacemaker-fenced")) {
 198         return "stonith-ng";
 199 
 200     } else if (!strcmp(name, "pacemaker-schedulerd")) {
 201         return CRM_SYSTEM_PENGINE;
 202 
 203     } else {
 204         return name;
 205     }
 206 }
 207 
 208 
 209 
 210 
 211 
 212 
 213 
 214 
 215 
 216 
 217 
 218 
 219 
 220 
 221 GHashTable *
 222 pcmk__register_handlers(const pcmk__server_command_t handlers[])
     
 223 {
 224     GHashTable *commands = g_hash_table_new(g_str_hash, g_str_equal);
 225 
 226     if (handlers != NULL) {
 227         int i;
 228 
 229         for (i = 0; handlers[i].command != NULL; ++i) {
 230             g_hash_table_insert(commands, (gpointer) handlers[i].command,
 231                                 handlers[i].handler);
 232         }
 233         if (handlers[i].handler != NULL) {
 234             
 235             g_hash_table_insert(commands, (gpointer) "", handlers[i].handler);
 236         }
 237     }
 238     return commands;
 239 }
 240 
 241 
 242 
 243 
 244 
 245 
 246 
 247 
 248 
 249 
 250 xmlNode *
 251 pcmk__process_request(pcmk__request_t *request, GHashTable *handlers)
     
 252 {
 253     xmlNode *(*handler)(pcmk__request_t *request) = NULL;
 254 
 255     CRM_CHECK((request != NULL) && (request->op != NULL) && (handlers != NULL),
 256               return NULL);
 257 
 258     if (pcmk_is_set(request->flags, pcmk__request_sync)
 259         && (request->ipc_client != NULL)) {
 260         CRM_CHECK(request->ipc_client->request_id == request->ipc_id,
 261                   return NULL);
 262     }
 263 
 264     handler = g_hash_table_lookup(handlers, request->op);
 265     if (handler == NULL) {
 266         handler = g_hash_table_lookup(handlers, ""); 
 267         if (handler == NULL) {
 268             crm_info("Ignoring %s request from %s %s with no handler",
 269                      request->op, pcmk__request_origin_type(request),
 270                      pcmk__request_origin(request));
 271             return NULL;
 272         }
 273     }
 274 
 275     return (*handler)(request);
 276 }
 277 
 278 
 279 
 280 
 281 
 282 
 283 
 284 void
 285 pcmk__reset_request(pcmk__request_t *request)
     
 286 {
 287     free(request->op);
 288     request->op = NULL;
 289 
 290     pcmk__reset_result(&(request->result));
 291 }