mirror of
https://github.com/ipmitool/ipmitool.git
synced 2025-05-10 18:47:22 +00:00
don't read entire sdr into memory before returning found entry,
instead continue reading where we left of with next call. add support for getting multiple sensors by name
This commit is contained in:
parent
c7bc504b87
commit
0b3db22dab
@ -301,8 +301,8 @@ This command will read the SDR and extract sensor information, then query each s
|
||||
.I list
|
||||
This command will list sensors and thresholds in a wide table format.
|
||||
.TP
|
||||
\fIget\fP <\fBid\fR>
|
||||
This command will print info for a single sensor specified by or name.
|
||||
\fIget\fP <\fBid\fR> ... [\fBid\fR]
|
||||
This command will print info for sensors specified by name.
|
||||
.TP
|
||||
\fIthresh\fP <\fBid\fR> <\fBthreshold\fR> <\fBsetting\fR>
|
||||
This allows you to set a particular sensor threshold value. The sensor is specified by name.
|
||||
|
@ -650,6 +650,6 @@ void ipmi_sdr_print_fru_locator(struct ipmi_intf * intf, struct sdr_record_fru_l
|
||||
void ipmi_sdr_print_mc_locator(struct ipmi_intf * intf, struct sdr_record_mc_locator * mc);
|
||||
|
||||
struct sdr_record_list * ipmi_sdr_find_sdr_byid(struct ipmi_intf * intf, char * id);
|
||||
void ipmi_sdr_list_empty(void);
|
||||
void ipmi_sdr_list_empty(struct ipmi_intf * intf);
|
||||
|
||||
#endif /* IPMI_SDR_H */
|
||||
|
@ -50,6 +50,7 @@ extern int verbose;
|
||||
static int sdr_max_read_len = GET_SDR_ENTIRE_RECORD;
|
||||
|
||||
static struct sdr_record_list * sdr_list_head = NULL;
|
||||
static struct ipmi_sdr_iterator * sdr_list_itr = NULL;
|
||||
|
||||
/* convert unsigned value to 2's complement signed */
|
||||
int utos(unsigned val, unsigned bits)
|
||||
@ -998,74 +999,23 @@ ipmi_sdr_end(struct ipmi_intf * intf, struct ipmi_sdr_iterator * itr)
|
||||
free (itr);
|
||||
}
|
||||
|
||||
int ipmi_sdr_list_fill(struct ipmi_intf * intf)
|
||||
{
|
||||
struct sdr_get_rs * header;
|
||||
struct ipmi_sdr_iterator * itr;
|
||||
static struct sdr_record_list * sdr_list_tail;
|
||||
|
||||
itr = ipmi_sdr_start(intf);
|
||||
if (!itr) {
|
||||
printf("Unable to open SDR for reading\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
while (header = ipmi_sdr_get_next_header(intf, itr)) {
|
||||
unsigned char * rec;
|
||||
struct sdr_record_full_sensor * full;
|
||||
struct sdr_record_compact_sensor * compact;
|
||||
struct sdr_record_list * sdrr;
|
||||
|
||||
sdrr = malloc(sizeof(struct sdr_record_list));
|
||||
memset(sdrr, 0, sizeof(struct sdr_record_list));
|
||||
sdrr->id = header->id;
|
||||
sdrr->type = header->type;
|
||||
|
||||
rec = ipmi_sdr_get_record(intf, header, itr);
|
||||
if (!rec)
|
||||
continue;
|
||||
|
||||
switch (header->type) {
|
||||
case SDR_RECORD_TYPE_FULL_SENSOR:
|
||||
sdrr->record.full = (struct sdr_record_full_sensor *)rec;
|
||||
break;
|
||||
case SDR_RECORD_TYPE_COMPACT_SENSOR:
|
||||
sdrr->record.compact = (struct sdr_record_compact_sensor *)rec;
|
||||
break;
|
||||
case SDR_RECORD_TYPE_EVENTONLY_SENSOR:
|
||||
sdrr->record.eventonly = (struct sdr_record_eventonly_sensor *)rec;
|
||||
break;
|
||||
case SDR_RECORD_TYPE_FRU_DEVICE_LOCATOR:
|
||||
sdrr->record.fruloc = (struct sdr_record_fru_locator *)rec;
|
||||
break;
|
||||
case SDR_RECORD_TYPE_MC_DEVICE_LOCATOR:
|
||||
sdrr->record.mcloc = (struct sdr_record_mc_locator *)rec;
|
||||
break;
|
||||
default:
|
||||
free(rec);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!sdr_list_head)
|
||||
sdr_list_head = sdrr;
|
||||
else
|
||||
sdr_list_tail->next = sdrr;
|
||||
sdr_list_tail = sdrr;
|
||||
}
|
||||
|
||||
ipmi_sdr_end(intf, itr);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
struct sdr_record_list *
|
||||
ipmi_sdr_find_sdr_byid(struct ipmi_intf * intf, char * id)
|
||||
{
|
||||
struct sdr_get_rs * header;
|
||||
static struct sdr_record_list * sdr_list_tail;
|
||||
static struct sdr_record_list * e;
|
||||
int found = 0;
|
||||
|
||||
if (!sdr_list_head)
|
||||
ipmi_sdr_list_fill(intf);
|
||||
if (!sdr_list_itr) {
|
||||
sdr_list_itr = ipmi_sdr_start(intf);
|
||||
if (!sdr_list_itr) {
|
||||
printf("Unable to open SDR for reading\n");
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
/* check what we've already read */
|
||||
e = sdr_list_head;
|
||||
while (e) {
|
||||
switch (e->type) {
|
||||
@ -1098,13 +1048,77 @@ ipmi_sdr_find_sdr_byid(struct ipmi_intf * intf, char * id)
|
||||
e = e->next;
|
||||
}
|
||||
|
||||
/* now keep looking */
|
||||
while (header = ipmi_sdr_get_next_header(intf, sdr_list_itr)) {
|
||||
unsigned char * rec;
|
||||
struct sdr_record_full_sensor * full;
|
||||
struct sdr_record_compact_sensor * compact;
|
||||
struct sdr_record_list * sdrr;
|
||||
|
||||
sdrr = malloc(sizeof(struct sdr_record_list));
|
||||
memset(sdrr, 0, sizeof(struct sdr_record_list));
|
||||
sdrr->id = header->id;
|
||||
sdrr->type = header->type;
|
||||
|
||||
rec = ipmi_sdr_get_record(intf, header, sdr_list_itr);
|
||||
if (!rec)
|
||||
continue;
|
||||
|
||||
switch (header->type) {
|
||||
case SDR_RECORD_TYPE_FULL_SENSOR:
|
||||
sdrr->record.full = (struct sdr_record_full_sensor *)rec;
|
||||
if (!strncmp(sdrr->record.full->id_string, id,
|
||||
sdrr->record.full->id_code & 0x1f))
|
||||
found = 1;
|
||||
break;
|
||||
case SDR_RECORD_TYPE_COMPACT_SENSOR:
|
||||
sdrr->record.compact = (struct sdr_record_compact_sensor *)rec;
|
||||
if (!strncmp(sdrr->record.compact->id_string, id,
|
||||
sdrr->record.compact->id_code & 0x1f))
|
||||
found = 1;
|
||||
break;
|
||||
case SDR_RECORD_TYPE_EVENTONLY_SENSOR:
|
||||
sdrr->record.eventonly = (struct sdr_record_eventonly_sensor *)rec;
|
||||
if (!strncmp(sdrr->record.eventonly->id_string, id,
|
||||
sdrr->record.eventonly->id_code & 0x1f))
|
||||
found = 1;
|
||||
break;
|
||||
case SDR_RECORD_TYPE_FRU_DEVICE_LOCATOR:
|
||||
sdrr->record.fruloc = (struct sdr_record_fru_locator *)rec;
|
||||
if (!strncmp(sdrr->record.fruloc->id_string, id,
|
||||
sdrr->record.fruloc->id_code & 0x1f))
|
||||
found = 1;
|
||||
break;
|
||||
case SDR_RECORD_TYPE_MC_DEVICE_LOCATOR:
|
||||
sdrr->record.mcloc = (struct sdr_record_mc_locator *)rec;
|
||||
if (!strncmp(sdrr->record.mcloc->id_string, id,
|
||||
sdrr->record.mcloc->id_code & 0x1f))
|
||||
found = 1;
|
||||
break;
|
||||
default:
|
||||
free(rec);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!sdr_list_head)
|
||||
sdr_list_head = sdrr;
|
||||
else
|
||||
sdr_list_tail->next = sdrr;
|
||||
sdr_list_tail = sdrr;
|
||||
|
||||
if (found)
|
||||
return sdrr;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void ipmi_sdr_list_empty(void)
|
||||
void ipmi_sdr_list_empty(struct ipmi_intf * intf)
|
||||
{
|
||||
struct sdr_record_list *list, *next;
|
||||
|
||||
ipmi_sdr_end(intf, sdr_list_itr);
|
||||
|
||||
list = sdr_list_head;
|
||||
while (list) {
|
||||
switch (list->type) {
|
||||
|
@ -694,46 +694,49 @@ ipmi_sensor_set_threshold(struct ipmi_intf * intf, int argc, char ** argv)
|
||||
printf("Sensor data record not found!\n");
|
||||
}
|
||||
|
||||
ipmi_sdr_list_empty();
|
||||
ipmi_sdr_list_empty(intf);
|
||||
}
|
||||
|
||||
static void ipmi_sensor_get(struct ipmi_intf * intf, char * id)
|
||||
static void ipmi_sensor_get(struct ipmi_intf * intf, int argc, char ** argv)
|
||||
{
|
||||
struct sdr_record_list * sdr;
|
||||
int i;
|
||||
|
||||
if (!id || !strncmp(id, "help", 4)) {
|
||||
printf("sensor get <id>\n");
|
||||
if (argc < 1 || !strncmp(argv[0], "help", 4)) {
|
||||
printf("sensor get <id> ... [id]\n");
|
||||
printf(" id : name of desired sensor\n");
|
||||
return;
|
||||
}
|
||||
printf("Locating sensor record...\n");
|
||||
|
||||
/* lookup by sensor name */
|
||||
sdr = ipmi_sdr_find_sdr_byid(intf, id);
|
||||
if (sdr) {
|
||||
verbose = verbose ? : 1;
|
||||
switch (sdr->type) {
|
||||
case SDR_RECORD_TYPE_FULL_SENSOR:
|
||||
ipmi_sensor_print_full(intf, sdr->record.full);
|
||||
break;
|
||||
case SDR_RECORD_TYPE_COMPACT_SENSOR:
|
||||
ipmi_sensor_print_compact(intf, sdr->record.compact);
|
||||
break;
|
||||
case SDR_RECORD_TYPE_EVENTONLY_SENSOR:
|
||||
ipmi_sdr_print_sensor_eventonly(intf, sdr->record.eventonly);
|
||||
break;
|
||||
case SDR_RECORD_TYPE_FRU_DEVICE_LOCATOR:
|
||||
ipmi_sdr_print_fru_locator(intf, sdr->record.fruloc);
|
||||
break;
|
||||
case SDR_RECORD_TYPE_MC_DEVICE_LOCATOR:
|
||||
ipmi_sdr_print_mc_locator(intf, sdr->record.mcloc);
|
||||
break;
|
||||
for (i=0; i<argc; i++) {
|
||||
sdr = ipmi_sdr_find_sdr_byid(intf, argv[i]);
|
||||
if (sdr) {
|
||||
verbose = verbose ? : 1;
|
||||
switch (sdr->type) {
|
||||
case SDR_RECORD_TYPE_FULL_SENSOR:
|
||||
ipmi_sensor_print_full(intf, sdr->record.full);
|
||||
break;
|
||||
case SDR_RECORD_TYPE_COMPACT_SENSOR:
|
||||
ipmi_sensor_print_compact(intf, sdr->record.compact);
|
||||
break;
|
||||
case SDR_RECORD_TYPE_EVENTONLY_SENSOR:
|
||||
ipmi_sdr_print_sensor_eventonly(intf, sdr->record.eventonly);
|
||||
break;
|
||||
case SDR_RECORD_TYPE_FRU_DEVICE_LOCATOR:
|
||||
ipmi_sdr_print_fru_locator(intf, sdr->record.fruloc);
|
||||
break;
|
||||
case SDR_RECORD_TYPE_MC_DEVICE_LOCATOR:
|
||||
ipmi_sdr_print_mc_locator(intf, sdr->record.mcloc);
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
printf("Sensor data record \"%s\" not found!\n", argv[i]);
|
||||
}
|
||||
} else {
|
||||
printf("Sensor data record not found!\n");
|
||||
}
|
||||
|
||||
ipmi_sdr_list_empty();
|
||||
ipmi_sdr_list_empty(intf);
|
||||
}
|
||||
|
||||
int
|
||||
@ -751,7 +754,7 @@ ipmi_sensor_main(struct ipmi_intf * intf, int argc, char ** argv)
|
||||
ipmi_sensor_set_threshold(intf, argc-1, &argv[1]);
|
||||
}
|
||||
else if (!strncmp(argv[0], "get", 3)) {
|
||||
ipmi_sensor_get(intf, argv[1]);
|
||||
ipmi_sensor_get(intf, argc-1, &argv[1]);
|
||||
}
|
||||
else
|
||||
printf("Invalid sensor command: %s\n", argv[0]);
|
||||
|
Loading…
x
Reference in New Issue
Block a user