Current File : //opt/alt/python37/lib/python3.7/site-packages/clwpos/hooks/wpos_modify_user_hook.py |
# coding=utf-8
# Copyright © Cloud Linux GmbH & Cloud Linux Software, Inc 2010-2021 All Rights Reserved
#
# Licensed under CLOUD LINUX LICENSE AGREEMENT
# http://cloudlinux.com/docs/LICENSE.TXT
from __future__ import absolute_import, print_function
import os
import subprocess
import sys
import shutil
from clcommon.clpwd import drop_privileges
from clcommon.cpapi import is_admin, cpinfo
from clcommon.lib.cledition import is_cl_solo_edition
from clcommon.public_hooks.lib import ModifyUserHook
from clwpos.cl_wpos_exceptions import WposError
from clwpos.optimization_features import OBJECT_CACHE_FEATURE
from clwpos.feature_suites import get_admin_config_directory
from clwpos.user.config import UserConfig
from clwpos.utils import WposUser, update_redis_conf, update_wp_config, user_uid
from clwpos.constants import SUITES_MARKERS
from clwpos.object_cache.redis_utils import reload_redis
from cldetectlib import is_plesk
class WposModifyUserHook(ModifyUserHook):
"""
Update user's data in Redis and WP configs.
"""
def post_modify_user(self, username: str, new_name: str = None, **kwargs):
"""
Update the name of the user's home directory in:
- ~/.clwpos/redis.conf,
- wp-config.php for Wordpresses with enabled object caching.
For Plesk also perform checks for incompatibilities after
PHP version changes
(they fall into the same Plesk event 'Update physical hosting')
"""
if is_plesk():
subprocess.run(
["/usr/share/cloudlinux/wpos/plesk/admin_disable_caching.py"])
if new_name is None:
return
new_user = WposUser(new_name)
if not new_user.home_dir.endswith(new_name):
raise WposError('Internal Error. Contact CloudLinux support')
old_user_homedir = os.path.join(new_user.home_dir[:-len(new_name)], username)
old_user = WposUser(username, homedir=old_user_homedir)
with drop_privileges(new_name):
# Update ~/.clwpos/redis.conf
if not os.path.exists(new_user.redis_conf):
# we don't continue if redis.conf is missing
# because it means that user has never enabled the module
return
update_redis_conf(new_user, old_user)
# Update wp-config.php files
# use user's WPOS config to get paths to Wordpresses with WPOS object caching enabled
user_config = UserConfig(new_name)
for abs_wp_path in user_config.wp_paths_with_enabled_module(OBJECT_CACHE_FEATURE):
update_wp_config(abs_wp_path, new_user, old_user)
try:
reload_redis()
except Exception as e:
print(f'Error occurred during daemon reload: {e}', file=sys.stderr)
def post_create_user(self, username, owner, **kwargs):
subprocess.run(["/opt/alt/python37/bin/python3", "/usr/sbin/clwpos_collect_information.py", username])
is_owned_by_admin = is_admin(cpinfo(cpuser=username, keyls=('reseller', ))[0][0])
if (is_owned_by_admin and os.path.isfile(SUITES_MARKERS['accelerate_wp_premium'])) and \
os.path.isfile(SUITES_MARKERS['accelerate_wp']):
print('Allowing both AWP and AWP Premium for user', username)
subprocess.run(['/usr/bin/cloudlinux-awp-admin', 'set-suite', '--suites',
'accelerate_wp_premium,accelerate_wp',
'--users', username, '--allowed'])
elif is_owned_by_admin and os.path.isfile(SUITES_MARKERS['accelerate_wp_premium']):
print('Allowing only AWP Premium for user', username)
subprocess.run(['/usr/bin/cloudlinux-awp-admin', 'set-suite', '--suites', 'accelerate_wp_premium',
'--users', username, '--allowed'])
elif os.path.isfile(SUITES_MARKERS['accelerate_wp']):
print('Allowing only AWP for user', username)
subprocess.run(['/usr/bin/cloudlinux-awp-admin', 'set-suite', '--suites', 'accelerate_wp',
'--users', username, '--allowed'])
# separate block for CDN, to not mix up with if-else above
if is_owned_by_admin and os.path.isfile(SUITES_MARKERS['accelerate_wp_cdn_pro']):
print('Allowing only AWP CDN Pro for user', username)
subprocess.run(['/usr/bin/cloudlinux-awp-admin', 'set-suite', '--suites', 'accelerate_wp_cdn_pro',
'--users', username, '--allowed'])
elif is_owned_by_admin and os.path.isfile(SUITES_MARKERS['accelerate_wp_cdn']):
print('Allowing only AWP CDN Free for user', username)
subprocess.run(['/usr/bin/cloudlinux-awp-admin', 'set-suite', '--suites', 'accelerate_wp_cdn',
'--users', username, '--allowed'])
# temporary disable AWP premium for all users owned by resellers
if not is_owned_by_admin:
print('Disallowing AWP Premium for user %s owned by reseller' % username)
subprocess.run(['/usr/bin/cloudlinux-awp-admin', 'set-suite', '--suites',
'accelerate_wp_premium',
'--user', username, '--disallowed'])
def pre_delete_user(self, username, **kwargs):
"""
Triggered before deleting user.
NOT TRIGGERED ON PLESK since there is no pre hooks
Cleans up garbage left in /var/clwpos/uids/{user_uid}
Not run on Solo edition
:param username: account name
"""
if is_cl_solo_edition():
print(f'CL Solo edition detected, skipping hook actions')
return
cfg_dir = get_admin_config_directory(user_uid(username=username))
print(f'Checking {cfg_dir}')
if os.path.isdir(cfg_dir):
print(f'{cfg_dir} exists, must be cleaned')
shutil.rmtree(cfg_dir)
else:
print(f'{cfg_dir} does not exist, nothing to be done')