2007-09-10 10:40:50 +00:00
|
|
|
#!/usr/bin/env python
|
2006-07-13 10:54:20 +00:00
|
|
|
|
|
|
|
import sys
|
|
|
|
sys.path.append(sys.path[0] + "/../lib/python")
|
|
|
|
|
2007-07-11 12:27:16 +00:00
|
|
|
import optparse, os, shutil, tempfile, urllib2
|
2006-07-13 10:54:20 +00:00
|
|
|
from debian_linux.abi import *
|
|
|
|
from debian_linux.config import *
|
|
|
|
from debian_linux.debian import *
|
|
|
|
|
2006-11-08 10:49:56 +00:00
|
|
|
default_url_base = "http://ftp.de.debian.org/debian/"
|
|
|
|
default_url_base_incoming = "http://incoming.debian.org/"
|
|
|
|
|
|
|
|
class url_debian_flat(object):
|
|
|
|
def __init__(self, base):
|
|
|
|
self.base = base
|
|
|
|
|
|
|
|
def __call__(self, source, filename):
|
|
|
|
return self.base + filename
|
|
|
|
|
|
|
|
class url_debian_pool(object):
|
|
|
|
def __init__(self, base):
|
|
|
|
self.base = base
|
|
|
|
|
|
|
|
def __call__(self, source, filename):
|
|
|
|
return self.base + "pool/main/" + source[0] + "/" + source + "/" + filename
|
2006-07-13 10:54:20 +00:00
|
|
|
|
|
|
|
class main(object):
|
|
|
|
dir = None
|
|
|
|
|
2007-10-14 00:35:40 +00:00
|
|
|
def __init__(self, url, url_config = None, arch = None, featureset = None, flavour = None):
|
2006-07-15 15:18:20 +00:00
|
|
|
self.log = sys.stdout.write
|
2006-07-13 10:54:20 +00:00
|
|
|
|
2006-11-08 10:49:56 +00:00
|
|
|
self.url = self.url_config = url
|
|
|
|
if url_config is not None:
|
|
|
|
self.url_config = url_config
|
|
|
|
self.override_arch = arch
|
2007-10-14 00:35:40 +00:00
|
|
|
self.override_featureset = featureset
|
2006-11-08 10:49:56 +00:00
|
|
|
self.override_flavour = flavour
|
2006-07-13 10:54:20 +00:00
|
|
|
|
2007-04-24 07:01:08 +00:00
|
|
|
changelog = Changelog(version = VersionLinux)
|
|
|
|
while changelog[0].distribution == 'UNRELEASED':
|
2006-07-15 15:27:53 +00:00
|
|
|
changelog.pop(0)
|
|
|
|
changelog = changelog[0]
|
|
|
|
|
2007-04-24 07:01:08 +00:00
|
|
|
self.source = changelog.source
|
|
|
|
self.version = changelog.version.linux_version
|
|
|
|
self.version_source = changelog.version.complete
|
2006-07-15 15:27:53 +00:00
|
|
|
|
2007-10-14 14:29:07 +00:00
|
|
|
local_config = ConfigCoreDump(fp = file("debian/config.defines.dump"))
|
2006-08-29 09:53:31 +00:00
|
|
|
|
2008-01-26 09:57:03 +00:00
|
|
|
self.version_abi = self.version + '-' + local_config['abi',]['abiname']
|
2006-07-15 15:27:53 +00:00
|
|
|
|
2006-07-13 10:54:20 +00:00
|
|
|
def __call__(self):
|
|
|
|
self.dir = tempfile.mkdtemp(prefix = 'abiupdate')
|
|
|
|
try:
|
2006-07-15 15:18:20 +00:00
|
|
|
self.log("Retreive config\n")
|
2006-07-13 10:54:20 +00:00
|
|
|
config = self.get_config()
|
|
|
|
if self.override_arch:
|
|
|
|
arches = [self.override_arch]
|
|
|
|
else:
|
|
|
|
arches = config[('base',)]['arches']
|
|
|
|
for arch in arches:
|
|
|
|
self.update_arch(config, arch)
|
|
|
|
finally:
|
2007-07-11 12:27:16 +00:00
|
|
|
shutil.rmtree(self.dir)
|
|
|
|
|
|
|
|
def extract_package(self, filename, base):
|
2006-07-13 10:54:20 +00:00
|
|
|
base_out = self.dir + "/" + base
|
|
|
|
os.mkdir(base_out)
|
|
|
|
os.system("dpkg-deb --extract %s %s" % (filename, base_out))
|
|
|
|
return base_out
|
|
|
|
|
2007-10-14 14:29:07 +00:00
|
|
|
def get_abi(self, arch, prefix):
|
2006-07-13 10:54:20 +00:00
|
|
|
filename = "linux-headers-%s-%s_%s_%s.deb" % (self.version_abi, prefix, self.version_source, arch)
|
2006-11-08 10:49:56 +00:00
|
|
|
f = self.retrieve_package(self.url, filename)
|
2007-07-11 12:27:16 +00:00
|
|
|
d = self.extract_package(f, "linux-headers-%s_%s" % (prefix, arch))
|
2006-07-13 10:54:20 +00:00
|
|
|
f1 = d + "/usr/src/linux-headers-%s-%s/Module.symvers" % (self.version_abi, prefix)
|
|
|
|
s = symbols(f1)
|
2007-07-11 12:27:16 +00:00
|
|
|
shutil.rmtree(d)
|
2006-07-13 10:54:20 +00:00
|
|
|
return s
|
|
|
|
|
|
|
|
def get_config(self):
|
|
|
|
filename = "linux-support-%s_%s_all.deb" % (self.version_abi, self.version_source)
|
2006-11-08 10:49:56 +00:00
|
|
|
f = self.retrieve_package(self.url_config, filename)
|
2007-07-11 12:27:16 +00:00
|
|
|
d = self.extract_package(f, "linux-support")
|
2007-10-14 14:29:07 +00:00
|
|
|
c = d + "/usr/src/linux-support-" + self.version_abi + "/config.defines.dump"
|
|
|
|
config = ConfigCoreDump(fp = file(c))
|
2007-07-11 12:27:16 +00:00
|
|
|
shutil.rmtree(d)
|
2006-07-13 10:54:20 +00:00
|
|
|
return config
|
|
|
|
|
2006-11-08 10:49:56 +00:00
|
|
|
def retrieve_package(self, url, filename):
|
|
|
|
u = url(self.source, filename)
|
2006-07-13 10:54:20 +00:00
|
|
|
filename_out = self.dir + "/" + filename
|
2006-11-08 10:49:56 +00:00
|
|
|
f_in = urllib2.urlopen(u)
|
2006-07-13 10:54:20 +00:00
|
|
|
f_out = file(filename_out, 'w')
|
|
|
|
while 1:
|
|
|
|
r = f_in.read()
|
|
|
|
if not r:
|
|
|
|
break
|
|
|
|
f_out.write(r)
|
|
|
|
return filename_out
|
|
|
|
|
2007-10-14 00:35:40 +00:00
|
|
|
def save_abi(self, symbols, arch, featureset, flavour):
|
2008-01-26 09:57:03 +00:00
|
|
|
dir = "debian/abi/%s" % self.version_abi
|
2007-10-14 00:53:38 +00:00
|
|
|
if not os.path.exists(dir):
|
|
|
|
os.makedirs(dir)
|
|
|
|
out = "%s/%s_%s_%s" % (dir, arch, featureset, flavour)
|
2006-07-13 10:54:20 +00:00
|
|
|
symbols.write(file(out, 'w'))
|
|
|
|
|
|
|
|
def update_arch(self, config, arch):
|
2007-10-14 00:35:40 +00:00
|
|
|
if self.override_featureset:
|
|
|
|
featuresets = [self.override_featureset]
|
2006-07-13 10:54:20 +00:00
|
|
|
else:
|
2007-10-14 00:35:40 +00:00
|
|
|
featuresets = config[('base', arch)]['featuresets']
|
|
|
|
for featureset in featuresets:
|
|
|
|
self.update_featureset(config, arch, featureset)
|
2006-07-13 10:54:20 +00:00
|
|
|
|
2007-10-14 00:35:40 +00:00
|
|
|
def update_featureset(self, config, arch, featureset):
|
2007-10-14 14:29:07 +00:00
|
|
|
config_base = config.merge('base', arch, featureset)
|
|
|
|
|
|
|
|
if not config_base.get('enabled', True):
|
2006-07-13 10:54:20 +00:00
|
|
|
return
|
2007-10-14 14:29:07 +00:00
|
|
|
|
2006-07-13 10:54:20 +00:00
|
|
|
if self.override_flavour:
|
|
|
|
flavours = [self.override_flavour]
|
|
|
|
else:
|
2007-10-14 14:29:07 +00:00
|
|
|
flavours = config_base['flavours']
|
2006-07-13 10:54:20 +00:00
|
|
|
for flavour in flavours:
|
2007-10-14 00:35:40 +00:00
|
|
|
self.update_flavour(config, arch, featureset, flavour)
|
2006-07-13 10:54:20 +00:00
|
|
|
|
2007-10-14 00:35:40 +00:00
|
|
|
def update_flavour(self, config, arch, featureset, flavour):
|
2007-10-14 14:29:07 +00:00
|
|
|
config_base = config.merge('base', arch, featureset, flavour)
|
|
|
|
|
|
|
|
if not config_base.get('modules', True):
|
2006-07-13 10:54:20 +00:00
|
|
|
return
|
2007-10-14 14:29:07 +00:00
|
|
|
|
2007-10-14 00:35:40 +00:00
|
|
|
self.log("Updating ABI for arch %s, featureset %s, flavour %s: " % (arch, featureset, flavour))
|
2006-07-13 10:54:20 +00:00
|
|
|
try:
|
2007-10-14 14:29:07 +00:00
|
|
|
if featureset == 'none':
|
|
|
|
localversion = flavour
|
|
|
|
else:
|
|
|
|
localversion = featureset + '-' + flavour
|
|
|
|
|
|
|
|
abi = self.get_abi(arch, localversion)
|
2007-10-14 00:35:40 +00:00
|
|
|
self.save_abi(abi, arch, featureset, flavour)
|
2006-07-15 15:18:20 +00:00
|
|
|
self.log("Ok.\n")
|
2006-07-13 10:54:20 +00:00
|
|
|
except KeyboardInterrupt:
|
2006-07-15 15:18:20 +00:00
|
|
|
self.log("Interrupted!\n")
|
|
|
|
sys.exit(1)
|
2006-07-13 10:54:20 +00:00
|
|
|
except Exception, e:
|
2006-07-15 15:18:20 +00:00
|
|
|
self.log("FAILED! (%s)\n" % str(e))
|
2006-07-13 10:54:20 +00:00
|
|
|
|
|
|
|
if __name__ == '__main__':
|
2006-11-08 10:49:56 +00:00
|
|
|
options = optparse.OptionParser()
|
|
|
|
options.add_option("-i", "--incoming", action = "store_true", dest = "incoming")
|
|
|
|
options.add_option("--incoming-config", action = "store_true", dest = "incoming_config")
|
|
|
|
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)
|
|
|
|
|
|
|
|
opts, args = options.parse_args()
|
|
|
|
|
|
|
|
kw = {}
|
|
|
|
if len(args) >= 1:
|
|
|
|
kw['arch'] =args[0]
|
|
|
|
if len(args) >= 2:
|
2007-10-14 00:35:40 +00:00
|
|
|
kw['featureset'] =args[1]
|
2006-11-08 10:49:56 +00:00
|
|
|
if len(args) >= 3:
|
|
|
|
kw['flavour'] =args[2]
|
|
|
|
|
|
|
|
url_base = url_debian_pool(opts.url_base)
|
|
|
|
url_base_incoming = url_debian_flat(opts.url_base_incoming)
|
|
|
|
if opts.incoming_config:
|
|
|
|
url = url_config = url_base_incoming
|
|
|
|
else:
|
|
|
|
url_config = url_base
|
|
|
|
if opts.incoming:
|
|
|
|
url = url_base_incoming
|
|
|
|
else:
|
|
|
|
url = url_base
|
|
|
|
|
|
|
|
main(url, url_config, **kw)()
|