# Copyright (c) Cloud Linux Software, Inc
# Licensed under CLOUD LINUX LICENSE AGREEMENT
# http://cloudlinux.com/docs/LICENCE.TXT
import json
import os
import platform
import socket
import sys
from . import constants
from . import config
from . import log_utils
from . import utils
from . import process_utils
from . import selinux
VIRTWHAT = '/usr/libexec/kcare/virt-what'
def get_distro():
if sys.version_info[:2] < (3, 6): # pragma: no py3 cover
return platform.linux_distribution()
else: # pragma: no distro cover
import distro
return distro.linux_distribution(full_distribution_name=False)
@utils.cached
def get_system_uname():
return platform.uname()[2]
def get_python_version(): # type: () -> str
return '%s.%s' % (sys.version_info[0], sys.version_info[1])
def app_info(is_json=False): # type: (bool) -> str
info = {
'python_version': get_python_version(),
'agent_version': constants.VERSION,
}
if selinux.is_selinux_enabled():
rc, stdout, stderr = process_utils.run_command(['ps', '-Z', '--no-headers', '--pid', str(os.getpid())], catch_stdout=True)
if not rc:
selinux_context = stdout.split()[0]
else:
selinux_context = 'error: %s' % stderr
info['selinux_context'] = selinux_context
if is_json:
return json.dumps(info)
info_keys = sorted(info)
info_str = ''
for info_key in info_keys:
info_str += '%s: %s\n' % (info_key, info[info_key])
return info_str.rstrip()
def is_secure_boot(): # mocked: tests/unit/test_load_kmod.py
# type: () -> bool
efivars_location = "/sys/firmware/efi/efivars/"
if not os.path.exists(efivars_location):
return False
for filename in os.listdir(efivars_location):
if filename.startswith('SecureBoot'):
varfile = os.path.join(efivars_location, filename)
# Get last byte
with open(varfile, 'rb') as vfd:
return vfd.read()[-1:] == b'\x01'
return False
@utils.cached
def get_hostname():
# type: () -> str
# KCARE-1165 If fqdn gathering is forced
if config.REPORT_FQDN:
try:
# getaddrinfo() -> [(family, socktypeget_hostname, proto, canonname, sockaddr), ...]
hostname = socket.getaddrinfo(socket.gethostname(), 0, 0, 0, 0, socket.AI_CANONNAME)[0][3]
except socket.gaierror as ge:
log_utils.logerror(ge)
hostname = platform.node()
else:
hostname = platform.node()
return hostname
@utils.cached
def get_uptime():
# type: () -> str
if os.path.isfile('/proc/uptime'):
f = open('/proc/uptime', 'r')
line = f.readline()
result = str(int(float(line.split()[0])))
f.close()
return result
return '-1'
@utils.cached
def get_virt():
if os.path.isfile(VIRTWHAT):
return process_utils.check_output([VIRTWHAT]).strip()
return 'no-virt-what' # pragma: no cover
def is_cpanel():
return os.path.isfile('/usr/local/cpanel/cpanel')
def inside_vz_container(): # mocked: tests/unit/test_load_kmod.py
return os.path.exists('/proc/vz/veinfo') and not os.path.exists('/proc/vz/version')
def inside_lxc_container(): # mocked: tests/unit/test_load_kmod.py
return '/lxc/' in open('/proc/1/cgroup').read()
def inside_docker_container(): # mocked: tests/unit/test_load_kmod.py
return os.path.isfile('/.dockerenv')