Skip to content

Commit 81dcf11

Browse files
committed
Add downloader function for trezors
1 parent 7543faa commit 81dcf11

File tree

1 file changed

+53
-2
lines changed

1 file changed

+53
-2
lines changed

hwilib/firmware.py

Lines changed: 53 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,63 @@
1-
#! /usr/bin/env bash
1+
# Firmware download things
22

33
import json
44
import logging
5+
import os
6+
import requests
57
import sys
68

9+
from urllib.parse import urlparse
10+
711
from . import __version__
812
from .cli import HWIArgumentParser
9-
from .errors import handle_errors
13+
from .errors import BadArgumentError, handle_errors, UnknownDeviceError
14+
15+
def _download_file(url):
16+
filename = os.path.basename(urlparse(url).path)
17+
18+
with requests.get(url, stream=True) as r:
19+
r.raise_for_status()
20+
with open(filename, 'wb') as f:
21+
for chunk in r.iter_content(chunk_size=8192):
22+
if chunk:
23+
f.write(chunk)
24+
25+
return os.path.abspath(filename)
26+
27+
def _trezor_download(version=None, bitcoinonly=False, device_version=1):
28+
releases = requests.get('https://wallet.trezor.io/data/firmware/{}/releases.json'.format(device_version)).json()
29+
if not releases:
30+
raise IOError('Could not get list of releases')
31+
32+
if bitcoinonly:
33+
releases = [r for r in releases if "url_bitcoinonly" in r]
34+
releases.sort(key=lambda r: r["version"], reverse=True)
35+
36+
version_info = {}
37+
if version is None:
38+
version_info = releases[0]
39+
version = '.'.join([str(x) for x in version_info['version']])
40+
else:
41+
version_list = [int(x) for x in version.split(".")]
42+
for r in releases:
43+
if r['version'] == version_list:
44+
version_info = r
45+
break
46+
else:
47+
raise BadArgumentError('{} is not available'.format(version))
48+
49+
url = 'https://wallet.trezor.io/{}'.format(version_info['url_bitcoinonly'] if bitcoinonly else version_info['url'])
50+
downloaded_file = _download_file(url)
51+
52+
bitcoinonly_str = 'Bitcoin only ' if bitcoinonly else ''
53+
54+
return {'success': True, 'message': 'Trezor 1 {}firmware version {} downloaded to {}'.format(bitcoinonly_str, version, downloaded_file)}
55+
56+
def trezor_1_download(version=None, bitcoinonly=False):
57+
return _trezor_download(version, bitcoinonly, 1)
58+
59+
def trezor_t_download(version=None, bitcoinonly=False):
60+
return _trezor_download(version, bitcoinonly, 2)
1061

1162
def download_firmware(model, version, bitcoinonly=False):
1263
dev_model = model.lower()

0 commit comments

Comments
 (0)