Example #1
0
int
main(int argc, char ** args)
{
	int i;

	for (i=1; i<argc ;i++) {

		struct hc_url_s *url = hc_url_init(args[i]);

		if (url && NULL != hc_url_get_id(url)) {
			memset(str_id, 0, sizeof(str_id));
			buffer2str(hc_url_get_id(url), hc_url_get_id_size(url),
					str_id, sizeof(str_id));
			fputs(str_id, stdout);
		}
		else {
			fputs(bad, stdout);
		}

		fputc(' ', stdout);
		fputs(args[i], stdout);
		fputc('\n', stdout);

		if (url)
			hc_url_clean(url);
	}

	fflush(stdout);
	return 0;
}
Example #2
0
static void
_input_data_clean(struct gridd_filter_input_data_s *input_data)
{
	if (!input_data)
		return;

	if (NULL != input_data->url) {
		hc_url_clean(input_data->url);
		input_data->url = NULL;
	}

	if (NULL != input_data->params) {
		g_hash_table_destroy(input_data->params);
		input_data->params = NULL;
	}

	if (NULL != input_data->udata) {
		if (input_data->cleaner)
			input_data->cleaner(input_data->udata);
		input_data->udata = NULL;
		input_data->cleaner = NULL;
	}

	g_free(input_data);
}
Example #3
0
gs_error_t * hcadmin_touch(char *url,gchar *action, gboolean checkonly, gchar **globalresult, gchar ***result, char ** args)
{
	gchar *option = NULL;
	guint32 flags = 0;
	gs_error_t *err = NULL;
	struct hc_url_s *hcurl = NULL;

	(void) action;
	(void) checkonly;
	(void) result;

	/* check poptionnal option*/
	if (args != NULL) {
		option = args[0];
		if ( g_strcmp0(option,"UPDATE_CSIZE") == 0) {
			flags = META2TOUCH_FLAGS_UPDATECSIZE;

		} else if ( g_strcmp0(option,"RECALC_CSIZE") == 0) {
			flags = META2TOUCH_FLAGS_RECALCCSIZE;

		} else {
			if ((option) && (strlen(option) > 0)) {
				GSERRORCODE(&err,-1,"invalid option %s\n", option);
				return err;
			}
		} 
	}

	/* check and convert NS/REF/PATH */
	if (!(hcurl = hc_url_init(url))) {
		GSERRORCODE(&err,-1,"invalid URL: %s\n", url);
		return err;
	}

	err = _m2_touch(hcurl, flags);
	if (!err) {
		*globalresult = g_strdup_printf("TOUCH done for %s", url);
	}
	hc_url_clean(hcurl);
	return err;
}
Example #4
0
	gs_error_t*
hcadmin_meta1_policy_update(char *ns,gchar *action, gboolean checkonly, gchar **globalresult, gchar ***result, char ** args)
{
	gs_error_t    *err     = NULL;
	GPtrArray     *gpa     = NULL;
	gchar         *m1pAction  = NULL;
	struct global_cpt_s *cpts = NULL;
	gchar         *excludesrv = NULL;
	gchar         *srvtype = "meta2";
	gchar         *hexID   = NULL;
	GError        *gerr    = NULL;
	container_id_t cid;
	gchar        **tmp     = NULL;

	if ((!args) || ( g_strv_length(args) == 0)) {
		GSERRORCODE(&err,500, "Invalid argument list\n");
		goto failed;
	}

	// extract ID
    hexID = args[0];

	// extract specific arg / action type
	if ( g_strcmp0(action, "meta1_policy_apply") == 0) {
		m1pAction = g_strdup_printf("UPDATE");
		if ( g_strv_length(args) > 1 )
			if (strlen(args[1]) > 0)
	            srvtype = args[1];

	} else if ( g_strcmp0(action, "meta1_policy_exclude") == 0 ) {
		m1pAction = g_strdup_printf("EXCLUDE");
		if ( g_strv_length(args) > 1 )
			excludesrv = args[1];
		else {
			GSERRORCODE(&err, 500, "Missing service url \n");
		}
	} else {	
		GSERRORCODE(&err, 500, "INVALID meta1 policy action %s\n",action);
	}
	if (err)
		goto failed;

	if ( g_strcmp0(hexID,"ALL") == 0) {
		guint idx;
		struct thread_user_data_s *user_data = NULL;
		GThreadPool *pool = NULL;
		cpts = g_malloc0(sizeof(struct global_cpt_s));
		user_data = g_malloc0(sizeof(struct thread_user_data_s));
		user_data->ns = ns;
		user_data->action = m1pAction;
		user_data->type = g_strdup_printf(srvtype);
		user_data->excludesrv = excludesrv;
		user_data->checkonly = checkonly;
		user_data->lock = g_mutex_new();
		user_data->indexreach=0;
		user_data->cpts = cpts;
		user_data->gpa = NULL;
		pool = g_thread_pool_new (_m1policy_update_thread,user_data,10,TRUE,&gerr);
		for ( idx=0; idx<65536 ;idx++) {
			gchar base[5];
			guint8 *prefix=(guint8 *)(&idx);
			g_snprintf(base, sizeof(base), "%02X%02X",
					prefix[0], prefix[1]);
			g_thread_pool_push(pool, g_strdup(base) ,&gerr);
			if ( gerr != NULL ) {
				GRID_WARN("Failed to push new data thread %d, %d %s",idx,gerr->code,gerr->message);
				g_clear_error(&gerr);
				gerr = NULL;
			}
		}
		guint lastindex = 0;
		while(1) {
			if ( user_data->indexreach - lastindex > 500) {
				lastindex = user_data->indexreach;
				GRID_INFO("%d prefix checked",user_data->indexreach);
			}
			if ( user_data->indexreach >= 65536 )
				break;
			usleep(1000000);
		}
		if ( excludesrv && excludesrv[0] ) {
			struct hc_url_s *url = NULL;
			url = hc_url_empty();
			hc_url_set(url,HCURL_NS,ns);
			m2v2_remote_execute_EXITELECTION(excludesrv,NULL,url);
			hc_url_clean(url);
		}
		g_thread_pool_free(pool, FALSE, TRUE);
		g_mutex_free(user_data->lock);
		g_free(user_data);
		gpa = user_data->gpa;

	} else {
		// prefix ??
		if ( strlen(hexID) == 4 ) {
			if(!hex2bin(hexID, cid, 2, &gerr)) {
				GSERRORCAUSE(&err, gerr, "Invalid prefix\n");
				goto failed;
			}
			err = _m1policy_update(m1pAction,ns,TRUE,cid, srvtype, excludesrv, checkonly, &tmp);
			_pack_result(&gpa,hexID,tmp,err,NULL);
			if ( err ) {
				gs_error_free(err);
				err = NULL;
			} else {
				if ( excludesrv && excludesrv[0] ) {
					struct hc_url_s *url = NULL;
					url = hc_url_empty();
					hc_url_set(url,HCURL_NS,ns);
					m2v2_remote_execute_EXITELECTION(excludesrv,NULL,url);
					hc_url_clean(url);
				}
			}

		// CID ??
		} else if (strlen(hexID) == 64 ) {
			if (!hex2bin(hexID, cid, sizeof(container_id_t), &gerr)) {
				GSERRORCAUSE(&err, gerr, "Invalid container_id\n");
				goto failed;
			}
			err = _m1policy_update(m1pAction,ns,FALSE,cid, srvtype, excludesrv, checkonly, &tmp);
			_pack_result(&gpa,hexID,tmp,err,NULL);
			if ( err ) {
				gs_error_free(err);
				err = NULL;
			} else {
				if ( excludesrv && excludesrv[0] ) {
					struct hc_url_s *url = NULL;
					url = hc_url_empty();
					hc_url_set(url,HCURL_NS,ns);
					hc_url_set(url,HCURL_HEXID,hexID);
					m2v2_remote_execute_EXITELECTION(excludesrv,NULL,url);
					hc_url_clean(url);
				}
			}

		// other ? --> error
		} else {
			GSERRORCODE(&err,500,"invalid ID %s, %d \n",hexID, sizeof(hexID));
		}
	}

	// free all memory
	if ( gerr)
		g_clear_error(&gerr);

	if ( gpa ) {
		g_ptr_array_add(gpa, NULL);
		if ( cpts ) {
			*globalresult = g_strdup_printf("Global result : References checked %lu , updated %lu , failed %lu",cpts->checkedRef,cpts->updatedRef,cpts->failedRef);
		}
		*result = (gchar**)g_ptr_array_free(gpa,FALSE);
	}
	if ( tmp )
		g_strfreev (tmp);
	if ( cpts )
		g_free(cpts);

failed :
	if (m1pAction)
		g_free(m1pAction);

	return err;
}
static gboolean
meta1_dispatch_v1_CREATE(struct gridd_reply_ctx_s *reply,
		struct meta1_backend_s *m1, gpointer ignored)
{
	GError *err;
	struct addr_info_s m2addr;
	container_id_t cid;
	gchar **result = NULL;
	gchar strcid[65], cname[256], vns[256];
	struct hc_url_s *url = NULL;

	/* Unpack the request */
	(void) ignored;
	EXTRACT_CID(cid);
	EXTRACT_CNAME(cname);
	EXTRACT_VNS(vns);
	url = _forge_url(m1, vns, strcid);

	reply->subject("%s/%s|%s", vns, cname, strcid);

	/* Test if the container exsists */
	err = meta1_backend_get_container_all_services(m1, cid, "meta2", &result);
	if (NULL != err) {
		if (err->code != CODE_CONTAINER_NOTFOUND) {
			hc_url_clean(url);
			reply->send_error(0, err);
			return TRUE;
		}
		g_clear_error(&err);

		GRID_DEBUG("Creating the container reference");
		err = meta1_backend_create_container(m1, vns, cname, NULL);
		if (NULL != err) {
			hc_url_clean(url);
			reply->send_error(0, err);
			return TRUE;
		}
	}

	/* Associate a META2 to the container */
	if (result && !*result) {
		g_free(result);
		result = NULL;
	}
	if (!result) {
		GRID_TRACE("Meta2 election...");
		err = meta1_backend_get_container_service_available(m1, url, "meta2",
				FALSE, &result);
		if (NULL != err) {
			hc_url_clean(url);
			reply->send_error(0, err);
			return TRUE;
		}
	}

	/* Contact the meta2 and create a container on it */
	gchar **p_url;
	for (p_url=result; *p_url ;p_url++) {

		err = _create_on_meta2(*p_url, vns, cname, cid, &m2addr);
		if (!err) {
			GRID_DEBUG("Container created on META2");
			break;
		}

		if (err->code == CODE_CONTAINER_EXISTS) {
			GRID_DEBUG("Container already present on META2");
			break;
		}

		if (err->code >= 300) {
			GRID_DEBUG("Error when creating the container on META2 [%s]"
					" : code=%d message=%s",
					*p_url, err->code, err->message);
			break;
		}

		GRID_INFO("Network error : code=%d message=%s", err->code, err->message);
		g_clear_error(&err);
	}

	g_strfreev(result);
	hc_url_clean(url);

	if (err) {
		reply->send_error(0, err);
		return TRUE;
	}

	/* Send the META2 address in the body of the reply ? */
	reply->add_body(marshall_addrl(singleton_addrl(&m2addr), NULL));

	GRID_DEBUG("Container created!");
	reply->send_reply(200, "OK");
	return TRUE;
}