import argparse import json import os from pathlib import Path import repomd def get_repos(repo_dir): # Get a list of all repo dirs repos = [] for path in Path(repo_dir).rglob('repomd.xml'): repos.append(path.parent.parent.absolute()) return repos def get_distribution(repo): distribution_dir = repo.name parts = distribution_dir.split('-') distribution = '-'.join(parts[:2]) return distribution def get_package_info(repo, base_path): packages = [] repo_data = repomd.load('file://' + str(repo)) for package_data in repo_data: package = {'Package': package_data.name, 'Version': package_data.version, 'Build': package_data.release, 'Architecture': package_data.arch, 'Filename': os.path.relpath(str(repo) + '/' + package_data.location, base_path), 'Description': package_data.description, 'Distribution': get_distribution(repo), 'Url': package_data.url, 'Maintainer': package_data.vendor, 'Repo': os.path.relpath(str(repo), base_path).split('/')[0], 'Licence': package_data.license } packages.append(package) return packages def main(): # Command line arguments parser = argparse.ArgumentParser(description='Scan a set of APT repos and ' 'generate a JSON catalog of ' 'the contents.') parser.add_argument("repo", help="the repo directory, or directory " "containing multiple repos") args = parser.parse_args() package_info = [] repos = get_repos(args.repo) for repo in repos: package_info.extend(get_package_info(repo, args.repo)) with open('yum.json', 'w') as output_file: json.dump(package_info, output_file, indent=2, sort_keys=True) if __name__ == "__main__": main()