#!/bin/bash BASE_DIR="." CONFIG_FILE="${BASE_DIR}/config.json" TMP_DIR=$(mktemp -d) trap 'rm -rf "$TMP_DIR"' EXIT # jq muss installiert sein if ! command -v jq &> /dev/null; then echo "Fehler: 'jq' ist nicht installiert. Bitte installiere es zuerst." exit 1 fi JSON_PREFIX="calendar" # Konfigurationswerte auslesen BASE_URL=$(jq -r ".${JSON_PREFIX}.caldav_base_url" "$CONFIG_FILE") USERNAME=$(jq -r ".${JSON_PREFIX}.caldav_username" "$CONFIG_FILE") PASSWORD=$(jq -r ".${JSON_PREFIX}.caldav_password" "$CONFIG_FILE") CALENDARS=$(jq -c ".${JSON_PREFIX}.calendars[]" "$CONFIG_FILE") for entry in $CALENDARS; do ICS_URL=$(echo "$entry" | jq -r '.ics') CALDAV_NAME=$(echo "$entry" | jq -r '.name') echo "INFO: Lade ICS von: $ICS_URL" ICS_FILE="$TMP_DIR/$CALDAV_NAME.ics" ICS_STRIPPED="$TMP_DIR/${CALDAV_NAME}_stripped.ics" curl -s "$ICS_URL" -o "$ICS_FILE" if [[ ! -s "$ICS_FILE" ]]; then echo "WARNING: Fehler beim Herunterladen von $ICS_URL" continue fi CALDAV_URL="${BASE_URL}${CALDAV_NAME}/" # ICS-Datei in einzelne VEVENTs zerlegen csplit -s -f "$TMP_DIR/event_" -b "%03d.ics" "$ICS_FILE" '/^BEGIN:VEVENT/' '{*}' > /dev/null for vevent_file in "$TMP_DIR"/event_*.ics; do if grep -q "^BEGIN:VEVENT" "$vevent_file"; then # UID extrahieren EVENT_UID=$(awk -F':' '/^UID:/ {gsub(/\r/, "", $2); print $2; exit}' "$vevent_file") SAFE_EVENT_UID=$(echo "$EVENT_UID" | sed 's/[^a-zA-Z0-9._-]/_/g') # Neue vollständige Einzel-ICS-Datei erzeugen OUTFILE="$TMP_DIR/$SAFE_EVENT_UID.ics" { echo "BEGIN:VCALENDAR" echo "VERSION:2.0" echo "PRODID:-//calendar script//EN" cat "$vevent_file" grep -q "END:VCALENDAR" "$vevent_file" || echo "END:VCALENDAR" } > "$OUTFILE" kate "$OUTFILE" echo "INFO: Lade UID=$SAFE_EVENT_UID → ${CALDAV_URL}${SAFE_EVENT_UID}.ics" RESPONSE=$(curl -s -w "\nHTTP-Code: %{http_code}\n" -u "$USERNAME:$PASSWORD" \ -X PUT "${CALDAV_URL}${SAFE_EVENT_UID}.ics" \ -H "Content-Type: text/calendar; charset=utf-8" \ --data-binary "@$OUTFILE") echo "$RESPONSE" fi done done