initial code repo
[stor4nfv.git] / src / ceph / src / ceph-detect-init / ceph_detect_init / __init__.py
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 (file)
index 0000000..fe0a2a7
--- /dev/null
@@ -0,0 +1,158 @@
+# Copyright (C) 2015 <contact@redhat.com>
+#
+# Author: Alfredo Deza <adeza@redhat.com>
+# Author: Loic Dachary <loic@dachary.org>
+#
+# 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()
+    )