static gboolean
meta1_dispatch_v2_SRV_UNLINK(struct gridd_reply_ctx_s *reply,
		struct meta1_backend_s *m1, gpointer ignored)
{
	gchar **urlv = NULL;
	GError *err;
	gchar *srvtype = metautils_message_extract_string_copy (reply->request, NAME_MSGKEY_TYPENAME);
	struct oio_url_s *url = metautils_message_extract_url (reply->request);
	reply->subject("%s|%s|%s", oio_url_get(url, OIOURL_WHOLE), oio_url_get(url, OIOURL_HEXID), srvtype);
	(void) ignored;

	if (!srvtype)
		reply->send_error(CODE_BAD_REQUEST, NEWERROR(CODE_BAD_REQUEST, "Missing srvtype"));
	else if (NULL != (err = metautils_message_extract_body_strv(reply->request, &urlv)))
		reply->send_error(CODE_BAD_REQUEST, err);
	else if (NULL != (err = meta1_backend_services_unlink(m1, url, srvtype, urlv)))
		reply->send_error(0, err);
	else
		reply->send_reply(CODE_FINAL_OK, "OK");

	if (urlv) g_strfreev (urlv);
	oio_url_clean (url);
	g_free0 (srvtype);
	return TRUE;
}
Пример #2
0
void
sqlx_name_fill  (struct sqlx_name_mutable_s *n, struct oio_url_s *url,
		const char *srvtype, gint64 seq)
{
	EXTRA_ASSERT (n != NULL);
	EXTRA_ASSERT (url != NULL);
	EXTRA_ASSERT (srvtype != NULL);
	const gchar *subtype = oio_url_get (url, OIOURL_TYPE);

	n->ns = g_strdup(oio_url_get (url, OIOURL_NS));

	if (!strcmp(srvtype, NAME_SRVTYPE_META0)) {
		n->base = g_strdup (oio_url_get (url, OIOURL_NS));
	} else if (!strcmp(srvtype, NAME_SRVTYPE_META1)) {
		n->base = g_strndup (oio_url_get(url, OIOURL_HEXID), 4);
	} else {
		n->base = g_strdup_printf ("%s.%"G_GINT64_FORMAT,
				oio_url_get (url, OIOURL_HEXID), seq);
	}

	if (subtype && 0 != strcmp(subtype, OIOURL_DEFAULT_TYPE))
		n->type = g_strdup_printf ("%s.%s", srvtype, subtype);
	else
		n->type = g_strdup (srvtype);
}
static gboolean
meta1_dispatch_v2_SRV_RENEW(struct gridd_reply_ctx_s *reply,
		struct meta1_backend_s *m1, gpointer ignored)
{
	struct oio_url_s *url = metautils_message_extract_url (reply->request);
	gboolean ac = metautils_message_extract_flag(reply->request, NAME_MSGKEY_AUTOCREATE, FALSE);
	gboolean dryrun = metautils_message_extract_flag(reply->request, NAME_MSGKEY_DRYRUN, FALSE);
	gchar *srvtype = metautils_message_extract_string_copy (reply->request, NAME_MSGKEY_TYPENAME);
	reply->subject("%s|%s|%s|%d", oio_url_get(url, OIOURL_WHOLE), oio_url_get(url, OIOURL_HEXID), srvtype, dryrun);
	(void) ignored;

	gchar **result = NULL;
	GError *err = meta1_backend_services_poll(m1, url, srvtype, ac, dryrun, &result);
	if (NULL != err)
		reply->send_error(0, err);
	else {
		reply->add_body(marshall_stringv_and_clean(&result));
		reply->send_reply(CODE_FINAL_OK, "OK");
	}

	if (result) g_strfreev (result);
	oio_url_clean(url);
	g_free0 (srvtype);
	return TRUE;
}
static gboolean
meta1_dispatch_v2_PROPDEL(struct gridd_reply_ctx_s *reply,
		struct meta1_backend_s *m1, gpointer ignored UNUSED)
{
	struct oio_url_s *url = metautils_message_extract_url (reply->request);
	reply->subject("%s|%s", oio_url_get(url, OIOURL_WHOLE), oio_url_get(url, OIOURL_HEXID));

	gchar **keys = NULL;
	gsize length = 0;
	void *body = metautils_message_get_BODY(reply->request, &length);
	GError *err = STRV_decode_buffer(body, length, &keys);

	if (NULL != err)
		reply->send_error(CODE_BAD_REQUEST, err);
	else {
		err = meta1_backend_del_container_properties(m1, url, keys);
		if (err)
			reply->send_error(0, err);
		else
			reply->send_reply(CODE_FINAL_OK, "OK");
		g_strfreev (keys);
	}

	oio_url_clean (url);
	return TRUE;
}
static gboolean
meta1_dispatch_v2_USERCREATE(struct gridd_reply_ctx_s *reply,
		struct meta1_backend_s *m1, gpointer ignored UNUSED)
{
	struct oio_url_s *url = metautils_message_extract_url (reply->request);
	reply->subject("%s|%s", oio_url_get(url, OIOURL_WHOLE), oio_url_get(url, OIOURL_HEXID));

	gsize length = 0;
	void *body = metautils_message_get_BODY(reply->request, &length);
	gchar **properties = NULL;
	GError *err = KV_decode_buffer(body, length, &properties);
	if (NULL != err) {
		reply->send_error(0, err);
		return TRUE;
	}

	err = meta1_backend_user_create(m1, url, properties);
	g_strfreev(properties);

	if (NULL != err)
		reply->send_error(0, err);
	else
		reply->send_reply(CODE_FINAL_OK, "Created");

	oio_url_clean (url);
	return TRUE;
}
static gboolean
meta1_dispatch_v2_PROPGET(struct gridd_reply_ctx_s *reply,
		struct meta1_backend_s *m1, gpointer ignored)
{
	GError *err;
	gchar **strv = NULL, **result = NULL;
	struct oio_url_s *url = metautils_message_extract_url (reply->request);
	reply->subject("%s|%s", oio_url_get(url, OIOURL_WHOLE), oio_url_get(url, OIOURL_HEXID));

	(void) ignored;

	if (NULL != (err = metautils_message_extract_body_strv(reply->request, &strv)))
		reply->send_error(CODE_BAD_REQUEST, err);
	else if (NULL != (err = meta1_backend_get_container_properties(m1, url, strv, &result)))
		reply->send_error(0, err);
	else {
		reply->add_body(marshall_stringv_and_clean(&result));
		reply->send_reply(CODE_FINAL_OK, "OK");
	}

	if (strv) g_strfreev (strv);
	if (result) g_strfreev (result);
	oio_url_clean (url);
	return TRUE;
}
static gboolean
meta1_dispatch_v2_SRV_UNLINK(struct gridd_reply_ctx_s *reply,
		struct meta1_backend_s *m1, gpointer ignored UNUSED)
{
	gchar *srvtype = metautils_message_extract_string_copy (reply->request, NAME_MSGKEY_TYPENAME);
	struct oio_url_s *url = metautils_message_extract_url (reply->request);
	reply->subject("%s|%s|%s", oio_url_get(url, OIOURL_WHOLE), oio_url_get(url, OIOURL_HEXID), srvtype);

	if (!srvtype)
		reply->send_error(CODE_BAD_REQUEST, NEWERROR(CODE_BAD_REQUEST, "Missing srvtype"));
	else {
		gsize length = 0;
		void *body = metautils_message_get_BODY(reply->request, &length);
		gchar **urlv = NULL;
		GError *err = STRV_decode_buffer(body, length, &urlv);
		if (NULL != err)
			reply->send_error(CODE_BAD_REQUEST, err);
		else {
			err = meta1_backend_services_unlink(m1, url, srvtype, urlv);
			if (NULL != err)
				reply->send_error(0, err);
			else
				reply->send_reply(CODE_FINAL_OK, "OK");
			g_strfreev (urlv);
		}
	}

	oio_url_clean (url);
	g_free0 (srvtype);
	return TRUE;
}
static gboolean
meta1_dispatch_v2_SRV_FORCE(struct gridd_reply_ctx_s *reply,
		struct meta1_backend_s *m1, gpointer ignored UNUSED)
{
	struct oio_url_s *url = metautils_message_extract_url (reply->request);
	gboolean ac = metautils_message_extract_flag (reply->request, NAME_MSGKEY_AUTOCREATE, FALSE);
	gboolean force = metautils_message_extract_flag (reply->request, NAME_MSGKEY_FORCE, FALSE);
	reply->subject("%s|%s|?", oio_url_get(url, OIOURL_WHOLE), oio_url_get(url, OIOURL_HEXID));

	gchar *m1url = NULL;
	GError *err = metautils_message_extract_body_string(reply->request, &m1url);
	if (NULL != err)
		reply->send_error(CODE_BAD_REQUEST, err);
	else {
		reply->subject("%s|%s|%s", oio_url_get(url, OIOURL_WHOLE), oio_url_get(url, OIOURL_HEXID), m1url);
		err = meta1_backend_services_set(m1, url, m1url, ac, force);
		g_free0 (m1url);
		if (NULL != err)
			reply->send_error(0, err);
		else
			reply->send_reply(200, "OK");
	}

	oio_url_clean (url);
	return TRUE;
}
static gboolean
meta1_dispatch_v2_SRVRELINK(struct gridd_reply_ctx_s *reply,
	struct meta1_backend_s *m1, gpointer ignored)
{
	GError *err = NULL;
	gchar *replaced = NULL, *kept = NULL, **newset = NULL;
	struct oio_url_s *url = NULL;
	(void) ignored;

	url = metautils_message_extract_url (reply->request);
	kept = metautils_message_extract_string_copy (reply->request, NAME_MSGKEY_OLD);
	replaced = metautils_message_extract_string_copy (reply->request, NAME_MSGKEY_NOTIN);
	gboolean dryrun = metautils_message_extract_flag (reply->request, NAME_MSGKEY_DRYRUN, FALSE);
	reply->subject("%s|%s", oio_url_get(url, OIOURL_WHOLE), oio_url_get(url, OIOURL_HEXID));

	if (!url) {
		reply->send_error (0, NEWERROR(CODE_BAD_REQUEST, "Missing field (%s)", "url"));
	} else {
		err = meta1_backend_services_relink (m1, url, kept, replaced, dryrun, &newset);
		if (NULL != err) {
			reply->send_error (0, err);
		} else {
			reply->add_body(marshall_stringv_and_clean(&newset));
			reply->send_reply (CODE_FINAL_OK, "OK");
		}
	}

	oio_url_pclean (&url);
	g_free0 (kept);
	g_free0 (replaced);
	if (newset) g_strfreev (newset);
	return TRUE;
}
Пример #10
0
static enum http_rc_e
handler_action (struct http_request_s *rq, struct http_reply_ctx_s *rp)
{
	// Get a request id for the current request
	const gchar *reqid = g_tree_lookup (rq->tree_headers, PROXYD_HEADER_REQID);
	if (reqid)
		oio_ext_set_reqid(reqid);
	else
		oio_ext_set_random_reqid();

	// Then parse the request to find a handler
	struct oio_url_s *url = NULL;
	struct oio_requri_s ruri = {NULL, NULL, NULL, NULL};
	oio_requri_parse (rq->req_uri, &ruri);

	struct path_matching_s **matchings = _metacd_match (rq->cmd, ruri.path);

	GRID_TRACE2("URI path[%s] query[%s] fragment[%s] matches[%u]",
			ruri.path, ruri.query, ruri.fragment,
			g_strv_length((gchar**)matchings));

	GQuark gq_count = gq_count_unexpected;
	GQuark gq_time = gq_time_unexpected;

	enum http_rc_e rc;
	if (!*matchings) {
		rp->set_content_type ("application/json");
		rp->set_body_gstr (g_string_new("{\"status\":404,\"message\":\"No handler found\"}"));
		rp->set_status (HTTP_CODE_NOT_FOUND, "No handler found");
		rp->finalize ();
		rc = HTTPRC_DONE;
	} else {
		struct req_args_s args = {0};
		args.req_uri = &ruri;
		args.matchings = matchings;
		args.rq = rq;
		args.rp = rp;

		args.url = url = _metacd_load_url (&args);
		rp->subject(oio_url_get(url, OIOURL_HEXID));
		gq_count = (*matchings)->last->gq_count;
		gq_time = (*matchings)->last->gq_time;
		GRID_TRACE("%s %s URL %s", __FUNCTION__, ruri.path, oio_url_get(args.url, OIOURL_WHOLE));
		req_handler_f handler = (*matchings)->last->u;
		rc = (*handler) (&args);
	}

	gint64 spent = oio_ext_monotonic_time () - rq->client->time.evt_in;

	network_server_stat_push4 (rq->client->server, TRUE,
			gq_count, 1, gq_count_all, 1,
			gq_time, spent, gq_time_all, spent);

	path_matching_cleanv (matchings);
	oio_requri_clear (&ruri);
	oio_url_pclean (&url);
	oio_ext_set_reqid (NULL);
	return rc;
}
Пример #11
0
static GString *
_curl_reference_url (struct oio_url_s *u, const char *action)
{
	GString *hu = _curl_url_prefix_reference (u);
	g_string_append_printf (hu, "/%s/%s/reference/%s", PROXYD_PREFIX,
			oio_url_get(u, OIOURL_NS), action);
	_append (hu, '?', "acct", oio_url_get (u, OIOURL_ACCOUNT));
	_append (hu, '&', "ref",  oio_url_get (u, OIOURL_USER));
	return hu;
}
Пример #12
0
static GString *
_curl_content_url (struct oio_url_s *u, const char *action)
{
	GString *hu = _curl_url_prefix_containers (u);
	g_string_append_printf (hu, "/%s/%s/content/%s", PROXYD_PREFIX,
			oio_url_get(u, OIOURL_NS), action);
	_append (hu, '?', "acct", oio_url_get (u, OIOURL_ACCOUNT));
	_append (hu, '&', "ref",  oio_url_get (u, OIOURL_USER));
	_append_type (u, hu);
	_append (hu, '&', "path", oio_url_get (u, OIOURL_PATH));
	return hu;
}
static int
_meta2_filter_check_ns_name(struct gridd_filter_ctx_s *ctx,
		struct gridd_reply_ctx_s *reply, int optional)
{
	(void) reply;
	TRACE_FILTER();
	const struct meta2_backend_s *backend = meta2_filter_ctx_get_backend(ctx);
	const char *req_ns = oio_url_get(meta2_filter_ctx_get_url(ctx), OIOURL_NS);

	if (!backend || !backend->ns_name[0]) {
		GRID_DEBUG("Missing information for namespace checking");
		meta2_filter_ctx_set_error(ctx, NEWERROR(CODE_INTERNAL_ERROR,
					"Missing backend information, cannot check namespace"));
		return FILTER_KO;
	}

	if (!req_ns) {
		if (optional)
			return FILTER_OK;
		GRID_DEBUG("Missing namespace name in request");
		meta2_filter_ctx_set_error(ctx, NEWERROR(CODE_BAD_REQUEST,
					"Bad Request: Missing namespace name information"));
		return FILTER_KO;
	}

	if (0 != g_ascii_strcasecmp(backend->ns_name, req_ns)) {
		meta2_filter_ctx_set_error(ctx, NEWERROR(CODE_BAD_REQUEST,
					"Request namespace [%s] does not match server namespace [%s]",
					req_ns, backend->ns_name));
		return FILTER_KO;
	}

	return FILTER_OK;
}
gboolean
m1b_check_ns_url (struct meta1_backend_s *m1, struct oio_url_s *url)
{
	if (!url)
		return FALSE;
	return m1b_check_ns (m1, oio_url_get (url, OIOURL_NS));
}
Пример #15
0
static GError *
__notify_services(struct meta1_backend_s *m1, struct sqlx_sqlite3_s *sq3,
                  struct oio_url_s *url)
{
    if (!m1->notifier)
        return NULL;

    struct meta1_service_url_s **services = NULL;
    GError *err = __get_container_all_services(sq3, url, NULL, &services);
    if (!err) {
        struct meta1_service_url_s **services2 = expand_urlv(services);
        GString *notif = g_string_sized_new(128);
        g_string_append (notif, "{\"event\":\""NAME_SRVTYPE_META1".account.services\"");
        g_string_append_printf (notif, ",\"when\":%"G_GINT64_FORMAT, oio_ext_real_time());
        g_string_append (notif, ",\"data\":{");
        g_string_append_printf (notif, "\"url\":\"%s\"", oio_url_get(url, OIOURL_WHOLE));
        g_string_append (notif, ",\"services\":[");
        if (services2) {
            for (struct meta1_service_url_s **svc = services2; *svc ; svc++) {
                if (svc != services2) // not at the beginning
                    g_string_append(notif, ",");
                meta1_service_url_encode_json(notif, *svc);
            }
        }
        g_string_append(notif, "]}}");

        oio_events_queue__send (m1->notifier, g_string_free(notif, FALSE));

        meta1_service_url_cleanv(services2);
        meta1_service_url_cleanv(services);
    }
    return err;
}
Пример #16
0
GError *
meta2_backend_has_container(struct meta2_backend_s *m2,
		struct oio_url_s *url)
{
	GError *err = NULL;

	EXTRA_ASSERT(m2 != NULL);
	EXTRA_ASSERT(url != NULL);
	GRID_DEBUG("HAS(%s)", oio_url_get(url, OIOURL_WHOLE));

	struct sqlx_name_mutable_s n;
	sqlx_name_fill (&n, url, NAME_SRVTYPE_META2, 1);
	err = sqlx_repository_has_base(m2->backend.repo, sqlx_name_mutable_to_const(&n));
	sqlx_name_clean (&n);

	if (NULL != err) {
		g_prefix_error(&err, "File error: ");
		return err;
	}

	struct sqlx_sqlite3_s *sq3 = NULL;
	err = m2b_open(m2, url, M2V2_OPEN_LOCAL, &sq3);
	if (NULL == err) {
		if (!sqlx_admin_has(sq3, META2_INIT_FLAG))
			err = NEWERROR(CODE_CONTAINER_NOTFOUND,
					"Container created but not initiated");
		m2b_close(sq3);
	}
	return err;
}
Пример #17
0
static int
_meta2_filter_check_ns_name(struct gridd_filter_ctx_s *ctx,
		struct gridd_reply_ctx_s *reply, int optional)
{
	(void) reply;
	TRACE_FILTER();
	const struct meta2_backend_s *backend = meta2_filter_ctx_get_backend(ctx);
	const char *req_ns = oio_url_get(meta2_filter_ctx_get_url(ctx), OIOURL_NS);

	if (!backend || !backend->ns_name[0]) {
		GRID_DEBUG("Missing information for namespace checking");
		meta2_filter_ctx_set_error(ctx, SYSERR("backend not ready"));
		return FILTER_KO;
	}

	if (!req_ns) {
		if (optional)
			return FILTER_OK;
		GRID_DEBUG("Missing namespace name in request");
		meta2_filter_ctx_set_error(ctx, BADREQ("No namespace"));
		return FILTER_KO;
	}

	if (0 != g_ascii_strcasecmp(backend->ns_name, req_ns)) {
		meta2_filter_ctx_set_error(ctx, BADNS());
		return FILTER_KO;
	}

	return FILTER_OK;
}
static gboolean
meta1_dispatch_v2_USERDESTROY(struct gridd_reply_ctx_s *reply,
		struct meta1_backend_s *m1, gpointer ignored UNUSED)
{
	struct oio_url_s *url = metautils_message_extract_url (reply->request);
	gboolean force = metautils_message_extract_flag(reply->request, NAME_MSGKEY_FORCE, FALSE);
	reply->subject("%s|%s|%d", oio_url_get(url, OIOURL_WHOLE), oio_url_get(url, OIOURL_HEXID), force);

	GError *err = meta1_backend_user_destroy(m1, url, force);
	if (NULL != err)
		reply->send_error(0, err);
	else
		reply->send_reply(CODE_FINAL_OK, "OK");

	oio_url_clean (url);
	return TRUE;
}
Пример #19
0
static GString *
_append_type (struct oio_url_s *u, GString *hu)
{
	const char *type = oio_url_get (u, OIOURL_TYPE);
	if (type && *type)
		_append (hu, '&', "type", type);
	return hu;
}
static gboolean
meta1_dispatch_v2_USERCREATE(struct gridd_reply_ctx_s *reply,
		struct meta1_backend_s *m1, gpointer ignored)
{
	(void) ignored;
	struct oio_url_s *url = metautils_message_extract_url (reply->request);
	reply->subject("%s|%s", oio_url_get(url, OIOURL_WHOLE), oio_url_get(url, OIOURL_HEXID));

	GError *err = meta1_backend_user_create(m1, url);
	if (NULL != err)
		reply->send_error(0, err);
	else
		reply->send_reply(CODE_FINAL_OK, "Created");

	oio_url_clean (url);
	return TRUE;
}
static gboolean
meta1_dispatch_v2_USERINFO(struct gridd_reply_ctx_s *reply,
		struct meta1_backend_s *m1, gpointer ignored UNUSED)
{
	struct oio_url_s *url = metautils_message_extract_url (reply->request);
	reply->subject("%s|%s", oio_url_get(url, OIOURL_WHOLE), oio_url_get(url, OIOURL_HEXID));

	gchar **info = NULL;
	GError *err = meta1_backend_user_info(m1, url, &info);
	if (NULL != err)
		reply->send_error(0, err);
	else {
		reply->add_body(encode_and_clean(STRV_encode_gba, info));
		reply->send_reply(CODE_FINAL_OK, "OK");
	}

	oio_url_clean (url);
	return TRUE;
}
Пример #22
0
static void
_append_url (GString *gs, struct oio_url_s *url)
{
	void _append (const char *n, const char *v) {
		if (v)
			g_string_append_printf (gs, "\"%s\":\"%s\"", n, v);
		else
			g_string_append_printf (gs, "\"%s\":null", n);
	}
	_append ("ns", oio_url_get(url, OIOURL_NS));
	g_string_append_c (gs, ',');
	_append ("account", oio_url_get(url, OIOURL_ACCOUNT));
	g_string_append_c (gs, ',');
	_append ("user", oio_url_get(url, OIOURL_USER));
	g_string_append_c (gs, ',');
	_append ("type", oio_url_get(url, OIOURL_TYPE));
	g_string_append_c (gs, ',');
	_append ("id", oio_url_get(url, OIOURL_HEXID));
}
static gboolean
meta1_dispatch_v2_SRV_ALLONM1(struct gridd_reply_ctx_s *reply,
        struct meta1_backend_s *m1, gpointer ignored UNUSED)
{
	struct oio_url_s *url = metautils_message_extract_url (reply->request);
    reply->subject("%s|%s", oio_url_get(url, OIOURL_WHOLE), oio_url_get(url, OIOURL_HEXID));
    reply->send_reply(CODE_TEMPORARY, "Received");

	gchar **result = NULL;
	GError *err = meta1_backend_services_all(m1, url, &result);
	if (NULL != err)
        reply->send_error(0, err);
    else {
        reply->add_body(encode_and_clean(STRV_encode_gba, result));
        reply->send_reply(CODE_FINAL_OK, "OK");
    }

	oio_url_clean (url);
    return TRUE;
}
Пример #24
0
static void
_get_meta2_realtype (struct req_args_s *args, gchar *d, gsize dlen,
		const char *prefix)
{
	const char *type = oio_url_get (args->url, OIOURL_TYPE);
	if (type && *type) {
		g_snprintf(d, dlen, "%s%s.%s", prefix, NAME_SRVTYPE_META2, type);
	} else {
		g_snprintf(d, dlen, "%s%s", prefix, NAME_SRVTYPE_META2);
	}
}
Пример #25
0
static void
_test_url (guint idx, struct oio_url_s *u, struct test_data_s *td)
{
	(void) idx;
	_test_field (td->whole, u, OIOURL_WHOLE);
	_test_field (td->ns, u, OIOURL_NS);
	_test_field (td->account, u, OIOURL_ACCOUNT);
	_test_field (td->ref, u, OIOURL_USER);
	_test_field (td->type, u, OIOURL_TYPE);
	_test_field (td->path, u, OIOURL_PATH);
	if (td->hexa) {
		g_assert (oio_url_has (u, OIOURL_HEXID));
		g_assert (NULL != oio_url_get_id (u));
		g_assert (!g_ascii_strcasecmp (oio_url_get (u, OIOURL_HEXID), td->hexa));
	} else {
		g_assert (!oio_url_has (u, OIOURL_HEXID));
		g_assert (NULL == oio_url_get_id (u));
		g_assert (NULL == oio_url_get (u, OIOURL_HEXID));
	}
}
Пример #26
0
static void
cli_action(void)
{
	/* Use the client to get a sqlx service */
	GRID_DEBUG("Locating [%s] CID[%s]", oio_url_get(url, OIOURL_WHOLE),
			oio_url_get(url, OIOURL_HEXID));

	gchar **srvurlv = NULL;
	GError *err = hc_resolve_reference_service(resolver, url, type, &srvurlv);
	if (err != NULL) {
		GRID_ERROR("Services resolution error: (%d) %s", err->code, err->message);
		grid_main_set_status(1);
		return;
	}

	if (!srvurlv || !*srvurlv) {
		GRID_ERROR("Services resolution error: (%d) %s", 0, "No service found");
		grid_main_set_status(1);
		return;
	}

	for (gchar **s=srvurlv; *s ;s++)
		GRID_DEBUG("Located [%s]", *s);

	gint rc = 0;
	for (gchar **s=srvurlv; !rc && *s ;s++) {
		struct meta1_service_url_s *surl;
		if (!(surl = meta1_unpack_url(*s)))
			g_printerr("Invalid service URL from meta1 [%s]\n", *s);
		else {
			if (!g_ascii_strcasecmp("destroy", query[0])) {
				rc = do_destroy2(surl);
			} else {
				rc = do_queryv(surl);
			}
			g_free(surl);
		}
	}

	g_strfreev(srvurlv);
}
Пример #27
0
void
sqlx_name_fill_type_asis  (struct sqlx_name_mutable_s *n, struct oio_url_s *url,
		const char *srvtype, gint64 seq)
{
	EXTRA_ASSERT (n != NULL);
	EXTRA_ASSERT (url != NULL);
	EXTRA_ASSERT (srvtype != NULL);

	n->ns = g_strdup(oio_url_get (url, OIOURL_NS));

	if (!strcmp(srvtype, NAME_SRVTYPE_META0)) {
		n->base = g_strdup (oio_url_get (url, OIOURL_NS));
	} else if (!strcmp(srvtype, NAME_SRVTYPE_META1)) {
		n->base = g_strndup (oio_url_get(url, OIOURL_HEXID), 4);
	} else {
		n->base = g_strdup_printf ("%s.%"G_GINT64_FORMAT,
				oio_url_get (url, OIOURL_HEXID), seq);
	}

	n->type = g_strdup (srvtype);
}
Пример #28
0
static void
_test_field (const char *v, struct oio_url_s *u, enum oio_url_field_e f)
{
	const char *found = oio_url_get (u, f);
	if (v) {
		g_assert (oio_url_has (u, f));
		g_assert (!strcmp (v, found));
	} else {
		g_assert (!oio_url_has (u, f));
		g_assert (NULL == found);
	}
}
static gboolean
meta1_dispatch_v2_SRV_CONFIG(struct gridd_reply_ctx_s *reply,
		struct meta1_backend_s *m1, gpointer ignored)
{
	GError *err;
	gchar *m1url = NULL;
	struct oio_url_s *url = metautils_message_extract_url (reply->request);
	reply->subject("%s|%s", oio_url_get(url, OIOURL_WHOLE), oio_url_get(url, OIOURL_HEXID));
	(void) ignored;

	if (NULL != (err = metautils_message_extract_body_string(reply->request, &m1url)))
		reply->send_error(CODE_BAD_REQUEST, err);
	else if (NULL != (err = meta1_backend_services_config(m1, url, m1url)))
		reply->send_error(0, err);
	else
		reply->send_reply(CODE_FINAL_OK, "OK");

	g_free0 (m1url);
	oio_url_clean (url);
	return TRUE;
}
static gboolean
meta1_dispatch_v2_USERINFO(struct gridd_reply_ctx_s *reply,
		struct meta1_backend_s *m1, gpointer ignored)
{
	GError *err;
	gchar **info = NULL;
	struct oio_url_s *url = metautils_message_extract_url (reply->request);
	reply->subject("%s|%s", oio_url_get(url, OIOURL_WHOLE), oio_url_get(url, OIOURL_HEXID));
	(void) ignored;

	if (NULL != (err = meta1_backend_user_info(m1, url, &info)))
		reply->send_error(0, err);
	else {
		reply->add_body(marshall_stringv_and_clean(&info));
		reply->send_reply(CODE_FINAL_OK, "OK");
	}

	if (info) g_strfreev (info);
	oio_url_clean (url);
	return TRUE;
}