コード例 #1
0
ファイル: pacemaker.c プロジェクト: ClusterLabs/booth
static int pcmk_write_ticket_atomic(struct ticket_config *tk, int grant)
{
	char cmd[COMMAND_MAX];
	int rv;


	/* The values are appended to "-v", so that NO_ONE
	 * (which is -1) isn't seen as another option. */
	snprintf(cmd, COMMAND_MAX,
			"crm_ticket -t '%s' "
			"%s --force "
			"-S owner -v%" PRIi32 " "
			"-S expires -v%" PRIi64 " "
			"-S term -v%" PRIi64,
			tk->name,
			(grant > 0 ? "-g" :
			 grant < 0 ? "-r" :
			 ""),
			(int32_t)get_node_id(tk->leader),
			(int64_t)wall_ts(&tk->term_expires),
			(int64_t)tk->current_term);

	rv = system(cmd);
	log_debug("command: '%s' was executed", cmd);
	if (rv != 0)
		log_error("error: \"%s\" failed, %s", cmd, interpret_rv(rv));

	return rv;
}
コード例 #2
0
ファイル: pacemaker.c プロジェクト: prettyshuang/booth
static int crm_ticket_get(struct ticket_config *tk,
		const char *attr, int64_t *data)
{
	char cmd[COMMAND_MAX];
	char line[256];
	int rv;
	int64_t v;
	FILE *p;


	*data = -1;
	v = 0;
	snprintf(cmd, COMMAND_MAX,
			"crm_ticket -t '%s' -G '%s' --quiet",
			tk->name, attr);

	p = popen(cmd, "r");
	if (p == NULL) {
		rv = errno;
		log_error("popen error %d (%s) for \"%s\"",
				rv, strerror(rv), cmd);
		return rv || -EINVAL;
	}
	if (fgets(line, sizeof(line) - 1, p) == NULL) {
		rv = ENODATA;
		goto out;
	}

	rv = EINVAL;
	if (!strncmp(line, "false", 5)) {
		v = 0;
		rv = 0;
	} else if (!strncmp(line, "true", 4)) {
		v = 1;
		rv = 0;
	} else if (sscanf(line, "%" PRIi64, &v) == 1) {
		rv = 0;
	}

	*data = v;

out:
	rv = pclose(p);
	if (!rv) {
		log_debug("command \"%s\" value %" PRIi64, cmd, v);
	} else if (WEXITSTATUS(rv) == 6) {
		log_info("command \"%s\", ticket not found", cmd);
	} else {
		log_error("command \"%s\" %s, value %" PRIi64, cmd, interpret_rv(rv), v);
	}
	return rv;
}
コード例 #3
0
ファイル: pacemaker.c プロジェクト: ClusterLabs/booth
static int _run_crm_ticket(char *cmd)
{
	int i, rv;

	/* If there are errors, there's not much we can do but retry ... */
	for (i=0; i<3 &&
			(rv = system(cmd));
			i++) ;

	log_debug("'%s' gave result %s", cmd, interpret_rv(rv));

	return rv;
}
コード例 #4
0
ファイル: pacemaker.c プロジェクト: ClusterLabs/booth
static int pcmk_load_ticket(struct ticket_config *tk)
{
	char cmd[COMMAND_MAX];
	int rv = 0, pipe_rv;
	FILE *p;

	/* This here gets run during startup; testing that here means that
	 * normal operation won't be interrupted with that test. */
	test_atomicity();

	snprintf(cmd, COMMAND_MAX,
			"crm_ticket -t '%s' -q",
			tk->name);

	p = popen(cmd, "r");
	if (p == NULL) {
		pipe_rv = errno;
		log_error("popen error %d (%s) for \"%s\"",
				pipe_rv, strerror(pipe_rv), cmd);
		return pipe_rv || -EINVAL;
	}

	rv = parse_ticket_state(tk, p);

	if (!tk->leader) {
		/* Hmm, no site found for the ticket we have in the
		 * CIB!?
		 * Assume that the ticket belonged to us if it was
		 * granted here!
		 */
		log_warn("%s: no site matches; site got reconfigured?",
			tk->name);
		if (tk->is_granted) {
			log_warn("%s: granted here, assume it belonged to us",
				tk->name);
			set_leader(tk, local);
		}
	}

	pipe_rv = pclose(p);
	if (!pipe_rv) {
		log_debug("command \"%s\"", cmd);
	} else if (WEXITSTATUS(pipe_rv) == 6) {
		log_info("command \"%s\", ticket not found", cmd);
	} else {
		log_error("command \"%s\" %s", cmd, interpret_rv(pipe_rv));
	}
	return rv | pipe_rv;
}
コード例 #5
0
ファイル: pacemaker.c プロジェクト: ClusterLabs/booth
static int pcmk_store_ticket_nonatomic(struct ticket_config *tk)
{
	int rv;

	/* Always try to store *each* attribute, even if there's an error
	 * for one of them. */
	rv = crm_ticket_set_int(tk, "owner", (int32_t)get_node_id(tk->leader));
	rv = crm_ticket_set_int(tk, "expires", wall_ts(&tk->term_expires))  || rv;
	rv = crm_ticket_set_int(tk, "term", tk->current_term)     || rv;

	if (rv)
		log_error("setting crm_ticket attributes failed; %s",
				interpret_rv(rv));
	else
		log_info("setting crm_ticket attributes successful");

	return rv;
}
コード例 #6
0
ファイル: pacemaker.c プロジェクト: prettyshuang/booth
static int crm_ticket_set(const struct ticket_config *tk, const char *attr, int64_t val)
{
	char cmd[COMMAND_MAX];
	int i, rv;


	snprintf(cmd, COMMAND_MAX,
		 "crm_ticket -t '%s' -S '%s' -v %" PRIi64,
		 tk->name, attr, val);
	/* If there are errors, there's not much we can do but retry ... */
	for (i=0; i<3 &&
			(rv = system(cmd));
			i++) ;

	log_debug("'%s' gave result %s", cmd, interpret_rv(rv));

	return rv;
}
コード例 #7
0
ファイル: pacemaker.c プロジェクト: ClusterLabs/booth
/* get_attr is currently not used and has not been tested
 */
static int pcmk_get_attr(struct ticket_config *tk, const char *attr, const char **vp)
{
	char cmd[COMMAND_MAX];
	char line[BOOTH_ATTRVAL_LEN+1];
	int rv = 0;
	FILE *p;


	*vp = NULL;
	snprintf(cmd, COMMAND_MAX,
			"crm_ticket -t '%s' -G '%s' --quiet",
			tk->name, attr);

	p = popen(cmd, "r");
	if (p == NULL) {
		rv = errno;
		log_error("popen error %d (%s) for \"%s\"",
				rv, strerror(rv), cmd);
		return rv || EINVAL;
	}
	if (fgets(line, BOOTH_ATTRVAL_LEN, p) == NULL) {
		rv = ENODATA;
		goto out;
	}

	*vp = g_strdup(line);

out:
	rv = pclose(p);
	if (!rv) {
		log_debug("command \"%s\"", cmd);
	} else if (WEXITSTATUS(rv) == 6) {
		log_info("command \"%s\", ticket not found", cmd);
	} else {
		log_error("command \"%s\" %s", cmd, interpret_rv(rv));
	}
	return rv;
}
コード例 #8
0
ファイル: pacemaker.c プロジェクト: ClusterLabs/booth
static int pcmk_revoke_ticket(struct ticket_config *tk)
{
	char cmd[COMMAND_MAX];
	int rv;


	test_atomicity();
	if (atomicity == YES)
		return pcmk_write_ticket_atomic(tk, -1);


	rv = pcmk_store_ticket_nonatomic(tk);
	if (rv)
		return rv;

	snprintf(cmd, COMMAND_MAX, "crm_ticket -t %s -r --force",
			tk->name);
	log_debug("command: '%s' was executed", cmd);
	rv = system(cmd);
	if (rv != 0)
		log_error("error: \"%s\" failed, %s", cmd, interpret_rv(rv));
	return rv;
}