#!/usr/bin/python3 import datetime import dnf import json import sys def timestamp_to_rfc3339(timestamp): d = datetime.datetime.utcfromtimestamp(package.buildtime) return d.strftime('%Y-%m-%dT%H:%M:%SZ') def dnfrepo(desc, parent_conf=None): """Makes a dnf.repo.Repo out of a JSON repository description""" repo = dnf.repo.Repo(desc["id"], parent_conf) repo.name = desc["name"] if "baseurl" in desc: repo.baseurl = desc["baseurl"] elif "metalink" in desc: repo.metalink = desc["metalink"] elif "mirrorlist" in desc: repo.metalink = desc["mirrorlist"] else: assert False return repo def create_base(repos): base = dnf.Base() for repo in repos: base.repos.add(dnfrepo(repo, base.conf)) base.fill_sack(load_system_repo=False) return base call = json.load(sys.stdin) command = call["command"] arguments = call.get("arguments", {}) if command == "dump": base = create_base(arguments.get("repos", {})) packages = [] for package in base.sack.query().available(): packages.append({ "name": package.name, "summary": package.summary, "description": package.description, "url": package.url, "epoch": package.epoch, "version": package.version, "release": package.release, "arch": package.arch, "buildtime": timestamp_to_rfc3339(package.buildtime), "license": package.license }) json.dump(packages, sys.stdout) elif command == "depsolve": base = create_base(arguments.get("repos", {})) base.install_specs(arguments["package-specs"]) base.resolve() packages = [] for package in base.transaction.install_set: packages.append({ "name": package.name, "epoch": package.epoch, "version": package.version, "release": package.release, "arch": package.arch }) json.dump(packages, sys.stdout)