/************************************************************** * * 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 + "
Returns: " + uniqueLocalDir + "
"; 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 + "
Returns: " + returnValue + "
"; 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 /opt/var/sadm/pkg//pkginfo? return firstPackageIsOlder; } }