Source code for bbarchivist.scripts.downloader

#!/usr/bin/env python3
"""Only download OS/radio bar files."""

import os  # filesystem read
import sys  # load arguments

import requests  # session
from bbarchivist import argutils  # arguments
from bbarchivist import decorators  # enter to exit
from bbarchivist import networkutils  # download/lookup
from bbarchivist import scriptutils  # script stuff
from bbarchivist import utilities  # input validation

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


@decorators.timer
def grab_args():
    """
    Parse arguments from argparse/questionnaire.

    Invoke downloader from :func:`archivist.archivist_main` with arguments.
    """
    if len(sys.argv) > 1:
        parser = argutils.default_parser("bb-downloader", "Download bar files", ("folder", "osr"))
        parser.add_argument(
            "-a",
            "--altsw",
            dest="altsw",
            metavar="SW",
            help="Radio software version, if not same as OS",
            nargs="?",
            default=None)
        parser.add_argument(
            "-d",
            "--debricks",
            dest="debricks",
            help="Download debricks",
            default=False,
            action="store_true")
        parser.add_argument(
            "-c",
            "--cores",
            dest="cores",
            help="Download debricks",
            default=False,
            action="store_true")
        parser.add_argument(
            "-r",
            "--radios",
            dest="radios",
            help="Download radios",
            default=False,
            action="store_true")
        parser.set_defaults()
        args = parser.parse_args(sys.argv[1:])
        args.folder = utilities.dirhandler(args.folder, os.getcwd())
        downloader_main(args.os, args.radio, args.swrelease,
                        args.folder, args.debricks, args.radios,
                        args.cores, args.altsw)
    else:
        questionnaire()


[docs]def questionnaire(): """ Questions to ask if no arguments given. """ localdir = os.getcwd() osversion = input("OS VERSION: ") radioversion = input("RADIO VERSION: ") softwareversion = input("SOFTWARE RELEASE: ") debricks = utilities.i2b("DOWNLOAD DEBRICKS? Y/N: ") radios = utilities.i2b("DOWNLOAD RADIOS? Y/N: ") if not radios: radios = False cores = utilities.i2b("DOWNLOAD CORES? Y/N: ") if not cores: cores = False altsw = None print(" ") downloader_main(osversion, radioversion, softwareversion, localdir, debricks, radios, cores, altsw) decorators.enter_to_exit(True)
[docs]def downloader_main(osversion, radioversion=None, softwareversion=None, localdir=None, debricks=True, radios=True, cores=False, altsw=None): """ Archivist's download function, abstracted out. :param osversion: OS version, 10.x.y.zzzz. :type osversion: str :param radioversion: Radio version, 10.x.y.zzzz. Can be guessed. :type radioversion: str :param softwareversion: Software release, 10.x.y.zzzz. Can be guessed. :type softwareversion: str :param localdir: Working directory. Local by default. :type localdir: str :param debricks: Whether to download debrick OS files. True by default. :type debricks: bool :param radios: Whether to download radio files. True by default. :type radios: bool :param cores: Whether to download core OS files. False by default. :type cores: bool :param altsw: Radio software release, if not the same as OS. :type altsw: str """ radioversion = scriptutils.return_radio_version(osversion, radioversion) softwareversion, swchecked = scriptutils.return_sw_checked(softwareversion, osversion) if altsw: altsw, altchecked = scriptutils.return_radio_sw_checked(altsw, radioversion) localdir = utilities.dirhandler(localdir, os.getcwd()) argutils.standard_preamble("downloader", osversion, softwareversion, radioversion, altsw) if not any((debricks, radios, cores)): print("NO FILES SPECIFIED, DEFAULTING TO DEBRICKS + RADIOS") debricks = True radios = True baseurl, alturl = scriptutils.get_baseurls(softwareversion, altsw) osurls, corurls, radurls = utilities.bulk_urls(softwareversion, osversion, radioversion, cores, altsw) # Check availability of software releases scriptutils.check_sw(baseurl, softwareversion, swchecked) if altsw: scriptutils.check_radio_sw(alturl, altsw, altchecked) # Check availability of OS, radio if debricks: scriptutils.check_os_bulk(osurls) osurls = scriptutils.bulk_avail(osurls) if cores: scriptutils.check_os_bulk(corurls) corurls = scriptutils.bulk_avail(corurls) if radios: radurls, radioversion = scriptutils.check_radio_bulk(radurls, radioversion) radurls = scriptutils.bulk_avail(radurls) # Download files print("BEGIN DOWNLOADING...") urllist = [] if debricks: urllist += osurls if radios: urllist += radurls if cores: urllist += corurls urllist = list(set(urllist)) # pop duplicates if urllist: sess = requests.Session() networkutils.download_bootstrap(urllist, localdir, workers=5, session=sess) print("ALL FILES DOWNLOADED") else: print("NO FILES TO DOWNLOAD!") raise SystemExit # Test bar files scriptutils.test_bar_files(localdir, urllist)
if __name__ == "__main__": grab_args()