Пример #1
0
class Allirt():
    _flair = None
    _archive = None
    _os_name = ''
    _package_name = ''
    _is_compress = True

    _a_name = ''
    _logger = None
    _SKIPS = {'arch': ['sparc', 'hppa']}

    def __init__(self,
                 os_name,
                 package_name,
                 a_name,
                 flair='flair',
                 log_level=logging.INFO,
                 is_compress=True):
        self._flair = Flair(flair)
        self._archive = Launchpad()
        self._os_name = os_name
        self._package_name = package_name
        self._a_name = a_name
        self._is_compress = is_compress
        self._logger = logging.getLogger('Allirt')
        self._logger.setLevel(log_level)
        stream_handler = logging.StreamHandler()
        formatter = logging.Formatter('[%(levelname)s] %(message)s')
        stream_handler.setFormatter(formatter)
        self._logger.addHandler(stream_handler)

    def download_all(self, out_dir=''):
        return self.download(out_dir)

    def download(self, out_dir='', start=0, end=0):
        os_name = self._os_name
        package_name = self._package_name
        self._logger.info('OS : ' + os_name)
        self._logger.info('Package : ' + package_name)
        series_list = self._archive.get_os_series(os_name)
        if start or end:
            series_list = series_list[start:end]
        print()
        os_dir_name = os.path.join(out_dir, os_name)
        not os.path.exists(os_dir_name) and os.mkdir(os_dir_name)
        with TemporaryDirectory() as deb_tmp_path:
            for series_idx, series in enumerate(series_list):
                series_name, series_version = series
                print()

                series_dir_name = os.path.join(
                    os_dir_name, '{} ({})'.format(series_version, series_name))
                not os.path.exists(series_dir_name) and os.mkdir(
                    series_dir_name)
                self._logger.info('OS Series ({}/{}) : {} ({})'.format(
                    series_idx + 1, len(series_list), series_name,
                    series_version))
                archs = self._archive.get_os_architectures(
                    os_name, series_name)
                for arch_idx, arch in enumerate(archs):
                    print()
                    self._logger.info('Architecture ({}/{}) : {}'.format(
                        arch_idx + 1, len(archs), arch))
                    if arch in self._SKIPS['arch']:
                        self._logger.warning('SKIPPED')
                        continue
                    arch_dir_name = os.path.join(series_dir_name, arch)
                    not os.path.exists(arch_dir_name) and os.mkdir(
                        arch_dir_name)
                    package_versions = self._archive.get_pacakge_versions(
                        os_name, series_name, arch, package_name)
                    for package_version_idx, package_version in enumerate(
                            package_versions):
                        print()
                        self._logger.info(
                            'Package Version ({}/{}) : {}'.format(
                                package_version_idx + 1, len(package_versions),
                                package_version))
                        self._logger.info('{} {} {} {} {} {}'.format(
                            os_name, series_version, package_name, arch,
                            package_version, datetime.now()))
                        info = self._archive.download_package(
                            os_name, series_name, arch, package_name,
                            package_version, deb_tmp_path)
                        size = info['size']
                        filename = info['filename']
                        if info['size']:
                            self._logger.info(
                                'Download Completed : {} ({} bytes)'.format(
                                    info['url'], size))
                            sig_desc = '{} {} {} ({}/{})'.format(
                                os_name, series_version,
                                package_name.replace('-dev', ''),
                                package_version, arch)
                            try:
                                sig_dir_name = arch_dir_name
                                sig_name = '{}.sig'.format(
                                    os.path.splitext(filename)[0])
                                sig_name = os.path.join(sig_dir_name, sig_name)
                                deb_path = os.path.join(deb_tmp_path, filename)
                                info = self._flair.deb_to_sig(
                                    deb_path, self._a_name, sig_name, sig_desc,
                                    self._is_compress)
                                self._logger.info('Target library : {}'.format(
                                    info['a']))
                                self._logger.info(
                                    'Signature has been generated. -> {}'.
                                    format(info['sig']))
                            except FileExistsError as e:
                                self._logger.warning(
                                    'Signature already exists.')
                            except (FlairError, FlairNotSupportedError) as e:
                                self._logger.error(e)
                            except Exception as e:
                                self._logger.error(e)
                                traceback.print_tb(e.__traceback__)
                            finally:
                                os.remove(deb_path)
                        else:
                            self._logger.warning('Package deleted')

        self._logger.info('Finished')
        return True