/** * @brief Generate redfish event map cache when redfishd initialize. * */ static int32 gen_node_msg_id_map(p_rf_node_msg_id_map evt_types) { int32 i = 0, j = 0; int32 nodenum = 0; int32 index = 0; int32 evt_source_num = 0; struct node_info *evt_source_nodeinfo = NULL, *rf_node = NULL; int32 action_num = 0; struct node_info *action_node_info; /*Get redfish event nid*/ rf_node = libdb_list_node_by_type(DB_RMM, MC_REDFISH_EVENT, MC_REDFISH_EVENT, &nodenum, NULL, LOCK_ID_NULL); if (nodenum == 0) return 0; evt_source_nodeinfo = libdb_list_subnode(DB_RMM, rf_node[0].node_id, &evt_source_num, NULL, LOCK_ID_NULL); if (evt_source_num == 0) return 0; /*traverse all of event sources*/ for (i = 0; i < evt_source_num; i++) { action_node_info = libdb_list_subnode(DB_RMM, evt_source_nodeinfo[i].node_id, &action_num, NULL, LOCK_ID_NULL); for (j = 0; j < action_num; j++) { /*Load event type information.*/ evt_types[index].node_id = action_node_info[j].node_id; libdb_attr_get_string(DB_RMM, action_node_info[j].node_id, MSG_ID_KEY, evt_types[index].msg_id_str, MSG_ID_STR_LEN, LOCK_ID_NULL); index += 1; } } /*The index is total of event types count.*/ return index; }
result_t libwrap_get_listener_links(int reg, memdb_integer nid, rf_link_t *links) { int mask = 0; int subnode_num, i, j, index = 0; memdb_integer listener_nid = 0; char listener[256] = {0}; struct node_info *subnode = NULL; subnode = libdb_list_subnode(DB_RMM, nid, &subnode_num, NULL, LOCK_ID_NULL); for (i = 0; i < subnode_num; i++) { listener_nid = libwrap_get_subnode_id_by_type(subnode[i].node_id, MC_REDFISH_LISTENER); if (listener_nid == 0) continue; libdb_attr_get_int(DB_RMM, listener_nid, RF_EVENT_LISTENER_INDEXES_STR, &mask, LOCK_ID_NULL); if ((mask & reg) != 0) { libdb_attr_get_string(DB_RMM, listener_nid, RF_EVENT_LISTENER_DEST_STR, listener, 256, LOCK_ID_NULL); for (j = 0; j < index; j++) { if (strcmp(listener, links->listeners[j]) == 0) break; } if (j == index) { snprintf_s_s(links->listeners[index], sizeof(links->listeners[index]), "%s", listener); index++; } } } return RESULT_OK; }
static result_t get_listeners(int32 mask, listener_t** header) { struct node_info *subnode = NULL; int32 subnode_num = 0; struct node_info *listener_subnode = NULL; struct node_info *listener_sub_node = NULL; int32 listener_subnode_num = 0; int32 i,j = 0; memdb_integer error_code = 0; int32 subscribe_mask = 0; int8 tmp_url[MAX_URL] = {0}; listener_dest_t listener = {}; int32 listener_count = 0; struct node_info *evt_type_nodes = NULL; result_t rc = RESULT_OK; /* get event root node */ subnode = libdb_list_node_by_type(DB_RMM, MC_REDFISH_EVENT, MC_REDFISH_EVENT, &subnode_num, NULL, LOCK_ID_NULL); if (subnode_num != 1) { rc = RESULT_NO_NODE; goto end; } /* get supported event type nodes */ subnode = libdb_list_subnode(DB_RMM, subnode[0].node_id, &subnode_num, NULL, LOCK_ID_NULL); if (subnode_num == 0) { rc = RESULT_NO_NODE; goto end; } evt_type_nodes = (struct node_info *)malloc(CMDBUFSIZ); if (evt_type_nodes == NULL) { rc = RESULT_MALLOC_ERR; goto end; } memcpy_s(evt_type_nodes, sizeof(struct node_info) * subnode_num, subnode, sizeof(struct node_info) * subnode_num); listener_sub_node = (struct node_info *)malloc(CMDBUFSIZ); if (listener_sub_node == NULL) { rc = RESULT_MALLOC_ERR; goto end; } for (i = 0; i < subnode_num; i++) { /* get listeners of each event type */ listener_subnode = libdb_list_subnode_by_type(DB_RMM, evt_type_nodes[i].node_id, MC_REDFISH_LISTENER, &listener_subnode_num, NULL, LOCK_ID_NULL); if (listener_subnode == NULL) goto end; bzero(listener_sub_node, CMDBUFSIZ); memcpy_s(listener_sub_node, sizeof(struct node_info) * listener_subnode_num, listener_subnode, sizeof(struct node_info) * listener_subnode_num); for (j = 0; j < listener_subnode_num; j++) { error_code = 0; /* get listener's mask */ error_code = libdb_attr_get_int(DB_RMM, listener_sub_node[j].node_id, RF_EVENT_LISTENER_INDEXES_STR, &subscribe_mask, LOCK_ID_NULL); if (error_code != 0) continue; if ((subscribe_mask & mask) != 0) { error_code = 0; error_code = libdb_attr_get_string(DB_RMM, listener_sub_node[j].node_id, RF_EVENT_LISTENER_DEST_STR, tmp_url, sizeof(tmp_url), LOCK_ID_NULL); if (error_code == 0) { if (libdb_attr_get_string(DB_RMM, listener_sub_node[j].node_id, RF_EVENT_LISTENER_CONTEXT_STR, listener.context, sizeof(listener.context), LOCK_ID_NULL) != 0) continue; if (libdb_attr_get_string(DB_RMM, listener_sub_node[j].node_id, RF_EVENT_LISTENER_PROTOCOL_STR, listener.protocol, sizeof(listener.protocol), LOCK_ID_NULL) != 0) continue; if (libdb_attr_get_string(DB_RMM, listener_sub_node[j].node_id, RF_EVENT_LISTENER_NAME_STR, listener.name, sizeof(listener.name), LOCK_ID_NULL) != 0) continue; if (libdb_attr_get_string(DB_RMM, listener_sub_node[j].node_id, RF_EVENT_LISTENER_DESC_STR, listener.description, sizeof(listener.description), LOCK_ID_NULL) != 0) continue; /* add matched listener into list */ add_listener(header, tmp_url, &listener, evt_type_nodes[i].type); } } } } end: libdb_free_node(listener_sub_node); libdb_free_node(evt_type_nodes); return rc; }
static result_t del_listener(int8 *url) { struct node_info *subnode = NULL; struct node_info *listener_subnode = NULL; struct node_info *listener_sub_node = NULL; int32 subnode_num = 0; int32 listener_subnode_num = 0; int32 i,j = 0; memdb_integer error_code = 0; int8 tmp_url[MAX_URL] = {0}; int32 listener_count = 0; struct node_info *evt_type_nodes = NULL; result_t rc = RESULT_OK; /* get event root node */ subnode = libdb_list_node_by_type(DB_RMM, MC_REDFISH_EVENT, MC_REDFISH_EVENT, &subnode_num, NULL, LOCK_ID_NULL); if (subnode_num != 1) { rc = RESULT_NO_NODE; goto end; } /* get supported event type nodes */ subnode = libdb_list_subnode(DB_RMM, subnode[0].node_id, &subnode_num, NULL, LOCK_ID_NULL); if (subnode_num == 0) { rc = RESULT_NO_NODE; goto end; } evt_type_nodes = (struct node_info *)malloc(CMDBUFSIZ); if (evt_type_nodes == NULL) { rc = RESULT_MALLOC_ERR; goto end; } memcpy_s(evt_type_nodes, sizeof(struct node_info) * subnode_num, subnode, sizeof(struct node_info) * subnode_num); for (i = 0; i < subnode_num; i++) { /* get listeners of each event type */ listener_subnode = libdb_list_subnode_by_type(DB_RMM, evt_type_nodes[i].node_id, MC_REDFISH_LISTENER, &listener_subnode_num, NULL, LOCK_ID_NULL); if (listener_subnode == NULL) goto end; listener_sub_node = (struct node_info *)malloc(CMDBUFSIZ); if (listener_sub_node == NULL) { rc = RESULT_MALLOC_ERR; goto end; } memcpy_s(listener_sub_node, sizeof(struct node_info) * listener_subnode_num, listener_subnode, sizeof(struct node_info) * listener_subnode_num); for (j = 0; j < listener_subnode_num; j++) { if (libdb_attr_get_string(DB_RMM, listener_sub_node[j].node_id, RF_EVENT_LISTENER_DEST_STR, tmp_url, sizeof(tmp_url), LOCK_ID_NULL) != 0) goto end; if (strcmp(tmp_url, url) == 0) libdb_destroy_node(DB_RMM, listener_sub_node[j].node_id, LOCK_ID_NULL); } } end: if (listener_sub_node) libdb_free_node(listener_sub_node); if (evt_type_nodes) libdb_free_node(evt_type_nodes); return rc; }
int main(int argc, char **argv) { int i; int subnode_num; struct node_info *subnode = NULL; #if 1 char *str_node_id = NULL; char *str_cm_level = NULL; char *str_tmc_level = NULL; unsigned int node_id = 0; char *policy = NULL; int cm_level = 0; int tmc_level = 0; int cur_arg = 1; int create_flag = 0; int delete_flag = 0; if (argc < 2) { cooling_usage(); return -1; } while (cur_arg < argc) { if (strcmp(argv[cur_arg], "-p") == 0) { cur_arg++; if (cur_arg < argc) { policy = argv[cur_arg++]; } } else if (strcmp(argv[cur_arg], "-n") == 0) { cur_arg++; if (cur_arg < argc) { str_node_id = argv[cur_arg++]; node_id = atoi(str_node_id); //log_ifo("node_id is %s, %d\n", str_node_id, node_id); } } else if (strcmp(argv[cur_arg], "--cm") == 0) { cur_arg++; if (cur_arg < argc) { str_cm_level = argv[cur_arg++]; cm_level = strtoul(str_cm_level, 0, 16); //log_ifo("cm thermal level is %s, %d\n", str_cm_level, cm_level); } } else if (strcmp(argv[cur_arg], "--tmc") == 0) { cur_arg++; if (cur_arg < argc) { str_tmc_level = argv[cur_arg++]; tmc_level = strtoul(str_tmc_level, 0, 16); //log_ifo("tmc thermal level is %s, %d\n", str_tmc_level, tmc_level); } } else if (strcmp(argv[cur_arg], "--create") == 0) { cur_arg++; create_flag = 1; } else if (strcmp(argv[cur_arg], "--delete") == 0) { cur_arg++; delete_flag = 1; } else { cooling_usage(); return -1; } } #endif memdb_integer cm; memdb_integer tmc; #if 1 if (str_node_id == NULL) { cm = libdb_create_node(DB_RMM, MC_TYPE_RMC, MC_TYPE_CM, SNAPSHOT_NEED, LOCK_ID_NULL); if (str_cm_level != NULL) libdb_attr_set_int(DB_RMM, cm, POLICY_AGGREGATED_THERMAL_STR, 0x0, cm_level, 0, LOCK_ID_NULL); tmc = libdb_create_node(DB_RMM, cm, MC_TYPE_DRAWER, SNAPSHOT_NEED, LOCK_ID_NULL); if (str_tmc_level != NULL) libdb_attr_set_int(DB_RMM, tmc, POLICY_AGGREGATED_THERMAL_STR, 0x0, tmc_level, 0, LOCK_ID_NULL); } else { if (delete_flag){ libdb_destroy_node(DB_RMM, node_id, LOCK_ID_NULL); return 0; } if (str_cm_level != NULL) { libdb_attr_set_int(DB_RMM, node_id, POLICY_AGGREGATED_THERMAL_STR, 0x0, cm_level, 0, LOCK_ID_NULL); } if (str_tmc_level != NULL) { libdb_attr_set_int(DB_RMM, node_id, POLICY_AGGREGATED_THERMAL_STR, 0x0, tmc_level, 0, LOCK_ID_NULL); } } #endif if (policy != NULL) libdb_attr_set_string(DB_RMM, MC_TYPE_RMC, COOLING_POLICY, 0x0, policy, 0, LOCK_ID_NULL); subnode = libdb_list_subnode(DB_RMM, MC_TYPE_RMC, &subnode_num, NULL, LOCK_ID_NULL); int tmc_node_num = 0; //struct node_info *tmc_node = NULL; int j = 0; for (i = 0; i < subnode_num; i++) { //log_ifo("subnode node_id is %lu\n", subnode[i].node_id); if (create_flag && (str_node_id != NULL)) { if (subnode[i].node_id == node_id) { tmc = libdb_create_node(DB_RMM, node_id, MC_TYPE_DRAWER, SNAPSHOT_NEED, LOCK_ID_NULL); if (str_tmc_level != NULL) { libdb_attr_set_int(DB_RMM, tmc, CCTRL_TMC_THERMAL_STR, 0x0, tmc_level, 0, LOCK_ID_NULL); } } } //tmc_node = libdb_list_subnode_by_type(subnode[i].node_id, MC_TYPE_TMC, &tmc_node_num); for (j = 0; j < tmc_node_num; j++) { //log_ifo(" --->tmc node node_id is %lu\n", tmc_node[j].node_id); } } return 0; };