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