Author: agx
Date: 2016-04-09 18:44:35 +0000 (Sat, 09 Apr 2016)
New Revision: 40843

Added:
   bin/support-ended.py
Log:
Given a package allow to check in which releases security support has ended

By default we check if the package will be supported until the release
goes EOL:

  $ bin/support-ended.py --lists debian-security-support/ tomcat6
  Package unsupported in stretch
  Package unsupported in wheezy
  Package unsupported in jessie

but we can also check if it support ends within the next N days:

  # tomcat6 is marked as EOL for 2016-12-31
  $ bin/support-ended.py --lists debian-security-support/ tomcat6 --days 100
  <empty>
  $ bin/support-ended.py --lists debian-security-support/ tomcat6 --days 300
  Package unsupported in stretch
  Package unsupported in wheezy
  Package unsupported in jessie

Signed-off-by: Guido G?\195?\188nther <a...@sigxcpu.org>

Added: bin/support-ended.py
===================================================================
--- bin/support-ended.py                                (rev 0)
+++ bin/support-ended.py        2016-04-09 18:44:35 UTC (rev 40843)
@@ -0,0 +1,99 @@
+#!/usr/bin/python
+# vim: set fileencoding=utf-8 :
+#
+# Copyright 2016 Guido G�nther <a...@sigxcpu.org>
+#
+# This file is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 2 of the License, or
+# (at your option) any later version.
+#
+# This file is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this file.  If not, see <https://www.gnu.org/licenses/>.
+
+"""Check if and when support ended for a given package"""
+
+import argparse
+import datetime
+import glob
+import os
+import re
+import sys
+
+
+release_mapping = {
+    'deb6': ('squeeze', '2016-02-29'),
+    'deb7': ('wheezy',  '2018-05-31'),
+    # End date not yet fixed
+    'deb8': ('jessie',  '2020-04-30'),
+    # Not even released yet
+    'deb9': ('stretch', None),
+}
+
+
+SUPPORT_ENDED = 0  # security support ended in at least one suite
+SUPPORT_FULL  = 2  # fully supported in all known suites
+
+
+def relnum_to_relname(relnum):
+    return release_mapping[relnum][0]
+
+
+def release_eol(relnum):
+    eolstr = release_mapping[relnum][1]
+    return iso8601date_to_datetime(eolstr) if eolstr else None
+
+
+def iso8601date_to_datetime(datestr):
+    return datetime.datetime.strptime(datestr, "%Y-%m-%d")
+
+
+def find_releases(pkg, dir, days):
+    rels = []
+    pkg_re = 
re.compile(r"(?P<PKG>%s)\s+[^\s]+\s+(?P<EOL>[0-9]{4}-[0-9]{2}-[0-9]{2})" % pkg)
+    pattern = "security-support-ended.deb*"
+    lists = glob.glob(os.path.join(dir, pattern))
+    if not lists:
+        raise Exception("No lists matching %s found in %s", (pattern, dir))
+
+    end = datetime.datetime.today() + datetime.timedelta(days=days) if days 
else None
+
+    for fn in lists:
+        _, ext = os.path.splitext(fn)
+        rel = ext[1:]
+        sup_needed_til = end or release_eol(rel)
+        with open(fn) as f:
+            for line in f:
+                m = pkg_re.match(line)
+                if m:
+                    pkgeol = iso8601date_to_datetime(m.group("EOL"))
+                    if not sup_needed_til or pkgeol < sup_needed_til:
+                        rels.append(relnum_to_relname(rel))
+                    break
+    return rels
+
+
+def main():
+    parser = argparse.ArgumentParser(
+        description='Check if and when security support ended for a given 
package')
+    parser.add_argument('--lists',  help='Directory that contains the lists of 
unsupported packages ', default='.')
+    parser.add_argument('--days',  help='days of security support left, 0 == 
LTS Release end', type=int, default=0)
+    parser.add_argument('package', nargs=1, help='package to check')
+
+    args = parser.parse_args()
+
+    rels = find_releases(args.package[0], args.lists, args.days)
+    if rels:
+        for rel in rels:
+            print("Package unsupported in %s" % rel)
+    else:
+        return SUPPORT_FULL
+    return SUPPORT_ENDED
+
+if __name__ == '__main__':
+    sys.exit(main())


Property changes on: bin/support-ended.py
___________________________________________________________________
Added: svn:executable
   + *


_______________________________________________
Secure-testing-commits mailing list
Secure-testing-commits@lists.alioth.debian.org
http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/secure-testing-commits

Reply via email to