Merge branch 'next'

Signed-off-by: Peter Korsgaard <peter@korsgaard.com>
This commit is contained in:
Peter Korsgaard
2022-09-11 09:57:08 +02:00
316 changed files with 2148 additions and 3179 deletions

View File

@@ -886,7 +886,7 @@ function expandField(fieldId){
<body>
<a href=\"#results\">Results</a><br/>
<a href="#results">Results</a><br/>
""" # noqa - tabs and spaces
@@ -920,8 +920,8 @@ def boolean_str(b):
def dump_html_pkg(f, pkg):
pkg_css_class = pkg.path.replace("/", "_")[:-3]
f.write(f'<div id=\"package__{pkg_css_class}\" \
class=\"package data _{pkg_css_class}\">{pkg.path}</div>\n')
f.write(f'<div id="package__{pkg_css_class}" \
class="package data _{pkg_css_class}">{pkg.path}</div>\n')
# Patch count
data_field_id = f'patch_count__{pkg_css_class}'
div_class = ["centered patch_count data"]
@@ -932,8 +932,8 @@ def dump_html_pkg(f, pkg):
div_class.append("somepatches")
else:
div_class.append("lotsofpatches")
f.write(f' <div id=\"{data_field_id}\" class=\"{" ".join(div_class)} \
\">{str(pkg.patch_count)}</div>\n')
f.write(f' <div id="{data_field_id}" class="{" ".join(div_class)} \
">{str(pkg.patch_count)}</div>\n')
# Infrastructure
data_field_id = f'infrastructure__{pkg_css_class}'
@@ -944,8 +944,8 @@ def dump_html_pkg(f, pkg):
div_class.append("wrong")
else:
div_class.append("correct")
f.write(f' <div id=\"{data_field_id}\" class=\"{" ".join(div_class)} \
\">{infra_str(pkg.infras)}</div>\n')
f.write(f' <div id="{data_field_id}" class="{" ".join(div_class)} \
">{infra_str(pkg.infras)}</div>\n')
# License
data_field_id = f'license__{pkg_css_class}'
@@ -955,8 +955,8 @@ def dump_html_pkg(f, pkg):
div_class.append("correct")
else:
div_class.append("wrong")
f.write(f' <div id=\"{data_field_id}\" class=\"{" ".join(div_class)} \
\">{boolean_str(pkg.is_status_ok("license"))}</div>\n')
f.write(f' <div id="{data_field_id}" class="{" ".join(div_class)} \
">{boolean_str(pkg.is_status_ok("license"))}</div>\n')
# License files
data_field_id = f'license_files__{pkg_css_class}'
@@ -966,8 +966,8 @@ def dump_html_pkg(f, pkg):
div_class.append("correct")
else:
div_class.append("wrong")
f.write(f' <div id=\"{data_field_id}\" class=\"{" ".join(div_class)} \
\">{boolean_str(pkg.is_status_ok("license-files"))}</div>\n')
f.write(f' <div id="{data_field_id}" class="{" ".join(div_class)} \
">{boolean_str(pkg.is_status_ok("license-files"))}</div>\n')
# Hash
data_field_id = f'hash_file__{pkg_css_class}'
@@ -977,8 +977,8 @@ def dump_html_pkg(f, pkg):
div_class.append("correct")
else:
div_class.append("wrong")
f.write(f' <div id=\"{data_field_id}\" class=\"{" ".join(div_class)} \
\">{boolean_str(pkg.is_status_ok("hash"))}</div>\n')
f.write(f' <div id="{data_field_id}" class="{" ".join(div_class)} \
">{boolean_str(pkg.is_status_ok("hash"))}</div>\n')
# Current version
data_field_id = f'current_version__{pkg_css_class}'
@@ -986,8 +986,8 @@ def dump_html_pkg(f, pkg):
current_version = pkg.current_version[:20] + "..."
else:
current_version = pkg.current_version
f.write(f' <div id=\"{data_field_id}\" \
class=\"centered current_version data _{pkg_css_class}\">{current_version}</div>\n')
f.write(f' <div id="{data_field_id}" \
class="centered current_version data _{pkg_css_class}">{current_version}</div>\n')
# Latest version
data_field_id = f'latest_version__{pkg_css_class}'
@@ -1010,17 +1010,17 @@ def dump_html_pkg(f, pkg):
if pkg.latest_version['version'] is None:
latest_version_text = "<b>Found, but no version</b>"
else:
latest_version_text = "<a href=\"https://release-monitoring.org/project/%s\"><b>%s</b></a>" % \
(pkg.latest_version['id'], str(pkg.latest_version['version']))
latest_version_text = f"""<a href="https://release-monitoring.org/project/{pkg.latest_version['id']}">""" \
f"""<b>{str(pkg.latest_version['version'])}</b></a>"""
latest_version_text += "<br/>"
if pkg.latest_version['status'] == RM_API_STATUS_FOUND_BY_DISTRO:
latest_version_text += "found by <a href=\"https://release-monitoring.org/distro/Buildroot/\">distro</a>"
latest_version_text += 'found by <a href="https://release-monitoring.org/distro/Buildroot/">distro</a>'
else:
latest_version_text += "found by guess"
f.write(f' <div id=\"{data_field_id}\" class=\"{" ".join(div_class)}\">{latest_version_text}</div>\n')
f.write(f' <div id="{data_field_id}" class="{" ".join(div_class)}">{latest_version_text}</div>\n')
# Warnings
data_field_id = f'warnings__{pkg_css_class}'
@@ -1030,7 +1030,7 @@ def dump_html_pkg(f, pkg):
div_class.append("correct")
else:
div_class.append("wrong")
f.write(f' <div id=\"{data_field_id}\" class=\"{" ".join(div_class)}\">{pkg.warnings}</div>\n')
f.write(f' <div id="{data_field_id}" class="{" ".join(div_class)}">{pkg.warnings}</div>\n')
# URL status
data_field_id = f'upstream_url__{pkg_css_class}'
@@ -1041,11 +1041,11 @@ def dump_html_pkg(f, pkg):
div_class.append("missing_url")
if pkg.status['url'][0] == "error":
div_class.append("invalid_url")
url_str = "<a href=\"%s\">%s</a>" % (pkg.url, pkg.status['url'][1])
url_str = f"""<a href="{pkg.url}">{pkg.status['url'][1]}</a>"""
else:
div_class.append("good_url")
url_str = "<a href=\"%s\">Link</a>" % pkg.url
f.write(f' <div id=\"{data_field_id}\" class=\"{" ".join(div_class)}\">{url_str}</div>\n')
url_str = f'<a href="{pkg.url}">Link</a>'
f.write(f' <div id="{data_field_id}" class="{" ".join(div_class)}">{url_str}</div>\n')
# CVEs
data_field_id = f'cves__{pkg_css_class}'
@@ -1061,18 +1061,18 @@ def dump_html_pkg(f, pkg):
div_class.append("cve-ok")
else:
div_class.append("cve-unknown")
f.write(f' <div id=\"{data_field_id}\" class=\"{" ".join(div_class)}\">\n')
f.write(f' <div id="{data_field_id}" class="{" ".join(div_class)}">\n')
if len(pkg.cves) > 10:
cve_total = len(pkg.cves) + 1
f.write(f' <div onclick=\"expandField(\'{data_field_id}\')\" \
class=\"see-more centered cve_ignored\">see all ({cve_total}) &#9662;</div>\n')
f.write(f' <div onclick="expandField(\'{data_field_id}\')" \
class="see-more centered cve_ignored">see all ({cve_total}) &#9662;</div>\n')
if pkg.is_status_error("cve"):
for cve in pkg.cves:
f.write(" <a href=\"https://security-tracker.debian.org/tracker/%s\">%s</a><br/>\n" % (cve, cve))
f.write(f' <a href="https://security-tracker.debian.org/tracker/{cve}">{cve}</a><br/>\n')
for cve in pkg.unsure_cves:
f.write(" <a href=\"https://security-tracker.debian.org/tracker/%s\">%s <i>(unsure)</i></a><br/>\n" % (cve, cve))
f.write(f' <a href="https://security-tracker.debian.org/tracker/{cve}">{cve} <i>(unsure)</i></a><br/>\n')
elif pkg.is_status_na("cve"):
f.write(" %s" % pkg.status['cve'][1])
f.write(f""" {pkg.status['cve'][1]}""")
else:
f.write(" N/A\n")
f.write(" </div>\n")
@@ -1083,9 +1083,9 @@ def dump_html_pkg(f, pkg):
div_class.append(f'_{pkg_css_class}')
if pkg.ignored_cves:
div_class.append("cve_ignored")
f.write(f' <div id=\"{data_field_id}\" class=\"{" ".join(div_class)}\">\n')
f.write(f' <div id="{data_field_id}" class="{" ".join(div_class)}">\n')
for ignored_cve in pkg.ignored_cves:
f.write(" <a href=\"https://security-tracker.debian.org/tracker/%s\">%s</a><br/>\n" % (ignored_cve, ignored_cve))
f.write(f' <a href="https://security-tracker.debian.org/tracker/{ignored_cve}">{ignored_cve}</a><br/>\n')
f.write(" </div>\n")
# CPE ID
@@ -1100,7 +1100,7 @@ def dump_html_pkg(f, pkg):
div_class.append("cpe-ok")
else:
div_class.append("cpe-unknown")
f.write(f' <div id=\"{data_field_id}\" class=\"{" ".join(div_class)}\">\n')
f.write(f' <div id="{data_field_id}" class="{" ".join(div_class)}">\n')
if pkg.cpeid:
cpeid_begin = ":".join(pkg.cpeid.split(":")[0:4]) + ":"
cpeid_formatted = pkg.cpeid.replace(cpeid_begin, cpeid_begin + "<wbr>")
@@ -1108,11 +1108,11 @@ def dump_html_pkg(f, pkg):
if not pkg.is_status_ok("cpe"):
if pkg.is_actual_package and pkg.current_version:
if pkg.cpeid:
f.write(" <br/>%s <a href=\"https://nvd.nist.gov/products/cpe/search/results?namingFormat=2.3&keyword=%s\">(Search)</a>\n" % # noqa: E501
(pkg.status['cpe'][1], ":".join(pkg.cpeid.split(":")[0:5])))
f.write(f""" <br/>{pkg.status['cpe'][1]} <a href="https://nvd.nist.gov/products/cpe/search/results?"""
f"""namingFormat=2.3&keyword={":".join(pkg.cpeid.split(":")[0:5])}">(Search)</a>\n""")
else:
f.write(" %s <a href=\"https://nvd.nist.gov/products/cpe/search/results?namingFormat=2.3&keyword=%s\">(Search)</a>\n" % # noqa: E501
(pkg.status['cpe'][1], pkg.name))
f.write(f""" {pkg.status['cpe'][1]} <a href="https://nvd.nist.gov/products/cpe/search/results?"""
f"""namingFormat=2.3&keyword={pkg.name}">(Search)</a>\n""")
else:
f.write(" %s\n" % pkg.status['cpe'][1])
@@ -1121,33 +1121,33 @@ def dump_html_pkg(f, pkg):
def dump_html_all_pkgs(f, packages):
f.write("""
<div id=\"package-grid\">
<div style="grid-column: 1;" onclick="sortGrid(this.id)" id=\"package\"
class=\"package data label\"><span>Package</span><span></span></div>
<div style="grid-column: 2;" onclick="sortGrid(this.id)" id=\"patch_count\"
class=\"centered patch_count data label\"><span>Patch count</span><span></span></div>
<div style="grid-column: 3;" onclick="sortGrid(this.id)" id=\"infrastructure\"
class=\"centered infrastructure data label\">Infrastructure<span></span></div>
<div style="grid-column: 4;" onclick="sortGrid(this.id)" id=\"license\"
class=\"centered license data label\"><span>License</span><span></span></div>
<div style="grid-column: 5;" onclick="sortGrid(this.id)" id=\"license_files\"
class=\"centered license_files data label\"><span>License files</span><span></span></div>
<div style="grid-column: 6;" onclick="sortGrid(this.id)" id=\"hash_file\"
class=\"centered hash_file data label\"><span>Hash file</span><span></span></div>
<div style="grid-column: 7;" onclick="sortGrid(this.id)" id=\"current_version\"
class=\"centered current_version data label\"><span>Current version</span><span></span></div>
<div style="grid-column: 8;" onclick="sortGrid(this.id)" id=\"latest_version\"
class=\"centered latest_version data label\"><span>Latest version</span><span></span></div>
<div style="grid-column: 9;" onclick="sortGrid(this.id)" id=\"warnings\"
class=\"centered warnings data label\"><span>Warnings</span><span></span></div>
<div style="grid-column: 10;" onclick="sortGrid(this.id)" id=\"upstream_url\"
class=\"centered upstream_url data label\"><span>Upstream URL</span><span></span></div>
<div style="grid-column: 11;" onclick="sortGrid(this.id)" id=\"cves\"
class=\"centered cves data label\"><span>CVEs</span><span></span></div>
<div style="grid-column: 12;" onclick="sortGrid(this.id)" id=\"ignored_cves\"
class=\"centered ignored_cves data label\"><span>CVEs Ignored</span><span></span></div>
<div style="grid-column: 13;" onclick="sortGrid(this.id)" id=\"cpe_id\"
class=\"centered cpe_id data label\"><span>CPE ID</span><span></span></div>
<div id="package-grid">
<div style="grid-column: 1;" onclick="sortGrid(this.id)" id="package"
class="package data label"><span>Package</span><span></span></div>
<div style="grid-column: 2;" onclick="sortGrid(this.id)" id="patch_count"
class="centered patch_count data label"><span>Patch count</span><span></span></div>
<div style="grid-column: 3;" onclick="sortGrid(this.id)" id="infrastructure"
class="centered infrastructure data label">Infrastructure<span></span></div>
<div style="grid-column: 4;" onclick="sortGrid(this.id)" id="license"
class="centered license data label"><span>License</span><span></span></div>
<div style="grid-column: 5;" onclick="sortGrid(this.id)" id="license_files"
class="centered license_files data label"><span>License files</span><span></span></div>
<div style="grid-column: 6;" onclick="sortGrid(this.id)" id="hash_file"
class="centered hash_file data label"><span>Hash file</span><span></span></div>
<div style="grid-column: 7;" onclick="sortGrid(this.id)" id="current_version"
class="centered current_version data label"><span>Current version</span><span></span></div>
<div style="grid-column: 8;" onclick="sortGrid(this.id)" id="latest_version"
class="centered latest_version data label"><span>Latest version</span><span></span></div>
<div style="grid-column: 9;" onclick="sortGrid(this.id)" id="warnings"
class="centered warnings data label"><span>Warnings</span><span></span></div>
<div style="grid-column: 10;" onclick="sortGrid(this.id)" id="upstream_url"
class="centered upstream_url data label"><span>Upstream URL</span><span></span></div>
<div style="grid-column: 11;" onclick="sortGrid(this.id)" id="cves"
class="centered cves data label"><span>CVEs</span><span></span></div>
<div style="grid-column: 12;" onclick="sortGrid(this.id)" id="ignored_cves"
class="centered ignored_cves data label"><span>CVEs Ignored</span><span></span></div>
<div style="grid-column: 13;" onclick="sortGrid(this.id)" id="cpe_id"
class="centered cpe_id data label"><span>CPE ID</span><span></span></div>
""")
for pkg in sorted(packages):
dump_html_pkg(f, pkg)
@@ -1155,49 +1155,49 @@ def dump_html_all_pkgs(f, packages):
def dump_html_stats(f, stats):
f.write("<a id=\"results\"></a>\n")
f.write("<div class=\"data\" id=\"results-grid\">\n")
f.write('<a id="results"></a>\n')
f.write('<div class="data" id="results-grid">\n')
infras = [infra[6:] for infra in stats.keys() if infra.startswith("infra-")]
for infra in infras:
f.write(" <div class=\"data\">Packages using the <i>%s</i> infrastructure</div><div class=\"data\">%s</div>\n" %
f.write(' <div class="data">Packages using the <i>%s</i> infrastructure</div><div class="data">%s</div>\n' %
(infra, stats["infra-%s" % infra]))
f.write(" <div class=\"data\">Packages having license information</div><div class=\"data\">%s</div>\n" %
f.write(' <div class="data">Packages having license information</div><div class="data">%s</div>\n' %
stats["license"])
f.write(" <div class=\"data\">Packages not having license information</div><div class=\"data\">%s</div>\n" %
f.write(' <div class="data">Packages not having license information</div><div class="data">%s</div>\n' %
stats["no-license"])
f.write(" <div class=\"data\">Packages having license files information</div><div class=\"data\">%s</div>\n" %
f.write(' <div class="data">Packages having license files information</div><div class="data">%s</div>\n' %
stats["license-files"])
f.write(" <div class=\"data\">Packages not having license files information</div><div class=\"data\">%s</div>\n" %
f.write(' <div class="data">Packages not having license files information</div><div class="data">%s</div>\n' %
stats["no-license-files"])
f.write(" <div class=\"data\">Packages having a hash file</div><div class=\"data\">%s</div>\n" %
f.write(' <div class="data">Packages having a hash file</div><div class="data">%s</div>\n' %
stats["hash"])
f.write(" <div class=\"data\">Packages not having a hash file</div><div class=\"data\">%s</div>\n" %
f.write(' <div class="data">Packages not having a hash file</div><div class="data">%s</div>\n' %
stats["no-hash"])
f.write(" <div class=\"data\">Total number of patches</div><div class=\"data\">%s</div>\n" %
f.write(' <div class="data">Total number of patches</div><div class="data">%s</div>\n' %
stats["patches"])
f.write("<div class=\"data\">Packages having a mapping on <i>release-monitoring.org</i></div><div class=\"data\">%s</div>\n" %
f.write('<div class="data">Packages having a mapping on <i>release-monitoring.org</i></div><div class="data">%s</div>\n' %
stats["rmo-mapping"])
f.write("<div class=\"data\">Packages lacking a mapping on <i>release-monitoring.org</i></div><div class=\"data\">%s</div>\n" %
f.write('<div class="data">Packages lacking a mapping on <i>release-monitoring.org</i></div><div class="data">%s</div>\n' %
stats["rmo-no-mapping"])
f.write("<div class=\"data\">Packages that are up-to-date</div><div class=\"data\">%s</div>\n" %
f.write('<div class="data">Packages that are up-to-date</div><div class="data">%s</div>\n' %
stats["version-uptodate"])
f.write("<div class=\"data\">Packages that are not up-to-date</div><div class=\"data\">%s</div>\n" %
f.write('<div class="data">Packages that are not up-to-date</div><div class="data">%s</div>\n' %
stats["version-not-uptodate"])
f.write("<div class=\"data\">Packages with no known upstream version</div><div class=\"data\">%s</div>\n" %
f.write('<div class="data">Packages with no known upstream version</div><div class="data">%s</div>\n' %
stats["version-unknown"])
f.write("<div class=\"data\">Packages affected by CVEs</div><div class=\"data\">%s</div>\n" %
f.write('<div class="data">Packages affected by CVEs</div><div class="data">%s</div>\n' %
stats["pkg-cves"])
f.write("<div class=\"data\">Total number of CVEs affecting all packages</div><div class=\"data\">%s</div>\n" %
f.write('<div class="data">Total number of CVEs affecting all packages</div><div class="data">%s</div>\n' %
stats["total-cves"])
f.write("<div class=\"data\">Packages affected by unsure CVEs</div><div class=\"data\">%s</div>\n" %
f.write('<div class="data">Packages affected by unsure CVEs</div><div class="data">%s</div>\n' %
stats["pkg-unsure-cves"])
f.write("<div class=\"data\">Total number of unsure CVEs affecting all packages</div><div class=\"data\">%s</div>\n" %
f.write('<div class="data">Total number of unsure CVEs affecting all packages</div><div class="data">%s</div>\n' %
stats["total-unsure-cves"])
f.write("<div class=\"data\">Packages with CPE ID</div><div class=\"data\">%s</div>\n" %
f.write('<div class="data">Packages with CPE ID</div><div class="data">%s</div>\n' %
stats["cpe-id"])
f.write("<div class=\"data\">Packages without CPE ID</div><div class=\"data\">%s</div>\n" %
f.write('<div class="data">Packages without CPE ID</div><div class="data">%s</div>\n' %
stats["no-cpe-id"])
f.write("</div>\n")
f.write('</div>\n')
def dump_html_gen_info(f, date, commit):