mirror of
https://github.com/usmannasir/cyberpanel.git
synced 2026-05-07 00:26:52 +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.
147 lines
5.6 KiB
Python
147 lines
5.6 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
|
|
from manageServices.application_rabbitmq_repo import (
|
|
normalize_rabbitmq_stream,
|
|
ensure_rabbitmq_team_repos,
|
|
ensure_erlang_meets_minimum,
|
|
)
|
|
|
|
|
|
def adopt_or_reconcile(status_file):
|
|
state = detect_app_state('RabbitMQ')
|
|
if state['installed'] and not state['markerExists']:
|
|
ServerStatusUtil.executioner('touch /home/cyberpanel/rabbitmq', status_file)
|
|
logging.CyberCPLogFileWriter.statusWriter(
|
|
ServerStatusUtil.lswsInstallStatusPath,
|
|
'RabbitMQ detected and adopted by marker reconciliation.\n'
|
|
)
|
|
return state
|
|
|
|
|
|
def _resolve_target_version(version, stream):
|
|
if version and str(version).strip() != 'latest':
|
|
return str(version).strip()
|
|
from manageServices.application_versions import get_latest_version
|
|
return get_latest_version('RabbitMQ', '8', stream) or ''
|
|
|
|
|
|
def _run_rabbitmq_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 rabbitmq-server={0}'
|
|
).format(version)
|
|
else:
|
|
cmd = 'DEBIAN_FRONTEND=noninteractive apt-get install rabbitmq-server -y'
|
|
ServerStatusUtil.executioner(cmd, status_file)
|
|
return
|
|
|
|
if version and version != 'latest':
|
|
cmd = 'dnf install{0} -y rabbitmq-server-{1}'.format(ad, version)
|
|
ServerStatusUtil.executioner(cmd, status_file)
|
|
else:
|
|
cmd = 'dnf install{0} -y rabbitmq-server'.format(ad)
|
|
ServerStatusUtil.executioner(cmd, status_file)
|
|
|
|
|
|
def install(version='latest', stream='3'):
|
|
stream = normalize_rabbitmq_stream(stream)
|
|
status_file = open(ServerStatusUtil.lswsInstallStatusPath, 'w')
|
|
adopt_or_reconcile(status_file)
|
|
|
|
from manageServices.application_versions import version_compare
|
|
|
|
ensure_rabbitmq_team_repos(stream, status_file=status_file)
|
|
ensure_erlang_meets_minimum(stream, version, status_file=status_file)
|
|
|
|
state = detect_app_state('RabbitMQ')
|
|
backup_dir = ''
|
|
allow_downgrade = False
|
|
target = _resolve_target_version(version, stream)
|
|
|
|
if state['installed'] and state.get('installedVersion'):
|
|
status_file.write(
|
|
'Pre-version-change backup and service stop (RabbitMQ)...\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 RabbitMQ.\n')
|
|
status_file.flush()
|
|
backup_dir = create_managed_app_backup('RabbitMQ', status_file)
|
|
ServerStatusUtil.executioner('systemctl stop rabbitmq-server', status_file)
|
|
|
|
_run_rabbitmq_packages(version, status_file, allow_downgrade)
|
|
if backup_dir:
|
|
merge_data_from_backup('RabbitMQ', backup_dir, status_file)
|
|
ServerStatusUtil.executioner(CHOWN_CMDS['RabbitMQ'], status_file)
|
|
|
|
ServerStatusUtil.executioner('systemctl enable rabbitmq-server', status_file)
|
|
ServerStatusUtil.executioner('systemctl start rabbitmq-server', status_file)
|
|
time.sleep(4)
|
|
|
|
if backup_dir:
|
|
if service_is_active('RabbitMQ'):
|
|
cleanup_managed_backup(backup_dir, status_file)
|
|
status_file.write(
|
|
'RabbitMQ version change completed; backup removed after success.\n'
|
|
)
|
|
else:
|
|
status_file.write('RabbitMQ failed to start; restoring from backup...\n')
|
|
restore_full_backup(backup_dir, status_file)
|
|
ServerStatusUtil.executioner(CHOWN_CMDS['RabbitMQ'], status_file)
|
|
ServerStatusUtil.executioner('systemctl start rabbitmq-server', status_file)
|
|
time.sleep(4)
|
|
if not service_is_active('RabbitMQ'):
|
|
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/rabbitmq', status_file)
|
|
logging.CyberCPLogFileWriter.statusWriter(
|
|
ServerStatusUtil.lswsInstallStatusPath, 'RabbitMQ installed.[200]\n', 1
|
|
)
|
|
return 0
|
|
|
|
|
|
def upgrade(version='latest', stream='3'):
|
|
return install(version=version, stream=stream)
|
|
|
|
|
|
def remove():
|
|
status_file = open(ServerStatusUtil.lswsInstallStatusPath, 'w')
|
|
ServerStatusUtil.executioner('systemctl stop rabbitmq-server', status_file)
|
|
ServerStatusUtil.executioner('systemctl disable rabbitmq-server', status_file)
|
|
if is_debian_family():
|
|
ServerStatusUtil.executioner(
|
|
'DEBIAN_FRONTEND=noninteractive apt-get remove rabbitmq-server -y',
|
|
status_file,
|
|
)
|
|
else:
|
|
ServerStatusUtil.executioner('yum erase rabbitmq-server -y', status_file)
|
|
ServerStatusUtil.executioner('rm -f /home/cyberpanel/rabbitmq', status_file)
|
|
logging.CyberCPLogFileWriter.statusWriter(
|
|
ServerStatusUtil.lswsInstallStatusPath, 'RabbitMQ removed.[200]\n', 1
|
|
)
|
|
return 0
|