12eeaed14Srobj /* 22eeaed14Srobj * CDDL HEADER START 32eeaed14Srobj * 42eeaed14Srobj * The contents of this file are subject to the terms of the 52eeaed14Srobj * Common Development and Distribution License (the "License"). 62eeaed14Srobj * You may not use this file except in compliance with the License. 72eeaed14Srobj * 82eeaed14Srobj * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 92eeaed14Srobj * or http://www.opensolaris.org/os/licensing. 102eeaed14Srobj * See the License for the specific language governing permissions 112eeaed14Srobj * and limitations under the License. 122eeaed14Srobj * 132eeaed14Srobj * When distributing Covered Code, include this CDDL HEADER in each 142eeaed14Srobj * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 152eeaed14Srobj * If applicable, add the following below this CDDL HEADER, with the 162eeaed14Srobj * fields enclosed by brackets "[]" replaced with your own identifying 172eeaed14Srobj * information: Portions Copyright [yyyy] [name of copyright owner] 182eeaed14Srobj * 192eeaed14Srobj * CDDL HEADER END 202eeaed14Srobj */ 212eeaed14Srobj /* 22*81d9f076SRobert Johnston * Copyright 2010 Sun Microsystems, Inc. All rights reserved. 232eeaed14Srobj * Use is subject to license terms. 242eeaed14Srobj */ 252eeaed14Srobj 262eeaed14Srobj #include <libipmi.h> 272eeaed14Srobj #include <stdio.h> 282eeaed14Srobj #include <string.h> 292eeaed14Srobj 30*81d9f076SRobert Johnston static const char *pname; 31*81d9f076SRobert Johnston static const char optstr[] = "h:p:u:t:"; 32*81d9f076SRobert Johnston 33*81d9f076SRobert Johnston static void 34*81d9f076SRobert Johnston usage() 35*81d9f076SRobert Johnston { 36*81d9f076SRobert Johnston (void) fprintf(stderr, 37*81d9f076SRobert Johnston "Usage: %s [-t <bmc|lan>] [-h hostname] [-u username] " 38*81d9f076SRobert Johnston "[-p password]\n", pname); 39*81d9f076SRobert Johnston } 40*81d9f076SRobert Johnston 412eeaed14Srobj /*ARGSUSED*/ 422eeaed14Srobj static int 432eeaed14Srobj sdr_print(ipmi_handle_t *ihp, ipmi_entity_t *ep, const char *name, 442eeaed14Srobj ipmi_sdr_t *sdrp, void *data) 452eeaed14Srobj { 462eeaed14Srobj int indentation = (uintptr_t)data; 472eeaed14Srobj ipmi_sdr_compact_sensor_t *csp; 482eeaed14Srobj ipmi_sdr_full_sensor_t *fsp; 492eeaed14Srobj uint8_t sensor_number, sensor_type, reading_type; 502eeaed14Srobj boolean_t get_reading = B_FALSE; 512eeaed14Srobj ipmi_sensor_reading_t *srp; 522eeaed14Srobj char sensor_name[128]; 532eeaed14Srobj char reading_name[128]; 542eeaed14Srobj 552eeaed14Srobj if (name == NULL) 562eeaed14Srobj return (0); 572eeaed14Srobj 582eeaed14Srobj switch (sdrp->is_type) { 592eeaed14Srobj case IPMI_SDR_TYPE_COMPACT_SENSOR: 602eeaed14Srobj csp = (ipmi_sdr_compact_sensor_t *)sdrp->is_record; 612eeaed14Srobj sensor_number = csp->is_cs_number; 622eeaed14Srobj sensor_type = csp->is_cs_type; 632eeaed14Srobj reading_type = csp->is_cs_reading_type; 642eeaed14Srobj get_reading = B_TRUE; 652eeaed14Srobj break; 662eeaed14Srobj 672eeaed14Srobj case IPMI_SDR_TYPE_FULL_SENSOR: 682eeaed14Srobj fsp = (ipmi_sdr_full_sensor_t *)sdrp->is_record; 692eeaed14Srobj sensor_number = fsp->is_fs_number; 702eeaed14Srobj sensor_type = fsp->is_fs_type; 712eeaed14Srobj reading_type = fsp->is_fs_reading_type; 722eeaed14Srobj get_reading = B_TRUE; 732eeaed14Srobj break; 742eeaed14Srobj } 752eeaed14Srobj 762eeaed14Srobj (void) printf("%*s%-*s", indentation, "", 772eeaed14Srobj 36 - indentation, name); 782eeaed14Srobj 792eeaed14Srobj if (get_reading) { 802eeaed14Srobj ipmi_sensor_type_name(sensor_type, sensor_name, 812eeaed14Srobj sizeof (sensor_name)); 822eeaed14Srobj ipmi_sensor_reading_name(sensor_type, reading_type, 832eeaed14Srobj reading_name, sizeof (reading_name)); 842eeaed14Srobj (void) printf("%12s %12s", sensor_name, reading_name); 852eeaed14Srobj if ((srp = ipmi_get_sensor_reading(ihp, 862eeaed14Srobj sensor_number)) == NULL) { 872eeaed14Srobj if (ipmi_errno(ihp) == EIPMI_NOT_PRESENT) { 882eeaed14Srobj (void) printf(" -\n"); 892eeaed14Srobj } else { 902eeaed14Srobj (void) printf("\n"); 912eeaed14Srobj return (-1); 922eeaed14Srobj } 932eeaed14Srobj } else { 942eeaed14Srobj (void) printf(" %04x\n", srp->isr_state); 952eeaed14Srobj } 962eeaed14Srobj } else { 972eeaed14Srobj (void) printf("\n"); 982eeaed14Srobj } 992eeaed14Srobj 1002eeaed14Srobj return (0); 1012eeaed14Srobj } 1022eeaed14Srobj 1032eeaed14Srobj static int 1042eeaed14Srobj entity_print(ipmi_handle_t *ihp, ipmi_entity_t *ep, void *data) 1052eeaed14Srobj { 1062eeaed14Srobj int indentation = (uintptr_t)data; 1072eeaed14Srobj char name[128]; 1082eeaed14Srobj boolean_t present; 1092eeaed14Srobj 1102eeaed14Srobj ipmi_entity_name(ep->ie_type, name, sizeof (name)); 1112eeaed14Srobj (void) snprintf(name + strlen(name), sizeof (name) - strlen(name), 1122eeaed14Srobj " %d", ep->ie_instance); 1132eeaed14Srobj 1142eeaed14Srobj if (ipmi_entity_present(ihp, ep, &present) != 0) { 1152eeaed14Srobj (void) printf("%*s%-*s %s (%s)\n", indentation, "", 1162eeaed14Srobj 24 - indentation, name, "unknown", ipmi_errmsg(ihp)); 1172eeaed14Srobj } else { 1182eeaed14Srobj (void) printf("%*s%-*s %s\n", indentation, "", 1192eeaed14Srobj 24 - indentation, name, present ? "present" : "absent"); 1202eeaed14Srobj } 121888e0559SRobert Johnston (void) ipmi_entity_iter_sdr(ihp, ep, sdr_print, 122888e0559SRobert Johnston (void *)(indentation + 2)); 1232eeaed14Srobj 1242eeaed14Srobj if (ep->ie_children != 0) 1252eeaed14Srobj (void) ipmi_entity_iter_children(ihp, ep, entity_print, 1262eeaed14Srobj (void *)(indentation + 2)); 1272eeaed14Srobj return (0); 1282eeaed14Srobj } 1292eeaed14Srobj 1302eeaed14Srobj int 1312eeaed14Srobj main(int argc, char **argv) 1322eeaed14Srobj { 1332eeaed14Srobj ipmi_handle_t *ihp; 1342eeaed14Srobj char *errmsg; 135*81d9f076SRobert Johnston uint_t xport_type; 136*81d9f076SRobert Johnston char c, *host = NULL, *user = NULL, *passwd = NULL; 1372eeaed14Srobj int err; 138*81d9f076SRobert Johnston nvlist_t *params = NULL; 1392eeaed14Srobj 140*81d9f076SRobert Johnston pname = argv[0]; 141*81d9f076SRobert Johnston while (optind < argc) { 142*81d9f076SRobert Johnston while ((c = getopt(argc, argv, optstr)) != -1) 143*81d9f076SRobert Johnston switch (c) { 144*81d9f076SRobert Johnston case 'h': 145*81d9f076SRobert Johnston host = optarg; 146*81d9f076SRobert Johnston break; 147*81d9f076SRobert Johnston case 'p': 148*81d9f076SRobert Johnston passwd = optarg; 149*81d9f076SRobert Johnston break; 150*81d9f076SRobert Johnston case 't': 151*81d9f076SRobert Johnston if (strcmp(optarg, "bmc") == 0) 152*81d9f076SRobert Johnston xport_type = IPMI_TRANSPORT_BMC; 153*81d9f076SRobert Johnston else if (strcmp(optarg, "lan") == 0) 154*81d9f076SRobert Johnston xport_type = IPMI_TRANSPORT_LAN; 155*81d9f076SRobert Johnston else { 156*81d9f076SRobert Johnston (void) fprintf(stderr, 157*81d9f076SRobert Johnston "ABORT: Invalid transport type\n"); 158*81d9f076SRobert Johnston usage(); 159*81d9f076SRobert Johnston } 160*81d9f076SRobert Johnston break; 161*81d9f076SRobert Johnston case 'u': 162*81d9f076SRobert Johnston user = optarg; 163*81d9f076SRobert Johnston break; 164*81d9f076SRobert Johnston default: 165*81d9f076SRobert Johnston usage(); 166*81d9f076SRobert Johnston return (1); 167*81d9f076SRobert Johnston } 168*81d9f076SRobert Johnston } 169*81d9f076SRobert Johnston 170*81d9f076SRobert Johnston if (xport_type == IPMI_TRANSPORT_LAN && 171*81d9f076SRobert Johnston (host == NULL || passwd == NULL || user == NULL)) { 172*81d9f076SRobert Johnston (void) fprintf(stderr, "-h/-u/-p must all be specified for " 173*81d9f076SRobert Johnston "transport type \"lan\"\n"); 174*81d9f076SRobert Johnston usage(); 175*81d9f076SRobert Johnston return (1); 176*81d9f076SRobert Johnston } 177*81d9f076SRobert Johnston if (xport_type == IPMI_TRANSPORT_LAN) { 178*81d9f076SRobert Johnston if (nvlist_alloc(¶ms, NV_UNIQUE_NAME, 0) || 179*81d9f076SRobert Johnston nvlist_add_string(params, IPMI_LAN_HOST, host) || 180*81d9f076SRobert Johnston nvlist_add_string(params, IPMI_LAN_USER, user) || 181*81d9f076SRobert Johnston nvlist_add_string(params, IPMI_LAN_PASSWD, passwd)) { 182*81d9f076SRobert Johnston (void) fprintf(stderr, 183*81d9f076SRobert Johnston "ABORT: nvlist construction failed\n"); 184*81d9f076SRobert Johnston return (1); 185*81d9f076SRobert Johnston } 186*81d9f076SRobert Johnston } 187*81d9f076SRobert Johnston if ((ihp = ipmi_open(&err, &errmsg, xport_type, params)) == NULL) { 1882eeaed14Srobj (void) fprintf(stderr, "failed to open libipmi: %s\n", 1892eeaed14Srobj errmsg); 1902eeaed14Srobj return (1); 1912eeaed14Srobj } 1922eeaed14Srobj 1932eeaed14Srobj (void) printf("%-24s %-8s %12s %12s %5s\n", 1942eeaed14Srobj "ENTITY/SENSOR", "PRESENT", "SENSOR", "READING", "STATE"); 1952eeaed14Srobj (void) printf("----------------------- -------- ------------- " 1962eeaed14Srobj "------------ -----\n"); 1972eeaed14Srobj if (ipmi_entity_iter(ihp, entity_print, NULL) != 0) { 1982eeaed14Srobj (void) fprintf(stderr, "failed to iterate entities: %s\n", 1992eeaed14Srobj ipmi_errmsg(ihp)); 2002eeaed14Srobj return (1); 2012eeaed14Srobj } 2022eeaed14Srobj 2032eeaed14Srobj ipmi_close(ihp); 2042eeaed14Srobj 2052eeaed14Srobj return (0); 2062eeaed14Srobj } 207