import io from html import escape import json import tarfile import tempfile from urllib.request import urlopen import urllib.error import flask from flask import Flask, jsonify, redirect from launchpadlib.launchpad import Launchpad app = Flask(__name__) tmpdir = tempfile.TemporaryDirectory() launchpad = Launchpad.login_anonymously("just testing", "production", tmpdir.name, version="devel") use_json = False @app.route("/") def index_root(): return redirect("/ogayot", code=302) @app.route("/") def index_lpuser(LPUSER): lpuser = launchpad.people[LPUSER] ppas = [ppa.name for ppa in lpuser.ppas] if use_json: return jsonify(ppas) else: return flask.render_template("list-ppas.html", ppas=ppas, base_url=flask.request.base_url) @app.route("//") def index_ppa(LPUSER, PPA): lpuser = launchpad.people[LPUSER] ppa = next(filter(lambda p: p.name == PPA, lpuser.ppas)) packages = list(set([pkg.source_package_name for pkg in ppa.getPublishedSources()])) if use_json: return jsonify(packages) else: return flask.render_template("list-packages.html", packages=packages, base_url=flask.request.base_url) @app.route("///") def index_package(LPUSER, PPA, PACKAGE): lpuser = launchpad.people[LPUSER] runs = [] ppa = next(filter(lambda p: p.name == PPA, lpuser.ppas)) series_set = set() for source_pkg in ppa.getPublishedSources(): if source_pkg.source_package_name != PACKAGE: continue series_set.add(source_pkg.distro_series.name) series = list(series_set) if use_json: return jsonify(series) else: return flask.render_template("list-series.html", series=series, base_url=flask.request.base_url) @app.route("////") def index_release(LPUSER, PPA, PACKAGE, RELEASE): autopkgtest_url_base = f"https://autopkgtest.ubuntu.com/results/autopkgtest-{RELEASE}-{LPUSER}-{PPA}" try: data = json.loads(urlopen(f"https://autopkgtest.ubuntu.com/results/autopkgtest-{RELEASE}-{LPUSER}-{PPA}/?format=json").read()) except urllib.error.HTTPError: data = [] arches_set = set() for section in data: arches_set.add(section["name"].split("/")[1]) arches = list(arches_set) if use_json: return jsonify(arches) else: return flask.render_template("list-arches.html", arches=arches, base_url=flask.request.base_url) @app.route("/////") def index_results(LPUSER, PPA, PACKAGE, RELEASE, ARCH): autopkgtest_url_base = f"https://autopkgtest.ubuntu.com/results/autopkgtest-{RELEASE}-{LPUSER}-{PPA}" data = json.loads(urlopen(f"{autopkgtest_url_base}?format=json").read()) # Use the prefix as index runs = {} for info in data: index, suffix = info["name"].rsplit("/", maxsplit=1) if suffix != "result.tar": continue runs[index] = info headers = ("version", "triggers", "date", "duration", "requester", "result", "url_prefix") package_results = [] for idx, info in runs.items(): date = " ".join(idx.split("/")[-1].split("_")[0:2]), tar_stream = io.BytesIO(urlopen(f"{autopkgtest_url_base}/{info['name']}").read()) file = tarfile.open(fileobj=tar_stream) exitcode = int(file.extractfile("exitcode").read().decode().splitlines()[0]) duration = int(file.extractfile("duration").read().decode().splitlines()[0]) version = file.extractfile("testpkg-version").read().decode().splitlines()[0].split(" ")[-1] requester = file.extractfile("requester").read().decode().splitlines()[0] testinfo = json.loads(file.extractfile("testinfo.json").read().decode()) for entry in testinfo["custom_environment"]: key, value = entry.split("=", maxsplit=1) if key == "ADT_TEST_TRIGGERS": triggers = value break else: triggers = "?" result = { "version": version, "triggers": triggers, "date": " ".join(idx.split("/")[-1].split("_")[0:2]), "duration": duration, "requester": requester, "result": exitcode, "url_prefix": f"{autopkgtest_url_base}/{idx}", } package_results.append([result[h] for h in headers]) return flask.render_template("browse-results.html", package=PACKAGE, release=RELEASE, arch=ARCH, package_results=package_results, title_suffix=f"{LPUSER} {PPA} {PACKAGE}", base_url="https://autopkgtest.ubuntu.com/", )