/* * CDDL HEADER START * * The contents of this file are subject to the terms of the * Common Development and Distribution License, Version 1.0 only * (the "License"). You may not use this file except in compliance * with the License. * * You can obtain a copy of the license at * trunk/opends/resource/legal-notices/OpenDS.LICENSE * or https://OpenDS.dev.java.net/OpenDS.LICENSE. * See the License for the specific language governing permissions * and limitations under the License. * * When distributing Covered Code, include this CDDL HEADER in each * file and include the License file at * trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable, * add the following below this CDDL HEADER, with the fields enclosed * by brackets "[]" replaced with your own identifying information: * Portions Copyright [yyyy] [name of copyright owner] * * CDDL HEADER END * * * Copyright 2009 Sun Microsystems, Inc. */ package org.opends.server.admin.client.cli; import static org.opends.messages.AdminMessages.*; import static org.opends.messages.DSConfigMessages.*; import static org.opends.server.admin.client.cli.DsFrameworkCliReturnCode.*; import static org.opends.server.tools.ToolConstants.*; import static org.opends.server.util.ServerConstants.*; import static org.opends.server.util.StaticUtils.*; import java.io.IOException; import java.io.OutputStream; import java.util.Comparator; import java.util.HashSet; import java.util.Set; import java.util.SortedSet; import java.util.TreeSet; import javax.naming.NamingException; import javax.naming.ldap.InitialLdapContext; import org.opends.admin.ads.ADSContextException; import org.opends.admin.ads.util.ConnectionUtils; import org.opends.messages.Message; import org.opends.server.util.args.ArgumentException; import org.opends.server.util.args.BooleanArgument; import org.opends.server.util.args.SubCommand; /** * This class will parse CLI arguments for the dsframework command lines. */ public class DsFrameworkCliParser extends SecureConnectionCliParser { /** * The different CLI group. */ public HashSet<DsFrameworkCliSubCommandGroup> cliGroup; // This CLI is always using the administration connector with SSL private final boolean alwaysSSL = true; /** * Creates a new instance of this subcommand argument parser with no * arguments. * * @param mainClassName * The fully-qualified name of the Java class that should * be invoked to launch the program with which this * argument parser is associated. * @param toolDescription * A human-readable description for the tool, which will be * included when displaying usage information. * @param longArgumentsCaseSensitive * Indicates whether subcommand and long argument names * should be treated in a case-sensitive manner. */ public DsFrameworkCliParser(String mainClassName, Message toolDescription, boolean longArgumentsCaseSensitive) { super(mainClassName, toolDescription, longArgumentsCaseSensitive); cliGroup = new HashSet<DsFrameworkCliSubCommandGroup>(); } /** * Initialize the parser with the Global options and subcommands. * * @param outStream * The output stream to use for standard output, or <CODE>null</CODE> * if standard output is not needed. * @throws ArgumentException * If there is a problem with any of the parameters used * to create this argument. */ public void initializeParser(OutputStream outStream) throws ArgumentException { // Global parameters initializeGlobalArguments(createGlobalArguments(outStream, alwaysSSL)); // ads Group cli cliGroup.add(new DsFrameworkCliAds()); // Server-group Group cli cliGroup.add(new DsFrameworkCliServerGroup()); // Server Group cli cliGroup.add(new DsFrameworkCliServer()); // User Admin cli cliGroup.add(new DsFrameworkCliGlobalAdmin()); // Initialization Comparator<SubCommand> c = new Comparator<SubCommand>() { public int compare(SubCommand o1, SubCommand o2) { return o1.getName().compareTo(o2.getName()); } }; SortedSet<SubCommand> allSubCommands = new TreeSet<SubCommand>(c); for (DsFrameworkCliSubCommandGroup oneCli : cliGroup) { oneCli.initializeCliGroup(this, verboseArg); Set<SubCommand> oneCliSubCmds = oneCli.getSubCommands() ; allSubCommands.addAll(oneCliSubCmds); // register group help String grpName = oneCli.getGroupName(); String option = OPTION_LONG_HELP + "-" + grpName; BooleanArgument arg = new BooleanArgument(option, null, option, INFO_DSCFG_DESCRIPTION_SHOW_GROUP_USAGE.get(grpName)); addGlobalArgument(arg); arg.setHidden(oneCli.isHidden()); TreeSet<SubCommand> subCmds = new TreeSet<SubCommand>(c); subCmds.addAll(oneCliSubCmds); setUsageGroupArgument(arg, subCmds); } // Register the --help-all argument. String option = OPTION_LONG_HELP + "-all"; BooleanArgument arg = new BooleanArgument(option, null, option, INFO_DSCFG_DESCRIPTION_SHOW_GROUP_USAGE_ALL.get()); addGlobalArgument(arg); setUsageGroupArgument(arg, allSubCommands); } /** * Handle the subcommand. * @param outStream The output stream to use for standard output. * @param errStream The output stream to use for standard error. * * @return the return code * @throws ADSContextException * If there is a problem with when trying to perform the * operation. * @throws ArgumentException * If there is a problem with any of the parameters used * to execute this subcommand. */ public DsFrameworkCliReturnCode performSubCommand(OutputStream outStream, OutputStream errStream) throws ADSContextException, ArgumentException { SubCommand subCmd = getSubCommand(); for (DsFrameworkCliSubCommandGroup oneCli : cliGroup) { if (oneCli.isSubCommand(subCmd)) { return oneCli.performSubCommand( subCmd, outStream, errStream); } } // Should never occurs: If we are here, it means that the code to // handle to subcommand is not yet written. return ERROR_UNEXPECTED; } /** * Get the InitialLdapContext that has to be used for the ADS. * @param out The output stream to use for standard output. * @param err The output stream to use for standard error. * * @return The InitialLdapContext that has to be used for the ADS. */ public InitialLdapContext getContext(OutputStream out, OutputStream err) { // Get connection parameters String host = null ; String port = null; String dn = null ; String pwd = null; InitialLdapContext ctx = null; // Get connection parameters host = ConnectionUtils.getHostNameForLdapUrl(getHostName()); port = getPort(); dn = getBindDN(); pwd = getBindPassword(dn, out, err); // Try to connect if (useSSL()) { String ldapsUrl = "ldaps://" + host + ":" + port; try { ctx = ConnectionUtils.createLdapsContext(ldapsUrl, dn, pwd, ConnectionUtils.getDefaultLDAPTimeout(), null,getTrustManager(), getKeyManager()); } catch (NamingException e) { Message message = ERR_ADMIN_CANNOT_CONNECT_TO_ADS.get(host); try { err.write(wrapText(message, MAX_LINE_WIDTH).getBytes()); err.write(EOL.getBytes()); } catch (IOException e1) { } return null; } } else if (useStartTLS()) { String ldapUrl = "ldap://" + host + ":" + port; try { ctx = ConnectionUtils.createStartTLSContext(ldapUrl, dn, pwd, ConnectionUtils.getDefaultLDAPTimeout(), null, getTrustManager(), getKeyManager(), null); } catch (NamingException e) { Message message = ERR_ADMIN_CANNOT_CONNECT_TO_ADS.get(host); try { err.write(wrapText(message, MAX_LINE_WIDTH).getBytes()); err.write(EOL.getBytes()); } catch (IOException e1) { } return null; } } else { String ldapUrl = "ldap://" + host + ":" + port; try { ctx = ConnectionUtils.createLdapContext(ldapUrl, dn, pwd, ConnectionUtils.getDefaultLDAPTimeout(), null); } catch (NamingException e) { Message message = ERR_ADMIN_CANNOT_CONNECT_TO_ADS.get(host); try { err.write(wrapText(message, MAX_LINE_WIDTH).getBytes()); err.write(EOL.getBytes()); } catch (IOException e1) { } return null; } } return ctx; } }