Source code for schrodinger.utils.sysinfo
"""
Gather information about current system.
"""
import os
import platform
import re
import sys
import distro
from decorator import decorator
from . import subprocess
EXE = ""
if sys.platform == "win32":
    EXE = ".exe"
MMSHARE_EXEC = os.environ["MMSHARE_EXEC"]
LMUTIL = os.path.join(MMSHARE_EXEC, "lmutil" + EXE)
UNKNOWN = "Unknown"
PYTHON_EXE = "python3"
"""
Versioned Python executable to use in calls to Python. Useful when running a
Python command (python3 -c ""). Prefer $SCHRODINGER/run <scriptname.py>
"""
[docs]@decorator
def catch_subprocess_errors(f):
    """
    Catches non-zero return code for any operations that might
    fail. Use this to return UNKNOWN for any values we can't
    query.
    """
    try:
        return f()
    except:
        return UNKNOWN 
[docs]@catch_subprocess_errors
def get_glibc_version():
    """
    Return string of glibc version.
    """
    locations = [
        "/lib64/libc.so.6",
        "/lib/x86_64-linux-gnu/libc.so.6",
    ]
    for location in locations:
        if os.path.exists(location):
            glibc = location
            break
    else:
        return
    output = subprocess.check_output([glibc], universal_newlines=True)
    if len(output.splitlines()) > 0:
        tokens = output.splitlines()[0].split()
        for i, token in enumerate(tokens):
            if token == "version":
                return tokens[i + 1].strip(",") 
[docs]@catch_subprocess_errors
def get_kernel_version():
    """
    Return string of Linux kernel verison.
    """
    return subprocess.check_output(["uname", "-r"],
                                   universal_newlines=True).strip() 
[docs]@catch_subprocess_errors
def get_cpu():
    """
    Return a descriptive string of CPU type.
    """
    if sys.platform.startswith("darwin"):
        command_output = subprocess.check_output(
            ["sysctl", "-n", "machdep.cpu.brand_string"],
            universal_newlines=True).strip()
    elif sys.platform.startswith("linux"):
        with open("/proc/cpuinfo") as fh:
            for line in fh:
                if line.startswith("model name"):
                    command_output = line.split(":")[1].strip()
                    break
    elif sys.platform == "win32":
        return os.environ.get("PROCESSOR_IDENTIFIER", UNKNOWN)
    return command_output 
[docs]def query_registry(key, value):
    regquery = os.path.join(os.environ["SCHRODINGER"], "regquery")
    output = subprocess.check_output([regquery, key, value],
                                     universal_newlines=True)
    return output.replace("Value:", "").strip() 
[docs]@catch_subprocess_errors
def get_osname():
    """
    Return descriptive name of OS for reporting.
    """
    if sys.platform.startswith("darwin"):
        return platform.mac_ver()[0]
    elif sys.platform.startswith("linux"):
        return distro.name(pretty=True)
    elif sys.platform == "win32":
        key = "HKLM\\Software\\Microsoft\\Windows NT\\CurrentVersion"
        name = query_registry(key, "ProductName")
        _, version, service_pack, _ = platform.win32_ver()
        output = name + " " + service_pack + " (" + version + ")"
    return output 
[docs]@catch_subprocess_errors
def get_hostid():
    output = subprocess.check_output([LMUTIL, "lmhostid"],
                                     universal_newlines=True)
    for line in output.splitlines():
        if re.search("flexnet", line, re.IGNORECASE):
            # matching first of ""0123456789ab 01333b9414863""
            start = output.find('""')
            end = output.find(" ", start + 1)
            if start == -1:
                #matching "0123456789ab"
                start = output.find('"')
                end = output.find('"', start + 1)
                if start == -1 or end == -1:
                    continue
                hostid = output[start + 1:end]
                break
            if start == -1 or end == -1:
                continue
            hostid = output[start + 2:end]
            break
    else:
        hostid = UNKNOWN
    return hostid 
[docs]@catch_subprocess_errors
def get_hostname():
    """
    Return the FLEXlm hostname.
    """
    # FLEXlm license administration guide suggest to use
    # the following to get hostname usable to specify as
    # server in the license.
    if sys.platform.startswith(('darwin', 'linux')):
        output = subprocess.check_output(["uname", "-n"],
                                         universal_newlines=True)
        hostname = output.strip()
        if hostname == "":
            hostname = UNKNOWN
    else:
        output = subprocess.check_output(
            [LMUTIL, "lmhostid", "-hostname", "-n"], universal_newlines=True)
        try:
            hostname = output.strip().split("=")[1]
        except:
            hostname = UNKNOWN
    return hostname 
[docs]@catch_subprocess_errors
def get_uname():
    if sys.platform != "win32":
        output = subprocess.check_output(["uname", "-a"],
                                         universal_newlines=True).strip()
    return output 
[docs]def is_display_present():
    """
    Returns TRUE if user can access display.
    """
    if sys.platform.startswith("linux"):
        if 'DISPLAY' not in os.environ or not os.environ['DISPLAY']:
            return False
    elif sys.platform.startswith('darwin'):
        from schrodinger.test import darwinconsole
        return darwinconsole.is_console_user(os.environ['USER'])
    return True