blob: d7518baef546e5bba3a12038720e2ad133381e60 [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
package org.openoffice.setup.InstallerHelper;
import org.openoffice.setup.InstallData;
import org.openoffice.setup.ResourceManager;
import org.openoffice.setup.SetupData.PackageDescription;
import org.openoffice.setup.Util.Controller;
import org.openoffice.setup.Util.Converter;
import org.openoffice.setup.Util.ExecuteProcess;
import org.openoffice.setup.Util.Informer;
import org.openoffice.setup.Util.LogManager;
import org.openoffice.setup.Util.SystemManager;
import java.io.File;
import java.util.HashMap;
import java.util.Vector;
public class SolarisHelper {
public SolarisHelper() {
}
private void createLocalTempDir() {
String mktempString = "/usr/bin/mktemp";
File mktemp = new File(mktempString);
if ( mktemp.exists() ) {
// this is Solaris 10
LogManager.setCommandsHeaderLine("Preparing Solaris 10 user installation");
InstallData data = InstallData.getInstance();
String mktempCommand = mktempString + " -d";
String[] mktempCommandArray = new String[2];
mktempCommandArray[0] = mktempString;
mktempCommandArray[1] = "-d";
Vector returnVector = new Vector();
Vector returnErrorVector = new Vector();
int returnValue = ExecuteProcess.executeProcessReturnVector(mktempCommandArray, returnVector, returnErrorVector);
String uniqueLocalDir = (String) returnVector.get(0);
data.setLocalTempPath(uniqueLocalDir);
String log = mktempCommand + "<br><b>Returns: " + uniqueLocalDir + "</b><br>";
LogManager.addCommandsLogfileComment(log);
String installRoot = data.getInstallDir();
File installRootTemp = new File(installRoot, "tmp");
if ( installRootTemp.exists() ) {
SystemManager.removeDirectory(installRootTemp);
}
String linkCommand = "ln -s " + uniqueLocalDir + " " + installRootTemp.getPath();
String[] linkCommandArray = new String[4];
linkCommandArray[0] = "ln";
linkCommandArray[1] = "-s";
linkCommandArray[2] = uniqueLocalDir;
linkCommandArray[3] = installRootTemp.getPath();
// Vector returnVector = new Vector();
returnValue = ExecuteProcess.executeProcessReturnValue(linkCommandArray);
log = linkCommand + "<br><b>Returns: " + returnValue + "</b><br>";
LogManager.addCommandsLogfileComment(log);
}
}
private void removeLocalTempDir() {
InstallData data = InstallData.getInstance();
if ( data.getLocalTempPath() != null ) {
File installRootTemp = new File(data.getInstallDir(), "tmp");
if ( installRootTemp.exists() ) {
installRootTemp.delete(); // removing the link
SystemManager.createDirectory(installRootTemp);
}
File localTemp = new File(data.getLocalTempPath());
if ( localTemp.exists() ) {
SystemManager.removeDirectory(localTemp);
}
}
}
private Vector getAdminFileContent(boolean relocatable, boolean rdepends) {
Vector adminFile = new Vector();
InstallData data = InstallData.getInstance();
// if ( relocatable ) {
// String installDir = data.getInstallDir();
// // installDir = installDir.replace(" ", "\\ ");
// String baseDirLine = "basedir=" + installDir;
// adminFile.add(baseDirLine);
// }
String mailLine = "mail=";
adminFile.add(mailLine);
String conflictLine = "conflict=nochange";
if ( data.isUserInstallation() ) { conflictLine = "conflict=nochange"; }
adminFile.add(conflictLine);
String runlevelLine = "runlevel=nocheck";
adminFile.add(runlevelLine);
String setuidLine = "setuid=quit";
if ( data.isUserInstallation() ) { setuidLine = "setuid=nocheck"; }
adminFile.add(setuidLine);
String actionLine = "action=nocheck";
adminFile.add(actionLine);
String partialLine = "partial=quit";
if ( data.isUserInstallation() ) { partialLine = "partial=nocheck"; }
adminFile.add(partialLine);
String instanceLine = "instance=unique";
adminFile.add(instanceLine);
// String idependLine = "idepend=quit";
String idependLine = "idepend=nocheck";
// if ( data.isUserInstallation() ) { idependLine = "idepend=nocheck"; }
adminFile.add(idependLine);
// String rdependLine = "rdepend=nocheck";
String rdependLine = "rdepend=quit";
if ( ! rdepends ) { rdependLine = "rdepend=nocheck"; }
if ( data.isUserInstallation() ) { rdependLine = "rdepend=nocheck"; }
adminFile.add(rdependLine);
String spaceLine = "space=quit";
if ( data.isUserInstallation() ) { spaceLine = "space=nocheck"; }
adminFile.add(spaceLine);
return adminFile;
}
private String getMainVersion (String version) {
String mainVersion = null;
int pos = version.indexOf(",");
if ( pos > -1 ) {
mainVersion = version.substring(0, pos);
}
return mainVersion;
}
private String getPackageRevision(String version) {
String revision = null;
int pos = version.indexOf("=");
if ( pos > -1 ) {
revision = version.substring(pos + 1, version.length() );
}
return revision;
}
private Vector getVectorOfNumbers(String version) {
Vector numbers = new Vector();
int pos = -1;
// getting number from a string in format 2.0.0
do {
pos = version.indexOf(".");
if ( pos > -1 ) {
String number = version.substring(0, pos);
version = version.substring(pos + 1, version.length());
numbers.add(number);
}
} while ( pos > -1 );
numbers.add(version);
return numbers;
}
private int getMinimum(int a, int b) {
int minimum;
if ( a < b ) {
minimum = a;
} else {
minimum = b;
}
return minimum;
}
private String compareVersion(String firstVersion, String secondVersion) {
// comparing strings with syntax 2.0.0
String comparison = "bothPackagesAreEqual";
Vector firstVector = getVectorOfNumbers(firstVersion);
Vector secondVector = getVectorOfNumbers(secondVersion);
int firstLength = firstVector.size();
int secondLength = secondVector.size();
int minimum = getMinimum(firstLength, secondLength);
for (int i = 0; i < minimum; i++) {
String firstS = (String)firstVector.get(i);
String secondS = (String)secondVector.get(i);
int first = Integer.parseInt(firstS);
int second_ = Integer.parseInt(secondS);
if ( second_ > first ) {
comparison = "firstPackageIsOlder";
break;
} else if ( second_ < first ) {
comparison = "secondPackageIsOlder";
break;
}
}
return comparison;
}
public void saveModulesLogFile(InstallData data) {
if ( data.logModuleStates() ) {
Vector logContent = LogManager.getModulesLogFile();
File baseDir = new File(data.getInstallDefaultDir(), data.getProductDir());
File uninstallDir = new File(baseDir, data.getUninstallDirName());
File modulesLogFile = new File(uninstallDir, "moduleSettingsLog.txt");
// System.err.println("Saving file: " + modulesLogFile.getPath());
SystemManager.saveCharFileVector(modulesLogFile.getPath(), logContent);
}
}
public void removeSolarisLockFile() {
String lockFileName = "/tmp/.ai.pkg.zone.lock-afdb66cf-1dd1-11b2-a049-000d560ddc3e";
File lockFile = new File(lockFileName);
if ( lockFile.exists() ) {
// System.err.println("Found file: " + lockFileName);
boolean deleted = lockFile.delete();
}
}
public String getSolarisDatabasePath(InstallData data) {
String databasePath = null;
databasePath = data.getInstallDir();
return databasePath;
}
public void createAdminFile(boolean relocatable, boolean rdepends) {
InstallData data = InstallData.getInstance();
Vector removeFiles = data.getRemoveFiles();
String adminFileName = "";
if ( relocatable ) {
if ( rdepends ) {
adminFileName = "adminFileReloc";
} else {
adminFileName = "adminFileRelocNoDepends";
}
} else {
if ( rdepends ) {
adminFileName = "adminFileNoReloc";
} else {
adminFileName = "adminFileNoRelocNoDepends";
}
}
Vector fileContent = getAdminFileContent(relocatable, rdepends);
File adminFile = new File(data.getInstallDir(), adminFileName);
String completeAdminFileName = adminFile.getPath();
if ( relocatable ) {
if ( rdepends ) {
data.setAdminFileNameReloc(completeAdminFileName);
} else {
data.setAdminFileNameRelocNoDepends(completeAdminFileName);
}
} else {
if ( rdepends ) {
data.setAdminFileNameNoReloc(completeAdminFileName);
} else {
data.setAdminFileNameNoRelocNoDepends(completeAdminFileName);
}
}
if ( ! adminFile.exists() ) {
// only saving, if it did not exist
SystemManager.saveCharFileVector(completeAdminFileName, fileContent);
// only removing file in aborted installation, if it was created before
removeFiles.add(completeAdminFileName);
}
// File dumpFile = new File(data.getInstallDir(), "dumpFile");
// String dumpFileName = dumpFile.getPath();
// SystemManager.dumpFile(adminFileName, dumpFileName);
}
// for user installations an environment hashmap is used
public void setEnvironmentForUserInstall() {
InstallData data = InstallData.getInstance();
HashMap env = SystemManager.getEnvironmentHashMap();
env.put("LD_PRELOAD_32", data.getGetUidPath());
data.setShellEnvironment(env);
}
public String getVersionString(Vector returnVector) {
String versionString = null;
String versionLine = null;
for (int i = 0; i < returnVector.size(); i++) {
String line = (String) returnVector.get(i);
int pos = line.indexOf("REV=");
if ( pos > -1 ) {
versionLine = line;
break;
}
}
if ( versionLine != null ) {
versionLine = versionLine.trim();
int pos = versionLine.lastIndexOf(" ");
versionString = versionLine.substring(pos + 1, versionLine.length());
}
return versionString;
}
public int getInstalledMinor(String version) {
int minor = 0;
int pos = version.indexOf(".");
if ( pos > -1 ) {
String reduced = version.substring(pos + 1, version.length());
pos = reduced.indexOf(".");
if ( pos > -1 ) {
reduced = reduced.substring(0, pos);
minor = Integer.parseInt(reduced);
}
}
return minor;
}
public boolean comparePackageVersions(String firstPackageVersion, String secondPackageVersion) {
// Analyzing strings: version, 2.0.0,REV=106.2005.05.26
boolean firstPackageIsOlder = false;
String comparison = null;
String firstPackageMainVersion = getMainVersion(firstPackageVersion); // 2.0.0
String secondPackageMainVersion = getMainVersion(secondPackageVersion); // 2.0.0
if (( firstPackageMainVersion != null ) && ( secondPackageMainVersion != null )) {
comparison = compareVersion(firstPackageMainVersion, secondPackageMainVersion);
}
if ( comparison.equals("firstPackageIsOlder") ) {
firstPackageIsOlder = true;
} else if ( comparison.equals("secondPackageIsOlder") ) {
firstPackageIsOlder = false;
} else if ( comparison.equals("bothPackagesAreEqual") ) {
String firstPackageRevision = getPackageRevision(firstPackageVersion); // 106.2005.05.26
String secondPackageRevision = getPackageRevision(secondPackageVersion); // 106.2005.05.26
if (( firstPackageRevision != null ) && ( secondPackageRevision != null )) {
comparison = compareVersion(firstPackageRevision, secondPackageRevision);
if ( comparison.equals("firstPackageIsOlder") ) {
firstPackageIsOlder = true;
} else {
firstPackageIsOlder = false;
}
}
}
// If version is equal, the patchlevel has to be analyzed
// -> pkginfo does not offer this information
// -> looking into file <root>/opt/var/sadm/pkg/<package>/pkginfo?
return firstPackageIsOlder;
}
}