static json_t *fan_listener_get(struct rest_uri_param *param)
{
	int32 tzone_idx = 0;
	int32 fan_idx = 0;
	listener_dest_info_t *header = (listener_dest_info_t *)malloc(sizeof(listener_dest_info_t));

	if (header == NULL) {
		HTTPD_ERR("malloc failed\n");
		return NULL;
	}

	tzone_idx = get_asset_idx(param, "zone_id", MC_TYPE_TZONE);
	if (tzone_idx == -1) {
		HTTPD_ERR("get cooling zone index fail\n");
		return NULL;
	}

	fan_idx = get_asset_idx(param, "fan", MC_TYPE_PSU);
	if (fan_idx == -1) {
		HTTPD_ERR("get fan index fail\n");
		return NULL;
	}

	memset(header, 0, sizeof(listener_dest_info_t));
	libwrap_get_listeners_by_type(MC_REDFISH_FAN_COLL, tzone_idx, (tzone_idx - 1) * MAX_PWM_NUM + fan_idx, header);
	return get_json_listener(header);

}
Example #2
0
int32 rf_evt_info_init(rf_evt_svc_t *service, int32 *evt_types, const int8 *fmt, ...)
{
	va_list args;
	int32 rc = -1;

	rc = get_fixed_info(&service->fixed);
	if (rc != 0) {
		HTTPD_ERR("get redfish fixed info error\n");
		return -1;
	}

	rc = get_evt_support(evt_types);
	if (rc != 0) {
		HTTPD_ERR("get redfish event support error\n");
		return -1;
	}

	va_start(args, fmt);
	rc = get_evt_links(&service->links, fmt, args);
	va_end(args);
	if (rc != 0) {
		HTTPD_ERR("get redfish event links error\n");
		return -1;
	}

	return 0;
}
static json_t *fan_evt_get(struct rest_uri_param *param)
{
	rf_evt_svc_t service = { { {0} } };
	json_t *result = NULL;
	int32 tzone_idx, fan_idx, reg = 0;

	get_rf_base_info(&(service.base));

	result = json_object();
	if (result == NULL) {
		HTTPD_ERR("result json object request error\n");
		return NULL;
	}
	tzone_idx = get_asset_idx(param, "zone_id", MC_TYPE_TZONE);
	if (tzone_idx == -1) {
		HTTPD_ERR("get cooling zone index fail\n");
		return NULL;
	}

	fan_idx = get_asset_idx(param, "fan_id", MC_TYPE_FAN);
	if (fan_idx == -1) {
		HTTPD_ERR("get psu zone index fail\n");
		return NULL;
	}

	pack_rf_base_json(result, &(service.base));
	reg = 1 << ((tzone_idx - 1) * MAX_PWM_NUM + (fan_idx - 1));
	get_evt_links(&(service.links), MC_REDFISH_FAN_COLL, reg, RF_EVENT_FAN_FMT, tzone_idx, fan_idx);
	pack_rf_evt_links(result, &(service.links));

	return result;
}
static json_t *fan_evt_post(struct rest_uri_param *param)
{
	json_t *req = NULL;
	listener_dest_t listener;
	int32 tzone_idx, fan_idx;
	int32 mask = 0;

	tzone_idx = get_asset_idx(param, "zone_id", MC_TYPE_TZONE);
	if (tzone_idx == -1) {
		HTTPD_ERR("get cooling zone index fail\n");
		return NULL;
	}

	fan_idx = get_asset_idx(param, "fan_id", MC_TYPE_FAN);
	if (fan_idx == -1) {
		HTTPD_ERR("get psu zone index fail\n");
		return NULL;
	}

	update_response_info(param, HTTP_APPLICATION_ERROR);

	req = json_parse(param->json_data);
	if (req == NULL) {
		HTTPD_ERR("json parse error\n");
		return NULL;
	}

	update_response_info(param, HTTP_ACCEPTED);

	mask = 1 << ((tzone_idx - 1) * MAX_PWM_NUM + (fan_idx - 1));

	return process_listener(req, &listener, mask, MC_REDFISH_FAN_COLL);
}
Example #5
0
static json_t *rf_listener_del(struct rest_uri_param *param)
{
	int8 *p_id = NULL;
	int32 listener_id = 0;
	int8 buff[8] = {0};
	result_t rs = RESULT_OK;
	evt_listener_t listener = {};

	p_id = rest_path_value(param, "listener_id");
	if (p_id == NULL) {
		update_response_info(param, HTTP_BAD_REQUEST);
		HTTPD_ERR("get value fail\n");
		return NULL;
	}
	listener_id  = (int32)str2int(p_id);

	if (libwrap_del_evt_listener(RF_EVENT_MASK_ALL, listener_id) != RESULT_OK) {
		update_response_info(param, HTTP_INTERNAL_SERVER_ERROR);
		HTTPD_ERR("mbp listener info del fail\n");
		return NULL;
	}

	update_response_info(param, HTTP_NO_CONTENT);
	return NULL;
}
static json_t *fan_handle_change_state(json_t *req, int32 tzone_idx, int32 fan_idx, struct rest_uri_param *param)
{
	int64 enabled_state = 0;
	result_t rs = RESULT_OK;

	enabled_state = json_integer_value(json_object_get(req, RMM_JSON_ENABLE_STATE));

	if (!((enabled_state == FAN_STATE_ENABLED) || (enabled_state == FAN_STATE_DISABLED))) {
		HTTPD_ERR("unknown fan state\n");
		update_response_info(param, HTTP_APPLICATION_ERROR);
		json_free(req);
		return NULL;
	}

	rs = libwrap_post_fan_change_state(tzone_idx, fan_idx, enabled_state);
	if (rs != RESULT_OK) {
		HTTPD_ERR("fan state post fail, result is %d\n", rs);
		update_response_info(param, HTTP_APPLICATION_ERROR);
	} else {
		update_response_info(param, HTTP_ACCEPTED);
	}
	json_free(req);

	int8 buff[128] = {};
	snprintf(buff, sizeof(buff), "%d", (tzone_idx - 1) * MAX_PWM_NUM + fan_idx);
	rf_snmp_evt(INFO, MSGFanChange, buff, "enable state change");

	return NULL;
}
static json_t *tzone_coll_get(struct rest_uri_param *param)
{
	collections_t *tzone_collections = NULL;
	uint32 tzone_num = 0;
	result_t rs = RESULT_OK;
	json_t *result = NULL;
	json_t *tzone = NULL;
	json_t *array = NULL;
	int32 i;
	int32 zone_num = 0;

	zone_num = libwrap_get_asset_num(MC_TYPE_TZONE);
	if (zone_num == 0) {
		HTTPD_ERR("get thermal zone num fail\n");
		return NULL;
	}

	tzone_collections = (collections_t *)malloc(zone_num * sizeof(collections_t));
	if (tzone_collections == NULL)
		return NULL;

	memset(tzone_collections, 0, zone_num * sizeof(collections_t));

	rs = libwrap_get_tzone_coll(tzone_collections, &tzone_num);
	if (rs != RESULT_OK) {
		HTTPD_ERR("get cooling zone collection fail, result is %d\n", rs);
		return NULL;
	}

	result = json_object();
	if (result == NULL) {
		HTTPD_ERR("result json object request error\n");
		return NULL;
	}

	array = json_array();
	if (array == NULL) {
		HTTPD_ERR("json array request error\n");
		return NULL;
	}

	for (i = 0; i < tzone_num; i++) {
		tzone = NULL;
		tzone = json_object();
		if (tzone != NULL) {
			add_json_integer(tzone, RMM_JSON_ID, tzone_collections[i].id);
			add_json_string(tzone, RMM_JSON_UUID, tzone_collections[i].uuid);
			add_json_string(tzone, RMM_JSON_NAME, tzone_collections[i].name);
			update_href_host(tzone_collections[i].href, HREF_URL_LEN, param->host);
			add_json_string(tzone, RMM_JSON_HREF, tzone_collections[i].href);
			json_array_add(array, tzone);
		}
	}
	json_object_add(result, RMM_JSON_THERMAL_ZONES, array);

	if (tzone_collections)
		free(tzone_collections);

	return result;
}
Example #8
0
int32 subscribe_event(listener_dest_t *listener, int8 *evt_str)
{
	memdb_integer evt_nid = 0;
	memdb_integer listener_nid = 0;
	int32 mask = 0;
	int32 rc = 0;
	int32 type = get_rf_evt_type(evt_str);
	int32 root_type = get_root_evt_type(type);

	listener_nid = libwrap_get_listener(listener->dest, &evt_nid, type);
	if (listener_nid == -1) {
		HTTPD_ERR("get redfish event listener error, type is %d\n", type);
		return -1;
	}

	if (libwrap_evt_subscribe(listener, listener_nid, evt_nid) != 0)
		return rc;

	/* subscribe resource root */
	listener_nid = libwrap_get_listener(listener->dest, &evt_nid, root_type);
	if (listener_nid == -1) {
		HTTPD_ERR("get redfish event listener error, type is %d\n", type);
		return -1;
	}

	if (libwrap_evt_subscribe(listener, listener_nid, evt_nid) != 0)
		return rc;

	return 0;
}
Example #9
0
static int32 is_event_types_valid(int32 array_size, json_t *event_types)
{
	json_t *elem = NULL;
	int32 i = 0;
	int8 *event_type = NULL;

	for (i = 0; i < array_size; i++) {
		elem = NULL;
		elem = json_array_get(event_types, i);
		if (elem == NULL) {
			HTTPD_ERR("get json array element error\n");
			return -1;
		}

		event_type = json_string_value(elem);
		if (event_type == NULL) {
			HTTPD_ERR("get json string value error\n");
			return -1;
		}

		if (get_rf_evt_type(event_type) == -1) {
			HTTPD_ERR("Invalid event type:%s\n", event_type);
			return -1;
		}
	}

	return 0;
}
Example #10
0
static json_t *rf_evt_get(struct rest_uri_param *param)
{
	rf_evt_svc_t service = {};
	json_t *result = NULL;
	int32 rf_evt_support[MAX_EVT_ACTION_NUM] = {};

	result = json_object();
	if (result == NULL) {
		update_response_info(param, HTTP_INTERNAL_SERVER_ERROR);
		HTTPD_ERR("result json object request error\n");
		return NULL;
	}

	if (rf_evt_info_init(&service, rf_evt_support, RF_EVENT_ROOT_FMT)!= 0) {
		update_response_info(param, HTTP_RESOURCE_NOT_FOUND);
		HTTPD_ERR("get redfish evt info error\n");
		return NULL;
	}

	if (rf_evt_pack_json(result, rf_evt_support, &service) != 0) {
		update_response_info(param, HTTP_INTERNAL_SERVER_ERROR);
		HTTPD_ERR("pack redfish evt info error\n");
		return NULL;
	}

	update_response_info(param, HTTP_OK);
	return result;
}
static json_t *mbp_evt_post(struct rest_uri_param *param)
{
	json_t *req = NULL;
	int32 mask = 0;
	listener_dest_t listener;
	int32 idx;

	idx = get_asset_idx(param, "mbp_id", MC_TYPE_CM);
	if (idx == -1) {
		HTTPD_ERR("get mbp index fail\n");
		return NULL;
	}

	update_response_info(param, HTTP_APPLICATION_ERROR);

	req = json_parse(param->json_data);
	if (req == NULL) {
		HTTPD_ERR("json parse error\n");
		return NULL;
	}

	update_response_info(param, HTTP_ACCEPTED);

	mask = 1 << (idx - 1);

	return process_listener(req, &listener, mask, MC_REDFISH_MBP_COLL);
}
static json_t *fan_coll_evt_post(struct rest_uri_param *param)
{
	json_t *req = NULL;
	int32 reg = 0;
	listener_dest_t listener;
	int32 tzone_idx;

	tzone_idx = get_asset_idx(param, "zone_id", MC_TYPE_TZONE);
	if (tzone_idx == -1) {
		HTTPD_ERR("get cooling zone index fail\n");
		return NULL;
	}

	update_response_info(param, HTTP_APPLICATION_ERROR);

	req = json_parse(param->json_data);
	if (req == NULL) {
		HTTPD_ERR("json parse error\n");
		return NULL;
	}

	update_response_info(param, HTTP_ACCEPTED);

	reg |= RF_EVENT_MASK_ALL;

	return process_listener(req, &listener, reg, MC_REDFISH_FAN_COLL);
}
static json_t *mbp_evt_get(struct rest_uri_param *param)
{
	rf_evt_svc_t service = { { {0} } };
	json_t *result = NULL;
	int32 idx, reg = 0;

	get_rf_base_info(&(service.base));

	result = json_object();
	if (result == NULL) {
		HTTPD_ERR("result json object request error\n");
		return NULL;
	}

	idx = get_asset_idx(param, "mbp_id", MC_TYPE_CM);
	if (idx == -1) {
		HTTPD_ERR("get mbp index fail\n");
		return NULL;
	}

	pack_rf_base_json(result, &(service.base));
	reg = 1 << (idx - 1);
	get_evt_links(&(service.links), MC_REDFISH_MBP_COLL, reg, RF_EVENT_MBP_FMT, idx);
	pack_rf_evt_links(result, &(service.links));

	return result;
}
Example #14
0
int32 evt_listeners_pack_json(json_t *result, evt_listeners_t *listeners)
{
	json_t *listener_array = NULL;
	json_t * listener = NULL;
	int32 i = 0;

	json_object_add(result, RMM_JSON_ODATA_CONTEXT, json_string(listeners->odata_context));
	json_object_add(result, RMM_JSON_ODATA_TYPE, json_string(listeners->odata_type));
	json_object_add(result, RMM_JSON_NAME, json_string(listeners->name));
	json_object_add(result, RMM_JSON_MEMBERS_ODATA_COUNT, json_integer(listeners->num));

	listener_array = json_array();
	if (listener_array == NULL) {
		HTTPD_ERR("json array request fail\n");
		return -1;
	}

	for (i = 0; i < listeners->num; i++) {
		listener = json_object();
		if (listener == NULL) {
			HTTPD_ERR("json object request fail\n");
			return -1;
		}
		json_object_add(listener, RMM_JSON_ODATA_ID, json_string(listeners->url[i]));
		json_array_add(listener_array, listener);
	}

	json_object_add(result, RMM_JSON_MEMBERS, listener_array);

	return 0;
}
Example #15
0
static json_t *rf_listeners_get(struct rest_uri_param *param)
{
	evt_listeners_t listeners = {};
	json_t *result = NULL;

	result = json_object();
	if (result == NULL) {
		update_response_info(param, HTTP_INTERNAL_SERVER_ERROR);
		HTTPD_ERR("json object request fail\n");
		return NULL;
	}

	if (evt_listeners_init(&listeners, RF_EVENT_MASK_ALL, RF_EVENT_ROOT_FMT) != 0){
		update_response_info(param, HTTP_RESOURCE_NOT_FOUND);
		HTTPD_ERR("mbp coll listeners info init fail\n");
		return NULL;
	}

	if (evt_listeners_pack_json(result, &listeners) != 0) {
		update_response_info(param, HTTP_INTERNAL_SERVER_ERROR);
		HTTPD_ERR("mbp coll listeners pack json fail\n");
		return NULL;
	}

	update_response_info(param, HTTP_OK);
	return result;
}
Example #16
0
int32 process_listener(json_t *req, listener_dest_t *listener, int32 mask)
{
	int8 *event_type = NULL;
	int8 *dest = NULL;
	int8 *context = NULL;
	int8 *protocol = NULL;
	int8 *name = NULL;
	int8 *description = NULL;
	json_t *elem = NULL;
	json_t *event_types = NULL;
	int32 array_size, i = 0;
	int32 rc = 0;

	context = json_string_value(json_object_get(req, RMM_JSON_CONTEXT));
	dest = json_string_value(json_object_get(req, RMM_JSON_DEST));
	protocol = json_string_value(json_object_get(req, RMM_JSON_PROTOCOL));
	event_types = json_object_get(req, RMM_JSON_RF_EVT_TYPES);
	name = json_string_value(json_object_get(req, RMM_JSON_RF_NAME));
	description = json_string_value(json_object_get(req, RMM_JSON_RF_DESC));

	if (!(context && dest && protocol && event_types)) {
		HTTPD_ERR("get json string error\n");
		return -1;
	}

	snprintf_s_s(listener->name, sizeof(listener->name), "%s", name);
	snprintf_s_s(listener->description, sizeof(listener->description), "%s", description);
	snprintf_s_s(listener->context, sizeof(listener->context), "%s", context);
	snprintf_s_s(listener->dest, sizeof(listener->dest), "%s", dest);
	snprintf_s_s(listener->protocol, sizeof(listener->protocol), "%s", protocol);
	listener->idx_mask = mask;

	array_size = json_array_size(event_types);

	if (is_event_types_valid(array_size, event_types) == -1)
		return -1;

	for (i = 0; i < array_size; i++) {
		elem = NULL;
		elem = json_array_get(event_types, i);
		if (elem == NULL) {
			HTTPD_ERR("get json array element error\n");
			return -1;
		}

		event_type = json_string_value(elem);
		if(event_type == NULL) {
			HTTPD_ERR("get json string  event error\n");
			return -1;
		}

		if (subscribe_event(listener, event_type) != 0)
			return -1;
	}

	return 0;
}
Example #17
0
int32 evt_listener_init(evt_listener_t *listener, int32 mask, int32 listener_idx, const int8 *fmt, ...)
{
	listener_t *header = NULL;
	int8 format[256] = {0};
	listener_t *tmp;
	int8 prefix[PREFIX_LEN] = {0};
	json_t *evt_type_item = NULL;
	int32 rs = 0;
	int32 count = 0;
	va_list args;

	rs = libwrap_get_evt_listeners_count(mask, &count);
	if (rs != 0 || listener_idx > count) {
		HTTPD_ERR("invalid listener index \n");
		return -1;
	}

	snprintf_s_s(listener->copy_right, sizeof(listener->copy_right), "%s", RF_COPY_RIGHT);

	rs = rmm_cfg_get_rest_prefix(prefix, PREFIX_LEN);
	if (rs != 0) {
		HTTPD_ERR("get rest prefix fail\n");
		return -1;
	}

	snprintf_s_ssss(format, sizeof(format), "%s%s%s%s", prefix, (char *)fmt, RF_EVENT_ODATA_CONTEXT_STR, RF_EVENT_LISTENER_MEMBER_STR);
	va_start(args, fmt);
	vsnprintf(listener->odata_context, CONTEXT_LEN, format, args);
	va_end(args);

	evt_type_item = json_array();
	if (evt_type_item == NULL) {
		HTTPD_ERR("json array alloc fail\n");
		return -1;
	}

	snprintf_s_ssssi(listener->odata_id, sizeof(listener->odata_id), "%s%s%s%s/%d", prefix
																		, (char *)fmt
																		, RF_EVENT_SERVICE_STR
																		, RF_EVENT_SUBSCRIBE_STR
																		, listener_idx);

	snprintf_s_s(listener->odata_type, sizeof(listener->odata_type), "%s", RF_EVENT_ODATA_TYPE_DEST);
	snprintf_s_i(listener->id, sizeof(listener->id), "%d", listener_idx);

	rs = libwrap_get_evt_listener(mask, listener, listener_idx);
	if (rs != 0) {
		HTTPD_ERR("get listeners fail\n");
		return -1;
	}

//	snprintf(listener->context, sizeof(listener->context), "%s", RF_EVENT_CONTEXT_STR);
//	snprintf(listener->protocol, sizeof(listener->protocol), "%s", RF_EVENT_PROTOCOL_STR);

	return 0;
}
Example #18
0
static json_t *rf_listeners_post(struct rest_uri_param *param)
{
	json_t *req = NULL;
	json_t *obj = NULL;
	int32 mask = 0;
	listener_dest_t listener;
	int32 listener_idx = 0;
	uint32 ary_size = sizeof(sub_listener_attrs)/sizeof(input_attr_t);

	req = json_parse(param->json_data);
	if (req == NULL) {
		update_response_info(param, HTTP_BAD_REQUEST);
		HTTPD_ERR("json parse error\n");
		return NULL;
	}

	if (libwrap_check_input_attrs(sub_listener_attrs, ary_size, req, NULL) != RESULT_OK) {
		update_response_info(param, HTTP_BAD_REQUEST);
		goto out;
	}

	obj = libwrap_get_attr_json(sub_listener_attrs, ary_size, "Protocol");
	if (obj) {
		int8 *input = NULL;
		input = json_string_value(obj);
		if (input && check_str_len(input, REST_EVENT_PROTOCOL)) {
			if (strncmp("Redfish", input, strnlen_s("Redfish", RSIZE_MAX_STR)) !=0 ) {
				update_response_info(param, HTTP_BAD_REQUEST);
				goto out;
			}
		} else {
			update_response_info(param, HTTP_BAD_REQUEST);
			goto out;
		}
	}

	mask |= RF_EVENT_MASK_ALL;

	if (process_listener(req, &listener, mask) != 0) {
		update_response_info(param, HTTP_BAD_REQUEST);
		HTTPD_ERR("process listener error\n");
		goto out;
	}

	listener_idx = libwrap_get_evt_listener_idx(mask, listener.dest);
	snprintf_s_si(param->rsp, HREF_URL_LEN, "http://%s/redfish/v1/EventService/Subscriptions/%d", param->host, listener_idx);
	update_response_info(param, HTTP_CREATED);

out:
	if (req)
		json_free(req);
	return NULL;
}
json_t *process_listener(json_t *req, listener_dest_t *listener, int32 mask, int32 node_type)
{
	int8 *action = NULL;
	int8 *event_type = NULL;
	int8 *dest = NULL;
	int8 *type = NULL;
	int8 *protocol = NULL;
	json_t *elem = NULL;
	json_t *event_types = NULL;
	json_t *obj = NULL;
	int32 array_size, i = 0;

	action = json_string_value(json_object_get(req, RMM_JSON_ACTION));
	type = json_string_value(json_object_get(req, RMM_JSON_TYPE));
	dest = json_string_value(json_object_get(req, RMM_JSON_DEST));
	protocol = json_string_value(json_object_get(req, RMM_JSON_PROTOCOL));
	event_types = json_object_get(req, RMM_JSON_RF_EVT_TYPES);


	if (!(action && type && dest && protocol && event_types)) {
		HTTPD_ERR("get json string error\n");
		return NULL;
	}

	snprintf(listener->type, sizeof(listener->type), "%s", type);
	snprintf(listener->dest, sizeof(listener->dest), "%s", dest);
	snprintf(listener->protocol, sizeof(listener->protocol), "%s", protocol);
	listener->idx_mask = mask;

	array_size = json_array_size(event_types);
	for (i = 0; i < array_size; i++) {
		elem = NULL;
		elem = json_array_get(event_types, i);
		if (elem == NULL) {
			HTTPD_ERR("get json array element error\n");
			return NULL;
		}

		if ((obj = json_object_get(elem, RMM_JSON_RF_EVT)) != NULL) {
			event_type = json_string_value(obj);
			if(event_type == NULL) {
				HTTPD_ERR("get json string  event error\n");
				return NULL;
			}
			if (0 == strcmp(action, "subscribe"))
				subscribe_event(listener, event_type, node_type);
			else if (0 == strcmp(action, "unsubscribe"))
				unsubscribe_event(listener, event_type, node_type);
		}
	}

	return NULL;
}
Example #20
0
static int32 open_listen_socket(uint16 port)
{
	int32 fd;
	int32 val;
	int32 bind_try = 0;
	struct sockaddr_in addr;
	struct linger linger_opt = { 1, 1 };	/* Linger active, timeout 1s. */

	fd = socket(AF_INET, SOCK_STREAM, 0);
	if (fd < 0) {
		HTTPD_ERR("Fail to open socket: %s\n", strerror(errno));
		return -1;
	}

	fcntl(fd, F_SETFD, FD_CLOEXEC);

	val = 1;
	if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (void *)&val, sizeof(val)) < 0) {
		HTTPD_ERR("Fail to setsockopt SO_REUSEADDR: %s\n", strerror(errno));
		goto fail;
	}

	memset(&addr, 0, sizeof(addr));
	addr.sin_family = AF_INET;
	addr.sin_port = htons(port);
	addr.sin_addr.s_addr = htonl(INADDR_ANY);

	for (;;) {
		if (bind(fd, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
			bind_try++;
			if (bind_try >= 10) {
				HTTPD_ERR("Fail to bind: %s\n", strerror(errno));
				goto fail;
			} else
				sleep(1);
		} else
			break;
	}
	setsockopt(fd, SOL_SOCKET, SO_LINGER, &linger_opt, sizeof(linger_opt));

	if (listen(fd, 1) < 0) {
		HTTPD_ERR("Fail at socket listen: %s\n", strerror(errno));
		goto fail;
	}

	return fd;

fail:
	close(fd);
	return -1;
}
void get_evt_links(rf_link_t *links, int32 type, int32 reg, const int8 *fmt, ...)
{
	va_list args;
	int32 port;
	int8 ip_addr[WRAP_DB_MAX_VALUE_LEN] = {0};
	memdb_integer nid = 0;
	int32 mask, zone_reg = 0;
	int8 fmt_hdr[256] = {0};
	int8 format[2048] = {0};
	int8 prefix[MAX_URL] = {0};

	rmm_cfg_get_rest_prefix(prefix, MAX_URL);

	if (libutils_get_ip((int8 *)ip_addr) < 0) {
		memset(ip_addr, 0, WRAP_DB_MAX_VALUE_LEN);
		strncpy_safe(ip_addr, "x", sizeof(ip_addr), 1);
	}

	port = rmm_cfg_get_port(RESTD_PORT);
	if (port == 0) {
		HTTPD_ERR("Failed to call rmm_cfg_get_restd_port\n");
		exit(-1);
	}

	snprintf(fmt_hdr, sizeof(fmt_hdr), RF_EVENT_URL_FMT_HDR, ip_addr, port);
	snprintf(format, sizeof(format), "%s%s%s", fmt_hdr, fmt, prefix);

	va_start(args, fmt);
	vsprintf(links->self, format, args);
	va_end(args);

	nid = libwrap_get_uniq_node_by_type(type);

	libwrap_get_listener_links(reg, nid, links);
}
json_t *get_json_listener(listener_dest_info_t *header)
{
	json_t *result = NULL;
	json_t *jitem = NULL;
	json_t *evt_type_item = NULL;
	int32 i = 0;
	int8 evt_type[128];
	listener_dest_info_t *tmp;

	result = json_array();
	if (result == NULL) {
		HTTPD_ERR("result json object request fail\n");
		return NULL;
	}

	while (header) {
		jitem = json_object();
		json_object_add(jitem, RMM_JSON_RF_LINKS, json_string(header->dest));

		evt_type_item = json_array();
		for (i = 0; i < header->evt_index; i++) {
			memset(evt_type, 0, 128);
			get_event_type_by_nodeid(header->event_types[i], evt_type, sizeof(evt_type));
			json_array_add(evt_type_item, json_string(evt_type));
		}

		json_object_add(jitem, RMM_JSON_RF_EVT_TYPES, evt_type_item);
		json_array_add(result, jitem);
		tmp = header->pnext;
		free(header);
		header = tmp;
	}

	return result;
}
void pack_rf_evt_links(json_t *result, rf_link_t *link)
{
	int32 i = 0;
	json_t *array = NULL;
	json_t *listener = NULL;

	array = json_array();
	if (array == NULL) {
		HTTPD_ERR("json array request fail\n");
		return;
	}

	for (i = 0; i < RF_EVENT_MAX_LISTENER_NUM; i++) {
		listener = NULL;
		listener = json_object();
		if (listener != NULL) {
			if (strlen(link->subscription[i]) != 0) {
				add_json_string(listener, RMM_JSON_RF_LISTENER, (uint8 *)(link->subscription[i]));
				json_array_add(array, listener);
			}
		}
	}
	json_object_add(result, RMM_JSON_RF_SUBSCRIPTION, array);

	add_json_string(result, RMM_JSON_RF_SELF, (uint8 *)link->self);
}
Example #24
0
int32 evt_listeners_init(evt_listeners_t *listeners, int32 mask, const int8 * fmt, ...)
{
	json_t *result = NULL;
	json_t *jitem = NULL;
	json_t *evt_type_item = NULL;
	int32 i = 0;
	int8 evt_type[128];
	listener_t *tmp;
	int8 format[256] = {0};
	int8 prefix[PREFIX_LEN] = {0};
	int8 buff[256] = {0};
	int32 count = 0;
	int32 rs = 0;
	va_list args;

	snprintf_s_s(listeners->copy_right, sizeof(listeners->copy_right), "%s", RF_COPY_RIGHT);

	rs = rmm_cfg_get_rest_prefix(prefix, PREFIX_LEN);
	if (rs != 0) {
		HTTPD_ERR("get rest prefix fail\n");
		return -1;
	}

	snprintf_s_ssss(format, sizeof(format), "%s%s%s%s", prefix, (char *)fmt, RF_EVENT_ODATA_CONTEXT_STR, RF_EVENT_EVT_MEMBER_STR);
	va_start(args, fmt);
	vsnprintf(listeners->odata_context, CONTEXT_LEN, format, args);
	va_end(args);

	snprintf_s_s(listeners->odata_type, sizeof(listeners->odata_type), "%s", RF_EVENT_ODATA_TYPE_DEST_COLL);
	snprintf_s_s(listeners->name, sizeof(listeners->name), "%s", RF_EVENT_LISTENERS_NAME);

	rs = libwrap_get_evt_listeners_count(mask, &count);
	if (rs != 0) {
		HTTPD_ERR("get listener count fail\n");
		return -1;
	}
	listeners->num = count;

	for (i = 0; i < count; i++) {
		snprintf_s_ssssi(listeners->url[i], sizeof(listeners->url[i]), "%s%s%s%s/%d", prefix, (char *)fmt, RF_EVENT_SERVICE_STR, RF_EVENT_SUBSCRIBE_STR, (i + 1));
	}

	return 0;
}
static json_t *fan_handle_set_speed(json_t *req, int32 tzone_idx, int32 fan_idx, struct rest_uri_param *param)
{
	int8 *unit_type = NULL;
	int8 *speed = NULL;
	uint32 u_type = 0;
	result_t rs = RESULT_OK;

	unit_type = json_string_value(json_object_get(req, RMM_JSON_UNIT_TYPE));
	if (unit_type == NULL) {
		HTTPD_ERR("failed to get json <unitType>.\n");
		goto err;
	}

	if (0 == strcmp(unit_type, RMM_JSON_RPM))
		u_type = 0;
	else if ((0 == strcmp(unit_type, RMM_JSON_PWM)))
		u_type = 1;
	else {
		HTTPD_ERR("json string <unitType> is not right.\n");
		goto err;
	}

	speed = json_string_value(json_object_get(req, RMM_JSON_DESIRED_SPEED));
	if (speed == NULL) {
		HTTPD_ERR("failed to get json string <desiredSpeed>.\n");
		goto err;
	}

	rs = libwrap_post_fan_set_speed(tzone_idx, fan_idx, u_type, speed);
	if (rs != RESULT_OK) {
		HTTPD_ERR("fan speed post fail, result is %d\n", rs);
		update_response_info(param, HTTP_APPLICATION_ERROR);
	} else {
		update_response_info(param, HTTP_ACCEPTED);
	}
	int8 buff[128] = {};
	snprintf(buff, sizeof(buff), "%d", (tzone_idx - 1) * MAX_PWM_NUM + fan_idx);
	rf_snmp_evt(INFO, MSGFanChange, buff, "speed change");

err:
	json_free(req);
	return NULL;
}
int32 prepare_get_action(const avail_action_t *av_action, json_t *action, int32 index)
{
	if (action == NULL) {
		HTTPD_ERR("action json array request fail\n");
		return -1;
	}
	if (0 != strcmp((int8 *)(av_action[index].action), ""))
		add_json_string(action, RMM_JSON_ACTION, av_action[index].action);

	return 0;
}
static json_t *mbp_post(struct rest_uri_param *param)
{
	json_t *req;
	int8 *action = NULL;
	int32 cm_lid;

	cm_lid = get_asset_idx(param, "mbp_id", MC_TYPE_CM);
	if (cm_lid == -1) {
		HTTPD_ERR("get cm loc lid fail\n");
		return NULL;
	}

	update_response_info(param, HTTP_APPLICATION_ERROR);

	req = json_parse_with_len(param->json_data, (int32)(param->content_length));
	if (req == NULL) {
		HTTPD_ERR("json parse error\n");
		return NULL;
	}

	action = json_string_value(json_object_get(req, RMM_JSON_ACTION));
	if (action == NULL) {
		HTTPD_ERR("get action error\n");
		json_free(req);
		return NULL;
	}

	if (0 == strcmp(action, RMM_JSON_UPDATE)) {
		HTTPD_INFO("processing mbp reset\n");
		return mbp_process_update(req, cm_lid, param);
	} else if (0 == strcmp(action, RMM_JSON_RESET)) {
		HTTPD_INFO("processing mbp reset\n");
		return mbp_process_reset(req, cm_lid, param);
	} else if (0 == strcmp(action, RMM_JSON_SETUARTTARGET)) {
		HTTPD_INFO("processing mbp set uart target\n");
		return mbp_set_uart_target(req, cm_lid, param);
	}

	json_free(req);
	return NULL;
}
static json_t *tzone_put(struct rest_uri_param *param)
{
	json_t *req = NULL;
	result_t rs = RESULT_OK;
	put_tzone_t put_tzone_info = { {0} };
	int8 *description = NULL;
	json_t *rs_json = NULL;
	int32 tzone_idx = 0;

	tzone_idx = get_asset_idx(param, "zone_id", MC_TYPE_TZONE);
	if (tzone_idx == -1) {
		HTTPD_ERR("get cooling zone index fail\n");
		return NULL;
	}

	rs = libwrap_pre_put_tzone_by_idx(tzone_idx, &put_tzone_info);
	if (rs != RESULT_OK) {
		HTTPD_ERR("cooling zone pre put fail, result is %d\n", rs);
		return NULL;
	}

	req = json_parse(param->json_data);
	if (req == NULL) {
		HTTPD_ERR("json parse error\n");
		return NULL;
	}

	put_prepare_str(req, put_tzone_info.descr, DESCRIPTION_LEN, RMM_JSON_DESC);

	rs = libwrap_put_tzone_by_idx(tzone_idx, put_tzone_info);
	if (rs != RESULT_OK) {
		HTTPD_ERR("cooling zone put error, result is %d\n", rs);
		return NULL;
	}

	json_free(req);
	int8 buff[128] = {};
	snprintf(buff, sizeof(buff), "%d", tzone_idx);
	rf_log(INFO, MSGTZoneUpdate, buff);
	return tzone_get(param);
}
int32 get_asset_idx(const struct rest_uri_param *param, const int8 *name, int32 type)
{
	int8 *p_id = NULL;
	int32 index;

	p_id = rest_path_value(param, name);
	if (p_id == NULL) {
		HTTPD_ERR("get value fail\n");
		return -1;
	}

	if (TRUE == is_str_uuid((const int8 *)p_id)) {
		if (FALSE == get_index_by_uuid((const int8 *)p_id, type, &index)) {
			HTTPD_ERR("uuid %s error!\n", p_id);
			return -1;
		}
	} else
		index = (uint32)str2int(p_id);

	return index;
}
void get_event_type_by_nodeid(int32 nodeid, int8 *data, int32 data_len)
{
	int32 i  = 0;

	for (i = 0; i < sizeof(nodeid_keys) / sizeof(id_evt_type_t); i++) {
		if (nodeid_keys[i].node_id == nodeid) {
			strncpy_safe(data, nodeid_keys[i].type_name, data_len, data_len - 1);
			return;
		}
	}
	HTTPD_ERR("nodeid input error: %d\n", nodeid);
}