Version Management: upgrade log polling, progress 0-100%, origin label

- upgradeStatus: handle missing log and cat stderr; read upgrade_progress JSON; return progress; remove progress file on completion.
- upgrade.py: ProgressPathNew sidecar, init log/progress at SoftUpgrade start, monotonic progress from log size and 100 on Upgrade Completed, cleanup progress file after soft upgrade.
- upgrade() POST returns progress 0 when upgrade thread starts.
- versionManagment: relabel fork row as Your repository (git origin).
- system-status.js: show Upgrade Progress percentage during polling (3x paths synced via cp).
This commit is contained in:
master3395
2026-04-11 21:34:18 +02:00
parent d629da06e5
commit de616c0c7c
6 changed files with 144 additions and 15 deletions

View File

@@ -696,6 +696,12 @@ app.controller('versionManagment', function ($scope, $http, $timeout) {
$scope.updateStarted = false;
$scope.updateFinish = true;
$scope.couldNotConnect = true;
var startPct = (typeof response.data.progress !== 'undefined' && isFinite(response.data.progress))
? response.data.progress : 0;
var progEl = document.getElementById('upgradeProgressLog');
if (progEl) {
progEl.innerText = 'Upgrade Progress: ' + startPct + '%';
}
getUpgradeStatus();
} else {
$scope.updateError = false;
@@ -740,6 +746,12 @@ app.controller('versionManagment', function ($scope, $http, $timeout) {
function ListInitialDatas(response) {
console.log(response.data.upgradeLog);
var pct = (typeof response.data.progress !== 'undefined' && isFinite(response.data.progress))
? response.data.progress : 0;
var progEl = document.getElementById('upgradeProgressLog');
if (progEl) {
progEl.innerText = 'Upgrade Progress: ' + pct + '%';
}
if (response.data.upgradeStatus === 1) {
@@ -753,6 +765,9 @@ app.controller('versionManagment', function ($scope, $http, $timeout) {
$scope.updateStarted = true;
$scope.updateFinish = false;
$scope.couldNotConnect = true;
if (progEl) {
progEl.innerText = 'Upgrade Progress: 100%';
}
} else {
$scope.upgradelogBox = false;

View File

@@ -414,7 +414,7 @@
{% if fork_remote_commit %}
<div class="version-meta-row">
<span class="version-meta-row-label">{% trans "Your fork — latest on GitHub" %}</span>
<span class="version-meta-row-label">{% trans "Your repository (git origin) — latest on GitHub" %}</span>
<span class="version-meta-row-value">
<code class="version-sha" title="{{ fork_remote_commit }}">{{ fork_remote_commit_short }}</code>
{% if fork_commit_url %}

View File

@@ -432,7 +432,7 @@ def upgrade(request):
background = ApplicationInstaller('UpgradeCP', extraArgs)
background.start()
adminData = {"upgrade": 1}
adminData = {"upgrade": 1, "progress": 0}
json_data = json.dumps(adminData)
return HttpResponse(json_data)
@@ -442,6 +442,21 @@ def upgrade(request):
return HttpResponse(json_data)
def _read_upgrade_progress_percent():
"""Read JSON sidecar written by plogical.upgrade.Upgrade.write_upgrade_progress."""
try:
from plogical.upgrade import Upgrade
prog_path = getattr(Upgrade, 'ProgressPathNew', '/home/cyberpanel/upgrade_progress')
if os.path.isfile(prog_path):
with open(prog_path, 'r') as rf:
data = json.loads(rf.read())
v = int(data.get('pct', 0))
return max(0, min(100, v))
except (ValueError, TypeError, json.JSONDecodeError, OSError, KeyError):
pass
return 0
def upgradeStatus(request):
try:
val = request.session['userID']
@@ -456,28 +471,49 @@ def upgradeStatus(request):
from plogical.upgrade import Upgrade
path = Upgrade.LogPathNew
prog_path = getattr(Upgrade, 'ProgressPathNew', '/home/cyberpanel/upgrade_progress')
pct = _read_upgrade_progress_percent()
try:
upgradeLog = ProcessUtilities.outputExecutioner(f'cat {path}')
except:
upgradeLog = None
if os.path.isfile(path):
try:
upgradeLog = ProcessUtilities.outputExecutioner(f'cat {path}')
except BaseException:
upgradeLog = None
if upgradeLog is None or not isinstance(upgradeLog, str):
upgradeLog = None
elif upgradeLog.strip().startswith('cat:'):
upgradeLog = None
if upgradeLog is None:
final_json = json.dumps({'finished': 0, 'upgradeStatus': 1,
'error_message': "None",
'upgradeLog': "Upgrade Just started.."})
'upgradeLog': "Waiting for upgrade log…",
'progress': pct})
return HttpResponse(final_json)
if upgradeLog.find("Upgrade Completed") > -1:
command = f'rm -rf {path}'
ProcessUtilities.executioner(command)
try:
if os.path.isfile(prog_path):
os.remove(prog_path)
except OSError:
pass
final_json = json.dumps({'finished': 1, 'upgradeStatus': 1,
'error_message': "None",
'upgradeLog': upgradeLog})
'upgradeLog': upgradeLog,
'progress': 100})
return HttpResponse(final_json)
else:
pct = _read_upgrade_progress_percent()
final_json = json.dumps({'finished': 0, 'upgradeStatus': 1,
'error_message': "None",
'upgradeLog': upgradeLog})
'upgradeLog': upgradeLog,
'progress': pct})
return HttpResponse(final_json)
except BaseException as msg:
final_dic = {'upgradeStatus': 0, 'error_message': str(msg)}