From d42b15e420478dc45785fff6e00b863cc1f8a0f9 Mon Sep 17 00:00:00 2001
From: lutoff <lutoff@localhost>
Date: Thu, 18 Sep 2008 10:14:53 +0000
Subject: [PATCH] These changes are separating the current delivery into an "Install Layout" (the binaries) and an "Instance Layout" (the user data).
---
opends/src/quicksetup/org/opends/quicksetup/upgrader/Upgrader.java | 247 ++++++++++++++++++++++++++++++++++++++++++++-----
1 files changed, 222 insertions(+), 25 deletions(-)
diff --git a/opends/src/quicksetup/org/opends/quicksetup/upgrader/Upgrader.java b/opends/src/quicksetup/org/opends/quicksetup/upgrader/Upgrader.java
index 1ccee21..0c7e279 100644
--- a/opends/src/quicksetup/org/opends/quicksetup/upgrader/Upgrader.java
+++ b/opends/src/quicksetup/org/opends/quicksetup/upgrader/Upgrader.java
@@ -72,8 +72,10 @@
import org.opends.server.tools.JavaPropertiesTool;
import java.awt.event.WindowEvent;
+import java.io.BufferedReader;
import java.io.File;
import java.io.FileFilter;
+import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.net.InetSocketAddress;
@@ -105,6 +107,13 @@
"org.opends.quicksetup.upgrader.Root";
/**
+ * Passed in from the shell script if the root is known at the time
+ * of invocation.
+ */
+ static private final String SYS_PROP_INSTANCE_ROOT =
+ "org.opends.quicksetup.upgrader.Instance";
+
+ /**
* If set to true, an error is introduced during the
* upgrade process for testing.
*/
@@ -134,7 +143,28 @@
LOGS_PATH_RELATIVE, // logs
LOCKS_PATH_RELATIVE, // locks
HISTORY_PATH_RELATIVE, // history
- TMP_PATH_RELATIVE // tmp
+ TMP_PATH_RELATIVE, // tmp
+ INSTANCE_LOCATION_PATH_RELATIVE //instance.loc
+ };
+
+ // Files that should be located into the install directory
+ static final String[] ROOT_FILE_FOR_INSTALL_DIR= {
+ "bin",
+ "lib",
+ "bat",
+ "setup",
+ "setup.bat",
+ "uninstall",
+ "uninstall.bat",
+ "install.html",
+ "install.txt",
+ "legal-notices",
+ "opends_logo.png",
+ "README",
+ "upgrade",
+ "upgrade.bat",
+ "QuickSetup.app",
+ "Uninstall.app"
};
// Files that will be ignored during backup
@@ -218,10 +248,21 @@
initLoader();
}
- final String instanceRootFromSystem =
+ final String installRootFromSystem =
System.getProperty(SYS_PROP_INSTALL_ROOT);
- if (instanceRootFromSystem != null) {
- setInstallation(new Installation(instanceRootFromSystem));
+ final String instanceRootFromSystem =
+ System.getProperty(SYS_PROP_INSTANCE_ROOT);
+ if (installRootFromSystem != null)
+ {
+ if (instanceRootFromSystem != null)
+ {
+ setInstallation(new Installation(installRootFromSystem,
+ instanceRootFromSystem));
+ } else
+ {
+ setInstallation(new Installation(installRootFromSystem,
+ installRootFromSystem));
+ }
}
}
@@ -311,25 +352,67 @@
*/
public String getInstallationPath() {
// The upgrader runs from the bits extracted by BuildExtractor
- // in the staging directory. So 'stagePath' below will point
- // to the staging directory [installroot]/tmp/upgrade. However
+ // in the staging directory. However
// we still want the Installation to point at the build being
// upgraded so the install path reported in [installroot].
+ return System.getProperty("INSTALL_ROOT");
+ }
- String installationPath = null;
- String path = Utils.getInstallPathFromClasspath();
- if (path != null) {
- File f = new File(path);
- if (f.getParentFile() != null &&
- f.getParentFile().getParentFile() != null &&
- new File(f.getParentFile().getParentFile(),
- Installation.LOCKS_PATH_RELATIVE).exists()) {
- installationPath = Utils.getPath(f.getParentFile().getParentFile());
- } else {
- installationPath = path;
+ /**
+ * {@inheritDoc}
+ */
+ public String getInstancePath()
+ {
+ String installPath = getInstallationPath();
+ if (installPath == null)
+ {
+ return null;
+ }
+
+ String instancePathFileName = installPath + File.separator + "instance.loc";
+
+ // look for <installPath>/instance.loc
+ File f = new File(instancePathFileName);
+ if (!f.exists())
+ {
+ return installPath;
+ }
+
+ BufferedReader reader;
+ try
+ {
+ reader = new BufferedReader(new FileReader(instancePathFileName));
+ } catch (Exception e)
+ {
+ return installPath;
+ }
+
+ // Read the first line and close the file.
+ String line;
+ try
+ {
+ line = reader.readLine();
+ File instanceLoc = new File(line);
+ if (instanceLoc.isAbsolute())
+ {
+ return instanceLoc.getAbsolutePath();
+ } else
+ {
+ return new File(installPath + File.separator
+ + line).getAbsolutePath();
+ }
+ } catch (Exception e)
+ {
+ return installPath;
+ } finally
+ {
+ try
+ {
+ reader.close();
+ } catch (Exception e)
+ {
}
}
- return installationPath;
}
/**
@@ -588,7 +671,8 @@
"'null'" :
currentInstallation.getRootDirectory()) +
" to " + serverLocation);
- Installation installation = new Installation(serverLocation);
+ Installation installation = new Installation(serverLocation,
+ serverLocation);
setInstallation(installation);
}
@@ -1351,7 +1435,7 @@
File root = getInstallation().getRootDirectory();
File backupDirectory;
try {
- backupDirectory = getFilesBackupDirectory();
+ backupDirectory = getFilesInstallBackupDirectory();
FileManager fm = new FileManager();
boolean restoreError = false;
for (String fileName : backupDirectory.list()) {
@@ -1372,6 +1456,30 @@
fm.deleteRecursively(backupDirectory);
}
+ if (! instanceAndInstallInSameDir())
+ {
+ root = getInstallation().getInstanceDirectory();
+ backupDirectory = getFilesInstanceBackupDirectory();
+ fm = new FileManager();
+ for (String fileName : backupDirectory.list()) {
+ File f = new File(backupDirectory, fileName);
+
+ // Do our best to restore the filesystem like
+ // we found it. Just report potential problems
+ // to the user.
+ try {
+ fm.move(f, root, null);
+ } catch (Throwable t) {
+ restoreError = true;
+ notifyListeners(INFO_ERROR_RESTORING_FILE.get(Utils.getPath(f),
+ Utils.getPath(root)));
+ }
+ }
+ if (!restoreError) {
+ fm.deleteRecursively(backupDirectory);
+ }
+ }
+
// Restart the server after putting the files
// back like we found them.
ServerController sc = new ServerController(getInstallation());
@@ -1398,7 +1506,18 @@
Stage stage = getStage();
Installation installation = getInstallation();
File root = installation.getRootDirectory();
- stage.move(root, new UpgradeFileFilter(getStageDirectory()));
+
+ if (instanceAndInstallInSameDir())
+ {
+ stage.move(root, new UpgradeFileFilter(getStageDirectory()));
+ }
+ else
+ {
+ stage.move(root, new UpgradeFileFilter(getStageDirectory(),true));
+
+ root = installation.getInstanceDirectory();
+ stage.move(root, new UpgradeFileFilter(getStageDirectory(),false));
+ }
// The bits should now be of the new version. Have
// the installation update the build information so
@@ -1418,7 +1537,7 @@
// The config directory may contain files that are needed
// by the new installation (e.g. SSL config files and tasks)
File oldConfigDir =
- new File(getFilesBackupDirectory(),
+ new File(getFilesInstanceBackupDirectory(),
Installation.CONFIG_PATH_RELATIVE);
File newConfigDir =
getInstallation().getConfigurationDirectory();
@@ -1440,7 +1559,9 @@
private void backupFilesystem() throws ApplicationException {
try {
- File filesBackupDirectory = getFilesBackupDirectory();
+ // Backup first install (potentially everything if install and instance
+ // are in the same dir
+ File filesBackupDirectory = getFilesInstallBackupDirectory();
FileManager fm = new FileManager();
File root = getInstallation().getRootDirectory();
FileFilter filter = new UpgradeFileFilter(root);
@@ -1458,6 +1579,27 @@
fm.move(f, filesBackupDirectory, filter);
}
+ if (!instanceAndInstallInSameDir())
+ {
+ filesBackupDirectory = getFilesInstanceBackupDirectory();
+ root = getInstallation().getInstanceDirectory();
+ filter = new UpgradeFileFilter(root);
+ for (String fileName : root.list())
+ {
+ File f = new File(root, fileName);
+
+ // Replacing a Windows bat file while it is running with a different
+ // version leads to unpredictable behavior so we make a special case
+ // here and during the upgrade components step. This file will only
+ // be backed up at the end of the process if everything went fine.
+ if (Utils.isWindows()
+ && fileName.equals(Installation.WINDOWS_UPGRADE_FILE_NAME))
+ {
+ continue;
+ }
+ fm.move(f, filesBackupDirectory, filter);
+ }
+ }
} catch (ApplicationException ae) {
throw ae;
} catch (Exception e) {
@@ -1480,7 +1622,7 @@
{
if (Utils.isWindows())
{
- File filesBackupDirectory = getFilesBackupDirectory();
+ File filesBackupDirectory = getFilesInstallBackupDirectory();
FileManager fm = new FileManager();
File root = getInstallation().getRootDirectory();
File f = new File(root, Installation.WINDOWS_UPGRADE_FILE_NAME);
@@ -1620,7 +1762,8 @@
File stageDir = getStageDirectory();
try {
Installation.validateRootDirectory(stageDir);
- stagedInstallation = new Installation(getStageDirectory());
+ stagedInstallation = new Installation(getStageDirectory(),
+ getStageDirectory());
} catch (IllegalArgumentException e) {
Message msg = INFO_ERROR_BAD_STAGE_DIRECTORY.get(
Utils.getPath(getStageDirectory()));
@@ -1746,6 +1889,37 @@
return (UpgradeUserData) getUserData();
}
+ private boolean instanceAndInstallInSameDir()
+ {
+ File installDir = new File(getInstallationPath()) ;
+ File instanceDir = new File(getInstancePath()) ;
+ return installDir.getAbsolutePath().equals(instanceDir.getAbsolutePath());
+ }
+
+ private File getFilesInstanceBackupDirectory() throws IOException
+ {
+ if (instanceAndInstallInSameDir())
+ {
+ return getFilesBackupDirectory();
+ } else
+ {
+ return new File(getFilesBackupDirectory(),
+ Installation.HISTORY_BACKUP_FILES_DIR_INSTANCE);
+ }
+ }
+
+ private File getFilesInstallBackupDirectory() throws IOException
+ {
+ if (instanceAndInstallInSameDir())
+ {
+ return getFilesBackupDirectory();
+ } else
+ {
+ return new File(getFilesBackupDirectory(),
+ Installation.HISTORY_BACKUP_FILES_DIR_INSTALL);
+ }
+ }
+
private File getFilesBackupDirectory() throws IOException {
File files = new File(getUpgradeBackupDirectory(),
Installation.HISTORY_BACKUP_FILES_DIR_NAME);
@@ -1754,6 +1928,29 @@
throw new IOException("error creating files backup directory");
}
}
+
+ // Check if instance and instance are in the same dir
+ if ( ! instanceAndInstallInSameDir())
+ {
+ File install = new File(files,
+ Installation.HISTORY_BACKUP_FILES_DIR_INSTALL);
+ if (!install.exists())
+ {
+ if (!install.mkdirs())
+ {
+ throw new IOException("error creating files backup directory");
+ }
+ }
+ File instance = new File(files,
+ Installation.HISTORY_BACKUP_FILES_DIR_INSTANCE);
+ if (!instance.exists())
+ {
+ if (!instance.mkdirs())
+ {
+ throw new IOException("error creating files backup directory");
+ }
+ }
+ }
return files;
}
--
Gitblit v1.10.0