mirror of
https://github.com/trezor/trezor-firmware.git
synced 2025-08-04 21:05:29 +00:00
python: add wait-for-emulator command
This commit is contained in:
parent
29e883ab59
commit
c151fdeefd
@ -6,6 +6,13 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
|
|||||||
|
|
||||||
_At the moment, the project does **not** adhere to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). That is expected to change with version 1.0._
|
_At the moment, the project does **not** adhere to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). That is expected to change with version 1.0._
|
||||||
|
|
||||||
|
## [0.11.7] - Unreleased
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- built-in functionality of UdpTransport to wait until an emulator comes up, and the
|
||||||
|
related command `trezorctl wait-for-emulator`
|
||||||
|
|
||||||
## [0.11.6] - 2019-12-30
|
## [0.11.6] - 2019-12-30
|
||||||
[0.11.6]: https://github.com/trezor/trezor-firmware/compare/python/v0.11.5...python/v0.11.6
|
[0.11.6]: https://github.com/trezor/trezor-firmware/compare/python/v0.11.5...python/v0.11.6
|
||||||
|
|
||||||
|
@ -19,12 +19,14 @@
|
|||||||
import json
|
import json
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
|
import time
|
||||||
|
|
||||||
import click
|
import click
|
||||||
|
|
||||||
from .. import coins, log, messages, protobuf, ui
|
from .. import coins, log, messages, protobuf, ui
|
||||||
from ..client import TrezorClient
|
from ..client import TrezorClient
|
||||||
from ..transport import enumerate_devices, get_transport
|
from ..transport import enumerate_devices, get_transport
|
||||||
|
from ..transport.udp import UdpTransport
|
||||||
from . import (
|
from . import (
|
||||||
binance,
|
binance,
|
||||||
btc,
|
btc,
|
||||||
@ -250,6 +252,28 @@ def usb_reset():
|
|||||||
WebUsbTransport.enumerate(usb_reset=True)
|
WebUsbTransport.enumerate(usb_reset=True)
|
||||||
|
|
||||||
|
|
||||||
|
@cli.command()
|
||||||
|
@click.option("-t", "--timeout", type=float, default=10, help="Timeout in seconds")
|
||||||
|
@click.pass_context
|
||||||
|
def wait_for_emulator(ctx, timeout):
|
||||||
|
"""Wait until Trezor Emulator comes up.
|
||||||
|
|
||||||
|
Tries to connect to emulator and returns when it succeeds.
|
||||||
|
"""
|
||||||
|
path = ctx.parent.params.get("path")
|
||||||
|
if path:
|
||||||
|
if not path.startswith("udp:"):
|
||||||
|
raise click.ClickException("You must use UDP path, not {}".format(path))
|
||||||
|
path = path.replace("udp:", "")
|
||||||
|
|
||||||
|
start = time.monotonic()
|
||||||
|
UdpTransport(path).wait_until_ready(timeout)
|
||||||
|
end = time.monotonic()
|
||||||
|
|
||||||
|
if ctx.parent.params.get("verbose"):
|
||||||
|
click.echo("Waited for {:.3f} seconds".format(end - start))
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Basic coin functions
|
# Basic coin functions
|
||||||
#
|
#
|
||||||
|
@ -15,6 +15,7 @@
|
|||||||
# If not, see <https://www.gnu.org/licenses/lgpl-3.0.html>.
|
# If not, see <https://www.gnu.org/licenses/lgpl-3.0.html>.
|
||||||
|
|
||||||
import socket
|
import socket
|
||||||
|
import time
|
||||||
from typing import Iterable, Optional, cast
|
from typing import Iterable, Optional, cast
|
||||||
|
|
||||||
from . import TransportException
|
from . import TransportException
|
||||||
@ -60,7 +61,7 @@ class UdpTransport(ProtocolBasedTransport):
|
|||||||
return d
|
return d
|
||||||
else:
|
else:
|
||||||
raise TransportException(
|
raise TransportException(
|
||||||
"No Trezor device found at address {}".format(path)
|
"No Trezor device found at address {}".format(d.get_path())
|
||||||
)
|
)
|
||||||
finally:
|
finally:
|
||||||
d.close()
|
d.close()
|
||||||
@ -84,6 +85,22 @@ class UdpTransport(ProtocolBasedTransport):
|
|||||||
path = path.replace("{}:".format(cls.PATH_PREFIX), "")
|
path = path.replace("{}:".format(cls.PATH_PREFIX), "")
|
||||||
return cls._try_path(path)
|
return cls._try_path(path)
|
||||||
|
|
||||||
|
def wait_until_ready(self, timeout: float = 10) -> None:
|
||||||
|
try:
|
||||||
|
self.open()
|
||||||
|
self.socket.settimeout(0)
|
||||||
|
start = time.monotonic()
|
||||||
|
while True:
|
||||||
|
if self._ping():
|
||||||
|
break
|
||||||
|
elapsed = time.monotonic() - start
|
||||||
|
if elapsed >= timeout:
|
||||||
|
raise TransportException("Timed out waiting for connection.")
|
||||||
|
|
||||||
|
time.sleep(0.05)
|
||||||
|
finally:
|
||||||
|
self.close()
|
||||||
|
|
||||||
def open(self) -> None:
|
def open(self) -> None:
|
||||||
self.socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
self.socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
||||||
self.socket.connect(self.device)
|
self.socket.connect(self.device)
|
||||||
|
Loading…
Reference in New Issue
Block a user