diff options
Diffstat (limited to 'javainstaller2/src/JavaSetup/org/openoffice/setup/InstallerHelper/LinuxHelper.java')
-rwxr-xr-x | javainstaller2/src/JavaSetup/org/openoffice/setup/InstallerHelper/LinuxHelper.java | 540 |
1 files changed, 540 insertions, 0 deletions
diff --git a/javainstaller2/src/JavaSetup/org/openoffice/setup/InstallerHelper/LinuxHelper.java b/javainstaller2/src/JavaSetup/org/openoffice/setup/InstallerHelper/LinuxHelper.java new file mode 100755 index 000000000000..91e8463fdc03 --- /dev/null +++ b/javainstaller2/src/JavaSetup/org/openoffice/setup/InstallerHelper/LinuxHelper.java @@ -0,0 +1,540 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +package org.openoffice.setup.InstallerHelper; + +import org.openoffice.setup.InstallData; +import org.openoffice.setup.SetupData.PackageDescription; +import org.openoffice.setup.Util.Converter; +import org.openoffice.setup.Util.ExecuteProcess; +import org.openoffice.setup.Util.LogManager; +import org.openoffice.setup.Util.SystemManager; +import java.io.File; +import java.util.Enumeration; +import java.util.HashMap; +import java.util.Vector;public class LinuxHelper { + + public LinuxHelper() { + super(); + } + + private void getPackageNamesContent(PackageDescription packageData, Vector packageNames) { + if (( packageData.getPackageName() != null ) && ( ! packageData.getPackageName().equals(""))) { + packageNames.add(packageData.getPackageName() + "=" + packageData.getFullPackageName()); + } + + for (Enumeration e = packageData.children(); e.hasMoreElements(); ) { + PackageDescription child = (PackageDescription) e.nextElement(); + getPackageNamesContent(child, packageNames); + } + } + + private String getPackageNameFromRpm(PackageDescription packageData, InstallData installData) { + String fullPackageName = null; + String packagePath = installData.getPackagePath(); + + if (( packageData.getPkgSubdir() != null ) && ( ! packageData.getPkgSubdir().equals("") )) { + File completePackageFile = new File(packagePath, packageData.getPkgSubdir()); + packagePath = completePackageFile.getPath(); + } + + String rpmFileName = packageData.getPackageName(); + File rpmFile = new File(packagePath, rpmFileName); + + if ( rpmFile.exists() ) { + String rpmCommand = "rpm -qp " + rpmFile.getPath(); + String[] rpmCommandArray = new String[3]; + rpmCommandArray[0] = "rpm"; + rpmCommandArray[1] = "-qp"; + rpmCommandArray[2] = rpmFile.getPath(); + + Vector returnVector = new Vector(); + Vector returnErrorVector = new Vector(); + int returnValue = ExecuteProcess.executeProcessReturnVector(rpmCommandArray, returnVector, returnErrorVector); + String returnString = (String) returnVector.get(0); + + String log = rpmCommand + "<br><b>Returns: " + returnString + "</b><br>"; + LogManager.addCommandsLogfileComment(log); + + fullPackageName = returnString; + + } else { + System.err.println("Error: Could not find file " + rpmFile.getPath()); + } + + return fullPackageName; + } + + private boolean checkPackageExistence(PackageDescription packageData, InstallData installData) { + boolean fileExists = false; + + String packagePath = installData.getPackagePath(); + + if (( packageData.getPkgSubdir() != null ) && ( ! packageData.getPkgSubdir().equals("") )) { + File completePackageFile = new File(packagePath, packageData.getPkgSubdir()); + packagePath = completePackageFile.getPath(); + } + + String rpmFileName = packageData.getPackageName(); + + File rpmFile = new File(packagePath, rpmFileName); + if ( rpmFile.exists() ) { + fileExists = true; + } + + return fileExists; + } + + private HashMap analyzeVersionString(String versionString) { + + boolean errorOccured = false; + + Integer micro = null; + Integer minor = null; + Integer major = null; + Integer release = null; + + String microString = null; + String minorString = null; + String majorString = null; + String releaseString = null; + + int pos = versionString.lastIndexOf("_"); // this is a jre RPM (1.5.0_06) + + if ( pos > -1 ) { + try { + releaseString = versionString.substring(pos+1, versionString.length()); + versionString = versionString.substring(0, pos); + } catch (IndexOutOfBoundsException ex) { + System.err.println("Error: Could not get substring from " + versionString); + errorOccured = true; + } + try { + int releaseInt = Integer.parseInt(releaseString); + release = new Integer(releaseInt); + } catch (NumberFormatException ex) { + System.err.println("Error: Could not convert " + releaseString + " to integer"); + errorOccured = true; + } + } + + // Problem: Some rpms have "2.3" instead of "2.3.0" + String compareString = versionString; + pos = compareString.lastIndexOf("."); // returns "-1", if not found + if ( pos > -1 ) { + String substring = compareString.substring(0, pos); + pos = substring.lastIndexOf("."); // returns "-1", if not found + if ( pos == -1 ) { + versionString = versionString + ".0"; + // System.err.println("Warning: Changing from " + compareString + " to " + versionString); + } + } else { + versionString = versionString + ".0.0"; + } + + // the standard analyzing mechanism + pos = versionString.lastIndexOf("."); // returns "-1", if not found + + if ( pos > -1 ) + { + try { + microString = versionString.substring(pos+1, versionString.length()); + versionString = versionString.substring(0, pos); + } catch (IndexOutOfBoundsException ex) { + System.err.println("Error: Could not get substring from " + versionString); + errorOccured = true; + } + + pos = versionString.lastIndexOf("."); + if ( pos > -1 ) { + try { + minorString = versionString.substring(pos+1, versionString.length()); + majorString = versionString.substring(0, pos); + } catch (IndexOutOfBoundsException ex) { + System.err.println("Error: Could not get substring from " + versionString); + errorOccured = true; + } + try { + int microInt = Integer.parseInt(microString); + int minorInt = Integer.parseInt(minorString); + int majorInt = Integer.parseInt(majorString); + micro = new Integer(microInt); + minor = new Integer(minorInt); + major = new Integer(majorInt); + } catch (NumberFormatException ex) { + System.err.println("Error: Could not convert " + microString + "," + + minorString + " or " + majorString + " to integer"); + errorOccured = true; + } + } + } + + // if ( microString == null ) { microString = ""; } + // if ( majorString == null ) { majorString = ""; } + // if ( releaseString == null ) { releaseString = ""; } + // if ( minorString == null ) { minorString = ""; } + // System.err.println("Major " + majorString + " Minor: " + minorString + " Micro: " + microString + " Release: " + releaseString); + + if ( errorOccured ) { + micro = null; + minor = null; + major = null; + release = null; + } + + HashMap hashRpm = new HashMap(); + + hashRpm.put("micro", micro); + hashRpm.put("minor", minor); + hashRpm.put("major", major); + hashRpm.put("release", release); + + // If one of this values is "null", procedure "compareTwoRpms" always delivers false. + // This means, that the installed package is not older. + + // System.err.println("Analyzed: " + "micro: " + hashRpm.get("micro").toString() + " minor: " + hashRpm.get("minor").toString() + " major: " + hashRpm.get("major").toString()); + + return hashRpm; + } + + private HashMap analyzeReleaseString(HashMap hashRpm, String releaseString) { + int release; + + try { + release = Integer.parseInt(releaseString); + Integer releaseObj = new Integer(release); + hashRpm.put("release", releaseObj); + } + catch (NumberFormatException ex) { + // JRE often contain a string like "FCS" + // System.err.println("Error: Could not convert " + releaseString + " to integer"); + hashRpm.put("release", null); + } + + return hashRpm; + } + + 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; + } + + private boolean compareTwoRpms(HashMap hash1, HashMap hash2) { + boolean hash1IsOlder = false; + + if (( hash1.get("major") != null ) && ( hash2.get("major") != null )) { + if ( ((Integer)hash1.get("major")).intValue() < ((Integer)hash2.get("major")).intValue() ) { + hash1IsOlder = true; + } else { + if (( hash1.get("minor") != null ) && ( hash2.get("minor") != null )) { + if ( ((Integer)hash1.get("minor")).intValue() < ((Integer)hash2.get("minor")).intValue() ) { + hash1IsOlder = true; + } else { + if (( hash1.get("micro") != null ) && ( hash2.get("micro") != null )) { + if ( ((Integer)hash1.get("micro")).intValue() < ((Integer)hash2.get("micro")).intValue() ) { + hash1IsOlder = true; + } else { + if (( hash1.get("release") != null ) && ( hash2.get("release") != null )) { + if ( ((Integer)hash1.get("release")).intValue() < ((Integer)hash2.get("release")).intValue() ) { + hash1IsOlder = true; + } + } + } + } + } + } + } + } + + return hash1IsOlder; + } + + public boolean compareVersionAndRelease(String versionString, String releaseString, PackageDescription packageData, boolean checkIfInstalledIsOlder) { + // version and release are gotten from the rpm database. packageData contains + // the information about the rpm, that shall be installed. It has to be installed, + // if the installed product defined by version and release is older. + // version is something like "2.0.3", release something like "164". + // An exception is the jre package, where version is "1.5.0_06" and release "fcs". + + HashMap installedRpm = analyzeVersionString(versionString); + if ( installedRpm.get("release") == null ) { + installedRpm = analyzeReleaseString(installedRpm, releaseString); + } + + // System.err.println("Package: " + packageData.getPackageName()); + // String outputString = "Installed RPM: "; + // if ( installedRpm.get("major") != null ) { outputString = outputString + " major: " + installedRpm.get("major").toString(); } + // else { outputString = outputString + " major is null"; } + // if ( installedRpm.get("minor") != null ) { outputString = outputString + " minor: " + installedRpm.get("minor").toString(); } + // else { outputString = outputString + " minor is null"; } + // if ( installedRpm.get("micro") != null ) { outputString = outputString + " micro: " + installedRpm.get("micro").toString(); } + // else { outputString = outputString + " micro is null"; } + // if ( installedRpm.get("release") != null ) { outputString = outputString + " release: " + installedRpm.get("release").toString(); } + // else { outputString = outputString + " release is null"; } + // System.err.println(outputString); + + HashMap notInstalledRpm = analyzeVersionString(packageData.getPkgVersion()); + if ( notInstalledRpm.get("release") == null ) { + notInstalledRpm = analyzeReleaseString(notInstalledRpm, packageData.getPkgRelease()); + } + + // outputString = "Not installed RPM: "; + // if ( notInstalledRpm.get("major") != null ) { outputString = outputString + " major: " + notInstalledRpm.get("major").toString(); } + // else { outputString = outputString + " major is null"; } + // if ( notInstalledRpm.get("minor") != null ) { outputString = outputString + " minor: " + notInstalledRpm.get("minor").toString(); } + // else { outputString = outputString + " minor is null"; } + // if ( notInstalledRpm.get("micro") != null ) { outputString = outputString + " micro: " + notInstalledRpm.get("micro").toString(); } + // else { outputString = outputString + " micro is null"; } + // if ( notInstalledRpm.get("release") != null ) { outputString = outputString + " release: " + notInstalledRpm.get("release").toString(); } + // else { outputString = outputString + " release is null"; } + // System.err.println(outputString); + + boolean firstIsOlder = false; + + if ( checkIfInstalledIsOlder ) { + firstIsOlder = compareTwoRpms(installedRpm, notInstalledRpm); + // System.err.println("Result: Installed RPM is older: " + firstIsOlder); + } else { + firstIsOlder = compareTwoRpms(notInstalledRpm, installedRpm); + // System.err.println("Result: Not installed RPM is older: " + firstIsOlder); + } + + return firstIsOlder; + } + + public void getLinuxPackageNamesFromRpmquery(PackageDescription packageData, InstallData installData) { + + if ((packageData.getPackageName() != null) && ( ! packageData.getPackageName().equals(""))) { + + boolean rpmExists = checkPackageExistence(packageData, installData); + + if ( rpmExists ) { + // Full package name not defined in xpd file + if (( packageData.getFullPackageName() == null ) || ( packageData.getFullPackageName().equals(""))) { + // Now it is possible to query the rpm database for the packageName, if it is not defined in xpd file! + String fullPackageName = getPackageNameFromRpm(packageData, installData); + if ( fullPackageName != null ) { + packageData.setFullPackageName(fullPackageName); + } else { + System.err.println("Error: Linux package name not defined in xpd file and could not be determined: " + + packageData.getPackageName()); + } + } + packageData.setPkgExists(true); + + } else { + packageData.setPkgExists(false); + } + + } + + for (Enumeration e = packageData.children(); e.hasMoreElements(); ) { + PackageDescription child = (PackageDescription) e.nextElement(); + getLinuxPackageNamesFromRpmquery(child, installData); + } + } + + public String getLinuxDatabasePath(InstallData data) { + String databasePath = null; + String installDir = data.getInstallDir(); + String databaseDir = installDir; + // String databaseDir = SystemManager.getParentDirectory(installDir); + String linuxDatabaseName = ".RPM_OFFICE_DATABASE"; + File databaseFile = new File(databaseDir, linuxDatabaseName); + databasePath = databaseFile.getPath(); + return databasePath; + } + + public void investigateDebian(InstallData data) { + + // First check: Is this a Debian system? + + String dpkgFile = "/usr/bin/dpkg"; + + if ( new File(dpkgFile).exists() ) { + + data.setIsDebianSystem(true); + + // Second check: If this is a Debian system, is "--force-debian" required? Older + // versions do not support "--force-debian". + + // String rpmQuery = "rpm --help; + String[] rpmQueryArray = new String[2]; + rpmQueryArray[0] = "rpm"; + rpmQueryArray[1] = "--help"; + + Vector returnVector = new Vector(); + Vector returnErrorVector = new Vector(); + int returnValue = ExecuteProcess.executeProcessReturnVector(rpmQueryArray, returnVector, returnErrorVector); + + // Checking if the return vector contains the string "force-debian" + + for (int i = 0; i < returnVector.size(); i++) { + String line = (String) returnVector.get(i); + if ( line.indexOf("force-debian") > -1 ) { + data.setUseForceDebian(true); + } + } + } + } + + public void getLinuxFileInfo(PackageDescription packageData) { + // analyzing a string like "openoffice-core01-2.0.3-159" as "name-version-release" + InstallData data = InstallData.getInstance(); + if ( packageData.pkgExists() ) { + if (( packageData.getFullPackageName() != null ) && ( ! packageData.getFullPackageName().equals(""))) { + String longName = packageData.getFullPackageName(); + + int pos = longName.lastIndexOf("-"); + if (data.isInstallationMode()) { + // not saving at uninstallation, because it can be updated without GUI installer + packageData.setPkgRelease(longName.substring(pos+1, longName.length())); + } + longName = longName.substring(0, pos); + + pos = longName.lastIndexOf("-"); + if (data.isInstallationMode()) { + // not saving at uninstallation, because it can be updated without GUI installer + packageData.setPkgVersion(longName.substring(pos+1, longName.length())); + } + packageData.setPkgRealName(longName.substring(0, pos)); + } + } + + for (Enumeration e = packageData.children(); e.hasMoreElements(); ) { + PackageDescription child = (PackageDescription) e.nextElement(); + getLinuxFileInfo(child); + } + + } + + public void setFullPackageNameAtUninstall(PackageDescription packageData, HashMap packageNames) { + + if (( packageData.getPackageName() != null ) && ( ! packageData.getPackageName().equals(""))) { + if (( packageData.getFullPackageName() == null ) || ( packageData.getFullPackageName().equals(""))) { + String packageName = packageData.getPackageName(); + // Does this always exist? Should not be required! + // But is there another way to get the packageNames, without this file? + // During installation the packageNames can be determined by querying the rpm file + // -> this is not possible during uninstallation + String fullPackageName = (String) packageNames.get(packageName); + packageData.setFullPackageName(fullPackageName); + } + } + + for (Enumeration e = packageData.children(); e.hasMoreElements(); ) { + PackageDescription child = (PackageDescription) e.nextElement(); + setFullPackageNameAtUninstall(child, packageNames); + } + } + + public String getRelocationString(PackageDescription packageData, String packageName) { + String relocationString = null; + + if ( packageData.isRelocatable() ) { + // String rpmQuery = "rpm -qp --qf %{PREFIXES}" + " " + packageName; + String[] rpmQueryArray = new String[5]; + rpmQueryArray[0] = "rpm"; + rpmQueryArray[1] = "-qp"; + rpmQueryArray[2] = "--qf"; + rpmQueryArray[3] = "%{PREFIXES}"; + rpmQueryArray[4] = packageName; + + Vector returnVector = new Vector(); + Vector returnErrorVector = new Vector(); + int returnValue = ExecuteProcess.executeProcessReturnVector(rpmQueryArray, returnVector, returnErrorVector); + relocationString = (String) returnVector.get(0); + } + + return relocationString; + } + + public void createPackageNameFileAtPostinstall(InstallData data, PackageDescription packageData) { + + // The file "packageNames" must not be an own database! It must be possible to install + // and deinstall RPMs without this GUI installer. Therefore the file packageNames is + // not always up to date. Nevertheless it makes the deinstallation faster, because of + // all packages, whose "real" package name is not defined in xpd files (for example + // "openoffice-core01-2.0.3-159.rpm" hat the "real" name "openoffice-core01" that is + // used for deinstallation) this can be read in this file. Otherwise it would be + // neccessary to determine the "real" name with a database question. + // The version and release that are also stored in file "packageNames" must not be + // used for deinstallation because they are probably not up to date. + + File destDir = new File(data.getInstallDefaultDir(), data.getProductDir()); + File uninstallDir = new File(destDir, data.getUninstallDirName()); + String fileName = "packageNames"; + File packageNamesFile = new File(uninstallDir, fileName); + Vector packageNames = new Vector(); + getPackageNamesContent(packageData, packageNames); + SystemManager.saveCharFileVector(packageNamesFile.getPath(), packageNames); + } + + public HashMap readPackageNamesFile() { + // package names are stored in file "packageNames" in data.getInfoRoot() directory + String fileName = "packageNames"; + InstallData data = InstallData.getInstance(); + File dir = data.getInfoRoot(); + File file = new File(dir, fileName); + Vector fileContent = SystemManager.readCharFileVector(file.getPath()); + HashMap map = Converter.convertVectorToHashmap(fileContent); + return map; + } + + public void saveModulesLogFile(InstallData data) { + if ( data.logModuleStates() ) { + Vector logContent = LogManager.getModulesLogFile(); + File destDir = new File(data.getInstallDefaultDir(), data.getProductDir()); + File uninstallDir = new File(destDir, data.getUninstallDirName()); + File modulesLogFile = new File(uninstallDir, "moduleSettingsLog.txt"); + SystemManager.saveCharFileVector(modulesLogFile.getPath(), logContent); + } + } + + public String fixInstallationDirectory(String installDir) { + // inject a second slash to the last path segment to avoid rpm 3 concatenation bug + int lastSlashPos = installDir.lastIndexOf('/'); + String sub1 = installDir.substring(0,lastSlashPos); + String sub2 = installDir.substring(lastSlashPos); + String fixedInstallDir = sub1 + "/" + sub2; + // fixedInstallDir.replaceAll(" ", "%20"); + return fixedInstallDir; + } + +} |