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 * Copyright (c) 2001 by Sun Microsystems, Inc.
24 * All rights reserved.
25 */
26 package com.sun.dhcpmgr.cli.dhcpconfig;
27
28 import com.sun.dhcpmgr.cli.common.DhcpCliFunction;
29 import com.sun.dhcpmgr.cli.common.Console;
30 import com.sun.dhcpmgr.data.DhcpdOptions;
31 import com.sun.dhcpmgr.data.DhcpDatastore;
32 import com.sun.dhcpmgr.data.Network;
33 import com.sun.dhcpmgr.bridge.ExistsException;
34
35 public class ConvertDataStore extends DhcpCfgFunction {
36
37 static final int supportedOptions[] = {
38 DhcpCfg.FORCE,
39 DhcpCfg.KEEP_TABLES,
40 DhcpCfg.RESOURCE,
41 DhcpCfg.RESOURCE_CONFIG,
42 DhcpCfg.PATH
43 };
44
45 public ConvertDataStore() {
46
47 validOptions = supportedOptions;
48
49 } // constructor
50
51 /**
52 * Returns the option flag for this function.
53 * @returns the option flag for this function.
54 */
55 public int getFunctionFlag() {
56 return (DhcpCfg.CONVERT_DATA_STORE);
57 }
58
59 public int execute() throws IllegalArgumentException {
60
61 // User must define both resource and path.
62 //
63 if (options.valueOf(DhcpCfg.RESOURCE) == null ||
64 options.valueOf(DhcpCfg.PATH) == null) {
65 String msg = getString("convert_null_datastore_error");
66 throw new IllegalArgumentException(msg);
67 }
68
69 try {
70 setDhcpDatastore(getSvcMgr().getDataStore(
71 options.valueOf(DhcpCfg.RESOURCE)));
72 getDhcpDatastore().setLocation(options.valueOf(DhcpCfg.PATH));
73 getDhcpDatastore().setConfig(
74 options.valueOf(DhcpCfg.RESOURCE_CONFIG));
75 } catch (Throwable e) {
76 // resource will not be valid
77 }
78
79
80 if (getDhcpDatastore() == null || !getDhcpDatastore().isEnabled()) {
81 Object [] arguments = new Object[1];
82 arguments[0] = getDhcpDatastore().getResource();
83 printErrMessage(getString("convert_invalid_resource_error"),
84 arguments);
85 return (DhcpCfg.FAILURE);
86 }
87
88 // Should we delete the dhcptab and the network tables after
89 // they have been converted?
90 //
91 boolean deleteTables = !options.isSet(DhcpCfg.KEEP_TABLES);
92
93 // Get the old configuration values.
94 //
95 DhcpdOptions dhcpdOptions = null;
96 try {
97 dhcpdOptions = getSvcMgr().readDefaults();
98 } catch (Throwable e) {
99 Object [] arguments = new Object[1];
100 arguments[0] = getMessage(e);
101 printErrMessage(getString("convert_conf_read_error"), arguments);
102 return (DhcpCfg.FAILURE);
103 }
104
105 // If the source, destination, and version are all the same
106 // then there is nothing to do ... report it as an error.
107 //
108 DhcpDatastore oldDatastore = dhcpdOptions.getDhcpDatastore();
109 if (getDhcpDatastore().equals(oldDatastore)) {
110 printErrMessage(getString("convert_same_datastore_error"));
111 return (DhcpCfg.FAILURE);
112 }
113
114 // Confirm?
115 //
116 if (!options.isSet(DhcpCfg.FORCE)) {
117 printMessage(getString("convert_explanation"));
118 String confirmationMsg = getString("convert_confirmation");
119 String affirmative = getString("affirmative");
120 String negative = getString("negative");
121 boolean doit = Console.promptUser(confirmationMsg, affirmative,
122 negative, true);
123 if (!doit) {
124 return (DhcpCfg.FAILURE);
125 }
126 }
127
128 // Create the location if it does not exist.
129 //
130 try {
131 getSvcMgr().makeLocation(getDhcpDatastore());
132 } catch (ExistsException e) {
133 // this is o.k.
134 } catch (Throwable e) {
135 Object [] arguments = new Object[1];
136 arguments[0] = getDhcpDatastore().getLocation();
137 printErrMessage(getString("convert_make_location_error"),
138 arguments);
139 return (DhcpCfg.FAILURE);
140 }
141
142 // Shut down the server if it is running
143 //
144 try {
145 if (getSvcMgr().isServerRunning()) {
146 getSvcMgr().shutdown();
147 printMessage(getString("convert_shutdown_progress"));
148 } else {
149 printMessage(getString("convert_no_shutdown_progress"));
150 }
151 } catch (Throwable e) {
152 Object [] arguments = new Object[1];
153 arguments[0] = getMessage(e);
154 printErrMessage(getString("convert_shutdown_error"), arguments);
155 }
156
157 // Convert the dhcptab.
158 //
159 try {
160 getDhcptabMgr().cvtDhcptab(getDhcpDatastore());
161 printMessage(getString("convert_dhcptab_progress"));
162 } catch (Throwable e) {
163 Object [] arguments = new Object[1];
164 arguments[0] = getMessage(e);
165 printErrMessage(getString("convert_dhcptab_error"), arguments);
166 deleteTables = false;
167 }
168
169 // Go get a list of the network tables to convert.
170 //
171 Network[] networks = new Network[0];
172 try {
173 networks = getNetMgr().getNetworks(oldDatastore);
174 if (networks == null) {
175 networks = new Network[0];
176 }
177 } catch (Throwable e) {
178 Object [] arguments = new Object[1];
179 arguments[0] = getMessage(e);
180 printErrMessage(getString("convert_get_nets_error"), arguments);
181 deleteTables = false;
182 }
183
184 // Convert the network tables
185 //
186 for (int i = 0; i < networks.length; ++i) {
187 String netString = networks[i].toString();
188 try {
189 getNetMgr().cvtNetwork(netString, getDhcpDatastore());
190 Object [] arguments = new Object[1];
191 arguments[0] = netString;
192 printMessage(getString("convert_network_progress"), arguments);
193 } catch (Throwable e) {
194 Object [] arguments = new Object[2];
195 arguments[0] = netString;
196 arguments[1] = getMessage(e);
197 printErrMessage(getString("convert_network_error"),
198 arguments);
199 }
200 }
201
202 dhcpdOptions.setDhcpDatastore(getDhcpDatastore());
203 try {
204 getSvcMgr().writeDefaults(dhcpdOptions);
205 printMessage(getString("convert_conf_update_progress"));
206 } catch (Throwable e) {
207 Object [] arguments = new Object[1];
208 arguments[0] = getMessage(e);
209 printErrMessage(getString("convert_conf_write_error"), arguments);
210 deleteTables = false;
211 }
212
213 if (deleteTables) {
214 // Delete the network tables
215 //
216 for (int i = 0; i < networks.length; ++i) {
217 String netString = networks[i].toString();
218 try {
219 getNetMgr().deleteNetwork(netString, false, oldDatastore);
220 Object [] arguments = new Object[1];
221 arguments[0] = netString;
222 printMessage(getString("convert_delete_network_progress"),
223 arguments);
224 } catch (Throwable e) {
225 Object [] arguments = new Object[2];
226 arguments[0] = netString;
227 arguments[1] = getMessage(e);
228 printErrMessage(getString("convert_delete_network_error"),
229 arguments);
230 }
231 }
232
233 // Delete the dhcptab
234 //
235 try {
236 getDhcptabMgr().deleteDhcptab(oldDatastore);
237 printMessage(getString("convert_delete_dhcptab_progress"));
238 } catch (Throwable e) {
239 Object [] arguments = new Object[1];
240 arguments[0] = getMessage(e);
241 printErrMessage(getString("convert_delete_dhcptab_error"),
242 arguments);
243 }
244 }
245
246 // Start it up.
247 //
248 if (dhcpdOptions.isDaemonEnabled()) {
249 try {
250 getSvcMgr().startup();
251 printMessage(getString("convert_startup_progress"));
252 } catch (Throwable e) {
253 Object [] arguments = new Object[1];
254 arguments[0] = getMessage(e);
255 printErrMessage(getString("convert_startup_error"), arguments);
256 }
257 }
258
259 return (DhcpCfg.SUCCESS);
260
261 } // execute
262
263 } // ConvertDataStore