Get default sucatalog URL from Seeding.framework if possible; handle .gz sucatalogs

This commit is contained in:
Greg Neagle 2018-08-07 13:50:38 -07:00
parent b77c891090
commit aca77ebbf2

View File

@ -25,6 +25,7 @@ empty disk image'''
import argparse import argparse
import gzip
import os import os
import plistlib import plistlib
import subprocess import subprocess
@ -37,7 +38,20 @@ from xml.parsers.expat import ExpatError
DEFAULT_SUCATALOG = ( DEFAULT_SUCATALOG = (
'https://swscan.apple.com/content/catalogs/others/' 'https://swscan.apple.com/content/catalogs/others/'
'index-10.13seed-10.13-10.12-10.11-10.10-10.9' 'index-10.13seed-10.13-10.12-10.11-10.10-10.9'
'-mountainlion-lion-snowleopard-leopard.merged-1.sucatalog') '-mountainlion-lion-snowleopard-leopard.merged-1.sucatalog.gz')
def get_seed_catalog():
'''Returns the developer seed sucatalog'''
seed_catalogs_plist = (
'/System/Library/PrivateFrameworks/Seeding.framework/Versions/Current/'
'Resources/SeedCatalogs.plist'
)
try:
seed_catalogs = plistlib.readPlist(seed_catalogs_plist)
return seed_catalogs.get('DeveloperSeed', DEFAULT_SUCATALOG)
except (OSError, ExpatError, AttributeError, KeyError):
return DEFAULT_SUCATALOG
def make_sparse_image(volume_name, output_path): def make_sparse_image(volume_name, output_path):
@ -249,6 +263,17 @@ def download_and_parse_sucatalog(sucatalog, workdir, ignore_cache=False):
except ReplicationError, err: except ReplicationError, err:
print >> sys.stderr, 'Could not replicate %s: %s' % (sucatalog, err) print >> sys.stderr, 'Could not replicate %s: %s' % (sucatalog, err)
exit(-1) exit(-1)
if os.path.splitext(localcatalogpath)[1] == '.gz':
with gzip.open(localcatalogpath) as f:
content = f.read()
try:
catalog = plistlib.readPlistFromString(content)
return catalog
except ExpatError, err:
print >> sys.stderr, (
'Error reading %s: %s' % (localcatalogpath, err))
exit(-1)
else:
try: try:
catalog = plistlib.readPlist(localcatalogpath) catalog = plistlib.readPlist(localcatalogpath)
return catalog return catalog
@ -335,7 +360,7 @@ def main():
parser = argparse.ArgumentParser() parser = argparse.ArgumentParser()
parser.add_argument('--catalogurl', metavar='sucatalog_url', parser.add_argument('--catalogurl', metavar='sucatalog_url',
default=DEFAULT_SUCATALOG, default=get_seed_catalog(),
help='Software Update catalog URL.') help='Software Update catalog URL.')
parser.add_argument('--workdir', metavar='path_to_working_dir', parser.add_argument('--workdir', metavar='path_to_working_dir',
default='.', default='.',