Skip to content

Commit f8542df

Browse files
committed
Restore package and WordPress status data
1 parent 049fc93 commit f8542df

8 files changed

Lines changed: 271 additions & 66 deletions

File tree

serverStatus/static/serverStatus/serverStatus.js

Lines changed: 50 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -924,10 +924,19 @@ app.controller('listOSPackages', function ($scope, $http, $timeout) {
924924

925925
$scope.currentPage = 1;
926926
$scope.recordsToShow = 10;
927+
$scope.currentTab = 'upgrade';
928+
$scope.allPackages = [];
929+
$scope.showDetails = false;
930+
$scope.showUpdate = false;
931+
$scope.updateComplete = true;
927932
var globalType;
928933

929934
$scope.fetchPackages = function (type = 'installed') {
930935
$scope.cyberpanelLoading = false;
936+
if ($scope.currentTab !== type) {
937+
$scope.currentPage = 1;
938+
}
939+
$scope.currentTab = type;
931940
globalType = type;
932941
var config = {
933942
headers: {
@@ -974,6 +983,17 @@ app.controller('listOSPackages', function ($scope, $http, $timeout) {
974983
};
975984
$scope.fetchPackages('upgrade');
976985

986+
$scope.showPackageDetails = function (packageFetch) {
987+
$scope.selectedPackage = packageFetch;
988+
$scope.packageDetails = '';
989+
$scope.showDetails = true;
990+
$scope.fetchPackageDetails(packageFetch);
991+
};
992+
993+
$scope.closeDetails = function () {
994+
$scope.showDetails = false;
995+
};
996+
977997
$scope.fetchPackageDetails = function (packageFetch) {
978998
$scope.cyberpanelLoading = false;
979999
$scope.package = packageFetch;
@@ -1017,6 +1037,28 @@ app.controller('listOSPackages', function ($scope, $http, $timeout) {
10171037

10181038
};
10191039

1040+
$scope.showUpdateModal = function (packageToUpgrade) {
1041+
$scope.updatingPackage = packageToUpgrade;
1042+
$scope.requestData = '';
1043+
$scope.updateComplete = false;
1044+
$scope.showUpdate = true;
1045+
$scope.updatePackage(packageToUpgrade);
1046+
};
1047+
1048+
$scope.closeUpdate = function () {
1049+
if ($scope.updateComplete) {
1050+
$scope.showUpdate = false;
1051+
}
1052+
};
1053+
1054+
$scope.closeModal = function (event) {
1055+
if (event.target !== event.currentTarget) {
1056+
return;
1057+
}
1058+
$scope.closeDetails();
1059+
$scope.closeUpdate();
1060+
};
1061+
10201062
$scope.updatePackage = function (packageToUpgrade = 'all') {
10211063
$scope.cyberpanelLoading = false;
10221064
$scope.package = packageToUpgrade;
@@ -1040,6 +1082,7 @@ app.controller('listOSPackages', function ($scope, $http, $timeout) {
10401082
if (response.data.status === 1) {
10411083
getRequestStatus();
10421084
} else {
1085+
$scope.updateComplete = true;
10431086
new PNotify({
10441087
title: 'Error!',
10451088
text: response.data.error_message,
@@ -1050,6 +1093,7 @@ app.controller('listOSPackages', function ($scope, $http, $timeout) {
10501093

10511094
function cantLoadInitialData(response) {
10521095
$scope.cyberpanelLoading = true;
1096+
$scope.updateComplete = true;
10531097
new PNotify({
10541098
title: 'Operation Failed!',
10551099
text: 'Could not connect to server, please refresh this page',
@@ -1083,15 +1127,18 @@ app.controller('listOSPackages', function ($scope, $http, $timeout) {
10831127
$scope.requestData = response.data.requestStatus;
10841128
$timeout(getRequestStatus, 1000);
10851129
} else {
1086-
// Notifications
1087-
$timeout.cancel();
10881130
$scope.cyberpanelLoading = true;
10891131
$scope.requestData = response.data.requestStatus;
1132+
$scope.updateComplete = true;
1133+
if (response.data.installed === 1) {
1134+
$scope.fetchPackages($scope.currentTab);
1135+
}
10901136
}
10911137
}
10921138

10931139
function cantLoadInitialDatas(response) {
10941140
$scope.cyberpanelLoading = true;
1141+
$scope.updateComplete = true;
10951142
new PNotify({
10961143
title: 'Operation Failed!',
10971144
text: 'Could not connect to server, please refresh this page',
@@ -1201,4 +1248,4 @@ app.controller('changePort', function ($scope, $http, $timeout) {
12011248

12021249
};
12031250

1204-
});
1251+
});

serverStatus/templates/serverStatus/packageManager.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -830,7 +830,7 @@ <h1 class="page-title">
830830
<option value="500">500 {% trans "per page" %}</option>
831831
</select>
832832

833-
<button type="button" class="btn btn-success" ng-click="updatePackage('all')"
833+
<button type="button" class="btn btn-success" ng-click="showUpdateModal('all')"
834834
ng-show="currentTab === 'upgrade'" aria-label="{% trans 'Update all packages' %}">
835835
<i class="fas fa-download"></i>
836836
{% trans "Update All" %}
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
from types import SimpleNamespace
2+
import unittest
3+
4+
import psutil
5+
6+
from serverStatus.views import get_service_memory_usage
7+
8+
9+
class ProcessMemoryUsageTests(unittest.TestCase):
10+
11+
def test_counts_mariadb_and_mysql_processes(self):
12+
processes = [
13+
SimpleNamespace(info={
14+
'name': 'mariadbd',
15+
'memory_info': SimpleNamespace(rss=4096),
16+
}),
17+
SimpleNamespace(info={
18+
'name': 'mysql-router',
19+
'memory_info': SimpleNamespace(rss=2048),
20+
}),
21+
SimpleNamespace(info={
22+
'name': 'unrelated-process',
23+
'memory_info': SimpleNamespace(rss=8192),
24+
}),
25+
]
26+
27+
memory_usage = get_service_memory_usage(
28+
('mariadbd', 'mysqld', 'mysql'), lambda attrs: processes)
29+
30+
self.assertEqual(6144, memory_usage)
31+
32+
def test_skips_processes_that_cannot_be_inspected(self):
33+
class UnavailableProcess:
34+
@property
35+
def info(self):
36+
raise psutil.AccessDenied(pid=1)
37+
38+
processes = [
39+
UnavailableProcess(),
40+
SimpleNamespace(info={
41+
'name': 'litespeed',
42+
'memory_info': SimpleNamespace(rss=1024),
43+
}),
44+
]
45+
46+
memory_usage = get_service_memory_usage(
47+
('litespeed', 'lshttpd'), lambda attrs: processes)
48+
49+
self.assertEqual(1024, memory_usage)
50+
51+
52+
if __name__ == '__main__':
53+
unittest.main()

serverStatus/views.py

Lines changed: 46 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,36 @@
2424
BUNDLE = 2
2525
EXPIRE = 3
2626

27+
28+
SERVICE_PROCESS_NAMES = {
29+
'litespeed': ('litespeed', 'lshttpd'),
30+
'mysql': ('mariadbd', 'mysqld', 'mysql'),
31+
'powerdns': ('pdns_server', 'pdns'),
32+
'pureftp': ('pure-ftpd',),
33+
'postfix': ('postfix',),
34+
}
35+
36+
37+
def get_service_memory_usage(service_names, process_iter=psutil.process_iter):
38+
memory_usage = 0
39+
40+
for process in process_iter(['name', 'memory_info']):
41+
try:
42+
info = process.info
43+
process_name = info.get('name') or ''
44+
if not any(process_name == name or process_name.startswith(name + '-')
45+
for name in service_names):
46+
continue
47+
48+
memory_info = info.get('memory_info')
49+
if memory_info:
50+
memory_usage += memory_info.rss
51+
except (psutil.Error, OSError, AttributeError):
52+
continue
53+
54+
return memory_usage
55+
56+
2757
def serverStatusHome(request):
2858
proc = httpProc(request, 'serverStatus/index.html',
2959
None, 'admin')
@@ -195,24 +225,13 @@ def servicesStatus(request):
195225

196226
processlist = ProcessUtilities.outputExecutioner('ps -A')
197227

198-
def getServiceStats(service):
199-
if service in processlist:
200-
return 1
201-
else:
202-
return 0
203-
204-
def getMemStats(service):
205-
memCount = 0
206-
for proc in psutil.process_iter():
207-
if service in proc.name():
208-
process = psutil.Process(proc.pid)
209-
memCount += process.memory_info().rss
210-
return memCount
228+
def getServiceStats(*service_names):
229+
return int(any(service in processlist for service in service_names))
211230

212231
### [1] status [2] mem
213-
lsStatus.append(getServiceStats('litespeed'))
214-
if getServiceStats('litespeed'):
215-
lsStatus.append(getMemStats('litespeed'))
232+
lsStatus.append(getServiceStats(*SERVICE_PROCESS_NAMES['litespeed']))
233+
if lsStatus[0]:
234+
lsStatus.append(get_service_memory_usage(SERVICE_PROCESS_NAMES['litespeed']))
216235
else:
217236
lsStatus.append(0)
218237

@@ -227,7 +246,7 @@ def getMemStats(service):
227246

228247
if mysqlResult.find('active (running)') > -1:
229248
sqlStatus.append(1)
230-
sqlStatus.append(getMemStats('mariadbd'))
249+
sqlStatus.append(get_service_memory_usage(SERVICE_PROCESS_NAMES['mysql']))
231250
else:
232251
sqlStatus.append(0)
233252
sqlStatus.append(0)
@@ -243,26 +262,23 @@ def getMemStats(service):
243262
sqlStatus.append(0)
244263
s.close()
245264

246-
if getServiceStats('mysql'):
247-
sqlStatus.append(getMemStats('mysql'))
248-
else:
249-
sqlStatus.append(0)
265+
sqlStatus.append(get_service_memory_usage(SERVICE_PROCESS_NAMES['mysql']))
250266

251-
dnsStatus.append(getServiceStats('pdns'))
252-
if getServiceStats('pdns'):
253-
dnsStatus.append(getMemStats('pdns'))
267+
dnsStatus.append(getServiceStats(*SERVICE_PROCESS_NAMES['powerdns']))
268+
if dnsStatus[0]:
269+
dnsStatus.append(get_service_memory_usage(SERVICE_PROCESS_NAMES['powerdns']))
254270
else:
255271
dnsStatus.append(0)
256272

257-
ftpStatus.append(getServiceStats('pure-ftpd'))
258-
if getServiceStats('pure-ftpd'):
259-
ftpStatus.append(getMemStats('pure-ftpd'))
273+
ftpStatus.append(getServiceStats(*SERVICE_PROCESS_NAMES['pureftp']))
274+
if ftpStatus[0]:
275+
ftpStatus.append(get_service_memory_usage(SERVICE_PROCESS_NAMES['pureftp']))
260276
else:
261277
ftpStatus.append(0)
262278

263-
mailStatus.append(getServiceStats('postfix'))
264-
if getServiceStats('postfix'):
265-
mailStatus.append(getMemStats('postfix'))
279+
mailStatus.append(getServiceStats(*SERVICE_PROCESS_NAMES['postfix']))
280+
if mailStatus[0]:
281+
mailStatus.append(get_service_memory_usage(SERVICE_PROCESS_NAMES['postfix']))
266282
else:
267283
mailStatus.append(0)
268284

websiteFunctions/templates/websiteFunctions/WPsiteHome.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -870,7 +870,7 @@ <h2>{{ wpsite.title }}</h2>
870870
<div class="stat-icon">
871871
<i class="fab fa-wordpress"></i>
872872
</div>
873-
<p class="stat-value" id="WPVersion">Loading...</p>
873+
<p class="stat-value" id="WPVersion">Unavailable</p>
874874
<p class="stat-label">WordPress Version</p>
875875
</div>
876876
<div class="wp-stat-card">
@@ -1386,4 +1386,4 @@ <h4>Database Management</h4>
13861386
</div>
13871387
</div>
13881388

1389-
{% endblock %}
1389+
{% endblock %}

websiteFunctions/templates/websiteFunctions/WPsitesList.html

Lines changed: 30 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -195,19 +195,42 @@
195195
GLobalAjaxCall($http, "{% url 'GetCurrentThemes' %}", data,
196196
function(response) {
197197
if (response.data.status === 1) {
198-
var themes = JSON.parse(response.data.themes);
199-
site.activeTheme = themes.find(function(t) { return t.status === 'active'; }).name;
200-
site.totalThemes = themes.length;
198+
try {
199+
var themes = JSON.parse(response.data.themes);
200+
var activeTheme = themes.find(function(t) {
201+
return t.status && t.status.toLowerCase() === 'active';
202+
});
203+
site.activeTheme = activeTheme ? activeTheme.name : 'Unavailable';
204+
site.totalThemes = themes.length;
205+
} catch (e) {
206+
site.activeTheme = 'Unavailable';
207+
site.totalThemes = 0;
208+
}
209+
} else {
210+
site.activeTheme = 'Unavailable';
211+
site.totalThemes = 0;
201212
}
202213
site.loadingTheme = false;
203214
},
204215
function(response) {
205-
site.activeTheme = 'Error';
216+
site.activeTheme = 'Unavailable';
217+
site.totalThemes = 0;
206218
site.loadingTheme = false;
207219
}
208220
);
209221
}
210222

223+
function markSiteDataUnavailable(site) {
224+
site.version = 'Unavailable';
225+
site.phpVersion = 'Unavailable';
226+
site.activeTheme = 'Unavailable';
227+
site.activePlugins = 0;
228+
site.totalPlugins = 0;
229+
site.loading = false;
230+
site.loadingTheme = false;
231+
site.loadingPlugins = false;
232+
}
233+
211234
// Function to fetch site data
212235
function fetchSiteData(site) {
213236
var data = { WPid: site.id };
@@ -219,7 +242,7 @@
219242
if (response.data.status === 1) {
220243
var data = response.data.ret_data;
221244
site.version = data.version;
222-
site.phpVersion = data.phpVersion || 'PHP 7.4'; // Default to PHP 7.4 if not set
245+
site.phpVersion = data.phpVersion || 'Unavailable';
223246
site.searchIndex = data.searchIndex === 1;
224247
site.debugging = data.debugging === 1;
225248
site.passwordProtection = data.passwordprotection === 1;
@@ -228,14 +251,12 @@
228251
fetchPluginData(site);
229252
fetchThemeData(site);
230253
} else {
231-
site.phpVersion = 'PHP 7.4'; // Default value on error
232-
site.loading = false;
254+
markSiteDataUnavailable(site);
233255
console.log('Failed to fetch site data:', response.data.error_message);
234256
}
235257
},
236258
function(response) {
237-
site.phpVersion = 'PHP 7.4'; // Default value on error
238-
site.loading = false;
259+
markSiteDataUnavailable(site);
239260
console.log('Failed to fetch site data');
240261
}
241262
);

0 commit comments

Comments
 (0)