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  */
42 const char *
ilbadm_errstr(ilbadm_status_t rc)43 ilbadm_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(8)"));
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(8)"));
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(8)"));
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(8)"));
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(8)"));
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(8)"));
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 */
121 void
ilbadm_err(const char * format,...)122 ilbadm_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 
136 void
Usage(char * name)137 Usage(char *name)
138 {
139 	(void) fprintf(stderr, gettext("Usage:\n"));
140 	print_cmdlist_short(basename(name), stderr);
141 	exit(1);
142 }
143 
144 static void
print_version(char * name)145 print_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 
152 void
unknown_opt(char ** argv,int optind)153 unknown_opt(char **argv, int optind)
154 {
155 	ilbadm_err(gettext("bad or misplaced option %s"), argv[optind]);
156 	exit(1);
157 }
158 
159 void
incomplete_cmdline(char * name)160 incomplete_cmdline(char *name)
161 {
162 	ilbadm_err(gettext("the command line is incomplete "
163 	    "(more arguments expected)"));
164 	Usage(name);
165 }
166 
167 static void
bad_importfile(char * name,char * filename)168 bad_importfile(char *name, char *filename)
169 {
170 	ilbadm_err(gettext("file %s cannot be opened for reading"), filename);
171 	Usage(name);
172 }
173 
174 int
main(int argc,char * argv[])175 main(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