Files
CyberPanel/manageServices/application_redis.py

133 lines
4.8 KiB
Python
Raw Permalink Normal View History

import time
from serverStatus.serverStatusUtil import ServerStatusUtil
from plogical import CyberCPLogFileWriter as logging
from manageServices.application_backup import (
CHOWN_CMDS,
cleanup_managed_backup,
create_managed_app_backup,
merge_data_from_backup,
restore_full_backup,
service_is_active,
)
from manageServices.application_detection import detect_app_state, is_debian_family
def adopt_or_reconcile(status_file):
state = detect_app_state('Redis')
if state['installed'] and not state['markerExists']:
ServerStatusUtil.executioner('touch /home/cyberpanel/redis', status_file)
logging.CyberCPLogFileWriter.statusWriter(
ServerStatusUtil.lswsInstallStatusPath,
'Redis detected and adopted by marker reconciliation.\n'
)
return state
def _resolve_target_version(version):
if version and str(version).strip() != 'latest':
return str(version).strip()
from manageServices.application_versions import get_latest_version
return get_latest_version('Redis', '8', '3') or ''
def _run_redis_packages(version, status_file, allow_downgrade):
ad = ' --allow-downgrade' if allow_downgrade else ''
if is_debian_family():
if version and version != 'latest':
cmd = (
'DEBIAN_FRONTEND=noninteractive apt-get install -y '
'--allow-downgrades redis-server={0}'
).format(version)
else:
cmd = 'DEBIAN_FRONTEND=noninteractive apt-get install redis-server -y'
ServerStatusUtil.executioner(cmd, status_file)
return
if version and version != 'latest':
cmd = 'dnf install{0} -y redis-{1}'.format(ad, version)
ServerStatusUtil.executioner(cmd, status_file)
else:
cmd = 'dnf install{0} -y redis'.format(ad)
ServerStatusUtil.executioner(cmd, status_file)
def install(version='latest'):
status_file = open(ServerStatusUtil.lswsInstallStatusPath, 'w')
adopt_or_reconcile(status_file)
from manageServices.application_versions import version_compare
state = detect_app_state('Redis')
backup_dir = ''
allow_downgrade = False
target = _resolve_target_version(version)
if state['installed'] and state.get('installedVersion'):
status_file.write('Pre-version-change backup and service stop (Redis)...\n')
status_file.flush()
iv = state['installedVersion']
if target and version_compare(iv, target) > 0:
allow_downgrade = True
status_file.write('Downgrade path enabled for Redis.\n')
status_file.flush()
backup_dir = create_managed_app_backup('Redis', status_file)
ServerStatusUtil.executioner('systemctl stop redis', status_file)
_run_redis_packages(version, status_file, allow_downgrade)
if backup_dir:
merge_data_from_backup('Redis', backup_dir, status_file)
ServerStatusUtil.executioner(CHOWN_CMDS['Redis'], status_file)
ServerStatusUtil.executioner('systemctl enable redis', status_file)
ServerStatusUtil.executioner('systemctl start redis', status_file)
time.sleep(2)
if backup_dir:
if service_is_active('Redis'):
cleanup_managed_backup(backup_dir, status_file)
status_file.write(
'Redis version change completed; backup removed after success.\n'
)
else:
status_file.write('Redis failed to start; restoring from backup...\n')
restore_full_backup(backup_dir, status_file)
ServerStatusUtil.executioner(CHOWN_CMDS['Redis'], status_file)
ServerStatusUtil.executioner('systemctl start redis', status_file)
time.sleep(2)
if not service_is_active('Redis'):
status_file.write(
'Recovery unclear — backup kept at {0}\n'.format(backup_dir)
)
else:
status_file.write(
'Prior state restored from backup. Backup retained for safety.\n'
)
status_file.flush()
ServerStatusUtil.executioner('touch /home/cyberpanel/redis', status_file)
logging.CyberCPLogFileWriter.statusWriter(
ServerStatusUtil.lswsInstallStatusPath, 'Redis installed.[200]\n', 1
)
return 0
def upgrade(version='latest'):
return install(version=version)
def remove():
status_file = open(ServerStatusUtil.lswsInstallStatusPath, 'w')
if is_debian_family():
ServerStatusUtil.executioner(
'DEBIAN_FRONTEND=noninteractive apt-get remove redis-server -y', status_file
)
else:
ServerStatusUtil.executioner('yum erase redis -y', status_file)
ServerStatusUtil.executioner('rm -f /home/cyberpanel/redis', status_file)
logging.CyberCPLogFileWriter.statusWriter(
ServerStatusUtil.lswsInstallStatusPath, 'Redis removed.[200]\n', 1
)
return 0