#!/usr/bin/env python2.7 # coding: utf-8 # This script download all necessary tarballs for a specific TiDB version # and store them in a dedicated directory, where can be copied to an server # without internet access. import argparse import os from tiops import operations from tiops import utils from tiops.tui import term def parse_args(): _parser = argparse.ArgumentParser() subparsers = _parser.add_subparsers( dest="task", help='tasks to operate') # download binary tarballs and necessary packages download_parser = subparsers.add_parser('download', help='download necessary packages') download_parser.add_argument('--dir', dest='dir', default='/tmp/tiops/pkg', help='Destination to store downloaded files') download_parser.add_argument('--tidb-version', dest='version', default=None, help='TiDB version') download_parser.add_argument('--no-rpm', dest='no_rpm', default=False, action="store_true", help='Don\'t download needed RPM packages') return _parser.parse_args() def download(args): _cwd = utils.cwd() _dir = args.dir try: _ver = args.version except AttributeError: print(term.bold_red('TiDB version must be specfied.')) exit(1) if not _dir.startswith('/'): _dir = os.path.join(_cwd, _dir) # validate version version = utils.valid_tidb_ver(_ver) if not version: print(term.bold_red('TiDB version {} not supported.'.format(_ver))) exit(1) # prepare directory dest = utils.create_dir(_dir) if not dest: print(term.bold_red('Error preparing destination directory {}.'.format(_dir))) exit(1) config_dir = os.path.join(dest, 'downloads', '{}/configs'.format(version)) dashboard_dir = os.path.join( dest, 'downloads', '{}/dashboards'.format(version)) package_dir = os.path.join( dest, 'downloads', '{}/packages'.format(version)) resource_dir = os.path.join( dest, 'downloads', '{}/resources'.format(version)) utils.create_dir(config_dir) utils.create_dir(dashboard_dir) utils.create_dir(package_dir) utils.create_dir(resource_dir) # download files utils.chdir(package_dir) components = operations.component_tpls components['tidb'] = components['tidb'].format(version) components['tidb-toolkit'] = components['tidb-toolkit'].format(version) try: operations.do_download(components, version, config_dir, dashboard_dir, package_dir, resource_dir) except Exception as e: print(term.bold_red('{}, please check the network and try again.'.format(e))) exit(1) utils.chdir(_cwd) if not args.no_rpm: rpm_dir = os.path.join(dest, 'downloads', 'rpm') utils.create_dir(rpm_dir) # NOTE: if any of the packages is already installed on the system running # this command, its dependencies might not been fully downloaded, so it's # highly recommended to run this script on a clean and minimal system. os.system( 'yum -y reinstall --downloadonly --downloaddir={} sshpass mariadb'.format(rpm_dir)) return dest if __name__ == '__main__': args = parse_args() task = args.task if task == 'download': print(term.plain('Start downloading files...')) dir = download(args) print(term.plain_green('Downloaded files to {}.'.format(dir)))