|
[ source navigation ] [ diff markup ] [ identifier search ] [ general search ] |
|||||
|
||||||
001 /************************************************************************* 002 * 003 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 004 * 005 * Copyright 2008 by Sun Microsystems, Inc. 006 * 007 * OpenOffice.org - a multi-platform office productivity suite 008 * 009 * $RCSfile: SolarisInstaller.java,v $ 010 * $Revision: 1.7 $ 011 * 012 * This file is part of OpenOffice.org. 013 * 014 * OpenOffice.org is free software: you can redistribute it and/or modify 015 * it under the terms of the GNU Lesser General Public License version 3 016 * only, as published by the Free Software Foundation. 017 * 018 * OpenOffice.org is distributed in the hope that it will be useful, 019 * but WITHOUT ANY WARRANTY; without even the implied warranty of 020 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 021 * GNU Lesser General Public License version 3 for more details 022 * (a copy is included in the LICENSE file that accompanied this code). 023 * 024 * You should have received a copy of the GNU Lesser General Public License 025 * version 3 along with OpenOffice.org. If not, see 026 * <http://www.openoffice.org/license.html> 027 * for a copy of the LGPLv3 License. 028 * 029 ************************************************************************/ 030 031 package org.openoffice.setup.Installer; 032 033 import org.openoffice.setup.InstallData; 034 import org.openoffice.setup.InstallerHelper.SolarisHelper; 035 import org.openoffice.setup.ResourceManager; 036 import org.openoffice.setup.SetupData.PackageDescription; 037 import org.openoffice.setup.Util.Converter; 038 import org.openoffice.setup.Util.ExecuteProcess; 039 import org.openoffice.setup.Util.Informer; 040 import org.openoffice.setup.Util.LogManager; 041 import org.openoffice.setup.Util.SystemManager; 042 import java.io.File; 043 import java.util.HashMap; 044 import java.util.Vector; 045 046 public class SolarisInstaller extends Installer { 047 048 SolarisHelper helper = new SolarisHelper(); 049 050 public SolarisInstaller() { 051 super(); 052 } 053 054 public void defineDatabasePath() { 055 056 InstallData data = InstallData.getInstance(); 057 String oldDatabasePath = data.getDatabasePath(); 058 data.setDatabasePath(null); 059 060 // Determining the database path (only for user installation). 061 // Important if a user installation is done into an existing 062 // user installation -> this methode can only be called after 063 // determination of installation directory. 064 065 if ( data.isUserInstallation() ) { 066 String databasePath = helper.getSolarisDatabasePath(data); // the file does not need to exist! 067 data.setDatabasePath(databasePath); 068 069 // If this is a new path to the database, then this database was 070 // not analyzed before (when going back in installation wizard) 071 if ( ! databasePath.equals(oldDatabasePath) ) { 072 data.setDatabaseAnalyzed(false); 073 data.setDatabaseQueried(false); 074 } 075 } 076 } 077 078 public void preInstallationOngoing() { 079 // an admin file has to be created for user and for root installation 080 InstallData data = InstallData.getInstance(); 081 082 if ( data.isInstallationMode()) { 083 boolean makeRelocatableAdminFile = true; 084 helper.createAdminFile(makeRelocatableAdminFile); 085 helper.createAdminFile(! makeRelocatableAdminFile); 086 } 087 088 if ( data.isUserInstallation() ) { 089 // LD_PRELOAD_32 needs to be set for user installation 090 helper.setEnvironmentForUserInstall(); 091 // Solaris 10 needs to have local temp directory for pkgadd 092 // createLocalTempDir(); 093 } 094 } 095 096 public void postInstallationOngoing() { 097 InstallData data = InstallData.getInstance(); 098 // if ( data.isUserInstallation() ) { 099 // Solaris 10 needs to have local temp directory for pkgadd 100 // removeLocalTempDir(); 101 // } 102 103 helper.removeSolarisLockFile(); 104 } 105 106 public void postInstall(PackageDescription packageData) { 107 InstallData data = InstallData.getInstance(); 108 109 if ( ! data.isAbortedInstallation() ) { 110 data.setStillRunning(true); 111 // Collecting information about installed packages 112 // Creating a list containing pairs of package names and rpm file names 113 // that has to be used during uninstallation. 114 helper.saveModulesLogFile(data); 115 data.setStillRunning(false); 116 } 117 } 118 119 public void postUninstallationOngoing() { 120 helper.removeSolarisLockFile(); 121 } 122 123 public String getChangeInstallDir(PackageDescription packageData) { 124 String installDir = null; 125 String packageName = packageData.getPackageName(); 126 127 if ( packageName != null ) { 128 String pkgCommand = "pkginfo -r" + " " + packageName; 129 String[] pkgCommandArray = new String[3]; 130 pkgCommandArray[0] = "pkginfo"; 131 pkgCommandArray[1] = "-r"; 132 pkgCommandArray[2] = packageName; 133 Vector returnVector = new Vector(); 134 Vector returnErrorVector = new Vector(); 135 int returnValue = ExecuteProcess.executeProcessReturnVector(pkgCommandArray, returnVector, returnErrorVector); 136 String returnString = (String) returnVector.get(0); 137 138 String log = pkgCommand + "<br><b>Returns: " + returnString + "</b><br>"; 139 LogManager.addCommandsLogfileComment(log); 140 141 installDir = returnString; 142 } 143 144 return installDir; 145 } 146 147 public void installPackage(PackageDescription packageData) { 148 InstallData data = InstallData.getInstance(); 149 150 String log = "<br><b>Package: " + packageData.getName() + "</b>"; 151 LogManager.addCommandsLogfileComment(log); 152 153 String rootDir = data.getInstallDir(); 154 String packagePath = data.getPackagePath(); 155 156 if (( packageData.getPkgSubdir() != null ) && ( ! packageData.getPkgSubdir().equals("") )) { 157 File completePackageFile = new File(packagePath, packageData.getPkgSubdir()); 158 packagePath = completePackageFile.getPath(); 159 } 160 161 String packageName = packageData.getPackageName(); 162 163 if (( packageName.equals("")) || ( packageName == null )) { 164 log = "<b>No package name specified. Nothing to do</b>"; 165 LogManager.addCommandsLogfileComment(log); 166 } else { 167 log = "<b>Package Name: " + packageName + "</b>"; 168 LogManager.addCommandsLogfileComment(log); 169 170 File completePackage = new File(packagePath, packageName); 171 172 if ( completePackage.exists() ) { 173 174 String pkgCommand = ""; 175 String[] pkgCommandArray; 176 String adminFileName = ""; 177 Vector returnVector = new Vector(); 178 Vector returnErrorVector = new Vector(); 179 int returnValue; 180 181 // is package relocatable or not? 182 if ( packageData.isRelocatable() ) { 183 adminFileName = data.getAdminFileNameReloc(); 184 } else { 185 adminFileName = data.getAdminFileNameNoReloc(); 186 } 187 188 if ( data.isUserInstallation() ) { 189 HashMap env = data.getShellEnvironment(); 190 String[] envStringArray = Converter.convertHashmapToStringArray(env); 191 pkgCommand = "/usr/sbin/pkgadd -n -d " + packagePath + " -R " + 192 rootDir + " -a " + adminFileName + " " + packageName; 193 pkgCommandArray = new String[9]; 194 pkgCommandArray[0] = "/usr/sbin/pkgadd"; 195 pkgCommandArray[1] = "-n"; 196 pkgCommandArray[2] = "-d"; 197 pkgCommandArray[3] = packagePath; 198 pkgCommandArray[4] = "-R"; 199 pkgCommandArray[5] = rootDir; 200 pkgCommandArray[6] = "-a"; 201 pkgCommandArray[7] = adminFileName; 202 pkgCommandArray[8] = packageName; 203 returnValue = ExecuteProcess.executeProcessReturnVectorEnv(pkgCommandArray, envStringArray, returnVector, returnErrorVector); 204 } else { 205 // shifting of the installation root (-R) is only wanted for user installation 206 pkgCommand = "/usr/sbin/pkgadd -n -d " + packagePath + 207 " -a " + adminFileName + " " + packageName; 208 pkgCommandArray = new String[7]; 209 pkgCommandArray[0] = "/usr/sbin/pkgadd"; 210 pkgCommandArray[1] = "-n"; 211 pkgCommandArray[2] = "-d"; 212 pkgCommandArray[3] = packagePath; 213 pkgCommandArray[4] = "-a"; 214 pkgCommandArray[5] = adminFileName; 215 pkgCommandArray[6] = packageName; 216 returnValue = ExecuteProcess.executeProcessReturnVector(pkgCommandArray, returnVector, returnErrorVector); 217 } 218 219 if ( returnValue == 0 ) { 220 log = pkgCommand + "<br><b>Returns: " + returnValue + " Successful installation</b><br>"; 221 LogManager.addCommandsLogfileComment(log); 222 } else { // an error occured during installation 223 if ( packageData.installCanFail() ) { 224 log = pkgCommand + "<br><b>Returns: " + returnValue + " Problem during installation. Can be ignored.</b><br>"; 225 LogManager.addCommandsLogfileComment(log); 226 } else { 227 log = pkgCommand + "<br><b>Returns: " + returnValue + " Error during installation</b><br>"; 228 LogManager.addCommandsLogfileComment(log); 229 System.err.println("Error during installation:"); 230 for (int i = 0; i < returnErrorVector.size(); i++) { 231 LogManager.addCommandsLogfileComment((String)returnErrorVector.get(i)); 232 System.err.println(returnErrorVector.get(i)); 233 } 234 data.setIsErrorInstallation(true); 235 } 236 } 237 } 238 else { 239 log = "<b>Error: Did not find package " + packageName + "</b><br>"; 240 System.err.println(log); 241 String message = ResourceManager.getString("String_File_Not_Found") + ": " + packageName; 242 String title = ResourceManager.getString("String_Error"); 243 Informer.showErrorMessage(message, title); 244 LogManager.addCommandsLogfileComment(log); 245 data.setIsErrorInstallation(true); 246 } 247 } 248 } 249 250 public void uninstallPackage(PackageDescription packageData) { 251 InstallData data = InstallData.getInstance(); 252 253 String log = "<br><b>Package: " + packageData.getName() + "</b>"; 254 LogManager.addCommandsLogfileComment(log); 255 256 String installRoot = data.getInstallDir(); 257 String packageName = packageData.getPackageName(); 258 String adminFileName = ""; 259 260 // is package relocatable or not? 261 if ( packageData.isRelocatable() ) { 262 adminFileName = data.getAdminFileNameReloc(); 263 } else { 264 adminFileName = data.getAdminFileNameNoReloc(); 265 } 266 267 String pkgCommand = ""; 268 String[] pkgCommandArray; 269 int returnValue; 270 Vector returnVector = new Vector(); 271 Vector returnErrorVector = new Vector(); 272 273 if ( data.isUserInstallation() ) { 274 pkgCommand = "/usr/sbin/pkgrm -n " + "-R " + installRoot + " -a " + adminFileName + " " + packageName; 275 pkgCommandArray = new String[7]; 276 pkgCommandArray[0] = "/usr/sbin/pkgrm"; 277 pkgCommandArray[1] = "-n"; 278 pkgCommandArray[2] = "-R"; 279 pkgCommandArray[3] = installRoot; 280 pkgCommandArray[4] = "-a"; 281 pkgCommandArray[5] = adminFileName; 282 pkgCommandArray[6] = packageName; 283 HashMap env = data.getShellEnvironment(); 284 String[] envStringArray = Converter.convertHashmapToStringArray(env); 285 // SystemManager.dumpStringArray(envStringArray); 286 returnValue = ExecuteProcess.executeProcessReturnVectorEnv(pkgCommandArray, envStringArray, returnVector, returnErrorVector); 287 } else { 288 // shifting of the installation root (-R) is only wanted for user installation 289 pkgCommand = "/usr/sbin/pkgrm -n " + "-a " + adminFileName + " " + packageName; 290 pkgCommandArray = new String[5]; 291 pkgCommandArray[0] = "/usr/sbin/pkgrm"; 292 pkgCommandArray[1] = "-n"; 293 pkgCommandArray[2] = "-a"; 294 pkgCommandArray[3] = adminFileName; 295 pkgCommandArray[4] = packageName; 296 returnValue = ExecuteProcess.executeProcessReturnVector(pkgCommandArray, returnVector, returnErrorVector); 297 } 298 299 if ( returnValue == 0 ) { 300 log = pkgCommand + "<br><b>Returns: " + returnValue + " Successful uninstallation</b><br>"; 301 LogManager.addCommandsLogfileComment(log); 302 } else { // an error occured during installation 303 log = pkgCommand + "<br><b>Returns: " + returnValue + " Error during uninstallation</b><br>"; 304 LogManager.addCommandsLogfileComment(log); 305 System.err.println("Error during uninstallation:"); 306 for (int i = 0; i < returnErrorVector.size(); i++) { 307 LogManager.addCommandsLogfileComment((String)returnErrorVector.get(i)); 308 System.err.println(returnErrorVector.get(i)); 309 } 310 data.setIsErrorInstallation(true); 311 } 312 313 } 314 315 public boolean isPackageNameInstalledClassic(String packageName, InstallData installData) { 316 String rootString = ""; 317 String rootPath = null; 318 String pkgCommand; 319 String[] pkgCommandArray; 320 boolean useLocalRoot = false; 321 boolean isInstalled = false; 322 323 if (installData.isUserInstallation()) { 324 rootPath = installData.getDatabasePath(); 325 } 326 327 if (( rootPath != null ) && (! rootPath.equals("null"))) { 328 rootString = "-R"; 329 useLocalRoot = true; 330 } 331 332 if (useLocalRoot) { 333 pkgCommand = "pkginfo " + rootString + " " + rootPath + " " + packageName; 334 pkgCommandArray = new String[4]; 335 pkgCommandArray[0] = "pkginfo"; 336 pkgCommandArray[1] = rootString; 337 pkgCommandArray[2] = rootPath; 338 pkgCommandArray[3] = packageName; 339 } else { 340 pkgCommand = "pkginfo " + packageName; 341 pkgCommandArray = new String[2]; 342 pkgCommandArray[0] = "pkginfo"; 343 pkgCommandArray[1] = packageName; 344 } 345 346 // Vector returnVector = new Vector(); 347 int returnValue = ExecuteProcess.executeProcessReturnValue(pkgCommandArray); 348 349 if ( returnValue == 0 ) { 350 isInstalled = true; 351 String log = pkgCommand + "<br><b>Returns: " + returnValue + " Package is installed" + "</b><br>"; 352 LogManager.addCommandsLogfileComment(log); 353 } else { 354 String log = pkgCommand + "<br><b>Returns: " + returnValue + " Package is not installed" + "</b><br>"; 355 LogManager.addCommandsLogfileComment(log); 356 } 357 358 return isInstalled; 359 } 360 361 private void queryAllDatabase(InstallData installData) { 362 363 String rootString = ""; 364 String rootPath = null; 365 String pkgCommand; 366 String[] pkgCommandArray; 367 boolean useLocalRoot = false; 368 HashMap map = new HashMap();; 369 370 if (installData.isUserInstallation()) { 371 rootPath = installData.getDatabasePath(); 372 } 373 374 if (( rootPath != null ) && (! rootPath.equals("null"))) { 375 rootString = "-R"; 376 useLocalRoot = true; 377 } 378 379 if (useLocalRoot) { 380 pkgCommand = "pkginfo " + rootString + " " + rootPath; 381 pkgCommandArray = new String[4]; 382 pkgCommandArray[0] = "pkginfo"; 383 pkgCommandArray[1] = "-x"; 384 pkgCommandArray[2] = rootString; 385 pkgCommandArray[3] = rootPath; 386 } else { 387 pkgCommand = "pkginfo -x"; 388 pkgCommandArray = new String[2]; 389 pkgCommandArray[0] = "pkginfo"; 390 pkgCommandArray[1] = "-x"; 391 } 392 393 Vector returnVector = new Vector(); 394 Vector returnErrorVector = new Vector(); 395 int returnValue = ExecuteProcess.executeProcessReturnVector(pkgCommandArray, returnVector, returnErrorVector); 396 397 String log = pkgCommand + "<br><b>Returns: " + returnValue + "</b><br>"; 398 LogManager.addCommandsLogfileComment(log); 399 String value = "1"; 400 401 if ( ! returnVector.isEmpty()) { 402 for (int i = 0; i < returnVector.size(); i++) { 403 String onePackage = (String)returnVector.get(i); 404 int pos1 = onePackage.indexOf(" "); 405 map.put(onePackage.substring(0, pos1), value); 406 } 407 } 408 409 installData.setDatabaseQueried(true); 410 installData.setDatabaseMap(map); 411 412 } 413 414 public boolean isPackageNameInstalled(String packageName, InstallData installData) { 415 416 boolean isInstalled = false; 417 418 HashMap map = null; 419 if ( ! installData.databaseQueried() ) { 420 queryAllDatabase(installData); 421 } 422 423 map = installData.getDatabaseMap(); 424 425 if ( map.containsKey(packageName)) { 426 isInstalled = true; 427 } 428 429 return isInstalled; 430 } 431 432 public boolean isPackageInstalled(PackageDescription packageData, InstallData installData) { 433 boolean isInstalled = false; 434 435 String packageName = packageData.getPackageName(); 436 437 if ( packageName.equals("")) { 438 packageName = null; 439 } 440 441 if ( packageName != null ) { 442 isInstalled = isPackageNameInstalled(packageName, installData); 443 } 444 445 return isInstalled; 446 } 447 448 public boolean isInstallSetPackageOlder(PackageDescription packageData, InstallData installData) { 449 boolean installSetPackageIsOlder = false; 450 boolean checkIfInstalledIsOlder = false; 451 installSetPackageIsOlder = findOlderPackage(packageData, installData, checkIfInstalledIsOlder); 452 return installSetPackageIsOlder; 453 } 454 455 public boolean isInstalledPackageOlder(PackageDescription packageData, InstallData installData) { 456 boolean installedPackageIsOlder = false; 457 boolean checkIfInstalledIsOlder = true; 458 installedPackageIsOlder = findOlderPackage(packageData, installData, checkIfInstalledIsOlder); 459 return installedPackageIsOlder; 460 } 461 462 private boolean findOlderPackage(PackageDescription packageData, InstallData installData, boolean checkIfInstalledIsOlder) { 463 464 boolean firstPackageIsOlder = false; 465 String packageName = packageData.getPackageName(); 466 String log; 467 468 if ( packageName.equals("")) { 469 packageName = null; 470 } 471 472 if ( packageName != null ) { 473 String rootString = ""; 474 String rootPath = null; 475 String pkgCommand; 476 String[] pkgCommandArray; 477 boolean useLocalRoot = false; 478 479 if (installData.isUserInstallation()) { 480 rootPath = installData.getDatabasePath(); 481 } 482 483 if (( rootPath != null ) && (! rootPath.equals("null"))) { 484 rootString = "-R"; 485 useLocalRoot = true; 486 } 487 488 if (useLocalRoot) { 489 // String pkgCommand = "pkginfo -l" + rootString + " " + rootPath + " " + packageName + " | grep VERSION:"; 490 pkgCommand = "pkginfo -x " + rootString + " " + rootPath + " " + packageName; 491 pkgCommandArray = new String[5]; 492 pkgCommandArray[0] = "pkginfo"; 493 pkgCommandArray[1] = "-x"; 494 pkgCommandArray[2] = rootString; 495 pkgCommandArray[3] = rootPath; 496 pkgCommandArray[4] = packageName; 497 498 } else { 499 // String pkgCommand = "pkginfo -l" + rootString + " " + rootPath + " " + packageName + " | grep VERSION:"; 500 pkgCommand = "pkginfo -x " + packageName; 501 pkgCommandArray = new String[3]; 502 pkgCommandArray[0] = "pkginfo"; 503 pkgCommandArray[1] = "-x"; 504 pkgCommandArray[2] = packageName; 505 } 506 507 Vector returnVector = new Vector(); 508