X-Git-Url: https://gerrit.opnfv.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fceph%2Fsrc%2Fceph-detect-init%2Fceph_detect_init%2F__init__.py;fp=src%2Fceph%2Fsrc%2Fceph-detect-init%2Fceph_detect_init%2F__init__.py;h=fe0a2a787f4f9bc4746c640cc3e04359f1efc9d6;hb=812ff6ca9fcd3e629e49d4328905f33eee8ca3f5;hp=0000000000000000000000000000000000000000;hpb=15280273faafb77777eab341909a3f495cf248d9;p=stor4nfv.git diff --git a/src/ceph/src/ceph-detect-init/ceph_detect_init/__init__.py b/src/ceph/src/ceph-detect-init/ceph_detect_init/__init__.py new file mode 100644 index 0000000..fe0a2a7 --- /dev/null +++ b/src/ceph/src/ceph-detect-init/ceph_detect_init/__init__.py @@ -0,0 +1,158 @@ +# 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() + )