Skip to content
This repository was archived by the owner on Jan 18, 2022. It is now read-only.

Commit 2dd8017

Browse files
committed
add keyone autoloader urls, bbmobile support scraper
1 parent 51cdedd commit 2dd8017

File tree

3 files changed

+138
-17
lines changed

3 files changed

+138
-17
lines changed

bbarchivist/networkutils.py

Lines changed: 99 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -721,18 +721,39 @@ def root_generator(folder, build, variant="common"):
721721
dtek50x = "bbSupport/DTEK50" if build[:3] == "AAF" else "bbfoundation/hashfiles_priv/dtek50"
722722
#DTEK60 specific
723723
dtek60x = dtek50x # still uses dtek50 folder, for some reason
724-
#KEYone specific
725-
keyonex = "bbfoundation/hashfiles_priv/keyone" # PLACEHOLDER
726-
#Aurora specific
727-
aurorax = "bbfoundation/hashfiles_priv/aurora" # PLACEHOLDER
728724
#Pack it up
729-
roots = {"Priv": privx, "DTEK50": dtek50x, "DTEK60": dtek60x, "KEYone": keyonex, "Aurora": aurorax}
725+
roots = {"Priv": privx, "DTEK50": dtek50x, "DTEK60": dtek60x}
730726
return roots
731727

732728

733-
def make_droid_skeleton(method, build, device, variant="common"):
729+
def make_droid_skeleton_bbm(method, build, device, variant="common"):
734730
"""
735-
Make an Android autoloader/hash URL.
731+
Make an Android autoloader/hash URL, on the BB Mobile site.
732+
733+
:param method: None for regular OS links, "sha256/512" for SHA256 or 512 hash.
734+
:type method: str
735+
736+
:param build: Build to check, 3 letters + 3 numbers.
737+
:type build: str
738+
739+
:param device: Device to check.
740+
:type device: str
741+
742+
:param variant: Autoloader variant. Default is "common".
743+
:type variant: str
744+
"""
745+
devices = {"KEYone": "qc8953"}
746+
base = "bbry_{2}_autoloader_user-{0}-{1}".format(variant, build.upper(), devices[device])
747+
if method is None:
748+
skel = "http://54.247.87.13/softwareupgrade/BBM/{0}.zip".format(base)
749+
else:
750+
skel = "http://54.247.87.13/softwareupgrade/BBM/{0}.{1}sum".format(base, method.lower())
751+
return skel
752+
753+
754+
def make_droid_skeleton_og(method, build, device, variant="common"):
755+
"""
756+
Make an Android autoloader/hash URL, on the original site.
736757
737758
:param method: None for regular OS links, "sha256/512" for SHA256 or 512 hash.
738759
:type method: str
@@ -747,7 +768,7 @@ def make_droid_skeleton(method, build, device, variant="common"):
747768
:type variant: str
748769
"""
749770
folder = {"vzw-vzw": "verizon", "na-att": "att", "na-tmo": "tmo", "common": "default"}
750-
devices = {"Priv": "qc8992", "DTEK50": "qc8952_64_sfi", "DTEK60": "qc8996", "KEYone": "qc8953", "Aurora": "qc8917"} # PLACEHOLDER
771+
devices = {"Priv": "qc8992", "DTEK50": "qc8952_64_sfi", "DTEK60": "qc8996"}
751772
roots = root_generator(folder, build, variant)
752773
base = "bbry_{2}_autoloader_user-{0}-{1}".format(variant, build.upper(), devices[device])
753774
if method is None:
@@ -757,6 +778,32 @@ def make_droid_skeleton(method, build, device, variant="common"):
757778
return skel
758779

759780

781+
def make_droid_skeleton(method, build, device, variant="common"):
782+
"""
783+
Make an Android autoloader/hash URL.
784+
785+
:param method: None for regular OS links, "sha256/512" for SHA256 or 512 hash.
786+
:type method: str
787+
788+
:param build: Build to check, 3 letters + 3 numbers.
789+
:type build: str
790+
791+
:param device: Device to check.
792+
:type device: str
793+
794+
:param variant: Autoloader variant. Default is "common".
795+
:type variant: str
796+
"""
797+
# No Aurora
798+
oglist = ("Priv", "DTEK50", "DTEK60") # BlackBerry
799+
bbmlist = ("KEYone") # BB Mobile
800+
if device in oglist:
801+
skel = make_droid_skeleton_og(method, build, device, variant)
802+
elif device in bbmlist:
803+
skel = make_droid_skeleton_bbm(method, build, device, variant)
804+
return skel
805+
806+
760807
def bulk_droid_skeletons(devs, build, method=None):
761808
"""
762809
Prepare list of Android autoloader/hash URLs.
@@ -770,9 +817,9 @@ def bulk_droid_skeletons(devs, build, method=None):
770817
:param method: None for regular OS links, "sha256/512" for SHA256 or 512 hash.
771818
:type method: str
772819
"""
773-
carrier_variants = ("common", "vzw-vzw", "na-tmo", "na-att") # device variants
820+
carrier_variants = ("common", "vzw-vzw", "na-tmo", "na-att") # TODO: add Sprint KEYone
774821
common_variants = ("common", ) # no Americans
775-
carrier_devices = ("Priv", ) # may this list never expand in the future
822+
carrier_devices = ("Priv", ) # TODO: add KEYone carrier loaders
776823
skels = []
777824
for dev in devs:
778825
varlist = carrier_variants if dev in carrier_devices else common_variants
@@ -872,21 +919,47 @@ def table_headers(pees):
872919
@pem_wrapper
873920
def loader_page_scraper(session=None):
874921
"""
875-
Return scraped autoloader page.
922+
Return scraped autoloader pages.
876923
877924
:param session: Requests session object, default is created on the fly.
878925
:type session: requests.Session()
879926
"""
880-
url = "http://ca.blackberry.com/support/smartphones/Android-OS-Reload.html"
881927
session = generic_session(session)
928+
loader_page_scraper_og(session)
929+
loader_page_scraper_bbm(session)
930+
931+
932+
def loader_page_scraper_og(session=None):
933+
"""
934+
Return scraped autoloader page, original site.
935+
936+
:param session: Requests session object, default is created on the fly.
937+
:type session: requests.Session()
938+
"""
939+
url = "http://ca.blackberry.com/support/smartphones/Android-OS-Reload.html"
882940
soup = generic_soup_parser(url, session)
883941
tables = soup.find_all("table")
884942
headers = table_headers(soup.find_all("p"))
885943
for idx, table in enumerate(tables):
886-
loader_page_chunker(idx, table, headers)
944+
loader_page_chunker_og(idx, table, headers)
945+
946+
947+
def loader_page_scraper_bbm(session=None):
948+
"""
949+
Return scraped autoloader page, new site.
950+
951+
:param session: Requests session object, default is created on the fly.
952+
:type session: requests.Session()
953+
"""
954+
url = "http://www.blackberrymobile.com/support/reload-software/"
955+
soup = generic_soup_parser(url, session)
956+
ulls = soup.find_all("ul", {"class": "list-two"})[1:]
957+
print("~~~BlackBerry KEYone~~~")
958+
for ull in ulls:
959+
loader_page_chunker_bbm(ull)
887960

888961

889-
def loader_page_chunker(idx, table, headers):
962+
def loader_page_chunker_og(idx, table, headers):
890963
"""
891964
Given a loader page table, chunk it into lists of table cells.
892965
@@ -906,6 +979,18 @@ def loader_page_chunker(idx, table, headers):
906979
print(" ")
907980

908981

982+
def loader_page_chunker_bbm(ull):
983+
"""
984+
Given a loader page list, chunk it into lists of list items.
985+
986+
:param ull: HTML unordered list tag.
987+
:type ull: bs4.element.Tag
988+
"""
989+
chunks = chunker(ull.find_all("li"), 3)
990+
for chunk in chunks:
991+
loader_page_printer(chunk)
992+
993+
909994
def loader_page_printer(chunk):
910995
"""
911996
Print individual cell texts given a list of table cells.

bbarchivist/scripts/droidlookup.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,11 +75,14 @@ def grab_args():
7575
parser.set_defaults()
7676
if args.single:
7777
args.ceil = args.floor # range(x, x+1) == x
78+
famlist = jsonutils.load_json("droidfamilies")
79+
cleanlist = famlist[:4] # Priv/DTEK50/DTEK60/KEYone
7880
if args.device is None:
79-
famlist = jsonutils.load_json("droidfamilies")
8081
if not args.alldevices:
81-
famlist = famlist[:3] # Priv/DTEKx0, but not Keyone/Aurora
82+
famlist = cleanlist
8283
droidlookup_main(famlist, args.branch, args.floor, args.ceil, args.type)
84+
elif args.device not in cleanlist:
85+
print("Selected device {0} has unknown autoloader scheme!".format(args.device))
8386
else:
8487
droidlookup_main(args.device, args.branch, args.floor, args.ceil, args.type)
8588
else:

tests/test_networkutils.py

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,7 @@ def ls_mock(url, request):
152152
"""
153153
Mock for loader scraping.
154154
"""
155-
thebody = '<p><b>BlackBerry DTEK50</b></p><table><tbody><tr><td style="padding-right: 20px;">BlackBerry common SW for STH100-1 &amp; STH100-2 devices</td><td>AAG326</td><td><a href="https://bbapps.download.blackberry.com/Priv/bbry_qc8952_64_sfi_autoloader_user-common-AAG326.zip" target="_blank">Click Here</a></td></tr></tbody></table>'
155+
thebody = '<p><b>BlackBerry DTEK50</b></p><table><tbody><tr><td style="padding-right: 20px;">BlackBerry common SW for STH100-1 &amp; STH100-2 devices</td><td>AAG326</td><td><a href="https://bbapps.download.blackberry.com/Priv/bbry_qc8952_64_sfi_autoloader_user-common-AAG326.zip" target="_blank">Click Here</a></td></tr></tbody></table>' if "blackberrymobile" not in request.url else '<ul class="list-two special-a"></ul><li><ul class="list-two special-b"><li class="list-two-a"><p>BlackBerry common SW for BBB100-1 devices use this if you bought your device direct from retailer or through a carrier other than those listed below.</p></li><li class="list-two-b"><p>AAK399</p></li><li class="list-two-c"><p><a href="http://54.247.87.13/softwareupgrade/BBM/bbry_qc8953_autoloader_user-common-AAK399%20-With%20SHA%20files.zip">Click here</a></p></li></ul>'
156156
return {'status_code': 200, 'content': thebody}
157157

158158

@@ -164,6 +164,22 @@ def pa_good_mock(url, request):
164164
return {'status_code': 200, 'content': thebody}
165165

166166

167+
def pa_bbm_mock(url, request):
168+
"""
169+
Mock for Android autoloader lookup, new site.
170+
"""
171+
thebody = "http://54.247.87.13/softwareupgrade/BBM/bbry_qc8953_autoloader_user-common-AAL093.zip"
172+
return {'status_code': 200, 'content': thebody}
173+
174+
175+
def pa_bbm_hash_mock(url, request):
176+
"""
177+
Mock for Android autoloader lookup, new site.
178+
"""
179+
thebody = "http://54.247.87.13/softwareupgrade/BBM/bbry_qc8953_autoloader_user-common-AAL093.sha512sum"
180+
return {'status_code': 200, 'content': thebody}
181+
182+
167183
def pa_bad_mock(url, request):
168184
"""
169185
Mock for Android autoloader lookup, worst case.
@@ -628,6 +644,7 @@ def test_autoloader_scan_good(self):
628644
results = bn.droid_scanner("AAD250", "Priv")
629645
assert "user-common-AAD250" in results[0]
630646

647+
631648
def test_autoloader_scan_bad(self):
632649
"""
633650
Test Android autoloader lookup, worst case.
@@ -636,6 +653,14 @@ def test_autoloader_scan_bad(self):
636653
results = bn.droid_scanner("AAD250", "Priv")
637654
assert results is None
638655

656+
def test_autoloader_scan_bbm(self):
657+
"""
658+
Test Android autoloader lookup, new site.
659+
"""
660+
with httmock.HTTMock(pa_bbm_mock):
661+
results = bn.droid_scanner("AAL093", "KEYone")
662+
assert "user-common-AAL093" in results[0]
663+
639664
def test_autoloader_scan_hash(self):
640665
"""
641666
Test Android autoloader hash lookup.
@@ -644,6 +669,14 @@ def test_autoloader_scan_hash(self):
644669
results = bn.droid_scanner("AAD250", "Priv", "sha256")
645670
assert "user-common-AAD250" in results[0]
646671

672+
def test_autoloader_scan_hash_bbm(self):
673+
"""
674+
Test Android autoloader hash lookup, new site.
675+
"""
676+
with httmock.HTTMock(pa_bbm_hash_mock):
677+
results = bn.droid_scanner("AAL093", "KEYone", "sha512")
678+
assert "user-common-AAL093" in results[0]
679+
647680
def test_autoloader_scan_list(self):
648681
"""
649682
Test Android autoloader lookup, list of devices.

0 commit comments

Comments
 (0)