diff options
author | Joshua Lock <joshua.g.lock@intel.com> | 2016-11-08 14:49:55 +0000 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2016-11-15 15:18:50 +0000 |
commit | fc4eddecddec68d03a985086fa32db40ad0c7bfc (patch) | |
tree | 6f0b557346c0acc8b7e35fc3e88f00668f1d1f9b | |
parent | 2ddd6ddaf0c5ba14ae83347eba877ac9ef179c76 (diff) | |
download | openembedded-core-fc4eddecddec68d03a985086fa32db40ad0c7bfc.tar.gz openembedded-core-fc4eddecddec68d03a985086fa32db40ad0c7bfc.tar.bz2 openembedded-core-fc4eddecddec68d03a985086fa32db40ad0c7bfc.zip |
lib/oe/lsb: prefer /etc/os-release for distribution data
os-release(5) is an increasingly standard source of operating system
identification and more likely to be present on modern OS deployments, i.e.
many container variants of common distros include os-release and not the
lsb_release tool.
Therefore we should favour parsing /etc/os-release in distro_identifier(),
try lsb_release when that fails and finally fall back on various distro
specific sources of OS identification.
Signed-off-by: Joshua Lock <joshua.g.lock@intel.com>
Signed-off-by: Ross Burton <ross.burton@intel.com>
-rw-r--r-- | meta/lib/oe/lsb.py | 37 |
1 files changed, 28 insertions, 9 deletions
diff --git a/meta/lib/oe/lsb.py b/meta/lib/oe/lsb.py index 0bb76864a0..8018c7b076 100644 --- a/meta/lib/oe/lsb.py +++ b/meta/lib/oe/lsb.py @@ -1,3 +1,25 @@ +def release_dict_osr(): + """ Populate a dict with pertinent values from /etc/os-release """ + if not os.path.exists('/etc/os-release'): + return None + + data = {} + with open('/etc/os-release') as f: + for line in f: + try: + key, val = line.rstrip().split('=', 1) + except ValueError: + continue + if key == 'NAME': + data['DISTRIB_ID'] = val.strip('"') + if key == 'VERSION_ID': + data['DISTRIB_RELEASE'] = val.strip('"') + + if len(data.keys()) != 2: + return None + + return data + def release_dict_lsb(): """ Return the output of lsb_release -ir as a dictionary """ from subprocess import PIPE @@ -46,14 +68,6 @@ def release_dict_file(): if match: data['DISTRIB_ID'] = match.group(1) data['DISTRIB_RELEASE'] = match.group(2) - elif os.path.exists('/etc/os-release'): - data = {} - with open('/etc/os-release') as f: - for line in f: - if line.startswith('NAME='): - data['DISTRIB_ID'] = line[5:].rstrip().strip('"') - if line.startswith('VERSION_ID='): - data['DISTRIB_RELEASE'] = line[11:].rstrip().strip('"') elif os.path.exists('/etc/SuSE-release'): data = {} data['DISTRIB_ID'] = 'SUSE LINUX' @@ -73,7 +87,12 @@ def distro_identifier(adjust_hook=None): import re - distro_data = release_dict_lsb() + # Try /etc/os-release first, then the output of `lsb_release -ir` and + # finally fall back on parsing various release files in order to determine + # host distro name and version. + distro_data = release_dict_osr() + if not distro_data: + distro_data = release_dict_lsb() if not distro_data: distro_data = release_dict_file() |