@property
def os(self):
if not hasattr(self, '_os'):
- os_info = self.run(args=['cat', '/etc/os-release'],
- stdout=StringIO(), stderr=StringIO())
- self._os = OS(os_info.stdout.getvalue().strip())
+ 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
@property
node['name'] = self.hostname
node['user'] = self.user
node['arch'] = self.arch
- node['os_type'] = self.os.id
- node['os_version'] = self.os.version_id
+ node['os_type'] = self.os.name
+ node['os_version'] = self.os.version
node['ssh_pub_key'] = self.host_key
node['up'] = True
return node
class OS(object):
"""
- Parse /etc/os-release and populate attributes
-
- Given output like:
- NAME="Ubuntu"
- VERSION="12.04.4 LTS, Precise Pangolin"
- ID=ubuntu
- ID_LIKE=debian
- PRETTY_NAME="Ubuntu precise (12.04.4 LTS)"
- VERSION_ID="12.04"
-
- Attributes will be:
- name = 'Ubuntu'
- version = '12.04.4 LTS, Precise Pangolin'
- id = 'ubuntu'
- id_like = 'debian'
- pretty_name = 'Ubuntu precise (12.04.4 LTS)'
- version_id = '12.04'
- Additionally, we set the package type:
- package_type = 'deb'
+ Class that parses either /etc/os-release or the output of 'lsb_release -a'
+ and provides OS name and version information.
+
+ Must be initialized with OS.from_lsb_release or OS.from_os_release
"""
- __slots__ = ['_os_release_str', 'name', 'version', 'id', 'id_like',
- 'pretty_name', 'version_id', 'package_type']
-
- _deb_distros = ('debian')
- _rpm_distros = ('fedora', 'rhel', 'rhel fedora', 'suse')
-
- def __init__(self, os_release_str):
- self._os_release_str = os_release_str.strip()
- self.name = self._get_value('NAME')
- self.version = self._get_value('VERSION')
- self.id = self._get_value('ID')
- self.id_like = self._get_value('ID_LIKE')
- self.pretty_name = self._get_value('PRETTY_NAME')
- self.version_id = self._get_value('VERSION_ID')
-
- if self.id_like in self._deb_distros:
- self.package_type = "deb"
- elif self.id_like in self._rpm_distros:
- self.package_type = "rpm"
-
- def _get_value(self, name):
- regex = '^%s=(.+)' % name
- match = re.search(regex, self._os_release_str, flags=re.M)
+ __slots__ = ['name', 'version', 'package_type']
+
+ _deb_distros = ('debian', 'ubuntu')
+ _rpm_distros = ('fedora', 'rhel', 'centos', 'suse')
+
+ def __init__(self):
+ pass
+
+ @classmethod
+ def from_lsb_release(cls, lsb_release_str):
+ """
+ Parse /etc/os-release and populate attributes
+
+ Given output like:
+ Distributor ID: Ubuntu
+ Description: Ubuntu 12.04.4 LTS
+ Release: 12.04
+ Codename: precise
+
+ Attributes will be:
+ name = 'ubuntu'
+ version = '12.04'
+ Additionally, we set the package type:
+ package_type = 'deb'
+ """
+ obj = cls()
+ str_ = lsb_release_str.strip()
+ name = obj._get_value(str_, 'Distributor ID')
+ if name == 'RedHatEnterpriseServer':
+ name = 'rhel'
+ obj.name = name.lower()
+
+ obj.version = obj._get_value(str_, 'Release')
+
+ if obj.name in cls._deb_distros:
+ obj.package_type = "deb"
+ elif obj.name in cls._rpm_distros:
+ obj.package_type = "rpm"
+
+ return obj
+
+ @classmethod
+ def from_os_release(cls, os_release_str):
+ """
+ Parse /etc/os-release and populate attributes
+
+ Given output like:
+ NAME="Ubuntu"
+ VERSION="12.04.4 LTS, Precise Pangolin"
+ ID=ubuntu
+ ID_LIKE=debian
+ PRETTY_NAME="Ubuntu precise (12.04.4 LTS)"
+ VERSION_ID="12.04"
+
+ Attributes will be:
+ name = 'ubuntu'
+ version = '12.04'
+ Additionally, we set the package type:
+ package_type = 'deb'
+ """
+ obj = cls()
+ str_ = os_release_str.strip()
+ obj.name = cls._get_value(str_, 'ID').lower()
+ obj.version = cls._get_value(str_, 'VERSION_ID')
+
+ if obj.name in cls._deb_distros:
+ obj.package_type = "deb"
+ elif obj.name in cls._rpm_distros:
+ obj.package_type = "rpm"
+
+ return obj
+
+ @staticmethod
+ def _get_value(str_, name):
+ regex = '^%s[:=](.+)' % name
+ match = re.search(regex, str_, flags=re.M)
if match:
- return match.groups()[0].strip('"\'')
+ return match.groups()[0].strip(' \t"\'')
return ''
def __str__(self):
- return " ".join([self.id, self.version_id]).strip()
+ return " ".join([self.name, self.version]).strip()
def getShortName(name):
class TestDistribution(object):
- str_centos = dedent("""
+ str_centos_7_os_release = dedent("""
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
BUG_REPORT_URL="https://bugs.centos.org/"
""")
- str_debian = dedent("""
+ str_debian_7_lsb_release = dedent("""
+ Distributor ID: Debian
+ Description: Debian GNU/Linux 7.1 (wheezy)
+ Release: 7.1
+ Codename: wheezy
+ """)
+
+ str_debian_7_os_release = dedent("""
PRETTY_NAME="Debian GNU/Linux 7 (wheezy)"
NAME="Debian GNU/Linux"
VERSION_ID="7"
BUG_REPORT_URL="http://bugs.debian.org/"
""")
- str_ubuntu = dedent("""
+ str_ubuntu_12_04_lsb_release = dedent("""
+ Distributor ID: Ubuntu
+ Description: Ubuntu 12.04.4 LTS
+ Release: 12.04
+ Codename: precise
+ """)
+
+ str_ubuntu_12_04_os_release = dedent("""
NAME="Ubuntu"
VERSION="12.04.4 LTS, Precise Pangolin"
ID=ubuntu
VERSION_ID="12.04"
""")
- str_rhel = dedent("""
+ str_rhel_6_4_lsb_release = dedent("""
+ LSB Version: :base-4.0-amd64:base-4.0-noarch:core-4.0-amd64:core-4.0-noarch:graphics-4.0-amd64:graphics-4.0-noarch:printing-4.0-amd64:printing-4.0-noarch
+ Distributor ID: RedHatEnterpriseServer
+ Description: Red Hat Enterprise Linux Server release 6.4 (Santiago)
+ Release: 6.4
+ Codename: Santiago
+ """)
+
+ 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
+ Description: Red Hat Enterprise Linux Server release 7.0 (Maipo)
+ Release: 7.0
+ Codename: Maipo
+ """)
+
+ str_rhel_7_os_release = dedent("""
NAME="Red Hat Enterprise Linux Server"
VERSION="7.0 (Maipo)"
ID="rhel"
REDHAT_SUPPORT_PRODUCT_VERSION=7.0
""")
- def test_centos(self):
- os = remote.OS(self.str_centos)
- assert os.name == 'CentOS Linux'
- assert os.version == '7 (Core)'
- assert os.id == 'centos'
- assert os.id_like == 'rhel fedora'
- assert os.pretty_name == 'CentOS Linux 7 (Core)'
- assert os.version_id == '7'
+ def test_centos_7_os_release(self):
+ os = remote.OS.from_os_release(self.str_centos_7_os_release)
+ assert os.name == 'centos'
+ assert os.version == '7'
assert os.package_type == 'rpm'
- def test_debian(self):
- os = remote.OS(self.str_debian)
- assert os.name == 'Debian GNU/Linux'
- assert os.version == '7 (wheezy)'
- assert os.id == 'debian'
- assert os.id_like == ''
- assert os.pretty_name == 'Debian GNU/Linux 7 (wheezy)'
- assert os.version_id == '7'
+ def test_debian_7_lsb_release(self):
+ os = remote.OS.from_lsb_release(self.str_debian_7_lsb_release)
+ assert os.name == 'debian'
+ assert os.version == '7.1'
assert os.package_type == 'deb'
- def test_ubuntu(self):
- os = remote.OS(self.str_ubuntu)
- assert os.name == 'Ubuntu'
- assert os.version == '12.04.4 LTS, Precise Pangolin'
- assert os.id == 'ubuntu'
- assert os.id_like == 'debian'
- assert os.pretty_name == 'Ubuntu precise (12.04.4 LTS)'
- assert os.version_id == '12.04'
+ def test_debian_7_os_release(self):
+ os = remote.OS.from_os_release(self.str_debian_7_os_release)
+ assert os.name == 'debian'
+ assert os.version == '7'
assert os.package_type == 'deb'
- def test_rhel(self):
- os = remote.OS(self.str_rhel)
- assert os.name == 'Red Hat Enterprise Linux Server'
- assert os.version == '7.0 (Maipo)'
- assert os.id == 'rhel'
- assert os.id_like == 'fedora'
- assert os.pretty_name == 'Red Hat Enterprise Linux Server 7.0 (Maipo)'
- assert os.version_id == '7.0'
+ def test_ubuntu_12_04_lsb_release(self):
+ os = remote.OS.from_lsb_release(self.str_ubuntu_12_04_lsb_release)
+ assert os.name == 'ubuntu'
+ assert os.version == '12.04'
+ assert os.package_type == 'deb'
+
+ def test_ubuntu_12_04_os_release(self):
+ os = remote.OS.from_os_release(self.str_ubuntu_12_04_os_release)
+ assert os.name == 'ubuntu'
+ assert os.version == '12.04'
+ assert os.package_type == 'deb'
+
+ def test_rhel_6_4_lsb_release(self):
+ os = remote.OS.from_lsb_release(self.str_rhel_6_4_lsb_release)
+ assert os.name == 'rhel'
+ assert os.version == '6.4'
+ assert os.package_type == 'rpm'
+
+ def test_rhel_7_lsb_release(self):
+ os = remote.OS.from_lsb_release(self.str_rhel_7_lsb_release)
+ assert os.name == 'rhel'
+ assert os.version == '7.0'
+ assert os.package_type == 'rpm'
+
+ def test_rhel_7_os_release(self):
+ os = remote.OS.from_os_release(self.str_rhel_7_os_release)
+ assert os.name == 'rhel'
+ assert os.version == '7.0'
assert os.package_type == 'rpm'