Browse Source

[Compose] Enable some minimal inits, change or remove some health checks

andryyy 8 years ago
parent
commit
8741b5f3b1

+ 4 - 1
data/web/edit.php

@@ -31,7 +31,10 @@ if (isset($_SESSION['mailcow_cc_role'])) {
               <div class="form-group">
                 <label class="control-label col-sm-2" for="goto"><?=$lang['edit']['target_address'];?></label>
                 <div class="col-sm-10">
-                  <textarea class="form-control" autocapitalize="none" autocorrect="off" rows="10" id="goto" name="goto"><?=htmlspecialchars($result['goto']) ?></textarea>
+                  <textarea id="textarea_alias_goto" class="form-control" autocapitalize="none" autocorrect="off" rows="10" id="goto" name="goto" required><?= ($result['goto'] != "null@localhost") ? htmlspecialchars($result['goto']) : null; ?></textarea>
+                  <div class="checkbox">
+                    <label><input id="goto_null" type="checkbox" value="1" name="goto_null" <?= ($result['goto'] == "null@localhost") ? "checked" : null; ?>> <?=$lang['add']['goto_null'];?></label>
+                  </div>
                 </div>
               </div>
               <div class="form-group">

+ 60 - 50
data/web/inc/functions.mailbox.inc.php

@@ -324,6 +324,7 @@ function mailbox($_action, $_type, $_data = null) {
           $addresses  = array_map('trim', preg_split( "/( |,|;|\n)/", $_data['address']));
           $gotos      = array_map('trim', preg_split( "/( |,|;|\n)/", $_data['goto']));
           $active = intval($_data['active']);
+          $goto_null = intval($_data['goto_null']);
           if (empty($addresses[0])) {
             $_SESSION['return'] = array(
               'type' => 'danger',
@@ -331,42 +332,47 @@ function mailbox($_action, $_type, $_data = null) {
             );
             return false;
           }
-          if (empty($gotos[0])) {
+          if (empty($gotos[0]) && $goto_null == 0) {
             $_SESSION['return'] = array(
               'type' => 'danger',
               'msg' => sprintf($lang['danger']['goto_empty'])
             );
             return false;
           }
-          foreach ($gotos as &$goto) {
-            if (empty($goto)) {
-              continue;
-            }
-            $goto_domain = idn_to_ascii(substr(strstr($goto, '@'), 1));
-            $goto_local_part = strstr($goto, '@', true);
-            $goto = $goto_local_part.'@'.$goto_domain;
-            $stmt = $pdo->prepare("SELECT `username` FROM `mailbox`
-              WHERE `kind` REGEXP 'location|thing|group'
-                AND `username`= :goto");
-            $stmt->execute(array(':goto' => $goto));
-            $num_results = count($stmt->fetchAll(PDO::FETCH_ASSOC));
-            if ($num_results != 0) {
-              $_SESSION['return'] = array(
-                'type' => 'danger',
-                'msg' => sprintf($lang['danger']['goto_invalid'])
-              );
-              return false;
-            }
-            if (!filter_var($goto, FILTER_VALIDATE_EMAIL) === true) {
-              $_SESSION['return'] = array(
-                'type' => 'danger',
-                'msg' => sprintf($lang['danger']['goto_invalid'])
-              );
-              return false;
+          if ($goto_null == "1") {
+            $goto = "null@localhost";
+          }
+          else {
+            foreach ($gotos as &$goto) {
+              if (empty($goto)) {
+                continue;
+              }
+              $goto_domain = idn_to_ascii(substr(strstr($goto, '@'), 1));
+              $goto_local_part = strstr($goto, '@', true);
+              $goto = $goto_local_part.'@'.$goto_domain;
+              $stmt = $pdo->prepare("SELECT `username` FROM `mailbox`
+                WHERE `kind` REGEXP 'location|thing|group'
+                  AND `username`= :goto");
+              $stmt->execute(array(':goto' => $goto));
+              $num_results = count($stmt->fetchAll(PDO::FETCH_ASSOC));
+              if ($num_results != 0) {
+                $_SESSION['return'] = array(
+                  'type' => 'danger',
+                  'msg' => sprintf($lang['danger']['goto_invalid'])
+                );
+                return false;
+              }
+              if (!filter_var($goto, FILTER_VALIDATE_EMAIL) === true) {
+                $_SESSION['return'] = array(
+                  'type' => 'danger',
+                  'msg' => sprintf($lang['danger']['goto_invalid'])
+                );
+                return false;
+              }
             }
+            $gotos = array_filter($gotos);
+            $goto = implode(",", $gotos);
           }
-          $gotos = array_filter($gotos);
-          $goto = implode(",", $gotos);
           foreach ($addresses as $address) {
             if (empty($address)) {
               continue;
@@ -1385,6 +1391,7 @@ function mailbox($_action, $_type, $_data = null) {
             $is_now = mailbox('get', 'alias_details', $address);
             if (!empty($is_now)) {
               $active = (isset($_data['active'])) ? intval($_data['active']) : $is_now['active_int'];
+              $goto_null = (isset($_data['goto_null'])) ? intval($_data['goto_null']) : $is_now['goto_null'];
               $goto   = (!empty($_data['goto'])) ? $_data['goto'] : $is_now['goto'];
             }
             else {
@@ -1394,30 +1401,33 @@ function mailbox($_action, $_type, $_data = null) {
               );
               return false;
             }
-            
-            $gotos = array_map('trim', preg_split( "/( |,|;|\n)/", $_data['goto']));
-            foreach ($gotos as &$goto) {
-              if (empty($goto)) {
-                continue;
-              }
-              if (!filter_var($goto, FILTER_VALIDATE_EMAIL)) {
-                $_SESSION['return'] = array(
-                  'type' => 'danger',
-                  'msg' =>sprintf($lang['danger']['goto_invalid'])
-                );
-                return false;
-              }
-              if ($goto == $address) {
-                $_SESSION['return'] = array(
-                  'type' => 'danger',
-                  'msg' => sprintf($lang['danger']['alias_goto_identical'])
-                );
-                return false;
+            if ($goto_null == "1") {
+              $goto = "null@localhost";
+            }
+            else {
+              $gotos = array_map('trim', preg_split( "/( |,|;|\n)/", $_data['goto']));
+              foreach ($gotos as &$goto) {
+                if (empty($goto)) {
+                  continue;
+                }
+                if (!filter_var($goto, FILTER_VALIDATE_EMAIL)) {
+                  $_SESSION['return'] = array(
+                    'type' => 'danger',
+                    'msg' =>sprintf($lang['danger']['goto_invalid'])
+                  );
+                  return false;
+                }
+                if ($goto == $address) {
+                  $_SESSION['return'] = array(
+                    'type' => 'danger',
+                    'msg' => sprintf($lang['danger']['alias_goto_identical'])
+                  );
+                  return false;
+                }
               }
+              $gotos = array_filter($gotos);
+              $goto = implode(",", $gotos);
             }
-            $gotos = array_filter($gotos);
-            $goto = implode(",", $gotos);
-            
             $domain = idn_to_ascii(substr(strstr($address, '@'), 1));
             $local_part = strstr($address, '@', true);
             if (!hasDomainAccess($_SESSION['mailcow_cc_username'], $_SESSION['mailcow_cc_role'], $domain)) {

+ 2 - 2
data/web/js/api.js

@@ -67,7 +67,7 @@ $(document).ready(function() {
       var req_empty = false;
       $(this).closest("form").find('select, textarea, input').each(function() {
         if ($(this).prop('required')) {
-          if (!$(this).val()) {
+          if (!$(this).val() && $(this).prop('disabled') === false) {
             req_empty = true;
             $(this).addClass('inputMissingAttr');
           } else {
@@ -126,7 +126,7 @@ $(document).ready(function() {
       var req_empty = false;
       $(this).closest("form").find('select, textarea, input').each(function() {
         if ($(this).prop('required')) {
-          if (!$(this).val()) {
+          if (!$(this).val() && $(this).prop('disabled') === false) {
             req_empty = true;
             $(this).addClass('inputMissingAttr');
           } else {

+ 14 - 0
data/web/js/edit.js

@@ -1,3 +1,17 @@
+$(document).ready(function() {
+  if ($("#goto_null").is(":checked")) {
+    $('#textarea_alias_goto').prop('disabled', true);
+  }
+  $("#goto_null").click(function( event ) {
+    if ($("#goto_null").is(":checked")) {
+      $('#textarea_alias_goto').prop('disabled', true);
+    }
+    else {
+      $("#textarea_alias_goto").removeAttr('disabled');
+    }
+  });
+});
+
 jQuery(function($){
   // http://stackoverflow.com/questions/46155/validate-email-address-in-javascript
   function validateEmail(email) {

+ 12 - 0
data/web/js/mailbox.js

@@ -30,6 +30,15 @@ $(document).ready(function() {
     $('#password2').val(random_passwd);
   });
 
+  $("#goto_null").click(function( event ) {
+    if ($("#goto_null").is(":checked")) {
+      $('#textarea_alias_goto').prop('disabled', true);
+    }
+    else {
+      $("#textarea_alias_goto").removeAttr('disabled');
+    }
+  });
+
   // Log modal
   $('#logModal').on('show.bs.modal', function(e) {
     var logText = $(e.relatedTarget).data('log-text');
@@ -283,6 +292,9 @@ jQuery(function($){
             if (item.is_catch_all == 1) {
               item.address = '<div class="label label-default">Catch-All</div> ' + item.address;
             }
+            if (item.goto == "null@localhost") {
+              item.goto = '⤷ <span style="font-size:12px" class="glyphicon glyphicon-trash" aria-hidden="true"></span>';
+            }
             if (item.in_primary_domain !== "") {
               item.domain = "↳ " + item.domain + " (" + item.in_primary_domain + ")";
             }

+ 2 - 0
data/web/lang/lang.de.php

@@ -331,6 +331,7 @@ $lang['edit']['dont_check_sender_acl'] = 'Absender für Domain %s u. Alias-Dom.
 $lang['edit']['multiple_bookings'] = 'Mehrfaches Buchen';
 $lang['edit']['kind'] = 'Art';
 $lang['edit']['resource'] = 'Ressource';
+$lang['edit']['goto_null'] = 'Nachrichten sofort verwerfen';
 
 $lang['add']['syncjob'] = 'Sync-Job erstellen';
 $lang['add']['syncjob_hint'] = 'Passwörter werden unverschlüsselt abgelegt!';
@@ -385,6 +386,7 @@ $lang['add']['password'] = 'Passwort';
 $lang['add']['password_repeat'] = 'Passwort (Wiederholung)';
 $lang['add']['previous'] = 'Vorherige Seite';
 $lang['add']['restart_sogo_hint'] = 'Der SOGo Container muss nach dem Hinzufügen einer neuen Domain neugestartet werden!';
+$lang['add']['goto_null'] = 'Nachrichten sofort verwerfen';
 
 $lang['login']['title'] = 'Anmeldung';
 $lang['login']['administration'] = 'Administration';

+ 2 - 0
data/web/lang/lang.en.php

@@ -336,6 +336,7 @@ $lang['edit']['dont_check_sender_acl'] = "Disable sender check for domain %s + a
 $lang['edit']['multiple_bookings'] = 'Multiple bookings';
 $lang['edit']['kind'] = 'Kind';
 $lang['edit']['resource'] = 'Resource';
+$lang['edit']['goto_null'] = 'Silently discard mail';
 
 $lang['add']['syncjob'] = 'Add sync job';
 $lang['add']['syncjob_hint'] = 'Be aware that passwords need to be saved plain-text!';
@@ -390,6 +391,7 @@ $lang['add']['password'] = 'Password';
 $lang['add']['password_repeat'] = 'Confirmation password (repeat)';
 $lang['add']['previous'] = 'Previous page';
 $lang['add']['restart_sogo_hint'] = 'You will need to restart the SOGo service container after adding a new domain!';
+$lang['add']['goto_null'] = 'Silently discard mail';
 
 $lang['login']['title'] = 'Login';
 $lang['login']['administration'] = 'Administration';

+ 4 - 1
data/web/modals/mailbox.php

@@ -234,7 +234,10 @@ if (!isset($_SESSION['mailcow_cc_role'])) {
 					<div class="form-group">
 						<label class="control-label col-sm-2" for="goto"><?=$lang['add']['target_address'];?></label>
 						<div class="col-sm-10">
-							<textarea autocorrect="off" autocapitalize="none" class="form-control" rows="5" id="goto" name="goto" required></textarea>
+							<textarea id="textarea_alias_goto" autocorrect="off" autocapitalize="none" class="form-control" rows="5" id="goto" name="goto" required></textarea>
+							<div class="checkbox">
+                <label><input id="goto_null" type="checkbox" value="1" name="goto_null"> <?=$lang['add']['goto_null'];?></label>
+							</div>
 							<p><?=$lang['add']['target_address_info'];?></p>
 						</div>
 					</div>

+ 12 - 34
docker-compose.yml

@@ -1,18 +1,14 @@
-version: '2.1'
+version: '2.3'
 services:
 
     unbound-mailcow:
       image: mailcow/unbound:1.0
       build: ./data/Dockerfiles/unbound
       command: /usr/sbin/unbound
+      init: true
       depends_on:
         mysql-mailcow:
           condition: service_healthy
-      healthcheck:
-        test: ["CMD", "nslookup", "mailcow.email", "127.0.0.1"]
-        interval: 30s
-        timeout: 3s
-        retries: 10
       volumes:
         - ./data/conf/unbound/unbound.conf:/etc/unbound/unbound.conf:ro
       restart: always
@@ -38,6 +34,7 @@ services:
         - MYSQL_DATABASE=${DBNAME}
         - MYSQL_USER=${DBUSER}
         - MYSQL_PASSWORD=${DBPASS}
+      init: true
       restart: always
       dns:
         - 172.22.1.254
@@ -50,9 +47,6 @@ services:
 
     redis-mailcow:
       image: redis:alpine
-      depends_on:
-        unbound-mailcow:
-          condition: service_healthy
       volumes:
         - redis-vol-1:/data/
       restart: always
@@ -66,11 +60,12 @@ services:
             - redis
 
     clamd-mailcow:
-      image: mailcow/clamd:1.2
+      image: mailcow/clamd:1.3
       build: ./data/Dockerfiles/clamd
       restart: on-failure
       environment:
         - SKIP_CLAMD=${SKIP_CLAMD:-n}
+      init: true
       dns:
         - 172.22.1.254
       dns_search: mailcow-network
@@ -82,11 +77,7 @@ services:
     rspamd-mailcow:
       image: mailcow/rspamd:1.6
       build: ./data/Dockerfiles/rspamd
-      command: > 
-        /bin/bash -c "
-        sleep 5;
-        /usr/bin/rspamd -f -u _rspamd -g _rspamd
-        "
+      command: "/usr/bin/rspamd -f -u _rspamd -g _rspamd"
       depends_on:
         - nginx-mailcow
       volumes:
@@ -97,6 +88,7 @@ services:
         - dkim-vol-1:/data/dkim
         - rspamd-vol-1:/var/lib/rspamd
       restart: always
+      init: true
       dns:
         - 172.22.1.254
       dns_search: mailcow-network
@@ -142,9 +134,6 @@ services:
     sogo-mailcow:
       image: mailcow/sogo:1.8
       build: ./data/Dockerfiles/sogo
-      depends_on:
-        unbound-mailcow:
-          condition: service_healthy
       environment:
         - DBNAME=${DBNAME}
         - DBUSER=${DBUSER}
@@ -166,9 +155,6 @@ services:
     dovecot-mailcow:
       image: mailcow/dovecot:1.8
       build: ./data/Dockerfiles/dovecot
-      depends_on:
-        unbound-mailcow:
-          condition: service_healthy
       volumes:
         - ./data/conf/dovecot:/usr/local/etc/dovecot
         - ./data/assets/ssl:/etc/ssl/mail/:ro
@@ -204,9 +190,6 @@ services:
     postfix-mailcow:
       image: mailcow/postfix:1.4
       build: ./data/Dockerfiles/postfix
-      depends_on:
-        unbound-mailcow:
-          condition: service_healthy
       volumes:
         - ./data/conf/postfix:/opt/postfix/conf
         - ./data/assets/ssl:/etc/ssl/mail/:ro
@@ -232,9 +215,6 @@ services:
 
     memcached-mailcow:
       image: memcached:alpine
-      depends_on:
-        unbound-mailcow:
-          condition: service_healthy
       restart: always
       dns:
         - 172.22.1.254
@@ -249,15 +229,11 @@ services:
         - sogo-mailcow
         - php-fpm-mailcow
       image: nginx:mainline-alpine
-      healthcheck:
-        test: ["CMD", "ping", "php-fpm-mailcow", "-c", "5"]
-        interval: 5s
-        timeout: 5s
-        retries: 10
       command: /bin/sh -c "envsubst < /etc/nginx/conf.d/templates/listen_plain.template > /etc/nginx/conf.d/listen_plain.active &&
         envsubst < /etc/nginx/conf.d/templates/listen_ssl.template > /etc/nginx/conf.d/listen_ssl.active &&
         envsubst < /etc/nginx/conf.d/templates/server_name.template > /etc/nginx/conf.d/server_name.active &&
-        nginx -g 'daemon off;'"
+        until ping phpfpm -c1 > /dev/null; do sleep 1; done &&
+        exec nginx -g 'daemon off;'"
       environment:
         - HTTPS_PORT=${HTTPS_PORT:-443}
         - HTTP_PORT=${HTTP_PORT:-80}
@@ -283,8 +259,9 @@ services:
     acme-mailcow:
       depends_on:
         - nginx-mailcow
-      image: mailcow/acme:1.16
+      image: mailcow/acme:1.17
       build: ./data/Dockerfiles/acme
+      init: true
       dns:
         - 172.22.1.254
       dns_search: mailcow-network
@@ -319,6 +296,7 @@ services:
         - redis-mailcow
       restart: always
       privileged: true
+      init: true
       environment:
         - TZ=${TZ}
         - SKIP_FAIL2BAN=${SKIP_FAIL2BAN:-no}

+ 6 - 1
generate_config.sh

@@ -16,7 +16,12 @@ if [ -z "$MAILCOW_HOSTNAME" ]; then
   read -p "Hostname (FQDN): " -ei "mx.example.org" MAILCOW_HOSTNAME
 fi
 
-[[ -a /etc/timezone ]] && TZ=$(cat /etc/timezone)
+if [[ -a /etc/timezone ]]; then 
+ TZ=$(cat /etc/timezone) 
+elif  [[ -a /etc/localtime ]]; then
+ TZ=$(readlink /etc/localtime|sed -n 's|^.*zoneinfo/||p')
+fi
+
 if [ -z "$TZ" ]; then
   read -p "Timezone: " -ei "Europe/Berlin" TZ
 else