import os
import re
+# XXX: Update as needed
+RELEASE_CODENAME_LOOKUP = {
+ '1.1' : 'buzz',
+ '1.2' : 'rex',
+ '1.3' : 'bo',
+ '2.0' : 'hamm',
+ '2.1' : 'slink',
+ '2.2' : 'potato',
+ '3.0' : 'woody',
+ '3.1' : 'sarge',
+ '3.2' : 'etch', # XXX - may not end up as 3.2
+ }
+
+TESTING_CODENAME = 'etch'
+
# LSB compliance packages... may grow eventually
PACKAGES = 'lsb-core lsb-cxx lsb-graphics'
return modules
-RELEASE_CODENAME_LOOKUP = {
- '1.1' : 'buzz',
- '1.2' : 'rex',
- '1.3' : 'bo',
- '2.0' : 'hamm',
- '2.1' : 'slink',
- '2.2' : 'potato',
- '3.0' : 'woody',
- '3.1' : 'sarge',
- '3.2' : 'etch', # XXX - may not end up as 3.2
- }
+priorityre = re.compile(r'\s+(\d+)\s+')
+versionre = re.compile(r'release v=([\d.+]+),o=Debian,a=([^,]+).*c=main')
+releasere = re.compile(r'release o=Debian,a=([^,]+).*c=main')
+
+def guess_release_from_apt():
+ releases = []
+
+ priority = None
+ policy = commands.getoutput('apt-cache policy 2>/dev/null')
+ for line in policy.split('\n'):
+ m = priorityre.match(line)
+ if m:
+ priority = int(m.group(1))
+
+ m = versionre.search(line)
+ if m and priority is not None:
+ releases.append((priority, m.group(1)))
+
+ m = releasere.search(line)
+ if m and priority is not None:
+ releases.append((priority, m.group(1)))
+
+ if not releases:
+ return None
+
+ releases.sort()
+ releases.reverse()
+ for (pri, release) in releases:
+ if release != 'experimental':
+ return release
+
+ return None
def guess_debian_release():
distinfo = {'ID' : 'Debian'}
codename = RELEASE_CODENAME_LOOKUP.get(release, 'n/a')
distinfo.update({ 'RELEASE' : release, 'CODENAME' : codename })
else:
- # Guess with apt policy before being this stupid?
- distinfo.update({ 'RELEASE' : release, 'CODENAME' : 'sid'})
+ release = guess_release_from_apt()
+ if release:
+ codename = RELEASE_CODENAME_LOOKUP.get(release)
+ if not codename:
+ if release == 'testing':
+ codename = TESTING_CODENAME
+ else:
+ codename = 'sid'
+ distinfo.update({ 'RELEASE' : release, 'CODENAME' : codename})
+ else:
+ distinfo.update({ 'RELEASE' : release, 'CODENAME' : 'sid'})
distinfo['DESCRIPTION'] += ' %(RELEASE)s (%(CODENAME)s)' % distinfo
return distinfo
def main():
parser = OptionParser()
- parser.add_option('-v', '--version', dest='output', action='store_const',
- const='version', default='version',
+ parser.add_option('-v', '--version', dest='version', action='store_true',
+ default=False,
help="show LSB modules this system supports")
- parser.add_option('-i', '--id', dest='output', action='store_const',
- const='id', help="show distributor ID")
- parser.add_option('-d', '--description', dest='output',
- action='store_const', const='description',
+ parser.add_option('-i', '--id', dest='id', action='store_true',
+ default=False,
+ help="show distributor ID")
+ parser.add_option('-d', '--description', dest='description',
+ default=False, action='store_true',
help="show description of this distribution")
- parser.add_option('-r', '--release', dest='output',
- action='store_const', const='release',
+ parser.add_option('-r', '--release', dest='release',
+ default=False, action='store_true',
help="show release number of this distribution")
- parser.add_option('-c', '--codename', dest='output',
- action='store_const', const='codename',
+ parser.add_option('-c', '--codename', dest='codename',
+ default=False, action='store_true',
help="show code name of this distribution")
- parser.add_option('-a', '--all', dest='output',
- action='store_const', const='all',
+ parser.add_option('-a', '--all', dest='all',
+ default=False, action='store_true',
help="show all of the above information")
parser.add_option('-s', '--short', dest='short',
action='store_true', default=False,
parser.error("No arguments are permitted")
short = (options.short)
- all = (options.output=='all')
+ all = (options.all)
+ none = not (options.all or options.version or options.id or
+ options.description or options.codename or options.release)
distinfo = get_distro_information()
- if options.output == 'version' or all:
+ if none or all or options.version:
verinfo = check_modules_installed()
if not verinfo:
print >> sys.stderr, "No LSB modules are available."
else:
print 'LSB Version:\t' + ':'.join(verinfo)
- if options.output == 'id' or all:
+ if options.id or all:
if short:
print distinfo.get('ID', 'n/a')
else:
print 'Distributor ID:\t%s' % distinfo.get('ID', 'n/a')
- if options.output == 'description' or all:
+ if options.description or all:
if short:
print distinfo.get('DESCRIPTION', 'n/a')
else:
print 'Description:\t%s' % distinfo.get('DESCRIPTION', 'n/a')
- if options.output == 'release' or all:
+ if options.release or all:
if short:
print distinfo.get('RELEASE', 'n/a')
else:
print 'Release:\t%s' % distinfo.get('RELEASE', 'n/a')
- if options.output == 'codename' or all:
+ if options.codename or all:
if short:
print distinfo.get('CODENAME', 'n/a')
else: