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 /*
2281d9f076SRobert 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 
3081d9f076SRobert Johnston static const char *pname;
3181d9f076SRobert Johnston static const char optstr[] = "h:p:u:t:";
3281d9f076SRobert Johnston 
3381d9f076SRobert Johnston static void
usage()3481d9f076SRobert Johnston usage()
3581d9f076SRobert Johnston {
3681d9f076SRobert Johnston 	(void) fprintf(stderr,
3781d9f076SRobert Johnston 	    "Usage: %s [-t <bmc|lan>] [-h hostname] [-u username] "
3881d9f076SRobert Johnston 	    "[-p password]\n", pname);
3981d9f076SRobert Johnston }
4081d9f076SRobert 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;
13581d9f076SRobert Johnston 	uint_t xport_type;
136*ef150c2bSRichard Lowe 	char *host = NULL, *user = NULL, *passwd = NULL;
137*ef150c2bSRichard Lowe 	int c, err;
13881d9f076SRobert Johnston 	nvlist_t *params = NULL;
13981d9f076SRobert Johnston 
14081d9f076SRobert Johnston 	pname = argv[0];
14181d9f076SRobert Johnston 	while (optind < argc) {
14281d9f076SRobert Johnston 		while ((c = getopt(argc, argv, optstr)) != -1)
14381d9f076SRobert Johnston 			switch (c) {
14481d9f076SRobert Johnston 			case 'h':
14581d9f076SRobert Johnston 				host = optarg;
14681d9f076SRobert Johnston 				break;
14781d9f076SRobert Johnston 			case 'p':
14881d9f076SRobert Johnston 				passwd = optarg;
14981d9f076SRobert Johnston 				break;
15081d9f076SRobert Johnston 			case 't':
15181d9f076SRobert Johnston 				if (strcmp(optarg, "bmc") == 0)
15281d9f076SRobert Johnston 					xport_type = IPMI_TRANSPORT_BMC;
15381d9f076SRobert Johnston 				else if (strcmp(optarg, "lan") == 0)
15481d9f076SRobert Johnston 					xport_type = IPMI_TRANSPORT_LAN;
15581d9f076SRobert Johnston 				else {
15681d9f076SRobert Johnston 					(void) fprintf(stderr,
15781d9f076SRobert Johnston 					    "ABORT: Invalid transport type\n");
15881d9f076SRobert Johnston 					usage();
15981d9f076SRobert Johnston 				}
16081d9f076SRobert Johnston 				break;
16181d9f076SRobert Johnston 			case 'u':
16281d9f076SRobert Johnston 				user = optarg;
16381d9f076SRobert Johnston 				break;
16481d9f076SRobert Johnston 			default:
16581d9f076SRobert Johnston 				usage();
16681d9f076SRobert Johnston 				return (1);
16781d9f076SRobert Johnston 			}
16881d9f076SRobert Johnston 	}
1692eeaed14Srobj 
17081d9f076SRobert Johnston 	if (xport_type == IPMI_TRANSPORT_LAN &&
17181d9f076SRobert Johnston 	    (host == NULL || passwd == NULL || user == NULL)) {
17281d9f076SRobert Johnston 		(void) fprintf(stderr, "-h/-u/-p must all be specified for "
17381d9f076SRobert Johnston 		    "transport type \"lan\"\n");
17481d9f076SRobert Johnston 		usage();
17581d9f076SRobert Johnston 		return (1);
17681d9f076SRobert Johnston 	}
17781d9f076SRobert Johnston 	if (xport_type == IPMI_TRANSPORT_LAN) {
17881d9f076SRobert Johnston 		if (nvlist_alloc(&params, NV_UNIQUE_NAME, 0) ||
17981d9f076SRobert Johnston 		    nvlist_add_string(params, IPMI_LAN_HOST, host) ||
18081d9f076SRobert Johnston 		    nvlist_add_string(params, IPMI_LAN_USER, user) ||
18181d9f076SRobert Johnston 		    nvlist_add_string(params, IPMI_LAN_PASSWD, passwd)) {
18281d9f076SRobert Johnston 			(void) fprintf(stderr,
18381d9f076SRobert Johnston 			    "ABORT: nvlist construction failed\n");
18481d9f076SRobert Johnston 			return (1);
18581d9f076SRobert Johnston 		}
18681d9f076SRobert Johnston 	}
18781d9f076SRobert 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