Much better determination of possible updates. Also added codenames for

Debian and Mint.
This commit is contained in:
2018-03-10 15:40:59 +01:00
parent c5cc3234df
commit 706952b187
+125 -19
View File
@@ -1,20 +1,114 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import ansi
import os.path
import re
import sys
from typing import TypeVar
import requests
from aptsources.distro import get_distro
from aptsources.sourceslist import SourcesList
from typing import TypeVar
import ansi
codenames_okay = ["devel", "stable", "unstable", "beta", "preview", "testing", "syncthing"]
codenames_old = ["gutsy", "hardy", "intrepid", "jaunty", "karmic", "lucid", "maverick", "natty", "oneiric", "precise", "quantal", "raring", "saucy", "trusty", "utopic", "vivid", "wily"]
codenames = ["jessie", "xenial", "yakkety", "zesty", "stretch", "artful", "bionic", "squeeze"]
# If this codename is found on the repo, ignore it
codenames_ignore = ["devel"]
# If a PPA has one of these codenames, it is assumed to be fine this way
codenames_okay = ["devel", "stable", "unstable", "beta", "preview", "testing", "syncthing", "flightradar24", "./"]
releases = {
"Ubuntu": {
"2004-10-26": "warty",
"2005-04-08": "hoary",
"2005-10-12": "breezy",
"2006-06-01": "dapper",
"2006-10-26": "edgy",
"2007-04-19": "feisty",
"2007-10-18": "gutsy",
"2008-04-24": "hardy",
"2008-10-30": "intrepid",
"2009-04-23": "jaunty",
"2009-10-29": "karmic",
"2010-04-29": "lucid",
"2010-10-10": "maverick",
"2011-04-28": "natty",
"2011-10-13": "oneiric",
"2012-04-26": "precise",
"2012-10-18": "quantal",
"2013-04-25": "raring",
"2013-10-17": "saucy",
"2014-04-17": "trusty",
"2014-10-23": "utopic",
"2015-04-23": "vivid",
"2015-10-22": "wily",
"2016-04-21": "xenial",
"2016-10-13": "yakkety",
"2017-04-13": "zesty",
"2017-10-19": "artful",
"2018-04-30": "bionic"
},
"Debian": {
"2000-08-14": "potato",
"2002-07-19": "woody",
"2005-06-06": "sarge",
"2007-04-08": "etch",
"2009-02-14": "lenny",
"2011-02-06": "squeeze",
"2013-05-04": "wheezy",
"2015-04-26": "jessie",
"2017-06-17": "stretch",
"2019-06-30": "buster",
"2999-12-31": "sid" # unstable
},
"Mint": {
"2006-08-27": "ada",
"2006-11-13": "barbara",
"2006-12-20": "bea",
"2007-02-20": "bianca",
"2007-05-30": "cassandra",
"2007-09-24": "celena",
"2007-10-15": "daryna",
"2008-06-08": "elyssa",
"2008-12-15": "felicia",
"2009-05-26": "gloria",
"2009-11-28": "helena",
"2010-05-18": "isadora",
"2010-11-12": "julia",
"2011-05-26": "katya",
"2011-11-26": "lisa",
"2012-05-23": "maya",
"2012-11-20": "nadia",
"2013-05-29": "olivia",
"2013-11-30": "petra",
"2014-05-31": "qiana",
"2014-11-29": "rebecca",
"2015-06-30": "rafaela",
"2015-12-04": "rosa",
"2016-06-30": "sarah",
"2016-12-16": "serena",
"2017-07-02": "sonya",
"2017-11-27": "sylvia",
"2018-06-30": "tara"
}
}
codenames = []
all_dates = []
for dist in releases:
all_dates += releases[dist].keys()
all_dates = sorted(all_dates)
for date in all_dates:
for dist in releases:
if date in releases[dist]:
codenames += [releases[dist][date]]
codename = get_distro().codename
print("This is {}.".format(ansi.YELLOW + codename + ansi.RESET))
distro = get_distro().id
print("This is {} ({}).".format(ansi.YELLOW + codename + ansi.RESET, distro))
if codename not in codenames:
print("ERROR: Codename not found in database. Please update this tool!")
sys.exit(1)
print("Loading sources...", end="", flush=True)
@@ -22,7 +116,7 @@ valid_sources = 0
outdated_sources = 0
check_sources = []
for source in SourcesList():
if source.disabled or source.line=="\n":
if source.disabled or source.line == "\n":
continue
valid_sources += 1
#print(".", end="", flush=True)
@@ -43,10 +137,9 @@ BorL = TypeVar("BorL", bool, list)
fetch_cache = {}
def try_fetch_dirlisting(url: str) -> BorL:
global codenames_okay, codenames_old, codenames, fetch_cache
global codenames, fetch_cache
if url in fetch_cache:
return fetch_cache[url]
all_known_codenames = codenames_old + codenames
result = requests.get(url)
if result.status_code != 200:
fetch_cache[url] = False
@@ -56,27 +149,35 @@ def try_fetch_dirlisting(url: str) -> BorL:
for match in matches:
if match[0] != "?" and match[0] != "/" and match[-1:] == "/" and match != "../" and match[0:4] != "http":
valid_matches.append(match[0:-1])
elif match in all_known_codenames or match[0:-1] in all_known_codenames:
elif match in codenames or match[0:-1] in codenames:
valid_matches.append(match)
fetch_cache[url] = valid_matches
return fetch_cache[url]
def mutate_codename(current_codename: str, new_codename: str) -> str:
global codenames_okay, codenames_old, codenames
all_codenames = codenames_old + codenames
for cn in all_codenames:
global codenames
for cn in codenames:
if cn in current_codename:
return current_codename.replace(cn, new_codename)
return new_codename
probe_cache = {}
def get_probing_test_set(current_codename: str) -> list:
global codenames
for cn in codenames:
if cn in current_codename:
idx = codenames.index(cn)
return codenames[idx+1:]
# If nothing found, try 10 newest codenames
return codenames[-10:]
def try_url_probing(url: str, current_codename: str) -> list:
global codenames_okay, codenames_old, codenames, probe_cache
global probe_cache
cache_key = url + "|" + current_codename
if cache_key in probe_cache:
return probe_cache[cache_key]
test_set = codenames + codenames_okay
test_set = get_probing_test_set(current_codename)
valid_matches = []
for codename in test_set:
mcodename = mutate_codename(current_codename, codename)
@@ -92,13 +193,18 @@ def try_url_probing(url: str, current_codename: str) -> list:
probe_cache[cache_key] = valid_matches
return probe_cache[cache_key]
def is_better_match(found_codename: str, current_codename: str) -> bool:
global codenames
if found_codename in codenames:
return (codenames.index(found_codename) > codenames.index(current_codename))
else:
return (found_codename > current_codename)
def filter_better_matches(found_codenames: list, current_codename: str) -> list:
global codenames, codenames_okay, codenames_old
global codenames_ignore
better_codenames = []
for cn in found_codenames:
if cn > current_codename:
better_codenames.append(cn)
elif cn in codenames_okay:
if cn not in codenames_ignore and is_better_match(cn, current_codename):
better_codenames.append(cn)
return better_codenames