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
usage()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
sdr_print(ipmi_handle_t * ihp,ipmi_entity_t * ep,const char * name,ipmi_sdr_t * sdrp,void * data)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
entity_print(ipmi_handle_t * ihp,ipmi_entity_t * ep,void * data)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
main(int argc,char ** argv)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