#!/usr/bin/env python3
import os
import glob
import shutil
import hashlib
import subprocess
try:
from . import utilities # @UnusedImport
except SystemError:
import utilities # @UnresolvedImport @Reimport
try:
from . import barutils # @UnusedImport
except SystemError:
import barutils # @UnresolvedImport @Reimport
try:
from . import bbconstants # @UnusedImport
except SystemError:
import bbconstants # @UnresolvedImport @Reimport
try:
from . import networkutils # @UnusedImport
except SystemError:
import networkutils # @UnresolvedImport @Reimport
try:
from . import loadergen # @UnusedImport
except SystemError:
import loadergen # @UnresolvedImport @Reimport
[docs]def doMagic(osversion, radioversion,
softwareversion, device,
localdir, autoloader):
"""
Wrap the tools necessary to make one autoloader.
:param osversion: OS version, 10.x.y.zzzz.
:type osversion: str
:param radioversion: Radio version, 10.x.y.zzzz.
:type radioversion: str
:param softwareversion: Software version, 10.x.y.zzzz.
:type softwareversion: str
:param device: Device family to create loader for.
:type device: int
:param localdir: Working path. Default is local dir.
:type localdir: str
:param autoloader: Whether to run loaders. Default is false. Windows-only.
:type autoloader: bool
"""
devicelist = ["STL100-1",
"STL100-2/3/P9982",
"STL100-4",
"Q10/Q5/P9983",
"Z30/CLASSIC/LEAP",
"Z3",
"PASSPORT"]
print("~~~LAZYLOADER VERSION", bbconstants._version + "~~~")
print("OS VERSION:", osversion)
print("RADIO VERSION:", radioversion)
print("SOFTWARE VERSION:", softwareversion)
print("DEVICE:", devicelist[device])
# hash SW release
sha1 = hashlib.sha1(softwareversion.encode('utf-8'))
hashedsoftwareversion = sha1.hexdigest()
baseurl = "http://cdn.fs.sl.blackberry.com/fs/qnx/production/"
baseurl += hashedsoftwareversion
if device == 0:
osurl = baseurl + "/winchester.factory_sfi.desktop-"
osurl += osversion + "-nto+armle-v7+signed.bar"
radiourl = baseurl + "/m5730-"
radiourl += radioversion + "-nto+armle-v7+signed.bar"
elif device == 1:
osurl = baseurl + "/qc8960.factory_sfi.desktop-"
osurl += osversion + "-nto+armle-v7+signed.bar"
radiourl = baseurl + "/qc8960-"
radiourl += radioversion + "-nto+armle-v7+signed.bar"
elif device == 2:
osurl = baseurl + "/qc8960.factory_sfi.desktop-"
osurl += osversion + "-nto+armle-v7+signed.bar"
radiourl = baseurl + "/qc8960.omadm-"
radiourl += radioversion + "-nto+armle-v7+signed.bar"
elif device == 3:
osurl = baseurl + "/qc8960.factory_sfi.desktop-"
osurl += osversion + "-nto+armle-v7+signed.bar"
radiourl = baseurl + "/qc8960.wtr-"
radiourl += radioversion + "-nto+armle-v7+signed.bar"
elif device == 4:
osurl = baseurl + "/qc8960.factory_sfi.desktop-"
osurl += osversion + "-nto+armle-v7+signed.bar"
radiourl = baseurl + "/qc8960.wtr5-"
radiourl += radioversion + "-nto+armle-v7+signed.bar"
elif device == 5:
osurl = baseurl + "/qc8960.factory_sfi_hybrid_qc8x30.desktop-"
osurl += osversion + "-nto+armle-v7+signed.bar"
radiourl = baseurl + "/qc8930.wtr5-"
radiourl += radioversion + "-nto+armle-v7+signed.bar"
elif device == 6:
osurl = baseurl + "/qc8960.factory_sfi_hybrid_qc8974.desktop-"
osurl += osversion + "-nto+armle-v7+signed.bar"
radiourl = baseurl + "/qc8974.wtr2-"
radiourl += radioversion + "-nto+armle-v7+signed.bar"
else:
return
# Check availability of software release
av = networkutils.availability(baseurl)
if av:
print("\nSOFTWARE RELEASE", softwareversion, "EXISTS")
else:
print("\nSOFTWARE RELEASE", softwareversion, "NOT FOUND")
cont = utilities.str2bool(input("CONTINUE? Y/N "))
if cont:
pass
else:
print("\nEXITING...")
raise SystemExit # bye bye
print("\nDOWNLOADING...")
dldict = dict(osurl=osurl, radiourl=radiourl)
download_manager = networkutils.DownloadManager(dldict, localdir, 3)
download_manager.begin_downloads()
print("\nEXTRACTING...")
barutils.extract_bars(localdir)
# Make dirs
if not os.path.exists(localdir):
os.makedirs(localdir)
if not os.path.exists(os.path.join(localdir, 'bars')):
os.mkdir(os.path.join(localdir, 'bars'))
bardir = os.path.join(localdir, 'bars')
if not os.path.exists(os.path.join(bardir, osversion)):
os.mkdir(os.path.join(bardir, osversion))
bardir_os = os.path.join(bardir, osversion)
if not os.path.exists(os.path.join(bardir, radioversion)):
os.mkdir(os.path.join(bardir, radioversion))
bardir_radio = os.path.join(bardir, radioversion)
if not os.path.exists(os.path.join(localdir, 'loaders')):
os.mkdir(os.path.join(localdir, 'loaders'))
loaderdir = os.path.join(localdir, 'loaders')
if not os.path.exists(os.path.join(loaderdir, osversion)):
os.mkdir(os.path.join(loaderdir, osversion))
loaderdir_os = os.path.join(loaderdir, osversion)
print("\nMOVING .bar FILES...")
for files in os.listdir(localdir):
if files.endswith(".bar"):
print("MOVING: " + files)
bardest_os = os.path.join(bardir_os, files)
bardest_radio = os.path.join(bardir_radio, files)
if os.path.getsize(files) > 90000000:
try:
shutil.move(files, bardir_os)
except shutil.Error:
os.remove(bardest_os)
else:
try:
shutil.move(files, bardir_radio)
except shutil.Error:
os.remove(bardest_radio)
loadergen.generate_lazy_loader(osversion, radioversion, device,
cap=bbconstants._caplocation,
localdir=localdir)
print("\nREMOVING .signed FILES...")
for file in os.listdir(localdir):
if file.endswith(".signed"):
print("REMOVING: " + file)
os.remove(file)
print("\nMOVING LOADERS...")
for files in os.listdir(localdir):
if files.endswith(
(".exe")
) and files.startswith(
("Q10", "Z10", "Z30", "Z3", "Passport")):
loaderdest_os = os.path.join(loaderdir_os, files)
print("MOVING: " + files)
try:
shutil.move(files, loaderdir_os)
except shutil.Error:
os.remove(loaderdest_os)
print("\nCREATION FINISHED!")
if autoloader:
os.chdir(loaderdir_os)
if device == 0:
loaderfile = str(glob.glob("Z10*STL100-1*")[0])
elif device == 1:
loaderfile = str(glob.glob("Z10*STL100-2-3*")[0])
elif device == 2:
loaderfile = str(glob.glob("Z10*STL100-4*")[0])
elif device == 3:
loaderfile = str(glob.glob("Q10*")[0])
elif device == 4:
loaderfile = str(glob.glob("Z30*")[0])
elif device == 5:
loaderfile = str(glob.glob("Z3*")[0])
elif device == 6:
loaderfile = str(glob.glob("Passport*")[0])
else:
return
if len(loaderfile) > 0:
subprocess.call(loaderfile)
print("\nFINISHED!!!")
else:
print("Error!")
return
else:
print("\nFINISHED!!!")