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, Version 1.0 only
6 * (the "License"). You may not use this file except in compliance
7 * with the License.
8 *
9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10 * or http://www.opensolaris.org/os/licensing.
11 * See the License for the specific language governing permissions
12 * and limitations under the License.
13 *
14 * When distributing Covered Code, include this CDDL HEADER in each
15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16 * If applicable, add the following below this CDDL HEADER, with the
17 * fields enclosed by brackets "[]" replaced with your own identifying
18 * information: Portions Copyright [yyyy] [name of copyright owner]
19 *
20 * CDDL HEADER END
21 */
22 /*
23 * ident "%Z%%M% %I% %E% SMI"
24 *
25 * Copyright (c) 2001 by Sun Microsystems, Inc.
26 * All rights reserved.
27 */
28 package com.sun.dhcpmgr.cli.common;
29
30 import com.sun.dhcpmgr.data.DhcpDatastore;
31 import com.sun.dhcpmgr.data.Option;
32 import com.sun.dhcpmgr.data.StandardOptions;
33 import com.sun.dhcpmgr.server.DhcpMgr;
34 import com.sun.dhcpmgr.server.DhcpMgrImpl;
35 import com.sun.dhcpmgr.server.DhcpServiceMgr;
36 import com.sun.dhcpmgr.server.DhcpNetMgr;
37 import com.sun.dhcpmgr.server.DhcptabMgr;
38 import com.sun.dhcpmgr.bridge.*;
39
40 import java.lang.IllegalArgumentException;
41
42 /**
43 * This class is the base class extended by the DHCP CLI subcommand classes.
44 */
45 public abstract class DhcpCliFunction {
46
47 /**
48 * The options for the function.
49 */
50 protected DhcpCliOptions options = null;
51 protected int validOptions[];
52
53 /**
54 * Handles to the managers.
55 */
56 static private DhcpMgr dhcpMgr = null;
57 static private DhcpNetMgr netMgr = null;
58 static private DhcptabMgr dhcptabMgr = null;
59 static private DhcpServiceMgr svcMgr = null;
60
61 /**
62 * The DhcpDatastore to be used for this function. A value of 'null'
63 * means to just use DHCP defaults.
64 */
65 private DhcpDatastore datastore = null;
66
67 /**
68 * Constructor.
69 */
70 public DhcpCliFunction() {
71 dhcpMgr = new DhcpMgrImpl();
72 } // constructor
73
74 /**
75 * Get a handle to the DhcpNetMgr
76 * @return an instance of DhcpNetMgr
77 */
78 public static DhcpMgr getDhcpMgr() {
79 return dhcpMgr;
80 } // getDhcpMgr
81
82 /**
83 * Get a handle to the DhcpNetMgr
84 * @return an instance of DhcpNetMgr
85 */
86 public static DhcpNetMgr getNetMgr() {
87 if (netMgr == null) {
88 netMgr = dhcpMgr.getNetMgr();
89 }
90 return netMgr;
91 } // getNetMgr
92
93 /**
94 * Get a handle to the DhcptabMgr
95 * @return an instance of DhcptabMgr
96 */
97 public static DhcptabMgr getDhcptabMgr() {
98 if (dhcptabMgr == null) {
99 dhcptabMgr = dhcpMgr.getDhcptabMgr();
100 }
101 return dhcptabMgr;
102 } // getDhcptabMgr
103
104 /**
105 * Get a handle to the DhcpServiceMgr
106 * @return an instance of DhcpServiceMgr
107 */
108 public static DhcpServiceMgr getSvcMgr() {
109 if (svcMgr == null) {
110 svcMgr = dhcpMgr.getDhcpServiceMgr();
111 }
112 return svcMgr;
113 } // getSvcMgr
114
115 /**
116 * Used to execute the subcommand functionality.
117 */
118 public abstract int execute()
119 throws IllegalArgumentException;
120
121 /**
122 * Returns the option flag for this function.
123 * @returns the option flag for this function.
124 */
125 public abstract int getFunctionFlag();
126
127 /**
128 * Returns the DhcpDatastore associated with this function.
129 * @returns the DhcpDatastore associated with this function.
130 */
131 public DhcpDatastore getDhcpDatastore() {
132 return datastore;
133 } // getDhcpDatastore
134
135 /**
136 * Sets the DhcpDatastore associated with this function.
137 * @param ds the data store
138 */
139 public void setDhcpDatastore(DhcpDatastore ds) {
140 datastore = ds;
141 } // setDhcpDatastore
142
143 /**
144 * Sets the DhcpDatastore associated with this function.
145 * @param r the data store resource
146 * @param l the data store location
147 * @param a the data store config
148 */
149 public void setDhcpDatastore(String r, String l, String a) {
150 datastore = createDhcpDatastore(r, l, a);
151 } // setDhcpDatastore
152
153 /**
154 * Create a DhcpDatastore with the given argument values as attributes.
155 * @param r the data store resource
156 * @param l the data store location
157 * @param a the data store config
158 * @returns a DhcpDatastore with the given argument values as attributes
159 * or null if all arguments are null.
160 */
161 public DhcpDatastore createDhcpDatastore(String r, String l, String a) {
162 return this.createDhcpDatastore(r, l, a, -1);
163 } // createDhcpDatastore
164
165 /**
166 * Create a DhcpDatastore with the given argument values as attributes.
167 * @param r the data store resource
168 * @param l the data store location
169 * @param a the data store config
170 * @param v the data store resource version
171 * @returns a DhcpDatastore with the given argument values as attributes
172 * or null if all arguments are null.
173 */
174 public DhcpDatastore createDhcpDatastore(String r, String l, String a,
175 int v) {
176
177 DhcpDatastore datastore = null;
178
179 if (r != null || l != null || a != null || v != -1) {
180 datastore = new DhcpDatastore(r, l, a, v);
181 }
182
183 return datastore;
184 } // createDhcpDatastore
185
186 /**
187 * Used to determine whether or not the data store version is valid.
188 */
189 public boolean isVersionValid(boolean ignoreAbsentDefaults) {
190
191 boolean isValid = false;
192 try {
193 isValid = getSvcMgr().isVersionCurrent();
194
195 if (!isValid) {
196 printCmnErrMessage("need_to_convert_datastore");
197 }
198 } catch (NoDefaultsException e) {
199 if (!ignoreAbsentDefaults) {
200 printCmnErrMessage("no_conf_warning");
201 }
202 isValid = true;
203 } catch (Throwable e) {
204 printCmnErrMessage(e.getMessage());
205 }
206
207 return isValid;
208
209 } // isVersionValid
210
211 /**
212 * Used to set the read the STANDARD options from the DHCP inittab and
213 * to initialize the StandardOptions table with these options.
214 */
215 public void setStandardOptions() {
216 try {
217 StandardOptions.setAllOptions(getSvcMgr().getInittabOptions(
218 Option.ctxts[Option.STANDARD].getCode()));
219 } catch (Throwable e) {
220 printCmnErrMessage(e.getMessage());
221 }
222 } // setStandardOptions
223
224 /**
225 * Used to set the options for this function. Validates that the options
226 * received were only options that are legitimate for this subcommand.
227 * @param options the options object built as a result of parsing
228 * command line input.
229 */
230 public void setOptions(DhcpCliOptions options)
231 throws IllegalArgumentException {
232
233 options.validate(validOptions);
234 this.options = options;
235
236 } // setOptions
237
238 /**
239 * Uses the resourceKey to retrieve a string from a ResourceBundle (if
240 * one exists) and prints the string to the console.
241 * @param resourceKey the ResourceBundle key value.
242 */
243 public void printCmnMessage(String resourceKey) {
244 DhcpCliPrint.printMessage(ResourceStrings.getString(resourceKey));
245 } // printMessage
246
247 /**
248 * Uses the resourceKey to retrieve a string from a ResourceBundle (if
249 * one exists) and prints the string to the console error stream.
250 * @param resourceKey the ResourceBundle key value.
251 */
252 public void printCmnErrMessage(String resourceKey) {
253 DhcpCliPrint.printErrMessage(ResourceStrings.getString(resourceKey));
254 } // printErrMessage
255
256 /**
257 * Given a Throwable object, returns a message for it.
258 * @param e the Throwable object.
259 * @returns a message.
260 */
261 public static String getMessage(Throwable e) {
262 String message = e.getMessage();
263 if (message == null) {
264 message = e.toString();
265 }
266 return message;
267 } // getMessage
268
269 } // DhcpCliFunction