mirror of
https://github.com/usmannasir/cyberpanel.git
synced 2026-05-07 06:36:20 +02:00
Add modular application packages with backup-aware install/upgrade/downgrade, DNF-backed version lists with TTL caching, and HTML bootstrap for faster loads. Improve the version picker (labels, selection state, background meta refresh) and route applicationMeta through shared page meta cache. Update static assets and cache buster for manageServices.js. Repository also includes related updates to serviceManager, upgrade tooling, website functions, and user management from this development tree.
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
|