Implement disk usage refresh feature for email accounts. Add a new endpoint and corresponding view to refresh disk usage, ensuring accurate display in the UI. Update JavaScript and HTML templates to support the new functionality, enhancing user experience with real-time updates. Refactor disk usage calculation for improved accuracy and error handling.

This commit is contained in:
Master3395
2025-09-19 01:09:48 +02:00
parent 317b75bb9a
commit c525af21c5
7 changed files with 190 additions and 120 deletions

115
faq.sh
View File

@@ -1,115 +0,0 @@
#!/bin/bash
RED='\033[0;31m'
GREEN='\033[0;32m'
BLUE='\033[0;34m'
PURPLE='\033[0;35m'
NC='\033[0m' # No Color
#${RED}text${NC}
#${GREEN} ${BLUE}
echo -e "Use Up/Down Arrow key to navigate\n"
echo -e "press ${RED}q${NC} to exit\n"
echo -e "Frequently Asked Question
${PURPLE}1.${NC} How to reset CyberPanel admin password?
execute command ${RED}adminPass YOUR_NEW_PASSWORD${NC}
${BLUE}------------------------------------------------------------${NC}
${PURPLE}2.${NC} How to reset LiteSpeed WebAdmin Console user/password ?
execute command ${RED}/usr/local/lsws/admin/misc/admpass.sh${NC}
${BLUE}------------------------------------------------------------${NC}
${PURPLE}3.${NC} How to access LiteSpeed webadmin console ?
Please check this post: ${GREEN}https://community.cyberpanel.net/c/support/55${NC}
${BLUE}------------------------------------------------------------${NC}
${PURPLE}4.${NC} What is MariaDB root password ?
execute command ${RED}cat /etc/cyberpanel/mysqlPassword${NC} will show you the root password
${BLUE}------------------------------------------------------------${NC}
${PURPLE}5.${NC} Can I change MariaDB root passwod ?
Yes , but after you changed , please make sure you have updated the password in following 2 files as well
${RED}/etc/cyberpanel/mysqlPassword${NC}
${RED}/usr/local/CyberCP/CyberCP/settings.py${NC}
otherwise CyberPanel will not have access to database.
${BLUE}------------------------------------------------------------${NC}
${PURPLE}6.${NC} How to raise upload limit for cyberpanel's phpMyAdmin and File Manager?
edit file ${RED}/usr/local/lsws/lsphp83/etc/php.ini${NC} for CentOS or openEuler
${RED}/usr/local/lsws/lsphp83/etc/php/8.3/litespeed/php.ini${NC} for Ubuntu
find 2 configurations:
${RED}post_max_size${NC} and ${RED}upload_max_filesize${NC} , change from to higher number, e.g. ${RED}100M${NC} (don't miss the M)
and then run ${RED}pkill lsphp${NC} to kill all current php process for new configuration to take effect.
${BLUE}------------------------------------------------------------${NC}
${PURPLE}7.${NC} How to add more IPs to my website(s) ?
For OpenLiteSpeed, please check this post: ${GREEN}https://community.cyberpanel.net/c/support/55${NC}
For LiteSpeed Enterprise, please check this post: ${GREEN}https://community.cyberpanel.net/c/support/55${NC}
${BLUE}------------------------------------------------------------${NC}
${PURPLE}8.${NC} How to remove 8090 port in CyberPanel URL ?
Please check this post ${GREEN}https://blog.cyberpanel.net/2018/12/25/how-to-remove-port-8090-from-cyberpanel/${NC}
${BLUE}------------------------------------------------------------${NC}
${PURPLE}9.${NC} How to enable Auto-Index for my site ?
Please check this post ${GREEN}https://community.cyberpanel.net/c/support/55${NC}
${BLUE}------------------------------------------------------------${NC}
${PURPLE}10.${NC} How to add additional headers for my website ?
Please check this post ${GREEN}https://openlitespeed.org/kb/how-to-set-up-custom-headers/${NC}
${BLUE}------------------------------------------------------------${NC}
${PURPLE}11.${NC} How to mimic Apache deny/allow directive ?
Please check this post ${GREEN}https://openlitespeed.org/kb/access-control/${NC}
${BLUE}------------------------------------------------------------${NC}
${PURPLE}12.${NC} How to fix max_allowed_packet error ?
You may see this error when your PHP script requires a larger packet size
add following code into ${RED}/etc/my.cnf${NC}
${GREEN}[mysqld]
max_allowed_packet=500M${NC}
and then restart MariaDB by command ${RED}systemctl restart mariadb${NC}
${BLUE}------------------------------------------------------------${NC}
${PURPLE}13.${NC} How to enable PHP error log ?
Please check this post ${GREEN}https://community.cyberpanel.net/c/support/55${NC}
"

View File

@@ -216,7 +216,20 @@ class MailServerManager(multi.Thread):
numberofEmails = 0 numberofEmails = 0
duration = '0m' duration = '0m'
dic = {'id': count, 'email': items.email, 'DiskUsage': '%sMB' % items.DiskUsage, 'numberofEmails': numberofEmails, 'duration': duration} # Fix disk usage display - ensure it shows proper format
disk_usage = items.DiskUsage
if not disk_usage or disk_usage == '0' or disk_usage == '0MB':
disk_usage = '0 MB'
elif not disk_usage.endswith('MB') and not disk_usage.endswith('GB') and not disk_usage.endswith('KB'):
# If it's just a number, assume it's in MB
try:
# Try to convert to number and add MB suffix
num_value = float(disk_usage)
disk_usage = f"{num_value:.1f} MB"
except:
disk_usage = '0 MB'
dic = {'id': count, 'email': items.email, 'DiskUsage': disk_usage, 'numberofEmails': numberofEmails, 'duration': duration}
count = count + 1 count = count + 1
if checker == 0: if checker == 0:
@@ -576,8 +589,24 @@ class MailServerManager(multi.Thread):
checker = 0 checker = 0
for items in records: for items in records:
# Fix disk usage display - ensure it shows proper format
disk_usage = items.DiskUsage
if not disk_usage or disk_usage == '0' or disk_usage == '0MB':
disk_usage = '0 MB'
elif not disk_usage.endswith('MB') and not disk_usage.endswith('GB') and not disk_usage.endswith('KB'):
# If it's just a number, assume it's in MB
try:
# Try to convert to number and add MB suffix
num_value = float(disk_usage)
disk_usage = f"{num_value:.1f} MB"
except:
disk_usage = '0 MB'
elif disk_usage.endswith('MB'):
# Ensure proper formatting with space
disk_usage = disk_usage.replace('MB', ' MB')
dic = {'email': items.email, dic = {'email': items.email,
'DiskUsage': '%sMB' % items.DiskUsage.rstrip('MB') 'DiskUsage': disk_usage
} }
if checker == 0: if checker == 0:
@@ -2001,6 +2030,67 @@ protocol sieve {
json_data = json.dumps(data_ret) json_data = json.dumps(data_ret)
return HttpResponse(json_data) return HttpResponse(json_data)
def refreshEmailDiskUsage(self):
"""Refresh disk usage for all email accounts in a domain"""
try:
userID = self.request.session['userID']
currentACL = ACLManager.loadedACL(userID)
if ACLManager.currentContextPermission(currentACL, 'listEmails') == 0:
return ACLManager.loadErrorJson('refreshStatus', 0)
data = json.loads(self.request.body)
domain = data['domain']
admin = Administrator.objects.get(pk=userID)
if ACLManager.checkOwnership(domain, admin, currentACL) == 1:
pass
else:
return ACLManager.loadErrorJson()
try:
emailDomain = Domains.objects.get(domain=domain)
except:
final_dic = {'status': 0, 'refreshStatus': 0, 'error_message': "No email accounts exist for this domain!"}
final_json = json.dumps(final_dic)
return HttpResponse(final_json)
# Refresh disk usage for all emails in this domain
emails = emailDomain.eusers_set.all()
updated_count = 0
for email in emails:
try:
# Calculate the email path
emailPath = '/home/vmail/%s/%s' % (domain, email.email.split('@')[0])
# Get updated disk usage
new_disk_usage = virtualHostUtilities.getDiskUsageofPath(emailPath)
# Update the database
email.DiskUsage = new_disk_usage
email.save()
updated_count += 1
except Exception as e:
logging.CyberCPLogFileWriter.writeToFile(f"Error updating disk usage for {email.email}: {str(e)}")
continue
final_dic = {
'status': 1,
'refreshStatus': 1,
'error_message': "None",
'updated_count': updated_count,
'message': f"Successfully updated disk usage for {updated_count} email accounts"
}
final_json = json.dumps(final_dic)
return HttpResponse(final_json)
except BaseException as msg:
data_ret = {'status': 0, 'refreshStatus': 0, 'error_message': str(msg)}
json_data = json.dumps(data_ret)
return HttpResponse(json_data)
def main(): def main():
parser = argparse.ArgumentParser(description='CyberPanel') parser = argparse.ArgumentParser(description='CyberPanel')

View File

@@ -1345,6 +1345,63 @@ app.controller('listEmails', function ($scope, $http) {
}; };
$scope.refreshDiskUsage = function () {
if (!$scope.selectedDomain) {
new PNotify({
title: 'Warning!',
text: 'Please select a domain first.',
type: 'warning'
});
return;
}
$scope.cyberpanelLoading = true;
var url = "/email/refreshEmailDiskUsage";
var data = {
domain: $scope.selectedDomain,
};
var config = {
headers: {
'X-CSRFToken': getCookie('csrftoken')
}
};
$http.post(url, data, config).then(refreshSuccess, refreshError);
function refreshSuccess(response) {
$scope.cyberpanelLoading = false;
if (response.data.refreshStatus === 1) {
// Refresh the email list to show updated disk usage
$scope.populateCurrentRecords();
new PNotify({
title: 'Success!',
text: response.data.message || 'Disk usage refreshed successfully.',
type: 'success'
});
} else {
new PNotify({
title: 'Error!',
text: response.data.error_message || 'Failed to refresh disk usage.',
type: 'error'
});
}
}
function refreshError(response) {
$scope.cyberpanelLoading = false;
new PNotify({
title: 'Error!',
text: 'Could not connect to server, please refresh this page.',
type: 'error'
});
}
};
}); });

View File

@@ -582,6 +582,10 @@
<i class="fas fa-plus-circle"></i> <i class="fas fa-plus-circle"></i>
{% trans "Create Email" %} {% trans "Create Email" %}
</a> </a>
<button ng-click="refreshDiskUsage()" ng-disabled="cyberpanelLoading" class="btn-secondary">
<i class="fas fa-sync-alt" ng-class="{'fa-spin': cyberpanelLoading}"></i>
{% trans "Refresh Disk Usage" %}
</button>
<a target="_blank" rel="noopener" href="https://cyberpanel.net/KnowledgeBase/home/email-debugger-cyberpanel/" class="btn-secondary"> <a target="_blank" rel="noopener" href="https://cyberpanel.net/KnowledgeBase/home/email-debugger-cyberpanel/" class="btn-secondary">
<i class="fas fa-bug"></i> <i class="fas fa-bug"></i>
{% trans "Debug Email Issues" %} {% trans "Debug Email Issues" %}

View File

@@ -35,4 +35,7 @@ urlpatterns = [
### email limits ### email limits
re_path(r'^EmailLimits$', views.EmailLimits, name='EmailLimits'), re_path(r'^EmailLimits$', views.EmailLimits, name='EmailLimits'),
re_path(r'^SaveEmailLimitsNew$', views.SaveEmailLimitsNew, name='SaveEmailLimitsNew'), re_path(r'^SaveEmailLimitsNew$', views.SaveEmailLimitsNew, name='SaveEmailLimitsNew'),
### disk usage refresh
re_path(r'^refreshEmailDiskUsage$', views.refreshEmailDiskUsage, name='refreshEmailDiskUsage'),
] ]

View File

@@ -262,5 +262,14 @@ def SaveEmailLimitsNew(request):
json_data = json.dumps(data_ret) json_data = json.dumps(data_ret)
return HttpResponse(json_data) return HttpResponse(json_data)
def refreshEmailDiskUsage(request):
try:
msM = MailServerManager(request)
return msM.refreshEmailDiskUsage()
except KeyError as msg:
data_ret = {'refreshStatus': 0, 'error_message': str(msg)}
json_data = json.dumps(data_ret)
return HttpResponse(json_data)

View File

@@ -1769,9 +1769,31 @@ local_name %s {
@staticmethod @staticmethod
def getDiskUsageofPath(path): def getDiskUsageofPath(path):
try: try:
return subprocess.check_output('du -hs %s --block-size=1M' % (path), shell=True).decode("utf-8").split()[0] # Check if path exists first
except BaseException: if not os.path.exists(path):
return '0MB' return '0 MB'
# Use du command to get disk usage in MB
result = subprocess.check_output('du -sm %s' % (path), shell=True).decode("utf-8").strip()
if result:
# Extract the number from the result (format: "123\t/path")
usage_mb = result.split('\t')[0]
try:
# Convert to float and format properly
usage_value = float(usage_mb)
if usage_value < 1:
return '0.1 MB'
else:
return f"{usage_value:.1f} MB"
except ValueError:
return '0 MB'
else:
return '0 MB'
except BaseException as e:
# Log the error for debugging
logging.CyberCPLogFileWriter.writeToFile(f"Error calculating disk usage for {path}: {str(e)}")
return '0 MB'
@staticmethod @staticmethod
def permissionControl(path): def permissionControl(path):