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(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 */
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