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