Source code for bbarchivist.scripts.tclscan

#!/usr/bin/env python3
"""Check latest update for TCL API devices."""

import sys  # load arguments

import requests  # session
from bbarchivist import argutils  # arguments
from bbarchivist import decorators  # enter to exit
from bbarchivist import jsonutils  # json
from bbarchivist import networkutilstcl  # lookup
from bbarchivist import scriptutilstcl  # script frontends
from bbarchivist import utilities  # bool
from bbarchivist import xmlutilstcl  # xml handling

__author__ = "Thurask"
__license__ = "WTFPL v2"
__copyright__ = "2017-2018 Thurask"


[docs]def grab_args(): """ Parse arguments from argparse/questionnaire. Invoke a function with those arguments. """ if getattr(sys, "frozen", False) and len(sys.argv) == 1: questionnaire() else: parser = argutils.default_parser("bb-tclscan", "Check for updates for TCL devices") parser.add_argument("prd", help="Only scan one PRD", default=None, nargs="?") parser.add_argument( "-l", "--list", dest="printlist", help="List PRDs in database", action="store_true", default=False) parser.add_argument( "-d", "--download", dest="download", help="Download update, assumes single PRD", action="store_true", default=False) parser.add_argument( "-o", "--ota-version", dest="otaver", help="Query OTA updates from a given version instead of full OS", default=None) parser.add_argument( "-r", "--remote", dest="remote", help="Get latest OTA versions from remote server", action="store_true", default=False) parser.add_argument( "-t", "--device-type", dest="device", help="Scan only one device", default=None, type=argutils.droidlookup_devicetype) parser.add_argument( "-x", "--export", dest="export", help="Write XML to logs folder", action="store_true", default=False) args = parser.parse_args(sys.argv[1:]) parser.set_defaults() execute_args(args)
[docs]def execute_args(args): """ Get args and decide what to do with them. :param args: Arguments. :type args: argparse.Namespace """ if args.printlist: prddict = jsonutils.load_json("prds") jsonutils.list_prds(prddict) elif args.prd is not None: tclscan_single(args.prd, args.download, args.otaver, args.export, args.remote) else: tclscan_main(args.otaver, args.device, args.export, args.remote)
[docs]def questionnaire_ota(): """ Ask about OTA versus full scanning. """ otabool = utilities.i2b("CHECK OTA VERSION (Y/N)?: ") if otabool: otaver = input("ENTER OTA VERSION (ex. AAO472): ") else: otaver = None return otaver
[docs]def questionnaire_single(): """ Ask about single versus full scanning. """ singlebool = utilities.i2b("SCAN SINGLE DEVICE (Y/N)?: ") if singlebool: singleprd = input("ENTER PRD TO SCAN (ex. PRD-63116-001): ") else: singleprd = None return singleprd
[docs]def questionnaire(): """ Questions to ask if no arguments given. """ singleprd = questionnaire_single() otaver = questionnaire_ota() if singleprd is not None: tclscan_single(singleprd, ota=otaver) else: tclscan_main(otaver) decorators.enter_to_exit(True)
[docs]def tclscan_single(curef, download=False, ota=None, export=False, remote=False): """ Scan one PRD and produce download URL and filename. :param curef: PRD of the phone variant to check. :type curef: str :param download: If we'll download the file that this returns. Default is False. :type download: bool :param ota: The starting version if OTA, None if not. Default is None. :type ota: str :param export: Whether to export XML response to file. Default is False. :type export: bool :param remote: Whether to get OTA version from remote server. Default is False. :type remote: bool """ if remote: remotedict = networkutilstcl.remote_prd_info() ota = remotedict.get(curef, None) mode, fvver = scriptutilstcl.tcl_prep_otaver(ota) scriptutilstcl.tcl_prd_scan(curef, download, mode=mode, fvver=fvver, export=export, verify=False)
[docs]def tclscan_main(ota=None, device=None, export=False, remote=False): """ Scan every PRD and produce latest versions. :param ota: The starting version if OTA, None if not. Default is None. :type ota: str :param device: Specific PRD to check, None if all will be checked. Default is None. :type device: str :param export: Whether to export XML response to file. Default is False. :type export: bool :param remote: Whether to get OTA version from remote server. Default is False. :type remote: bool """ if remote: remotedict = networkutilstcl.remote_prd_info() ota = "LATEST" mode, fvver = scriptutilstcl.tcl_prep_otaver(ota) scriptutilstcl.tcl_mainscan_preamble(ota) prddict = jsonutils.load_json("prds") if device is not None: prddict = {device: prddict[device]} sess = requests.Session() for devx in prddict.keys(): print("~{0}~".format(devx)) for curef in prddict[devx]: if remote: fvver = remotedict.get(curef, "AAA000") checktext = networkutilstcl.tcl_check(curef, sess, mode=mode, fvver=fvver, export=export) if checktext is None: continue else: tvver, firmwareid, filename, fsize, fhash = xmlutilstcl.parse_tcl_check(checktext) del firmwareid, filename, fsize, fhash scriptutilstcl.tcl_mainscan_printer(curef, tvver, ota)
if __name__ == "__main__": grab_args()