struct oh_event * snmp_bc_discover_chassis(struct oh_handler_state *handle, char *blade_vector, SaHpiEntityPathT *ep) { int len; struct oh_event working; struct oh_event *e = NULL; memset(&working, 0, sizeof(struct oh_event)); if (blade_vector != NULL) { working.type = OH_ET_RESOURCE; working.u.res_event.entry = snmp_rpt_array[BC_RPT_ENTRY_CHASSIS].rpt; working.u.res_event.entry.ResourceTag.DataType = SAHPI_TL_TYPE_LANGUAGE; working.u.res_event.entry.ResourceTag.Language = SAHPI_LANG_ENGLISH; len = strlen(snmp_rpt_array[BC_RPT_ENTRY_CHASSIS].comment); if (len <= SAHPI_MAX_TEXT_BUFFER_LENGTH) { working.u.res_event.entry.ResourceTag.DataLength = (SaHpiUint8T)len; strcpy(working.u.res_event.entry.ResourceTag.Data, snmp_rpt_array[BC_RPT_ENTRY_CHASSIS].comment); } else { dbg("Comment string too long - %s\n",snmp_rpt_array[BC_RPT_ENTRY_CHASSIS].comment); } working.u.res_event.entry.ResourceId = oh_uid_from_entity_path(ep); working.u.res_event.entry.ResourceEntity = *ep; e = eventdup(&working); find_res_events(handle,ep, &snmp_rpt_array[BC_RPT_ENTRY_CHASSIS].bc_res_info); } return e; }
/** * snmp_bc_discover_sensors: Discover all available sensors for a resource * @ss: handle to snmp connection for this instance * @parent_ep: Entity path of RDR's parent resource * @parent_id: ID of RDR's parent resource * @control: Pointer to RDR's static control definition (SaHpiSensorRecT) * Return value: Pointer to Plugin Event, if success, NULL, if error or sensor does not exist **/ struct oh_event * snmp_bc_discover_sensors(struct oh_handler_state *handle, SaHpiEntityPathT parent_ep, const struct snmp_bc_sensor *sensor) { gchar *oid=NULL; int len, sensor_event_only=0; struct oh_event working; struct oh_event *e = NULL; struct snmp_bc_hnd *custom_handle = (struct snmp_bc_hnd *)handle->data; struct snmp_session *ss = custom_handle->ss; memset(&working, 0, sizeof(struct oh_event)); /* Check for Event-only sensor - no OID */ if ((sensor->bc_sensor_info.mib.oid == NULL) && (sensor->sensor.DataFormat.ReadingFormats & SAHPI_SRF_EVENT_STATE)) { sensor_event_only = 1; } if ((sensor->bc_sensor_info.mib.oid == NULL) && !(sensor->sensor.DataFormat.ReadingFormats & SAHPI_SRF_EVENT_STATE)) { dbg("Sensor %s cannot be read and is NOT event-only", sensor->comment); return e; } if (!sensor_event_only) { oid = snmp_derive_objid(parent_ep, sensor->bc_sensor_info.mib.oid); if (oid == NULL) { dbg("NULL SNMP OID returned\n"); return e; } } if (sensor_event_only || rdr_exists(ss, oid, sensor->bc_sensor_info.mib.not_avail_indicator_num,sensor->bc_sensor_info.mib.write_only)) { working.type = OH_ET_RDR; working.u.rdr_event.rdr.RdrType = SAHPI_SENSOR_RDR; working.u.rdr_event.rdr.Entity = parent_ep; working.u.rdr_event.rdr.RdrTypeUnion.SensorRec = sensor->sensor; working.u.rdr_event.rdr.IdString.DataType = SAHPI_TL_TYPE_LANGUAGE; working.u.rdr_event.rdr.IdString.Language = SAHPI_LANG_ENGLISH; len = strlen(sensor->comment); if (len <= SAHPI_MAX_TEXT_BUFFER_LENGTH) { working.u.rdr_event.rdr.IdString.DataLength = (SaHpiUint8T)len; strcpy(working.u.rdr_event.rdr.IdString.Data,sensor->comment); } else { dbg("Comment string too long - %s\n",sensor->comment); } e = eventdup(&working); find_sensor_events(handle, &parent_ep, sensor->sensor.Num, sensor); } g_free(oid); return e; }
int eventq_event_add(struct oh_handler_state *oh_hnd) { struct oh_event event; SaHpiRptEntryT *rpt_entry; SaHpiRdrT *rdr_entry; /* get the first rpt entry */ rpt_entry = oh_get_resource_next(oh_hnd->rptcache, RPT_ENTRY_BEGIN); while (rpt_entry) { memset(&event, 0, sizeof(event)); event.type = OH_ET_RESOURCE; memcpy(&event.u.res_event.entry, rpt_entry, sizeof(SaHpiRptEntryT)); oh_hnd->eventq = g_slist_append(oh_hnd->eventq, eventdup(&event) ); /* get every resource rdr's */ rdr_entry = oh_get_rdr_next(oh_hnd->rptcache, rpt_entry->ResourceId, RDR_BEGIN); while (rdr_entry) { memset(&event, 0, sizeof(event)); event.type = OH_ET_RDR; memcpy(&event.u.rdr_event.rdr, rdr_entry, sizeof(SaHpiRdrT)); oh_hnd->eventq = g_slist_append(oh_hnd->eventq, eventdup(&event)); rdr_entry = oh_get_rdr_next(oh_hnd->rptcache, rpt_entry->ResourceId, rdr_entry->RecordId); } /* get any resource rdr's end */ rpt_entry = oh_get_resource_next(oh_hnd->rptcache, rpt_entry->ResourceId); } return SA_OK; }
struct oh_event * snmp_bc_discover_inventories(struct oh_handler_state *handle, SaHpiEntityPathT parent_ep, const struct snmp_bc_inventory *inventory) { gchar *oid; int len; struct oh_event working; struct oh_event *e = NULL; struct snmp_bc_hnd *custom_handle = (struct snmp_bc_hnd *)handle->data; struct snmp_session *ss = custom_handle->ss; memset(&working, 0, sizeof(struct oh_event)); oid = snmp_derive_objid(parent_ep, inventory->bc_inventory_info.mib.oid.OidManufacturer); if (oid == NULL) { dbg("NULL SNMP OID returned.\n"); return e; } if (rdr_exists(ss, oid, 0, 0)) { working.type = OH_ET_RDR; working.u.rdr_event.rdr.RdrType = SAHPI_INVENTORY_RDR; working.u.rdr_event.rdr.Entity = parent_ep; working.u.rdr_event.rdr.RdrTypeUnion.InventoryRec = inventory->inventory; working.u.rdr_event.rdr.IdString.DataType = SAHPI_TL_TYPE_LANGUAGE; working.u.rdr_event.rdr.IdString.Language = SAHPI_LANG_ENGLISH; len = strlen(inventory->comment); if (len <= SAHPI_MAX_TEXT_BUFFER_LENGTH) { working.u.rdr_event.rdr.IdString.DataLength = (SaHpiUint8T)len; strcpy(working.u.rdr_event.rdr.IdString.Data,inventory->comment); } else { dbg("Comment string too long - %s\n",inventory->comment); } e = eventdup(&working); } g_free(oid); return e; }
struct oh_event * snmp_bc_discover_controls(struct oh_handler_state *handle, SaHpiEntityPathT parent_ep, const struct snmp_bc_control *control) { gchar *oid; int len; struct oh_event working; struct oh_event *e = NULL; struct snmp_bc_hnd *custom_handle = (struct snmp_bc_hnd *)handle->data; struct snmp_session *ss = custom_handle->ss; memset(&working, 0, sizeof(struct oh_event)); oid = snmp_derive_objid(parent_ep, control->bc_control_info.mib.oid); if (oid == NULL) { dbg("NULL SNMP OID returned\n"); return e; } if (rdr_exists(ss, oid, control->bc_control_info.mib.not_avail_indicator_num,control->bc_control_info.mib.write_only)) { working.type = OH_ET_RDR; working.u.rdr_event.rdr.RdrType = SAHPI_CTRL_RDR; working.u.rdr_event.rdr.Entity = parent_ep; working.u.rdr_event.rdr.RdrTypeUnion.CtrlRec = control->control; working.u.rdr_event.rdr.IdString.DataType = SAHPI_TL_TYPE_LANGUAGE; working.u.rdr_event.rdr.IdString.Language = SAHPI_LANG_ENGLISH; len = strlen(control->comment); if (len <= SAHPI_MAX_TEXT_BUFFER_LENGTH) { working.u.rdr_event.rdr.IdString.DataLength = (SaHpiUint8T)len; strcpy(working.u.rdr_event.rdr.IdString.Data,control->comment); } else { dbg("Comment string too long - %s\n",control->comment); } e = eventdup(&working); } g_free(oid); return e; }
struct oh_event * snmp_bc_discover_blade(struct oh_handler_state *handle, char *blade_vector, SaHpiEntityPathT *ep, int bladenum) { int len; struct oh_event working; struct oh_event *e = NULL; memset(&working, 0, sizeof(struct oh_event)); if (blade_vector[bladenum] == '1') { working.type = OH_ET_RESOURCE; working.u.res_event.entry = snmp_rpt_array[BC_RPT_ENTRY_BLADE].rpt; working.u.res_event.entry.ResourceTag.DataType = SAHPI_TL_TYPE_LANGUAGE; working.u.res_event.entry.ResourceTag.Language = SAHPI_LANG_ENGLISH; len = strlen(snmp_rpt_array[BC_RPT_ENTRY_BLADE].comment); if (len <= SAHPI_MAX_TEXT_BUFFER_LENGTH) { working.u.res_event.entry.ResourceTag.DataLength = (SaHpiUint8T)len; strcpy(working.u.res_event.entry.ResourceTag.Data, snmp_rpt_array[BC_RPT_ENTRY_BLADE].comment); } else { dbg("Comment string too long - %s\n",snmp_rpt_array[BC_RPT_ENTRY_BLADE].comment); } ep_concat(&working.u.res_event.entry.ResourceEntity, ep); set_ep_instance(&(working.u.res_event.entry.ResourceEntity), SAHPI_ENT_SBC_BLADE,bladenum+BC_HPI_INSTANCE_BASE); working.u.res_event.entry.ResourceId = oh_uid_from_entity_path(&(working.u.res_event.entry.ResourceEntity)); e = eventdup(&working); find_res_events(handle, &working.u.res_event.entry.ResourceEntity, &snmp_rpt_array[BC_RPT_ENTRY_BLADE].bc_res_info); } return e; }
struct oh_event * snmp_bc_discover_mgmnt(struct oh_handler_state *handle, char *mm_vector, SaHpiEntityPathT *ep, int mmnum) { int len; struct oh_event working; struct oh_event *e = NULL; memset(&working, 0, sizeof(struct oh_event)); if (mm_vector != NULL) { working.type = OH_ET_RESOURCE; working.u.res_event.entry = snmp_rpt_array[BC_RPT_ENTRY_MGMNT_MODULE].rpt; working.u.res_event.entry.ResourceTag.DataType = SAHPI_TL_TYPE_LANGUAGE; working.u.res_event.entry.ResourceTag.Language = SAHPI_LANG_ENGLISH; len = strlen(snmp_rpt_array[BC_RPT_ENTRY_MGMNT_MODULE].comment); if (len <= SAHPI_MAX_TEXT_BUFFER_LENGTH) { working.u.res_event.entry.ResourceTag.DataLength = (SaHpiUint8T)len; strcpy(working.u.res_event.entry.ResourceTag.Data, snmp_rpt_array[BC_RPT_ENTRY_MGMNT_MODULE].comment); } else { dbg("Comment string too long - %s\n",snmp_rpt_array[BC_RPT_ENTRY_MGMNT_MODULE].comment); } ep_concat(&working.u.res_event.entry.ResourceEntity, ep); /* ???? Should we also set to index of active MM ???? */ set_ep_instance(&(working.u.res_event.entry.ResourceEntity), SAHPI_ENT_SYS_MGMNT_MODULE, mmnum+BC_HPI_INSTANCE_BASE); working.u.res_event.entry.ResourceId = oh_uid_from_entity_path(&(working.u.res_event.entry.ResourceEntity)); e = eventdup(&working); find_res_events(handle, &working.u.res_event.entry.ResourceEntity, &snmp_rpt_array[BC_RPT_ENTRY_MGMNT_MODULE].bc_res_info); } return e; }
struct oh_event * snmp_bc_discover_blade_addin(struct oh_handler_state *handle, char *blade_vector, SaHpiEntityPathT *ep, int bladenum) { gchar bladenum_str[2]; /* Implies max number of blades is 99 */ gchar *oid = NULL; gchar *oidtmp = NULL; gchar **oidparts = NULL; int len, err; struct oh_event working; struct oh_event *e = NULL; struct snmp_bc_hnd *custom_handle = (struct snmp_bc_hnd *)handle->data; struct snmp_session *ss = custom_handle->ss; struct snmp_value get_value; memset(&working, 0, sizeof(struct oh_event)); if (blade_vector[bladenum] == '1') { /* Assumming one 'x' at end of SNMP_BC_BLADE_ADDIN_VECTOR */ oidtmp = g_strdup(SNMP_BC_BLADE_ADDIN_VECTOR); if (!oidtmp) { dbg("Out of memory"); goto CLEANUP; } oidparts = g_strsplit(oidtmp, OID_BLANK_STR, -1); if (!oidparts) { dbg("Could not split blade add-in oid"); goto CLEANUP; } if (oidparts[1] != NULL && oidparts[1] != '\0') { dbg("More than one expansion character in OID string\n"); goto CLEANUP; } sprintf(bladenum_str, "%d", bladenum+BC_HPI_INSTANCE_BASE); oid = g_strconcat(oidparts[0], bladenum_str, NULL); if (!oid) { dbg("Could not concatenate blade add-in oid"); goto CLEANUP; } err = snmp_get(ss, oid, &get_value); if (!(err || get_value.integer == 0)) { working.type = OH_ET_RESOURCE; working.u.res_event.entry = snmp_rpt_array[BC_RPT_ENTRY_BLADE_ADDIN_CARD].rpt; working.u.res_event.entry.ResourceTag.DataType = SAHPI_TL_TYPE_LANGUAGE; working.u.res_event.entry.ResourceTag.Language = SAHPI_LANG_ENGLISH; len = strlen(snmp_rpt_array[BC_RPT_ENTRY_BLADE_ADDIN_CARD].comment); if (len <= SAHPI_MAX_TEXT_BUFFER_LENGTH) { working.u.res_event.entry.ResourceTag.DataLength = (SaHpiUint8T)len; strcpy(working.u.res_event.entry.ResourceTag.Data, snmp_rpt_array[BC_RPT_ENTRY_BLADE_ADDIN_CARD].comment); } else { dbg("Comment string too long - %s\n", snmp_rpt_array[BC_RPT_ENTRY_BLADE_ADDIN_CARD].comment); } ep_concat(&working.u.res_event.entry.ResourceEntity, ep); set_ep_instance(&(working.u.res_event.entry.ResourceEntity), SAHPI_ENT_SBC_BLADE,bladenum+BC_HPI_INSTANCE_BASE); /* Add-in cards have same number as parent blade * This will be a problem if one can have multiple addins/blade. * If this happens, need better SNMP support, since the current * blade based DASD1 temp vector will not normalize properly * if addin card numbers don't agree with parent blade number. */ set_ep_instance(&(working.u.res_event.entry.ResourceEntity), SAHPI_ENT_ADD_IN_CARD,bladenum+BC_HPI_INSTANCE_BASE); working.u.res_event.entry.ResourceId = oh_uid_from_entity_path(&(working.u.res_event.entry.ResourceEntity)); e = eventdup(&working); find_res_events(handle, &working.u.res_event.entry.ResourceEntity, &snmp_rpt_array[BC_RPT_ENTRY_BLADE_ADDIN_CARD].bc_res_info); } } CLEANUP: g_free(oid); g_free(oidtmp); g_strfreev(oidparts); return e; }