summaryrefslogtreecommitdiffstats
path: root/bin/reproducible_common.py
diff options
context:
space:
mode:
Diffstat (limited to 'bin/reproducible_common.py')
-rwxr-xr-xbin/reproducible_common.py191
1 files changed, 191 insertions, 0 deletions
diff --git a/bin/reproducible_common.py b/bin/reproducible_common.py
new file mode 100755
index 00000000..0df8cdaf
--- /dev/null
+++ b/bin/reproducible_common.py
@@ -0,0 +1,191 @@
+#!/usr/bin/python3
+# -*- coding: utf-8 -*-
+
+# clean-notes: sort and clean the notes stored in notes.git
+# Copyright © 2015 Mattia Rizzolo <mattia@mapreri.org>
+# Licensed under GPL-2+
+#
+# Depends: python3
+
+import os
+import re
+import sys
+import sqlite3
+import logging
+import argparse
+import datetime
+from string import Template
+
+DEBUG = False
+QUIET = False
+
+BIN_PATH = '/srv/jenkins/bin'
+BASE = '/var/lib/jenkins'
+
+REPRODUCIBLE_DB = BASE + '/userContent/reproducible.db'
+REPRODUCIBLE_JSON = BASE + '/userContent/reproducible.json'
+
+NOTES_URI = '/userContent/notes'
+ISSUES_URI = '/userContent/issues'
+RB_PKG_URI = '/usrtContent/rb-pkg'
+NOTES_PATH = BASE + NOTES_URI
+ISSUES_PATH = BASE + ISSUES_URI
+RB_PKG_PATH = BASE + RB_PKG_URI
+
+REPRODUCIBLE_URL = 'https://reproducible.debian.net'
+JENKINS_URL = 'https://jenkins.debian.net'
+
+parser = argparse.ArgumentParser()
+group = parser.add_mutually_exclusive_group()
+group.add_argument("-d", "--debug", action="store_true")
+group.add_argument("-q", "--quiet", action="store_true")
+args = parser.parse_args()
+log_level = logging.INFO
+if args.debug or DEBUG:
+ log_level = logging.DEBUG
+if args.quiet or QUIET:
+ log_level = logging.ERROR
+logging.basicConfig(level=log_level)
+
+logging.debug("BIN_PATH:\t" + BIN_PATH)
+logging.debug("BASE:\t" + BASE)
+logging.debug("NOTES_URI:\t" + NOTES_URI)
+logging.debug("ISSUES_URI:\t" + ISSUES_URI)
+logging.debug("NOTES_PATH:\t" + NOTES_PATH)
+logging.debug("ISSUES_PATH:\t" + ISSUES_PATH)
+logging.debug("RB_PKG_URI:\t" + RB_PKG_URI)
+logging.debug("RB_PKG_PATH:\t" + RB_PKG_PATH)
+logging.debug("REPRODUCIBLE_DB:\t" + REPRODUCIBLE_DB)
+logging.debug("REPRODUCIBLE_JSON:\t" + REPRODUCIBLE_JSON)
+logging.debug("JENKINS_URL:\t\t" + JENKINS_URL)
+logging.debug("REPRODUCIBLE_URL:\t" + REPRODUCIBLE_URL)
+
+html_header = Template("""<!DOCTYPE html>
+<html>\n<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+<link href="/userContent/static/style.css" type="text/css" rel="stylesheet" />
+<title>$page_title</title>\n</head>
+<body>
+""")
+html_footer = Template("""<hr /><p style="font-size:0.9em;">There is more
+information <a href="%s/userContent/about.html">about jenkins.debian.net</a>
+and about <a href="https://wiki.debian.org/ReproducibleBuilds"> reproducible
+builds of Debian</a> available elsewhere. Last update: $date.
+Copyright 2014-%s <a href="mailto:holger@layer-acht.org">Holger Levsen</a>,
+GPL-2 licensed. The weather icons are public domain and have been taken from
+the <a href=http://tango.freedesktop.org/Tango_Icon_Library target=_blank>Tango
+Icon Library</a>.</p>
+</body></html>""" % (JENKINS_URL, datetime.datetime.now().strftime('%Y')))
+
+html_head_page = Template("""<header>
+<h2>$page_title</h2>
+<p>$count_total packages have been attempted to be build so far, that's
+$percent_total% of $amount source packages in Debian sid
+currently. Out of these, $count_good packagea ($percent_good%)
+<a href="https://wiki.debian.org/ReproducibleBuilds">could be built
+reproducible!</a></p>
+<ul>
+ <li>Have a look at:</li>
+ <li>
+ <a href="/userContent/index_reproducible.html" target="_parent">
+ <img src="/userContent/static/weather-clear.png"
+ alt="reproducible icon" /></a>
+ </li>
+ <li>
+ <a href="/userContent/index_FTBR_with_buildinfo.html" target="_parent">
+ <img src="/userContent/static/weather-showers-scattered.png"
+ alt="FTBR_with_buildinfo icon" /></a>
+ </li>
+ <li>
+ <a href="/userContent/index_FTBR.html" target="_parent">
+ <img src="/userContent/static/weather-showers.png" alt="FTBR icon" />
+ </a>
+ </li>
+ <li>
+ <a href="/userContent/index_FTBFS.html" target="_parent">
+ <img src="/userContent/static/weather-storm.png" alt="FTBFS icon" />
+ </a>
+ </li>
+ <li>
+ <a href="/userContent/index_404.html" target="_parent">
+ <img src="/userContent/static/weather-severe-alert.png"
+ alt="404 icon" /></a>
+ </li>
+ <li>
+ <a href="/userContent/index_not_for_us.html" target="_parent">
+ <img src="/userContent/static/weather-few-clouds-night.png"
+ alt="not_for_us icon" /></a>
+ </li>
+ <li>
+ <a href="/userContent/index_blacklisted.html" target="_parent">
+ <img src="/userContent/static/error.png" alt="blacklisted icon" />
+ </a>
+ </li>
+ <li><a href="/userContent/index_issues.html">issues</a></li
+ <li><li><a href="/userContent/index_notes.html">packages with notes</a></li></li>
+ <li><a href="/userContent/index_scheduled.html">currently scheduled</a></li>
+ <li><a href="/userContent/index_last_24h.html">packages tested in the last
+ 24h</a></li>
+ <li><a href="/userContent/index_last_48h.html">packages tested in the last
+ 48h</a></li>
+ <li><a href="/userContent/index_all_abc.html">all tested packages (sorted
+ alphabetically)</a></li>
+ <li><a href="/userContent/index_dd-list.html">maintainers of unreproducible
+ packages</a></li>
+ <li><a href="/userContent/index_stats.html">stats</a></li>
+ <li><a href="/userContent/index_pkg_sets.html">package sets stats</a></li>
+</ul></header>""")
+
+html_foot_page = Template("""
+<p style="font-size:0.9em;">A package name displayed with a bold font is an
+indication that this package has a note. Visited packages are linked in green,
+those which have not been visited are linked in blue.</p>""")
+
+
+url2html = re.compile(r'((mailto\:|((ht|f)tps?)\://|file\:///){1}\S+)')
+
+
+def write_html_page(title, body, destfile, noheader=False, nofooter=False):
+ now = datetime.datetime.utcnow().strftime('%Y-%m-%d %H:%M UTC')
+ html = ''
+ html += html_header.substitute(page_title=title)
+ if not noheader:
+ html += html_head_page.substitute(
+ page_title=title,
+ count_total=count_total,
+ amount=amount,
+ percent_total=percent_total,
+ count_good=count_good,
+ percent_good=percent_good)
+ html += body
+ if not nofooter:
+ html += html_foot_page.substitute()
+ html += html_footer.substitute(date=now)
+ os.makedirs(destfile.rsplit('/', 1)[0], exist_ok=True)
+ with open(destfile, 'w') as fd:
+ fd.write(html)
+
+def init_conn():
+ return sqlite3.connect(REPRODUCIBLE_DB)
+
+def query_db(query):
+ cursor = conn.cursor()
+ cursor.execute(query)
+ return cursor.fetchall()
+
+# do the db querying
+conn = init_conn()
+amount = int(query_db('SELECT count(name) FROM sources')[0][0])
+count_total = int(query_db('SELECT COUNT(name) FROM source_packages')[0][0])
+count_good = int(query_db(
+ 'SELECT COUNT(name) FROM source_packages WHERE status="reproducible"')[0][0])
+percent_total = round(((count_total/amount)*100), 2)
+percent_good = round(((count_good/count_total)*100), 2)
+logging.info('Total packages in Sid:\t' + str(amount))
+logging.info('Total tested packages:\t' + str(count_total))
+logging.info('Total reproducible packages:\t' + str(count_good))
+logging.info('That means that out of the ' + str(percent_total) + '% of ' +
+ 'the Sid tested packages the ' + str(percent_good) + '% are ' +
+ 'reproducible!')
+
+