def getiteminfo(itempath): """ Gets info for filesystem items passed to makecatalog item, to be used for the "installs" key. Determines if the item is an application, bundle, Info.plist, or a file or directory and gets additional metadata for later comparison. """ infodict = {} if munkicommon.isApplication(itempath): infodict['type'] = 'application' infodict['path'] = itempath plist = getBundleInfo(itempath) for key in ['CFBundleName', 'CFBundleIdentifier', 'CFBundleShortVersionString', 'CFBundleVersion']: if key in plist: infodict[key] = plist[key] if 'LSMinimumSystemVersion' in plist: infodict['minosversion'] = plist['LSMinimumSystemVersion'] elif 'SystemVersionCheck:MinimumSystemVersion' in plist: infodict['minosversion'] = \ plist['SystemVersionCheck:MinimumSystemVersion'] else: infodict['minosversion'] = '10.6' elif os.path.exists(os.path.join(itempath, 'Contents', 'Info.plist')) or \ os.path.exists(os.path.join(itempath, 'Resources', 'Info.plist')): infodict['type'] = 'bundle' infodict['path'] = itempath plist = getBundleInfo(itempath) for key in ['CFBundleShortVersionString', 'CFBundleVersion']: if key in plist: infodict[key] = plist[key] elif itempath.endswith("Info.plist") or \ itempath.endswith("version.plist"): infodict['type'] = 'plist' infodict['path'] = itempath try: plist = FoundationPlist.readPlist(itempath) for key in ['CFBundleShortVersionString', 'CFBundleVersion']: if key in plist: infodict[key] = plist[key] except FoundationPlist.NSPropertyListSerializationException: pass # let's help the admin -- if CFBundleShortVersionString is empty # or doesn't start with a digit, and CFBundleVersion is there # use CFBundleVersion as the version_comparison_key if (not infodict.get('CFBundleShortVersionString') or infodict['CFBundleShortVersionString'][0] not in '0123456789'): if infodict.get('CFBundleVersion'): infodict['version_comparison_key'] = 'CFBundleVersion' elif 'CFBundleShortVersionString' in infodict: infodict['version_comparison_key'] = 'CFBundleShortVersionString' if not 'CFBundleShortVersionString' in infodict and \ not 'CFBundleVersion' in infodict: infodict['type'] = 'file' infodict['path'] = itempath if os.path.isfile(itempath): infodict['md5checksum'] = munkicommon.getmd5hash(itempath) return infodict
# ----------------------------------------------------------------------------- # OS X Drag & Drop App # ----------------------------------------------------------------------------- if file_mime == 'application/x-apple-diskimage' and file_is_local and DARWIN_FOUNDATION_AVAILABLE and not args.adobe: if args.template: template = env.get_template(args.template) else: template = env.get_template('copyfromdmg.bes') mountpoints = munkicommon.mountdmg(file_path, use_existing_mounts=True) iteminfo = '' try: for (itemname, dummy_dirs, dummy_files) in os.walk(mountpoints[0]): itempath = os.path.join(mountpoints[0], itemname) if munkicommon.isApplication(itempath): item = itemname iteminfo = getiteminfo(itempath) if iteminfo: break if iteminfo: if os.path.isabs(item): mountpointPattern = "^%s/" % mountpoints[0] item = re.sub(mountpointPattern, '', item) cataloginfo = {} cataloginfo['display_name'] = iteminfo.get('CFBundleName', os.path.splitext(item)[0]) version_comparison_key = iteminfo.get( 'version_comparison_key', "CFBundleShortVersionString")