+import ast
import re
Must be initialized with OS.from_lsb_release or OS.from_os_release
"""
- __slots__ = ['name', 'version', 'package_type']
+ __slots__ = ['name', 'version', 'codename', 'package_type']
_deb_distros = ('debian', 'ubuntu')
_rpm_distros = ('fedora', 'rhel', 'centos', 'suse')
- def __init__(self, name=None, version=None):
+ def __init__(self, name=None, version=None, codename=None):
self.name = name
self.version = version
+ self.codename = codename
self._set_package_type()
+ @classmethod
+ def from_python(cls, python_val):
+ """
+ Parse output from platform.linux_distribution() and populate attributes
+
+ Given a tuple or str()'ed tuple like this:
+ ('Ubuntu', '14.04', 'trusty')
+
+ Attributes will be:
+ name = 'ubuntu'
+ version = '14.04'
+ codename = 'trusty'
+ Additionally, we set the package type:
+ package_type = 'deb'
+ """
+ if not isinstance(python_val, tuple):
+ python_val = ast.literal_eval(python_val)
+
+ (name, version, codename) = python_val
+ name = name.lower().replace(' ', '')
+ if name.startswith('redhat'):
+ name = 'rhel'
+ elif name.startswith('centos'):
+ name = 'centos'
+ elif name.startswith('fedora'):
+ name = 'fedora'
+ obj = cls()
+ obj.name = name
+ obj.version = version
+ obj.codename = codename.lower()
+ obj._set_package_type()
+ return obj
+
@classmethod
def from_lsb_release(cls, lsb_release_str):
"""
- Parse /etc/os-release and populate attributes
+ Parse output from lsb_release -a and populate attributes
Given output like:
Distributor ID: Ubuntu
Attributes will be:
name = 'ubuntu'
version = '12.04'
+ codename = 'precise'
Additionally, we set the package type:
package_type = 'deb'
"""
obj.name = name.lower()
obj.version = obj._get_value(str_, 'Release')
+ obj.codename = obj._get_value(str_, 'Codename').lower()
obj._set_package_type()
Attributes will be:
name = 'ubuntu'
version = '12.04'
+ codename = None
Additionally, we set the package type:
package_type = 'deb'
"""
str_ = os_release_str.strip()
obj.name = cls._get_value(str_, 'ID').lower()
obj.version = cls._get_value(str_, 'VERSION_ID')
+ obj.codename = None
obj._set_package_type()
return dict(
name=self.name,
version=self.version,
+ codename=self.codename,
)
def __str__(self):
return " ".join([self.name, self.version]).strip()
def __repr__(self):
- return "OS(name='{name}', version='{version}')".format(
- name=self.name, version=self.version)
+ return "OS(name={name}, version={version}, codename={codename})"\
+ .format(name=repr(self.name),
+ version=repr(self.version),
+ codename=repr(self.codename))
@property
def os(self):
if not hasattr(self, '_os'):
+ proc = self.run(
+ args=[
+ 'python', '-c',
+ 'import platform; print platform.linux_distribution()'],
+ stdout=StringIO(), stderr=StringIO(), check_status=False)
+ if proc.exitstatus == 0:
+ self._os = OS.from_python(proc.stdout.getvalue().strip())
+ return self._os
+
proc = self.run(args=['cat', '/etc/os-release'], stdout=StringIO(),
stderr=StringIO(), check_status=False)
if proc.exitstatus == 0:
self._os = OS.from_os_release(proc.stdout.getvalue().strip())
- else:
- proc = self.run(args=['lsb_release', '-a'], stdout=StringIO(),
- stderr=StringIO())
- self._os = OS.from_lsb_release(proc.stdout.getvalue().strip())
+ return self._os
+
+ proc = self.run(args=['lsb_release', '-a'], stdout=StringIO(),
+ stderr=StringIO())
+ self._os = OS.from_lsb_release(proc.stdout.getvalue().strip())
return self._os
@property
BUG_REPORT_URL="http://bugs.debian.org/"
""")
+ str_ubuntu_12_04_python = "('Ubuntu', '12.04', 'precise')"
+
str_ubuntu_12_04_lsb_release = dedent("""
Distributor ID: Ubuntu
Description: Ubuntu 12.04.4 LTS
Codename: Santiago
""")
+ str_rhel_7_python = "('Red Hat Enterprise Linux Server', '7.0', 'Maipo')"
+
str_rhel_7_lsb_release = dedent("""
LSB Version: :core-4.1-amd64:core-4.1-noarch:cxx-4.1-amd64:cxx-4.1-noarch:desktop-4.1-amd64:desktop-4.1-noarch:languages-4.1-amd64:languages-4.1-noarch:printing-4.1-amd64:printing-4.1-noarch
Distributor ID: RedHatEnterpriseServer
os = OS.from_os_release(self.str_centos_7_os_release)
assert os.name == 'centos'
assert os.version == '7'
+ assert os.codename is None
assert os.package_type == 'rpm'
def test_debian_7_lsb_release(self):
os = OS.from_lsb_release(self.str_debian_7_lsb_release)
assert os.name == 'debian'
assert os.version == '7.1'
+ assert os.codename == 'wheezy'
assert os.package_type == 'deb'
def test_debian_7_os_release(self):
os = OS.from_os_release(self.str_debian_7_os_release)
assert os.name == 'debian'
assert os.version == '7'
+ assert os.codename is None
+ assert os.package_type == 'deb'
+
+ def test_ubuntu_12_04_python(self):
+ os = OS.from_python(self.str_ubuntu_12_04_python)
+ assert os.name == 'ubuntu'
+ assert os.version == '12.04'
+ assert os.codename == 'precise'
assert os.package_type == 'deb'
def test_ubuntu_12_04_lsb_release(self):
os = OS.from_lsb_release(self.str_ubuntu_12_04_lsb_release)
assert os.name == 'ubuntu'
assert os.version == '12.04'
+ assert os.codename == 'precise'
assert os.package_type == 'deb'
def test_ubuntu_12_04_os_release(self):
os = OS.from_os_release(self.str_ubuntu_12_04_os_release)
assert os.name == 'ubuntu'
assert os.version == '12.04'
+ assert os.codename is None
assert os.package_type == 'deb'
def test_rhel_6_4_lsb_release(self):
os = OS.from_lsb_release(self.str_rhel_6_4_lsb_release)
assert os.name == 'rhel'
assert os.version == '6.4'
+ assert os.codename == 'santiago'
+ assert os.package_type == 'rpm'
+
+ def test_rhel_7_python(self):
+ os = OS.from_python(self.str_rhel_7_python)
+ assert os.name == 'rhel'
+ assert os.version == '7.0'
+ assert os.codename == 'maipo'
assert os.package_type == 'rpm'
def test_rhel_7_lsb_release(self):
os = OS.from_lsb_release(self.str_rhel_7_lsb_release)
assert os.name == 'rhel'
assert os.version == '7.0'
+ assert os.codename == 'maipo'
assert os.package_type == 'rpm'
def test_rhel_7_os_release(self):
os = OS.from_os_release(self.str_rhel_7_os_release)
assert os.name == 'rhel'
assert os.version == '7.0'
+ assert os.codename is None
assert os.package_type == 'rpm'
def test_repr(self):
- os = OS(name='NAME', version='0.1.2')
- assert repr(os) == "OS(name='NAME', version='0.1.2')"
+ os = OS(name='NAME', version='0.1.2', codename='code')
+ assert repr(os) == "OS(name='NAME', version='0.1.2', codename='code')"
def test_to_dict(self):
- os = OS(name='NAME', version='0.1.2')
- assert os.to_dict() == dict(name='NAME', version='0.1.2')
+ os = OS(name='NAME', version='0.1.2', codename='code')
+ ref_dict = dict(name='NAME', version='0.1.2', codename='code')
+ assert os.to_dict() == ref_dict