/* * CDDL HEADER START * * The contents of this file are subject to the terms of the * Common Development and Distribution License (the "License"). * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE * or http://www.opensolaris.org/os/licensing. * See the License for the specific language governing permissions * and limitations under the License. * * When distributing Covered Code, include this CDDL HEADER in each * file and include the License file at usr/src/OPENSOLARIS.LICENSE. * If applicable, add the following below this CDDL HEADER, with the * fields enclosed by brackets "[]" replaced with your own identifying * information: Portions Copyright [yyyy] [name of copyright owner] * * CDDL HEADER END */ /* * Copyright 2010 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ #include #include #include static const char *pname; static const char optstr[] = "h:p:u:t:"; static void usage() { (void) fprintf(stderr, "Usage: %s [-t ] [-h hostname] [-u username] " "[-p password]\n", pname); } /*ARGSUSED*/ static int sdr_print(ipmi_handle_t *ihp, ipmi_entity_t *ep, const char *name, ipmi_sdr_t *sdrp, void *data) { int indentation = (uintptr_t)data; ipmi_sdr_compact_sensor_t *csp; ipmi_sdr_full_sensor_t *fsp; uint8_t sensor_number, sensor_type, reading_type; boolean_t get_reading = B_FALSE; ipmi_sensor_reading_t *srp; char sensor_name[128]; char reading_name[128]; if (name == NULL) return (0); switch (sdrp->is_type) { case IPMI_SDR_TYPE_COMPACT_SENSOR: csp = (ipmi_sdr_compact_sensor_t *)sdrp->is_record; sensor_number = csp->is_cs_number; sensor_type = csp->is_cs_type; reading_type = csp->is_cs_reading_type; get_reading = B_TRUE; break; case IPMI_SDR_TYPE_FULL_SENSOR: fsp = (ipmi_sdr_full_sensor_t *)sdrp->is_record; sensor_number = fsp->is_fs_number; sensor_type = fsp->is_fs_type; reading_type = fsp->is_fs_reading_type; get_reading = B_TRUE; break; } (void) printf("%*s%-*s", indentation, "", 36 - indentation, name); if (get_reading) { ipmi_sensor_type_name(sensor_type, sensor_name, sizeof (sensor_name)); ipmi_sensor_reading_name(sensor_type, reading_type, reading_name, sizeof (reading_name)); (void) printf("%12s %12s", sensor_name, reading_name); if ((srp = ipmi_get_sensor_reading(ihp, sensor_number)) == NULL) { if (ipmi_errno(ihp) == EIPMI_NOT_PRESENT) { (void) printf(" -\n"); } else { (void) printf("\n"); return (-1); } } else { (void) printf(" %04x\n", srp->isr_state); } } else { (void) printf("\n"); } return (0); } static int entity_print(ipmi_handle_t *ihp, ipmi_entity_t *ep, void *data) { int indentation = (uintptr_t)data; char name[128]; boolean_t present; ipmi_entity_name(ep->ie_type, name, sizeof (name)); (void) snprintf(name + strlen(name), sizeof (name) - strlen(name), " %d", ep->ie_instance); if (ipmi_entity_present(ihp, ep, &present) != 0) { (void) printf("%*s%-*s %s (%s)\n", indentation, "", 24 - indentation, name, "unknown", ipmi_errmsg(ihp)); } else { (void) printf("%*s%-*s %s\n", indentation, "", 24 - indentation, name, present ? "present" : "absent"); } (void) ipmi_entity_iter_sdr(ihp, ep, sdr_print, (void *)(indentation + 2)); if (ep->ie_children != 0) (void) ipmi_entity_iter_children(ihp, ep, entity_print, (void *)(indentation + 2)); return (0); } int main(int argc, char **argv) { ipmi_handle_t *ihp; char *errmsg; uint_t xport_type; char c, *host = NULL, *user = NULL, *passwd = NULL; int err; nvlist_t *params = NULL; pname = argv[0]; while (optind < argc) { while ((c = getopt(argc, argv, optstr)) != -1) switch (c) { case 'h': host = optarg; break; case 'p': passwd = optarg; break; case 't': if (strcmp(optarg, "bmc") == 0) xport_type = IPMI_TRANSPORT_BMC; else if (strcmp(optarg, "lan") == 0) xport_type = IPMI_TRANSPORT_LAN; else { (void) fprintf(stderr, "ABORT: Invalid transport type\n"); usage(); } break; case 'u': user = optarg; break; default: usage(); return (1); } } if (xport_type == IPMI_TRANSPORT_LAN && (host == NULL || passwd == NULL || user == NULL)) { (void) fprintf(stderr, "-h/-u/-p must all be specified for " "transport type \"lan\"\n"); usage(); return (1); } if (xport_type == IPMI_TRANSPORT_LAN) { if (nvlist_alloc(¶ms, NV_UNIQUE_NAME, 0) || nvlist_add_string(params, IPMI_LAN_HOST, host) || nvlist_add_string(params, IPMI_LAN_USER, user) || nvlist_add_string(params, IPMI_LAN_PASSWD, passwd)) { (void) fprintf(stderr, "ABORT: nvlist construction failed\n"); return (1); } } if ((ihp = ipmi_open(&err, &errmsg, xport_type, params)) == NULL) { (void) fprintf(stderr, "failed to open libipmi: %s\n", errmsg); return (1); } (void) printf("%-24s %-8s %12s %12s %5s\n", "ENTITY/SENSOR", "PRESENT", "SENSOR", "READING", "STATE"); (void) printf("----------------------- -------- ------------- " "------------ -----\n"); if (ipmi_entity_iter(ihp, entity_print, NULL) != 0) { (void) fprintf(stderr, "failed to iterate entities: %s\n", ipmi_errmsg(ihp)); return (1); } ipmi_close(ihp); return (0); }