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