Browse Source

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()
heavygale 6 years ago
parent
commit
ecda554e53

+ 11 - 11
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"):

+ 9 - 9
data/web/debug.php

@@ -43,11 +43,11 @@ else {
         <?php
           $exec_fields = array('cmd' => '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;
         ?>
         <div role="tabpanel" class="tab-pane active" id="tab-containers">
           <div class="panel panel-default">
@@ -58,15 +58,15 @@ else {
               <div class="row">
                 <div class="col-sm-3">
                   <p>/var/vmail on <?=$vmail_df[0];?></p>
-                  <p class="disk_space"><?=$lang['debug']['disk_space'];?> <?=$vmail_df[3];?>B</p>
+                  <p class="disk_space"><?=$lang['debug']['disk_space'];?> <?=formatBytes($vmail_df[3]*1024);?></p>
                 </div>
                 <div class="col-sm-9">
                   <div class="progress">
-                    <div class="progress-bar progress-bar-info" role="progressbar" style="width:<?=$vmail_df[4];?>"></div>
+                    <div class="progress-bar progress-bar-info" role="progressbar" style="width:<?=$used_percent;?>%"></div>
                     <div class="progress-bar progress-bar-committed" role="progressbar" style="width:<?=$quotaPercent2;?>%"></div>
                   </div>
-                  <p><span class="container-indicator label usage-info progress-bar-info">&nbsp;</span> <?=$lang['debug']['disk_used'];?> <?=$vmail_df[2];?>B (<?=$vmail_df[4];?>)</p>
-                  <p><span class="container-indicator label usage-info progress-bar-committed">&nbsp;</span> <?=$lang['debug']['total_quota'];?> <?=$domainQuota;?>GB (<?=$quotaPercent1;?>%)</p>
+                  <p><span class="container-indicator label usage-info progress-bar-info">&nbsp;</span> <?=$lang['debug']['disk_used'];?> <?=formatBytes($vmail_df[2]*1024);?> (<?=$used_percent;?>%)</p>
+                  <p><span class="container-indicator label usage-info progress-bar-committed">&nbsp;</span> <?=$lang['debug']['total_quota'];?> <?=formatBytes($quota_stats['total_quota']*1024);?> (<?=$quotaPercent1;?>%)</p>
                 </div>
               </div>
             </div>

+ 0 - 13
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;
   }
 }

+ 8 - 3
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;