156 lines
5.1 KiB
Python
Executable File
156 lines
5.1 KiB
Python
Executable File
#!/usr/bin/env python2.4
|
|
|
|
import sys
|
|
sys.path.append(sys.path[0] + "/../lib/python")
|
|
|
|
import os, os.path
|
|
from debian_linux.abi import *
|
|
from debian_linux.config import *
|
|
from debian_linux.debian import *
|
|
|
|
url_base = "http://ftp.de.debian.org/debian/"
|
|
|
|
class main(object):
|
|
dir = None
|
|
override_arch = None
|
|
override_subarch = None
|
|
override_flavour = None
|
|
|
|
def __init__(self):
|
|
self.log = sys.stdout.write
|
|
|
|
if len(sys.argv) > 1:
|
|
self.override_arch = sys.argv[1]
|
|
if len(sys.argv) > 2:
|
|
self.override_subarch = sys.argv[2]
|
|
if len(sys.argv) > 3:
|
|
self.override_flavour = sys.argv[3]
|
|
|
|
changelog = read_changelog()
|
|
while changelog[0]['Distribution'] == 'UNRELEASED':
|
|
changelog.pop(0)
|
|
changelog = changelog[0]
|
|
|
|
self.source = changelog['Source']
|
|
self.version = changelog['Version']['version']
|
|
self.version_source = changelog['Version']['source']
|
|
|
|
local_config = config_reader_arch(["debian/arch"])
|
|
|
|
self.abiname = local_config['abi',]['abiname']
|
|
self.version_abi = self.version + '-' + self.abiname
|
|
|
|
def __call__(self):
|
|
import tempfile
|
|
self.dir = tempfile.mkdtemp(prefix = 'abiupdate')
|
|
try:
|
|
self.log("Retreive config\n")
|
|
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:
|
|
self._rmtree(self.dir)
|
|
|
|
def _rmtree(self, dir):
|
|
import stat
|
|
for root, dirs, files in os.walk(dir, topdown=False):
|
|
for name in files:
|
|
os.remove(os.path.join(root, name))
|
|
for name in dirs:
|
|
real = os.path.join(root, name)
|
|
mode = os.lstat(real)[stat.ST_MODE]
|
|
if stat.S_ISDIR(mode):
|
|
os.rmdir(real)
|
|
else:
|
|
os.remove(real)
|
|
os.rmdir(dir)
|
|
|
|
def extract_package(self, filename, base = "tmp"):
|
|
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, subarch, flavour):
|
|
if subarch == 'none':
|
|
prefix = flavour
|
|
else:
|
|
prefix = subarch + '-' + flavour
|
|
filename = "linux-headers-%s-%s_%s_%s.deb" % (self.version_abi, prefix, self.version_source, arch)
|
|
f = self.retrieve_package(filename)
|
|
d = self.extract_package(f)
|
|
f1 = d + "/usr/src/linux-headers-%s-%s/Module.symvers" % (self.version_abi, prefix)
|
|
s = symbols(f1)
|
|
self._rmtree(d)
|
|
return s
|
|
|
|
def get_config(self):
|
|
filename = "linux-support-%s_%s_all.deb" % (self.version_abi, self.version_source)
|
|
f = self.retrieve_package(filename)
|
|
d = self.extract_package(f)
|
|
dir = d + "/usr/src/linux-support-" + self.version_abi + "/arch"
|
|
config = config_reader_arch([dir])
|
|
self._rmtree(d)
|
|
return config
|
|
|
|
def retrieve_package(self, filename):
|
|
import urllib2
|
|
url = url_base + "pool/main/" + self.source[0] + "/" + self.source + "/" + filename
|
|
filename_out = self.dir + "/" + filename
|
|
f_in = urllib2.urlopen(url)
|
|
f_out = file(filename_out, 'w')
|
|
while 1:
|
|
r = f_in.read()
|
|
if not r:
|
|
break
|
|
f_out.write(r)
|
|
return filename_out
|
|
|
|
def save_abi(self, symbols, arch, subarch, flavour):
|
|
out = "debian/arch/%s" % arch
|
|
if subarch != 'none':
|
|
out += "/%s" % subarch
|
|
out += "/abi-%s.%s" % (self.abiname, flavour)
|
|
symbols.write(file(out, 'w'))
|
|
|
|
def update_arch(self, config, arch):
|
|
if self.override_subarch:
|
|
subarches = [self.override_subarch]
|
|
else:
|
|
subarches = config[('base', arch)]['subarches']
|
|
for subarch in subarches:
|
|
self.update_subarch(config, arch, subarch)
|
|
|
|
def update_subarch(self, config, arch, subarch):
|
|
config_entry = config[('base', arch, subarch)]
|
|
if not config_entry.get('modules', True):
|
|
return
|
|
if self.override_flavour:
|
|
flavours = [self.override_flavour]
|
|
else:
|
|
flavours = config_entry['flavours']
|
|
for flavour in flavours:
|
|
self.update_flavour(config, arch, subarch, flavour)
|
|
|
|
def update_flavour(self, config, arch, subarch, flavour):
|
|
config_entry = config[('base', arch, subarch, flavour)]
|
|
if not config_entry.get('modules', True):
|
|
return
|
|
self.log("Updating ABI for arch %s, subarch %s, flavour %s: " % (arch, subarch, flavour))
|
|
try:
|
|
abi = self.get_abi(arch, subarch, flavour)
|
|
self.save_abi(abi, arch, subarch, flavour)
|
|
self.log("Ok.\n")
|
|
except KeyboardInterrupt:
|
|
self.log("Interrupted!\n")
|
|
sys.exit(1)
|
|
except Exception, e:
|
|
self.log("FAILED! (%s)\n" % str(e))
|
|
|
|
if __name__ == '__main__':
|
|
main()()
|