xref: /onnv-gate/usr/src/cmd/cmd-inet/usr.sbin/ilbadm/ilbadm.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 <stdio.h>
28*10946SSangeeta.Misra@Sun.COM #include <unistd.h>
29*10946SSangeeta.Misra@Sun.COM #include <stdlib.h>
30*10946SSangeeta.Misra@Sun.COM #include <strings.h>
31*10946SSangeeta.Misra@Sun.COM #include <sys/types.h>
32*10946SSangeeta.Misra@Sun.COM #include <sys/socket.h>
33*10946SSangeeta.Misra@Sun.COM #include <fcntl.h>
34*10946SSangeeta.Misra@Sun.COM #include <errno.h>
35*10946SSangeeta.Misra@Sun.COM #include <libgen.h>
36*10946SSangeeta.Misra@Sun.COM #include <libilb.h>
37*10946SSangeeta.Misra@Sun.COM #include "ilbadm.h"
38*10946SSangeeta.Misra@Sun.COM 
39*10946SSangeeta.Misra@Sun.COM /*
40*10946SSangeeta.Misra@Sun.COM  * Error strings for error values returned by ilbadm functions
41*10946SSangeeta.Misra@Sun.COM  */
42*10946SSangeeta.Misra@Sun.COM const char *
ilbadm_errstr(ilbadm_status_t rc)43*10946SSangeeta.Misra@Sun.COM ilbadm_errstr(ilbadm_status_t rc)
44*10946SSangeeta.Misra@Sun.COM {
45*10946SSangeeta.Misra@Sun.COM 	switch (rc) {
46*10946SSangeeta.Misra@Sun.COM 	case ILBADM_OK:
47*10946SSangeeta.Misra@Sun.COM 		return (gettext("no error"));
48*10946SSangeeta.Misra@Sun.COM 	case ILBADM_FAIL:
49*10946SSangeeta.Misra@Sun.COM 		return (gettext("processing of command failed"));
50*10946SSangeeta.Misra@Sun.COM 	case ILBADM_ENOMEM:
51*10946SSangeeta.Misra@Sun.COM 		return (gettext("memory allocation failure"));
52*10946SSangeeta.Misra@Sun.COM 	case ILBADM_EINVAL:
53*10946SSangeeta.Misra@Sun.COM 		return (gettext("invalid value  - refer to ilbadm(1M)"));
54*10946SSangeeta.Misra@Sun.COM 	case ILBADM_HCPRINT:
55*10946SSangeeta.Misra@Sun.COM 		return (gettext("failed to print healthcheck values"));
56*10946SSangeeta.Misra@Sun.COM 	case ILBADM_INVAL_AF:
57*10946SSangeeta.Misra@Sun.COM 		return (gettext("address family is invalid"));
58*10946SSangeeta.Misra@Sun.COM 	case ILBADM_INVAL_PORT:
59*10946SSangeeta.Misra@Sun.COM 		return (gettext("port value is invalid"));
60*10946SSangeeta.Misra@Sun.COM 	case ILBADM_INVAL_SRVID:
61*10946SSangeeta.Misra@Sun.COM 		return (gettext("server ID is invalid"));
62*10946SSangeeta.Misra@Sun.COM 	case ILBADM_INVAL_ADDR:
63*10946SSangeeta.Misra@Sun.COM 		return (gettext("address is invalid"));
64*10946SSangeeta.Misra@Sun.COM 	case ILBADM_INVAL_ARGS:
65*10946SSangeeta.Misra@Sun.COM 		return (gettext("invalid/incompatible keywords - refer to"
66*10946SSangeeta.Misra@Sun.COM 		    " ilbadm(1M)"));
67*10946SSangeeta.Misra@Sun.COM 	case ILBADM_ENOSGNAME:
68*10946SSangeeta.Misra@Sun.COM 		return (gettext("servergroup name missing"));
69*10946SSangeeta.Misra@Sun.COM 	case ILBADM_ENORULE:
70*10946SSangeeta.Misra@Sun.COM 		return (gettext("rule name missing or specified"
71*10946SSangeeta.Misra@Sun.COM 		    " rule not found"));
72*10946SSangeeta.Misra@Sun.COM 	case ILBADM_ENOSERVER:
73*10946SSangeeta.Misra@Sun.COM 		return (gettext("server name missing or specified"
74*10946SSangeeta.Misra@Sun.COM 		    " server not found"));
75*10946SSangeeta.Misra@Sun.COM 	case ILBADM_INVAL_ALG:
76*10946SSangeeta.Misra@Sun.COM 		return (gettext("LB algorithm is invalid"));
77*10946SSangeeta.Misra@Sun.COM 	case ILBADM_ENOPROTO:
78*10946SSangeeta.Misra@Sun.COM 		return (gettext("protocol does not exist in"
79*10946SSangeeta.Misra@Sun.COM 		    " protocol database"));
80*10946SSangeeta.Misra@Sun.COM 	case ILBADM_ENOSERVICE:
81*10946SSangeeta.Misra@Sun.COM 		return (gettext("servicename does not exist in nameservices"));
82*10946SSangeeta.Misra@Sun.COM 	case ILBADM_INVAL_OPER:
83*10946SSangeeta.Misra@Sun.COM 		return (gettext("operation type is invalid"));
84*10946SSangeeta.Misra@Sun.COM 	case ILBADM_INVAL_KEYWORD:
85*10946SSangeeta.Misra@Sun.COM 		return (gettext("keyword is invalid - please refer"
86*10946SSangeeta.Misra@Sun.COM 		    " to ilbadm(1M)"));
87*10946SSangeeta.Misra@Sun.COM 	case ILBADM_ASSIGNREQ:
88*10946SSangeeta.Misra@Sun.COM 		return (gettext("assignment '=' missing"));
89*10946SSangeeta.Misra@Sun.COM 	case ILBADM_NORECURSIVE:
90*10946SSangeeta.Misra@Sun.COM 		return (gettext("recursive import not allowed"));
91*10946SSangeeta.Misra@Sun.COM 	case ILBADM_INVAL_COMMAND:
92*10946SSangeeta.Misra@Sun.COM 		return (gettext("subcommand is invalid - please refer"
93*10946SSangeeta.Misra@Sun.COM 		    " to ilbadm(1M)"));
94*10946SSangeeta.Misra@Sun.COM 	case ILBADM_ENOPROXY:
95*10946SSangeeta.Misra@Sun.COM 		return (gettext("proxy-src is missing"));
96*10946SSangeeta.Misra@Sun.COM 	case ILBADM_INVAL_PROXY:
97*10946SSangeeta.Misra@Sun.COM 		return (gettext("proxy-src not allowed"));
98*10946SSangeeta.Misra@Sun.COM 	case ILBADM_ENOOPTION:
99*10946SSangeeta.Misra@Sun.COM 		return (gettext("mandatory argument(s) missing - refer"
100*10946SSangeeta.Misra@Sun.COM 		    " to ilbadm(1M)"));
101*10946SSangeeta.Misra@Sun.COM 	case ILBADM_TOOMANYIPADDR:
102*10946SSangeeta.Misra@Sun.COM 		return (gettext("address range contains more than 255"
103*10946SSangeeta.Misra@Sun.COM 		    " IP addresses"));
104*10946SSangeeta.Misra@Sun.COM 	case ILBADM_EXPORTFAIL:
105*10946SSangeeta.Misra@Sun.COM 		return (gettext("could not export servergroup because"
106*10946SSangeeta.Misra@Sun.COM 		    " of lack of space"));
107*10946SSangeeta.Misra@Sun.COM 	case ILBADM_INVAL_SYNTAX:
108*10946SSangeeta.Misra@Sun.COM 		return (gettext("syntax failure - refer to ilbadm(1M)"));
109*10946SSangeeta.Misra@Sun.COM 	case ILBADM_NOKEYWORD_VAL:
110*10946SSangeeta.Misra@Sun.COM 		return (gettext("missing value"));
111*10946SSangeeta.Misra@Sun.COM 	case ILBADM_LIBERR:
112*10946SSangeeta.Misra@Sun.COM 		return (gettext("library error"));
113*10946SSangeeta.Misra@Sun.COM 	default:
114*10946SSangeeta.Misra@Sun.COM 		return (gettext("unknown error"));
115*10946SSangeeta.Misra@Sun.COM 
116*10946SSangeeta.Misra@Sun.COM 
117*10946SSangeeta.Misra@Sun.COM 	}
118*10946SSangeeta.Misra@Sun.COM }
119*10946SSangeeta.Misra@Sun.COM 
120*10946SSangeeta.Misra@Sun.COM /* PRINTFLIKE1 */
121*10946SSangeeta.Misra@Sun.COM void
ilbadm_err(const char * format,...)122*10946SSangeeta.Misra@Sun.COM ilbadm_err(const char *format, ...)
123*10946SSangeeta.Misra@Sun.COM {
124*10946SSangeeta.Misra@Sun.COM 	/* similar to warn() of dladm.c */
125*10946SSangeeta.Misra@Sun.COM 	va_list alist;
126*10946SSangeeta.Misra@Sun.COM 
127*10946SSangeeta.Misra@Sun.COM 	(void) fprintf(stderr, "ilbadm: ");
128*10946SSangeeta.Misra@Sun.COM 
129*10946SSangeeta.Misra@Sun.COM 	va_start(alist, format);
130*10946SSangeeta.Misra@Sun.COM 	(void) vfprintf(stderr, format, alist);
131*10946SSangeeta.Misra@Sun.COM 	va_end(alist);
132*10946SSangeeta.Misra@Sun.COM 
133*10946SSangeeta.Misra@Sun.COM 	(void) fprintf(stderr, "\n");
134*10946SSangeeta.Misra@Sun.COM }
135*10946SSangeeta.Misra@Sun.COM 
136*10946SSangeeta.Misra@Sun.COM void
Usage(char * name)137*10946SSangeeta.Misra@Sun.COM Usage(char *name)
138*10946SSangeeta.Misra@Sun.COM {
139*10946SSangeeta.Misra@Sun.COM 	(void) fprintf(stderr, gettext("Usage:\n"));
140*10946SSangeeta.Misra@Sun.COM 	print_cmdlist_short(basename(name), stderr);
141*10946SSangeeta.Misra@Sun.COM 	exit(1);
142*10946SSangeeta.Misra@Sun.COM }
143*10946SSangeeta.Misra@Sun.COM 
144*10946SSangeeta.Misra@Sun.COM static void
print_version(char * name)145*10946SSangeeta.Misra@Sun.COM print_version(char *name)
146*10946SSangeeta.Misra@Sun.COM {
147*10946SSangeeta.Misra@Sun.COM 	(void) printf("%s %s\n", basename(name), ILBADM_VERSION);
148*10946SSangeeta.Misra@Sun.COM 	(void) printf(gettext(ILBADM_COPYRIGHT));
149*10946SSangeeta.Misra@Sun.COM 	exit(0);
150*10946SSangeeta.Misra@Sun.COM }
151*10946SSangeeta.Misra@Sun.COM 
152*10946SSangeeta.Misra@Sun.COM void
unknown_opt(char ** argv,int optind)153*10946SSangeeta.Misra@Sun.COM unknown_opt(char **argv, int optind)
154*10946SSangeeta.Misra@Sun.COM {
155*10946SSangeeta.Misra@Sun.COM 	ilbadm_err(gettext("bad or misplaced option %s"), argv[optind]);
156*10946SSangeeta.Misra@Sun.COM 	exit(1);
157*10946SSangeeta.Misra@Sun.COM }
158*10946SSangeeta.Misra@Sun.COM 
159*10946SSangeeta.Misra@Sun.COM void
incomplete_cmdline(char * name)160*10946SSangeeta.Misra@Sun.COM incomplete_cmdline(char *name)
161*10946SSangeeta.Misra@Sun.COM {
162*10946SSangeeta.Misra@Sun.COM 	ilbadm_err(gettext("the command line is incomplete "
163*10946SSangeeta.Misra@Sun.COM 	    "(more arguments expected)"));
164*10946SSangeeta.Misra@Sun.COM 	Usage(name);
165*10946SSangeeta.Misra@Sun.COM }
166*10946SSangeeta.Misra@Sun.COM 
167*10946SSangeeta.Misra@Sun.COM static void
bad_importfile(char * name,char * filename)168*10946SSangeeta.Misra@Sun.COM bad_importfile(char *name, char *filename)
169*10946SSangeeta.Misra@Sun.COM {
170*10946SSangeeta.Misra@Sun.COM 	ilbadm_err(gettext("file %s cannot be opened for reading"), filename);
171*10946SSangeeta.Misra@Sun.COM 	Usage(name);
172*10946SSangeeta.Misra@Sun.COM }
173*10946SSangeeta.Misra@Sun.COM 
174*10946SSangeeta.Misra@Sun.COM int
main(int argc,char * argv[])175*10946SSangeeta.Misra@Sun.COM main(int argc, char *argv[])
176*10946SSangeeta.Misra@Sun.COM {
177*10946SSangeeta.Misra@Sun.COM 	ilbadm_status_t	rc;
178*10946SSangeeta.Misra@Sun.COM 	int		c;
179*10946SSangeeta.Misra@Sun.COM 	int		fd = -1;
180*10946SSangeeta.Misra@Sun.COM 	int		flags = 0;
181*10946SSangeeta.Misra@Sun.COM 
182*10946SSangeeta.Misra@Sun.COM 	(void) setlocale(LC_ALL, "");
183*10946SSangeeta.Misra@Sun.COM 
184*10946SSangeeta.Misra@Sun.COM #if !defined(TEXT_DOMAIN)
185*10946SSangeeta.Misra@Sun.COM #define	TEXT_DOMAIN "SYS_TEST"
186*10946SSangeeta.Misra@Sun.COM #endif
187*10946SSangeeta.Misra@Sun.COM 	(void) textdomain(TEXT_DOMAIN);
188*10946SSangeeta.Misra@Sun.COM 
189*10946SSangeeta.Misra@Sun.COM 	/* handle global options (-?, -V) first */
190*10946SSangeeta.Misra@Sun.COM 	while ((c = getopt(argc, argv, ":V:?")) != -1) {
191*10946SSangeeta.Misra@Sun.COM 		switch ((char)c) {
192*10946SSangeeta.Misra@Sun.COM 		case 'V': print_version(argv[0]);
193*10946SSangeeta.Misra@Sun.COM 			/* not reached */
194*10946SSangeeta.Misra@Sun.COM 			break;
195*10946SSangeeta.Misra@Sun.COM 		case '?':
196*10946SSangeeta.Misra@Sun.COM 			Usage(argv[0]);
197*10946SSangeeta.Misra@Sun.COM 			/* not reached */
198*10946SSangeeta.Misra@Sun.COM 			break;
199*10946SSangeeta.Misra@Sun.COM 		default: unknown_opt(argv, optind - 1);
200*10946SSangeeta.Misra@Sun.COM 			/* not reached */
201*10946SSangeeta.Misra@Sun.COM 			break;
202*10946SSangeeta.Misra@Sun.COM 		}
203*10946SSangeeta.Misra@Sun.COM 	}
204*10946SSangeeta.Misra@Sun.COM 
205*10946SSangeeta.Misra@Sun.COM 	if (optind >= argc)
206*10946SSangeeta.Misra@Sun.COM 		incomplete_cmdline(argv[0]);
207*10946SSangeeta.Misra@Sun.COM 
208*10946SSangeeta.Misra@Sun.COM 	/*
209*10946SSangeeta.Misra@Sun.COM 	 * we can import from a given file (argv[2]) or from
210*10946SSangeeta.Misra@Sun.COM 	 * stdin (if no file given)
211*10946SSangeeta.Misra@Sun.COM 	 */
212*10946SSangeeta.Misra@Sun.COM 	if (strcasecmp(argv[1], "import-config") == 0 ||
213*10946SSangeeta.Misra@Sun.COM 	    strcasecmp(argv[1], "import-cf") == 0) {
214*10946SSangeeta.Misra@Sun.COM 		int shift = 0;
215*10946SSangeeta.Misra@Sun.COM 
216*10946SSangeeta.Misra@Sun.COM 		if (argc > 2 && strcmp(argv[2], "-p") == 0) {
217*10946SSangeeta.Misra@Sun.COM 			shift++;
218*10946SSangeeta.Misra@Sun.COM 			flags |= ILBADM_IMPORT_PRESERVE;
219*10946SSangeeta.Misra@Sun.COM 		}
220*10946SSangeeta.Misra@Sun.COM 
221*10946SSangeeta.Misra@Sun.COM 		if (argc - shift < 3)
222*10946SSangeeta.Misra@Sun.COM 			fd = 0;
223*10946SSangeeta.Misra@Sun.COM 		else
224*10946SSangeeta.Misra@Sun.COM 			if ((fd = open(argv[2+shift], O_RDONLY)) == -1)
225*10946SSangeeta.Misra@Sun.COM 				bad_importfile(argv[0], argv[2+shift]);
226*10946SSangeeta.Misra@Sun.COM 	}
227*10946SSangeeta.Misra@Sun.COM 
228*10946SSangeeta.Misra@Sun.COM 	argv++;
229*10946SSangeeta.Misra@Sun.COM 	argc--;
230*10946SSangeeta.Misra@Sun.COM 
231*10946SSangeeta.Misra@Sun.COM 	/*
232*10946SSangeeta.Misra@Sun.COM 	 * re-set optind for next callers of getopt() - they all believe they're
233*10946SSangeeta.Misra@Sun.COM 	 * the first.
234*10946SSangeeta.Misra@Sun.COM 	 */
235*10946SSangeeta.Misra@Sun.COM 	optind = 1;
236*10946SSangeeta.Misra@Sun.COM 	optopt = 0;
237*10946SSangeeta.Misra@Sun.COM 
238*10946SSangeeta.Misra@Sun.COM 	rc = ilbadm_import(fd, argc, argv, flags);
239*10946SSangeeta.Misra@Sun.COM 
240*10946SSangeeta.Misra@Sun.COM 	/*
241*10946SSangeeta.Misra@Sun.COM 	 * The error messages have been printed out, using
242*10946SSangeeta.Misra@Sun.COM 	 * ilbadm_errstr() and ilb_errstr(), before we get here.
243*10946SSangeeta.Misra@Sun.COM 	 * So just set the exit value
244*10946SSangeeta.Misra@Sun.COM 	 */
245*10946SSangeeta.Misra@Sun.COM 	if (rc != ILBADM_OK)
246*10946SSangeeta.Misra@Sun.COM 		return (1);
247*10946SSangeeta.Misra@Sun.COM 	/* success */
248*10946SSangeeta.Misra@Sun.COM 	return (0);
249*10946SSangeeta.Misra@Sun.COM }
250