Skip to content
This repository was archived by the owner on Jul 30, 2025. It is now read-only.

Commit cf5f70a

Browse files
committed
upgrade pymobiledevice3 2.39.2-> 2.46.2, add command relay
1 parent 73d21fd commit cf5f70a

File tree

5 files changed

+55
-4
lines changed

5 files changed

+55
-4
lines changed

README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,10 @@ $ t3 install <URL or LocalIPA>
7171
# screenrecord
7272
$ t3 screenrecord out.mp4
7373

74+
# relay (like iproxy LOCAL_PORT DEVICE_PORT)
75+
$ t3 relay 8100 8100
76+
$ t3 relay 8100 8100 --source 0.0.0.0 --daemonize
77+
7478
# show help
7579
$ t3 --help
7680
```

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ readme = "README.md"
99

1010
[tool.poetry.dependencies]
1111
python = "^3.8"
12-
pymobiledevice3 = "^2.39.2"
12+
pymobiledevice3 = "^2.46.2"
1313
click = "*"
1414
pydantic = "^2.5.3"
1515
fastapi = "*"

tidevice3/cli/cli_common.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,6 @@ def new_func(ctx, *args, **kwargs):
5656
return update_wrapper(new_func, func)
5757

5858

59-
CLI_GROUPS = ["list", "info", "developer", "screenshot", "screenrecord", "install", "fsync", "app", "reboot", "tunneld", "runwda", "exec"]
59+
CLI_GROUPS = ["list", "info", "developer", "screenshot", "screenrecord", "install", "fsync", "app", "reboot", "tunneld", "runwda", "relay", "exec"]
6060
for group in CLI_GROUPS:
6161
__import__(f"tidevice3.cli.{group}")

tidevice3/cli/relay.py

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
#!/usr/bin/env python3
2+
# -*- coding: utf-8 -*-
3+
4+
"""Created on Mon Mar 18 2024 14:03:09 by codeskyblue
5+
6+
Ref: https://github.com/doronz88/pymobiledevice3/blob/master/pymobiledevice3/cli/usbmux.py#L32
7+
"""
8+
9+
from functools import partial
10+
import logging
11+
import tempfile
12+
import threading
13+
import click
14+
from pymobiledevice3.lockdown import LockdownClient
15+
from pymobiledevice3.tcp_forwarder import UsbmuxTcpForwarder
16+
17+
from tidevice3.cli.cli_common import cli, pass_service_provider
18+
19+
logger = logging.getLogger(__name__)
20+
21+
@cli.command('relay')
22+
@click.argument("local_port", type=click.IntRange(1, 0xffff))
23+
@click.argument("device_port", type=click.IntRange(1, 0xffff))
24+
@click.option('-s', '--source', default='127.0.0.1', help="source address for listening socket", show_default=True)
25+
@click.option('-d', '--daemonize', is_flag=True)
26+
@pass_service_provider
27+
def relay(service_provider: LockdownClient, local_port: int, device_port: int, source: str, daemonize: bool):
28+
"""Relay tcp connection from local to device"""
29+
listening_event = threading.Event()
30+
forwarder = UsbmuxTcpForwarder(service_provider.udid, device_port, local_port, listening_event=listening_event)
31+
logger.info("Relay from %s:%d to device:%d", source, local_port, device_port)
32+
if daemonize:
33+
try:
34+
from daemonize import Daemonize
35+
except ImportError:
36+
raise NotImplementedError('daemonizing is only supported on unix platforms')
37+
38+
with tempfile.NamedTemporaryFile('wt') as pid_file:
39+
daemon = Daemonize(
40+
app=f'forwarder {local_port}->{device_port}',
41+
pid=pid_file.name,
42+
action=partial(forwarder.start, source),
43+
verbose=True)
44+
daemon.start()
45+
else:
46+
forwarder.start(source)

tidevice3/cli/tunneld.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
from fastapi import FastAPI
2020
from packaging.version import Version
2121
from pymobiledevice3.exceptions import MuxException
22+
from pymobiledevice3.cli.cli_common import is_admin_user
2223

2324
from tidevice3.cli.cli_common import cli
2425
from tidevice3.cli.list import list_devices
@@ -156,8 +157,8 @@ def run_forever(self):
156157
@click.option("--port", "port", help="listen port", default=5555)
157158
def tunneld(pmd3_path: str, port: int):
158159
"""start server for iOS >= 17 auto start-tunnel, function like pymobiledevice3 remote tunneld"""
159-
if os.getuid() != 0:
160-
logger.error("Please run as root")
160+
if not is_admin_user():
161+
logger.error("Please run as root(Mac) or administrator(Windows)")
161162
sys.exit(1)
162163

163164
manager = DeviceManager()

0 commit comments

Comments
 (0)