19a1eeea9SAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 39a1eeea9SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 49a1eeea9SAndrew Rist * or more contributor license agreements. See the NOTICE file 59a1eeea9SAndrew Rist * distributed with this work for additional information 69a1eeea9SAndrew Rist * regarding copyright ownership. The ASF licenses this file 79a1eeea9SAndrew Rist * to you under the Apache License, Version 2.0 (the 89a1eeea9SAndrew Rist * "License"); you may not use this file except in compliance 99a1eeea9SAndrew Rist * with the License. You may obtain a copy of the License at 10cdf0e10cSrcweir * 119a1eeea9SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12cdf0e10cSrcweir * 139a1eeea9SAndrew Rist * Unless required by applicable law or agreed to in writing, 149a1eeea9SAndrew Rist * software distributed under the License is distributed on an 159a1eeea9SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 169a1eeea9SAndrew Rist * KIND, either express or implied. See the License for the 179a1eeea9SAndrew Rist * specific language governing permissions and limitations 189a1eeea9SAndrew Rist * under the License. 19cdf0e10cSrcweir * 209a1eeea9SAndrew Rist *************************************************************/ 219a1eeea9SAndrew Rist 229a1eeea9SAndrew Rist 23cdf0e10cSrcweir 24cdf0e10cSrcweir package org.openoffice.setup.InstallerHelper; 25cdf0e10cSrcweir 26cdf0e10cSrcweir import org.openoffice.setup.InstallData; 27cdf0e10cSrcweir import org.openoffice.setup.SetupData.PackageDescription; 28cdf0e10cSrcweir import org.openoffice.setup.Util.Converter; 29cdf0e10cSrcweir import org.openoffice.setup.Util.ExecuteProcess; 30cdf0e10cSrcweir import org.openoffice.setup.Util.LogManager; 31cdf0e10cSrcweir import org.openoffice.setup.Util.SystemManager; 32cdf0e10cSrcweir import java.io.File; 33cdf0e10cSrcweir import java.util.Enumeration; 34cdf0e10cSrcweir import java.util.HashMap; 35cdf0e10cSrcweir import java.util.Vector;public class LinuxHelper { 36cdf0e10cSrcweir LinuxHelper()37cdf0e10cSrcweir public LinuxHelper() { 38cdf0e10cSrcweir super(); 39cdf0e10cSrcweir } 40cdf0e10cSrcweir getPackageNamesContent(PackageDescription packageData, Vector packageNames)41cdf0e10cSrcweir private void getPackageNamesContent(PackageDescription packageData, Vector packageNames) { 42cdf0e10cSrcweir if (( packageData.getPackageName() != null ) && ( ! packageData.getPackageName().equals(""))) { 43cdf0e10cSrcweir packageNames.add(packageData.getPackageName() + "=" + packageData.getFullPackageName()); 44cdf0e10cSrcweir } 45cdf0e10cSrcweir 46cdf0e10cSrcweir for (Enumeration e = packageData.children(); e.hasMoreElements(); ) { 47cdf0e10cSrcweir PackageDescription child = (PackageDescription) e.nextElement(); 48cdf0e10cSrcweir getPackageNamesContent(child, packageNames); 49cdf0e10cSrcweir } 50cdf0e10cSrcweir } 51cdf0e10cSrcweir getPackageNameFromRpm(PackageDescription packageData, InstallData installData)52cdf0e10cSrcweir private String getPackageNameFromRpm(PackageDescription packageData, InstallData installData) { 53cdf0e10cSrcweir String fullPackageName = null; 54cdf0e10cSrcweir String packagePath = installData.getPackagePath(); 55cdf0e10cSrcweir 56cdf0e10cSrcweir if (( packageData.getPkgSubdir() != null ) && ( ! packageData.getPkgSubdir().equals("") )) { 57cdf0e10cSrcweir File completePackageFile = new File(packagePath, packageData.getPkgSubdir()); 58cdf0e10cSrcweir packagePath = completePackageFile.getPath(); 59cdf0e10cSrcweir } 60cdf0e10cSrcweir 61cdf0e10cSrcweir String rpmFileName = packageData.getPackageName(); 62cdf0e10cSrcweir File rpmFile = new File(packagePath, rpmFileName); 63cdf0e10cSrcweir 64cdf0e10cSrcweir if ( rpmFile.exists() ) { 65cdf0e10cSrcweir String rpmCommand = "rpm -qp " + rpmFile.getPath(); 66cdf0e10cSrcweir String[] rpmCommandArray = new String[3]; 67cdf0e10cSrcweir rpmCommandArray[0] = "rpm"; 68cdf0e10cSrcweir rpmCommandArray[1] = "-qp"; 69cdf0e10cSrcweir rpmCommandArray[2] = rpmFile.getPath(); 70cdf0e10cSrcweir 71cdf0e10cSrcweir Vector returnVector = new Vector(); 72cdf0e10cSrcweir Vector returnErrorVector = new Vector(); 73cdf0e10cSrcweir int returnValue = ExecuteProcess.executeProcessReturnVector(rpmCommandArray, returnVector, returnErrorVector); 74cdf0e10cSrcweir String returnString = (String) returnVector.get(0); 75cdf0e10cSrcweir 76cdf0e10cSrcweir String log = rpmCommand + "<br><b>Returns: " + returnString + "</b><br>"; 77cdf0e10cSrcweir LogManager.addCommandsLogfileComment(log); 78cdf0e10cSrcweir 79cdf0e10cSrcweir fullPackageName = returnString; 80cdf0e10cSrcweir 81cdf0e10cSrcweir } else { 82cdf0e10cSrcweir System.err.println("Error: Could not find file " + rpmFile.getPath()); 83cdf0e10cSrcweir } 84cdf0e10cSrcweir 85cdf0e10cSrcweir return fullPackageName; 86cdf0e10cSrcweir } 87cdf0e10cSrcweir checkPackageExistence(PackageDescription packageData, InstallData installData)88cdf0e10cSrcweir private boolean checkPackageExistence(PackageDescription packageData, InstallData installData) { 89cdf0e10cSrcweir boolean fileExists = false; 90cdf0e10cSrcweir 91cdf0e10cSrcweir String packagePath = installData.getPackagePath(); 92cdf0e10cSrcweir 93cdf0e10cSrcweir if (( packageData.getPkgSubdir() != null ) && ( ! packageData.getPkgSubdir().equals("") )) { 94cdf0e10cSrcweir File completePackageFile = new File(packagePath, packageData.getPkgSubdir()); 95cdf0e10cSrcweir packagePath = completePackageFile.getPath(); 96cdf0e10cSrcweir } 97cdf0e10cSrcweir 98cdf0e10cSrcweir String rpmFileName = packageData.getPackageName(); 99cdf0e10cSrcweir 100cdf0e10cSrcweir File rpmFile = new File(packagePath, rpmFileName); 101cdf0e10cSrcweir if ( rpmFile.exists() ) { 102cdf0e10cSrcweir fileExists = true; 103cdf0e10cSrcweir } 104cdf0e10cSrcweir 105cdf0e10cSrcweir return fileExists; 106cdf0e10cSrcweir } 107cdf0e10cSrcweir analyzeVersionString(String versionString)108cdf0e10cSrcweir private HashMap analyzeVersionString(String versionString) { 109cdf0e10cSrcweir 110cdf0e10cSrcweir boolean errorOccured = false; 111cdf0e10cSrcweir 112cdf0e10cSrcweir Integer micro = null; 113cdf0e10cSrcweir Integer minor = null; 114cdf0e10cSrcweir Integer major = null; 115cdf0e10cSrcweir Integer release = null; 116cdf0e10cSrcweir 117cdf0e10cSrcweir String microString = null; 118cdf0e10cSrcweir String minorString = null; 119cdf0e10cSrcweir String majorString = null; 120cdf0e10cSrcweir String releaseString = null; 121cdf0e10cSrcweir 122cdf0e10cSrcweir int pos = versionString.lastIndexOf("_"); // this is a jre RPM (1.5.0_06) 123cdf0e10cSrcweir 124cdf0e10cSrcweir if ( pos > -1 ) { 125cdf0e10cSrcweir try { 126cdf0e10cSrcweir releaseString = versionString.substring(pos+1, versionString.length()); 127cdf0e10cSrcweir versionString = versionString.substring(0, pos); 128cdf0e10cSrcweir } catch (IndexOutOfBoundsException ex) { 129cdf0e10cSrcweir System.err.println("Error: Could not get substring from " + versionString); 130cdf0e10cSrcweir errorOccured = true; 131cdf0e10cSrcweir } 132cdf0e10cSrcweir try { 133cdf0e10cSrcweir int releaseInt = Integer.parseInt(releaseString); 134cdf0e10cSrcweir release = new Integer(releaseInt); 135cdf0e10cSrcweir } catch (NumberFormatException ex) { 136cdf0e10cSrcweir System.err.println("Error: Could not convert " + releaseString + " to integer"); 137cdf0e10cSrcweir errorOccured = true; 138cdf0e10cSrcweir } 139cdf0e10cSrcweir } 140cdf0e10cSrcweir 141cdf0e10cSrcweir // Problem: Some rpms have "2.3" instead of "2.3.0" 142cdf0e10cSrcweir String compareString = versionString; 143cdf0e10cSrcweir pos = compareString.lastIndexOf("."); // returns "-1", if not found 144cdf0e10cSrcweir if ( pos > -1 ) { 145cdf0e10cSrcweir String substring = compareString.substring(0, pos); 146cdf0e10cSrcweir pos = substring.lastIndexOf("."); // returns "-1", if not found 147cdf0e10cSrcweir if ( pos == -1 ) { 148cdf0e10cSrcweir versionString = versionString + ".0"; 149cdf0e10cSrcweir // System.err.println("Warning: Changing from " + compareString + " to " + versionString); 150cdf0e10cSrcweir } 151cdf0e10cSrcweir } else { 152cdf0e10cSrcweir versionString = versionString + ".0.0"; 153cdf0e10cSrcweir } 154cdf0e10cSrcweir 155cdf0e10cSrcweir // the standard analyzing mechanism 156cdf0e10cSrcweir pos = versionString.lastIndexOf("."); // returns "-1", if not found 157cdf0e10cSrcweir 158cdf0e10cSrcweir if ( pos > -1 ) 159cdf0e10cSrcweir { 160cdf0e10cSrcweir try { 161cdf0e10cSrcweir microString = versionString.substring(pos+1, versionString.length()); 162cdf0e10cSrcweir versionString = versionString.substring(0, pos); 163cdf0e10cSrcweir } catch (IndexOutOfBoundsException ex) { 164cdf0e10cSrcweir System.err.println("Error: Could not get substring from " + versionString); 165cdf0e10cSrcweir errorOccured = true; 166cdf0e10cSrcweir } 167cdf0e10cSrcweir 168cdf0e10cSrcweir pos = versionString.lastIndexOf("."); 169cdf0e10cSrcweir if ( pos > -1 ) { 170cdf0e10cSrcweir try { 171cdf0e10cSrcweir minorString = versionString.substring(pos+1, versionString.length()); 172cdf0e10cSrcweir majorString = versionString.substring(0, pos); 173cdf0e10cSrcweir } catch (IndexOutOfBoundsException ex) { 174cdf0e10cSrcweir System.err.println("Error: Could not get substring from " + versionString); 175cdf0e10cSrcweir errorOccured = true; 176cdf0e10cSrcweir } 177cdf0e10cSrcweir try { 178cdf0e10cSrcweir int microInt = Integer.parseInt(microString); 179cdf0e10cSrcweir int minorInt = Integer.parseInt(minorString); 180cdf0e10cSrcweir int majorInt = Integer.parseInt(majorString); 181cdf0e10cSrcweir micro = new Integer(microInt); 182cdf0e10cSrcweir minor = new Integer(minorInt); 183cdf0e10cSrcweir major = new Integer(majorInt); 184cdf0e10cSrcweir } catch (NumberFormatException ex) { 185cdf0e10cSrcweir System.err.println("Error: Could not convert " + microString + "," + 186cdf0e10cSrcweir minorString + " or " + majorString + " to integer"); 187cdf0e10cSrcweir errorOccured = true; 188cdf0e10cSrcweir } 189cdf0e10cSrcweir } 190cdf0e10cSrcweir } 191cdf0e10cSrcweir 192cdf0e10cSrcweir // if ( microString == null ) { microString = ""; } 193cdf0e10cSrcweir // if ( majorString == null ) { majorString = ""; } 194cdf0e10cSrcweir // if ( releaseString == null ) { releaseString = ""; } 195cdf0e10cSrcweir // if ( minorString == null ) { minorString = ""; } 196cdf0e10cSrcweir // System.err.println("Major " + majorString + " Minor: " + minorString + " Micro: " + microString + " Release: " + releaseString); 197cdf0e10cSrcweir 198cdf0e10cSrcweir if ( errorOccured ) { 199cdf0e10cSrcweir micro = null; 200cdf0e10cSrcweir minor = null; 201cdf0e10cSrcweir major = null; 202cdf0e10cSrcweir release = null; 203cdf0e10cSrcweir } 204cdf0e10cSrcweir 205cdf0e10cSrcweir HashMap hashRpm = new HashMap(); 206cdf0e10cSrcweir 207cdf0e10cSrcweir hashRpm.put("micro", micro); 208cdf0e10cSrcweir hashRpm.put("minor", minor); 209cdf0e10cSrcweir hashRpm.put("major", major); 210cdf0e10cSrcweir hashRpm.put("release", release); 211cdf0e10cSrcweir 212cdf0e10cSrcweir // If one of this values is "null", procedure "compareTwoRpms" always delivers false. 213cdf0e10cSrcweir // This means, that the installed package is not older. 214cdf0e10cSrcweir 215cdf0e10cSrcweir // System.err.println("Analyzed: " + "micro: " + hashRpm.get("micro").toString() + " minor: " + hashRpm.get("minor").toString() + " major: " + hashRpm.get("major").toString()); 216cdf0e10cSrcweir 217cdf0e10cSrcweir return hashRpm; 218cdf0e10cSrcweir } 219cdf0e10cSrcweir analyzeReleaseString(HashMap hashRpm, String releaseString)220cdf0e10cSrcweir private HashMap analyzeReleaseString(HashMap hashRpm, String releaseString) { 221cdf0e10cSrcweir int release; 222cdf0e10cSrcweir 223cdf0e10cSrcweir try { 224cdf0e10cSrcweir release = Integer.parseInt(releaseString); 225cdf0e10cSrcweir Integer releaseObj = new Integer(release); 226cdf0e10cSrcweir hashRpm.put("release", releaseObj); 227cdf0e10cSrcweir } 228cdf0e10cSrcweir catch (NumberFormatException ex) { 229cdf0e10cSrcweir // JRE often contain a string like "FCS" 230cdf0e10cSrcweir // System.err.println("Error: Could not convert " + releaseString + " to integer"); 231cdf0e10cSrcweir hashRpm.put("release", null); 232cdf0e10cSrcweir } 233cdf0e10cSrcweir 234cdf0e10cSrcweir return hashRpm; 235cdf0e10cSrcweir } 236cdf0e10cSrcweir getInstalledMinor(String version)237cdf0e10cSrcweir public int getInstalledMinor(String version) { 238cdf0e10cSrcweir 239cdf0e10cSrcweir int minor = 0; 240cdf0e10cSrcweir int pos = version.indexOf("."); 241cdf0e10cSrcweir if ( pos > -1 ) { 242cdf0e10cSrcweir String reduced = version.substring(pos + 1, version.length()); 243cdf0e10cSrcweir 244cdf0e10cSrcweir pos = reduced.indexOf("."); 245cdf0e10cSrcweir if ( pos > -1 ) { 246cdf0e10cSrcweir reduced = reduced.substring(0, pos); 247cdf0e10cSrcweir minor = Integer.parseInt(reduced); 248cdf0e10cSrcweir } 249cdf0e10cSrcweir } 250cdf0e10cSrcweir 251cdf0e10cSrcweir return minor; 252cdf0e10cSrcweir } 253cdf0e10cSrcweir compareTwoRpms(HashMap hash1, HashMap hash2)254cdf0e10cSrcweir private boolean compareTwoRpms(HashMap hash1, HashMap hash2) { 255cdf0e10cSrcweir boolean hash1IsOlder = false; 256cdf0e10cSrcweir 257cdf0e10cSrcweir if (( hash1.get("major") != null ) && ( hash2.get("major") != null )) { 258cdf0e10cSrcweir if ( ((Integer)hash1.get("major")).intValue() < ((Integer)hash2.get("major")).intValue() ) { 259cdf0e10cSrcweir hash1IsOlder = true; 260cdf0e10cSrcweir } else { 261cdf0e10cSrcweir if (( hash1.get("minor") != null ) && ( hash2.get("minor") != null )) { 262cdf0e10cSrcweir if ( ((Integer)hash1.get("minor")).intValue() < ((Integer)hash2.get("minor")).intValue() ) { 263cdf0e10cSrcweir hash1IsOlder = true; 264cdf0e10cSrcweir } else { 265cdf0e10cSrcweir if (( hash1.get("micro") != null ) && ( hash2.get("micro") != null )) { 266cdf0e10cSrcweir if ( ((Integer)hash1.get("micro")).intValue() < ((Integer)hash2.get("micro")).intValue() ) { 267cdf0e10cSrcweir hash1IsOlder = true; 268cdf0e10cSrcweir } else { 269cdf0e10cSrcweir if (( hash1.get("release") != null ) && ( hash2.get("release") != null )) { 270cdf0e10cSrcweir if ( ((Integer)hash1.get("release")).intValue() < ((Integer)hash2.get("release")).intValue() ) { 271cdf0e10cSrcweir hash1IsOlder = true; 272cdf0e10cSrcweir } 273cdf0e10cSrcweir } 274cdf0e10cSrcweir } 275cdf0e10cSrcweir } 276cdf0e10cSrcweir } 277cdf0e10cSrcweir } 278cdf0e10cSrcweir } 279cdf0e10cSrcweir } 280cdf0e10cSrcweir 281cdf0e10cSrcweir return hash1IsOlder; 282cdf0e10cSrcweir } 283cdf0e10cSrcweir compareVersionAndRelease(String versionString, String releaseString, PackageDescription packageData, boolean checkIfInstalledIsOlder)284cdf0e10cSrcweir public boolean compareVersionAndRelease(String versionString, String releaseString, PackageDescription packageData, boolean checkIfInstalledIsOlder) { 285cdf0e10cSrcweir // version and release are gotten from the rpm database. packageData contains 286cdf0e10cSrcweir // the information about the rpm, that shall be installed. It has to be installed, 287cdf0e10cSrcweir // if the installed product defined by version and release is older. 288cdf0e10cSrcweir // version is something like "2.0.3", release something like "164". 289cdf0e10cSrcweir // An exception is the jre package, where version is "1.5.0_06" and release "fcs". 290cdf0e10cSrcweir 291cdf0e10cSrcweir HashMap installedRpm = analyzeVersionString(versionString); 292cdf0e10cSrcweir if ( installedRpm.get("release") == null ) { 293cdf0e10cSrcweir installedRpm = analyzeReleaseString(installedRpm, releaseString); 294cdf0e10cSrcweir } 295cdf0e10cSrcweir 296cdf0e10cSrcweir // System.err.println("Package: " + packageData.getPackageName()); 297cdf0e10cSrcweir // String outputString = "Installed RPM: "; 298cdf0e10cSrcweir // if ( installedRpm.get("major") != null ) { outputString = outputString + " major: " + installedRpm.get("major").toString(); } 299cdf0e10cSrcweir // else { outputString = outputString + " major is null"; } 300cdf0e10cSrcweir // if ( installedRpm.get("minor") != null ) { outputString = outputString + " minor: " + installedRpm.get("minor").toString(); } 301cdf0e10cSrcweir // else { outputString = outputString + " minor is null"; } 302cdf0e10cSrcweir // if ( installedRpm.get("micro") != null ) { outputString = outputString + " micro: " + installedRpm.get("micro").toString(); } 303cdf0e10cSrcweir // else { outputString = outputString + " micro is null"; } 304cdf0e10cSrcweir // if ( installedRpm.get("release") != null ) { outputString = outputString + " release: " + installedRpm.get("release").toString(); } 305cdf0e10cSrcweir // else { outputString = outputString + " release is null"; } 306cdf0e10cSrcweir // System.err.println(outputString); 307cdf0e10cSrcweir 308cdf0e10cSrcweir HashMap notInstalledRpm = analyzeVersionString(packageData.getPkgVersion()); 309cdf0e10cSrcweir if ( notInstalledRpm.get("release") == null ) { 310cdf0e10cSrcweir notInstalledRpm = analyzeReleaseString(notInstalledRpm, packageData.getPkgRelease()); 311cdf0e10cSrcweir } 312cdf0e10cSrcweir 313cdf0e10cSrcweir // outputString = "Not installed RPM: "; 314cdf0e10cSrcweir // if ( notInstalledRpm.get("major") != null ) { outputString = outputString + " major: " + notInstalledRpm.get("major").toString(); } 315cdf0e10cSrcweir // else { outputString = outputString + " major is null"; } 316cdf0e10cSrcweir // if ( notInstalledRpm.get("minor") != null ) { outputString = outputString + " minor: " + notInstalledRpm.get("minor").toString(); } 317cdf0e10cSrcweir // else { outputString = outputString + " minor is null"; } 318cdf0e10cSrcweir // if ( notInstalledRpm.get("micro") != null ) { outputString = outputString + " micro: " + notInstalledRpm.get("micro").toString(); } 319cdf0e10cSrcweir // else { outputString = outputString + " micro is null"; } 320cdf0e10cSrcweir // if ( notInstalledRpm.get("release") != null ) { outputString = outputString + " release: " + notInstalledRpm.get("release").toString(); } 321cdf0e10cSrcweir // else { outputString = outputString + " release is null"; } 322cdf0e10cSrcweir // System.err.println(outputString); 323cdf0e10cSrcweir 324cdf0e10cSrcweir boolean firstIsOlder = false; 325cdf0e10cSrcweir 326cdf0e10cSrcweir if ( checkIfInstalledIsOlder ) { 327cdf0e10cSrcweir firstIsOlder = compareTwoRpms(installedRpm, notInstalledRpm); 328cdf0e10cSrcweir // System.err.println("Result: Installed RPM is older: " + firstIsOlder); 329cdf0e10cSrcweir } else { 330cdf0e10cSrcweir firstIsOlder = compareTwoRpms(notInstalledRpm, installedRpm); 331cdf0e10cSrcweir // System.err.println("Result: Not installed RPM is older: " + firstIsOlder); 332cdf0e10cSrcweir } 333cdf0e10cSrcweir 334cdf0e10cSrcweir return firstIsOlder; 335cdf0e10cSrcweir } 336cdf0e10cSrcweir getLinuxPackageNamesFromRpmquery(PackageDescription packageData, InstallData installData)337cdf0e10cSrcweir public void getLinuxPackageNamesFromRpmquery(PackageDescription packageData, InstallData installData) { 338cdf0e10cSrcweir 339cdf0e10cSrcweir if ((packageData.getPackageName() != null) && ( ! packageData.getPackageName().equals(""))) { 340cdf0e10cSrcweir 341cdf0e10cSrcweir boolean rpmExists = checkPackageExistence(packageData, installData); 342cdf0e10cSrcweir 343cdf0e10cSrcweir if ( rpmExists ) { 344cdf0e10cSrcweir // Full package name not defined in xpd file 345cdf0e10cSrcweir if (( packageData.getFullPackageName() == null ) || ( packageData.getFullPackageName().equals(""))) { 346cdf0e10cSrcweir // Now it is possible to query the rpm database for the packageName, if it is not defined in xpd file! 347cdf0e10cSrcweir String fullPackageName = getPackageNameFromRpm(packageData, installData); 348cdf0e10cSrcweir if ( fullPackageName != null ) { 349cdf0e10cSrcweir packageData.setFullPackageName(fullPackageName); 350cdf0e10cSrcweir } else { 351cdf0e10cSrcweir System.err.println("Error: Linux package name not defined in xpd file and could not be determined: " 352cdf0e10cSrcweir + packageData.getPackageName()); 353cdf0e10cSrcweir } 354cdf0e10cSrcweir } 355cdf0e10cSrcweir packageData.setPkgExists(true); 356cdf0e10cSrcweir 357cdf0e10cSrcweir } else { 358cdf0e10cSrcweir packageData.setPkgExists(false); 359cdf0e10cSrcweir } 360cdf0e10cSrcweir 361cdf0e10cSrcweir } 362cdf0e10cSrcweir 363cdf0e10cSrcweir for (Enumeration e = packageData.children(); e.hasMoreElements(); ) { 364cdf0e10cSrcweir PackageDescription child = (PackageDescription) e.nextElement(); 365cdf0e10cSrcweir getLinuxPackageNamesFromRpmquery(child, installData); 366cdf0e10cSrcweir } 367cdf0e10cSrcweir } 368cdf0e10cSrcweir getLinuxDatabasePath(InstallData data)369cdf0e10cSrcweir public String getLinuxDatabasePath(InstallData data) { 370cdf0e10cSrcweir String databasePath = null; 371cdf0e10cSrcweir String installDir = data.getInstallDir(); 372cdf0e10cSrcweir String databaseDir = installDir; 373cdf0e10cSrcweir // String databaseDir = SystemManager.getParentDirectory(installDir); 374cdf0e10cSrcweir String linuxDatabaseName = ".RPM_OFFICE_DATABASE"; 375cdf0e10cSrcweir File databaseFile = new File(databaseDir, linuxDatabaseName); 376cdf0e10cSrcweir databasePath = databaseFile.getPath(); 377cdf0e10cSrcweir return databasePath; 378cdf0e10cSrcweir } 379cdf0e10cSrcweir investigateDebian(InstallData data)380cdf0e10cSrcweir public void investigateDebian(InstallData data) { 381cdf0e10cSrcweir 382cdf0e10cSrcweir // First check: Is this a Debian system? 383cdf0e10cSrcweir 384cdf0e10cSrcweir String dpkgFile = "/usr/bin/dpkg"; 385cdf0e10cSrcweir 386cdf0e10cSrcweir if ( new File(dpkgFile).exists() ) { 387cdf0e10cSrcweir 388cdf0e10cSrcweir data.setIsDebianSystem(true); 389cdf0e10cSrcweir 390cdf0e10cSrcweir // Second check: If this is a Debian system, is "--force-debian" required? Older 391cdf0e10cSrcweir // versions do not support "--force-debian". 392cdf0e10cSrcweir 393cdf0e10cSrcweir // String rpmQuery = "rpm --help; 394cdf0e10cSrcweir String[] rpmQueryArray = new String[2]; 395cdf0e10cSrcweir rpmQueryArray[0] = "rpm"; 396cdf0e10cSrcweir rpmQueryArray[1] = "--help"; 397cdf0e10cSrcweir 398cdf0e10cSrcweir Vector returnVector = new Vector(); 399cdf0e10cSrcweir Vector returnErrorVector = new Vector(); 400cdf0e10cSrcweir int returnValue = ExecuteProcess.executeProcessReturnVector(rpmQueryArray, returnVector, returnErrorVector); 401cdf0e10cSrcweir 402cdf0e10cSrcweir // Checking if the return vector contains the string "force-debian" 403cdf0e10cSrcweir 404cdf0e10cSrcweir for (int i = 0; i < returnVector.size(); i++) { 405cdf0e10cSrcweir String line = (String) returnVector.get(i); 406cdf0e10cSrcweir if ( line.indexOf("force-debian") > -1 ) { 407cdf0e10cSrcweir data.setUseForceDebian(true); 408cdf0e10cSrcweir } 409cdf0e10cSrcweir } 410cdf0e10cSrcweir } 411cdf0e10cSrcweir } 412cdf0e10cSrcweir getLinuxFileInfo(PackageDescription packageData)413cdf0e10cSrcweir public void getLinuxFileInfo(PackageDescription packageData) { 414cdf0e10cSrcweir // analyzing a string like "openoffice-core01-2.0.3-159" as "name-version-release" 415cdf0e10cSrcweir InstallData data = InstallData.getInstance(); 416cdf0e10cSrcweir if ( packageData.pkgExists() ) { 417cdf0e10cSrcweir if (( packageData.getFullPackageName() != null ) && ( ! packageData.getFullPackageName().equals(""))) { 418cdf0e10cSrcweir String longName = packageData.getFullPackageName(); 419cdf0e10cSrcweir 420cdf0e10cSrcweir int pos = longName.lastIndexOf("-"); 421cdf0e10cSrcweir if (data.isInstallationMode()) { 422cdf0e10cSrcweir // not saving at uninstallation, because it can be updated without GUI installer 423cdf0e10cSrcweir packageData.setPkgRelease(longName.substring(pos+1, longName.length())); 424cdf0e10cSrcweir } 425cdf0e10cSrcweir longName = longName.substring(0, pos); 426cdf0e10cSrcweir 427cdf0e10cSrcweir pos = longName.lastIndexOf("-"); 428cdf0e10cSrcweir if (data.isInstallationMode()) { 429cdf0e10cSrcweir // not saving at uninstallation, because it can be updated without GUI installer 430cdf0e10cSrcweir packageData.setPkgVersion(longName.substring(pos+1, longName.length())); 431cdf0e10cSrcweir } 432cdf0e10cSrcweir packageData.setPkgRealName(longName.substring(0, pos)); 433cdf0e10cSrcweir } 434cdf0e10cSrcweir } 435cdf0e10cSrcweir 436cdf0e10cSrcweir for (Enumeration e = packageData.children(); e.hasMoreElements(); ) { 437cdf0e10cSrcweir PackageDescription child = (PackageDescription) e.nextElement(); 438cdf0e10cSrcweir getLinuxFileInfo(child); 439cdf0e10cSrcweir } 440cdf0e10cSrcweir 441cdf0e10cSrcweir } 442cdf0e10cSrcweir setFullPackageNameAtUninstall(PackageDescription packageData, HashMap packageNames)443cdf0e10cSrcweir public void setFullPackageNameAtUninstall(PackageDescription packageData, HashMap packageNames) { 444cdf0e10cSrcweir 445cdf0e10cSrcweir if (( packageData.getPackageName() != null ) && ( ! packageData.getPackageName().equals(""))) { 446cdf0e10cSrcweir if (( packageData.getFullPackageName() == null ) || ( packageData.getFullPackageName().equals(""))) { 447cdf0e10cSrcweir String packageName = packageData.getPackageName(); 448cdf0e10cSrcweir // Does this always exist? Should not be required! 449cdf0e10cSrcweir // But is there another way to get the packageNames, without this file? 450cdf0e10cSrcweir // During installation the packageNames can be determined by querying the rpm file 451cdf0e10cSrcweir // -> this is not possible during uninstallation 452cdf0e10cSrcweir String fullPackageName = (String) packageNames.get(packageName); 453cdf0e10cSrcweir packageData.setFullPackageName(fullPackageName); 454cdf0e10cSrcweir } 455cdf0e10cSrcweir } 456cdf0e10cSrcweir 457cdf0e10cSrcweir for (Enumeration e = packageData.children(); e.hasMoreElements(); ) { 458cdf0e10cSrcweir PackageDescription child = (PackageDescription) e.nextElement(); 459cdf0e10cSrcweir setFullPackageNameAtUninstall(child, packageNames); 460cdf0e10cSrcweir } 461cdf0e10cSrcweir } 462cdf0e10cSrcweir getRelocationString(PackageDescription packageData, String packageName)463cdf0e10cSrcweir public String getRelocationString(PackageDescription packageData, String packageName) { 464cdf0e10cSrcweir String relocationString = null; 465cdf0e10cSrcweir 466cdf0e10cSrcweir if ( packageData.isRelocatable() ) { 467cdf0e10cSrcweir // String rpmQuery = "rpm -qp --qf %{PREFIXES}" + " " + packageName; 468cdf0e10cSrcweir String[] rpmQueryArray = new String[5]; 469cdf0e10cSrcweir rpmQueryArray[0] = "rpm"; 470cdf0e10cSrcweir rpmQueryArray[1] = "-qp"; 471cdf0e10cSrcweir rpmQueryArray[2] = "--qf"; 472cdf0e10cSrcweir rpmQueryArray[3] = "%{PREFIXES}"; 473cdf0e10cSrcweir rpmQueryArray[4] = packageName; 474cdf0e10cSrcweir 475cdf0e10cSrcweir Vector returnVector = new Vector(); 476cdf0e10cSrcweir Vector returnErrorVector = new Vector(); 477cdf0e10cSrcweir int returnValue = ExecuteProcess.executeProcessReturnVector(rpmQueryArray, returnVector, returnErrorVector); 478cdf0e10cSrcweir relocationString = (String) returnVector.get(0); 479cdf0e10cSrcweir } 480cdf0e10cSrcweir 481cdf0e10cSrcweir return relocationString; 482cdf0e10cSrcweir } 483cdf0e10cSrcweir createPackageNameFileAtPostinstall(InstallData data, PackageDescription packageData)484cdf0e10cSrcweir public void createPackageNameFileAtPostinstall(InstallData data, PackageDescription packageData) { 485cdf0e10cSrcweir 486cdf0e10cSrcweir // The file "packageNames" must not be an own database! It must be possible to install 487cdf0e10cSrcweir // and deinstall RPMs without this GUI installer. Therefore the file packageNames is 488cdf0e10cSrcweir // not always up to date. Nevertheless it makes the deinstallation faster, because of 489cdf0e10cSrcweir // all packages, whose "real" package name is not defined in xpd files (for example 490cdf0e10cSrcweir // "openoffice-core01-2.0.3-159.rpm" hat the "real" name "openoffice-core01" that is 491cdf0e10cSrcweir // used for deinstallation) this can be read in this file. Otherwise it would be 492*a893be29SPedro Giffuni // necessary to determine the "real" name with a database question. 493cdf0e10cSrcweir // The version and release that are also stored in file "packageNames" must not be 494cdf0e10cSrcweir // used for deinstallation because they are probably not up to date. 495cdf0e10cSrcweir 496cdf0e10cSrcweir File destDir = new File(data.getInstallDefaultDir(), data.getProductDir()); 497cdf0e10cSrcweir File uninstallDir = new File(destDir, data.getUninstallDirName()); 498cdf0e10cSrcweir String fileName = "packageNames"; 499cdf0e10cSrcweir File packageNamesFile = new File(uninstallDir, fileName); 500cdf0e10cSrcweir Vector packageNames = new Vector(); 501cdf0e10cSrcweir getPackageNamesContent(packageData, packageNames); 502cdf0e10cSrcweir SystemManager.saveCharFileVector(packageNamesFile.getPath(), packageNames); 503cdf0e10cSrcweir } 504cdf0e10cSrcweir readPackageNamesFile()505cdf0e10cSrcweir public HashMap readPackageNamesFile() { 506cdf0e10cSrcweir // package names are stored in file "packageNames" in data.getInfoRoot() directory 507cdf0e10cSrcweir String fileName = "packageNames"; 508cdf0e10cSrcweir InstallData data = InstallData.getInstance(); 509cdf0e10cSrcweir File dir = data.getInfoRoot(); 510cdf0e10cSrcweir File file = new File(dir, fileName); 511cdf0e10cSrcweir Vector fileContent = SystemManager.readCharFileVector(file.getPath()); 512cdf0e10cSrcweir HashMap map = Converter.convertVectorToHashmap(fileContent); 513cdf0e10cSrcweir return map; 514cdf0e10cSrcweir } 515cdf0e10cSrcweir saveModulesLogFile(InstallData data)516cdf0e10cSrcweir public void saveModulesLogFile(InstallData data) { 517cdf0e10cSrcweir if ( data.logModuleStates() ) { 518cdf0e10cSrcweir Vector logContent = LogManager.getModulesLogFile(); 519cdf0e10cSrcweir File destDir = new File(data.getInstallDefaultDir(), data.getProductDir()); 520cdf0e10cSrcweir File uninstallDir = new File(destDir, data.getUninstallDirName()); 521cdf0e10cSrcweir File modulesLogFile = new File(uninstallDir, "moduleSettingsLog.txt"); 522cdf0e10cSrcweir SystemManager.saveCharFileVector(modulesLogFile.getPath(), logContent); 523cdf0e10cSrcweir } 524cdf0e10cSrcweir } 525cdf0e10cSrcweir fixInstallationDirectory(String installDir)526cdf0e10cSrcweir public String fixInstallationDirectory(String installDir) { 527cdf0e10cSrcweir // inject a second slash to the last path segment to avoid rpm 3 concatenation bug 528cdf0e10cSrcweir int lastSlashPos = installDir.lastIndexOf('/'); 529cdf0e10cSrcweir String sub1 = installDir.substring(0,lastSlashPos); 530cdf0e10cSrcweir String sub2 = installDir.substring(lastSlashPos); 531cdf0e10cSrcweir String fixedInstallDir = sub1 + "/" + sub2; 532cdf0e10cSrcweir // fixedInstallDir.replaceAll(" ", "%20"); 533cdf0e10cSrcweir return fixedInstallDir; 534cdf0e10cSrcweir } 535cdf0e10cSrcweir 536cdf0e10cSrcweir } 537