# Copyright (C) 2015 # # Author: Alfredo Deza # Author: Loic Dachary # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Library Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Library Public License for more details. # from ceph_detect_init import alpine from ceph_detect_init import arch from ceph_detect_init import centos from ceph_detect_init import debian from ceph_detect_init import exc from ceph_detect_init import fedora from ceph_detect_init import rhel from ceph_detect_init import suse from ceph_detect_init import gentoo from ceph_detect_init import freebsd from ceph_detect_init import docker from ceph_detect_init import oraclevms import os import logging import platform def get(use_rhceph=False): distro_name, release, codename = platform_information() # Not all distributions have a concept that maps to codenames # (or even releases really) if not codename and not _get_distro(distro_name): raise exc.UnsupportedPlatform( distro=distro_name, codename=codename, release=release) module = _get_distro(distro_name, use_rhceph=use_rhceph) module.name = distro_name module.normalized_name = _normalized_distro_name(distro_name) module.distro = module.normalized_name module.is_el = module.normalized_name in ['redhat', 'centos', 'fedora', 'scientific', 'oraclel'] module.release = release module.codename = codename module.init = module.choose_init() return module def _get_distro(distro, use_rhceph=False): if not distro: return distro = _normalized_distro_name(distro) distributions = { 'alpine': alpine, 'arch': arch, 'debian': debian, 'ubuntu': debian, 'linuxmint': debian, 'centos': centos, 'scientific': centos, 'oraclel': centos, 'oraclevms': oraclevms, 'redhat': centos, 'fedora': fedora, 'suse': suse, 'gentoo': gentoo, 'funtoo': gentoo, 'exherbo': gentoo, 'freebsd': freebsd, 'docker': docker, 'virtuozzo': centos, } if distro == 'redhat' and use_rhceph: return rhel else: return distributions.get(distro) def _normalized_distro_name(distro): distro = distro.lower() if distro.startswith(('redhat', 'red hat')): return 'redhat' elif distro.startswith(('scientific', 'scientific linux')): return 'scientific' elif distro.startswith(('suse', 'opensuse')): return 'suse' elif distro.startswith('centos'): return 'centos' elif distro.startswith('oracle linux'): return 'oraclel' elif distro.startswith('oracle vm'): return 'oraclevms' elif distro.startswith(('gentoo', 'funtoo', 'exherbo')): return 'gentoo' elif distro.startswith('virtuozzo'): return 'virtuozzo' return distro def platform_information(): """detect platform information from remote host.""" try: file_name = '/proc/self/cgroup' with open(file_name, 'r') as f: lines = f.readlines() for line in lines: if "docker" in line.split(':')[2]: return ('docker', 'docker', 'docker') except Exception as err: logging.debug("platform_information: ", "Error while opening %s : %s" % (file_name, err)) if os.path.isfile('/.dockerenv'): return ('docker', 'docker', 'docker') if platform.system() == 'Linux': linux_distro = platform.linux_distribution( supported_dists=platform._supported_dists + ('alpine', 'arch')) logging.debug('platform_information: linux_distribution = ' + str(linux_distro)) distro, release, codename = linux_distro elif platform.system() == 'FreeBSD': distro = 'freebsd' release = platform.release() codename = platform.version().split(' ')[3].split(':')[0] logging.debug( 'platform_information: release = {}, version = {}'.format( platform.release(), platform.version())) else: raise exc.UnsupportedPlatform(platform.system(), '', '') distro_lower = distro.lower() # this could be an empty string in Debian if not codename and 'debian' in distro_lower: pass # this is an empty string in Oracle elif distro_lower.startswith('oracle linux'): codename = 'OL' + release elif distro_lower.startswith('oracle vm'): codename = 'OVS' + release # this could be an empty string in Virtuozzo linux elif distro_lower.startswith('virtuozzo linux'): codename = 'virtuozzo' return ( str(distro).rstrip(), str(release).rstrip(), str(codename).rstrip() )