| | |
| | | import java.util.LinkedHashSet; |
| | | import java.util.Set; |
| | | import java.util.Collections; |
| | | import java.util.logging.Level; |
| | | import java.util.logging.Logger; |
| | | |
| | | import org.forgerock.i18n.slf4j.LocalizedLogger; |
| | | import java.io.BufferedReader; |
| | | import java.io.File; |
| | | import java.io.FileReader; |
| | |
| | | */ |
| | | public class UninstallCliHelper extends ConsoleApplication { |
| | | |
| | | static private final Logger LOG = |
| | | Logger.getLogger(UninstallCliHelper.class.getName()); |
| | | private static final LocalizedLogger logger = LocalizedLogger.getLoggerForThisClass(); |
| | | |
| | | private UninstallerArgumentParser parser; |
| | | |
| | |
| | | outsideDbs = config.getOutsideDbs(); |
| | | } catch (IOException ioe) { |
| | | outsideDbs = Collections.emptySet(); |
| | | LOG.log(Level.INFO, "error determining outside databases", ioe); |
| | | logger.debug(LocalizableMessage.raw("error determining outside databases", ioe)); |
| | | } |
| | | |
| | | try { |
| | | outsideLogs = config.getOutsideLogs(); |
| | | } catch (IOException ioe) { |
| | | outsideLogs = Collections.emptySet(); |
| | | LOG.log(Level.INFO, "error determining outside logs", ioe); |
| | | logger.debug(LocalizableMessage.raw("error determining outside logs", ioe)); |
| | | } |
| | | |
| | | boolean somethingSpecifiedToDelete = |
| | |
| | | } |
| | | catch (Throwable t) |
| | | { |
| | | LOG.log(Level.SEVERE, "Could not create UninstallData: "+t, t); |
| | | logger.error(LocalizableMessage.raw("Could not create UninstallData: "+t, t)); |
| | | userData.setReplicationServer( |
| | | referencedHostName+":8989"); |
| | | } |
| | |
| | | |
| | | if (adminConnectorUrl == null) |
| | | { |
| | | LOG.log(Level.WARNING, |
| | | "Error retrieving a valid LDAP URL in conf file."); |
| | | logger.warn(LocalizableMessage.raw( |
| | | "Error retrieving a valid LDAP URL in conf file.")); |
| | | if (!parser.isInteractive()) |
| | | { |
| | | LocalizableMessage msg = ERR_COULD_NOT_FIND_VALID_LDAPURL.get(); |
| | |
| | | |
| | | if (isCanceled && !userData.isForceOnError()) |
| | | { |
| | | LOG.log(Level.INFO, "User cancelled uninstall."); |
| | | logger.debug(LocalizableMessage.raw("User cancelled uninstall.")); |
| | | userData = null; |
| | | } |
| | | |
| | |
| | | } |
| | | catch (Throwable t) |
| | | { |
| | | LOG.log(Level.WARNING, "Exception: "+t, t); |
| | | logger.warn(LocalizableMessage.raw("Exception: "+t, t)); |
| | | if (t instanceof UserDataException) |
| | | { |
| | | throw (UserDataException)t; |
| | |
| | | throw new IllegalStateException("Unexpected error: "+t, t); |
| | | } |
| | | } |
| | | LOG.log(Level.INFO, "Successfully created user data"); |
| | | logger.debug(LocalizableMessage.raw("Successfully created user data")); |
| | | return userData; |
| | | } |
| | | |
| | |
| | | } |
| | | catch (CLIException ce) |
| | | { |
| | | LOG.log(Level.WARNING, "Error reading input: "+ce, ce); |
| | | logger.warn(LocalizableMessage.raw("Error reading input: "+ce, ce)); |
| | | throw new UserDataException(null, ce.getMessageObject(), ce); |
| | | } |
| | | |
| | |
| | | ((i == 7) && (outsideLogs.size() == 0)); |
| | | if (!ignore) |
| | | { |
| | | answers[i] = askConfirmation(msgs[i], true, LOG); |
| | | answers[i] = askConfirmation(msgs[i], true, logger); |
| | | } |
| | | else |
| | | { |
| | |
| | | } |
| | | catch (Throwable t) |
| | | { |
| | | LOG.log(Level.WARNING, "Error processing task: "+t, t); |
| | | logger.warn(LocalizableMessage.raw("Error processing task: "+t, t)); |
| | | throw new UserDataException(Step.CONFIRM_UNINSTALL, |
| | | Utils.getThrowableMsg(INFO_BUG_MSG.get(), t)); |
| | | } |
| | | LOG.log(Level.INFO, "interactive: "+interactive); |
| | | LOG.log(Level.INFO, "forceOnError: "+forceOnError); |
| | | LOG.log(Level.INFO, "conf.isADS(): "+conf.isADS()); |
| | | LOG.log(Level.INFO, "conf.isReplicationServer(): "+ |
| | | conf.isReplicationServer()); |
| | | LOG.log(Level.INFO, "conf.isServerRunning(): "+conf.isServerRunning()); |
| | | logger.debug(LocalizableMessage.raw("interactive: "+interactive)); |
| | | logger.debug(LocalizableMessage.raw("forceOnError: "+forceOnError)); |
| | | logger.debug(LocalizableMessage.raw("conf.isADS(): "+conf.isADS())); |
| | | logger.debug(LocalizableMessage.raw("conf.isReplicationServer(): "+ |
| | | conf.isReplicationServer())); |
| | | logger.debug(LocalizableMessage.raw("conf.isServerRunning(): "+conf.isServerRunning())); |
| | | if (conf.isADS() && conf.isReplicationServer()) |
| | | { |
| | | if (conf.isServerRunning()) |
| | |
| | | boolean errorWithRemote = |
| | | !updateUserUninstallDataWithRemoteServers(userData); |
| | | cancelled = errorWithRemote && !parser.isForceOnError(); |
| | | LOG.log(Level.INFO, "Non interactive mode. errorWithRemote: "+ |
| | | errorWithRemote); |
| | | logger.debug(LocalizableMessage.raw("Non interactive mode. errorWithRemote: "+ |
| | | errorWithRemote)); |
| | | } |
| | | } |
| | | else |
| | |
| | | /* During all the confirmations, the server might be stopped. */ |
| | | userData.setStopServer( |
| | | Installation.getLocal().getStatus().isServerRunning()); |
| | | LOG.log(Level.INFO, "Must stop the server after confirmations? "+ |
| | | userData.getStopServer()); |
| | | logger.debug(LocalizableMessage.raw("Must stop the server after confirmations? "+ |
| | | userData.getStopServer())); |
| | | } |
| | | } |
| | | else |
| | |
| | | /* During all the confirmations, the server might be stopped. */ |
| | | userData.setStopServer( |
| | | Installation.getLocal().getStatus().isServerRunning()); |
| | | LOG.log(Level.INFO, "Must stop the server after confirmations? "+ |
| | | userData.getStopServer()); |
| | | logger.debug(LocalizableMessage.raw("Must stop the server after confirmations? "+ |
| | | userData.getStopServer())); |
| | | } |
| | | } |
| | | catch (CLIException ce) |
| | |
| | | } |
| | | } |
| | | } |
| | | LOG.log(Level.INFO, "cancelled: "+cancelled); |
| | | logger.debug(LocalizableMessage.raw("cancelled: "+cancelled)); |
| | | return cancelled; |
| | | } |
| | | |
| | |
| | | */ |
| | | private boolean confirmToStopServer() throws CLIException |
| | | { |
| | | return askConfirmation(INFO_CLI_UNINSTALL_CONFIRM_STOP.get(), true, LOG); |
| | | return askConfirmation(INFO_CLI_UNINSTALL_CONFIRM_STOP.get(), true, logger); |
| | | } |
| | | |
| | | /** |
| | |
| | | private boolean confirmDeleteFiles() throws CLIException |
| | | { |
| | | return askConfirmation(INFO_CLI_UNINSTALL_CONFIRM_DELETE_FILES.get(), true, |
| | | LOG); |
| | | logger); |
| | | } |
| | | |
| | | /** |
| | |
| | | private boolean confirmToUpdateRemote() throws CLIException |
| | | { |
| | | return askConfirmation(INFO_CLI_UNINSTALL_CONFIRM_UPDATE_REMOTE.get(), true, |
| | | LOG); |
| | | logger); |
| | | } |
| | | |
| | | /** |
| | |
| | | private boolean confirmToUpdateRemoteAndStart() throws CLIException |
| | | { |
| | | return askConfirmation( |
| | | INFO_CLI_UNINSTALL_CONFIRM_UPDATE_REMOTE_AND_START.get(), true, LOG); |
| | | INFO_CLI_UNINSTALL_CONFIRM_UPDATE_REMOTE_AND_START.get(), true, logger); |
| | | } |
| | | |
| | | /** |
| | |
| | | private boolean promptToProvideAuthenticationAgain() throws CLIException |
| | | { |
| | | return askConfirmation( |
| | | INFO_UNINSTALL_CONFIRM_PROVIDE_AUTHENTICATION_AGAIN.get(), true, LOG); |
| | | INFO_UNINSTALL_CONFIRM_PROVIDE_AUTHENTICATION_AGAIN.get(), true, logger); |
| | | } |
| | | |
| | | /** |
| | |
| | | String adminConnectorUrl = info.getAdminConnectorURL(); |
| | | if (adminConnectorUrl == null) |
| | | { |
| | | LOG.log(Level.WARNING, |
| | | "Error retrieving a valid Administration Connector URL in conf file."); |
| | | logger.warn(LocalizableMessage.raw( |
| | | "Error retrieving a valid Administration Connector URL in conf file.")); |
| | | LocalizableMessage msg = ERR_COULD_NOT_FIND_VALID_LDAPURL.get(); |
| | | throw new ApplicationException(ReturnCode.APPLICATION_ERROR, msg, |
| | | null); |
| | |
| | | } |
| | | catch (Throwable t) |
| | | { |
| | | LOG.log(Level.SEVERE, "Error parsing url: "+adminConnectorUrl); |
| | | logger.error(LocalizableMessage.raw("Error parsing url: "+adminConnectorUrl)); |
| | | } |
| | | LDAPManagementContextFactory factory = |
| | | new LDAPManagementContextFactory(alwaysSSL); |
| | |
| | | |
| | | if (adminConnectorUrl == null) |
| | | { |
| | | LOG.log(Level.WARNING, |
| | | "Error retrieving a valid Administration Connector URL in conf file."); |
| | | logger.warn(LocalizableMessage.raw( |
| | | "Error retrieving a valid Administration Connector URL in conf file.")); |
| | | LocalizableMessage msg = ERR_COULD_NOT_FIND_VALID_LDAPURL.get(); |
| | | throw new ApplicationException(ReturnCode.APPLICATION_ERROR, msg, |
| | | null); |
| | |
| | | } |
| | | catch (Throwable t) |
| | | { |
| | | LOG.log(Level.INFO, "Error closing connection: "+t, t); |
| | | logger.debug(LocalizableMessage.raw("Error closing connection: "+t, t)); |
| | | } |
| | | } |
| | | } |
| | |
| | | } |
| | | catch (Throwable t) |
| | | { |
| | | LOG.log(Level.SEVERE, "Could not create UninstallData: "+t, t); |
| | | logger.error(LocalizableMessage.raw("Could not create UninstallData: "+t, t)); |
| | | } |
| | | } |
| | | userData.setUpdateRemoteReplication(accepted); |
| | |
| | | } |
| | | catch (CLIException ce) |
| | | { |
| | | LOG.log(Level.WARNING, "Error reading input: "+ce, ce); |
| | | logger.warn(LocalizableMessage.raw("Error reading input: %s", ce), ce); |
| | | } |
| | | return s; |
| | | } |
| | | |
| | | private boolean startServer(boolean supressOutput) |
| | | { |
| | | LOG.log(Level.INFO, "startServer, supressOutput: "+supressOutput); |
| | | logger.debug(LocalizableMessage.raw("startServer, supressOutput: "+supressOutput)); |
| | | boolean serverStarted = false; |
| | | Application application = new Application() |
| | | { |
| | |
| | | printlnProgress(); |
| | | } |
| | | serverStarted = Installation.getLocal().getStatus().isServerRunning(); |
| | | LOG.log(Level.INFO, "server started successfully. serverStarted: "+ |
| | | serverStarted); |
| | | logger.debug(LocalizableMessage.raw("server started successfully. serverStarted: "+ |
| | | serverStarted)); |
| | | } |
| | | catch (ApplicationException ae) |
| | | { |
| | | LOG.log(Level.WARNING, "ApplicationException: "+ae, ae); |
| | | logger.warn(LocalizableMessage.raw("ApplicationException: "+ae, ae)); |
| | | if (!supressOutput) |
| | | { |
| | | printErrorMessage(ae.getMessageObject()); |
| | |
| | | } |
| | | catch (Throwable t) |
| | | { |
| | | LOG.log(Level.SEVERE, "Unexpected error: "+t, t); |
| | | logger.error(LocalizableMessage.raw("Unexpected error: "+t, t)); |
| | | throw new IllegalStateException("Unexpected error: "+t, t); |
| | | } |
| | | return serverStarted; |
| | |
| | | |
| | | LocalizableMessage exceptionMsg = null; |
| | | |
| | | LOG.log(Level.INFO, "Updating user data with remote servers."); |
| | | logger.debug(LocalizableMessage.raw("Updating user data with remote servers.")); |
| | | |
| | | InitialLdapContext ctx = null; |
| | | try |
| | |
| | | } |
| | | catch (Throwable t) |
| | | { |
| | | LOG.log(Level.SEVERE, "Error parsing url: "+adminConnectorUrl); |
| | | logger.error(LocalizableMessage.raw("Error parsing url: "+adminConnectorUrl)); |
| | | } |
| | | ctx = createAdministrativeContext(host, port, useSSL, useStartTLS, dn, |
| | | pwd, getConnectTimeout(), |
| | |
| | | forceTrustManagerInitialization(); |
| | | updateTrustManager(userData, ci); |
| | | } |
| | | LOG.log(Level.INFO, "Reloading topology"); |
| | | logger.debug(LocalizableMessage.raw("Reloading topology")); |
| | | TopologyCache cache = new TopologyCache(adsContext, |
| | | userData.getTrustManager(), getConnectTimeout()); |
| | | cache.getFilter().setSearchMonitoringInformation(false); |
| | |
| | | } |
| | | catch (NamingException ne) |
| | | { |
| | | LOG.log(Level.WARNING, "Error connecting to server: "+ne, ne); |
| | | logger.warn(LocalizableMessage.raw("Error connecting to server: "+ne, ne)); |
| | | if (Utils.isCertificateException(ne)) |
| | | { |
| | | String details = ne.getMessage() != null ? |
| | |
| | | } |
| | | } catch (TopologyCacheException te) |
| | | { |
| | | LOG.log(Level.WARNING, "Error connecting to server: "+te, te); |
| | | logger.warn(LocalizableMessage.raw("Error connecting to server: "+te, te)); |
| | | exceptionMsg = Utils.getMessage(te); |
| | | |
| | | } catch (ApplicationException ae) |
| | |
| | | |
| | | } catch (Throwable t) |
| | | { |
| | | LOG.log(Level.WARNING, "Error connecting to server: "+t, t); |
| | | logger.warn(LocalizableMessage.raw("Error connecting to server: "+t, t)); |
| | | exceptionMsg = Utils.getThrowableMsg(INFO_BUG_MSG.get(), t); |
| | | } |
| | | finally |
| | |
| | | } |
| | | catch (Throwable t) |
| | | { |
| | | LOG.log(Level.INFO, "Error closing connection: "+t, t); |
| | | logger.debug(LocalizableMessage.raw("Error closing connection: "+t, t)); |
| | | } |
| | | } |
| | | } |
| | |
| | | { |
| | | accepted = askConfirmation( |
| | | ERR_UNINSTALL_NOT_UPDATE_REMOTE_PROMPT.get(), |
| | | false, LOG); |
| | | false, logger); |
| | | } |
| | | catch (CLIException ce) |
| | | { |
| | |
| | | } |
| | | } |
| | | userData.setUpdateRemoteReplication(accepted); |
| | | LOG.log(Level.INFO, "accepted: "+accepted); |
| | | logger.debug(LocalizableMessage.raw("accepted: "+accepted)); |
| | | return accepted; |
| | | } |
| | | |
| | |
| | | boolean reloadTopologyCache = false; |
| | | boolean interactive = parser.isInteractive(); |
| | | |
| | | LOG.log(Level.INFO, "Handle topology cache."); |
| | | logger.debug(LocalizableMessage.raw("Handle topology cache.")); |
| | | |
| | | Set<TopologyCacheException> exceptions = |
| | | new HashSet<TopologyCacheException>(); |
| | |
| | | /* Check the exceptions and see if we throw them or not. */ |
| | | for (TopologyCacheException e : exceptions) |
| | | { |
| | | LOG.log(Level.INFO, "Analyzing exception: "+e, e); |
| | | logger.debug(LocalizableMessage.raw("Analyzing exception: "+e, e)); |
| | | if (stopProcessing) |
| | | { |
| | | break; |
| | |
| | | { |
| | | println(); |
| | | if (ci.promptForCertificateConfirmation(e.getCause(), |
| | | e.getTrustManager(), e.getLdapUrl(), true, LOG)) |
| | | e.getTrustManager(), e.getLdapUrl(), true, logger)) |
| | | { |
| | | stopProcessing = true; |
| | | reloadTopologyCache = true; |
| | |
| | | returnValue = askConfirmation( |
| | | ERR_UNINSTALL_READING_REGISTERED_SERVERS_CONFIRM_UPDATE_REMOTE.get( |
| | | Utils.getMessageFromCollection(exceptionMsgs, |
| | | Constants.LINE_SEPARATOR).toString()), true, LOG); |
| | | Constants.LINE_SEPARATOR).toString()), true, logger); |
| | | } |
| | | catch (CLIException ce) |
| | | { |
| | |
| | | } |
| | | else |
| | | { |
| | | LOG.log(Level.INFO, "exceptionMsgs: "+exceptionMsgs); |
| | | logger.debug(LocalizableMessage.raw("exceptionMsgs: "+exceptionMsgs)); |
| | | if (exceptionMsgs.size() > 0) |
| | | { |
| | | if (parser.isForceOnError()) |
| | |
| | | returnValue = true; |
| | | } |
| | | } |
| | | LOG.log(Level.INFO, "Return value: "+returnValue); |
| | | logger.debug(LocalizableMessage.raw("Return value: "+returnValue)); |
| | | return returnValue; |
| | | } |
| | | |
| | |
| | | } |
| | | catch (ArgumentException ae) |
| | | { |
| | | LOG.log(Level.WARNING, "Error initializing trust store: "+ae, ae); |
| | | logger.warn(LocalizableMessage.raw("Error initializing trust store: "+ae, ae)); |
| | | } |
| | | forceNonInteractive = false; |
| | | } |
| | |
| | | private void printErrorMessage(LocalizableMessage msg) |
| | | { |
| | | super.println(msg); |
| | | LOG.log(Level.WARNING, msg.toString()); |
| | | logger.warn(LocalizableMessage.raw(msg.toString())); |
| | | } |
| | | |
| | | /** |