2018-08-25 22:19:09 +00:00
|
|
|
#!/usr/bin/python3
|
2008-05-01 07:54:28 +00:00
|
|
|
|
|
|
|
import sys
|
2012-01-11 17:00:17 +00:00
|
|
|
import optparse
|
|
|
|
import os
|
|
|
|
import shutil
|
|
|
|
import tempfile
|
2014-01-01 13:11:15 +00:00
|
|
|
|
2017-01-07 17:33:17 +00:00
|
|
|
from urllib.request import urlopen
|
|
|
|
from urllib.error import HTTPError
|
2012-01-11 17:00:17 +00:00
|
|
|
|
2009-07-17 14:07:05 +00:00
|
|
|
from debian_linux.abi import Symbols
|
2018-10-01 20:45:35 +00:00
|
|
|
from debian_linux.config import ConfigCoreDump
|
|
|
|
from debian_linux.debian import Changelog, VersionLinux
|
2008-05-01 07:54:28 +00:00
|
|
|
|
2019-03-18 23:10:40 +00:00
|
|
|
default_url_base = "https://deb.debian.org/debian/"
|
|
|
|
default_url_base_incoming = "https://incoming.debian.org/debian-buildd/"
|
|
|
|
default_url_base_ports = "https://deb.debian.org/debian-ports/"
|
|
|
|
default_url_base_ports_incoming = "https://incoming.ports.debian.org/"
|
|
|
|
default_url_base_security = "https://deb.debian.org/debian-security/"
|
2008-05-01 07:54:28 +00:00
|
|
|
|
2012-01-11 17:00:17 +00:00
|
|
|
|
2008-05-01 07:54:28 +00:00
|
|
|
class url_debian_flat(object):
|
|
|
|
def __init__(self, base):
|
|
|
|
self.base = base
|
|
|
|
|
2012-01-26 05:27:39 +00:00
|
|
|
def __call__(self, source, filename, arch):
|
2008-05-01 07:54:28 +00:00
|
|
|
return self.base + filename
|
|
|
|
|
2012-01-11 17:00:17 +00:00
|
|
|
|
2008-05-01 07:54:28 +00:00
|
|
|
class url_debian_pool(object):
|
|
|
|
def __init__(self, base):
|
|
|
|
self.base = base
|
|
|
|
|
2012-01-26 05:27:39 +00:00
|
|
|
def __call__(self, source, filename, arch):
|
2018-12-28 15:27:54 +00:00
|
|
|
return (self.base + "pool/main/" + source[0] + "/" + source + "/"
|
|
|
|
+ filename)
|
2008-05-01 07:54:28 +00:00
|
|
|
|
2012-01-11 17:00:17 +00:00
|
|
|
|
2012-01-26 05:27:39 +00:00
|
|
|
class url_debian_ports_pool(url_debian_pool):
|
|
|
|
def __call__(self, source, filename, arch):
|
|
|
|
if arch == 'all':
|
2012-01-27 03:52:10 +00:00
|
|
|
return url_debian_pool.__call__(self, source, filename, arch)
|
2018-12-28 15:27:54 +00:00
|
|
|
return (self.base + "pool-" + arch + "/main/" + source[0] + "/"
|
|
|
|
+ source + "/" + filename)
|
2012-01-26 05:27:39 +00:00
|
|
|
|
|
|
|
|
2018-01-12 02:33:17 +00:00
|
|
|
class url_debian_security_pool(url_debian_pool):
|
|
|
|
def __call__(self, source, filename, arch):
|
2018-12-28 15:27:54 +00:00
|
|
|
return (self.base + "pool/updates/main/" + source[0] + "/" + source
|
|
|
|
+ "/" + filename)
|
2018-01-12 02:33:17 +00:00
|
|
|
|
|
|
|
|
2012-01-11 17:00:17 +00:00
|
|
|
class Main(object):
|
2008-05-01 07:54:28 +00:00
|
|
|
dir = None
|
|
|
|
|
2019-03-18 22:49:29 +00:00
|
|
|
def __init__(self, arch=None, featureset=None, flavour=None):
|
2008-05-01 07:54:28 +00:00
|
|
|
self.log = sys.stdout.write
|
|
|
|
|
|
|
|
self.override_arch = arch
|
|
|
|
self.override_featureset = featureset
|
|
|
|
self.override_flavour = flavour
|
|
|
|
|
2012-01-11 17:00:17 +00:00
|
|
|
changelog = Changelog(version=VersionLinux)
|
2008-05-01 07:54:28 +00:00
|
|
|
while changelog[0].distribution == 'UNRELEASED':
|
|
|
|
changelog.pop(0)
|
|
|
|
changelog = changelog[0]
|
|
|
|
|
|
|
|
self.source = changelog.source
|
|
|
|
self.version = changelog.version.linux_version
|
|
|
|
self.version_source = changelog.version.complete
|
|
|
|
|
2019-03-18 22:49:29 +00:00
|
|
|
if changelog.distribution.endswith('-security'):
|
|
|
|
self.urls = [url_base_security]
|
|
|
|
else:
|
|
|
|
self.urls = [url_base, url_base_ports,
|
|
|
|
url_base_incoming, url_base_ports_incoming]
|
|
|
|
|
2018-10-01 15:22:49 +00:00
|
|
|
self.config = ConfigCoreDump(fp=open("debian/config.defines.dump",
|
|
|
|
"rb"))
|
2008-05-01 07:54:28 +00:00
|
|
|
|
2014-12-15 22:01:58 +00:00
|
|
|
self.version_abi = self.config['version', ]['abiname']
|
2008-05-01 07:54:28 +00:00
|
|
|
|
|
|
|
def __call__(self):
|
2012-01-11 17:00:17 +00:00
|
|
|
self.dir = tempfile.mkdtemp(prefix='abiupdate')
|
2008-05-01 07:54:28 +00:00
|
|
|
try:
|
2012-01-27 03:53:03 +00:00
|
|
|
self.log("Retrieve config\n")
|
2012-03-12 22:09:20 +00:00
|
|
|
|
|
|
|
try:
|
|
|
|
config = self.get_config()
|
2014-01-01 13:11:15 +00:00
|
|
|
except HTTPError as e:
|
2012-03-12 22:09:20 +00:00
|
|
|
self.log("Failed to retrieve %s: %s\n" % (e.filename, e))
|
|
|
|
sys.exit(1)
|
|
|
|
|
2008-05-01 07:54:28 +00:00
|
|
|
if self.override_arch:
|
|
|
|
arches = [self.override_arch]
|
|
|
|
else:
|
|
|
|
arches = config[('base',)]['arches']
|
|
|
|
for arch in arches:
|
|
|
|
self.update_arch(config, arch)
|
|
|
|
finally:
|
|
|
|
shutil.rmtree(self.dir)
|
|
|
|
|
|
|
|
def extract_package(self, filename, base):
|
|
|
|
base_out = self.dir + "/" + base
|
|
|
|
os.mkdir(base_out)
|
|
|
|
os.system("dpkg-deb --extract %s %s" % (filename, base_out))
|
|
|
|
return base_out
|
|
|
|
|
|
|
|
def get_abi(self, arch, prefix):
|
2014-12-15 22:01:58 +00:00
|
|
|
try:
|
2018-12-28 15:27:54 +00:00
|
|
|
version_abi = (self.config[('version',)]['abiname_base'] + '-'
|
|
|
|
+ self.config['abi', arch]['abiname'])
|
2014-12-15 22:01:58 +00:00
|
|
|
except KeyError:
|
|
|
|
version_abi = self.version_abi
|
2018-10-01 15:22:49 +00:00
|
|
|
filename = ("linux-headers-%s-%s_%s_%s.deb" %
|
|
|
|
(version_abi, prefix, self.version_source, arch))
|
2019-03-18 22:49:29 +00:00
|
|
|
f = self.retrieve_package(filename, arch)
|
2008-05-01 07:54:28 +00:00
|
|
|
d = self.extract_package(f, "linux-headers-%s_%s" % (prefix, arch))
|
2018-10-01 15:22:49 +00:00
|
|
|
f1 = d + ("/usr/src/linux-headers-%s-%s/Module.symvers" %
|
|
|
|
(version_abi, prefix))
|
2009-11-17 01:18:56 +00:00
|
|
|
s = Symbols(open(f1))
|
2008-05-01 07:54:28 +00:00
|
|
|
shutil.rmtree(d)
|
2014-12-15 22:01:58 +00:00
|
|
|
return version_abi, s
|
2008-05-01 07:54:28 +00:00
|
|
|
|
|
|
|
def get_config(self):
|
2017-01-07 17:42:39 +00:00
|
|
|
# XXX We used to fetch the previous version of linux-support here,
|
|
|
|
# but until we authenticate downloads we should not do that as
|
|
|
|
# pickle.load allows running arbitrary code.
|
|
|
|
return self.config
|
2008-05-01 07:54:28 +00:00
|
|
|
|
2019-03-18 22:49:29 +00:00
|
|
|
def retrieve_package(self, filename, arch):
|
|
|
|
for i, url in enumerate(self.urls):
|
|
|
|
u = url(self.source, filename, arch)
|
|
|
|
filename_out = self.dir + "/" + filename
|
2009-07-17 14:07:05 +00:00
|
|
|
|
2019-03-18 22:49:29 +00:00
|
|
|
try:
|
|
|
|
f_in = urlopen(u)
|
|
|
|
except HTTPError as e:
|
|
|
|
if i == len(self.urls) - 1:
|
|
|
|
# No more URLs to try
|
|
|
|
raise
|
|
|
|
else:
|
|
|
|
continue
|
|
|
|
|
|
|
|
f_out = open(filename_out, 'wb')
|
|
|
|
while 1:
|
|
|
|
r = f_in.read()
|
|
|
|
if not r:
|
|
|
|
break
|
|
|
|
f_out.write(r)
|
|
|
|
return filename_out
|
2008-05-01 07:54:28 +00:00
|
|
|
|
2014-12-15 22:01:58 +00:00
|
|
|
def save_abi(self, version_abi, symbols, arch, featureset, flavour):
|
|
|
|
dir = "debian/abi/%s" % version_abi
|
2008-05-01 07:54:28 +00:00
|
|
|
if not os.path.exists(dir):
|
|
|
|
os.makedirs(dir)
|
|
|
|
out = "%s/%s_%s_%s" % (dir, arch, featureset, flavour)
|
2009-11-17 01:18:56 +00:00
|
|
|
symbols.write(open(out, 'w'))
|
2008-05-01 07:54:28 +00:00
|
|
|
|
|
|
|
def update_arch(self, config, arch):
|
|
|
|
if self.override_featureset:
|
|
|
|
featuresets = [self.override_featureset]
|
|
|
|
else:
|
|
|
|
featuresets = config[('base', arch)]['featuresets']
|
|
|
|
for featureset in featuresets:
|
|
|
|
self.update_featureset(config, arch, featureset)
|
|
|
|
|
|
|
|
def update_featureset(self, config, arch, featureset):
|
|
|
|
config_base = config.merge('base', arch, featureset)
|
|
|
|
|
|
|
|
if not config_base.get('enabled', True):
|
|
|
|
return
|
|
|
|
|
|
|
|
if self.override_flavour:
|
|
|
|
flavours = [self.override_flavour]
|
|
|
|
else:
|
|
|
|
flavours = config_base['flavours']
|
|
|
|
for flavour in flavours:
|
|
|
|
self.update_flavour(config, arch, featureset, flavour)
|
|
|
|
|
|
|
|
def update_flavour(self, config, arch, featureset, flavour):
|
2018-10-01 15:22:49 +00:00
|
|
|
self.log("Updating ABI for arch %s, featureset %s, flavour %s: " %
|
|
|
|
(arch, featureset, flavour))
|
2008-05-01 07:54:28 +00:00
|
|
|
try:
|
|
|
|
if featureset == 'none':
|
|
|
|
localversion = flavour
|
|
|
|
else:
|
|
|
|
localversion = featureset + '-' + flavour
|
|
|
|
|
2014-12-15 22:01:58 +00:00
|
|
|
version_abi, abi = self.get_abi(arch, localversion)
|
|
|
|
self.save_abi(version_abi, abi, arch, featureset, flavour)
|
2008-05-01 07:54:28 +00:00
|
|
|
self.log("Ok.\n")
|
2014-01-01 13:11:15 +00:00
|
|
|
except HTTPError as e:
|
2009-11-17 01:18:56 +00:00
|
|
|
self.log("Failed to retrieve %s: %s\n" % (e.filename, e))
|
2014-01-01 13:11:15 +00:00
|
|
|
except Exception:
|
2009-11-17 01:18:56 +00:00
|
|
|
self.log("FAILED!\n")
|
|
|
|
import traceback
|
|
|
|
traceback.print_exc(None, sys.stdout)
|
2008-05-01 07:54:28 +00:00
|
|
|
|
2018-10-01 15:22:49 +00:00
|
|
|
|
2008-05-01 07:54:28 +00:00
|
|
|
if __name__ == '__main__':
|
|
|
|
options = optparse.OptionParser()
|
2018-10-01 15:22:49 +00:00
|
|
|
options.add_option("-u", "--url-base", dest="url_base",
|
|
|
|
default=default_url_base)
|
|
|
|
options.add_option("--url-base-incoming", dest="url_base_incoming",
|
|
|
|
default=default_url_base_incoming)
|
|
|
|
options.add_option("--url-base-ports", dest="url_base_ports",
|
|
|
|
default=default_url_base_ports)
|
|
|
|
options.add_option("--url-base-ports-incoming",
|
|
|
|
dest="url_base_ports_incoming",
|
|
|
|
default=default_url_base_ports_incoming)
|
|
|
|
options.add_option("--url-base-security", dest="url_base_security",
|
|
|
|
default=default_url_base_security)
|
2008-05-01 07:54:28 +00:00
|
|
|
|
|
|
|
opts, args = options.parse_args()
|
|
|
|
|
|
|
|
kw = {}
|
|
|
|
if len(args) >= 1:
|
2012-01-11 17:00:17 +00:00
|
|
|
kw['arch'] = args[0]
|
2008-05-01 07:54:28 +00:00
|
|
|
if len(args) >= 2:
|
2012-01-11 17:00:17 +00:00
|
|
|
kw['featureset'] = args[1]
|
2008-05-01 07:54:28 +00:00
|
|
|
if len(args) >= 3:
|
2012-01-11 17:00:17 +00:00
|
|
|
kw['flavour'] = args[2]
|
2008-05-01 07:54:28 +00:00
|
|
|
|
|
|
|
url_base = url_debian_pool(opts.url_base)
|
2017-01-07 17:49:55 +00:00
|
|
|
url_base_incoming = url_debian_pool(opts.url_base_incoming)
|
2012-01-26 05:27:39 +00:00
|
|
|
url_base_ports = url_debian_ports_pool(opts.url_base_ports)
|
2017-01-07 18:00:21 +00:00
|
|
|
url_base_ports_incoming = url_debian_flat(opts.url_base_ports_incoming)
|
2018-01-12 02:33:17 +00:00
|
|
|
url_base_security = url_debian_security_pool(opts.url_base_security)
|
2008-05-01 07:54:28 +00:00
|
|
|
|
2019-03-18 22:49:29 +00:00
|
|
|
Main(**kw)()
|