Better, Faster, Freer

The LXR Cross Referencer

source navigation ]
diff markup ]
identifier search ]
general search ]
 
 
Architecture: i386 ]
Version: HEAD ]

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