#!/usr/bin/env python import plistlib import json import os.path from os import listdir from datetime import datetime import logging from optparse import OptionParser logger = logging.getLogger('pfm2index') def generate_item(manifest_path): print('processing: {}'.format(manifest_path)) try: p = plistlib.readPlist(manifest_path) result = { 'ManifestPath': manifest_path, 'PayloadType': p['pfm_domain'], 'PayloadDisplayName': p.get('pfm_title', None), 'PayloadDescription': p['pfm_description'], 'PayloadIOSMinVersion': p.get('pfm_ios_min', None), 'PayloadIOSMaxVersion': p.get('pfm_ios_max', None), 'PayloadMacOSMinVersion': p.get('pfm_macos_min', None), 'PayloadMacOSMaxVersion': p.get('pfm_macos_max', None), 'PayloadTvOSMinVersion': p.get('pfm_tvos_min', None), 'PayloadTvOSMaxVersion': p.get('pfm_tvos_max', None), 'PayloadSingleton': p.get('pfm_unique', False), 'PayloadSupervisionRequired': p.get('pfm_supervised', False), } except ValueError as e: result = {'ManifestPath': manifest_path, 'error': True, 'errorMessage': e.message} print('skipping: {}'.format(manifest_path)) pass return result if __name__ == "__main__": usage = "usage: %prog [options] /path/to/manifests" parser = OptionParser(usage=usage) parser.add_option("-o", "--output", dest="output", help="write index to output dir", metavar="DIR") (options, args) = parser.parse_args() ch = logging.StreamHandler() logger.addHandler(ch) logger.setLevel(logging.DEBUG) result = { "version": "1.0", "lastUpdatedUtc": datetime.utcnow().isoformat(), "payloads": [], } result['payloads'] = [generate_item(os.path.join(args[-1], f)) for f in listdir(args[-1])] if options.output: with open(os.path.join(options.output, 'payload-index.json'), 'w+') as f: json.dump(result, f, indent=4) else: print(json.dumps(result))