1 23 24 package com.sun.enterprise.cli.commands; 25 26 import com.sun.enterprise.cli.framework.CommandValidationException; 27 import com.sun.enterprise.cli.framework.CommandException; 28 import com.sun.enterprise.cli.framework.CLILogger; 29 30 import com.sun.enterprise.util.ProcessExecutor; 31 import com.sun.enterprise.util.RelativePathResolver; 32 import com.sun.enterprise.security.store.PasswordAdapter; 33 import com.sun.enterprise.admin.servermgmt.pe.PEFileLayout; 34 import com.sun.enterprise.admin.servermgmt.RepositoryManager; 35 import com.sun.enterprise.admin.servermgmt.DomainsManager; 36 import com.sun.enterprise.admin.servermgmt.DomainConfig; 37 import com.sun.enterprise.admin.servermgmt.DomainException; 38 import com.sun.enterprise.admin.servermgmt.InstancesManager; 39 import com.sun.enterprise.admin.common.Status; 40 import com.sun.enterprise.util.SystemPropertyConstants; 41 import com.sun.enterprise.util.io.FileUtils; 42 import java.io.*; 43 44 import javax.xml.parsers.DocumentBuilder ; 45 import javax.xml.parsers.DocumentBuilderFactory ; 46 import org.w3c.dom.Document ; 47 48 import java.io.File ; 49 import java.lang.reflect.Method ; 50 import java.util.BitSet ; 51 55 public class StartDomainCommand extends BaseLifeCycleCommand 56 { 57 58 private static final String SERVER_LOG_FILE_NAME = "server.log"; 59 private static final String LOGS_DIR = "logs"; 60 private static final String VERBOSE = "verbose"; 61 private static final String APPLICATION_SERVER_8_0 = "Application Server 8.0"; 62 private static final String DTD_FILE_8_0 = "sun-domain_1_0"; 63 private static final String DTD_FILE_8_1 = "sun-domain_1_1"; 64 private static final long UPGRADE_TIMEOUT = 1200000; private static final String ADDONINSTALLER = "com.sun.enterprise.addon.AddonInstaller"; 66 private static final String INSTALLERMETHOD = "installAllAddons"; 67 private String domainName; 68 private DomainConfig config; 69 private DomainsManager mgr; 70 private String adminPwdAlias; 71 private BitSet flags; 72 73 private boolean doBackupMessage = true; 79 private final static boolean enableBackups = false; 80 81 88 public boolean validateOptions() throws CommandValidationException 89 { 90 return super.validateOptions(); 91 } 92 public void startDomain(String DomainName) 93 throws CommandException, CommandValidationException 94 { 95 domainName = DomainName; 96 long start = System.currentTimeMillis(); 97 98 try 99 { 100 doBackupMessage = false; 101 init(); 102 checkIfRunning(); 103 checkIfStopping(); 104 105 doBackupMessage = true; 106 validateDomain(); 107 doBackupMessage = false; 108 validateAdminPassword(); 109 validateMasterPassword(); 110 saveExtraPasswordOptions(); 111 doBackupMessage = true; 112 installAddons(); 113 checkAndExecuteUpgrade(domainName); 114 mgr.startDomain(config); 115 116 if(enableBackups) 117 { 118 saveCopyOfConfig(config); 119 } 120 121 if (flags.get(DomainConfig.K_FLAG_START_DOMAIN_NEEDS_ADMIN_USER)) { 122 CLILogger.getInstance().printDetailMessage(getLocalizedString("DomainStarted", 123 new Object [] {domainName})); 124 } else { 125 CLILogger.getInstance().printDetailMessage(getLocalizedString("DomainReady", 126 new Object [] {domainName})); 127 } 128 final boolean terse = getBooleanOption(TERSE); 129 new DomainReporter(config, terse).report(); 130 long msec = System.currentTimeMillis() - start; 131 132 138 double sec = ((double)Math.round( ((double)msec) / 100.0)) / 10.0; 139 CLILogger.getInstance().printDebugMessage(getLocalizedString("DomainStartTime", 140 new Object [] { sec })); 141 } 142 catch(Exception e) 143 { 144 CLILogger.getInstance().printDetailMessage(e.getLocalizedMessage()); 145 146 if(enableBackups) 147 { 148 if(doBackupMessage) 149 checkOnBackup(config); 150 } 151 152 throw new CommandException(getLocalizedString("CannotStartDomain", 153 new Object [] {domainName}), e); 154 } 155 } 156 157 158 162 public void runCommand() throws CommandException, CommandValidationException 163 { 164 if (!validateOptions()) 165 throw new CommandValidationException("Validation is false"); 166 167 String domainName = null; 168 try { 169 domainName = getDomainName(); 170 } catch(Exception e) 171 { 172 CLILogger.getInstance().printDetailMessage(e.getLocalizedMessage()); 173 domainName = domainName==null?getLocalizedString("Undefined"):domainName; 174 throw new CommandException(getLocalizedString("CannotStartDomain", 175 new Object [] {domainName}), e); 176 } 177 startDomain(domainName); 178 } 179 180 181 189 private void checkAndExecuteUpgrade(String domainName) throws CommandException 190 { 191 final String domainDir = getDomainsRoot(); 192 CLILogger.getInstance().printDebugMessage("domainDir = " + domainDir); 193 final String installDir = System.getProperty(SystemPropertyConstants.INSTALL_ROOT_PROPERTY); 194 CLILogger.getInstance().printDebugMessage("installDir = " + installDir); 195 CLILogger.getInstance().printDebugMessage("domainName = " + domainName); 196 if (checkIfVersion80(domainName, domainDir, installDir)) { 197 try { 199 final String sPasswordFile = createPasswordFileText(); 200 final String [] upgradeCmd = new String [] {installDir + File.separator + 201 "bin" + File.separator + 202 "asupgrade", "-c", "-s", 203 domainDir+File.separator+domainName, 204 "-t", installDir, "--passwordfile", 205 sPasswordFile, "-noprompt" }; 206 207 ProcessExecutor pe = new ProcessExecutor(upgradeCmd, UPGRADE_TIMEOUT); 208 pe.execute(); Process process = pe.getSubProcess(); 210 int exitValue = process.waitFor(); 211 if (exitValue != 0) { 212 System.out.println("Please exeucte asupgrade manually to upgrade the configuration"); 213 throw new CommandException(getLocalizedString("UpgradeFailed")); 214 } 215 } 216 catch (Exception e) { 217 throw new CommandException(getLocalizedString("UpgradeFailed"), e); 219 } 220 } 221 } 222 223 224 231 private boolean checkIfVersion80(String domainName, String domainDir, 232 String installDir) throws CommandException 233 { 234 final PEFileLayout layout = new PEFileLayout(config); 235 final File domainFile = layout.getDomainConfigFile(); 236 237 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 238 239 factory.setNamespaceAware(true); 240 241 try { 242 243 DocumentBuilder builder = factory.newDocumentBuilder(); 244 builder.setEntityResolver((org.xml.sax.helpers.DefaultHandler )Class.forName 245 ("com.sun.enterprise.config.serverbeans.ServerValidationHandler").newInstance()); 246 Document adminServerDoc = builder.parse(domainFile); 247 String publicID = adminServerDoc.getDoctype().getPublicId(); 248 String systemID = adminServerDoc.getDoctype().getSystemId(); 249 CLILogger.getInstance().printDebugMessage("publicID = " + publicID); 250 CLILogger.getInstance().printDebugMessage("systemID = " + systemID); 251 if (publicID.indexOf(APPLICATION_SERVER_8_0) != -1 && 254 (systemID.indexOf(DTD_FILE_8_0) != -1 || 255 systemID.indexOf(DTD_FILE_8_1) != -1 )) { 256 return true; 257 } else { 258 return false; 259 } 260 } 261 catch (Exception e) 262 { 263 } 266 return false; 267 } 268 269 274 private String createPasswordFileText() throws Exception 275 { 276 final File fPasswordFile = File.createTempFile("passwordfile", null); 278 fPasswordFile.deleteOnExit(); 279 PrintWriter out = new PrintWriter(new BufferedWriter( 280 new FileWriter(fPasswordFile.toString()))); 281 out.println("AS_ADMIN_PASSWORD = " + (String )config.get(DomainConfig.K_PASSWORD)); 282 out.println("AS_ADMIN_MASTERPASSWORD = " + (String )config.get(DomainConfig.K_MASTER_PASSWORD)); 283 out.close(); 284 return fPasswordFile.toString(); 285 } 286 287 288 289 293 private String getDomainLogFile(String domainName) throws CommandException 294 { 295 String logFile = getDomainsRoot() + File.separator + domainName + 296 File.separator + LOGS_DIR + File.separator + SERVER_LOG_FILE_NAME; 297 return logFile; 298 } 299 300 private boolean isNotRunning(DomainsManager mgr, DomainConfig cfg) throws Exception 301 { 302 304 InstancesManager im = mgr.getInstancesManager(cfg); 305 int state = im.getInstanceStatus(); 306 307 return state == Status.kInstanceNotRunningCode; 308 } 309 310 private boolean isStopping(DomainsManager mgr, DomainConfig cfg) throws Exception 311 { 312 InstancesManager im = mgr.getInstancesManager(cfg); 313 int state = im.getInstanceStatus(); 314 315 return state == Status.kInstanceStoppingCode; 316 } 317 318 private void checkOnBackup(DomainConfig config) 319 { 320 323 if(config == null) 324 return; 326 try 327 { 328 File domainsRoot = new File (config.getRepositoryRoot()); 329 File domainRoot = new File (domainsRoot, config.getDomainName()); 330 File configDir = new File (domainRoot, "config"); 331 File domainxml = new File (configDir, "domain.xml"); 332 File backup = new File (configDir, "domain_bu.xml"); 333 334 if(backup.exists()) 335 pr("NoStartAdvice", backup.getAbsolutePath(), domainxml.getAbsolutePath()); 336 } 337 catch(Exception e) 338 { 339 } 340 } 341 342 private void init() throws CommandException 343 { 344 mgr = getFeatureFactory().getDomainsManager(); 345 CLILogger.getInstance().printDetailMessage(getLocalizedString("StartingDomain", 346 new Object [] {domainName})); 347 if (!getBooleanOption(VERBOSE)) 348 { 349 CLILogger.getInstance().printDetailMessage(getLocalizedString("LogRedirectedTo", 350 new Object [] {getDomainLogFile(domainName)})); 351 } 352 config = getDomainConfig(domainName); 353 } 354 355 private void installAddons() { 356 try { 357 Class main = Class.forName(ADDONINSTALLER); 358 Object obj = main.newInstance(); 359 Class [] types = new Class [] { String .class, String .class}; 360 Method method = main.getMethod(INSTALLERMETHOD, types); 361 String installDir = System.getProperty(SystemPropertyConstants.INSTALL_ROOT_PROPERTY); 362 String domainInstanceRoot = getDomainsRoot() + File.separator + getDomainName(); 363 Object [] args1 = new Object [] { installDir, domainInstanceRoot }; 364 method.invoke(obj,args1); 365 }catch(Exception ex) { 366 CLILogger.getInstance().printDetailMessage(ex.getLocalizedMessage()); 367 } 368 369 } 370 371 private void checkIfRunning() throws Exception 372 { 373 375 if(!isNotRunning(mgr, config)) 376 { 377 380 throw new CommandException(getLocalizedString("CannotStartDomainAlreadyRunning", 384 new Object [] {domainName})); 385 } 386 } 387 388 private void checkIfStopping() throws Exception 389 { 390 if(isStopping(mgr, config)) 391 { 392 throw new CommandException(getLocalizedString("CannotStartStoppingDomain", 393 new Object [] {domainName})); 394 } 395 } 396 397 private void validateDomain() throws DomainException 398 { 399 mgr.validateDomain(config, true); 401 } 402 private void validateAdminPassword() throws CommandValidationException, DomainException, CommandException 403 { 404 flags = mgr.getDomainFlags(); 407 408 if (flags.get(DomainConfig.K_FLAG_START_DOMAIN_NEEDS_ADMIN_USER)) { 409 config.put(DomainConfig.K_USER, getUser()); 410 config.put(DomainConfig.K_PASSWORD, getPassword()); 411 if (getOption(S1ASCommand.PASSWORDFILE) != null ) 413 adminPwdAlias = RelativePathResolver.getAlias( (String )config.get(DomainConfig.K_PASSWORD)); 414 if (adminPwdAlias==null) { 415 mgr.validateAdminUserAndPassword(config); 416 } 417 } 418 } 419 420 private void validateMasterPassword() throws Exception 421 { 422 final String masterPassword = getMasterPassword(new RepositoryManager(), config); 423 config.put(DomainConfig.K_MASTER_PASSWORD, masterPassword); 424 425 mgr.validateMasterPassword(config); 426 if (adminPwdAlias!=null) { 427 String domainsRoot = (String )config.get(DomainConfig.K_DOMAINS_ROOT); 428 String keyStoreFile= domainsRoot+ File.separator + domainName + File.separator + "config" + File.separator + 429 PasswordAdapter.PASSWORD_ALIAS_KEYSTORE; 430 PasswordAdapter p = 431 new PasswordAdapter(keyStoreFile, masterPassword.toCharArray()); 432 String clearPwd = p.getPasswordForAlias(adminPwdAlias); 433 config.put(DomainConfig.K_PASSWORD, clearPwd); 434 mgr.validateAdminUserAndPassword(config); 435 } 436 } 437 private void saveExtraPasswordOptions() throws CommandValidationException, CommandException, DomainException 438 { 439 String [] extraPasswordOptions = mgr.getExtraPasswordOptions(config); 440 if (extraPasswordOptions != null) { 441 config.put(DomainConfig.K_EXTRA_PASSWORDS, getExtraPasswords(extraPasswordOptions)); 442 } 443 } 444 445 private void saveCopyOfConfig(DomainConfig config) 446 { 447 File domainsRoot = new File (config.getRepositoryRoot()); 448 File domainRoot = new File (domainsRoot, config.getDomainName()); 449 File configDir = new File (domainRoot, "config"); 450 File domainxml = new File (configDir, "domain.xml"); 451 File backup = new File (configDir, "domain_bu.xml"); 452 453 try 454 { 455 FileUtils.copy(domainxml.getAbsolutePath(), backup.getAbsolutePath()); 456 pr("ConfigBackedupOK", backup.getAbsolutePath()); 457 } 458 catch(Exception e) 459 { 460 pr("ConfigBackedupNot", domainxml.getAbsolutePath(), backup.getAbsolutePath()); 461 } 462 } 463 464 private void pr(String id, Object o) 465 { 466 String s = getLocalizedString(id, new Object []{ o } ); 467 CLILogger.getInstance().printDetailMessage(s); 468 } 469 470 private void pr(String id, Object o1, Object o2) 471 { 472 String s = getLocalizedString(id, new Object []{ o1, o2 } ); 473 CLILogger.getInstance().printDetailMessage(s); 474 } 475 } 476 | Popular Tags |