Mini Shell
# -*- coding: utf-8 -*-
# ui_config_lib.py - Library for panel config files manipulating for cloudlinux-config utility
# Copyright © Cloud Linux GmbH & Cloud Linux Software, Inc 2010-2019 All Rights Reserved
#
# Licensed under CLOUD LINUX LICENSE AGREEMENT
# http://cloudlinux.com/docs/LICENSE.TXT
import subprocess
import cldetectlib as detect
from clcommon.clexception import FormattedException
from clcommon.clquota import check_quota_enabled
from clcommon.const import Feature
from clcommon.cpapi import is_panel_feature_supported
from clcommon.ui_config import UIConfig
from cllimits.lib import exec_utility
from .clconfig_utils import boolean_to_0_1
class UIConfigException(FormattedException):
pass
DYNAMIC_UI_CTL_CMD = '/usr/share/l.v.e-manager/utils/dynamicui.py'
def get_ui_config():
"""
Retrives UI settings from config file
:return: dict. For example:
{'inodeLimits': {'showUserInodesUsage': False},
'uiSettings': {'hideRubyApp': False, 'hideLVEUserStat': False, 'hidePythonApp': False,
'hidePHPextensions': True}
}
"""
return filter_flags(UIConfig().get_config())
def refresh_panel():
try:
retcode, out, err = exec_utility(DYNAMIC_UI_CTL_CMD, ['--sync-conf=all'], stderr=True)
except OSError as e:
raise UIConfigException({'message': "Can't execute file %(ctl_cmd)s: " + str(e),
'context': {'ctl_cmd': DYNAMIC_UI_CTL_CMD}}) from e
if retcode != 0:
raise UIConfigException({'message': "Error while executing %(ctl_cmd)s: " + out + " " + err,
'context': {'ctl_cmd': DYNAMIC_UI_CTL_CMD}})
def set_ui_config(parameters_dict):
"""
Sets UI settings to UI config file
Using subfunction _set_ui_config
:param parameters_dict: Parameters to set dictionary. For example:
{'inodeLimits': {'showUserInodesUsage': False},
'uiSettings': {'hideRubyApp': False, 'hideLVEUserStat': False, 'hidePythonApp': False,
'hidePHPextensions': True}
}
:return: None
"""
# Backward compatibility cl-config -> cloudlinux-selector on hidePythonApp
try:
# Try to read hidePythonApp key
enablepythonapp = boolean_to_0_1(not parameters_dict['uiSettings']['hidePythonApp'])
# Translate enablepythonapp binary key to disabled/enabled format for cl-selector
lve_to_select = {'0':'disabled', '1': 'enabled'}
# Call cloudlinux selector with translated param
# CL-selector doesn't write changes to ui config file
py_command = ("cloudlinux-selector set --json --interpreter python --selector-status "
+ lve_to_select[enablepythonapp])
subprocess.check_call(py_command, shell=True, executable='/bin/bash',
stdout=subprocess.DEVNULL, stderr=subprocess.STDOUT)
except (subprocess.CalledProcessError, KeyError):
pass
# Call _set_ui_config with all params
# (duplicate cl-selector call to write changes to config file)
_set_ui_config(parameters_dict)
def _set_ui_config(parameters_dict):
"""
Sets UI settings to config file
:param parameters_dict: Parameters to set dictionary. For example:
{'inodeLimits': {'showUserInodesUsage': False},
'uiSettings': {'hideRubyApp': False, 'hideLVEUserStat': False, 'hidePythonApp': False,
'hidePHPextensions': True}
}
:return: None
"""
UIConfig().set_config(parameters_dict)
# Synchronize params with according panel config file
refresh_panel()
def filter_flags(mapped_flags):
panel_filter(mapped_flags.get('uiSettings'))
try:
if check_quota_enabled() is not None:
mapped_flags.pop('inodeLimits')
except KeyError:
pass
try:
if not is_panel_feature_supported(Feature.LVE):
mapped_flags.get('uiSettings', {}).pop('hideLVEUserStat')
except KeyError:
pass
return mapped_flags
def panel_filter(ui_settings):
"""
Function that filters UI Settings dictionary
depending on panel type
:param ui_settings: UI Settings that is filtered
"""
if not detect.is_cpanel() or \
not is_panel_feature_supported(Feature.RUBY_SELECTOR):
ui_settings.pop('hideRubyApp')
if detect.is_plesk() or not is_panel_feature_supported(Feature.PYTHON_SELECTOR):
ui_settings.pop('hidePythonApp')
if not is_panel_feature_supported(Feature.NODEJS_SELECTOR):
ui_settings.pop('hideNodeJsApp')
if not is_panel_feature_supported(Feature.XRAY):
ui_settings.pop('hideXrayApp')
if not is_panel_feature_supported(Feature.PHP_SELECTOR):
ui_settings.pop('hidePhpApp')
ui_settings.pop('hidePHPextensions')
Zerion Mini Shell 1.0