xref: /onnv-gate/usr/src/cmd/cmd-inet/usr.sbin/ilbadm/ilbadm_hc.c (revision 10946:324bab2b3370)
1*10946SSangeeta.Misra@Sun.COM /*
2*10946SSangeeta.Misra@Sun.COM  * CDDL HEADER START
3*10946SSangeeta.Misra@Sun.COM  *
4*10946SSangeeta.Misra@Sun.COM  * The contents of this file are subject to the terms of the
5*10946SSangeeta.Misra@Sun.COM  * Common Development and Distribution License (the "License").
6*10946SSangeeta.Misra@Sun.COM  * You may not use this file except in compliance with the License.
7*10946SSangeeta.Misra@Sun.COM  *
8*10946SSangeeta.Misra@Sun.COM  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*10946SSangeeta.Misra@Sun.COM  * or http://www.opensolaris.org/os/licensing.
10*10946SSangeeta.Misra@Sun.COM  * See the License for the specific language governing permissions
11*10946SSangeeta.Misra@Sun.COM  * and limitations under the License.
12*10946SSangeeta.Misra@Sun.COM  *
13*10946SSangeeta.Misra@Sun.COM  * When distributing Covered Code, include this CDDL HEADER in each
14*10946SSangeeta.Misra@Sun.COM  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*10946SSangeeta.Misra@Sun.COM  * If applicable, add the following below this CDDL HEADER, with the
16*10946SSangeeta.Misra@Sun.COM  * fields enclosed by brackets "[]" replaced with your own identifying
17*10946SSangeeta.Misra@Sun.COM  * information: Portions Copyright [yyyy] [name of copyright owner]
18*10946SSangeeta.Misra@Sun.COM  *
19*10946SSangeeta.Misra@Sun.COM  * CDDL HEADER END
20*10946SSangeeta.Misra@Sun.COM  */
21*10946SSangeeta.Misra@Sun.COM 
22*10946SSangeeta.Misra@Sun.COM /*
23*10946SSangeeta.Misra@Sun.COM  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
24*10946SSangeeta.Misra@Sun.COM  * Use is subject to license terms.
25*10946SSangeeta.Misra@Sun.COM  */
26*10946SSangeeta.Misra@Sun.COM 
27*10946SSangeeta.Misra@Sun.COM #include <sys/types.h>
28*10946SSangeeta.Misra@Sun.COM #include <sys/socket.h>
29*10946SSangeeta.Misra@Sun.COM #include <sys/list.h>
30*10946SSangeeta.Misra@Sun.COM #include <netinet/in.h>
31*10946SSangeeta.Misra@Sun.COM #include <stdio.h>
32*10946SSangeeta.Misra@Sun.COM #include <unistd.h>
33*10946SSangeeta.Misra@Sun.COM #include <stdlib.h>
34*10946SSangeeta.Misra@Sun.COM #include <strings.h>
35*10946SSangeeta.Misra@Sun.COM #include <errno.h>
36*10946SSangeeta.Misra@Sun.COM #include <ofmt.h>
37*10946SSangeeta.Misra@Sun.COM #include <libilb.h>
38*10946SSangeeta.Misra@Sun.COM #include "ilbadm.h"
39*10946SSangeeta.Misra@Sun.COM 
40*10946SSangeeta.Misra@Sun.COM extern int	optind, optopt, opterr;
41*10946SSangeeta.Misra@Sun.COM extern char	*optarg;
42*10946SSangeeta.Misra@Sun.COM 
43*10946SSangeeta.Misra@Sun.COM typedef struct hc_export_arg {
44*10946SSangeeta.Misra@Sun.COM 	FILE	*fp;
45*10946SSangeeta.Misra@Sun.COM } hc_export_arg_t;
46*10946SSangeeta.Misra@Sun.COM 
47*10946SSangeeta.Misra@Sun.COM /* Maximum columns for printing hc output. */
48*10946SSangeeta.Misra@Sun.COM #define	SHOW_HC_COLS	80
49*10946SSangeeta.Misra@Sun.COM 
50*10946SSangeeta.Misra@Sun.COM /* OFMT call back to print out a hc server result field. */
51*10946SSangeeta.Misra@Sun.COM static boolean_t print_hc_result(ofmt_arg_t *, char *, uint_t);
52*10946SSangeeta.Misra@Sun.COM 
53*10946SSangeeta.Misra@Sun.COM /* ID to indicate which field to be printed. */
54*10946SSangeeta.Misra@Sun.COM enum hc_print_id {
55*10946SSangeeta.Misra@Sun.COM 	hc_of_rname, hc_of_hname, hc_of_sname, hc_of_status, hc_of_fail_cnt,
56*10946SSangeeta.Misra@Sun.COM 	hc_of_lasttime, hc_of_nexttime, hc_of_rtt,
57*10946SSangeeta.Misra@Sun.COM 	hc_of_name, hc_of_timeout, hc_of_count, hc_of_interval, hc_of_def_ping,
58*10946SSangeeta.Misra@Sun.COM 	hc_of_test
59*10946SSangeeta.Misra@Sun.COM };
60*10946SSangeeta.Misra@Sun.COM 
61*10946SSangeeta.Misra@Sun.COM /*
62*10946SSangeeta.Misra@Sun.COM  * Fields of a hc server result.  The sum of all fields' width is SHOW_HC_COLS.
63*10946SSangeeta.Misra@Sun.COM  */
64*10946SSangeeta.Misra@Sun.COM static ofmt_field_t hc_results[] = {
65*10946SSangeeta.Misra@Sun.COM 	{"RULENAME",	14,	hc_of_rname,	print_hc_result},
66*10946SSangeeta.Misra@Sun.COM 	{"HCNAME",	14,	hc_of_hname,	print_hc_result},
67*10946SSangeeta.Misra@Sun.COM 	{"SERVERID",	14,	hc_of_sname,	print_hc_result},
68*10946SSangeeta.Misra@Sun.COM 	{"STATUS",	9,	hc_of_status,	print_hc_result},
69*10946SSangeeta.Misra@Sun.COM 	{"FAIL",	5,	hc_of_fail_cnt,	print_hc_result},
70*10946SSangeeta.Misra@Sun.COM 	{"LAST",	9,	hc_of_lasttime,	print_hc_result},
71*10946SSangeeta.Misra@Sun.COM 	{"NEXT",	9,	hc_of_nexttime,	print_hc_result},
72*10946SSangeeta.Misra@Sun.COM 	{"RTT",		6,	hc_of_rtt,	print_hc_result},
73*10946SSangeeta.Misra@Sun.COM 	{NULL,		0,	0,		NULL}
74*10946SSangeeta.Misra@Sun.COM };
75*10946SSangeeta.Misra@Sun.COM 
76*10946SSangeeta.Misra@Sun.COM /* OFMT call back to print out a hc info field. */
77*10946SSangeeta.Misra@Sun.COM static boolean_t print_hc(ofmt_arg_t *, char *, uint_t);
78*10946SSangeeta.Misra@Sun.COM 
79*10946SSangeeta.Misra@Sun.COM /*
80*10946SSangeeta.Misra@Sun.COM  * Fields of a hc info.  The sume of all fields' width is SHOW_HC_COLS.
81*10946SSangeeta.Misra@Sun.COM  */
82*10946SSangeeta.Misra@Sun.COM static ofmt_field_t hc_fields[] = {
83*10946SSangeeta.Misra@Sun.COM 	{"HCNAME",	14,	hc_of_name,	print_hc},
84*10946SSangeeta.Misra@Sun.COM 	{"TIMEOUT",	8,	hc_of_timeout,	print_hc},
85*10946SSangeeta.Misra@Sun.COM 	{"COUNT",	8,	hc_of_count,	print_hc},
86*10946SSangeeta.Misra@Sun.COM 	{"INTERVAL",	9,	hc_of_interval,	print_hc},
87*10946SSangeeta.Misra@Sun.COM 	{"DEF_PING",	9,	hc_of_def_ping,	print_hc},
88*10946SSangeeta.Misra@Sun.COM 	{"TEST",	32,	hc_of_test,	print_hc},
89*10946SSangeeta.Misra@Sun.COM 	{NULL,		0,	0,		NULL}
90*10946SSangeeta.Misra@Sun.COM };
91*10946SSangeeta.Misra@Sun.COM 
92*10946SSangeeta.Misra@Sun.COM static boolean_t
print_hc(ofmt_arg_t * of_arg,char * buf,uint_t bufsize)93*10946SSangeeta.Misra@Sun.COM print_hc(ofmt_arg_t *of_arg, char *buf, uint_t bufsize)
94*10946SSangeeta.Misra@Sun.COM {
95*10946SSangeeta.Misra@Sun.COM 	enum hc_print_id id = of_arg->ofmt_id;
96*10946SSangeeta.Misra@Sun.COM 	ilb_hc_info_t *info = (ilb_hc_info_t *)of_arg->ofmt_cbarg;
97*10946SSangeeta.Misra@Sun.COM 
98*10946SSangeeta.Misra@Sun.COM 	switch (id) {
99*10946SSangeeta.Misra@Sun.COM 	case hc_of_name:
100*10946SSangeeta.Misra@Sun.COM 		(void) strlcpy(buf, info->hci_name, bufsize);
101*10946SSangeeta.Misra@Sun.COM 		break;
102*10946SSangeeta.Misra@Sun.COM 	case hc_of_timeout:
103*10946SSangeeta.Misra@Sun.COM 		(void) snprintf(buf, bufsize, "%d", info->hci_timeout);
104*10946SSangeeta.Misra@Sun.COM 		break;
105*10946SSangeeta.Misra@Sun.COM 	case hc_of_count:
106*10946SSangeeta.Misra@Sun.COM 		(void) snprintf(buf, bufsize, "%d", info->hci_count);
107*10946SSangeeta.Misra@Sun.COM 		break;
108*10946SSangeeta.Misra@Sun.COM 	case hc_of_interval:
109*10946SSangeeta.Misra@Sun.COM 		(void) snprintf(buf, bufsize, "%d", info->hci_interval);
110*10946SSangeeta.Misra@Sun.COM 		break;
111*10946SSangeeta.Misra@Sun.COM 	case hc_of_def_ping:
112*10946SSangeeta.Misra@Sun.COM 		(void) snprintf(buf, bufsize, "%c",
113*10946SSangeeta.Misra@Sun.COM 		    info->hci_def_ping ? 'Y' : 'N');
114*10946SSangeeta.Misra@Sun.COM 		break;
115*10946SSangeeta.Misra@Sun.COM 	case hc_of_test:
116*10946SSangeeta.Misra@Sun.COM 		(void) snprintf(buf, bufsize, "%s", info->hci_test);
117*10946SSangeeta.Misra@Sun.COM 		break;
118*10946SSangeeta.Misra@Sun.COM 	}
119*10946SSangeeta.Misra@Sun.COM 	return (B_TRUE);
120*10946SSangeeta.Misra@Sun.COM }
121*10946SSangeeta.Misra@Sun.COM 
122*10946SSangeeta.Misra@Sun.COM /* Call back to ilb_walk_hc(). */
123*10946SSangeeta.Misra@Sun.COM /* ARGSUSED */
124*10946SSangeeta.Misra@Sun.COM static ilb_status_t
ilbadm_print_hc(ilb_handle_t h,ilb_hc_info_t * hc_info,void * arg)125*10946SSangeeta.Misra@Sun.COM ilbadm_print_hc(ilb_handle_t h, ilb_hc_info_t *hc_info, void *arg)
126*10946SSangeeta.Misra@Sun.COM {
127*10946SSangeeta.Misra@Sun.COM 	ofmt_handle_t	ofmt_h = arg;
128*10946SSangeeta.Misra@Sun.COM 
129*10946SSangeeta.Misra@Sun.COM 	ofmt_print(ofmt_h, hc_info);
130*10946SSangeeta.Misra@Sun.COM 	return (ILB_STATUS_OK);
131*10946SSangeeta.Misra@Sun.COM }
132*10946SSangeeta.Misra@Sun.COM 
133*10946SSangeeta.Misra@Sun.COM /*
134*10946SSangeeta.Misra@Sun.COM  * Print out health check objects given their name.
135*10946SSangeeta.Misra@Sun.COM  * Or print out all health check objects if no name given.
136*10946SSangeeta.Misra@Sun.COM  */
137*10946SSangeeta.Misra@Sun.COM /* ARGSUSED */
138*10946SSangeeta.Misra@Sun.COM ilbadm_status_t
ilbadm_show_hc(int argc,char * argv[])139*10946SSangeeta.Misra@Sun.COM ilbadm_show_hc(int argc, char *argv[])
140*10946SSangeeta.Misra@Sun.COM {
141*10946SSangeeta.Misra@Sun.COM 	ilb_handle_t	h = ILB_INVALID_HANDLE;
142*10946SSangeeta.Misra@Sun.COM 	ilb_status_t	rclib;
143*10946SSangeeta.Misra@Sun.COM 	ofmt_handle_t	ofmt_h;
144*10946SSangeeta.Misra@Sun.COM 	ofmt_status_t	ofmt_ret;
145*10946SSangeeta.Misra@Sun.COM 
146*10946SSangeeta.Misra@Sun.COM 	if ((ofmt_ret = ofmt_open("all", hc_fields, 0, SHOW_HC_COLS,
147*10946SSangeeta.Misra@Sun.COM 	    &ofmt_h)) != OFMT_SUCCESS) {
148*10946SSangeeta.Misra@Sun.COM 		char err_buf[SHOW_HC_COLS];
149*10946SSangeeta.Misra@Sun.COM 
150*10946SSangeeta.Misra@Sun.COM 		ilbadm_err(gettext("ofmt_open failed: %s"),
151*10946SSangeeta.Misra@Sun.COM 		    ofmt_strerror(ofmt_h, ofmt_ret, err_buf, SHOW_HC_COLS));
152*10946SSangeeta.Misra@Sun.COM 		return (ILBADM_LIBERR);
153*10946SSangeeta.Misra@Sun.COM 	}
154*10946SSangeeta.Misra@Sun.COM 	rclib = ilb_open(&h);
155*10946SSangeeta.Misra@Sun.COM 	if (rclib != ILB_STATUS_OK)
156*10946SSangeeta.Misra@Sun.COM 		goto out;
157*10946SSangeeta.Misra@Sun.COM 
158*10946SSangeeta.Misra@Sun.COM 	if (argc == 1) {
159*10946SSangeeta.Misra@Sun.COM 		rclib = ilb_walk_hc(h, ilbadm_print_hc, ofmt_h);
160*10946SSangeeta.Misra@Sun.COM 	} else {
161*10946SSangeeta.Misra@Sun.COM 		ilb_hc_info_t hc_info;
162*10946SSangeeta.Misra@Sun.COM 		int i;
163*10946SSangeeta.Misra@Sun.COM 
164*10946SSangeeta.Misra@Sun.COM 		for (i = 1; i < argc; i++) {
165*10946SSangeeta.Misra@Sun.COM 			rclib = ilb_get_hc_info(h, argv[i], &hc_info);
166*10946SSangeeta.Misra@Sun.COM 			if (rclib == ILB_STATUS_OK)
167*10946SSangeeta.Misra@Sun.COM 				ofmt_print(ofmt_h, &hc_info);
168*10946SSangeeta.Misra@Sun.COM 			else
169*10946SSangeeta.Misra@Sun.COM 				break;
170*10946SSangeeta.Misra@Sun.COM 		}
171*10946SSangeeta.Misra@Sun.COM 	}
172*10946SSangeeta.Misra@Sun.COM out:
173*10946SSangeeta.Misra@Sun.COM 	ofmt_close(ofmt_h);
174*10946SSangeeta.Misra@Sun.COM 
175*10946SSangeeta.Misra@Sun.COM 	if (h != ILB_INVALID_HANDLE)
176*10946SSangeeta.Misra@Sun.COM 		(void) ilb_close(h);
177*10946SSangeeta.Misra@Sun.COM 
178*10946SSangeeta.Misra@Sun.COM 	if (rclib != ILB_STATUS_OK) {
179*10946SSangeeta.Misra@Sun.COM 		ilbadm_err(ilb_errstr(rclib));
180*10946SSangeeta.Misra@Sun.COM 		return (ILBADM_LIBERR);
181*10946SSangeeta.Misra@Sun.COM 	}
182*10946SSangeeta.Misra@Sun.COM 
183*10946SSangeeta.Misra@Sun.COM 	return (ILBADM_OK);
184*10946SSangeeta.Misra@Sun.COM }
185*10946SSangeeta.Misra@Sun.COM 
186*10946SSangeeta.Misra@Sun.COM static boolean_t
print_hc_result(ofmt_arg_t * of_arg,char * buf,uint_t bufsize)187*10946SSangeeta.Misra@Sun.COM print_hc_result(ofmt_arg_t *of_arg, char *buf, uint_t bufsize)
188*10946SSangeeta.Misra@Sun.COM {
189*10946SSangeeta.Misra@Sun.COM 	enum hc_print_id id = of_arg->ofmt_id;
190*10946SSangeeta.Misra@Sun.COM 	ilb_hc_srv_t *srv = (ilb_hc_srv_t *)of_arg->ofmt_cbarg;
191*10946SSangeeta.Misra@Sun.COM 	struct tm tv;
192*10946SSangeeta.Misra@Sun.COM 
193*10946SSangeeta.Misra@Sun.COM 	switch (id) {
194*10946SSangeeta.Misra@Sun.COM 	case hc_of_rname:
195*10946SSangeeta.Misra@Sun.COM 		(void) strlcpy(buf, srv->hcs_rule_name, bufsize);
196*10946SSangeeta.Misra@Sun.COM 		break;
197*10946SSangeeta.Misra@Sun.COM 	case hc_of_hname:
198*10946SSangeeta.Misra@Sun.COM 		(void) strlcpy(buf, srv->hcs_hc_name, bufsize);
199*10946SSangeeta.Misra@Sun.COM 		break;
200*10946SSangeeta.Misra@Sun.COM 	case hc_of_sname:
201*10946SSangeeta.Misra@Sun.COM 		(void) strlcpy(buf, srv->hcs_ID, bufsize);
202*10946SSangeeta.Misra@Sun.COM 		break;
203*10946SSangeeta.Misra@Sun.COM 	case hc_of_status:
204*10946SSangeeta.Misra@Sun.COM 		switch (srv->hcs_status) {
205*10946SSangeeta.Misra@Sun.COM 		case ILB_HCS_UNINIT:
206*10946SSangeeta.Misra@Sun.COM 			(void) strlcpy(buf, "un-init", bufsize);
207*10946SSangeeta.Misra@Sun.COM 			break;
208*10946SSangeeta.Misra@Sun.COM 		case ILB_HCS_UNREACH:
209*10946SSangeeta.Misra@Sun.COM 			(void) strlcpy(buf, "unreach", bufsize);
210*10946SSangeeta.Misra@Sun.COM 			break;
211*10946SSangeeta.Misra@Sun.COM 		case ILB_HCS_ALIVE:
212*10946SSangeeta.Misra@Sun.COM 			(void) strlcpy(buf, "alive", bufsize);
213*10946SSangeeta.Misra@Sun.COM 			break;
214*10946SSangeeta.Misra@Sun.COM 		case ILB_HCS_DEAD:
215*10946SSangeeta.Misra@Sun.COM 			(void) strlcpy(buf, "dead", bufsize);
216*10946SSangeeta.Misra@Sun.COM 			break;
217*10946SSangeeta.Misra@Sun.COM 		case ILB_HCS_DISABLED:
218*10946SSangeeta.Misra@Sun.COM 			(void) strlcpy(buf, "disabled", bufsize);
219*10946SSangeeta.Misra@Sun.COM 			break;
220*10946SSangeeta.Misra@Sun.COM 		}
221*10946SSangeeta.Misra@Sun.COM 		break;
222*10946SSangeeta.Misra@Sun.COM 	case hc_of_fail_cnt:
223*10946SSangeeta.Misra@Sun.COM 		(void) snprintf(buf, bufsize, "%u", srv->hcs_fail_cnt);
224*10946SSangeeta.Misra@Sun.COM 		break;
225*10946SSangeeta.Misra@Sun.COM 	case hc_of_lasttime:
226*10946SSangeeta.Misra@Sun.COM 		if (localtime_r(&srv->hcs_lasttime, &tv) == NULL)
227*10946SSangeeta.Misra@Sun.COM 			return (B_FALSE);
228*10946SSangeeta.Misra@Sun.COM 		(void) snprintf(buf, bufsize, "%02d:%02d:%02d", tv.tm_hour,
229*10946SSangeeta.Misra@Sun.COM 		    tv.tm_min, tv.tm_sec);
230*10946SSangeeta.Misra@Sun.COM 		break;
231*10946SSangeeta.Misra@Sun.COM 	case hc_of_nexttime:
232*10946SSangeeta.Misra@Sun.COM 		if (srv->hcs_status == ILB_HCS_DISABLED)
233*10946SSangeeta.Misra@Sun.COM 			break;
234*10946SSangeeta.Misra@Sun.COM 		if (localtime_r(&srv->hcs_nexttime, &tv) == NULL)
235*10946SSangeeta.Misra@Sun.COM 			return (B_FALSE);
236*10946SSangeeta.Misra@Sun.COM 		(void) snprintf(buf, bufsize, "%02d:%02d:%02d", tv.tm_hour,
237*10946SSangeeta.Misra@Sun.COM 		    tv.tm_min, tv.tm_sec);
238*10946SSangeeta.Misra@Sun.COM 		break;
239*10946SSangeeta.Misra@Sun.COM 	case hc_of_rtt:
240*10946SSangeeta.Misra@Sun.COM 		(void) snprintf(buf, bufsize, "%u", srv->hcs_rtt);
241*10946SSangeeta.Misra@Sun.COM 		break;
242*10946SSangeeta.Misra@Sun.COM 	}
243*10946SSangeeta.Misra@Sun.COM 	return (B_TRUE);
244*10946SSangeeta.Misra@Sun.COM }
245*10946SSangeeta.Misra@Sun.COM 
246*10946SSangeeta.Misra@Sun.COM /* Call back to ilbd_walk_hc_srvs(). */
247*10946SSangeeta.Misra@Sun.COM /* ARGSUSED */
248*10946SSangeeta.Misra@Sun.COM static ilb_status_t
ilbadm_print_hc_result(ilb_handle_t h,ilb_hc_srv_t * srv,void * arg)249*10946SSangeeta.Misra@Sun.COM ilbadm_print_hc_result(ilb_handle_t h, ilb_hc_srv_t *srv, void *arg)
250*10946SSangeeta.Misra@Sun.COM {
251*10946SSangeeta.Misra@Sun.COM 	ofmt_handle_t	ofmt_h = arg;
252*10946SSangeeta.Misra@Sun.COM 
253*10946SSangeeta.Misra@Sun.COM 	ofmt_print(ofmt_h, srv);
254*10946SSangeeta.Misra@Sun.COM 	return (ILB_STATUS_OK);
255*10946SSangeeta.Misra@Sun.COM }
256*10946SSangeeta.Misra@Sun.COM 
257*10946SSangeeta.Misra@Sun.COM /*
258*10946SSangeeta.Misra@Sun.COM  * Output hc result of a specified rule or all rules.
259*10946SSangeeta.Misra@Sun.COM  */
260*10946SSangeeta.Misra@Sun.COM ilbadm_status_t
ilbadm_show_hc_result(int argc,char * argv[])261*10946SSangeeta.Misra@Sun.COM ilbadm_show_hc_result(int argc, char *argv[])
262*10946SSangeeta.Misra@Sun.COM {
263*10946SSangeeta.Misra@Sun.COM 	ilb_handle_t	h = ILB_INVALID_HANDLE;
264*10946SSangeeta.Misra@Sun.COM 	ilb_status_t 	rclib = ILB_STATUS_OK;
265*10946SSangeeta.Misra@Sun.COM 	int		i;
266*10946SSangeeta.Misra@Sun.COM 	ofmt_handle_t	ofmt_h;
267*10946SSangeeta.Misra@Sun.COM 	ofmt_status_t	ofmt_ret;
268*10946SSangeeta.Misra@Sun.COM 
269*10946SSangeeta.Misra@Sun.COM 	/* ilbadm show-hc-result [rule-name] */
270*10946SSangeeta.Misra@Sun.COM 	if (argc < 1) {
271*10946SSangeeta.Misra@Sun.COM 		ilbadm_err(gettext("usage: ilbadm show-hc-result"
272*10946SSangeeta.Misra@Sun.COM 		    " [rule-name]"));
273*10946SSangeeta.Misra@Sun.COM 		return (ILBADM_LIBERR);
274*10946SSangeeta.Misra@Sun.COM 	}
275*10946SSangeeta.Misra@Sun.COM 
276*10946SSangeeta.Misra@Sun.COM 	if ((ofmt_ret = ofmt_open("all", hc_results, 0, SHOW_HC_COLS,
277*10946SSangeeta.Misra@Sun.COM 	    &ofmt_h)) != OFMT_SUCCESS) {
278*10946SSangeeta.Misra@Sun.COM 		char err_buf[SHOW_HC_COLS];
279*10946SSangeeta.Misra@Sun.COM 
280*10946SSangeeta.Misra@Sun.COM 		ilbadm_err(gettext("ofmt_open failed: %s"),
281*10946SSangeeta.Misra@Sun.COM 		    ofmt_strerror(ofmt_h, ofmt_ret, err_buf, SHOW_HC_COLS));
282*10946SSangeeta.Misra@Sun.COM 		return (ILBADM_LIBERR);
283*10946SSangeeta.Misra@Sun.COM 	}
284*10946SSangeeta.Misra@Sun.COM 
285*10946SSangeeta.Misra@Sun.COM 	rclib = ilb_open(&h);
286*10946SSangeeta.Misra@Sun.COM 	if (rclib != ILB_STATUS_OK)
287*10946SSangeeta.Misra@Sun.COM 		goto out;
288*10946SSangeeta.Misra@Sun.COM 
289*10946SSangeeta.Misra@Sun.COM 	/* If no rule name is given, show results for all rules. */
290*10946SSangeeta.Misra@Sun.COM 	if (argc == 1) {
291*10946SSangeeta.Misra@Sun.COM 		rclib = ilb_walk_hc_srvs(h, ilbadm_print_hc_result, NULL,
292*10946SSangeeta.Misra@Sun.COM 		    ofmt_h);
293*10946SSangeeta.Misra@Sun.COM 	} else {
294*10946SSangeeta.Misra@Sun.COM 		for (i = 1; i < argc; i++) {
295*10946SSangeeta.Misra@Sun.COM 			rclib = ilb_walk_hc_srvs(h, ilbadm_print_hc_result,
296*10946SSangeeta.Misra@Sun.COM 			    argv[i], ofmt_h);
297*10946SSangeeta.Misra@Sun.COM 			if (rclib != ILB_STATUS_OK)
298*10946SSangeeta.Misra@Sun.COM 				break;
299*10946SSangeeta.Misra@Sun.COM 		}
300*10946SSangeeta.Misra@Sun.COM 	}
301*10946SSangeeta.Misra@Sun.COM out:
302*10946SSangeeta.Misra@Sun.COM 	ofmt_close(ofmt_h);
303*10946SSangeeta.Misra@Sun.COM 
304*10946SSangeeta.Misra@Sun.COM 	if (h != ILB_INVALID_HANDLE)
305*10946SSangeeta.Misra@Sun.COM 		(void) ilb_close(h);
306*10946SSangeeta.Misra@Sun.COM 
307*10946SSangeeta.Misra@Sun.COM 	if (rclib != ILB_STATUS_OK) {
308*10946SSangeeta.Misra@Sun.COM 		ilbadm_err(ilb_errstr(rclib));
309*10946SSangeeta.Misra@Sun.COM 		return (ILBADM_LIBERR);
310*10946SSangeeta.Misra@Sun.COM 	}
311*10946SSangeeta.Misra@Sun.COM 	return (ILBADM_OK);
312*10946SSangeeta.Misra@Sun.COM }
313*10946SSangeeta.Misra@Sun.COM 
314*10946SSangeeta.Misra@Sun.COM #define	ILBADM_DEF_HC_COUNT	3
315*10946SSangeeta.Misra@Sun.COM #define	ILBADM_DEF_HC_INTERVAL	30	/* in sec */
316*10946SSangeeta.Misra@Sun.COM #define	ILBADM_DEF_HC_TIMEOUT	5	/* in sec */
317*10946SSangeeta.Misra@Sun.COM 
318*10946SSangeeta.Misra@Sun.COM static ilbadm_key_name_t hc_parse_keys[] = {
319*10946SSangeeta.Misra@Sun.COM 	{ILB_KEY_HC_TEST, "hc-test", "hc-test"},
320*10946SSangeeta.Misra@Sun.COM 	{ILB_KEY_HC_COUNT, "hc-count", "hc-count"},
321*10946SSangeeta.Misra@Sun.COM 	{ILB_KEY_HC_TIMEOUT, "hc-timeout", "hc-tout"},
322*10946SSangeeta.Misra@Sun.COM 	{ILB_KEY_HC_INTERVAL, "hc-interval", "hc-intl"},
323*10946SSangeeta.Misra@Sun.COM 	{ILB_KEY_BAD, "", ""}
324*10946SSangeeta.Misra@Sun.COM };
325*10946SSangeeta.Misra@Sun.COM 
326*10946SSangeeta.Misra@Sun.COM static ilbadm_status_t
ilbadm_hc_parse_arg(char * arg,ilb_hc_info_t * hc)327*10946SSangeeta.Misra@Sun.COM ilbadm_hc_parse_arg(char *arg, ilb_hc_info_t *hc)
328*10946SSangeeta.Misra@Sun.COM {
329*10946SSangeeta.Misra@Sun.COM 	ilbadm_status_t ret;
330*10946SSangeeta.Misra@Sun.COM 
331*10946SSangeeta.Misra@Sun.COM 	/* set default value for count, interval, timeout */
332*10946SSangeeta.Misra@Sun.COM 	hc->hci_count = ILBADM_DEF_HC_COUNT;
333*10946SSangeeta.Misra@Sun.COM 	hc->hci_interval = ILBADM_DEF_HC_INTERVAL;
334*10946SSangeeta.Misra@Sun.COM 	hc->hci_timeout = ILBADM_DEF_HC_TIMEOUT;
335*10946SSangeeta.Misra@Sun.COM 	hc->hci_test[0] = '\0';
336*10946SSangeeta.Misra@Sun.COM 
337*10946SSangeeta.Misra@Sun.COM 	ret = i_parse_optstring(arg, hc, hc_parse_keys, 0, NULL);
338*10946SSangeeta.Misra@Sun.COM 	if (ret != ILBADM_OK && ret != ILBADM_LIBERR) {
339*10946SSangeeta.Misra@Sun.COM 		ilbadm_err(ilbadm_errstr(ret));
340*10946SSangeeta.Misra@Sun.COM 		return (ILBADM_LIBERR);
341*10946SSangeeta.Misra@Sun.COM 	}
342*10946SSangeeta.Misra@Sun.COM 	if (hc->hci_test[0] == '\0' && ret != ILBADM_LIBERR) {
343*10946SSangeeta.Misra@Sun.COM 		ilbadm_err("hc-test: missing");
344*10946SSangeeta.Misra@Sun.COM 		return (ILBADM_LIBERR);
345*10946SSangeeta.Misra@Sun.COM 	}
346*10946SSangeeta.Misra@Sun.COM 	return (ret);
347*10946SSangeeta.Misra@Sun.COM }
348*10946SSangeeta.Misra@Sun.COM 
349*10946SSangeeta.Misra@Sun.COM /* ARGSUSED */
350*10946SSangeeta.Misra@Sun.COM ilbadm_status_t
ilbadm_create_hc(int argc,char * argv[])351*10946SSangeeta.Misra@Sun.COM ilbadm_create_hc(int argc, char *argv[])
352*10946SSangeeta.Misra@Sun.COM {
353*10946SSangeeta.Misra@Sun.COM 	ilb_handle_t	h = ILB_INVALID_HANDLE;
354*10946SSangeeta.Misra@Sun.COM 	ilb_hc_info_t	hc_info;
355*10946SSangeeta.Misra@Sun.COM 	ilbadm_status_t	ret = ILBADM_OK;
356*10946SSangeeta.Misra@Sun.COM 	ilb_status_t	rclib;
357*10946SSangeeta.Misra@Sun.COM 	char		c;
358*10946SSangeeta.Misra@Sun.COM 
359*10946SSangeeta.Misra@Sun.COM 
360*10946SSangeeta.Misra@Sun.COM 	hc_info.hci_def_ping = B_TRUE;
361*10946SSangeeta.Misra@Sun.COM 	while ((c = getopt(argc, argv, ":h:n")) != -1) {
362*10946SSangeeta.Misra@Sun.COM 		if (c == 'h') {
363*10946SSangeeta.Misra@Sun.COM 			ret = ilbadm_hc_parse_arg(optarg, &hc_info);
364*10946SSangeeta.Misra@Sun.COM 			if (ret != ILBADM_OK)
365*10946SSangeeta.Misra@Sun.COM 				return (ret);
366*10946SSangeeta.Misra@Sun.COM 		} else if (c == 'n') {
367*10946SSangeeta.Misra@Sun.COM 			hc_info.hci_def_ping = B_FALSE;
368*10946SSangeeta.Misra@Sun.COM 		} else {
369*10946SSangeeta.Misra@Sun.COM 			ilbadm_err(gettext("bad argument %c"), c);
370*10946SSangeeta.Misra@Sun.COM 			return (ILBADM_LIBERR);
371*10946SSangeeta.Misra@Sun.COM 		}
372*10946SSangeeta.Misra@Sun.COM 	}
373*10946SSangeeta.Misra@Sun.COM 
374*10946SSangeeta.Misra@Sun.COM 	if (optind >= argc) {
375*10946SSangeeta.Misra@Sun.COM 		ilbadm_err(gettext("usage: ilbadm"
376*10946SSangeeta.Misra@Sun.COM 		    " create-healthcheck [-n] -h"
377*10946SSangeeta.Misra@Sun.COM 		    " hc-test=val[,hc-timeout=val][,hc-count=va]"
378*10946SSangeeta.Misra@Sun.COM 		    "[,hc-interval=val]  hc-name"));
379*10946SSangeeta.Misra@Sun.COM 		return (ILBADM_FAIL);
380*10946SSangeeta.Misra@Sun.COM 	}
381*10946SSangeeta.Misra@Sun.COM 
382*10946SSangeeta.Misra@Sun.COM 	if (strlen(argv[optind]) > ILBD_NAMESZ - 1) {
383*10946SSangeeta.Misra@Sun.COM 		ilbadm_err(gettext("health check object name %s is too long - "
384*10946SSangeeta.Misra@Sun.COM 		    "must not exceed %d chars"), argv[optind],
385*10946SSangeeta.Misra@Sun.COM 		    ILBD_NAMESZ - 1);
386*10946SSangeeta.Misra@Sun.COM 		return (ILBADM_FAIL);
387*10946SSangeeta.Misra@Sun.COM 	}
388*10946SSangeeta.Misra@Sun.COM 
389*10946SSangeeta.Misra@Sun.COM 	if (((strcasecmp(hc_info.hci_test, ILB_HC_STR_UDP) == 0) ||
390*10946SSangeeta.Misra@Sun.COM 	    (strcasecmp(hc_info.hci_test, ILB_HC_STR_PING) == 0)) &&
391*10946SSangeeta.Misra@Sun.COM 	    !(hc_info.hci_def_ping)) {
392*10946SSangeeta.Misra@Sun.COM 		ilbadm_err(gettext("cannot disable default PING"
393*10946SSangeeta.Misra@Sun.COM 		    " for this test"));
394*10946SSangeeta.Misra@Sun.COM 		return (ILBADM_LIBERR);
395*10946SSangeeta.Misra@Sun.COM 	}
396*10946SSangeeta.Misra@Sun.COM 
397*10946SSangeeta.Misra@Sun.COM 	rclib = ilb_open(&h);
398*10946SSangeeta.Misra@Sun.COM 	if (rclib != ILB_STATUS_OK)
399*10946SSangeeta.Misra@Sun.COM 		goto out;
400*10946SSangeeta.Misra@Sun.COM 
401*10946SSangeeta.Misra@Sun.COM 	(void) strlcpy(hc_info.hci_name, argv[optind],
402*10946SSangeeta.Misra@Sun.COM 	    sizeof (hc_info.hci_name));
403*10946SSangeeta.Misra@Sun.COM 	rclib = ilb_create_hc(h, &hc_info);
404*10946SSangeeta.Misra@Sun.COM out:
405*10946SSangeeta.Misra@Sun.COM 	if (h != ILB_INVALID_HANDLE)
406*10946SSangeeta.Misra@Sun.COM 		(void) ilb_close(h);
407*10946SSangeeta.Misra@Sun.COM 
408*10946SSangeeta.Misra@Sun.COM 	if (rclib != ILB_STATUS_OK) {
409*10946SSangeeta.Misra@Sun.COM 		ilbadm_err(ilb_errstr(rclib));
410*10946SSangeeta.Misra@Sun.COM 		ret = ILBADM_LIBERR;
411*10946SSangeeta.Misra@Sun.COM 	}
412*10946SSangeeta.Misra@Sun.COM 	return (ret);
413*10946SSangeeta.Misra@Sun.COM }
414*10946SSangeeta.Misra@Sun.COM 
415*10946SSangeeta.Misra@Sun.COM ilbadm_status_t
ilbadm_destroy_hc(int argc,char * argv[])416*10946SSangeeta.Misra@Sun.COM ilbadm_destroy_hc(int argc, char *argv[])
417*10946SSangeeta.Misra@Sun.COM {
418*10946SSangeeta.Misra@Sun.COM 	ilb_handle_t	h = ILB_INVALID_HANDLE;
419*10946SSangeeta.Misra@Sun.COM 	ilb_status_t	rclib;
420*10946SSangeeta.Misra@Sun.COM 	ilbadm_status_t ret = ILBADM_OK;
421*10946SSangeeta.Misra@Sun.COM 	int		i;
422*10946SSangeeta.Misra@Sun.COM 
423*10946SSangeeta.Misra@Sun.COM 	if (argc < 2) {
424*10946SSangeeta.Misra@Sun.COM 		ilbadm_err(gettext("usage: ilbadm"
425*10946SSangeeta.Misra@Sun.COM 		    " delete-healthcheck hc-name ..."));
426*10946SSangeeta.Misra@Sun.COM 		return (ILBADM_LIBERR);
427*10946SSangeeta.Misra@Sun.COM 	}
428*10946SSangeeta.Misra@Sun.COM 
429*10946SSangeeta.Misra@Sun.COM 	rclib = ilb_open(&h);
430*10946SSangeeta.Misra@Sun.COM 	if (rclib != ILB_STATUS_OK)
431*10946SSangeeta.Misra@Sun.COM 		goto out;
432*10946SSangeeta.Misra@Sun.COM 
433*10946SSangeeta.Misra@Sun.COM 	for (i = 1; i < argc; i++) {
434*10946SSangeeta.Misra@Sun.COM 		rclib = ilb_destroy_hc(h, argv[i]);
435*10946SSangeeta.Misra@Sun.COM 		if (rclib != ILB_STATUS_OK)
436*10946SSangeeta.Misra@Sun.COM 			break;
437*10946SSangeeta.Misra@Sun.COM 	}
438*10946SSangeeta.Misra@Sun.COM out:
439*10946SSangeeta.Misra@Sun.COM 	if (h != ILB_INVALID_HANDLE)
440*10946SSangeeta.Misra@Sun.COM 		(void) ilb_close(h);
441*10946SSangeeta.Misra@Sun.COM 
442*10946SSangeeta.Misra@Sun.COM 	if (rclib != ILB_STATUS_OK) {
443*10946SSangeeta.Misra@Sun.COM 		ilbadm_err(ilb_errstr(rclib));
444*10946SSangeeta.Misra@Sun.COM 		ret = ILBADM_LIBERR;
445*10946SSangeeta.Misra@Sun.COM 	}
446*10946SSangeeta.Misra@Sun.COM 	return (ret);
447*10946SSangeeta.Misra@Sun.COM }
448*10946SSangeeta.Misra@Sun.COM 
449*10946SSangeeta.Misra@Sun.COM /*
450*10946SSangeeta.Misra@Sun.COM  * Since this function is used by libilb function, it
451*10946SSangeeta.Misra@Sun.COM  * must return libilb errors
452*10946SSangeeta.Misra@Sun.COM  */
453*10946SSangeeta.Misra@Sun.COM /* ARGSUSED */
454*10946SSangeeta.Misra@Sun.COM ilb_status_t
ilbadm_export_hcinfo(ilb_handle_t h,ilb_hc_info_t * hc_info,void * arg)455*10946SSangeeta.Misra@Sun.COM ilbadm_export_hcinfo(ilb_handle_t h, ilb_hc_info_t *hc_info, void *arg)
456*10946SSangeeta.Misra@Sun.COM {
457*10946SSangeeta.Misra@Sun.COM 	FILE 		*fp = ((hc_export_arg_t *)arg)->fp;
458*10946SSangeeta.Misra@Sun.COM 	int		count = 0;
459*10946SSangeeta.Misra@Sun.COM 	int		ret;
460*10946SSangeeta.Misra@Sun.COM 
461*10946SSangeeta.Misra@Sun.COM 	/*
462*10946SSangeeta.Misra@Sun.COM 	 * a test name "PING" implies "no default ping", so we only
463*10946SSangeeta.Misra@Sun.COM 	 * print -n if the test is NOT "PING"
464*10946SSangeeta.Misra@Sun.COM 	 */
465*10946SSangeeta.Misra@Sun.COM 	if (hc_info->hci_def_ping == B_FALSE &&
466*10946SSangeeta.Misra@Sun.COM 	    strncasecmp(hc_info->hci_test, "PING", 5) != 0)
467*10946SSangeeta.Misra@Sun.COM 		(void) fprintf(fp, "create-healthcheck -n -h ");
468*10946SSangeeta.Misra@Sun.COM 	else
469*10946SSangeeta.Misra@Sun.COM 		(void) fprintf(fp, "create-healthcheck -h ");
470*10946SSangeeta.Misra@Sun.COM 
471*10946SSangeeta.Misra@Sun.COM 	if (*hc_info->hci_test != '\0') {
472*10946SSangeeta.Misra@Sun.COM 		(void) fprintf(fp, "hc-test=%s", hc_info->hci_test);
473*10946SSangeeta.Misra@Sun.COM 		count++;
474*10946SSangeeta.Misra@Sun.COM 	}
475*10946SSangeeta.Misra@Sun.COM 	if (hc_info->hci_timeout != 0) {
476*10946SSangeeta.Misra@Sun.COM 		if (count++ > 0)
477*10946SSangeeta.Misra@Sun.COM 			(void) fprintf(fp, ",");
478*10946SSangeeta.Misra@Sun.COM 		(void) fprintf(fp, "hc-timeout=%d", hc_info->hci_timeout);
479*10946SSangeeta.Misra@Sun.COM 	}
480*10946SSangeeta.Misra@Sun.COM 	if (hc_info->hci_count != 0) {
481*10946SSangeeta.Misra@Sun.COM 		if (count++ > 0)
482*10946SSangeeta.Misra@Sun.COM 			(void) fprintf(fp, ",");
483*10946SSangeeta.Misra@Sun.COM 		(void) fprintf(fp, "hc-count=%d", hc_info->hci_count);
484*10946SSangeeta.Misra@Sun.COM 	}
485*10946SSangeeta.Misra@Sun.COM 	if (hc_info->hci_interval != 0) {
486*10946SSangeeta.Misra@Sun.COM 		if (count > 0)
487*10946SSangeeta.Misra@Sun.COM 			(void) fprintf(fp, ",");
488*10946SSangeeta.Misra@Sun.COM 		(void) fprintf(fp, "hc-interval=%d", hc_info->hci_interval);
489*10946SSangeeta.Misra@Sun.COM 	}
490*10946SSangeeta.Misra@Sun.COM 
491*10946SSangeeta.Misra@Sun.COM 	/*
492*10946SSangeeta.Misra@Sun.COM 	 * if any of the above writes fails, then, we assume, so will
493*10946SSangeeta.Misra@Sun.COM 	 * this one; so it's sufficient to test once
494*10946SSangeeta.Misra@Sun.COM 	 */
495*10946SSangeeta.Misra@Sun.COM 	ret = fprintf(fp, " %s\n", hc_info->hci_name);
496*10946SSangeeta.Misra@Sun.COM 	if (ret < 0)
497*10946SSangeeta.Misra@Sun.COM 		goto out_fail;
498*10946SSangeeta.Misra@Sun.COM 	ret = fflush(fp);
499*10946SSangeeta.Misra@Sun.COM 
500*10946SSangeeta.Misra@Sun.COM out_fail:
501*10946SSangeeta.Misra@Sun.COM 	if (ret < 0)
502*10946SSangeeta.Misra@Sun.COM 		return (ILB_STATUS_WRITE);
503*10946SSangeeta.Misra@Sun.COM 	return (ILB_STATUS_OK);
504*10946SSangeeta.Misra@Sun.COM }
505*10946SSangeeta.Misra@Sun.COM 
506*10946SSangeeta.Misra@Sun.COM ilbadm_status_t
ilbadm_export_hc(ilb_handle_t h,FILE * fp)507*10946SSangeeta.Misra@Sun.COM ilbadm_export_hc(ilb_handle_t h, FILE *fp)
508*10946SSangeeta.Misra@Sun.COM {
509*10946SSangeeta.Misra@Sun.COM 	ilb_status_t	rclib;
510*10946SSangeeta.Misra@Sun.COM 	ilbadm_status_t	ret = ILBADM_OK;
511*10946SSangeeta.Misra@Sun.COM 	hc_export_arg_t	arg;
512*10946SSangeeta.Misra@Sun.COM 
513*10946SSangeeta.Misra@Sun.COM 	arg.fp = fp;
514*10946SSangeeta.Misra@Sun.COM 	rclib = ilb_walk_hc(h, ilbadm_export_hcinfo, (void *)&arg);
515*10946SSangeeta.Misra@Sun.COM 	if (rclib != ILB_STATUS_OK) {
516*10946SSangeeta.Misra@Sun.COM 		ilbadm_err(ilb_errstr(rclib));
517*10946SSangeeta.Misra@Sun.COM 		ret = ILBADM_LIBERR;
518*10946SSangeeta.Misra@Sun.COM 	}
519*10946SSangeeta.Misra@Sun.COM 	return (ret);
520*10946SSangeeta.Misra@Sun.COM }
521