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