]> Frank Brehm's Git Trees - pixelpark/admin-tools.git/commitdiff
Generalized ignoring aliases
authorFrank Brehm <frank.brehm@pixelpark.com>
Thu, 4 May 2017 15:12:01 +0000 (17:12 +0200)
committerFrank Brehm <frank.brehm@pixelpark.com>
Thu, 4 May 2017 15:12:01 +0000 (17:12 +0200)
pp_lib/barracuda_sync_app.py

index 0dfc5cfc7d94951577d2fdcffc00c463009405c3..3aaaae2ef441078562fc8842a6e38ff7638ecd6f 100644 (file)
@@ -44,7 +44,7 @@ from .ldap_app import PpLdapAppError, PpLdapApplication
 
 from .mailaddress import MailAddress
 
-__version__ = '0.3.1'
+__version__ = '0.4.1'
 LOG = logging.getLogger(__name__)
 
 
@@ -68,10 +68,13 @@ class PpBarracudaSyncApp(PpLdapApplication):
         os.path.join(postfix_maps_dir, 'virtual-aliases'),
     ]
 
+    default_ignore_aliases = [
+        'root',
+    ]
+
     default_origin = 'pixelpark.com'
 
     re_virtaliases_line = re.compile(r'^([^#\s:]+)\s', re.MULTILINE)
-    re_root_address = re.compile(r'^root(?:@.*)?\s*$', re.IGNORECASE)
 
     open_args = {}
     if six.PY3:
@@ -86,11 +89,13 @@ class PpBarracudaSyncApp(PpLdapApplication):
         self.barracuda_base_dn = self.default_barracuda_base_dn
         self.virtaliases_files = copy.copy(self.default_virtaliases_files)
         self.origin = self.default_origin
+        self.ignore_aliases = copy.copy(self.default_ignore_aliases)
 
         self.existing_aliases = []
         self.ldap_aliases = []
         self.aliases_to_create = []
         self.aliases_to_remove = []
+        self.ignore_aliases_res = []
 
         self._show_simulate_opt = True
 
@@ -104,6 +109,7 @@ class PpBarracudaSyncApp(PpLdapApplication):
             cfg_stems='barracuda-sync'
         )
 
+        self._init_ignore_aliases_res()
         self.initialized = True
 
     # -------------------------------------------------------------------------
@@ -180,6 +186,21 @@ class PpBarracudaSyncApp(PpLdapApplication):
                         if f not in virtaliases_files:
                             virtaliases_files.append(f)
 
+            if 'ignore_aliases' in section:
+                v = section['ignore_aliases']
+                aliases = shlex.split(v)
+                if aliases:
+                    for alias in aliases:
+                        if alias.startswith('-'):
+                            alias = alias[1:]
+                            if alias == '':
+                                continue
+                            if alias in self.ignore_aliases:
+                                self.ignore_aliases.remove(alias)
+                        elif alias not in self.ignore_aliases:
+                            self.ignore_aliases.append(alias)
+
+
             if 'base_dn' in section:
                 v = section['base_dn'].strip()
                 if v:
@@ -224,6 +245,24 @@ class PpBarracudaSyncApp(PpLdapApplication):
                 os.path.join(self.postfix_maps_dir, 'virtual-aliases'),
             ]
 
+    # -------------------------------------------------------------------------
+    def _init_ignore_aliases_res(self):
+
+        LOG.debug("Preparing regexes for aliases to ignore ...")
+        self.ignore_aliases_res = []
+
+        for alias in self.ignore_aliases:
+
+            a = alias.strip()
+            if a == '':
+                continue
+            pattern = r'^' + alias
+            if not MailAddress.valid_address(alias):
+                pattern += r'(?:@' + re.escape(self.origin) + r')?'
+            pattern += r'\s*$'
+            regex = re.compile(pattern, re.IGNORECASE)
+            self.ignore_aliases_res.append(regex)
+
     # -------------------------------------------------------------------------
     def pre_run(self):
         """
@@ -264,7 +303,12 @@ class PpBarracudaSyncApp(PpLdapApplication):
                 content = fh.read()
             aliases = self.re_virtaliases_line.findall(content)
             for alias in aliases:
-                if self.re_root_address.match(alias):
+                do_add = True
+                for regex in self.ignore_aliases_res:
+                    if regex.search(alias):
+                        do_add = False
+                        break
+                if not do_add:
                     continue
                 if alias not in self.existing_aliases:
                     if self.verbose > 2: