diff --git a/code/client/makepkginfo b/code/client/makepkginfo
index a6ce4007..40d9d48f 100755
--- a/code/client/makepkginfo
+++ b/code/client/makepkginfo
@@ -243,12 +243,12 @@ def main():
-If the installer item is a disk image containing
multiple packages, or the package to be installed
- is not at the root of the mounted disk image, this
+ is not at the root of the mounted disk image, PKGNAME
is a relative path from the root of the mounted
disk image to the specific package to be installed.
-If the installer item is a disk image containing
- an Adobe CS4 Deployment Toolkit installation, pkgname
+ an Adobe CS4 Deployment Toolkit installation, PKGNAME
is the name of an Adobe CS4 Deployment Toolkit
installer package folder at the top level of the
mounted dmg.
@@ -257,24 +257,47 @@ def main():
be at the top level of the mounted dmg.''')
p.add_option('--appname', '-a',
help='''Optional flag.
-
+
-If the installer item is a disk image with a
- drag-and-drop application, this is the name or relative
- path of the application to be installed. Useful if there
- is more than one application at the root of the dmg.''')
+ drag-and-drop application, APPNAME is the name or
+ relative path of the application to be installed.
+ Useful if there is more than one application at the
+ root of the dmg.''')
p.add_option('--uninstallerdmg', '-u',
- help='''If installer item is a DMG containing an Adobe CS4
- Deployment Toolkit installation package or Adobe CS3
- deployment package, uninstallerdmg is a path to a disk
- image containing an AdobeUberUninstaller for this
- item.''')
+ help='''Optional flag.
+
+ If the installer item is a disk image containing an
+ Adobe CS4 Deployment Toolkit installation package or
+ Adobe CS3 deployment package, UNINSTALLERDMG is a path
+ to a disk image containing an AdobeUberUninstaller for
+ this item.''')
+ p.add_option('--installxml',
+ help='''Optional flag.
+
+ If the installer item is a disk image containing an
+ Adobe CS5 product, INSTALLXML specifies the path to
+ an install.xml file containing installation data.''')
+ p.add_option('--uninstallxml',
+ help='''Optional flag.
+
+ If the installer item is a disk image containing an
+ Adobe CS5 product, UNINSTALLXML specifies the path to
+ an uninstall.xml containing uninstall data.''')
+ p.add_option('--serialnumber',
+ help='''Optional flag.
+
+ If the installer item is a disk image containing an
+ Adobe CS5 product, SERIALNUMBER is the product
+ serial number.''')
options, arguments = p.parse_args()
- if len(arguments) == 0 and not options.file:
+ if len(arguments) == 0 and \
+ not (options.file or options.installxml or options.uninstallxml
+ or options.serialnumber):
print >>sys.stderr, \
("Need to specify an installer item (.pkg, .mpkg, .dmg) "
- "and/or --file options!")
+ "and/or --file and/or Adobe installer options!")
exit(-1)
if len(arguments) > 1:
@@ -312,7 +335,7 @@ def main():
print >>sys.stderr, \
"Could not find a supported installer item in %s!" % \
item
- exit(-1)
+ exit(-1)
elif item.endswith('.pkg') or item.endswith('.mpkg'):
catinfo = munkicommon.getPackageMetaData(item)
@@ -341,7 +364,7 @@ def main():
#just the filename
location = os.path.split(item)[1]
catinfo['installer_item_location'] = location
-
+
# ADOBE STUFF - though maybe generalizable in the future?
if options.uninstallerdmg:
uninstallerpath = options.uninstallerdmg
@@ -402,7 +425,7 @@ def main():
installs.append(iteminfodict)
else:
print >>sys.stderr, "Item %s doesn't exist. Skipping." % fitem
-
+
if catinfo:
catinfo['autoremove'] = False
if minosversion:
@@ -417,7 +440,22 @@ def main():
if installs:
catinfo['installs'] = installs
-
+
+ if options.installxml or options.uninstallxml or \
+ options.serialnumber:
+ more_info = adobeutils.getAdobeInstallInfo(
+ mountpoint=None,
+ installxmlpath=options.installxml,
+ uninstallxmlpath=options.uninstallxml,
+ serialnumber=options.serialnumber,
+ suppressRegistration=True,
+ suppressUpdates=True)
+
+ if not 'adobe_install_info' in catinfo:
+ catinfo['adobe_install_info'] = {}
+ for key in more_info.keys():
+ catinfo['adobe_install_info'][key] = more_info[key]
+
# and now, what we've all been waiting for...
print FoundationPlist.writePlistToString(catinfo)
diff --git a/code/client/munkilib/adobeutils.py b/code/client/munkilib/adobeutils.py
index 7b7f2d09..e5611a8a 100644
--- a/code/client/munkilib/adobeutils.py
+++ b/code/client/munkilib/adobeutils.py
@@ -3,10 +3,10 @@
"""
adobeutils.py
-Utilities to enable munki to install/uninstall Adobe CS3/CS4 products using the CS3/CS4 Deployment Toolkits.
+Utilities to enable munki to install/uninstall Adobe CS3/CS4/CS5 products using the CS3/CS4/CS5 Deployment Toolkits.
"""
-# Copyright 2009 Greg Neagle.
+# Copyright 2009-2010 Greg Neagle.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -25,6 +25,8 @@ import os
import subprocess
import time
from xml.dom import minidom
+import base64
+import random
import FoundationPlist
import munkicommon
@@ -56,6 +58,36 @@ def mountAdobeDmg(dmgpath):
return mountpoints
+def getCS5mediaSignature(dirpath):
+ '''Returns the CS5 media path for a CS5 install.
+ dirpath is typically the root of a mounted dmg'''
+ installapp = findInstallApp(dirpath)
+ if not installapp:
+ return ""
+ # installapp is the path to the actual executable:
+ # IE Install.app/Contents/MacOS/Install. We need the
+ # parent directory of the Install app bundle.
+ parentdir = os.path.dirname(
+ os.path.dirname(os.path.dirname(os.path.dirname(installapp))))
+ # now look for setup.xml
+ setupxml = os.path.join(parentdir, "payloads", "Setup.xml")
+ if os.path.exists(setupxml) and os.path.isfile(setupxml):
+ # parse the XML
+ dom = minidom.parse(setupxml)
+ setupElements = dom.getElementsByTagName("Setup")
+ if setupElements:
+ mediaSignatureElements = \
+ setupElements[0].getElementsByTagName("mediaSignature")
+ if mediaSignatureElements:
+ element = mediaSignatureElements[0]
+ elementvalue = ''
+ for node in element.childNodes:
+ elementvalue += node.nodeValue
+ return elementvalue
+
+ return ""
+
+
def getPayloadInfo(dirpath):
payloadinfo = {}
# look for .proxy.xml file dir
@@ -288,7 +320,6 @@ def runAdobeInstallTool(cmd, number_of_payloads=0):
# indeterminate progress bar
munkistatus.percent(-1)
payload_completed_count = 0
- print cmd
p = subprocess.Popen(cmd, shell=False, bufsize=1, stdin=subprocess.PIPE,
stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
while (p.poll() == None):
@@ -308,16 +339,16 @@ def runAdobeInstallTool(cmd, number_of_payloads=0):
payloadname)
# CS5 installing
- if loginfo.startswith("Beginning installation for payload at"):
+ if loginfo.startswith("Request to install payload"):
# increment payload_completed_count
payload_completed_count = payload_completed_count + 1
if munkicommon.munkistatusoutput and number_of_payloads:
munkistatus.percent(getPercent(payload_completed_count,
number_of_payloads))
- munkicommon.display_status("Installed Adobe payload %s" %
+ munkicommon.display_status("Installing Adobe payload %s" %
payload_completed_count)
- # uninstalling
+ # CS3/CS4 uninstalling
if loginfo.startswith("Physical payload uninstall result"):
# increment payload_completed_count
payload_completed_count = payload_completed_count + 1
@@ -407,7 +438,69 @@ def runAdobeSetup(dmgpath, uninstalling=False):
return -1
-def runAdobeCS5Install(dmgpath, uninstalling=False):
+def writefile(s, path):
+ # writes string data to path.
+ # returns the path on success, empty string on failure
+ try:
+ f = open(path, mode='w', buffering=1)
+ print >>f, s.encode('UTF-8')
+ f.close()
+ return path
+ except (OSError, IOError):
+ munkicommon.display_error("Couldn't write %s" % s)
+ return ""
+
+
+def doAdobeCS5Uninstall(adobeInstallInfo):
+ # runs the locally-installed Adobe CS5 tools to remove CS5 products
+ uninstallxml = adobeInstallInfo.get('uninstallxml')
+ if not uninstallxml:
+ munkicommon.display_error("No uninstall.xml in adobe_install_info")
+ return -1
+ payloadcount = adobeInstallInfo.get('payload_count',0)
+ path = os.path.join(munkicommon.tmpdir, "uninstall.xml")
+ deploymentFile = writefile(uninstallxml, path)
+ if not deploymentFile:
+ return -1
+ setupapp = "/Library/Application Support/Adobe/OOBE/PDApp/DWA/Setup.app"
+ setup = os.path.join(setupapp, "Contents/MacOS/Setup")
+ if not os.path.exists(setup):
+ munkicommon.display_error("%s is not installed." % setupapp)
+ return -1
+ uninstall_cmd = [ setup,
+ '--mode=silent',
+ '--action=uninstall',
+ '--skipProcessCheck=1',
+ '--deploymentFile=%s' % deploymentFile ]
+ munkicommon.display_status("Running Adobe Uninstall")
+ return runAdobeInstallTool(uninstall_cmd, payloadcount)
+
+
+def CS5applicationXMLoverride(adobeInstallInfo):
+ '''Returns an XML string for use with CS5 installer'''
+ xml = '\n'
+ xml += '\n'
+ xml += ' \n' % \
+ adobeInstallInfo.get('media_signature',"")
+ if 'media_digest' in adobeInstallInfo:
+ # undo our obfuscation
+ s = base64.b64decode(adobeInstallInfo['media_digest'])
+ xml += ' %s\n' % s
+ if adobeInstallInfo.get('suppress_registration'):
+ xml += ' Suppress\n'
+ if adobeInstallInfo.get('suppress_updates'):
+ xml += ' Suppress\n'
+ xml += ' -1\n'
+ xml += ' \n'
+ xml += ''
+ return xml
+
+
+def runAdobeCS5Install(dmgpath, adobeInstallInfo, uninstalling=False):
+ # if we have enough info, uninstall from local resources
+ if uninstalling and adobeInstallInfo.get('uninstallxml'):
+ return doAdobeCS5Uninstall(adobeInstallInfo)
+
# runs the Adobe CS5 Install tool in silent mode from
# a DMG
munkicommon.display_status("Mounting disk image %s" %
@@ -416,20 +509,43 @@ def runAdobeCS5Install(dmgpath, uninstalling=False):
if mountpoints:
install_path = findInstallApp(mountpoints[0])
if install_path:
- # look for install.xml at root
- deploymentfile = os.path.join(mountpoints[0], "install.xml")
- overridefile = os.path.join(mountpoints[0],
- "application.xml.override")
- if os.path.exists(deploymentfile):
+ deploymentfile = ""
+ overridefile = ""
+ if adobeInstallInfo:
+ deploymentxml = ""
if uninstalling:
- action = "--action=uninistall"
+ deploymentxml = adobeInstallInfo.get('uninstallxml')
+ path = os.path.join(munkicommon.tmpdir, "uninstall.xml")
else:
- action = "--action=install"
-
+ # installing
+ deploymentxml = adobeInstallInfo.get('installxml')
+ path = os.path.join(munkicommon.tmpdir, "install.xml")
+ if deploymentxml:
+ deploymentfile = writefile(deploymentxml, path)
+
+ overridexml = CS5applicationXMLoverride(adobeInstallInfo)
+ path = os.path.join(munkicommon.tmpdir,
+ "application.xml.override")
+ overridefile = writefile(overridexml, path)
+
+ if not deploymentfile:
+ # look for install.xml file at root of dmg
+ deploymentfile = os.path.join(mountpoints[0], "install.xml")
+ if not overridefile:
+ # look for application.xml.override file at root of dmg
+ overridefile = os.path.join(mountpoints[0],
+ "application.xml.override")
+
+ if os.path.exists(deploymentfile):
# try to find and count the number of payloads
# so we can give a rough progress indicator
number_of_payloads = countPayloads(mountpoints[0])
- munkicommon.display_status("Running Adobe Install")
+ if uninstalling:
+ action = "--action=uninistall"
+ munkicommon.display_status("Running Adobe Uninstall")
+ else:
+ action = "--action=install"
+ munkicommon.display_status("Running Adobe Install")
adobe_install = [ install_path,
'--mode=silent',
'--skipProcessCheck=1',
@@ -720,15 +836,66 @@ def getBundleInfo(path):
pass
return None
-
+
+
+def getXMLstring(filepath):
+ xmlstring = ""
+ try:
+ f = open(filepath, "r")
+ xmlstring = f.read()
+ f.close()
+ except:
+ pass
+ return xmlstring
+
+
+def serialNumber():
+ # generate phony serial number to distract casual
+ # snoopers
+ sn = str(random.randint(1000,9999)) + "-"
+ sn += str(random.randint(1000,9999)) + "-"
+ sn += str(random.randint(1000,9999)) + "-"
+ sn += str(random.randint(1000,9999)) + "-"
+ sn += str(random.randint(1000,9999)) + "-"
+ sn += str(random.randint(1000,9999))
+ return sn
+
+
+def getAdobeInstallInfo(mountpoint=None,
+ installxmlpath=None,
+ uninstallxmlpath=None,
+ serialnumber=None,
+ suppressRegistration=True,
+ suppressUpdates=True):
+ # encapsulates info used by the Adobe Setup/Install app
+ adobeInstallInfo = {}
+ if mountpoint:
+ adobeInstallInfo['media_signature'] = getCS5mediaSignature(mountpoint)
+ adobeInstallInfo['payload_count'] = countPayloads(mountpoint)
+ if serialnumber:
+ # obfuscate this a bit
+ s = base64.b64encode(serialnumber.replace("-",""))
+ adobeInstallInfo['media_digest'] = s
+ adobeInstallInfo['serial_number'] = serialNumber()
+ adobeInstallInfo['suppress_registration'] = suppressRegistration
+ adobeInstallInfo['suppress_updates'] = suppressUpdates
+ if installxmlpath:
+ xmlstring = getXMLstring(installxmlpath)
+ adobeInstallInfo['installxml'] = xmlstring
+ if uninstallxmlpath:
+ xmlstring = getXMLstring(uninstallxmlpath)
+ adobeInstallInfo['uninstallxml'] = xmlstring
+
+ return adobeInstallInfo
+
def getAdobeCatalogInfo(mountpoint, pkgname):
'''Used by makepkginfo to build pkginfo data for Adobe
installers/updaters'''
# Look for Install.app (CS5 install)
- installapp = os.path.join(mountpoint, "Install.app")
- if os.path.exists(installapp):
+ installapp = findInstallApp(mountpoint)
+ if installapp:
# this is a CS5 installer disk image
cataloginfo = getAdobePackageInfo(mountpoint)
if cataloginfo:
@@ -740,6 +907,25 @@ def getAdobeCatalogInfo(mountpoint, pkgname):
cataloginfo['installer_type'] = "AdobeCS5Installer"
if pkgname:
cataloginfo['package_path'] = pkgname
+ cataloginfo['adobe_install_info'] = getAdobeInstallInfo(
+ mountpoint=mountpoint,
+ installxmlpath=None,
+ uninstallxmlpath=None,
+ serialnumber=None,
+ suppressRegistration=True,
+ suppressUpdates=True)
+ # make a default installs entry
+ uninstalldir = "/Library/Application Support/Adobe/Uninstall"
+ signaturefile = \
+ cataloginfo['adobe_install_info']['media_signature'] + ".db"
+ filepath = os.path.join(uninstalldir, signaturefile)
+ installs = []
+ installitem = {}
+ installitem['path'] = filepath
+ installitem['type'] = 'file'
+ installs.append(installitem)
+ cataloginfo['installs'] = installs
+
return cataloginfo
# Look for AdobePatchInstaller.app (CS5 updater)
@@ -823,41 +1009,102 @@ def adobeSetupError(errorcode):
# returns text description for numeric error code
# Reference:
# http://www.adobe.com/devnet/creativesuite/pdfs/DeployGuide.pdf
- errormessage = { 0 : "Application installed successfully",
- 1 : "Unable to parse command line",
- 2 : "Unknown user interface mode specified",
- 3 : "Unable to initialize ExtendScript",
- 4 : "User interface workflow failed",
- 5 : "Unable to initialize user interface workflow",
- 6 : "Silent workflow completed with errors",
- 7 : "Unable to complete the silent workflow",
- 8 : "Exit and restart",
- 9 : "Unsupported operating system version",
- 10 : "Unsupported file system",
- 11 : "Another instance of Adobe Setup is running",
- 12 : "CAPS integrity error",
- 13 : "Media optimization failed",
- 14 : "Failed due to insufficient privileges",
- 9999 : "Catastrophic error",
- -1 : "AdobeUberInstaller failed before launching Setup" }
+ errormessage = {
+ 0 : "Application installed successfully",
+ 1 : "Unable to parse command line",
+ 2 : "Unknown user interface mode specified",
+ 3 : "Unable to initialize ExtendScript",
+ 4 : "User interface workflow failed",
+ 5 : "Unable to initialize user interface workflow",
+ 6 : "Silent workflow completed with errors",
+ 7 : "Unable to complete the silent workflow",
+ 8 : "Exit and restart",
+ 9 : "Unsupported operating system version",
+ 10 : "Unsupported file system",
+ 11 : "Another instance of Adobe Setup is running",
+ 12 : "CAPS integrity error",
+ 13 : "Media optimization failed",
+ 14 : "Failed due to insufficient privileges",
+ 15 : "Media DB Sync Failed",
+ 16 : "Failed to laod the Deployment file",
+ 17 : "EULA Acceptance Failed",
+ 18 : "C3PO Bootstrap Failed",
+ 19 : "Conflicting processes running",
+ 20 : "Install source path not specified or does not exist",
+ 21 : "Version of payloads is not supported by this version of RIB",
+ 22 : "Install Directory check failed",
+ 23 : "System Requirements Check failed",
+ 24 : "Exit User Canceled Workflow",
+ 25 : "A binary path Name exceeded Operating System's MAX PATH limit",
+ 26 : "Media Swap Required in Silent Mode",
+ 27 : "Keyed files detected in target",
+ 28 : "Base product is not installed",
+ 29 : "Base product has been moved",
+ 30 : "Insufficient disk space to install the payload + Done with errors",
+ 31 : "Insufficient disk space to install the payload + Failed",
+ 32 : "The patch is already applied",
+ 9999 : "Catastrophic error",
+ -1 : "AdobeUberInstaller failed before launching Setup" }
return errormessage.get(errorcode, "Unknown error")
-def doAdobeInstall(item, itempath):
- # wrapper to handle all the Adobe installer methods
- installer_type = item.get("installer_type","")
- if installer_type == "AdobeUberInstaller":
- # Adobe CS4 installer
+def doAdobeRemoval(item):
+ uninstallmethod = item['uninstall_method']
+ itempath = ""
+ if "uninstaller_item" in item:
+ managedinstallbase = munkicommon.pref('ManagedInstallDir')
+ itempath = os.path.join(managedinstallbase, 'Cache',
+ item["uninstaller_item"])
+ if not os.path.exists(itempath):
+ munkicommon.display_error("%s package for %s was "
+ "missing from the cache."
+ % (uninstallmethod, item['name']))
+ return -1
+
+
+ if uninstallmethod == "AdobeSetup":
+ # CS3 uninstall
+ retcode = adobeutils.runAdobeSetup(itempath, uninstalling=True)
+
+ elif uninstallmethod == "AdobeUberUninstaller":
+ # CS4 uninstall
pkgname = item.get("adobe_package_name") or \
item.get("package_path","")
- retcode = uberInstall(itempath, pkgname)
+ retcode = runAdobeUberTool(itempath, pkgname, uninstalling=True)
+
+ elif uninstallmethod == "AdobeCS5Installer":
+ # CS5 uninstall. Sheesh. Three releases, three methods.
+ adobeInstallInfo = item.get('adobe_install_info')
+ retcode = runAdobeCS5Install(itempath, adobeInstallInfo,
+ uninstalling=True)
+
+ if retcode:
+ munkicommon.display_error("Uninstall of %s failed." % item['name'])
+ return retcode
+
+
+def doAdobeInstall(item):
+ # wrapper to handle all the Adobe installer methods
+ # first get the path to the installer dmg. We know
+ # it exists because installer.py already checked
+ managedinstallbase = \
+ munkicommon.pref('ManagedInstallDir')
+ itempath = os.path.join(managedinstallbase,
+ 'Cache',
+ item["installer_item"])
+ installer_type = item.get("installer_type","")
+ if installer_type == "AdobeSetup":
+ # Adobe CS3/CS4 updater or Adobe CS3 installer
+ retcode = runAdobeSetup(itempath)
if retcode == 8:
# Adobe Setup says restart needed
restartflag = True
retcode = 0
- elif installer_type == "AdobeSetup":
- # Adobe updater or Adobe CS3 installer
- retcode = runAdobeSetup(itempath)
+ elif installer_type == "AdobeUberInstaller":
+ # Adobe CS4 installer
+ pkgname = item.get("adobe_package_name") or \
+ item.get("package_path","")
+ retcode = runAdobeUberTool(itempath, pkgname)
if retcode == 8:
# Adobe Setup says restart needed
restartflag = True
@@ -865,21 +1112,18 @@ def doAdobeInstall(item, itempath):
elif installer_type == "AdobeAcrobatUpdater":
# Acrobat Pro 9 updater
retcode = updateAcrobatPro(itempath)
+ elif installer_type == "AdobeCS5Installer":
+ # Adobe CS5 installer
+ adobeInstallInfo = item.get('adobe_install_info')
+ retcode = runAdobeCS5Install(itempath, adobeInstallInfo)
elif installer_type == "AdobeCS5PatchInstaller":
# Adobe CS5 updater
retcode = runAdobeCS5PatchInstaller(itempath)
return retcode
-def uberInstall(dmgpath, pkgname=''):
- return runAdobeUberTool(dmgpath, pkgname)
-
-
-def uninstall(dmgpath, pkgname=''):
- return runAdobeUberTool(dmgpath, pkgname, uninstalling=True)
-
def main():
- pass
+ pass
if __name__ == '__main__':
diff --git a/code/client/munkilib/installer.py b/code/client/munkilib/installer.py
index 5c918e27..9cf019f3 100644
--- a/code/client/munkilib/installer.py
+++ b/code/client/munkilib/installer.py
@@ -342,7 +342,7 @@ def installWithInfo(dirpath, installlist):
return restartflag
installer_type = item.get("installer_type","")
if installer_type.startswith("Adobe"):
- retcode = adobeutils.doAdobeInstall(item, itempath)
+ retcode = adobeutils.doAdobeInstall(item)
elif installer_type == "appdmg":
retcode = copyAppFromDMG(itempath)
else:
@@ -502,50 +502,10 @@ def processRemovals(removallist):
else:
munkicommon.log("Uninstall of %s was "
"successful." % name)
-
- elif uninstallmethod[0] == "AdobeUberUninstaller":
- if "uninstaller_item" in item:
- managedinstallbase = \
- munkicommon.pref('ManagedInstallDir')
- itempath = os.path.join(managedinstallbase,
- 'Cache',
- item["uninstaller_item"])
- if os.path.exists(itempath):
- pkgname = item.get("adobe_package_name") or \
- item.get("pacakge_path","")
- retcode = adobeutils.uninstall(itempath,
- pkgname)
- if retcode:
- munkicommon.display_error("Uninstall of "
- "%s failed." %
- name)
- else:
- munkicommon.display_error("Adobe"
- "UberUninstaller "
- "package for %s "
- "was missing from "
- "the Cache." % name)
-
- elif uninstallmethod[0] == "AdobeSetup":
- if "uninstaller_item" in item:
- managedinstallbase = \
- munkicommon.pref('ManagedInstallDir')
- itempath = os.path.join(managedinstallbase,
- 'Cache',
- item["uninstaller_item"])
- if os.path.exists(itempath):
- retcode = adobeutils.runAdobeSetup(itempath,
- uninstalling=True)
- if retcode:
- munkicommon.display_error("Uninstall of "
- "%s failed." %
- name)
- else:
- munkicommon.display_error("Adobe Setup "
- "package for %s "
- "was missing from "
- "the Cache." % name)
-
+
+ elif uninstallmethod[0].startswith("Adobe"):
+ retcode = adobeutils.doAdobeRemoval(item)
+
elif uninstallmethod[0] == "remove_app":
remove_app_info = item.get('remove_app_info',None)
if remove_app_info:
diff --git a/code/client/munkilib/updatecheck.py b/code/client/munkilib/updatecheck.py
index 5b2b077a..b07347ea 100644
--- a/code/client/munkilib/updatecheck.py
+++ b/code/client/munkilib/updatecheck.py
@@ -880,6 +880,13 @@ def enoughDiskSpace(manifestitem_pl, installlist=[], uninstalling=False):
fudgefactor = 102400
installeritemsize = 0
installedsize = 0
+ alreadydownloadedsize = 0
+ if 'installer_item_location' in manifestitem_pl:
+ cachedir = os.path.join(munkicommon.pref('ManagedInstallDir'),"Cache")
+ dl = os.path.join(cachedir,
+ manifestitem_pl['installer_item_location'])
+ if os.path.exists(dl):
+ alreadydownloadedsize = os.path.getsize(dl)
if 'installer_item_size' in manifestitem_pl:
installeritemsize = int(manifestitem_pl['installer_item_size'])
if 'installed_size' in manifestitem_pl:
@@ -891,7 +898,8 @@ def enoughDiskSpace(manifestitem_pl, installlist=[], uninstalling=False):
installedsize = 0
if 'uninstaller_item_size' in manifestitem_pl:
installeritemsize = int(manifestitem_pl['uninstaller_item_size'])
- diskspaceneeded = (installeritemsize + installedsize + fudgefactor)
+ diskspaceneeded = (installeritemsize - alreadydownloadedsize +
+ installedsize + fudgefactor)
# munkicommon.getAvailableDiskSpace() returns KB
availablediskspace = munkicommon.getAvailableDiskSpace()
@@ -1218,6 +1226,9 @@ def processInstall(manifestitem, cataloglist, installinfo):
if 'installer_choices_xml' in pl:
iteminfo['installer_choices_xml'] = \
pl['installer_choices_xml']
+ if 'adobe_install_info' in pl:
+ iteminfo['adobe_install_info'] = \
+ pl['adobe_install_info']
if 'RestartAction' in pl:
iteminfo['RestartAction'] = pl['RestartAction']
if 'installer_type' in pl:
@@ -1422,11 +1433,8 @@ def processRemoval(manifestitem, cataloglist, installinfo):
packagesToRemove = getReceiptsToRemove(item)
if packagesToRemove:
uninstall_item = item
- elif uninstallmethod == 'AdobeUberUninstaller':
- # Adobe CS4 package
- uninstall_item = item
- elif uninstallmethod == 'AdobeSetup':
- # Adobe CS3 package
+ elif uninstallmethod.startswith('Adobe'):
+ # Adobe CS3/CS4/CS5 product
uninstall_item = item
elif uninstallmethod == 'remove_app':
uninstall_item = item
@@ -1556,23 +1564,26 @@ def processRemoval(manifestitem, cataloglist, installinfo):
return False
iteminfo["uninstall_method"] = uninstallmethod
- if uninstallmethod == "AdobeUberUninstaller" or \
- uninstallmethod == "AdobeSetup":
- if 'uninstaller_item_location' in item:
- location = uninstall_item['uninstaller_item_location']
+ if uninstallmethod.startswith("Adobe"):
+ if 'adobe_install_info' in item:
+ iteminfo['adobe_install_info'] = item['adobe_install_info']
else:
- location = uninstall_item['installer_item_location']
- if not enoughDiskSpace(uninstall_item, uninstalling=True):
- return False
- if download_installeritem(location):
- filename = os.path.split(location)[1]
- iteminfo['uninstaller_item'] = filename
- iteminfo['adobe_package_name'] = \
- uninstall_item.get('adobe_package_name','')
- else:
- munkicommon.display_warning("Failed to download the uninstaller "
- "for %s" % iteminfo["name"])
- return False
+ if 'uninstaller_item_location' in item:
+ location = uninstall_item['uninstaller_item_location']
+ else:
+ location = uninstall_item['installer_item_location']
+ if not enoughDiskSpace(uninstall_item, uninstalling=True):
+ return False
+ if download_installeritem(location):
+ filename = os.path.split(location)[1]
+ iteminfo['uninstaller_item'] = filename
+ iteminfo['adobe_package_name'] = \
+ uninstall_item.get('adobe_package_name','')
+ else:
+ munkicommon.display_warning("Failed to download the "
+ "uninstaller for %s"
+ % iteminfo["name"])
+ return False
elif uninstallmethod == "remove_app":
if uninstall_item.get('installs',None):
iteminfo['remove_app_info'] = uninstall_item['installs'][0]