pymobiledevice3 7.2.1__tar.gz → 7.3.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/PKG-INFO +1 -1
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/_version.py +3 -3
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/cli/developer/dvt/__init__.py +4 -3
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/cli/remote.py +2 -2
- pymobiledevice3-7.3.1/pymobiledevice3/services/dvt/instruments/network_monitor.py +158 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/tunneld/server.py +23 -12
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/usbmux.py +40 -23
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3.egg-info/PKG-INFO +1 -1
- pymobiledevice3-7.2.1/pymobiledevice3/services/dvt/instruments/network_monitor.py +0 -102
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/.gitattributes +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/.github/FUNDING.yml +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/.github/pull_request_template.md +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/.github/workflows/codeql.yml +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/.github/workflows/generate-executable.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/.github/workflows/markdown-lint.yml +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/.github/workflows/python-app.yml +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/.github/workflows/python-publish.yml +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/.gitignore +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/.pre-commit-config.yaml +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/CODE_OF_CONDUCT.md +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/CONTRIBUTING.md +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/LICENSE +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/README.md +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/example.gif +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/markdownlint-config.json +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/misc/DTServices-14.2.txt +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/misc/DTServices-14.5.txt +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/misc/RemoteXPC.md +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/misc/plist_sniffer.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/misc/pyinstaller.md +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/misc/remotexpc_sniffer.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/misc/understanding_idevice_protocol_layers.md +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/misc/usbmux_sniff.sh +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/__init__.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/__main__.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/bonjour.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/ca.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/cli/__init__.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/cli/activation.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/cli/afc.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/cli/amfi.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/cli/apps.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/cli/backup.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/cli/bonjour.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/cli/cli_common.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/cli/companion_proxy.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/cli/crash.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/cli/developer/__init__.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/cli/developer/accessibility/__init__.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/cli/developer/accessibility/settings.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/cli/developer/arbitration.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/cli/developer/condition.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/cli/developer/core_device.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/cli/developer/debugserver.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/cli/developer/dvt/core_profile_session.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/cli/developer/dvt/simulate_location.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/cli/developer/dvt/sysmon/__init__.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/cli/developer/dvt/sysmon/process.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/cli/developer/fetch_symbols.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/cli/developer/simulate_location.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/cli/diagnostics/__init__.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/cli/diagnostics/battery.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/cli/idam.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/cli/lockdown.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/cli/mounter.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/cli/notification.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/cli/pcap.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/cli/power_assertion.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/cli/processes.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/cli/profile.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/cli/provision.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/cli/restore.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/cli/springboard.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/cli/syslog.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/cli/usbmux.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/cli/version.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/cli/webinspector.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/common.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/exceptions.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/irecv.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/irecv_devices.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/lockdown.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/lockdown_service_provider.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/osu/__init__.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/osu/os_utils.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/osu/posix_util.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/osu/win_util.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/pair_records.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/remote/__init__.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/remote/common.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/remote/core_device/__init__.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/remote/core_device/app_service.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/remote/core_device/core_device_service.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/remote/core_device/device_info.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/remote/core_device/diagnostics_service.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/remote/core_device/file_service.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/remote/module_imports.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/remote/remote_service.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/remote/remote_service_discovery.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/remote/remotexpc.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/remote/tunnel_service.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/remote/utils.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/remote/xpc_message.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/resources/__init__.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/resources/dsc_uuid_map.json +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/resources/dsc_uuid_map.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/resources/firmware_notifications.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/resources/notifications.txt +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/resources/webinspector/element_attribute.js +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/resources/webinspector/element_clear.js +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/resources/webinspector/enter_fullscreen.js +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/resources/webinspector/find_nodes.js +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/resources/webinspector/focus.js +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/resources/webinspector/get_attribute.js +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/resources/webinspector/is_displayed.js +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/resources/webinspector/is_editable.js +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/resources/webinspector/is_enabled.js +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/restore/__init__.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/restore/asr.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/restore/base_restore.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/restore/consts.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/restore/device.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/restore/fdr.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/restore/ftab.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/restore/img4.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/restore/mbn.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/restore/recovery.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/restore/restore.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/restore/restore_options.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/restore/restored_client.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/restore/tss.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/service_connection.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/__init__.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/accessibilityaudit.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/afc.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/amfi.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/companion.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/crash_reports.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/debugserver_applist.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/device_arbitration.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/device_link.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/diagnostics.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/dtfetchsymbols.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/dvt/__init__.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/dvt/dvt_secure_socket_proxy.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/dvt/dvt_testmanaged_proxy.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/dvt/instruments/__init__.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/dvt/instruments/activity_trace_tap.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/dvt/instruments/application_listing.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/dvt/instruments/condition_inducer.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/dvt/instruments/core_profile_session_tap.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/dvt/instruments/device_info.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/dvt/instruments/energy_monitor.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/dvt/instruments/graphics.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/dvt/instruments/location_simulation.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/dvt/instruments/location_simulation_base.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/dvt/instruments/notifications.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/dvt/instruments/process_control.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/dvt/instruments/screenshot.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/dvt/instruments/sysmontap.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/dvt/testmanaged/xcuitest.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/file_relay.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/heartbeat.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/house_arrest.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/idam.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/installation_proxy.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/lockdown_service.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/misagent.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/mobile_activation.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/mobile_config.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/mobile_image_mounter.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/mobilebackup2.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/notification_proxy.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/os_trace.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/pcapd.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/power_assertion.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/preboard.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/remote_fetch_symbols.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/remote_server.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/restore_service.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/screenshot.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/simulate_location.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/springboard.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/syslog.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/web_protocol/__init__.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/web_protocol/alert.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/web_protocol/automation_session.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/web_protocol/cdp_screencast.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/web_protocol/cdp_server.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/web_protocol/cdp_target.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/web_protocol/driver.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/web_protocol/element.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/web_protocol/inspector_session.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/web_protocol/selenium_api.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/web_protocol/session_protocol.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/web_protocol/switch_to.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/webinspector.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/tcp_forwarder.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/tunneld/__init__.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/tunneld/api.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/utils.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3.egg-info/SOURCES.txt +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3.egg-info/dependency_links.txt +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3.egg-info/entry_points.txt +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3.egg-info/requires.txt +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3.egg-info/top_level.txt +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pyproject.toml +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pytest.ini +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/requirements.txt +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/setup.cfg +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/tests/__init__.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/tests/cli/__init__.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/tests/cli/test_cli.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/tests/conftest.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/tests/services/__init__.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/tests/services/instruments/__init__.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/tests/services/instruments/test_core_profile_session.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/tests/services/instruments/test_dvt_secure_socket_proxy.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/tests/services/instruments/test_fetch_symbols.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/tests/services/instruments/test_location.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/tests/services/instruments/test_screenshot.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/tests/services/test_accessibility.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/tests/services/test_afc.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/tests/services/test_apps.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/tests/services/test_backup2.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/tests/services/test_bonjour.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/tests/services/test_crash_reports.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/tests/services/test_house_arrest.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/tests/services/test_list_devices.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/tests/services/test_lockdown.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/tests/services/test_pcapd.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/tests/services/test_springboard_services_relay.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/tests/services/test_start_tunnel.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/tests/services/test_syslog_relay.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/tests/services/test_tcp_forwarder.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/tests/services/test_web_protocol/__init__.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/tests/services/test_web_protocol/common.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/tests/services/test_web_protocol/conftest.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/tests/services/test_web_protocol/test_driver.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/tests/services/test_web_protocol/test_element.py +0 -0
- {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/tests/services/test_webinspector.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: pymobiledevice3
|
|
3
|
-
Version: 7.
|
|
3
|
+
Version: 7.3.1
|
|
4
4
|
Summary: Pure python3 implementation for working with iDevices (iPhone, etc...)
|
|
5
5
|
Author-email: doronz88 <doron88@gmail.com>, matan <matan1008@gmail.com>
|
|
6
6
|
Maintainer-email: doronz88 <doron88@gmail.com>, matan <matan1008@gmail.com>
|
|
@@ -28,7 +28,7 @@ version_tuple: VERSION_TUPLE
|
|
|
28
28
|
commit_id: COMMIT_ID
|
|
29
29
|
__commit_id__: COMMIT_ID
|
|
30
30
|
|
|
31
|
-
__version__ = version = '7.
|
|
32
|
-
__version_tuple__ = version_tuple = (7,
|
|
31
|
+
__version__ = version = '7.3.1'
|
|
32
|
+
__version_tuple__ = version_tuple = (7, 3, 1)
|
|
33
33
|
|
|
34
|
-
__commit_id__ = commit_id = '
|
|
34
|
+
__commit_id__ = commit_id = 'g3806869e7'
|
{pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/cli/developer/dvt/__init__.py
RENAMED
|
@@ -304,9 +304,10 @@ def netstat(service_provider: ServiceProviderDep) -> None:
|
|
|
304
304
|
with DvtSecureSocketProxyService(lockdown=service_provider) as dvt, NetworkMonitor(dvt) as monitor:
|
|
305
305
|
for event in monitor:
|
|
306
306
|
if isinstance(event, ConnectionDetectionEvent):
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
307
|
+
logger.info(
|
|
308
|
+
f"Connection detected: {event.local_address.data.address}:{event.local_address.port} -> "
|
|
309
|
+
f"{event.remote_address.data.address}:{event.remote_address.port}"
|
|
310
|
+
)
|
|
310
311
|
|
|
311
312
|
|
|
312
313
|
@cli.command("screenshot")
|
|
@@ -83,14 +83,14 @@ def cli_tunneld(
|
|
|
83
83
|
port: Annotated[int, typer.Option(help="Port to bind the tunneld server to.")] = TUNNELD_DEFAULT_ADDRESS[1],
|
|
84
84
|
daemonize: Annotated[bool, typer.Option("--daemonize", "-d", help="Run tunneld in the background.")] = False,
|
|
85
85
|
protocol: Annotated[
|
|
86
|
-
|
|
86
|
+
str,
|
|
87
87
|
typer.Option(
|
|
88
88
|
"--protocol",
|
|
89
89
|
"-p",
|
|
90
90
|
case_sensitive=False,
|
|
91
91
|
help="Transport protocol for tunneld (default: TCP on Python >=3.13, otherwise QUIC).",
|
|
92
92
|
),
|
|
93
|
-
] = TunnelProtocol.DEFAULT,
|
|
93
|
+
] = TunnelProtocol.DEFAULT.value,
|
|
94
94
|
usb: Annotated[bool, typer.Option(help="Enable USB monitoring")] = True,
|
|
95
95
|
wifi: Annotated[bool, typer.Option(help="Enable WiFi monitoring")] = True,
|
|
96
96
|
usbmux: Annotated[bool, typer.Option(help="Enable usbmux monitoring")] = True,
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import ipaddress
|
|
2
|
+
import logging
|
|
3
|
+
from collections.abc import Iterator
|
|
4
|
+
from dataclasses import dataclass
|
|
5
|
+
from typing import Union
|
|
6
|
+
|
|
7
|
+
from construct import Adapter, Bytes, Int8ul, Int16ub, Int32ul, Switch, this
|
|
8
|
+
from construct_typed import DataclassMixin, TStruct, csfield
|
|
9
|
+
|
|
10
|
+
from pymobiledevice3.services.dvt.dvt_secure_socket_proxy import DvtSecureSocketProxyService
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class IpAddressAdapter(Adapter):
|
|
14
|
+
"""Decode raw address bytes into ipaddress objects."""
|
|
15
|
+
|
|
16
|
+
def _decode(self, obj, context, path):
|
|
17
|
+
return ipaddress.ip_address(obj)
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
@dataclass
|
|
21
|
+
class AddressV6(DataclassMixin):
|
|
22
|
+
"""IPv6 payload for a socket address."""
|
|
23
|
+
|
|
24
|
+
flow_info: int = csfield(Int32ul)
|
|
25
|
+
address: ipaddress.IPv6Address = csfield(IpAddressAdapter(Bytes(16)))
|
|
26
|
+
scope_id: int = csfield(Int32ul)
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
@dataclass
|
|
30
|
+
class AddressV4(DataclassMixin):
|
|
31
|
+
"""IPv4 payload for a socket address."""
|
|
32
|
+
|
|
33
|
+
address: ipaddress.IPv4Address = csfield(IpAddressAdapter(Bytes(4)))
|
|
34
|
+
_zero: bytes = csfield(Bytes(8))
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
@dataclass
|
|
38
|
+
class SocketAddress(DataclassMixin):
|
|
39
|
+
"""Parsed socket address with family-specific payload."""
|
|
40
|
+
|
|
41
|
+
length: int = csfield(Int8ul)
|
|
42
|
+
family: int = csfield(Int8ul)
|
|
43
|
+
port: int = csfield(Int16ub)
|
|
44
|
+
data: Union[AddressV4, AddressV6] = csfield(
|
|
45
|
+
Switch(
|
|
46
|
+
this.length,
|
|
47
|
+
{
|
|
48
|
+
0x1C: TStruct(AddressV6),
|
|
49
|
+
0x10: TStruct(AddressV4),
|
|
50
|
+
},
|
|
51
|
+
)
|
|
52
|
+
)
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
address_t = TStruct(SocketAddress)
|
|
56
|
+
|
|
57
|
+
MESSAGE_TYPE_INTERFACE_DETECTION = 0
|
|
58
|
+
MESSAGE_TYPE_CONNECTION_DETECTION = 1
|
|
59
|
+
MESSAGE_TYPE_CONNECTION_UPDATE = 2
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
@dataclass
|
|
63
|
+
class InterfaceDetectionEvent:
|
|
64
|
+
"""Interface detection event emitted by Instruments."""
|
|
65
|
+
|
|
66
|
+
interface_index: int
|
|
67
|
+
name: str
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
@dataclass
|
|
71
|
+
class ConnectionDetectionEvent:
|
|
72
|
+
"""Connection detection event emitted by Instruments."""
|
|
73
|
+
|
|
74
|
+
local_address: SocketAddress
|
|
75
|
+
remote_address: SocketAddress
|
|
76
|
+
interface_index: int
|
|
77
|
+
pid: int
|
|
78
|
+
recv_buffer_size: int
|
|
79
|
+
recv_buffer_used: int
|
|
80
|
+
serial_number: int
|
|
81
|
+
kind: int
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
@dataclass
|
|
85
|
+
class ConnectionUpdateEvent:
|
|
86
|
+
"""Connection update event emitted by Instruments."""
|
|
87
|
+
|
|
88
|
+
rx_packets: int
|
|
89
|
+
rx_bytes: int
|
|
90
|
+
tx_packets: int
|
|
91
|
+
tx_bytes: int
|
|
92
|
+
rx_dups: int
|
|
93
|
+
rx000: int
|
|
94
|
+
tx_retx: int
|
|
95
|
+
min_rtt: int
|
|
96
|
+
avg_rtt: int
|
|
97
|
+
connection_serial: int
|
|
98
|
+
time: int
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
NetworkMonitorEvent = Union[InterfaceDetectionEvent, ConnectionDetectionEvent, ConnectionUpdateEvent]
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
class NetworkMonitor:
|
|
105
|
+
"""Iterate over network monitoring events from the Instruments service."""
|
|
106
|
+
|
|
107
|
+
IDENTIFIER = "com.apple.instruments.server.services.networking"
|
|
108
|
+
|
|
109
|
+
def __init__(self, dvt: DvtSecureSocketProxyService):
|
|
110
|
+
self.logger = logging.getLogger(__name__)
|
|
111
|
+
self._channel = dvt.make_channel(self.IDENTIFIER)
|
|
112
|
+
|
|
113
|
+
def __enter__(self) -> "NetworkMonitor":
|
|
114
|
+
self._channel.startMonitoring(expects_reply=False)
|
|
115
|
+
return self
|
|
116
|
+
|
|
117
|
+
def __exit__(self, exc_type, exc_val, exc_tb) -> None:
|
|
118
|
+
self._channel.stopMonitoring()
|
|
119
|
+
|
|
120
|
+
def __iter__(self) -> Iterator[NetworkMonitorEvent]:
|
|
121
|
+
"""Yield network events as they arrive from the service."""
|
|
122
|
+
|
|
123
|
+
while True:
|
|
124
|
+
message = self._channel.receive_plist()
|
|
125
|
+
|
|
126
|
+
event = None
|
|
127
|
+
|
|
128
|
+
if message is None:
|
|
129
|
+
continue
|
|
130
|
+
|
|
131
|
+
if message[0] == MESSAGE_TYPE_INTERFACE_DETECTION:
|
|
132
|
+
event = InterfaceDetectionEvent(*message[1])
|
|
133
|
+
elif message[0] == MESSAGE_TYPE_CONNECTION_DETECTION:
|
|
134
|
+
(
|
|
135
|
+
local_address,
|
|
136
|
+
remote_address,
|
|
137
|
+
interface_index,
|
|
138
|
+
pid,
|
|
139
|
+
recv_buffer_size,
|
|
140
|
+
recv_buffer_used,
|
|
141
|
+
serial_number,
|
|
142
|
+
kind,
|
|
143
|
+
) = message[1]
|
|
144
|
+
event = ConnectionDetectionEvent(
|
|
145
|
+
local_address=address_t.parse(local_address),
|
|
146
|
+
remote_address=address_t.parse(remote_address),
|
|
147
|
+
interface_index=interface_index,
|
|
148
|
+
pid=pid,
|
|
149
|
+
recv_buffer_size=recv_buffer_size,
|
|
150
|
+
recv_buffer_used=recv_buffer_used,
|
|
151
|
+
serial_number=serial_number,
|
|
152
|
+
kind=kind,
|
|
153
|
+
)
|
|
154
|
+
elif message[0] == MESSAGE_TYPE_CONNECTION_UPDATE:
|
|
155
|
+
event = ConnectionUpdateEvent(*message[1])
|
|
156
|
+
else:
|
|
157
|
+
self.logger.warning(f"unsupported event type: {message[0]}")
|
|
158
|
+
yield event
|
|
@@ -191,10 +191,16 @@ class TunneldCore:
|
|
|
191
191
|
|
|
192
192
|
@asyncio_print_traceback
|
|
193
193
|
async def monitor_usbmux_task(self) -> None:
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
194
|
+
while True:
|
|
195
|
+
mux = None
|
|
196
|
+
try:
|
|
197
|
+
mux = usbmux.create_mux()
|
|
198
|
+
mux.listen()
|
|
199
|
+
|
|
200
|
+
while True:
|
|
201
|
+
await asyncio.to_thread(mux.receive_device_state_update)
|
|
202
|
+
|
|
203
|
+
for mux_device in mux.devices:
|
|
198
204
|
task_identifier = f"usbmux-{mux_device.serial}-{mux_device.connection_type}"
|
|
199
205
|
if self.tunnel_exists_for_udid(mux_device.serial):
|
|
200
206
|
# Skip if already established a tunnel for this udid
|
|
@@ -227,14 +233,19 @@ class TunneldCore:
|
|
|
227
233
|
name=f"start-tunnel-task-{task_identifier}",
|
|
228
234
|
),
|
|
229
235
|
)
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
236
|
+
except (BlockingIOError, StreamError, OSError) as e:
|
|
237
|
+
# Connection lost - will reconnect on next iteration
|
|
238
|
+
logger.debug(f"usbmux connection error: {e}, reconnecting...")
|
|
239
|
+
except ConnectionFailedToUsbmuxdError:
|
|
240
|
+
# This is exception is expected to occur repeatedly on linux running usbmuxd
|
|
241
|
+
# as long as there isn't any physical iDevice connected
|
|
242
|
+
logger.debug("failed to connect to usbmux. waiting for it to restart")
|
|
243
|
+
await asyncio.sleep(USBMUX_INTERVAL)
|
|
244
|
+
except asyncio.CancelledError:
|
|
245
|
+
break
|
|
246
|
+
finally:
|
|
247
|
+
if mux is not None:
|
|
248
|
+
mux.close()
|
|
238
249
|
|
|
239
250
|
@asyncio_print_traceback
|
|
240
251
|
async def monitor_mobdev2_task(self) -> None:
|
|
@@ -258,6 +258,11 @@ class MuxConnection:
|
|
|
258
258
|
"""
|
|
259
259
|
pass
|
|
260
260
|
|
|
261
|
+
@abc.abstractmethod
|
|
262
|
+
def listen(self):
|
|
263
|
+
"""start listening for events of attached and detached devices"""
|
|
264
|
+
pass
|
|
265
|
+
|
|
261
266
|
def connect(self, device: MuxDevice, port: int) -> socket.socket:
|
|
262
267
|
"""connect to a relay port on target machine and get a raw python socket object for the connection"""
|
|
263
268
|
self._connect(device.devid, socket.htons(port))
|
|
@@ -273,6 +278,11 @@ class MuxConnection:
|
|
|
273
278
|
if self._connected:
|
|
274
279
|
raise MuxException("Mux is connected, cannot issue control packets")
|
|
275
280
|
|
|
281
|
+
@abc.abstractmethod
|
|
282
|
+
def receive_device_state_update(self):
|
|
283
|
+
"""Block and wait for a device notification"""
|
|
284
|
+
pass
|
|
285
|
+
|
|
276
286
|
def _raise_mux_exception(self, result: int, message: Optional[str] = None) -> None:
|
|
277
287
|
exceptions = {
|
|
278
288
|
int(usbmuxd_result.BADCOMMAND): BadCommandError,
|
|
@@ -306,7 +316,7 @@ class BinaryMuxConnection(MuxConnection):
|
|
|
306
316
|
while time.time() < end:
|
|
307
317
|
self._sock.settimeout(end - time.time())
|
|
308
318
|
try:
|
|
309
|
-
self.
|
|
319
|
+
self.receive_device_state_update()
|
|
310
320
|
except (BlockingIOError, StreamError):
|
|
311
321
|
continue
|
|
312
322
|
except OSError as e:
|
|
@@ -348,6 +358,16 @@ class BinaryMuxConnection(MuxConnection):
|
|
|
348
358
|
raise MuxException(f"Reply tag mismatch: expected {expected_tag}, got {response.header.tag}")
|
|
349
359
|
return response
|
|
350
360
|
|
|
361
|
+
def receive_device_state_update(self):
|
|
362
|
+
response = self._receive()
|
|
363
|
+
if response.header.message == usbmuxd_msgtype.ADD:
|
|
364
|
+
# old protocol only supported USB devices
|
|
365
|
+
self._add_device(MuxDevice(response.data.device_id, response.data.serial_number, "USB"))
|
|
366
|
+
elif response.header.message == usbmuxd_msgtype.REMOVE:
|
|
367
|
+
self._remove_device(response.data.device_id)
|
|
368
|
+
else:
|
|
369
|
+
raise MuxException(f"Invalid packet type received: {response}")
|
|
370
|
+
|
|
351
371
|
def _send_receive(self, message_type: int):
|
|
352
372
|
self._send({"header": {"version": self._version, "message": message_type, "tag": self._tag}, "data": b""})
|
|
353
373
|
response = self._receive(self._tag - 1)
|
|
@@ -364,16 +384,6 @@ class BinaryMuxConnection(MuxConnection):
|
|
|
364
384
|
def _remove_device(self, device_id: int):
|
|
365
385
|
self.devices = [device for device in self.devices if device.devid != device_id]
|
|
366
386
|
|
|
367
|
-
def _receive_device_state_update(self):
|
|
368
|
-
response = self._receive()
|
|
369
|
-
if response.header.message == usbmuxd_msgtype.ADD:
|
|
370
|
-
# old protocol only supported USB devices
|
|
371
|
-
self._add_device(MuxDevice(response.data.device_id, response.data.serial_number, "USB"))
|
|
372
|
-
elif response.header.message == usbmuxd_msgtype.REMOVE:
|
|
373
|
-
self._remove_device(response.data.device_id)
|
|
374
|
-
else:
|
|
375
|
-
raise MuxException(f"Invalid packet type received: {response}")
|
|
376
|
-
|
|
377
387
|
|
|
378
388
|
class PlistMuxConnection(BinaryMuxConnection):
|
|
379
389
|
def __init__(self, sock: SafeStreamSocket):
|
|
@@ -392,6 +402,20 @@ class PlistMuxConnection(BinaryMuxConnection):
|
|
|
392
402
|
raise NotPairedError("device should be paired first")
|
|
393
403
|
return plistlib.loads(pair_record)
|
|
394
404
|
|
|
405
|
+
def _process_device_state(self, response):
|
|
406
|
+
if response["MessageType"] == "Attached":
|
|
407
|
+
super()._add_device(
|
|
408
|
+
MuxDevice(
|
|
409
|
+
response["DeviceID"],
|
|
410
|
+
response["Properties"]["SerialNumber"],
|
|
411
|
+
response["Properties"]["ConnectionType"],
|
|
412
|
+
)
|
|
413
|
+
)
|
|
414
|
+
elif response["MessageType"] == "Detached":
|
|
415
|
+
super()._remove_device(response["DeviceID"])
|
|
416
|
+
else:
|
|
417
|
+
raise MuxException(f"Invalid packet type received: {response}")
|
|
418
|
+
|
|
395
419
|
def get_device_list(self, timeout: Optional[float] = None) -> None:
|
|
396
420
|
"""get device list synchronously without waiting the timeout"""
|
|
397
421
|
self.devices = []
|
|
@@ -401,18 +425,7 @@ class PlistMuxConnection(BinaryMuxConnection):
|
|
|
401
425
|
if device_list is None:
|
|
402
426
|
raise MuxException(f"Got an invalid response from usbmux: {response}")
|
|
403
427
|
for response in device_list:
|
|
404
|
-
|
|
405
|
-
super()._add_device(
|
|
406
|
-
MuxDevice(
|
|
407
|
-
response["DeviceID"],
|
|
408
|
-
response["Properties"]["SerialNumber"],
|
|
409
|
-
response["Properties"]["ConnectionType"],
|
|
410
|
-
)
|
|
411
|
-
)
|
|
412
|
-
elif response["MessageType"] == "Detached":
|
|
413
|
-
super()._remove_device(response["DeviceID"])
|
|
414
|
-
else:
|
|
415
|
-
raise MuxException(f"Invalid packet type received: {response}")
|
|
428
|
+
self._process_device_state(response)
|
|
416
429
|
|
|
417
430
|
def get_buid(self) -> str:
|
|
418
431
|
"""get SystemBUID"""
|
|
@@ -445,6 +458,10 @@ class PlistMuxConnection(BinaryMuxConnection):
|
|
|
445
458
|
raise MuxException(f"Received non-plist type {response}")
|
|
446
459
|
return plistlib.loads(response.data)
|
|
447
460
|
|
|
461
|
+
def receive_device_state_update(self):
|
|
462
|
+
response = self._receive()
|
|
463
|
+
self._process_device_state(response)
|
|
464
|
+
|
|
448
465
|
def _send_receive(self, data: dict):
|
|
449
466
|
self._send(data)
|
|
450
467
|
response = self._receive(self._tag - 1)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: pymobiledevice3
|
|
3
|
-
Version: 7.
|
|
3
|
+
Version: 7.3.1
|
|
4
4
|
Summary: Pure python3 implementation for working with iDevices (iPhone, etc...)
|
|
5
5
|
Author-email: doronz88 <doron88@gmail.com>, matan <matan1008@gmail.com>
|
|
6
6
|
Maintainer-email: doronz88 <doron88@gmail.com>, matan <matan1008@gmail.com>
|
|
@@ -1,102 +0,0 @@
|
|
|
1
|
-
import dataclasses
|
|
2
|
-
import ipaddress
|
|
3
|
-
import logging
|
|
4
|
-
|
|
5
|
-
from construct import Adapter, Bytes, Int8ul, Int16ub, Int32ul, Struct, Switch, this
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
class IpAddressAdapter(Adapter):
|
|
9
|
-
def _decode(self, obj, context, path):
|
|
10
|
-
return ipaddress.ip_address(obj)
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
address_t = Struct(
|
|
14
|
-
"len" / Int8ul,
|
|
15
|
-
"family" / Int8ul,
|
|
16
|
-
"port" / Int16ub,
|
|
17
|
-
"data"
|
|
18
|
-
/ Switch(
|
|
19
|
-
this.len,
|
|
20
|
-
{
|
|
21
|
-
0x1C: Struct(
|
|
22
|
-
"flow_info" / Int32ul,
|
|
23
|
-
"address" / IpAddressAdapter(Bytes(16)),
|
|
24
|
-
"scope_id" / Int32ul,
|
|
25
|
-
),
|
|
26
|
-
0x10: Struct("address" / IpAddressAdapter(Bytes(4)), "_zero" / Bytes(8)),
|
|
27
|
-
},
|
|
28
|
-
),
|
|
29
|
-
)
|
|
30
|
-
|
|
31
|
-
MESSAGE_TYPE_INTERFACE_DETECTION = 0
|
|
32
|
-
MESSAGE_TYPE_CONNECTION_DETECTION = 1
|
|
33
|
-
MESSAGE_TYPE_CONNECTION_UPDATE = 2
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
@dataclasses.dataclass
|
|
37
|
-
class InterfaceDetectionEvent:
|
|
38
|
-
interface_index: int
|
|
39
|
-
name: str
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
@dataclasses.dataclass
|
|
43
|
-
class ConnectionDetectionEvent:
|
|
44
|
-
local_address: str
|
|
45
|
-
remote_address: str
|
|
46
|
-
interface_index: int
|
|
47
|
-
pid: int
|
|
48
|
-
recv_buffer_size: int
|
|
49
|
-
recv_buffer_used: int
|
|
50
|
-
serial_number: int
|
|
51
|
-
kind: int
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
@dataclasses.dataclass
|
|
55
|
-
class ConnectionUpdateEvent:
|
|
56
|
-
rx_packets: int
|
|
57
|
-
rx_bytes: int
|
|
58
|
-
tx_packets: int
|
|
59
|
-
tx_bytes: int
|
|
60
|
-
rx_dups: int
|
|
61
|
-
rx000: int
|
|
62
|
-
tx_retx: int
|
|
63
|
-
min_rtt: int
|
|
64
|
-
avg_rtt: int
|
|
65
|
-
connection_serial: int
|
|
66
|
-
time: int
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
class NetworkMonitor:
|
|
70
|
-
IDENTIFIER = "com.apple.instruments.server.services.networking"
|
|
71
|
-
|
|
72
|
-
def __init__(self, dvt):
|
|
73
|
-
self.logger = logging.getLogger(__name__)
|
|
74
|
-
self._channel = dvt.make_channel(self.IDENTIFIER)
|
|
75
|
-
|
|
76
|
-
def __enter__(self):
|
|
77
|
-
self._channel.startMonitoring(expects_reply=False)
|
|
78
|
-
return self
|
|
79
|
-
|
|
80
|
-
def __exit__(self, exc_type, exc_val, exc_tb):
|
|
81
|
-
self._channel.stopMonitoring()
|
|
82
|
-
|
|
83
|
-
def __iter__(self):
|
|
84
|
-
while True:
|
|
85
|
-
message = self._channel.receive_plist()
|
|
86
|
-
|
|
87
|
-
event = None
|
|
88
|
-
|
|
89
|
-
if message is None:
|
|
90
|
-
continue
|
|
91
|
-
|
|
92
|
-
if message[0] == MESSAGE_TYPE_INTERFACE_DETECTION:
|
|
93
|
-
event = InterfaceDetectionEvent(*message[1])
|
|
94
|
-
elif message[0] == MESSAGE_TYPE_CONNECTION_DETECTION:
|
|
95
|
-
event = ConnectionDetectionEvent(*message[1])
|
|
96
|
-
event.local_address = address_t.parse(event.local_address)
|
|
97
|
-
event.remote_address = address_t.parse(event.remote_address)
|
|
98
|
-
elif message[0] == MESSAGE_TYPE_CONNECTION_UPDATE:
|
|
99
|
-
event = ConnectionUpdateEvent(*message[1])
|
|
100
|
-
else:
|
|
101
|
-
self.logger.warning(f"unsupported event type: {message[0]}")
|
|
102
|
-
yield event
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/misc/understanding_idevice_protocol_layers.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/cli/developer/arbitration.py
RENAMED
|
File without changes
|
|
File without changes
|
{pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/cli/developer/core_device.py
RENAMED
|
File without changes
|
{pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/cli/developer/debugserver.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/cli/developer/dvt/sysmon/__init__.py
RENAMED
|
File without changes
|
{pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/cli/developer/dvt/sysmon/process.py
RENAMED
|
File without changes
|
{pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/cli/developer/fetch_symbols.py
RENAMED
|
File without changes
|
{pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/cli/developer/simulate_location.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|