001 /* 002 * CDDL HEADER START 003 * 004 * The contents of this file are subject to the terms of the 005 * Common Development and Distribution License, Version 1.0 only 006 * (the "License"). You may not use this file except in compliance 007 * with the License. 008 * 009 * You can obtain a copy of the license at 010 * trunk/opends/resource/legal-notices/OpenDS.LICENSE 011 * or https://OpenDS.dev.java.net/OpenDS.LICENSE. 012 * See the License for the specific language governing permissions 013 * and limitations under the License. 014 * 015 * When distributing Covered Code, include this CDDL HEADER in each 016 * file and include the License file at 017 * trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable, 018 * add the following below this CDDL HEADER, with the fields enclosed 019 * by brackets "[]" replaced with your own identifying information: 020 * Portions Copyright [yyyy] [name of copyright owner] 021 * 022 * CDDL HEADER END 023 * 024 * 025 * Copyright 2008 Sun Microsystems, Inc. 026 */ 027 package org.opends.server.admin.client.cli; 028 029 import static org.opends.server.loggers.debug.DebugLogger.*; 030 import static org.opends.messages.AdminMessages.*; 031 import static org.opends.messages.DSConfigMessages.*; 032 import org.opends.messages.Message; 033 import static org.opends.server.tools.ToolConstants.*; 034 import static org.opends.server.util.ServerConstants.MAX_LINE_WIDTH; 035 import static org.opends.server.util.StaticUtils.wrapText; 036 037 import java.io.IOException; 038 import java.io.OutputStream; 039 import java.util.Comparator; 040 import java.util.HashSet; 041 import java.util.Set; 042 import java.util.SortedSet; 043 import java.util.TreeSet; 044 import java.util.logging.Logger; 045 046 import javax.naming.NamingException; 047 import javax.naming.ldap.InitialLdapContext; 048 049 import org.opends.admin.ads.ADSContextException; 050 import org.opends.admin.ads.util.ConnectionUtils; 051 import org.opends.server.loggers.debug.DebugTracer; 052 import org.opends.server.util.args.ArgumentException; 053 import org.opends.server.util.args.BooleanArgument; 054 import org.opends.server.util.args.SubCommand; 055 056 import static org.opends.server.admin.client.cli.DsFrameworkCliReturnCode.*; 057 058 /** 059 * This class will parse CLI arguments for the dsframework command lines. 060 */ 061 public class DsFrameworkCliParser extends SecureConnectionCliParser 062 { 063 /** 064 * The tracer object for the debug logger. 065 */ 066 private static final DebugTracer TRACER = getTracer(); 067 068 /** 069 * The Logger. 070 */ 071 static private final Logger LOG = 072 Logger.getLogger(DsFrameworkCliParser.class.getName()); 073 074 /** 075 * The different CLI group. 076 */ 077 public HashSet<DsFrameworkCliSubCommandGroup> cliGroup; 078 079 080 081 /** 082 * Creates a new instance of this subcommand argument parser with no 083 * arguments. 084 * 085 * @param mainClassName 086 * The fully-qualified name of the Java class that should 087 * be invoked to launch the program with which this 088 * argument parser is associated. 089 * @param toolDescription 090 * A human-readable description for the tool, which will be 091 * included when displaying usage information. 092 * @param longArgumentsCaseSensitive 093 * Indicates whether subcommand and long argument names 094 * should be treated in a case-sensitive manner. 095 */ 096 public DsFrameworkCliParser(String mainClassName, Message toolDescription, 097 boolean longArgumentsCaseSensitive) 098 { 099 super(mainClassName, toolDescription, longArgumentsCaseSensitive); 100 cliGroup = new HashSet<DsFrameworkCliSubCommandGroup>(); 101 } 102 103 /** 104 * Initialize the parser with the Global options and subcommands. 105 * 106 * @param outStream 107 * The output stream to use for standard output, or <CODE>null</CODE> 108 * if standard output is not needed. 109 * @throws ArgumentException 110 * If there is a problem with any of the parameters used 111 * to create this argument. 112 */ 113 public void initializeParser(OutputStream outStream) 114 throws ArgumentException 115 { 116 // Global parameters 117 initializeGlobalArguments(createGlobalArguments(outStream)); 118 119 // ads Group cli 120 cliGroup.add(new DsFrameworkCliAds()); 121 122 // Server-group Group cli 123 cliGroup.add(new DsFrameworkCliServerGroup()); 124 125 // Server Group cli 126 cliGroup.add(new DsFrameworkCliServer()); 127 128 // User Admin cli 129 cliGroup.add(new DsFrameworkCliGlobalAdmin()); 130 131 // Initialization 132 Comparator<SubCommand> c = new Comparator<SubCommand>() { 133 134 public int compare(SubCommand o1, SubCommand o2) { 135 return o1.getName().compareTo(o2.getName()); 136 } 137 }; 138 139 SortedSet<SubCommand> allSubCommands = new TreeSet<SubCommand>(c); 140 141 for (DsFrameworkCliSubCommandGroup oneCli : cliGroup) 142 { 143 oneCli.initializeCliGroup(this, verboseArg); 144 Set<SubCommand> oneCliSubCmds = oneCli.getSubCommands() ; 145 allSubCommands.addAll(oneCliSubCmds); 146 147 // register group help 148 String grpName = oneCli.getGroupName(); 149 String option = OPTION_LONG_HELP + "-" + grpName; 150 BooleanArgument arg = new BooleanArgument(option, null, option, 151 INFO_DSCFG_DESCRIPTION_SHOW_GROUP_USAGE.get(grpName)); 152 addGlobalArgument(arg); 153 arg.setHidden(oneCli.isHidden()); 154 TreeSet<SubCommand> subCmds = new TreeSet<SubCommand>(c); 155 subCmds.addAll(oneCliSubCmds); 156 setUsageGroupArgument(arg, subCmds); 157 } 158 159 // Register the --help-all argument. 160 String option = OPTION_LONG_HELP + "-all"; 161 BooleanArgument arg = new BooleanArgument(option, null, option, 162 INFO_DSCFG_DESCRIPTION_SHOW_GROUP_USAGE_ALL.get()); 163 164 addGlobalArgument(arg); 165 setUsageGroupArgument(arg, allSubCommands); 166 167 } 168 169 170 171 /** 172 * Handle the subcommand. 173 * @param outStream The output stream to use for standard output. 174 * @param errStream The output stream to use for standard error. 175 * 176 * @return the return code 177 * @throws ADSContextException 178 * If there is a problem with when trying to perform the 179 * operation. 180 * @throws ArgumentException 181 * If there is a problem with any of the parameters used 182 * to execute this subcommand. 183 */ 184 public DsFrameworkCliReturnCode performSubCommand(OutputStream outStream, 185 OutputStream errStream) 186 throws ADSContextException, ArgumentException 187 { 188 SubCommand subCmd = getSubCommand(); 189 190 for (DsFrameworkCliSubCommandGroup oneCli : cliGroup) 191 { 192 if (oneCli.isSubCommand(subCmd)) 193 { 194 return oneCli.performSubCommand( subCmd, outStream, errStream); 195 } 196 } 197 198 // Should never occurs: If we are here, it means that the code to 199 // handle to subcommand is not yet written. 200 return ERROR_UNEXPECTED; 201 } 202 203 204 /** 205 * Get the InitialLdapContext that has to be used for the ADS. 206 * @param out The output stream to use for standard output. 207 * @param err The output stream to use for standard error. 208 * 209 * @return The InitialLdapContext that has to be used for the ADS. 210 */ 211 public InitialLdapContext getContext(OutputStream out, OutputStream err) 212 { 213 // Get connection parameters 214 String host = null ; 215 String port = null; 216 String dn = null ; 217 String pwd = null; 218 InitialLdapContext ctx = null; 219 220 // Get connection parameters 221 host = ConnectionUtils.getHostNameForLdapUrl(getHostName()); 222 port = getPort(); 223 dn = getBindDN(); 224 pwd = getBindPassword(dn, out, err); 225 226 // Try to connect 227 if (useSSL()) 228 { 229 String ldapsUrl = "ldaps://" + host + ":" + port; 230 try 231 { 232 ctx = ConnectionUtils.createLdapsContext(ldapsUrl, dn, pwd, 233 ConnectionUtils.getDefaultLDAPTimeout(), null,getTrustManager(), 234 getKeyManager()); 235 } 236 catch (NamingException e) 237 { 238 Message message = ERR_ADMIN_CANNOT_CONNECT_TO_ADS.get(host); 239 try 240 { 241 err.write(wrapText(message, MAX_LINE_WIDTH).getBytes()); 242 err.write(EOL.getBytes()); 243 } 244 catch (IOException e1) 245 { 246 } 247 return null; 248 } 249 } 250 else if (useStartTLS()) 251 { 252 String ldapUrl = "ldap://" + host + ":" + port; 253 try 254 { 255 ctx = ConnectionUtils.createStartTLSContext(ldapUrl, dn, pwd, 256 ConnectionUtils.getDefaultLDAPTimeout(), null, getTrustManager(), 257 getKeyManager(), null); 258 } 259 catch (NamingException e) 260 { 261 Message message = ERR_ADMIN_CANNOT_CONNECT_TO_ADS.get(host); 262 try 263 { 264 err.write(wrapText(message, MAX_LINE_WIDTH).getBytes()); 265 err.write(EOL.getBytes()); 266 } 267 catch (IOException e1) 268 { 269 } 270 return null; 271 } 272 } 273 else 274 { 275 String ldapUrl = "ldap://" + host + ":" + port; 276 try 277 { 278 ctx = ConnectionUtils.createLdapContext(ldapUrl, dn, pwd, 279 ConnectionUtils.getDefaultLDAPTimeout(), null); 280 } 281 catch (NamingException e) 282 { 283 Message message = ERR_ADMIN_CANNOT_CONNECT_TO_ADS.get(host); 284 try 285 { 286 err.write(wrapText(message, MAX_LINE_WIDTH).getBytes()); 287 err.write(EOL.getBytes()); 288 } 289 catch (IOException e1) 290 { 291 } 292 return null; 293 } 294 } 295 return ctx; 296 } 297 }