From 795191292d1472726c0267b78c80cd3f1a159073 Mon Sep 17 00:00:00 2001 From: midas Date: Wed, 30 Apr 2025 09:28:44 +0000 Subject: [PATCH] library/calendar_sync.py aktualisiert --- library/calendar_sync.py | 92 +++++++++++++++++++++++++--------------- 1 file changed, 58 insertions(+), 34 deletions(-) diff --git a/library/calendar_sync.py b/library/calendar_sync.py index 67016f8..fe07258 100644 --- a/library/calendar_sync.py +++ b/library/calendar_sync.py @@ -4,19 +4,22 @@ from ansible.module_utils.basic import AnsibleModule from caldav import DAVClient import vobject -def connect_calendar(url, user=None, password=None): - # Verbindung zum Kalender herstellen - client = DAVClient(url, username=user, password=password) if user else DAVClient(url) - principal = client.principal() - calendars = principal.calendars() - - if not calendars: - raise Exception(f"Kein Kalender unter {url} gefunden") - - return calendars[0] +def connect_calendar(url, user=None, password=None, verify_ssl=True): + try: + client = DAVClient( + url, + username=user, + password=password, + ssl_verify_cert=verify_ssl + ) + calendar = client.calendar(url=url) + # Test-Zugriff um sicherzustellen, dass der Kalender existiert + calendar.get_properties(['displayname']) + return calendar + except Exception as e: + raise Exception(f"Kalenderverbindung fehlgeschlagen: {str(e)}") def get_event_uid_map(calendar): - # Mapping der Ereignis-UIDs zu den Events erstellen uid_map = {} for event in calendar.events(): try: @@ -24,31 +27,32 @@ def get_event_uid_map(calendar): uid = cal.vevent.uid.value uid_map[uid] = event except Exception as e: - continue # Fehler bei einem Event überspringen + continue # Fehlerhafte Events überspringen return uid_map def sync_calendars(source_cal, target_cal): - # Kalender synchronisieren src_events = get_event_uid_map(source_cal) tgt_events = get_event_uid_map(target_cal) changed = False added, updated, removed = [], [], [] - # Neue und aktualisierte Ereignisse hinzufügen + # Neue/aktualisierte Events for uid, src_event in src_events.items(): + tgt_event = tgt_events.get(uid) src_data = src_event.data - if uid not in tgt_events: + + if not tgt_event: target_cal.add_event(src_data) added.append(uid) changed = True - elif src_data != tgt_events[uid].data: - tgt_events[uid].delete() - target_cal.add_event(src_data) + elif src_data != tgt_event.data: + tgt_event.data = src_data + tgt_event.save() updated.append(uid) changed = True - # Entfernte Ereignisse löschen + # Entfernte Events löschen for uid in set(tgt_events.keys()) - set(src_events.keys()): tgt_events[uid].delete() removed.append(uid) @@ -57,39 +61,59 @@ def sync_calendars(source_cal, target_cal): return changed, added, updated, removed def run_module(): - # Definieren der Moduleingaben module_args = dict( source_url=dict(type='str', required=True), source_user=dict(type='str', required=False, default=None), source_password=dict(type='str', required=False, no_log=True, default=None), target_url=dict(type='str', required=True), target_user=dict(type='str', required=False, default=None), - target_password=dict(type='str', required=False, no_log=True, default=None) + target_password=dict(type='str', required=False, no_log=True, default=None), + verify_ssl=dict(type='bool', required=False, default=True) ) - result = dict(changed=False) + module = AnsibleModule( + argument_spec=module_args, + supports_check_mode=False + ) - module = AnsibleModule(argument_spec=module_args, supports_check_mode=False) + result = dict( + changed=False, + added=[], + updated=[], + removed=[] + ) try: - # Verbindung zu den Kalendern herstellen - source_cal = connect_calendar(module.params['source_url'], module.params['source_user'], module.params['source_password']) - target_cal = connect_calendar(module.params['target_url'], module.params['target_user'], module.params['target_password']) + # Kalender verbinden + source_cal = connect_calendar( + url=module.params['source_url'], + user=module.params['source_user'], + password=module.params['source_password'], + verify_ssl=module.params['verify_ssl'] + ) + + target_cal = connect_calendar( + url=module.params['target_url'], + user=module.params['target_user'], + password=module.params['target_password'], + verify_ssl=module.params['verify_ssl'] + ) - # Kalender synchronisieren + # Synchronisation durchführen changed, added, updated, removed = sync_calendars(source_cal, target_cal) - + result.update({ - "changed": changed, - "added": added, - "updated": updated, - "removed": removed, + 'changed': changed, + 'added': added, + 'updated': updated, + 'removed': removed, + 'msg': f"Synchronisiert: +{len(added)}/~{len(updated)}/-{len(removed)}" }) except Exception as e: - module.fail_json(msg=str(e), **result) + module.fail_json(msg=f"Fehler bei der Synchronisation: {str(e)}", **result) module.exit_json(**result) if __name__ == '__main__': - run_module() + run_module() \ No newline at end of file