mirror of
https://github.com/usmannasir/cyberpanel.git
synced 2026-05-07 06:36:20 +02:00
133 lines
4.8 KiB
Python
133 lines
4.8 KiB
Python
|
|
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
|