/**
 * \internal
 * \brief Chcek sanity of a key
 *
 * \retval 0 sane
 * \retval non-zero bonkers
 */
static int
check_key_sanity(const char *key)
{
    static const char VALID_CHARS[] = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_-.";
    char sanitized_key[PATH_MAX];

    if (mh_strlen_zero(key)) {
        mh_err("key cannot be empty");
        return -1;
    }

    if (g_str_has_prefix(key, ".")) {
        mh_err("Invalid key filename %s", key);
        return -1;
    }

    mh_string_copy(sanitized_key, key, sizeof(sanitized_key));
    g_strcanon(sanitized_key, VALID_CHARS, '!');
    if (strchr(sanitized_key, '!') != NULL) {
        mh_err("Invalid key filename %s", sanitized_key);
        return -1;
    }

    return 0;
}
Esempio n. 2
0
gboolean
SrvAgent::invoke(qmf::AgentSession session, qmf::AgentEvent event,
                 gpointer user_data)
{
    if (event.getType() == qmf::AGENT_METHOD && event.hasDataAddr()) {
        if (event.getDataAddr().getName() == "Services") {
            return invoke_services(session, event, user_data);

        } else if (event.getDataAddr().getName() == "Resources") {
	    return invoke_resources(session, event, user_data);

        } else {
	    mh_err("Unknown agent: %s", event.getDataAddr().getName().c_str());
	}
    }

    mh_err("Unhandled message");
    return TRUE;
}
Esempio n. 3
0
ObjectManager& ObjectManager::operator+=(MatahariObject* object)
{
    object->publish(_impl->_session);
    if (!object->getAddr().isValid()) {
        mh_err("Failed to publish object");
        return *this;
    }
    _impl->_objects[object->getAddr()] = object;

    return *this;
}
static enum mh_result
set_key(const char *key, const char *contents)
{
    char key_file[PATH_MAX];

    if (check_key_sanity(key)) {
        return MH_RES_INVALID_ARGS;
    }

    if (!g_file_test(keys_dir_get(), G_FILE_TEST_IS_DIR) &&
        g_mkdir(keys_dir_get(), 0755) < 0) {
        mh_err("Could not create keys directory %s", keys_dir_get());
        return MH_RES_OTHER_ERROR;
    }

    g_snprintf(key_file, sizeof(key_file), "%s%s", keys_dir_get(), key);
    if (!g_file_set_contents(key_file, contents, strlen(contents), NULL)) {
        mh_err("Could not set file %s", key_file);
        return MH_RES_OTHER_ERROR;
    }

    return MH_RES_SUCCESS;
}
Esempio n. 5
0
gboolean
Resources_invoke(Matahari *matahari, const char *name, const char *standard,
                 const char *provider, const char *agent, const char *action,
                 unsigned int interval, GHashTable *parameters,
                 unsigned int timeout, unsigned int expected_rc,
                 const char *userdata_in, DBusGMethodInvocation *context)
{
    GError* error = NULL;
    svc_action_t *op = NULL;
    GList *standards;
    struct invoke_cb_data *data;

    if (!check_authorization(RESOURCES_INTERFACE_NAME ".invoke",
                             &error, context)) {
        dbus_g_method_return_error(context, error);
        g_error_free(error);
        return FALSE;
    }

    // Check if standard is valid
    standards = resources_list_standards();

    if (g_list_find_custom(standards, standard, (GCompareFunc) strcasecmp) == NULL) {
        mh_err("%s is not a known resource standard", standard);
        error = g_error_new(MATAHARI_ERROR, MH_RES_NOT_IMPLEMENTED,
                            "%s is not a known resource standard", standard);
        dbus_g_method_return_error(context, error);
        g_error_free(error);
        g_list_free_full(standards, free);
        return FALSE;
    }
    g_list_free_full(standards, free);

    op = resources_action_create(name, standard, provider, agent, action,
                                 0, timeout, g_hash_table_ref(parameters));
    op->expected_rc = expected_rc;

    if (!(data = malloc(1 * sizeof(struct invoke_cb_data)))) {
        services_action_free(op);
        return FALSE;
    }

    data->context = context;
    data->userdata = strdup(userdata_in);
    op->cb_data = data;

    services_action_async(op, invoke_cb);
    return FALSE;
}
Esempio n. 6
0
bool ObjectManager::invoke(qmf::AgentSession& session,
                           qmf::AgentEvent& event) const
{
    if (event.hasDataAddr()) {
        MatahariObject *obj = _impl->find(event.getDataAddr());

        if (obj) {
            return obj->invoke(session, event);
        }

        mh_err("Target of method call not found");
    }

    return false;
}
Esempio n. 7
0
svc_action_t *resources_action_create(
    const char *name, const char *standard, const char *provider, const char *agent,
    const char *action, int interval, int timeout, GHashTable *params)
{
    svc_action_t *op;

    op = calloc(1, sizeof(svc_action_t));
    op->opaque = calloc(1, sizeof(svc_action_private_t));
    op->rsc = strdup(name);
    op->action = strdup(action);
    op->interval = interval;
    op->timeout = timeout;
    op->standard = strdup(standard);
    op->agent = strdup(agent);
    op->sequence = ++operations;
    asprintf(&op->id, "%s_%s_%d", name, action, interval);

    if(strcmp(standard, "ocf") == 0) {
	op->provider = strdup(provider);
	op->params = params;

	asprintf(&op->opaque->exec, "%s/resource.d/%s/%s",
		 OCF_ROOT, provider, agent);
	op->opaque->args[0] = strdup(op->opaque->exec);
	op->opaque->args[1] = strdup(action);

    } else if(strcmp(standard, "lsb") == 0 || strcmp(standard, "windows") == 0) {
	services_os_set_exec(op);

    } else {
	mh_err("Unknown resource standard: %s", standard);
	services_action_free(op);
	op = NULL;
    }
    
    return op;
}
Esempio n. 8
0
gboolean
SrvAgent::invoke_resources(qmf::AgentSession session, qmf::AgentEvent event,
                           gpointer user_data)
{
    const std::string& methodName(event.getMethodName());
    if (event.getType() != qmf::AGENT_METHOD) {
        return TRUE;
    }

    qpid::types::Variant::Map& args = event.getArguments();

    if (methodName == "list_standards") {
        event.addReturnArgument("standards", standards);

    } else if (methodName == "list_providers") {
        GList *gIter = NULL;
        GList *providers = NULL;
        _qtype::Variant::List p_list;

	providers = resources_list_providers(args["standard"].asString().c_str());
        for (gIter = providers; gIter != NULL; gIter = gIter->next) {
            p_list.push_back((const char *) gIter->data);
        }
        event.addReturnArgument("providers", p_list);

    } else if (methodName == "list") {
        GList *gIter = NULL;
        GList *agents = NULL;
	const char *standard = "ocf";
	const char *provider = "heartbeat";
        _qtype::Variant::List t_list;

	if(args.count("standard") > 0) {
	    standard = args["standard"].asString().c_str();
	}
	if(args.count("provider") > 0) {
	    provider = args["provider"].asString().c_str();
	}

	agents = resources_list_agents(standard, provider);
        for (gIter = agents; gIter != NULL; gIter = gIter->next) {
            t_list.push_back((const char *) gIter->data);
        }
        event.addReturnArgument("agents", t_list);

    } else if (methodName == "invoke") {
	svc_action_t *op = NULL;
	bool valid_standard = false;
	_qtype::Variant::List::iterator iter;
	_qtype::Variant::Map map;

	if(args.count("parameters") == 1) {
	    map = args["parameters"].asMap();
	}
	
	GHashTable *params = qmf_map_to_hash(map);

	int32_t interval = 0;
	int32_t timeout = 60000;
	const char *agent = NULL;
	const char *standard = "ocf";
	const char *provider = "heartbeat";

	for ( iter=standards.begin() ; iter != standards.end(); iter++ ) {
	    if(args["standard"].asString() == (*iter).asString()) {
		valid_standard = true;
		break;
	    }
	}

	if(valid_standard == false) {
	    mh_err("%s is not a known resource standard", args["standard"].asString().c_str());
	    session.raiseException(event, MH_NOT_IMPLEMENTED);
	    return TRUE;
	}

	if(args.count("standard") > 0) {
	    standard = args["standard"].asString().c_str();
	}
	if(args.count("provider") > 0) {
	    provider = args["provider"].asString().c_str();
	}
	if(args.count("agent") > 0) {
	    agent = args["agent"].asString().c_str();
	} else {
	    agent = args["name"].asString().c_str();	    
	}

	if(args.count("interval") > 0) {
	    interval = args["interval"].asInt32();
	}
	if(args.count("timeout") > 0) {
	    timeout = args["timeout"].asInt32();
	}

	op = resources_action_create(
	    args["name"].asString().c_str(),
	    standard, provider, agent,
	    args["action"].asString().c_str(),
	    interval, timeout, params);

	if(args.count("expected-rc") == 1) {
	    op->expected_rc = args["expected-rc"].asInt32();
	}
	
	action_async(SRV_RESOURCES, session, event, op, true);
	return TRUE;
	
    } else if (methodName == "cancel") {
        services_action_cancel(
                args["name"].asString().c_str(),
                args["action"].asString().c_str(),
                args["interval"].asInt32());

    } else {
        session.raiseException(event, MH_NOT_IMPLEMENTED);
        return TRUE;
    }

    session.methodSuccess(event);
    return TRUE;
}