1
|
|
|
#!/usr/bin/env python3 |
2
|
|
|
# -*- coding: utf-8 -*- |
3
|
|
|
|
4
|
|
|
# pylint: disable=C0111,C0326,C0103 |
5
|
|
|
|
6
|
|
|
"""Find all OTA updates for a given PRD.""" |
7
|
|
|
|
8
|
|
|
import sys |
9
|
|
|
|
10
|
|
|
from tcllib import ansi, argparser |
11
|
|
|
from tcllib.devices import MobileDevice |
12
|
|
|
from tcllib.dumpmgr import write_info_if_dumps_found |
13
|
|
|
from tcllib.requests import CheckRequest, RequestRunner, ServerVoteSelector |
14
|
|
|
|
15
|
|
|
|
16
|
|
|
dpdesc = """ |
17
|
|
|
Finds all valid OTA updates for a given PRD. Scan range can be set by |
18
|
|
|
startver and endver switches. |
19
|
|
|
""" |
20
|
|
|
dp = argparser.DefaultParser(__file__, dpdesc) |
21
|
|
|
dp.add_argument("prd", help="CU Reference #, e.g. PRD-63117-011") |
22
|
|
|
dp.add_argument("startver", help="Beginning of scan range", nargs="?", default="AAA000") |
23
|
|
|
dp.add_argument("endver", help="End of scan range", nargs="?", default="AAZ999") |
24
|
|
|
args = dp.parse_args(sys.argv[1:]) |
25
|
|
|
|
26
|
|
|
dev = MobileDevice() |
27
|
|
|
dev.curef = args.prd |
28
|
|
|
start_ver = args.startver |
29
|
|
|
end_ver = args.endver |
30
|
|
|
|
31
|
|
|
print("Valid firmwares for model {} (between {} and {}):".format(dev.curef, start_ver, end_ver)) |
32
|
|
|
|
33
|
|
|
cur_ver = start_ver |
34
|
|
|
allvers = [] |
35
|
|
|
while True: |
36
|
|
|
allvers.append(cur_ver) |
37
|
|
|
if cur_ver == end_ver: |
38
|
|
|
break |
39
|
|
|
letters = list(cur_ver[:3]) |
40
|
|
|
num = int(cur_ver[3:6]) |
41
|
|
|
num += 1 |
42
|
|
|
if num > 999: |
43
|
|
|
num = 0 |
44
|
|
|
for i in range(2, -1, -1): |
45
|
|
|
if letters[i] == "Z": |
46
|
|
|
letters[i] = "A" |
47
|
|
|
continue |
48
|
|
|
letters[i] = chr(ord(letters[i])+1) |
49
|
|
|
break |
50
|
|
|
cur_ver = "{:3}{:03d}".format("".join(letters), num) |
51
|
|
|
|
52
|
|
|
runner = RequestRunner(ServerVoteSelector(), https=False) |
53
|
|
|
runner.max_tries = 20 |
54
|
|
|
|
55
|
|
|
done_count = 0 |
56
|
|
|
total_count = len(allvers) |
57
|
|
|
for fv in allvers: |
58
|
|
|
done_count += 1 |
59
|
|
|
print("Checking {} ({}/{})".format(fv, done_count, total_count)) |
60
|
|
|
print(ansi.UP_DEL, end="") |
61
|
|
|
dev.fwver = fv |
62
|
|
|
chk = CheckRequest(dev) |
63
|
|
|
runner.run(chk) |
64
|
|
|
if chk.success: |
65
|
|
|
chkres = chk.get_result() |
66
|
|
|
txt_tv = chkres.tvver |
67
|
|
|
print("{}: {} ⇨ {} {}".format(dev.curef, fv, txt_tv, chkres.filehash)) |
68
|
|
|
|
69
|
|
|
print("Scan complete.") |
70
|
|
|
write_info_if_dumps_found() |
71
|
|
|
|