From ecda554e5353b4b398165a05efdb8eea3ba5eaac Mon Sep 17 00:00:00 2001 From: heavygale Date: Tue, 1 Oct 2019 20:27:06 +0200 Subject: [PATCH] finalizing disk usage rework - changed dockerapi to not return human readable values for df - all caluclations now in KiB - moved code from domain_admin to mailbox functions - using actual occupied bytes as used quota - all outputs now in *iB using formatBytes() --- data/Dockerfiles/dockerapi/server.py | 22 ++++++++++----------- data/web/debug.php | 18 ++++++++--------- data/web/inc/functions.domain_admin.inc.php | 13 ------------ data/web/inc/functions.mailbox.inc.php | 11 ++++++++--- 4 files changed, 28 insertions(+), 36 deletions(-) diff --git a/data/Dockerfiles/dockerapi/server.py b/data/Dockerfiles/dockerapi/server.py index ede9433c..0c4672df 100644 --- a/data/Dockerfiles/dockerapi/server.py +++ b/data/Dockerfiles/dockerapi/server.py @@ -64,11 +64,11 @@ class container_post(Resource): print("api call: %s, container_id: %s" % (api_call_method_name, container_id)) return api_call_method(container_id) except Exception as e: - print("error - container_post: %s" % str(e)) + print("error - container_post: %s" % str(e)) return jsonify(type='danger', msg=str(e)) else: - return jsonify(type='danger', msg='invalid container id or missing action') + return jsonify(type='danger', msg='invalid container id or missing action') # api call: container_post - post_action: stop @@ -107,7 +107,7 @@ class container_post(Resource): # api call: container_post - post_action: exec - cmd: mailq - task: delete def container_post__exec__mailq__delete(self, container_id): - if 'items' in request.json: + if 'items' in request.json: r = re.compile("^[0-9a-fA-F]+$") filtered_qids = filter(r.match, request.json['items']) if filtered_qids: @@ -121,7 +121,7 @@ class container_post(Resource): # api call: container_post - post_action: exec - cmd: mailq - task: hold def container_post__exec__mailq__hold(self, container_id): - if 'items' in request.json: + if 'items' in request.json: r = re.compile("^[0-9a-fA-F]+$") filtered_qids = filter(r.match, request.json['items']) if filtered_qids: @@ -135,7 +135,7 @@ class container_post(Resource): # api call: container_post - post_action: exec - cmd: mailq - task: unhold def container_post__exec__mailq__unhold(self, container_id): - if 'items' in request.json: + if 'items' in request.json: r = re.compile("^[0-9a-fA-F]+$") filtered_qids = filter(r.match, request.json['items']) if filtered_qids: @@ -149,7 +149,7 @@ class container_post(Resource): # api call: container_post - post_action: exec - cmd: mailq - task: deliver def container_post__exec__mailq__deliver(self, container_id): - if 'items' in request.json: + if 'items' in request.json: r = re.compile("^[0-9a-fA-F]+$") filtered_qids = filter(r.match, request.json['items']) if filtered_qids: @@ -206,7 +206,7 @@ class container_post(Resource): def container_post__exec__system__df(self, container_id): if 'dir' in request.json: for container in docker_client.containers.list(filters={"id": container_id}): - df_return = container.exec_run(["/bin/bash", "-c", "/bin/df -H '" + request.json['dir'].replace("'", "'\\''") + "' | /usr/bin/tail -n1 | /usr/bin/tr -s [:blank:] | /usr/bin/tr ' ' ','"], user='nobody') + df_return = container.exec_run(["/bin/bash", "-c", "/bin/df '" + request.json['dir'].replace("'", "'\\''") + "' | /usr/bin/tail -n1 | /usr/bin/tr -s [:blank:] | /usr/bin/tr ' ' ','"], user='nobody') if df_return.exit_code == 0: return df_return.output.decode('utf-8').rstrip() else: @@ -264,7 +264,7 @@ class container_post(Resource): def container_post__exec__sieve__print(self, container_id): if 'username' in request.json and 'script_name' in request.json: for container in docker_client.containers.list(filters={"id": container_id}): - cmd = ["/bin/bash", "-c", "/usr/bin/doveadm sieve get -u '" + request.json['username'].replace("'", "'\\''") + "' '" + request.json['script_name'].replace("'", "'\\''") + "'"] + cmd = ["/bin/bash", "-c", "/usr/bin/doveadm sieve get -u '" + request.json['username'].replace("'", "'\\''") + "' '" + request.json['script_name'].replace("'", "'\\''") + "'"] sieve_return = container.exec_run(cmd) return exec_run_handler('utf8_text_only', sieve_return) @@ -286,7 +286,7 @@ class container_post(Resource): for container in docker_client.containers.list(filters={"id": container_id}): cmd = "/usr/bin/rspamadm pw -e -p '" + request.json['raw'].replace("'", "'\\''") + "' 2> /dev/null" cmd_response = exec_cmd_container(container, cmd, user="_rspamd") - + matched = False for line in cmd_response.split("\n"): if '$2$' in line: @@ -306,7 +306,7 @@ class container_post(Resource): return jsonify(type='success', msg='command completed successfully') else: return jsonify(type='danger', msg='command did not complete') - + def exec_cmd_container(container, cmd, user, timeout=2, shell_cmd="/bin/bash"): @@ -333,7 +333,7 @@ def exec_cmd_container(container, cmd, user, timeout=2, shell_cmd="/bin/bash"): except: pass return ''.join(total_data) - + try : socket = container.exec_run([shell_cmd], stdin=True, socket=True, user=user).output._sock if not cmd.endswith("\n"): diff --git a/data/web/debug.php b/data/web/debug.php index eaa4b9a9..03752d34 100644 --- a/data/web/debug.php +++ b/data/web/debug.php @@ -43,11 +43,11 @@ else { 'system', 'task' => 'df', 'dir' => '/var/vmail'); $vmail_df = explode(',', json_decode(docker('post', 'dovecot-mailcow', 'exec', $exec_fields), true)); - $domainQuota = round(domain_admin('total_quota')/1024); - $inactive_bytes = round(mailbox('get','inactive_bytes')/1024/1024/1024); - $quotaPercent1 = round(($domainQuota/substr($vmail_df[3], 0, -1))*100); - $quotaPercent2 = round((($domainQuota-substr($vmail_df[2], 0, -1)+$inactive_bytes)/substr($vmail_df[3], 0, -1))*100); - $quotaPercent2 = ($quotaPercent2+substr($vmail_df[4], 0, -1)>100) ? 100-substr($vmail_df[4], 0, -1) : $quotaPercent2; //handling overcommitment + $used_percent = substr($vmail_df[4], 0, -1); + $quota_stats = mailbox('get','quota_stats'); + $quotaPercent1 = round(($quota_stats['total_quota']/$vmail_df[3])*100); + $quotaPercent2 = round((($quota_stats['total_quota']-$quota_stats['used_bytes'])/$vmail_df[3])*100); + $quotaPercent2 = ($quotaPercent2+$used_percent>100) ? 100-$used_percent : $quotaPercent2; ?>
@@ -58,15 +58,15 @@ else {

/var/vmail on

-

B

+

-
+
-

  B ()

-

  GB (%)

+

  (%)

+

  (%)

diff --git a/data/web/inc/functions.domain_admin.inc.php b/data/web/inc/functions.domain_admin.inc.php index 7fe4b3fa..6c821aa1 100644 --- a/data/web/inc/functions.domain_admin.inc.php +++ b/data/web/inc/functions.domain_admin.inc.php @@ -444,18 +444,5 @@ function domain_admin($_action, $_data = null) { return $domainadmindata; break; - case 'total_quota': - if ($_SESSION['mailcow_cc_role'] != "admin") { - $_SESSION['return'][] = array( - 'type' => 'danger', - 'log' => array(__FUNCTION__, $_action, $_data_log), - 'msg' => 'access_denied' - ); - return false; - } - $stmt = $pdo->query("SELECT SUM(`quota`) AS `quota` FROM `domain` WHERE `active`=1"); - $row = $stmt->fetch(PDO::FETCH_ASSOC); - return $row['quota']; - break; } } diff --git a/data/web/inc/functions.mailbox.inc.php b/data/web/inc/functions.mailbox.inc.php index 0b781a6c..7546c6c6 100644 --- a/data/web/inc/functions.mailbox.inc.php +++ b/data/web/inc/functions.mailbox.inc.php @@ -3254,7 +3254,8 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) { } return $resourcedata; break; - case 'inactive_bytes': + case 'quota_stats': + $quotadata = array(); if ($_SESSION['mailcow_cc_role'] != "admin") { return false; } @@ -3263,9 +3264,13 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) { WHERE `mailbox`.`kind` NOT REGEXP 'location|thing|group' AND `mailbox`.`username` = `quota2`.`username` AND `domain`.`domain` = `mailbox`.`domain` - AND `domain`.`active` = 0"); + AND `domain`.`active` = 1"); $row = $stmt->fetch(PDO::FETCH_ASSOC); - return $row['bytes']; + $quotadata['used_bytes'] = $row['bytes']/1024; + $stmt = $pdo->query("SELECT SUM(`quota`) AS `quota` FROM `domain` WHERE `active`=1"); + $row = $stmt->fetch(PDO::FETCH_ASSOC); + $quotadata['total_quota'] = $row['quota']*1024; + return $quotadata; break; } break;