16 #include <sys/types.h>
19 #include <sys/utsname.h>
31 #include <qb/qbdefs.h>
42 #include <libxml2/libxml/relaxng.h>
45 # define PW_BUFFER_LEN 500
116 return crm_itoa(score);
125 crm_trace(
"created hash key: (%s)", hash_key);
136 struct passwd *pwentry = NULL;
139 if (buffer == NULL) {
143 rc = getpwnam_r(name, &pwd, buffer,
PW_BUFFER_LEN, &pwentry);
146 *uid = pwentry->pw_uid;
149 *gid = pwentry->pw_gid;
151 crm_trace(
"User %s has uid=%d gid=%d", name, pwentry->pw_uid, pwentry->pw_gid);
154 rc = rc? -rc : -EINVAL;
173 static uid_t daemon_uid;
174 static gid_t daemon_gid;
175 static bool found =
false;
196 crm_version_helper(
const char *text,
const char **end_text)
198 int atoi_result = -1;
204 if (text != NULL && text[0] != 0) {
211 atoi_result = (int) strtol(text, (
char **) end_text, 10);
213 if (errno == EINVAL) {
214 crm_err(
"Conversion of '%s' %c failed", text, text[0]);
231 const char *ver1_iter, *ver2_iter;
233 if (version1 == NULL && version2 == NULL) {
235 }
else if (version1 == NULL) {
237 }
else if (version2 == NULL) {
241 ver1_iter = version1;
242 ver2_iter = version2;
250 if (ver1_iter == ver2_iter) {
254 if (ver1_iter != NULL) {
255 digit1 = crm_version_helper(ver1_iter, &ver1_iter);
258 if (ver2_iter != NULL) {
259 digit2 = crm_version_helper(ver2_iter, &ver2_iter);
262 if (digit1 < digit2) {
266 }
else if (digit1 > digit2) {
271 if (ver1_iter != NULL && *ver1_iter ==
'.') {
274 if (ver1_iter != NULL && *ver1_iter ==
'\0') {
278 if (ver2_iter != NULL && *ver2_iter ==
'.') {
281 if (ver2_iter != NULL && *ver2_iter == 0) {
287 crm_trace(
"%s == %s (%d)", version1, version2, lpc);
289 crm_trace(
"%s < %s (%d)", version1, version2, lpc);
291 crm_trace(
"%s > %s (%d)", version1, version2, lpc);
317 }
else if (input[0] ==
'P') {
330 crm_warn(
"Using 0 instead of '%s'", input);
334 return (msec >= G_MAXUINT)? G_MAXUINT : (guint) msec;
341 crm_abort(
const char *file,
const char *
function,
int line,
342 const char *assert_condition, gboolean do_core, gboolean do_fork)
351 if(crm_is_daemon == FALSE) {
359 if (do_core == FALSE) {
360 crm_err(
"%s: Triggered assert at %s:%d : %s",
function, file, line, assert_condition);
363 }
else if (do_fork) {
367 crm_err(
"%s: Triggered fatal assert at %s:%d : %s",
function, file, line, assert_condition);
371 crm_crit(
"%s: Cannot create core for non-fatal assert at %s:%d : %s",
372 function, file, line, assert_condition);
375 }
else if(pid == 0) {
382 crm_err(
"%s: Forked child %d to record non-fatal assert at %s:%d : %s",
383 function, pid, file, line, assert_condition);
387 rc = waitpid(pid, &status, 0);
392 }
while(errno == EINTR);
394 if (errno == ECHILD) {
396 crm_trace(
"Cannot wait on forked child %d - SIGCHLD is probably set to SIG_IGN", pid);
399 crm_perror(LOG_ERR,
"Cannot wait on forked child %d", pid);
408 if (daemonize == FALSE) {
415 crm_err(
"%s: already running [pid %lld in %s]",
416 name, (
long long) pid, pidfile);
417 printf(
"%s: already running [pid %lld in %s]\n",
418 name, (
long long) pid, pidfile);
424 fprintf(stderr,
"%s: could not start daemon\n", name);
428 }
else if (pid > 0) {
436 printf(
"Could not lock '%s' for %s: %s (%d)\n",
441 umask(S_IWGRP | S_IWOTH | S_IROTH);
444 pcmk__open_devnull(O_RDONLY);
446 close(STDOUT_FILENO);
447 pcmk__open_devnull(O_WRONLY);
449 close(STDERR_FILENO);
450 pcmk__open_devnull(O_WRONLY);
458 char *crm_name = NULL;
464 max = strlen(crm_name);
465 for (; lpc < max; lpc++) {
466 switch (crm_name[lpc]) {
479 const char *value = NULL;
483 value = g_hash_table_lookup(hash, key);
490 #ifdef HAVE_UUID_UUID_H
491 # include <uuid/uuid.h>
497 unsigned char uuid[16];
498 char *buffer = malloc(37);
501 uuid_unparse(uuid, buffer);
522 }
else if (!strcmp(name,
"pacemaker-attrd")) {
525 }
else if (!strcmp(name,
"pacemaker-based")) {
528 }
else if (!strcmp(name,
"pacemaker-controld")) {
531 }
else if (!strcmp(name,
"pacemaker-execd")) {
534 }
else if (!strcmp(name,
"pacemaker-fenced")) {
537 }
else if (!strcmp(name,
"pacemaker-schedulerd")) {
558 || !strcmp(name,
"stonith-ng")
559 || !strcmp(name,
"attrd")
572 int lpc = 0, len = 0;
576 if (buffer == NULL) {
579 len = strlen(buffer);
581 crm_trace(
"Beginning digest of %d bytes", len);
586 sprintf(digest + (2 * lpc),
"%02x", raw_digest[lpc]);
592 crm_err(
"Could not create digest");
597 #ifdef HAVE_GNUTLS_GNUTLS_H
599 crm_gnutls_global_init(
void)
601 signal(SIGPIPE, SIG_IGN);
602 gnutls_global_init();
614 struct utsname hostinfo;
616 return (
uname(&hostinfo) < 0)? NULL : strdup(hostinfo.nodename);
#define CRM_CHECK(expr, failure_action)
void crm_write_blackbox(int nsig, struct qb_log_callsite *callsite)
const char * pcmk_strerror(int rc)
void crm_enable_stderr(int enable)
bool crm_is_daemon_name(const char *name)
Check whether a string represents a cluster daemon name.
#define crm_crit(fmt, args...)
char * crm_generate_uuid(void)
_Noreturn crm_exit_t crm_exit(crm_exit_t rc)
struct crm_time_s crm_time_t
int char2score(const char *score)
long long crm_get_msec(const char *input)
Parse a time+units string and return milliseconds equivalent.
void crm_make_daemon(const char *name, gboolean daemonize, const char *pidfile)
char * score2char_stack(int score, char *buf, size_t len)
const char * crm_meta_value(GHashTable *hash, const char *field)
int crm_parse_int(const char *text, const char *default_text)
Parse an integer value from a string.
crm_time_t * crm_time_parse_duration(const char *duration_str)
Parse a time duration from an ISO 8601 duration specification.
int crm_user_lookup(const char *name, uid_t *uid, gid_t *gid)
guint crm_parse_interval_spec(const char *input)
Parse milliseconds from a Pacemaker interval specification.
int pcmk_daemon_user(uid_t *uid, gid_t *gid)
Get user and group IDs of pacemaker daemon user.
const char * pcmk_rc_str(int rc)
Get a user-friendly description of a return code.
#define CRM_SCORE_INFINITY
Wrappers for and extensions to glib mainloop.
char * crm_meta_name(const char *field)
#define CRM_TRACE_INIT_DATA(name)
void * md5_buffer(const char *buffer, size_t len, void *resblock)
gboolean crm_config_error
#define crm_warn(fmt, args...)
const char * pcmk_message_name(const char *name)
Get name to be used as identifier for cluster messages.
#define crm_trace(fmt, args...)
#define CRM_SYSTEM_PENGINE
#define CRM_MINUS_INFINITY_S
Wrappers for and extensions to libxml2.
bool pcmk_str_is_infinity(const char *s)
gboolean crm_str_eq(const char *a, const char *b, gboolean use_case)
char * crm_itoa_stack(int an_int, char *buf, size_t len)
long long int crm_time_get_seconds(crm_time_t *dt)
#define CRM_SYSTEM_STONITHD
int pcmk__lock_pidfile(const char *filename, const char *name)
#define CRM_SYSTEM_TENGINE
#define crm_perror(level, fmt, args...)
Send a system error message to both the log and stderr.
#define crm_err(fmt, args...)
bool pcmk_str_is_minus_infinity(const char *s)
gboolean crm_config_warning
int compare_version(const char *version1, const char *version2)
int pcmk__pidfile_matches(const char *filename, pid_t expected_pid, const char *expected_name, pid_t *pid)
Wrappers for and extensions to libqb IPC.
char * generate_hash_key(const char *crm_msg_reference, const char *sys)
#define CRM_PLUS_INFINITY_S
char * crm_md5sum(const char *buffer)
char * pcmk_hostname(void)
Get the local hostname.
#define safe_str_eq(a, b)
void crm_abort(const char *file, const char *function, int line, const char *condition, gboolean do_core, gboolean do_fork)
char * crm_strdup_printf(char const *format,...) __attribute__((__format__(__printf__
#define crm_info(fmt, args...)
char * score2char(int score)
void crm_time_free(crm_time_t *dt)