pacemaker  1.1.18-7fdfbbe
Scalable High-Availability cluster resource manager
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
utils.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2004 Andrew Beekhof <andrew@beekhof.net>
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with this library; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
17  */
18 
19 #ifndef AIS_CRM_UTILS__H
20 # define AIS_CRM_UTILS__H
21 
22 # include <syslog.h>
23 
24 # ifdef AIS_WHITETANK
25 # include <openais/service/objdb.h>
26 # include <openais/service/print.h>
27 
28 # define OPENAIS_EXTERNAL_SERVICE insane_ais_header_hack_in__totem_h
29 # include <openais/saAis.h>
30 # include <openais/service/swab.h>
31 # include <openais/totem/totempg.h>
32 # include <openais/service/service.h>
33 # include <openais/lcr/lcr_comp.h>
34 # include <openais/lcr/lcr_ifact.h>
35 # include <openais/service/config.h>
36 # define COROSYNC_LIB_FLOW_CONTROL_NOT_REQUIRED OPENAIS_FLOW_CONTROL_NOT_REQUIRED
37 
38 /* New names for old things */
39 typedef unsigned int hdb_handle_t;
40 
41 # define corosync_api_v1 objdb_iface_ver0
42 # define corosync_lib_handler openais_lib_handler
43 # define corosync_exec_handler openais_exec_handler
44 # define corosync_service_engine openais_service_handler
45 
46 extern int openais_response_send(void *conn, void *msg, int mlen);
47 extern int openais_dispatch_send(void *conn, void *msg, int mlen);
48 
49 # endif
50 
51 # ifdef SUPPORT_COROSYNC
52 # include <corosync/corodefs.h>
53 # include <corosync/swab.h>
54 # include <corosync/hdb.h>
55 
56 # include <corosync/engine/objdb.h>
57 # include <corosync/engine/coroapi.h>
58 # include <corosync/engine/logsys.h>
59 
60 # include <corosync/lcr/lcr_comp.h>
61 LOGSYS_DECLARE_SUBSYS("pcmk");
62 # endif
63 
64 /* #include "plugin.h" */
65 # define SIZEOF(a) (sizeof(a) / sizeof(a[0]))
66 
67 typedef struct crm_child_s {
68  int pid;
69  long flag;
70  long flags;
71  int start_seq;
73  gboolean respawn;
74  const char *name;
75  const char *uid;
76  const char *command;
77  void *conn;
78  void *async_conn;
79 
80 } crm_child_t;
81 
82 extern void destroy_ais_node(gpointer data);
83 extern void delete_member(uint32_t id, const char *uname);
84 extern int update_member(unsigned int id, uint64_t born, uint64_t seq, int32_t votes,
85  uint32_t procs, const char *uname, const char *state, const char *version);
86 
87 extern const char *member_uname(uint32_t id);
88 extern char *append_member(char *data, crm_node_t * node);
89 extern void member_loop_fn(gpointer key, gpointer value, gpointer user_data);
90 
91 extern gboolean stop_child(crm_child_t * child, int signal);
92 extern gboolean spawn_child(crm_child_t * child);
93 
94 extern void swap_sender(AIS_Message * msg);
95 extern char *get_ais_data(const AIS_Message * msg);
96 
97 extern gboolean route_ais_message(const AIS_Message * msg, gboolean local);
98 extern gboolean process_ais_message(const AIS_Message * msg);
99 
100 extern int send_plugin_msg(enum crm_ais_msg_types type, const char *host, const char *data);
101 extern int send_client_msg(void *conn, enum crm_ais_msg_class class,
102  enum crm_ais_msg_types type, const char *data);
103 extern void send_member_notification(void);
104 extern void log_ais_message(int level, const AIS_Message * msg);
105 
106 extern hdb_handle_t config_find_init(struct corosync_api_v1 *config, char *name);
107 extern hdb_handle_t config_find_next(struct corosync_api_v1 *config, char *name,
108  hdb_handle_t top_handle);
109 extern void config_find_done(struct corosync_api_v1 *config, hdb_handle_t local_handle);
110 extern int get_config_opt(struct corosync_api_v1 *config,
111  hdb_handle_t object_service_handle,
112  char *key, char **value, const char *fallback);
113 
114 extern int ais_get_boolean(const char *s);
115 extern long long ais_get_int(const char *text, char **end_text);
116 extern char *ais_concat(const char *prefix, const char *suffix, char join);
117 extern int send_client_ipc(void *conn, const AIS_Message * ais_msg);
118 
119 extern GHashTable *membership_list;
120 extern pthread_t crm_wait_thread;
121 extern int plugin_log_level;
122 extern char *local_uname;
123 extern int local_uname_len;
124 extern unsigned int local_nodeid;
125 
126 static inline const char *
127 level2char(int level)
128 {
129  switch (level) {
130  case LOG_CRIT:
131  return "CRIT";
132  case LOG_ERR:
133  return "ERROR";
134  case LOG_WARNING:
135  return "WARN";
136  case LOG_NOTICE:
137  return "notice";
138  case LOG_INFO:
139  return "info";
140  }
141  return "debug";
142 }
143 
144 # define do_ais_log(level, fmt, args...) do { \
145  if(plugin_log_level < (level)) { \
146  continue; \
147  } else if((level) > LOG_DEBUG) { \
148  log_printf(LOG_DEBUG, "debug%d: %s: " fmt, \
149  level-LOG_INFO, __FUNCTION__ , ##args); \
150  } else { \
151  log_printf(level, "%s: %s: " fmt, level2char(level), \
152  __FUNCTION__ , ##args); \
153  } \
154  } while(0)
155 
156 # define ais_perror(fmt, args...) log_printf( \
157  LOG_ERR, "%s: " fmt ": (%d) %s", \
158  __FUNCTION__ , ##args, errno, strerror(errno))
159 
160 # define ais_crit(fmt, args...) do_ais_log(LOG_CRIT, fmt , ##args)
161 # define ais_err(fmt, args...) do_ais_log(LOG_ERR, fmt , ##args)
162 # define ais_warn(fmt, args...) do_ais_log(LOG_WARNING, fmt , ##args)
163 # define ais_notice(fmt, args...) do_ais_log(LOG_NOTICE, fmt , ##args)
164 # define ais_info(fmt, args...) do_ais_log(LOG_INFO, fmt , ##args)
165 # define ais_debug(fmt, args...) do_ais_log(LOG_DEBUG, fmt , ##args)
166 # define ais_trace(fmt, args...) do_ais_log(LOG_DEBUG+1, fmt , ##args)
167 
168 # define ais_malloc0(malloc_obj, length) do { \
169  malloc_obj = malloc(length); \
170  if(malloc_obj == NULL) { \
171  abort(); \
172  } \
173  memset(malloc_obj, 0, length); \
174  } while(0)
175 
176 # define ais_free(obj) do { \
177  if(obj) { \
178  free(obj); \
179  obj = NULL; \
180  } \
181  } while(0)
182 
183 # define AIS_ASSERT(expr) if((expr) == FALSE) { \
184  ais_crit("Assertion failure line %d: %s", __LINE__, #expr); \
185  abort(); \
186  }
187 
188 # define AIS_CHECK(expr, failure_action) if((expr) == FALSE) { \
189  int p = fork(); \
190  if(p == 0) { abort(); } \
191  ais_err("Child %d spawned to record non-fatal assertion failure line %d: %s", p, __LINE__, #expr); \
192  failure_action; \
193  }
194 
195 static inline char *
196 ais_strdup(const char *src)
197 {
198  char *dup = NULL;
199 
200  if (src == NULL) {
201  return NULL;
202  }
203  ais_malloc0(dup, strlen(src) + 1);
204  return strcpy(dup, src);
205 }
206 
207 static inline gboolean
208 ais_str_eq(const char *a, const char *b)
209 {
210  if (a == NULL || b == NULL) {
211  return FALSE;
212 
213  } else if (a == b) {
214  return TRUE;
215 
216  } else if (strcasecmp(a, b) == 0) {
217  return TRUE;
218  }
219  return FALSE;
220 }
221 
222 static inline int
223 libais_connection_active(void *conn)
224 {
225  if (conn != NULL) {
226  return TRUE;
227  }
228  return FALSE;
229 }
230 
231 struct pcmk_env_s {
232  const char *debug;
233  const char *syslog;
234  const char *logfile;
235  const char *use_logd;
236  const char *quorum;
237 };
238 
239 extern struct pcmk_env_s pcmk_env;
240 extern int pcmk_user_lookup(const char *name, uid_t * uid, gid_t * gid);
241 
242 #endif
uint32_t votes
Definition: internal.h:50
uint32_t local_nodeid
Definition: plugin.c:65
long flags
Definition: utils.h:70
const char * command
Definition: utils.h:76
crm_ais_msg_types
Definition: cluster.h:128
gboolean route_ais_message(const AIS_Message *msg, gboolean local_origin)
Definition: plugin.c:1454
hdb_handle_t config_find_init(struct corosync_api_v1 *config, char *name)
Definition: utils.c:620
int pcmk_user_lookup(const char *name, uid_t *uid, gid_t *gid)
Definition: utils.c:755
long long ais_get_int(const char *text, char **end_text)
Definition: utils.c:712
void log_ais_message(int level, const AIS_Message *msg)
Definition: utils.c:43
struct crm_child_s crm_child_t
void config_find_done(struct corosync_api_v1 *config, hdb_handle_t local_handle)
Definition: utils.c:652
void * async_conn
Definition: utils.h:78
AIS_Host host
Definition: internal.h:52
const char * uid
Definition: utils.h:75
const char * use_logd
Definition: utils.h:235
#define ais_malloc0(malloc_obj, length)
Definition: utils.h:168
pthread_t crm_wait_thread
char version[256]
Definition: plugin.c:84
int start_seq
Definition: utils.h:71
struct pcmk_env_s pcmk_env
Definition: utils.c:40
int ais_get_boolean(const char *value)
Definition: utils.c:697
char uname[MAX_NAME]
Definition: internal.h:53
int update_member(unsigned int id, uint64_t born, uint64_t seq, int32_t votes, uint32_t procs, const char *uname, const char *state, const char *version)
Definition: utils.c:295
void send_member_notification(void)
Definition: plugin.c:1344
int pid
Definition: utils.h:68
int get_config_opt(struct corosync_api_v1 *config, hdb_handle_t object_service_handle, char *key, char **value, const char *fallback)
Definition: utils.c:660
int plugin_log_level
Definition: plugin.c:60
int send_plugin_msg(enum crm_ais_msg_types type, const char *host, const char *data)
Definition: utils.c:479
const char * name
Definition: utils.h:74
gboolean stop_child(crm_child_t *child, int signal)
Definition: utils.c:252
int respawn_count
Definition: utils.h:72
const char * member_uname(uint32_t id)
Definition: utils.c:374
const char * syslog
Definition: utils.h:233
void member_loop_fn(gpointer key, gpointer value, gpointer user_data)
Definition: plugin.c:1167
long flag
Definition: utils.h:69
char * ais_concat(const char *prefix, const char *suffix, char join)
Definition: utils.c:604
void * conn
Definition: utils.h:77
void swap_sender(AIS_Message *msg)
Definition: utils.c:435
hdb_handle_t config_find_next(struct corosync_api_v1 *config, char *name, hdb_handle_t top_handle)
Definition: utils.c:633
void destroy_ais_node(gpointer data)
Definition: utils.c:282
crm_ais_msg_class
Definition: cluster.h:118
char * local_uname
Definition: plugin.c:61
char * get_ais_data(const AIS_Message *msg)
Definition: utils.c:454
gboolean spawn_child(crm_child_t *child)
Definition: utils.c:136
#define uint32_t
Definition: stdint.in.h:158
char data[0]
Definition: internal.h:58
const char * quorum
Definition: utils.h:236
char * append_member(char *data, crm_node_t *node)
Definition: utils.c:388
void delete_member(uint32_t id, const char *uname)
Definition: utils.c:364
gboolean process_ais_message(const AIS_Message *msg)
Definition: plugin.c:1744
int send_client_msg(void *conn, enum crm_ais_msg_class class, enum crm_ais_msg_types type, const char *data)
Definition: utils.c:550
int send_client_ipc(void *conn, const AIS_Message *ais_msg)
Definition: utils.c:527
GHashTable * membership_list
Definition: plugin.c:76
const char * logfile
Definition: utils.h:234
gboolean respawn
Definition: utils.h:73
enum crm_ais_msg_types type
Definition: internal.h:51
const char * debug
Definition: utils.h:232
#define int32_t
Definition: stdint.in.h:157
int local_uname_len
Definition: plugin.c:62
gboolean local
Definition: internal.h:50