Portal is a Python module that hooks to Apple's undocumented provisioning portal developer services as well as a command line utility that allows you to perform tasks without suffering CTS from all the clicking.
Not all functionality is available, it will be added as time permits.
Usage:
usage: portal CMD [OPTS...] [ARGS...] Global options: -d enable API debug mode Certificate Management: portal listCertificates [-v | -r] Device Management: portal listDevices [-v | -r] <filter-criteria> portal addDevice [-m name] udid portal deleteDevice <filter-criteria> portal enableDevice <filter-criteria> filter-criteria: [-m nameregex] [-u udidregex] [ID...] App ID Management portal listApps [-v | -r] Provisioning Profile Management: portal listProfiles [-v | -r] <filter-criteria> portal getProfile [-a | -i ID] [-o OUTPUT] [-q] portal regenerateProfile [-v | -q] [-n] ( [-a] | <filter-criteria> ) portal deleteProfile [-q] [-n] <filter-criteria> filter-criteria: [-t type] [-i appId] [-m nameregex] [ID...] Miscellaneous: portal whoami PORTAL_ENVIRONMENT Environment variable with .portalrc section to use when connecting to the provisioning portal (defaults to "Default" if unset)
Sample usage:
import portal # Instantiate and login api = portal.API() api.login('user@email.com', 'mypassword') # Retrieve all provisioning profiles profiles = api.all_provisioning_profiles() # Download the one matching a specific name matches = [ p for p in profiles if profile['name'] = 'MyApp' ] api.download_profile(p, 'myapp.mobileprovision') # Other api methods: api.all_cert_requests() api.all_app_ids() api.all_provisioning_profiles() api.all_devices() api.clear_cache() # all the all_* methods cache their results. # clear_cache will force a refetch api.list_cert_requests(types) # get certs matching any of the listed types # e.g. CERT_TYPE_IOS_DEVELOPMENT, etc. api.update_provisioning_profile(profile, ...) # update a provisioning profile api.download_profile(profile, path) # Download a provisioning profile api.delete_provisioning_profile(...) api.create_provisioning_profile(...) api.get_device(device_id) api.add_device(udid, name=None) api.delete_device(device_id_or_obj) api.enable_device(device_id_or_obj)