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 2001-2002 Sun Microsystems, Inc. All rights reserved.
24 * Use is subject to license terms.
25 */
26 package com.sun.dhcpmgr.cli.pntadm;
27
28 import com.sun.dhcpmgr.cli.common.Util;
29 import com.sun.dhcpmgr.data.DhcpClientRecord;
30 import com.sun.dhcpmgr.data.Macro;
31 import com.sun.dhcpmgr.data.Network;
32 import com.sun.dhcpmgr.bridge.BridgeException;
33 import com.sun.dhcpmgr.bridge.NoEntryException;
34
35 import java.lang.IllegalArgumentException;
36
37 /**
38 * The main class for the "modify client" functionality of pntadm.
39 */
40 public class ModifyClientEntry extends PntAdmFunction {
41
42 /**
43 * The valid options associated with modifying a client entry.
44 */
45 static final int supportedOptions[] = {
46 PntAdm.NEW_IP,
47 PntAdm.COMMENT,
48 PntAdm.LEASE_EXPIRATION,
49 PntAdm.FLAGS,
50 PntAdm.CLIENTID,
51 PntAdm.CONVERT_CLIENTID,
52 PntAdm.MACRO_NAME,
53 PntAdm.VERIFY_MACRO,
54 PntAdm.SERVER,
55 PntAdm.RESOURCE,
56 PntAdm.RESOURCE_CONFIG,
57 PntAdm.PATH
58 };
59
60 /**
61 * The client entry to modify.
62 */
63 String clientIP;
64
65 /**
66 * Constructs a ModifyClientEntry object for the client, clientIP.
67 * @param clientIP the client name or IP address.
68 */
69 public ModifyClientEntry(String clientIP) {
70
71 this.clientIP = clientIP;
72 validOptions = supportedOptions;
73
74 } // constructor
75
76 /**
77 * Returns the option flag for this function.
78 * @returns the option flag for this function.
79 */
80 public int getFunctionFlag() {
81 return (PntAdm.MODIFY_CLIENT_ENTRY);
82 }
83
84 /**
85 * Executes the "modify client" functionality.
86 * @return PntAdm.SUCCESS, PntAdm.ENOENT, PntAdm.WARNING, or
87 * PntAdm.CRITICAL
88 */
89 public int execute()
90 throws IllegalArgumentException {
91
92 int returnCode = PntAdm.SUCCESS;
93
94 // Build up a DhcpClientRecord so that we can retrieve the current
95 // client record from the network table.
96 //
97 try {
98 DhcpClientRecord oldDhcpClientRecord = new DhcpClientRecord();
99 oldDhcpClientRecord.setClientIP(clientIP);
100
101 // Create a Network object.
102 //
103 Network network = getNetMgr().getNetwork(networkName);
104 if (network == null) {
105 printErrMessage(getString("network_name_error"));
106 return (PntAdm.WARNING);
107 }
108
109 // Go and get the current client record from the network table.
110 //
111 oldDhcpClientRecord =
112 getNetMgr().getClient(oldDhcpClientRecord, network.toString(),
113 getDhcpDatastore());
114
115 // Build up the new DhcpClientRecord from the original and the
116 // user specified options.
117 //
118 DhcpClientRecord newDhcpClientRecord =
119 (DhcpClientRecord)oldDhcpClientRecord.clone();
120
121 String newClientIP = options.valueOf(PntAdm.NEW_IP);
122 if (newClientIP != null) {
123 newDhcpClientRecord.setClientIP(newClientIP);
124 } else {
125 newDhcpClientRecord.setClientIP(clientIP);
126 }
127
128 String clientId = options.valueOf(PntAdm.CLIENTID);
129 boolean convertClientId = options.isSet(PntAdm.CONVERT_CLIENTID);
130 if (convertClientId) {
131 if (clientId == null) {
132 String msg = getString("no_clientid_specified");
133 throw new IllegalArgumentException(msg);
134 }
135 clientId = Util.asciiToHex(clientId);
136 }
137 if (clientId != null) {
138 newDhcpClientRecord.setClientId(clientId);
139 }
140
141 String flags = options.valueOf(PntAdm.FLAGS);
142 if (flags != null) {
143 newDhcpClientRecord.setFlags(flags);
144 }
145
146 String serverIP = options.valueOf(PntAdm.SERVER);
147 if (serverIP == null) {
148 serverIP = getSvcMgr().getServerName();
149 }
150 newDhcpClientRecord.setServerIP(serverIP);
151
152 String expiration = options.valueOf(PntAdm.LEASE_EXPIRATION);
153 if (expiration != null) {
154 newDhcpClientRecord.setExpiration(shortFormat, expiration);
155 }
156
157 boolean verifyMacro = options.isSet(PntAdm.VERIFY_MACRO);
158 String macro = options.valueOf(PntAdm.MACRO_NAME);
159 if (verifyMacro) {
160 if (macro == null) {
161 String msg = getString("no_macro_specified");
162 throw new IllegalArgumentException(msg);
163 }
164
165 // Create a Macro entry so that we can check to see if it
166 // exists in the dhcptab.
167 //
168 try {
169 Macro existingMacro =
170 getDhcptabMgr().getMacro(macro);
171 }
172 catch (BridgeException e) {
173 printErrMessage(getString("macro_not_found"));
174 return (PntAdm.WARNING);
175 }
176 }
177 if (macro != null) {
178 newDhcpClientRecord.setMacro(macro);
179 }
180
181 String comment = options.valueOf(PntAdm.COMMENT);
182 if (comment != null) {
183 newDhcpClientRecord.setComment(comment);
184 }
185
186 // Modify the client and adds host if necessary.
187 //
188 getNetMgr().modifyClient(oldDhcpClientRecord, newDhcpClientRecord,
189 network.toString(), getDhcpDatastore());
190
191 } catch (NoEntryException e) {
192 printErrMessage(getMessage(e));
193 returnCode = PntAdm.ENOENT;
194 } catch (Throwable e) {
195 printErrMessage(getMessage(e));
196 returnCode = PntAdm.WARNING;
197 }
198
199 return (returnCode);
200
201 } // execute
202
203 } // ModifyClientEntry