From 7d87cbf675bb7113bce87ff1a745b48e0b67f2fa Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Thorsten=20Ro=C3=9Fner?= <thorsten.rossner.extern@zendis.de>
Date: Fri, 6 Sep 2024 12:31:22 +0200
Subject: [PATCH] fix: Improve logging and attribute cleanup.

---
 lib/import_user.py |  42 ++++++++++++++++++++++++++++++------------
 lib/ucs.py         |   2 +-
 template.ods       | Bin 12992 -> 13096 bytes
 3 files changed, 31 insertions(+), 13 deletions(-)

diff --git a/lib/import_user.py b/lib/import_user.py
index 9599cc0..af8e776 100644
--- a/lib/import_user.py
+++ b/lib/import_user.py
@@ -25,26 +25,44 @@ class ImportUser:
         persons = pd.read_excel(self.input_file, engine='odf', skiprows=self.skip_rows)
         persons.rename(columns=self.columnnames_map, inplace=True)
 
-        logging.info(f"Going to process the following list:\n{persons.to_string()}")
+        logging.info(f"Cleaning up list")
 
-        # validate list
+        # cleanup list
         error_count = 0
-        for _, person in persons.iterrows():
-            if (person['email'] == 0):
+        for index, person in persons.iterrows():
+            if person['email'] == 0:
+                persons.drop(index, inplace=True)
                 continue
-            if (not isinstance(person['username'], str)):
-                logging.error(f"- missing username in '{person}'")
+            if not isinstance(person['username'], str):
+                logging.error(f"Missing username in '{person}'")
                 error_count+=1
                 continue
-            if (not bool(re.match(r'^[\w\d\.-]+$', person['username'], flags=re.IGNORECASE))):
-                logging.error(f"- found invalid characters in username: '{person['username']}'")
+            if person['username'].strip() != person['username']:
+                logging.warning(f"Leading or trailing blank(s) found in username email: '{person['username']}'")
+                persons.at[index, 'username'] = person['username'].strip()
+            if person['email'].strip() != person['email']:
+                logging.warning(f"Leading or trailing blank(s) found in external email: '{person['email']}'")
+                persons.at[index, 'email'] = person['email'].strip()
+            if 'mailPrimaryAddress' in person and isinstance(person['mailPrimaryAddress'], str):
+                if person['mailPrimaryAddress'].strip() != person['mailPrimaryAddress']:
+                    logging.warning(f"Leading or trailing blank(s) found in internal email: '{person['mailPrimaryAddress']}'")
+                    persons.at[index, 'mailPrimaryAddress'] = person['mailPrimaryAddress'].strip()
+
+        logging.info(f"Processing list with {len(persons.index)} lines.")
+        logging.debug(f"Going to process the following list:\n{persons.to_string()}")
+
+        # validate list
+        for index, person in persons.iterrows():
+            if not bool(re.match(r'^[\w\d\.-]+$', person['username'], flags=re.IGNORECASE)):
+                logging.error(f"Found invalid characters in username: '{person['username']}'")
                 error_count+=1
-            if (not bool(re.match(r'^[\w\d\.\-_]+@[\w\d\.\-_]+$', person['email'], flags=re.IGNORECASE))):
+            if not bool(re.match(r'^[\w\d\.\-_]+@[\w\d\.\-_]+$', person['email'], flags=re.IGNORECASE)):
                 logging.error(f"Found invalid external email: '{person['email']}'")
                 error_count+=1
-            if ('mailPrimaryAddress' in person) and (isinstance(person['mailPrimaryAddress'], str)) and (not bool(re.match(r'^[\w\d\.\-_]+@[\w\d\.\-_]+$', person['mailPrimaryAddress'], flags=re.IGNORECASE))):
-                logging.error(f"Found invalid primary email: '{person['mailPrimaryAddress']}'")
-                error_count+=1
+            if 'mailPrimaryAddress' in person and isinstance(person['mailPrimaryAddress'], str):
+                if not bool(re.match(r'^[\w\d\.\-_]+@[\w\d\.\-_]+$', person['mailPrimaryAddress'], flags=re.IGNORECASE)):
+                    logging.error(f"Found invalid primary email: '{person['mailPrimaryAddress']}'")
+                    error_count+=1
         if (error_count > 0):
             sys.exit("! Found errors, please fix and rerun the script")
 
diff --git a/lib/ucs.py b/lib/ucs.py
index 0854004..6ecf658 100644
--- a/lib/ucs.py
+++ b/lib/ucs.py
@@ -243,7 +243,7 @@ class Ucs:
                 logging.debug(f"Reconcile {username} groups to: {person['groups']}")
                 self.update_user(current_json, person)
             else:
-                logging.warning(f"User {dn} already exists.")
+                logging.info(f"User {dn} already exists.")
         else:
             logging.info(f"Creating user {username}")
             self.create_user(person)
diff --git a/template.ods b/template.ods
index 524ff6ea9ac09d30f6d032bd80c843a07838bfd3..e39536532b95a0e8e4e6a716bf56fe2f242c0d04 100644
GIT binary patch
delta 8799
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
Rbcd4$TFOs`U%`DX`9IH2UM~Ou

delta 8585
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

-- 
GitLab