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.
Files changed (244) hide show
  1. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/PKG-INFO +1 -1
  2. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/_version.py +3 -3
  3. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/cli/developer/dvt/__init__.py +4 -3
  4. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/cli/remote.py +2 -2
  5. pymobiledevice3-7.3.1/pymobiledevice3/services/dvt/instruments/network_monitor.py +158 -0
  6. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/tunneld/server.py +23 -12
  7. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/usbmux.py +40 -23
  8. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3.egg-info/PKG-INFO +1 -1
  9. pymobiledevice3-7.2.1/pymobiledevice3/services/dvt/instruments/network_monitor.py +0 -102
  10. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/.gitattributes +0 -0
  11. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/.github/FUNDING.yml +0 -0
  12. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  13. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  14. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  15. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/.github/pull_request_template.md +0 -0
  16. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/.github/workflows/codeql.yml +0 -0
  17. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/.github/workflows/generate-executable.py +0 -0
  18. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/.github/workflows/markdown-lint.yml +0 -0
  19. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/.github/workflows/python-app.yml +0 -0
  20. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/.github/workflows/python-publish.yml +0 -0
  21. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/.gitignore +0 -0
  22. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/.pre-commit-config.yaml +0 -0
  23. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/CODE_OF_CONDUCT.md +0 -0
  24. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/CONTRIBUTING.md +0 -0
  25. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/LICENSE +0 -0
  26. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/README.md +0 -0
  27. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/example.gif +0 -0
  28. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/markdownlint-config.json +0 -0
  29. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/misc/DTServices-14.2.txt +0 -0
  30. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/misc/DTServices-14.5.txt +0 -0
  31. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/misc/RemoteXPC.md +0 -0
  32. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/misc/plist_sniffer.py +0 -0
  33. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/misc/pyinstaller.md +0 -0
  34. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/misc/remotexpc_sniffer.py +0 -0
  35. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/misc/understanding_idevice_protocol_layers.md +0 -0
  36. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/misc/usbmux_sniff.sh +0 -0
  37. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/__init__.py +0 -0
  38. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/__main__.py +0 -0
  39. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/bonjour.py +0 -0
  40. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/ca.py +0 -0
  41. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/cli/__init__.py +0 -0
  42. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/cli/activation.py +0 -0
  43. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/cli/afc.py +0 -0
  44. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/cli/amfi.py +0 -0
  45. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/cli/apps.py +0 -0
  46. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/cli/backup.py +0 -0
  47. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/cli/bonjour.py +0 -0
  48. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/cli/cli_common.py +0 -0
  49. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/cli/companion_proxy.py +0 -0
  50. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/cli/crash.py +0 -0
  51. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/cli/developer/__init__.py +0 -0
  52. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/cli/developer/accessibility/__init__.py +0 -0
  53. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/cli/developer/accessibility/settings.py +0 -0
  54. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/cli/developer/arbitration.py +0 -0
  55. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/cli/developer/condition.py +0 -0
  56. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/cli/developer/core_device.py +0 -0
  57. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/cli/developer/debugserver.py +0 -0
  58. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/cli/developer/dvt/core_profile_session.py +0 -0
  59. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/cli/developer/dvt/simulate_location.py +0 -0
  60. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/cli/developer/dvt/sysmon/__init__.py +0 -0
  61. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/cli/developer/dvt/sysmon/process.py +0 -0
  62. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/cli/developer/fetch_symbols.py +0 -0
  63. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/cli/developer/simulate_location.py +0 -0
  64. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/cli/diagnostics/__init__.py +0 -0
  65. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/cli/diagnostics/battery.py +0 -0
  66. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/cli/idam.py +0 -0
  67. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/cli/lockdown.py +0 -0
  68. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/cli/mounter.py +0 -0
  69. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/cli/notification.py +0 -0
  70. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/cli/pcap.py +0 -0
  71. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/cli/power_assertion.py +0 -0
  72. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/cli/processes.py +0 -0
  73. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/cli/profile.py +0 -0
  74. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/cli/provision.py +0 -0
  75. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/cli/restore.py +0 -0
  76. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/cli/springboard.py +0 -0
  77. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/cli/syslog.py +0 -0
  78. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/cli/usbmux.py +0 -0
  79. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/cli/version.py +0 -0
  80. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/cli/webinspector.py +0 -0
  81. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/common.py +0 -0
  82. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/exceptions.py +0 -0
  83. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/irecv.py +0 -0
  84. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/irecv_devices.py +0 -0
  85. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/lockdown.py +0 -0
  86. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/lockdown_service_provider.py +0 -0
  87. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/osu/__init__.py +0 -0
  88. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/osu/os_utils.py +0 -0
  89. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/osu/posix_util.py +0 -0
  90. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/osu/win_util.py +0 -0
  91. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/pair_records.py +0 -0
  92. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/remote/__init__.py +0 -0
  93. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/remote/common.py +0 -0
  94. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/remote/core_device/__init__.py +0 -0
  95. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/remote/core_device/app_service.py +0 -0
  96. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/remote/core_device/core_device_service.py +0 -0
  97. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/remote/core_device/device_info.py +0 -0
  98. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/remote/core_device/diagnostics_service.py +0 -0
  99. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/remote/core_device/file_service.py +0 -0
  100. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/remote/module_imports.py +0 -0
  101. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/remote/remote_service.py +0 -0
  102. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/remote/remote_service_discovery.py +0 -0
  103. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/remote/remotexpc.py +0 -0
  104. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/remote/tunnel_service.py +0 -0
  105. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/remote/utils.py +0 -0
  106. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/remote/xpc_message.py +0 -0
  107. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/resources/__init__.py +0 -0
  108. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/resources/dsc_uuid_map.json +0 -0
  109. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/resources/dsc_uuid_map.py +0 -0
  110. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/resources/firmware_notifications.py +0 -0
  111. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/resources/notifications.txt +0 -0
  112. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/resources/webinspector/element_attribute.js +0 -0
  113. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/resources/webinspector/element_clear.js +0 -0
  114. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/resources/webinspector/enter_fullscreen.js +0 -0
  115. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/resources/webinspector/find_nodes.js +0 -0
  116. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/resources/webinspector/focus.js +0 -0
  117. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/resources/webinspector/get_attribute.js +0 -0
  118. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/resources/webinspector/is_displayed.js +0 -0
  119. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/resources/webinspector/is_editable.js +0 -0
  120. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/resources/webinspector/is_enabled.js +0 -0
  121. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/restore/__init__.py +0 -0
  122. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/restore/asr.py +0 -0
  123. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/restore/base_restore.py +0 -0
  124. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/restore/consts.py +0 -0
  125. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/restore/device.py +0 -0
  126. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/restore/fdr.py +0 -0
  127. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/restore/ftab.py +0 -0
  128. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/restore/img4.py +0 -0
  129. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/restore/mbn.py +0 -0
  130. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/restore/recovery.py +0 -0
  131. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/restore/restore.py +0 -0
  132. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/restore/restore_options.py +0 -0
  133. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/restore/restored_client.py +0 -0
  134. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/restore/tss.py +0 -0
  135. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/service_connection.py +0 -0
  136. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/__init__.py +0 -0
  137. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/accessibilityaudit.py +0 -0
  138. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/afc.py +0 -0
  139. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/amfi.py +0 -0
  140. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/companion.py +0 -0
  141. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/crash_reports.py +0 -0
  142. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/debugserver_applist.py +0 -0
  143. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/device_arbitration.py +0 -0
  144. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/device_link.py +0 -0
  145. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/diagnostics.py +0 -0
  146. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/dtfetchsymbols.py +0 -0
  147. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/dvt/__init__.py +0 -0
  148. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/dvt/dvt_secure_socket_proxy.py +0 -0
  149. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/dvt/dvt_testmanaged_proxy.py +0 -0
  150. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/dvt/instruments/__init__.py +0 -0
  151. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/dvt/instruments/activity_trace_tap.py +0 -0
  152. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/dvt/instruments/application_listing.py +0 -0
  153. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/dvt/instruments/condition_inducer.py +0 -0
  154. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/dvt/instruments/core_profile_session_tap.py +0 -0
  155. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/dvt/instruments/device_info.py +0 -0
  156. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/dvt/instruments/energy_monitor.py +0 -0
  157. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/dvt/instruments/graphics.py +0 -0
  158. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/dvt/instruments/location_simulation.py +0 -0
  159. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/dvt/instruments/location_simulation_base.py +0 -0
  160. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/dvt/instruments/notifications.py +0 -0
  161. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/dvt/instruments/process_control.py +0 -0
  162. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/dvt/instruments/screenshot.py +0 -0
  163. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/dvt/instruments/sysmontap.py +0 -0
  164. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/dvt/testmanaged/xcuitest.py +0 -0
  165. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/file_relay.py +0 -0
  166. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/heartbeat.py +0 -0
  167. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/house_arrest.py +0 -0
  168. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/idam.py +0 -0
  169. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/installation_proxy.py +0 -0
  170. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/lockdown_service.py +0 -0
  171. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/misagent.py +0 -0
  172. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/mobile_activation.py +0 -0
  173. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/mobile_config.py +0 -0
  174. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/mobile_image_mounter.py +0 -0
  175. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/mobilebackup2.py +0 -0
  176. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/notification_proxy.py +0 -0
  177. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/os_trace.py +0 -0
  178. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/pcapd.py +0 -0
  179. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/power_assertion.py +0 -0
  180. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/preboard.py +0 -0
  181. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/remote_fetch_symbols.py +0 -0
  182. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/remote_server.py +0 -0
  183. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/restore_service.py +0 -0
  184. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/screenshot.py +0 -0
  185. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/simulate_location.py +0 -0
  186. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/springboard.py +0 -0
  187. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/syslog.py +0 -0
  188. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/web_protocol/__init__.py +0 -0
  189. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/web_protocol/alert.py +0 -0
  190. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/web_protocol/automation_session.py +0 -0
  191. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/web_protocol/cdp_screencast.py +0 -0
  192. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/web_protocol/cdp_server.py +0 -0
  193. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/web_protocol/cdp_target.py +0 -0
  194. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/web_protocol/driver.py +0 -0
  195. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/web_protocol/element.py +0 -0
  196. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/web_protocol/inspector_session.py +0 -0
  197. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/web_protocol/selenium_api.py +0 -0
  198. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/web_protocol/session_protocol.py +0 -0
  199. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/web_protocol/switch_to.py +0 -0
  200. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/services/webinspector.py +0 -0
  201. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/tcp_forwarder.py +0 -0
  202. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/tunneld/__init__.py +0 -0
  203. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/tunneld/api.py +0 -0
  204. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3/utils.py +0 -0
  205. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3.egg-info/SOURCES.txt +0 -0
  206. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3.egg-info/dependency_links.txt +0 -0
  207. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3.egg-info/entry_points.txt +0 -0
  208. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3.egg-info/requires.txt +0 -0
  209. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pymobiledevice3.egg-info/top_level.txt +0 -0
  210. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pyproject.toml +0 -0
  211. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/pytest.ini +0 -0
  212. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/requirements.txt +0 -0
  213. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/setup.cfg +0 -0
  214. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/tests/__init__.py +0 -0
  215. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/tests/cli/__init__.py +0 -0
  216. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/tests/cli/test_cli.py +0 -0
  217. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/tests/conftest.py +0 -0
  218. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/tests/services/__init__.py +0 -0
  219. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/tests/services/instruments/__init__.py +0 -0
  220. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/tests/services/instruments/test_core_profile_session.py +0 -0
  221. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/tests/services/instruments/test_dvt_secure_socket_proxy.py +0 -0
  222. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/tests/services/instruments/test_fetch_symbols.py +0 -0
  223. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/tests/services/instruments/test_location.py +0 -0
  224. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/tests/services/instruments/test_screenshot.py +0 -0
  225. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/tests/services/test_accessibility.py +0 -0
  226. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/tests/services/test_afc.py +0 -0
  227. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/tests/services/test_apps.py +0 -0
  228. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/tests/services/test_backup2.py +0 -0
  229. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/tests/services/test_bonjour.py +0 -0
  230. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/tests/services/test_crash_reports.py +0 -0
  231. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/tests/services/test_house_arrest.py +0 -0
  232. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/tests/services/test_list_devices.py +0 -0
  233. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/tests/services/test_lockdown.py +0 -0
  234. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/tests/services/test_pcapd.py +0 -0
  235. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/tests/services/test_springboard_services_relay.py +0 -0
  236. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/tests/services/test_start_tunnel.py +0 -0
  237. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/tests/services/test_syslog_relay.py +0 -0
  238. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/tests/services/test_tcp_forwarder.py +0 -0
  239. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/tests/services/test_web_protocol/__init__.py +0 -0
  240. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/tests/services/test_web_protocol/common.py +0 -0
  241. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/tests/services/test_web_protocol/conftest.py +0 -0
  242. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/tests/services/test_web_protocol/test_driver.py +0 -0
  243. {pymobiledevice3-7.2.1 → pymobiledevice3-7.3.1}/tests/services/test_web_protocol/test_element.py +0 -0
  244. {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.2.1
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.2.1'
32
- __version_tuple__ = version_tuple = (7, 2, 1)
31
+ __version__ = version = '7.3.1'
32
+ __version_tuple__ = version_tuple = (7, 3, 1)
33
33
 
34
- __commit_id__ = commit_id = 'g9255614bf'
34
+ __commit_id__ = commit_id = 'g3806869e7'
@@ -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
- local_host, local_port = event.local_address.split(":")
308
- remote_host, remote_port = event.local_address.split(":")
309
- logger.info(f"Connection detected: {local_host}:{local_port} -> {remote_host}:{remote_port}")
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
- TunnelProtocol,
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
- try:
195
- while True:
196
- try:
197
- for mux_device in usbmux.list_devices():
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
- except ConnectionFailedToUsbmuxdError:
231
- # This is exception is expected to occur repeatedly on linux running usbmuxd
232
- # as long as there isn't any physical iDevice connected
233
- logger.debug("failed to connect to usbmux. waiting for it to restart")
234
- finally:
235
- await asyncio.sleep(USBMUX_INTERVAL)
236
- except asyncio.CancelledError:
237
- pass
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._receive_device_state_update()
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
- if response["MessageType"] == "Attached":
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.2.1
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