pymobiledevice3 5.0.1__tar.gz → 5.0.2__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.

Potentially problematic release.


This version of pymobiledevice3 might be problematic. Click here for more details.

Files changed (261) hide show
  1. pymobiledevice3-5.0.2/.github/workflows/generate-executable.py +67 -0
  2. pymobiledevice3-5.0.2/.pre-commit-config.yaml +9 -0
  3. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/PKG-INFO +1 -1
  4. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/misc/plist_sniffer.py +15 -15
  5. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/misc/remotexpc_sniffer.py +29 -28
  6. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/__main__.py +128 -102
  7. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/_version.py +3 -3
  8. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/bonjour.py +26 -49
  9. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/ca.py +32 -24
  10. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/cli/activation.py +7 -7
  11. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/cli/afc.py +19 -19
  12. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/cli/amfi.py +4 -4
  13. pymobiledevice3-5.0.2/pymobiledevice3/cli/apps.py +98 -0
  14. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/cli/backup.py +58 -32
  15. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/cli/bonjour.py +25 -18
  16. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/cli/cli_common.py +112 -81
  17. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/cli/companion_proxy.py +4 -4
  18. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/cli/completions.py +10 -10
  19. pymobiledevice3-5.0.2/pymobiledevice3/cli/crash.py +88 -0
  20. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/cli/developer.py +602 -520
  21. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/cli/diagnostics.py +38 -33
  22. pymobiledevice3-5.0.2/pymobiledevice3/cli/lockdown.py +195 -0
  23. pymobiledevice3-5.0.2/pymobiledevice3/cli/mounter.py +199 -0
  24. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/cli/notification.py +10 -10
  25. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/cli/pcap.py +19 -14
  26. pymobiledevice3-5.0.2/pymobiledevice3/cli/power_assertion.py +27 -0
  27. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/cli/processes.py +10 -10
  28. pymobiledevice3-5.0.2/pymobiledevice3/cli/profile.py +191 -0
  29. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/cli/provision.py +17 -17
  30. pymobiledevice3-5.0.2/pymobiledevice3/cli/remote.py +339 -0
  31. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/cli/restore.py +43 -40
  32. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/cli/springboard.py +30 -28
  33. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/cli/syslog.py +85 -58
  34. pymobiledevice3-5.0.2/pymobiledevice3/cli/usbmux.py +69 -0
  35. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/cli/version.py +3 -2
  36. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/cli/webinspector.py +157 -79
  37. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/common.py +1 -1
  38. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/exceptions.py +154 -60
  39. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/irecv.py +49 -53
  40. pymobiledevice3-5.0.2/pymobiledevice3/irecv_devices.py +1503 -0
  41. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/lockdown.py +394 -241
  42. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/lockdown_service_provider.py +5 -7
  43. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/osu/os_utils.py +18 -9
  44. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/osu/posix_util.py +28 -15
  45. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/osu/win_util.py +14 -8
  46. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/pair_records.py +19 -19
  47. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/remote/common.py +4 -4
  48. pymobiledevice3-5.0.2/pymobiledevice3/remote/core_device/app_service.py +154 -0
  49. pymobiledevice3-5.0.2/pymobiledevice3/remote/core_device/core_device_service.py +37 -0
  50. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/remote/core_device/device_info.py +5 -5
  51. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/remote/core_device/diagnostics_service.py +10 -8
  52. pymobiledevice3-5.0.2/pymobiledevice3/remote/core_device/file_service.py +102 -0
  53. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/remote/remote_service_discovery.py +53 -35
  54. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/remote/remotexpc.py +62 -41
  55. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/remote/tunnel_service.py +371 -293
  56. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/remote/utils.py +12 -11
  57. pymobiledevice3-5.0.2/pymobiledevice3/remote/xpc_message.py +346 -0
  58. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/resources/dsc_uuid_map.py +19 -19
  59. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/resources/firmware_notifications.py +16 -16
  60. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/restore/asr.py +27 -27
  61. pymobiledevice3-5.0.2/pymobiledevice3/restore/base_restore.py +162 -0
  62. pymobiledevice3-5.0.2/pymobiledevice3/restore/consts.py +91 -0
  63. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/restore/device.py +11 -11
  64. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/restore/fdr.py +46 -46
  65. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/restore/ftab.py +19 -19
  66. pymobiledevice3-5.0.2/pymobiledevice3/restore/img4.py +163 -0
  67. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/restore/mbn.py +35 -54
  68. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/restore/recovery.py +125 -135
  69. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/restore/restore.py +524 -523
  70. pymobiledevice3-5.0.2/pymobiledevice3/restore/restore_options.py +225 -0
  71. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/restore/restored_client.py +25 -22
  72. pymobiledevice3-5.0.2/pymobiledevice3/restore/tss.py +912 -0
  73. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/service_connection.py +50 -46
  74. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/services/accessibilityaudit.py +136 -126
  75. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/services/afc.py +350 -291
  76. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/services/amfi.py +21 -18
  77. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/services/companion.py +23 -19
  78. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/services/crash_reports.py +60 -46
  79. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/services/debugserver_applist.py +3 -3
  80. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/services/device_arbitration.py +8 -8
  81. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/services/device_link.py +55 -47
  82. pymobiledevice3-5.0.2/pymobiledevice3/services/diagnostics.py +1038 -0
  83. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/services/dtfetchsymbols.py +8 -8
  84. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/services/dvt/dvt_secure_socket_proxy.py +4 -4
  85. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/services/dvt/dvt_testmanaged_proxy.py +4 -4
  86. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/services/dvt/instruments/activity_trace_tap.py +85 -74
  87. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/services/dvt/instruments/application_listing.py +2 -3
  88. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/services/dvt/instruments/condition_inducer.py +7 -6
  89. pymobiledevice3-5.0.2/pymobiledevice3/services/dvt/instruments/core_profile_session_tap.py +769 -0
  90. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/services/dvt/instruments/device_info.py +11 -11
  91. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/services/dvt/instruments/energy_monitor.py +1 -1
  92. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/services/dvt/instruments/graphics.py +1 -1
  93. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/services/dvt/instruments/location_simulation.py +1 -1
  94. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/services/dvt/instruments/location_simulation_base.py +10 -10
  95. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/services/dvt/instruments/network_monitor.py +17 -17
  96. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/services/dvt/instruments/notifications.py +1 -1
  97. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/services/dvt/instruments/process_control.py +25 -10
  98. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/services/dvt/instruments/screenshot.py +2 -2
  99. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/services/dvt/instruments/sysmontap.py +15 -15
  100. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/services/dvt/testmanaged/xcuitest.py +40 -50
  101. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/services/file_relay.py +10 -10
  102. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/services/heartbeat.py +8 -7
  103. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/services/house_arrest.py +12 -15
  104. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/services/installation_proxy.py +119 -100
  105. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/services/lockdown_service.py +12 -5
  106. pymobiledevice3-5.0.2/pymobiledevice3/services/misagent.py +58 -0
  107. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/services/mobile_activation.py +84 -72
  108. pymobiledevice3-5.0.2/pymobiledevice3/services/mobile_config.py +434 -0
  109. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/services/mobile_image_mounter.py +137 -116
  110. pymobiledevice3-5.0.2/pymobiledevice3/services/mobilebackup2.py +422 -0
  111. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/services/notification_proxy.py +11 -11
  112. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/services/os_trace.py +69 -51
  113. pymobiledevice3-5.0.2/pymobiledevice3/services/pcapd.py +412 -0
  114. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/services/power_assertion.py +10 -9
  115. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/services/preboard.py +4 -4
  116. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/services/remote_fetch_symbols.py +16 -14
  117. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/services/remote_server.py +176 -146
  118. pymobiledevice3-5.0.2/pymobiledevice3/services/restore_service.py +45 -0
  119. pymobiledevice3-5.0.2/pymobiledevice3/services/screenshot.py +32 -0
  120. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/services/simulate_location.py +7 -7
  121. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/services/springboard.py +15 -15
  122. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/services/syslog.py +5 -5
  123. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/services/web_protocol/alert.py +3 -3
  124. pymobiledevice3-5.0.2/pymobiledevice3/services/web_protocol/automation_session.py +403 -0
  125. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/services/web_protocol/cdp_screencast.py +44 -36
  126. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/services/web_protocol/cdp_server.py +19 -19
  127. pymobiledevice3-5.0.2/pymobiledevice3/services/web_protocol/cdp_target.py +718 -0
  128. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/services/web_protocol/driver.py +47 -45
  129. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/services/web_protocol/element.py +74 -63
  130. pymobiledevice3-5.0.2/pymobiledevice3/services/web_protocol/inspector_session.py +268 -0
  131. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/services/web_protocol/selenium_api.py +2 -2
  132. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/services/web_protocol/session_protocol.py +15 -10
  133. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/services/web_protocol/switch_to.py +11 -12
  134. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/services/webinspector.py +127 -116
  135. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/tcp_forwarder.py +35 -22
  136. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/tunneld/api.py +20 -15
  137. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/tunneld/server.py +212 -133
  138. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/usbmux.py +183 -138
  139. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/utils.py +14 -11
  140. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3.egg-info/PKG-INFO +1 -1
  141. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pyproject.toml +53 -0
  142. pymobiledevice3-5.0.2/tests/cli/test_cli.py +77 -0
  143. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/tests/conftest.py +28 -24
  144. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/tests/services/instruments/test_core_profile_session.py +6 -4
  145. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/tests/services/instruments/test_dvt_secure_socket_proxy.py +27 -25
  146. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/tests/services/instruments/test_fetch_symbols.py +9 -7
  147. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/tests/services/instruments/test_location.py +3 -1
  148. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/tests/services/instruments/test_screenshot.py +2 -2
  149. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/tests/services/test_accessibility.py +3 -3
  150. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/tests/services/test_afc.py +135 -120
  151. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/tests/services/test_apps.py +2 -3
  152. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/tests/services/test_backup2.py +10 -5
  153. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/tests/services/test_bonjour.py +4 -4
  154. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/tests/services/test_crash_reports.py +15 -14
  155. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/tests/services/test_springboard_services_relay.py +1 -1
  156. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/tests/services/test_start_tunnel.py +6 -3
  157. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/tests/services/test_syslog_relay.py +3 -3
  158. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/tests/services/test_tcp_forwarder.py +2 -2
  159. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/tests/services/test_web_protocol/common.py +2 -2
  160. pymobiledevice3-5.0.2/tests/services/test_web_protocol/test_driver.py +38 -0
  161. pymobiledevice3-5.0.2/tests/services/test_web_protocol/test_element.py +8 -0
  162. pymobiledevice3-5.0.1/.github/workflows/generate-executable.py +0 -63
  163. pymobiledevice3-5.0.1/.pre-commit-config.yaml +0 -15
  164. pymobiledevice3-5.0.1/pymobiledevice3/cli/apps.py +0 -86
  165. pymobiledevice3-5.0.1/pymobiledevice3/cli/crash.py +0 -82
  166. pymobiledevice3-5.0.1/pymobiledevice3/cli/lockdown.py +0 -190
  167. pymobiledevice3-5.0.1/pymobiledevice3/cli/mounter.py +0 -182
  168. pymobiledevice3-5.0.1/pymobiledevice3/cli/power_assertion.py +0 -25
  169. pymobiledevice3-5.0.1/pymobiledevice3/cli/profile.py +0 -180
  170. pymobiledevice3-5.0.1/pymobiledevice3/cli/remote.py +0 -263
  171. pymobiledevice3-5.0.1/pymobiledevice3/cli/usbmux.py +0 -68
  172. pymobiledevice3-5.0.1/pymobiledevice3/irecv_devices.py +0 -506
  173. pymobiledevice3-5.0.1/pymobiledevice3/remote/core_device/app_service.py +0 -127
  174. pymobiledevice3-5.0.1/pymobiledevice3/remote/core_device/core_device_service.py +0 -34
  175. pymobiledevice3-5.0.1/pymobiledevice3/remote/core_device/file_service.py +0 -88
  176. pymobiledevice3-5.0.1/pymobiledevice3/remote/xpc_message.py +0 -326
  177. pymobiledevice3-5.0.1/pymobiledevice3/restore/base_restore.py +0 -119
  178. pymobiledevice3-5.0.1/pymobiledevice3/restore/consts.py +0 -70
  179. pymobiledevice3-5.0.1/pymobiledevice3/restore/img4.py +0 -166
  180. pymobiledevice3-5.0.1/pymobiledevice3/restore/restore_options.py +0 -218
  181. pymobiledevice3-5.0.1/pymobiledevice3/restore/tss.py +0 -804
  182. pymobiledevice3-5.0.1/pymobiledevice3/services/diagnostics.py +0 -1035
  183. pymobiledevice3-5.0.1/pymobiledevice3/services/dvt/instruments/core_profile_session_tap.py +0 -748
  184. pymobiledevice3-5.0.1/pymobiledevice3/services/misagent.py +0 -55
  185. pymobiledevice3-5.0.1/pymobiledevice3/services/mobile_config.py +0 -405
  186. pymobiledevice3-5.0.1/pymobiledevice3/services/mobilebackup2.py +0 -384
  187. pymobiledevice3-5.0.1/pymobiledevice3/services/pcapd.py +0 -412
  188. pymobiledevice3-5.0.1/pymobiledevice3/services/restore_service.py +0 -45
  189. pymobiledevice3-5.0.1/pymobiledevice3/services/screenshot.py +0 -29
  190. pymobiledevice3-5.0.1/pymobiledevice3/services/web_protocol/automation_session.py +0 -399
  191. pymobiledevice3-5.0.1/pymobiledevice3/services/web_protocol/cdp_target.py +0 -680
  192. pymobiledevice3-5.0.1/pymobiledevice3/services/web_protocol/inspector_session.py +0 -264
  193. pymobiledevice3-5.0.1/tests/cli/test_cli.py +0 -45
  194. pymobiledevice3-5.0.1/tests/services/test_web_protocol/test_driver.py +0 -38
  195. pymobiledevice3-5.0.1/tests/services/test_web_protocol/test_element.py +0 -8
  196. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/.gitattributes +0 -0
  197. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/.github/FUNDING.yml +0 -0
  198. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  199. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  200. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  201. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/.github/pull_request_template.md +0 -0
  202. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/.github/workflows/codeql.yml +0 -0
  203. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/.github/workflows/markdown-lint.yml +0 -0
  204. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/.github/workflows/python-app.yml +0 -0
  205. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/.github/workflows/python-publish.yml +0 -0
  206. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/.gitignore +0 -0
  207. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/CODE_OF_CONDUCT.md +0 -0
  208. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/CONTRIBUTING.md +0 -0
  209. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/LICENSE +0 -0
  210. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/README.md +0 -0
  211. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/example.gif +0 -0
  212. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/markdownlint-config.json +0 -0
  213. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/misc/DTServices-14.2.txt +0 -0
  214. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/misc/DTServices-14.5.txt +0 -0
  215. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/misc/RemoteXPC.md +0 -0
  216. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/misc/pyinstaller.md +0 -0
  217. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/misc/understanding_idevice_protocol_layers.md +0 -0
  218. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/misc/usbmux_sniff.sh +0 -0
  219. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/__init__.py +0 -0
  220. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/cli/__init__.py +0 -0
  221. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/osu/__init__.py +0 -0
  222. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/remote/__init__.py +0 -0
  223. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/remote/core_device/__init__.py +0 -0
  224. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/remote/module_imports.py +0 -0
  225. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/remote/remote_service.py +0 -0
  226. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/resources/__init__.py +0 -0
  227. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/resources/dsc_uuid_map.json +0 -0
  228. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/resources/notifications.txt +0 -0
  229. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/resources/webinspector/element_attribute.js +0 -0
  230. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/resources/webinspector/element_clear.js +0 -0
  231. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/resources/webinspector/enter_fullscreen.js +0 -0
  232. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/resources/webinspector/find_nodes.js +0 -0
  233. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/resources/webinspector/focus.js +0 -0
  234. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/resources/webinspector/get_attribute.js +0 -0
  235. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/resources/webinspector/is_displayed.js +0 -0
  236. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/resources/webinspector/is_editable.js +0 -0
  237. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/resources/webinspector/is_enabled.js +0 -0
  238. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/restore/__init__.py +0 -0
  239. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/services/__init__.py +0 -0
  240. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/services/dvt/__init__.py +0 -0
  241. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/services/dvt/instruments/__init__.py +0 -0
  242. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/services/web_protocol/__init__.py +0 -0
  243. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3/tunneld/__init__.py +0 -0
  244. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3.egg-info/SOURCES.txt +0 -0
  245. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3.egg-info/dependency_links.txt +0 -0
  246. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3.egg-info/entry_points.txt +0 -0
  247. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3.egg-info/requires.txt +0 -0
  248. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pymobiledevice3.egg-info/top_level.txt +0 -0
  249. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/pytest.ini +0 -0
  250. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/requirements.txt +0 -0
  251. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/setup.cfg +0 -0
  252. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/tests/__init__.py +0 -0
  253. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/tests/cli/__init__.py +0 -0
  254. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/tests/services/__init__.py +0 -0
  255. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/tests/services/instruments/__init__.py +0 -0
  256. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/tests/services/test_list_devices.py +0 -0
  257. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/tests/services/test_lockdown.py +0 -0
  258. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/tests/services/test_pcapd.py +0 -0
  259. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/tests/services/test_web_protocol/__init__.py +0 -0
  260. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/tests/services/test_web_protocol/conftest.py +0 -0
  261. {pymobiledevice3-5.0.1 → pymobiledevice3-5.0.2}/tests/services/test_webinspector.py +0 -0
@@ -0,0 +1,67 @@
1
+ import logging
2
+ import os
3
+ import site
4
+ import sys
5
+ from pathlib import Path
6
+
7
+ import coloredlogs
8
+ import PyInstaller.__main__
9
+
10
+ import pymobiledevice3.__main__
11
+ import pymobiledevice3.cli
12
+ import pymobiledevice3.resources
13
+
14
+ coloredlogs.install(level=logging.DEBUG)
15
+
16
+ ROOT = Path(__file__).parent.parent.parent
17
+ DEFAULT_OUTPUT = ROOT / Path("dist/__main__").with_suffix(".exe" if sys.platform == "win32" else "")
18
+ OUTPUT = (ROOT / "dist/pymobiledevice3").with_suffix(".exe" if sys.platform == "win32" else "")
19
+
20
+
21
+ def main() -> None:
22
+ site_packages_path = site.getsitepackages()[0]
23
+ resources_dir = Path(pymobiledevice3.resources.__file__).parent
24
+ pymobiledevice3_cli_path = Path(pymobiledevice3.cli.__file__).parent
25
+
26
+ hidden_imports = []
27
+
28
+ for module in pymobiledevice3_cli_path.iterdir():
29
+ if module.name.endswith(".py") and module.name != "__init__.py": # Avoid including the __init__.py
30
+ # Create the module name to be added to hidden imports
31
+ module_name = "pymobiledevice3.cli." + os.path.splitext(module.name)[0]
32
+ hidden_imports.append("--hidden-import=" + module_name)
33
+
34
+ pyinstaller_args = [
35
+ pymobiledevice3.__main__.__file__,
36
+ "--hidden-import=ipsw_parser",
37
+ "--hidden-import=zeroconf",
38
+ "--hidden-import=pyimg4",
39
+ "--hidden-import=zeroconf._utils.ipaddress",
40
+ "--hidden-import=zeroconf._handlers.answers",
41
+ "--hidden-import=readchar",
42
+ "--copy-metadata=pyimg4",
43
+ "--copy-metadata=readchar",
44
+ "--copy-metadata=apple_compress",
45
+ "--onefile",
46
+ ]
47
+ if sys.platform == "win32":
48
+ pyinstaller_args.extend([
49
+ "--add-binary",
50
+ f"{site_packages_path}/Lib/site-packages/pytun_pmd3/wintun/*;pytun_pmd3/wintun/bin",
51
+ "--add-binary",
52
+ f"{resources_dir}/webinspector;pymobiledevice3/resources/webinspector",
53
+ ])
54
+ else:
55
+ pyinstaller_args.extend([
56
+ "--add-binary",
57
+ f"{site_packages_path}/pytun_pmd3:pytun_pmd3",
58
+ "--add-binary",
59
+ f"{resources_dir}/webinspector:pymobiledevice3/resources/webinspector",
60
+ ])
61
+ pyinstaller_args.extend(hidden_imports)
62
+ PyInstaller.__main__.run(pyinstaller_args)
63
+ DEFAULT_OUTPUT.rename(OUTPUT)
64
+
65
+
66
+ if __name__ == "__main__":
67
+ main()
@@ -0,0 +1,9 @@
1
+ repos:
2
+ - repo: https://github.com/astral-sh/ruff-pre-commit
3
+ # Ruff version.
4
+ rev: v0.14.2
5
+ hooks:
6
+ # Run the linter.
7
+ - id: ruff-check
8
+ # Run the formatter.
9
+ - id: ruff-format
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pymobiledevice3
3
- Version: 5.0.1
3
+ Version: 5.0.2
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>
@@ -7,8 +7,8 @@ import click
7
7
  from scapy.packet import Packet, Raw
8
8
  from scapy.sendrecv import sniff
9
9
 
10
- BPLIST_MAGIC = b'bplist'
11
- PLIST_MAGIC = b'<plist'
10
+ BPLIST_MAGIC = b"bplist"
11
+ PLIST_MAGIC = b"<plist"
12
12
 
13
13
 
14
14
  class PcapSniffer:
@@ -20,13 +20,13 @@ class PcapSniffer:
20
20
 
21
21
  if BPLIST_MAGIC in packet:
22
22
  try:
23
- plist = plistlib.loads(packet[packet.find(BPLIST_MAGIC):])
23
+ plist = plistlib.loads(packet[packet.find(BPLIST_MAGIC) :])
24
24
  self.report(plist)
25
25
  except plistlib.InvalidFileException:
26
26
  pass
27
27
  if PLIST_MAGIC in packet:
28
28
  try:
29
- plist = plistlib.loads(packet[packet.find(PLIST_MAGIC):])
29
+ plist = plistlib.loads(packet[packet.find(PLIST_MAGIC) :])
30
30
  self.report(plist)
31
31
  except xml.parsers.expat.ExpatError:
32
32
  pass
@@ -35,37 +35,37 @@ class PcapSniffer:
35
35
  try:
36
36
  print(plist)
37
37
  if self.file is not None:
38
- self.file.write('---\n')
38
+ self.file.write("---\n")
39
39
  self.file.write(pprint.pformat(plist))
40
- self.file.write('\n---\n')
40
+ self.file.write("\n---\n")
41
41
  except ValueError:
42
- print('failed to print plist')
42
+ print("failed to print plist")
43
43
 
44
44
 
45
45
  @click.group()
46
46
  def cli():
47
- """ Parse RemoteXPC traffic """
47
+ """Parse RemoteXPC traffic"""
48
48
  pass
49
49
 
50
50
 
51
51
  @cli.command()
52
- @click.argument('pcap', type=click.Path(exists=True, file_okay=True, dir_okay=False))
53
- @click.option('-o', '--out', type=click.File('wt'))
52
+ @click.argument("pcap", type=click.Path(exists=True, file_okay=True, dir_okay=False))
53
+ @click.option("-o", "--out", type=click.File("wt"))
54
54
  def offline(pcap: str, out: IO):
55
- """ Parse plists traffic from a .pcap file """
55
+ """Parse plists traffic from a .pcap file"""
56
56
  sniffer = PcapSniffer(out)
57
57
  for p in sniff(offline=pcap):
58
58
  sniffer.process_packet(p)
59
59
 
60
60
 
61
61
  @cli.command()
62
- @click.argument('iface')
63
- @click.option('-o', '--out', type=click.File('wt'))
62
+ @click.argument("iface")
63
+ @click.option("-o", "--out", type=click.File("wt"))
64
64
  def live(iface: str, out: IO):
65
- """ Parse plists live from a given network interface """
65
+ """Parse plists live from a given network interface"""
66
66
  sniffer = PcapSniffer(out)
67
67
  sniff(iface=iface, prn=sniffer.process_packet)
68
68
 
69
69
 
70
- if __name__ == '__main__':
70
+ if __name__ == "__main__":
71
71
  cli()
@@ -22,7 +22,7 @@ FRAME_HEADER_SIZE = 9
22
22
 
23
23
 
24
24
  def create_stream_key(src: str, sport: int, dst: str, dport: int) -> str:
25
- return f'{src}/{sport}//{dst}/{dport}'
25
+ return f"{src}/{sport}//{dst}/{dport}"
26
26
 
27
27
 
28
28
  class TCPStream:
@@ -37,7 +37,7 @@ class TCPStream:
37
37
  self.segments = {} # data segments to add later
38
38
 
39
39
  def __repr__(self) -> str:
40
- return f'Stream<{self.key}>'
40
+ return f"Stream<{self.key}>"
41
41
 
42
42
  def __len__(self) -> int:
43
43
  return len(self.data)
@@ -58,12 +58,12 @@ class TCPStream:
58
58
  return False
59
59
  else:
60
60
  # if this data is in order (has a place to be inserted)
61
- self.data[seq_offset:seq_offset + data_len] = data
61
+ self.data[seq_offset : seq_offset + data_len] = data
62
62
  # check if there are any waiting data segments to add
63
63
  for seq_offset in sorted(self.segments.keys()):
64
64
  if seq_offset <= len(self.data): # if we can add this segment to the stream
65
65
  segment_payload = self.segments[seq_offset]
66
- self.data[seq_offset:seq_offset + len(segment_payload)] = segment_payload
66
+ self.data[seq_offset : seq_offset + len(segment_payload)] = segment_payload
67
67
  self.segments.pop(seq_offset)
68
68
  else:
69
69
  break # short circuit because list is sorted
@@ -72,12 +72,12 @@ class TCPStream:
72
72
 
73
73
  class H2Stream(TCPStream):
74
74
  def pop_frames(self) -> list[Frame]:
75
- """ Pop all available H2Frames """
75
+ """Pop all available H2Frames"""
76
76
 
77
77
  # If self.data starts with the http/2 magic bytes, pop them off
78
78
  if self.data.startswith(HTTP2_MAGIC):
79
- logger.debug('HTTP/2 magic bytes')
80
- self.data = self.data[len(HTTP2_MAGIC):]
79
+ logger.debug("HTTP/2 magic bytes")
80
+ self.data = self.data[len(HTTP2_MAGIC) :]
81
81
  self.seq += len(HTTP2_MAGIC)
82
82
 
83
83
  frames = []
@@ -120,13 +120,14 @@ class RemoteXPCSniffer:
120
120
  tcp_pkt = pkt[TCP]
121
121
  stream_key = create_stream_key(net_pkt.src, tcp_pkt.sport, net_pkt.dst, tcp_pkt.dport)
122
122
  stream = self._h2_streams.setdefault(
123
- stream_key, H2Stream(net_pkt.src, tcp_pkt.sport, net_pkt.dst, tcp_pkt.dport))
123
+ stream_key, H2Stream(net_pkt.src, tcp_pkt.sport, net_pkt.dst, tcp_pkt.dport)
124
+ )
124
125
  stream_finished_assembling = stream.add(tcp_pkt)
125
126
  if stream_finished_assembling: # if we just added something in order
126
127
  self._process_stream(stream)
127
128
 
128
129
  def _handle_data_frame(self, stream: H2Stream, frame: DataFrame) -> None:
129
- previous_frame_data = self._previous_frame_data.get(stream.key, b'')
130
+ previous_frame_data = self._previous_frame_data.get(stream.key, b"")
130
131
  try:
131
132
  payload = XpcWrapper.parse(previous_frame_data + frame.data).message.payload
132
133
  if payload is None:
@@ -134,10 +135,11 @@ class RemoteXPCSniffer:
134
135
  xpc_message = decode_xpc_object(payload.obj)
135
136
  except ConstError: # if we don't know what this payload is
136
137
  logger.debug(
137
- f'New Data frame {stream.src}->{stream.dst} on HTTP/2 stream {frame.stream_id} TCP port {stream.dport}')
138
+ f"New Data frame {stream.src}->{stream.dst} on HTTP/2 stream {frame.stream_id} TCP port {stream.dport}"
139
+ )
138
140
  hexdump(frame.data[:64])
139
141
  if len(frame.data) > 64:
140
- logger.debug(f'... {len(frame.data)} bytes')
142
+ logger.debug(f"... {len(frame.data)} bytes")
141
143
  return
142
144
  except StreamError:
143
145
  self._previous_frame_data[stream.key] = previous_frame_data + frame.data
@@ -149,27 +151,26 @@ class RemoteXPCSniffer:
149
151
  if xpc_message is None:
150
152
  return
151
153
 
152
- logger.info(f'As Python Object (#{frame.stream_id}): {pformat(xpc_message)}')
154
+ logger.info(f"As Python Object (#{frame.stream_id}): {pformat(xpc_message)}")
153
155
 
154
156
  # print `pairingData` if exists, since it contains an inner struct
155
- if 'value' not in xpc_message:
157
+ if "value" not in xpc_message:
156
158
  return
157
- message = xpc_message['value']['message']
158
- if 'plain' not in message:
159
+ message = xpc_message["value"]["message"]
160
+ if "plain" not in message:
159
161
  return
160
- plain = message['plain']['_0']
161
- if 'event' not in plain:
162
+ plain = message["plain"]["_0"]
163
+ if "event" not in plain:
162
164
  return
163
- pairing_data = plain['event']['_0']['pairingData']['_0']['data']
165
+ pairing_data = plain["event"]["_0"]["pairingData"]["_0"]["data"]
164
166
  logger.info(PairingDataComponentTLVBuf.parse(pairing_data))
165
167
 
166
168
  def _handle_single_frame(self, stream: H2Stream, frame: Frame) -> None:
167
- logger.debug(f'New HTTP/2 frame: {stream.key} ({frame})')
169
+ logger.debug(f"New HTTP/2 frame: {stream.key} ({frame})")
168
170
  if isinstance(frame, HeadersFrame):
169
- logger.debug(
170
- f'{stream.src} opening stream {frame.stream_id} for communication on port {stream.dport}')
171
+ logger.debug(f"{stream.src} opening stream {frame.stream_id} for communication on port {stream.dport}")
171
172
  elif isinstance(frame, GoAwayFrame):
172
- logger.debug(f'{stream.src} closing stream {frame.stream_id} on port {stream.sport}')
173
+ logger.debug(f"{stream.src} closing stream {frame.stream_id} on port {stream.sport}")
173
174
  elif isinstance(frame, DataFrame):
174
175
  self._handle_data_frame(stream, frame)
175
176
 
@@ -180,27 +181,27 @@ class RemoteXPCSniffer:
180
181
 
181
182
  @click.group()
182
183
  def cli():
183
- """ Parse RemoteXPC traffic """
184
+ """Parse RemoteXPC traffic"""
184
185
  pass
185
186
 
186
187
 
187
188
  @cli.command()
188
- @click.argument('file', type=click.Path(exists=True, file_okay=True, dir_okay=False))
189
+ @click.argument("file", type=click.Path(exists=True, file_okay=True, dir_okay=False))
189
190
  def offline(file: str):
190
- """ Parse RemoteXPC traffic from a .pcap file """
191
+ """Parse RemoteXPC traffic from a .pcap file"""
191
192
  sniffer = RemoteXPCSniffer()
192
193
  for p in sniff(offline=file):
193
194
  sniffer.process_packet(p)
194
195
 
195
196
 
196
197
  @cli.command()
197
- @click.argument('iface')
198
+ @click.argument("iface")
198
199
  def live(iface: str):
199
- """ Parse RemoteXPC live from a given network interface """
200
+ """Parse RemoteXPC live from a given network interface"""
200
201
  sniffer = RemoteXPCSniffer()
201
202
  sniff(iface=iface, prn=sniffer.process_packet)
202
203
 
203
204
 
204
- if __name__ == '__main__':
205
+ if __name__ == "__main__":
205
206
  coloredlogs.install(level=logging.DEBUG)
206
207
  cli()