Skip to content

Instantly share code, notes, and snippets.

@gregneagle
Last active August 29, 2015 14:01
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save gregneagle/dc05568138638d1f137e to your computer and use it in GitHub Desktop.
Save gregneagle/dc05568138638d1f137e to your computer and use it in GitHub Desktop.
P-O-C makecatalogs with support for autopromotion
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>_autopromotion_catalogs</key>
<dict>
<key>7</key>
<array>
<string>production</string>
<string>firefox-testing</string>
</array>
</dict>
<key>_metadata</key>
<dict>
<key>created_by</key>
<string>gneagle</string>
<key>creation_date</key>
<date>2014-04-29T16:40:41Z</date>
<key>munki_version</key>
<string>2.0.0.1963</string>
<key>os_version</key>
<string>10.9.2</string>
</dict>
<key>autoremove</key>
<false/>
<key>catalogs</key>
<array>
<string>testing</string>
<string>firefox-testing</string>
</array>
<key>category</key>
<string>Internet</string>
<key>description</key>
<string>Mozilla Firefox is a free and open source web browser.</string>
<key>developer</key>
<string>Mozilla</string>
<key>display_name</key>
<string>Mozilla Firefox</string>
<key>installer_item_hash</key>
<string>b2606d2e7deb983d60db089f0c0af9f4a7f00547c29b25fbce464b477018e0af</string>
<key>installer_item_location</key>
<string>apps/Firefox-29.0.dmg</string>
<key>installer_item_size</key>
<integer>57395</integer>
<key>installer_type</key>
<string>copy_from_dmg</string>
<key>installs</key>
<array>
<dict>
<key>CFBundleIdentifier</key>
<string>org.mozilla.firefox</string>
<key>CFBundleName</key>
<string>Firefox</string>
<key>CFBundleShortVersionString</key>
<string>29.0</string>
<key>CFBundleVersion</key>
<string>2914.4.21</string>
<key>minosversion</key>
<string>10.6</string>
<key>path</key>
<string>/Applications/Firefox.app</string>
<key>type</key>
<string>application</string>
<key>version_comparison_key</key>
<string>CFBundleShortVersionString</string>
</dict>
</array>
<key>items_to_copy</key>
<array>
<dict>
<key>destination_path</key>
<string>/Applications</string>
<key>source_item</key>
<string>Firefox.app</string>
</dict>
</array>
<key>minimum_os_version</key>
<string>10.6</string>
<key>name</key>
<string>Firefox</string>
<key>unattended_install</key>
<true/>
<key>uninstall_method</key>
<string>remove_copied_items</string>
<key>uninstallable</key>
<true/>
<key>version</key>
<string>29.0</string>
</dict>
</plist>
#!/usr/bin/env python
# encoding: utf-8
#
# Copyright 2009-2014 Greg Neagle.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""
makecatalogs
Created by Greg Neagle on 2009-03-30.
Recursively scans a directory, looking for installer item info files.
Builds a repo catalog from these files.
Assumes a pkgsinfo directory under repopath.
User calling this needs to be able to write to repo/catalogs.
"""
import sys
import os
import optparse
import datetime
try:
from munkilib import FoundationPlist as plistlib
LOCAL_PREFS_SUPPORT = True
except ImportError:
try:
import FoundationPlist as plistlib
LOCAL_PREFS_SUPPORT = True
except ImportError:
# maybe we're not on an OS X machine...
print >> sys.stderr, ("WARNING: FoundationPlist is not available, "
"using plistlib instead.")
import plistlib
LOCAL_PREFS_SUPPORT = False
try:
from munkilib.munkicommon import listdir, get_version
except ImportError:
# munkilib is not available
def listdir(path):
"""OSX HFS+ string encoding safe listdir().
Args:
path: path to list contents of
Returns:
list of contents, items as str or unicode types
"""
# if os.listdir() is supplied a unicode object for the path,
# it will return unicode filenames instead of their raw fs-dependent
# version, which is decomposed utf-8 on OSX.
#
# we use this to our advantage here and have Python do the decoding
# work for us, instead of decoding each item in the output list.
#
# references:
# http://docs.python.org/howto/unicode.html#unicode-filenames
# http://developer.apple.com/library/mac/#qa/qa2001/qa1235.html
# http://lists.zerezo.com/git/msg643117.html
# http://unicode.org/reports/tr15/ section 1.2
if type(path) is str:
path = unicode(path, 'utf-8')
elif type(path) is not unicode:
path = unicode(path)
return os.listdir(path)
def get_version():
'''Placeholder if munkilib is not available'''
return 'UNKNOWN'
def print_utf8(text):
'''Print Unicode text as UTF-8'''
print text.encode('UTF-8')
def print_err_utf8(text):
'''Print Unicode text to stderr as UTF-8'''
print >> sys.stderr, text.encode('UTF-8')
def autopromote(item, filepath):
'''Attempts to modify the catalogs array according to an embedded schedule -
For example, moving a package from 'testing' to 'production' after a week'''
promotion = None
error = None
if not '_autopromotion_catalogs' in item:
# short-circuit if there's no _autopromotion_catalogs
return (promotion, error)
age_in_days = 0
if '_metadata' in item:
creation_date = item['_metadata'].get('creation_date')
if creation_date:
try:
if isinstance(creation_date, datetime.datetime):
now = datetime.datetime.now()
age_in_days = -(creation_date - now).days
else:
# Probably an NSDate
age_in_days = int(
-creation_date.timeIntervalSinceNow()/60/60/24)
except Exception:
error = (
'autopromotion error: Error getting creation date from %s'
% filepath)
return (promotion, error)
autopromotion_catalogs = item['_autopromotion_catalogs']
try:
day_keys = sorted([int(key) for key in autopromotion_catalogs.keys()],
reverse=True)
except ValueError:
error = (
'autopromotion error: Invalid autopromotion keys in %s' % filepath)
return (promotion, error)
for key in day_keys:
if age_in_days >= key:
current_catalogs = item.get('catalogs')
new_catalogs = autopromotion_catalogs[str(key)]
if current_catalogs != new_catalogs:
item['catalogs'] = new_catalogs
try:
plistlib.writePlist(item, filepath)
except Exception, err:
error = ('autopromotion error: '
'Failed to write updated %s: %s'
% (filepath, err))
break
promotion = ('Updated catalogs in %s to %s'
% (filepath, new_catalogs))
break
return (promotion, error)
def makecatalogs(repopath, options):
'''Assembles all pkginfo files into catalogs.
Assumes a pkgsinfo directory under repopath.
User calling this needs to be able to write to the repo/catalogs
directory.'''
# Make sure the pkgsinfo directory exists
pkgsinfopath = os.path.join(repopath, 'pkgsinfo')
# make sure pkgsinfopath is Unicode so that os.walk later gives us
# Unicode names back.
if type(pkgsinfopath) is str:
pkgsinfopath = unicode(pkgsinfopath, 'utf-8')
elif type(pkgsinfopath) is not unicode:
pkgsinfopath = unicode(pkgsinfopath)
if not os.path.exists(pkgsinfopath):
print_err_utf8("pkgsinfo path %s doesn't exist!" % pkgsinfopath)
exit(-1)
# Set a default exit code
exitCode = 0
errors = []
promotions = []
catalogs = {}
catalogs['all'] = []
# Walk through the pkginfo files
for dirpath, dirnames, filenames in os.walk(pkgsinfopath):
for dirname in dirnames:
# don't recurse into directories that start
# with a period.
if dirname.startswith('.'):
dirnames.remove(dirname)
for filename in filenames:
if filename.startswith('.'):
# skip files that start with a period as well
continue
filepath = os.path.join(dirpath, filename)
# Try to read the pkginfo file
try:
pkginfo = plistlib.readPlist(filepath)
except IOError, inst:
errors.append("IO error for %s: %s" % (filepath, inst))
exitCode = -1
continue
except Exception, inst:
errors.append("Unexpected error for %s: %s" % (filepath, inst))
exitCode = -1
continue
#simple sanity checking
do_pkg_check = True
installer_type = pkginfo.get('installer_type')
if installer_type in ['nopkg', 'apple_update_metadata']:
do_pkg_check = False
if pkginfo.get('PackageCompleteURL'):
do_pkg_check = False
if pkginfo.get('PackageURL'):
do_pkg_check = False
if do_pkg_check:
if not 'installer_item_location' in pkginfo:
errors.append(
"WARNING: file %s is missing installer_item_location"
% filepath[len(pkgsinfopath)+1:])
# Skip this pkginfo unless we're running with force flag
if not options.force:
exitCode = -1
continue
# Try to form a path and fail if the
# installer_item_location is not a valid type
try:
installeritempath = os.path.join(repopath, "pkgs",
pkginfo['installer_item_location'])
except TypeError:
errors.append("WARNING: invalid installer_item_location"
" in info file %s" % filepath[len(pkgsinfopath)+1:])
exitCode = -1
continue
# Check if the installer item actually exists
if not os.path.exists(installeritempath):
errors.append("WARNING: Info file %s refers to "
"missing installer item: %s" %
(filepath[len(pkgsinfopath)+1:],
pkginfo['installer_item_location']))
# Skip this pkginfo unless we're running with force flag
if not options.force:
exitCode = -1
continue
if options.autopromote:
promotion, error = autopromote(pkginfo, filepath)
if promotion:
promotions.append(promotion)
if error:
errors.append(error)
# don't copy admin notes to catalogs.
if pkginfo.get('notes'):
del(pkginfo['notes'])
# strip out any keys that start with "_"
# (example: pkginfo _metadata)
for key in pkginfo.keys():
if key.startswith('_'):
del(pkginfo[key])
catalogs['all'].append(pkginfo)
for catalogname in pkginfo.get("catalogs", []):
infofilename = filepath[len(pkgsinfopath)+1:]
if not catalogname:
errors.append("WARNING: Info file %s has an empty "
"catalog name!" % infofilename)
exitCode = -1
continue
if not catalogname in catalogs:
catalogs[catalogname] = []
catalogs[catalogname].append(pkginfo)
print_utf8("Adding %s to %s..." % (infofilename, catalogname))
if promotions:
# group all promotions at the end for better visibility
print
for promotion in promotions:
print_utf8(promotion)
if errors:
# group all errors at the end for better visibility
print
for error in errors:
print_err_utf8(error)
# clear out old catalogs
catalogpath = os.path.join(repopath, "catalogs")
if not os.path.exists(catalogpath):
os.mkdir(catalogpath)
else:
for item in listdir(catalogpath):
itempath = os.path.join(catalogpath, item)
if os.path.isfile(itempath):
os.remove(itempath)
# write the new catalogs
print
for key in catalogs.keys():
catalogpath = os.path.join(repopath, "catalogs", key)
if os.path.exists(catalogpath):
print_err_utf8("WARNING: catalog %s already exists at "
"%s. Perhaps this is a non-case sensitive filesystem and you "
"have catalogs with names differing only in case?"
% (key, catalogpath))
exitCode = -1
elif len(catalogs[key]) != 0:
plistlib.writePlist(catalogs[key], catalogpath)
print "Created catalog %s..." % (catalogpath)
else:
print_err_utf8(
"WARNING: Did not create catalog %s "
"because it is empty "
% (key))
exitCode = -1
# Exit with "exitCode" if we got this far.
# This will be -1 if there were any errors
# that prevented the catalogs to be written.
exit(exitCode)
def pref(prefname):
"""Returns a preference for prefname"""
if not LOCAL_PREFS_SUPPORT:
return None
try:
_prefs = plistlib.readPlist(PREFSPATH)
except Exception:
return None
if prefname in _prefs:
return _prefs[prefname]
else:
return None
PREFSNAME = 'com.googlecode.munki.munkiimport.plist'
PREFSPATH = os.path.expanduser(os.path.join('~/Library/Preferences',
PREFSNAME))
def main():
'''Main'''
usage = "usage: %prog [options] [/path/to/repo_root]"
p = optparse.OptionParser(usage=usage)
p.add_option('--version', '-V', action='store_true',
help='Print the version of the munki tools and exit.')
p.add_option('--force', '-f', action='store_true', dest='force',
help='Disable sanity checks.')
p.add_option('--autopromote', action='store_true',
help=('Update the catalog list for items using the '
'item\'s \'_autopromote_data\' attribute.'))
p.set_defaults(force=False)
options, arguments = p.parse_args()
if options.version:
print get_version()
exit(0)
# Make sure we have a path to work with
repopath = None
if len(arguments) == 0:
repopath = pref('repo_path')
if not repopath:
print_err_utf8("Need to specify a path to the repo root!")
exit(-1)
else:
print_utf8("Using repo path: %s" % repopath)
else:
repopath = arguments[0].rstrip("/")
# Make sure the repo path exists
if not os.path.exists(repopath):
print_err_utf8("Repo root path %s doesn't exist!" % repopath)
exit(-1)
# Make the catalogs
makecatalogs(repopath, options)
if __name__ == '__main__':
main()
% ./makecatalogs --autopromote /Users/Shared/munki_repo
Adding apps/Cyberduck-4.4.3.plist to testing...
Adding apps/Firefox-17.0.10.plist to production...
Adding apps/Firefox-17.0.11.plist to production...
Adding apps/Firefox-17.0.8.plist to production...
Adding apps/Firefox-17.0.9.plist to production...
Adding apps/Firefox-17.0.9__1.plist to production...
Adding apps/Firefox-23.0.1.plist to testing...
Adding apps/Firefox-23.0.1.plist to firefox-testing...
Adding apps/Firefox-24.0.plist to production...
Adding apps/Firefox-24.0__1.plist to testing...
Adding apps/Firefox-24.0__1.plist to firefox-testing...
Adding apps/Firefox-24.2.0.plist to production...
Adding apps/Firefox-25.0.1.plist to testing...
Adding apps/Firefox-25.0.1.plist to firefox-testing...
Adding apps/Firefox-25.0.plist to testing...
Adding apps/Firefox-25.0.plist to firefox-testing...
Adding apps/Firefox-26.0.plist to testing...
Adding apps/Firefox-26.0.plist to firefox-testing...
Adding apps/Firefox-27.0.1.plist to testing...
Adding apps/Firefox-27.0.plist to testing...
Adding apps/Firefox-27.0.plist to firefox-testing...
Adding apps/Firefox-28.0.plist to testing...
Adding apps/Firefox-28.0.plist to firefox-testing...
Adding apps/Firefox-29.0.1.plist to testing...
Adding apps/Firefox-29.0.1.plist to firefox-testing...
Adding apps/Firefox-29.0.plist to production...
Adding apps/Firefox-29.0.plist to firefox-testing...
Adding apps/GoogleChrome-29.0.1547.65.plist to production...
Adding apps/GoogleChrome-29.0.1547.76.plist to production...
Adding apps/GoogleChrome-30.0.1599.101.plist to production...
Adding apps/GoogleChrome-30.0.1599.66.plist to production...
Adding apps/GoogleChrome-30.0.1599.69.plist to production...
Adding apps/GoogleChrome-30.0.1599.69__1.plist to production...
Adding apps/GoogleChrome-31.0.1650.48.plist to production...
Adding apps/GoogleChrome-31.0.1650.57.plist to production...
Adding apps/GoogleChrome-31.0.1650.63.plist to production...
Adding apps/GoogleChrome-32.0.1700.102.plist to production...
Adding apps/GoogleChrome-32.0.1700.107.plist to production...
Adding apps/GoogleChrome-32.0.1700.77.plist to production...
Adding apps/GoogleChrome-32.0.1700.77__1.plist to production...
Adding apps/GoogleChrome-33.0.1750.117.plist to production...
Adding apps/GoogleChrome-33.0.1750.146.plist to production...
Adding apps/GoogleChrome-33.0.1750.149.plist to production...
Adding apps/GoogleChrome-33.0.1750.152.plist to production...
Adding apps/GoogleChrome-34.0.1847.116.plist to production...
Adding apps/GoogleChrome-34.0.1847.131.plist to production...
Adding apps/GoogleChrome-34.0.1847.137.plist to production...
Adding apps/GoogleChrome-35.0.1916.114.plist to testing...
Adding apps/GoogleEarth-7.1.plist to testing...
Adding apps/GoogleEarth-7.1__1.plist to testing...
Adding apps/OmniFocus-1.10.4.plist to testing...
Adding apps/OmniFocus-1.10.5.plist to testing...
Adding apps/OmniFocus-1.10.6.plist to testing...
Adding apps/OmniGraffle6-6.0.plist to testing...
Adding apps/OmniGrafflePro-5.4.4.plist to testing...
Adding apps/OmniOutlinerPro-3.10.6.plist to testing...
Adding apps/Praat-5.3.71.plist to testing...
Adding apps/Skype-6.11.plist to production...
Adding apps/Skype-6.12.plist to production...
Adding apps/Skype-6.14.plist to production...
Adding apps/Skype-6.15.plist to production...
Adding apps/Skype-6.17.plist to production...
Adding apps/Skype-6.8.60.351.plist to production...
Adding apps/Skype-6.9.plist to production...
Adding apps/TextWrangler-4.5.3.plist to testing...
Adding apps/TextWrangler-4.5.4.plist to testing...
Adding apps/TextWrangler-4.5.5.plist to testing...
Adding apps/TextWrangler-4.5.6.plist to testing...
Adding apps/TextWrangler-4.5.7.plist to testing...
Adding apps/TextWrangler-4.5.8.plist to testing...
Adding apps/Thunderbird-17.0.10.plist to production...
Adding apps/Thunderbird-17.0.11.plist to production...
Adding apps/Thunderbird-17.0.8.plist to production...
Adding apps/Thunderbird-17.0.8__1.plist to testing...
Adding apps/Thunderbird-17.0.8__1.plist to thunderbird-testing...
Adding apps/Thunderbird-17.0.9.plist to production...
Adding apps/Thunderbird-24.0.1.plist to testing...
Adding apps/Thunderbird-24.0.1.plist to thunderbird-testing...
Adding apps/Thunderbird-24.0.plist to testing...
Adding apps/Thunderbird-24.0.plist to thunderbird-testing...
Adding apps/Thunderbird-24.1.0.plist to testing...
Adding apps/Thunderbird-24.1.0.plist to thunderbird-testing...
Adding apps/Thunderbird-24.1.1.plist to testing...
Adding apps/Thunderbird-24.1.1.plist to thunderbird-testing...
Adding apps/Thunderbird-24.2.0.plist to testing...
Adding apps/Thunderbird-24.2.0.plist to thunderbird-testing...
Adding apps/Thunderbird-24.3.0.plist to testing...
Adding apps/Thunderbird-24.3.0.plist to thunderbird-testing...
Adding apps/Thunderbird-24.4.0.plist to testing...
Adding apps/Thunderbird-24.4.0.plist to thunderbird-testing...
Adding apps/Thunderbird-24.5.0.plist to testing...
Adding apps/Thunderbird-24.5.0.plist to thunderbird-testing...
Adding apps/VLC-2.0.8.plist to testing...
Adding apps/VLC-2.0.9.plist to testing...
Adding apps/VLC-2.1.1.plist to testing...
Adding apps/VLC-2.1.2.plist to testing...
Adding apps/VLC-2.1.3.plist to testing...
Adding apps/VLC-2.1.4.plist to testing...
Adding apps/Adobe/AdobeReader-11.0.03.plist to testing...
Adding apps/Adobe/AdobeReader-11.0.04.plist to testing...
Adding apps/Adobe/AdobeReader-11.0.06.plist to testing...
Adding apps/Adobe/AdobeReader-11.0.07.plist to testing...
Adding apps/Adobe/CS6/updates/AdobeAIR-13.0.0.111.plist to testing...
Adding apps/Adobe/CS6/updates/AdobeAIR-13.0.0.83.plist to testing...
Adding apps/Adobe/CS6/updates/AdobeAIR-3.8.0.1280.plist to testing...
Adding apps/Adobe/CS6/updates/AdobeAIR-3.8.0.1430.plist to testing...
Adding apps/Adobe/CS6/updates/AdobeAIR-3.9.0.1030.plist to testing...
Adding apps/Adobe/CS6/updates/AdobeAIR-3.9.0.1210.plist to testing...
Adding apps/Adobe/CS6/updates/AdobeAIR-3.9.0.1380.plist to testing...
Adding apps/Adobe/CS6/updates/AdobeAIR-4.0.0.1390.plist to testing...
Adding apps/Adobe/CS6/updates/AdobeBridgeCS6_5.0_Update-5.0.2 to development...
Adding apps/Adobe/CS6/updates/AdobeCSXSInfrastructureCS6_3_Update-3.0.2 to development...
Adding apps/Adobe/CS6/updates/AdobeDynamicLinkMediaServer_1.0_Update-1.0.1 to development...
Adding apps/Adobe/CS6/updates/AdobeExtensionManagerCS6_6.0_Update-6.0.7 to development...
Adding apps/Adobe/CS6/updates/AdobePhotoshopCS6Support_13.0_Update-13.0.5 to development...
Adding apps/Adobe/CS6/updates/PhotoshopCameraRaw7_7.0_Update-8.1 to development...
Adding apps/BBEdit/BBEdit-10.5.5.plist to testing...
Adding apps/Dropbox/Dropbox-2.6.31.plist to testing...
Adding apps/Evernote/Evernote-5.5.plist to testing...
Adding apps/LibreOffice/LibreOffice-4.2.2001.plist to testing...
Adding apps/LibreOffice/LibreOffice-4.2.3003.plist to testing...
Adding apps/LibreOffice/LibreOffice-4.2.4002.plist to testing...
Adding apps/Office2011/Office2011_Update-14.3.6.plist to testing...
Adding apps/Office2011/Office2011_Update-14.3.7.plist to testing...
Adding apps/Office2011/Office2011_Update-14.3.8.plist to testing...
Adding apps/Office2011/Office2011_Update-14.3.9.plist to testing...
Adding apps/Office2011/Office2011_Update-14.4.1.plist to testing...
Adding internet/FlashPlayer-11.8.800.168.plist to testing...
Adding internet/FlashPlayer-11.8.800.94.plist to testing...
Adding internet/FlashPlayer-11.9.900.117.plist to testing...
Adding internet/FlashPlayer-11.9.900.117__1.plist to testing...
Adding internet/FlashPlayer-11.9.900.152.plist to testing...
Adding internet/FlashPlayer-11.9.900.170.plist to testing...
Adding internet/FlashPlayer-12.0.0.38.plist to testing...
Adding internet/FlashPlayer-12.0.0.44.plist to testing...
Adding internet/FlashPlayer-12.0.0.44__1.plist to testing...
Adding internet/FlashPlayer-12.0.0.70.plist to testing...
Adding internet/FlashPlayer-12.0.0.77.plist to testing...
Adding internet/FlashPlayer-13.0.0.182.plist to testing...
Adding internet/FlashPlayer-13.0.0.201.plist to testing...
Adding internet/FlashPlayer-13.0.0.206.plist to testing...
Adding internet/FlashPlayer-13.0.0.206__1.plist to testing...
Adding internet/FlashPlayer-13.0.0.214.plist to testing...
Adding internet/Flip4Mac WMV-2.4.4.2.plist to testing...
Adding internet/Flip4Mac WMV-3.2.0.16 .plist to testing...
Adding internet/Silverlight-5.1.20513.0.plist to testing...
Adding internet/Silverlight-5.1.20913.0.plist to testing...
Adding internet/Silverlight-5.1.30214.0.plist to testing...
Adding internet/Silverlight-5.1.30317.0.plist to testing...
Adding munkitools/munkitools-3.5.2.1817.plist to development...
Adding munkitools/munkitools-3.6.0.1842.plist to development...
Adding munkitools/munkitools-3.6.0.1864.plist to development...
Adding munkitools/munkitools-3.6.0.1877.plist to development...
Adding munkitools/munkitools_admin-0.9.2.1838.0.plist to development...
Adding munkitools/munkitools_admin-0.9.2.1846.0.plist to development...
Adding munkitools/munkitools_admin-0.9.2.1847.0.plist to development...
Adding munkitools/munkitools_admin-1.0.0.1864.0.plist to development...
Adding munkitools/munkitools_admin-1.0.0.1878.0.plist to development...
Adding munkitools/munkitools_admin-1.0.0.1879.0.plist to development...
Adding munkitools/munkitools_core-0.9.2.1838.0.plist to development...
Adding munkitools/munkitools_core-0.9.2.1846.0.plist to development...
Adding munkitools/munkitools_core-0.9.2.1847.0.plist to development...
Adding munkitools/munkitools_core-1.0.0.1864.0.plist to development...
Adding munkitools/munkitools_core-1.0.0.1878.0.plist to development...
Adding munkitools/munkitools_core-1.0.0.1879.0.plist to production...
Adding munkitools/munkitools_launchd-0.8.0.1.plist to development...
Adding Oracle/OracleJava7JDK-1.7.55.13.plist to testing...
Adding plugins/Java/OracleJava7-1.7.55.13.plist to testing...
Adding utilities/ThinLincClient-4.1.1.plist to testing...
Adding utilities/XQuartz-2.7.43.plist to testing...
Adding utilities/XQuartz-2.7.54.plist to testing...
Adding utilities/XQuartz-2.7.61.plist to testing...
Updated catalogs in /Users/Shared/munki_repo/pkgsinfo/apps/Firefox-29.0.plist to ['production', 'firefox-testing']
Updated catalogs in /Users/Shared/munki_repo/pkgsinfo/munkitools/munkitools_core-1.0.0.1879.0.plist to ['production']
Created catalog /Users/Shared/munki_repo/catalogs/development...
Created catalog /Users/Shared/munki_repo/catalogs/all...
Created catalog /Users/Shared/munki_repo/catalogs/thunderbird-testing...
Created catalog /Users/Shared/munki_repo/catalogs/testing...
Created catalog /Users/Shared/munki_repo/catalogs/production...
Created catalog /Users/Shared/munki_repo/catalogs/firefox-testing...
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>_autopromotion_catalogs</key>
<dict>
<key>14</key>
<array>
<string>production</string>
</array>
<key>7</key>
<array>
<string>testing</string>
</array>
</dict>
<key>_metadata</key>
<dict>
<key>created_by</key>
<string>gneagle</string>
<key>creation_date</key>
<date>2014-03-26T23:51:07Z</date>
<key>munki_version</key>
<string>2.0.0</string>
<key>os_version</key>
<string>10.9.2</string>
</dict>
<key>autoremove</key>
<false/>
<key>catalogs</key>
<array>
<string>development</string>
</array>
<key>description</key>
<string>Core command-line tools used by Managed Software Update.</string>
<key>display_name</key>
<string>Managed Software Update core tools</string>
<key>installed_size</key>
<integer>588</integer>
<key>installer_item_hash</key>
<string>dfb8157c2399e14803af15c1b17ecc6ee2d62810691aaaf06e6a4baadb47252d</string>
<key>installer_item_location</key>
<string>munkitools/munkitools-latest-1.0.0.1879.0.dmg</string>
<key>installer_item_size</key>
<integer>892</integer>
<key>minimum_os_version</key>
<string>10.4.0</string>
<key>name</key>
<string>munkitools_core</string>
<key>package_path</key>
<string>munkitools-1.0.0.1879.0.mpkg/Contents/Packages/munkitools_core-1.0.0.1879.0.pkg</string>
<key>receipts</key>
<array>
<dict>
<key>filename</key>
<string>munkitools_core-1.0.0.1879.0.pkg</string>
<key>installed_size</key>
<integer>588</integer>
<key>packageid</key>
<string>com.googlecode.munki.core</string>
<key>version</key>
<string>1.0.0.1879.0</string>
</dict>
</array>
<key>requires</key>
<array>
<string>munkitools_launchd</string>
</array>
<key>unattended_install</key>
<true/>
<key>uninstall_method</key>
<string>removepackages</string>
<key>uninstallable</key>
<true/>
<key>version</key>
<string>1.0.0.1879.0</string>
</dict>
</plist>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment