#!/usr/bin/env bash set -euo pipefail # Integration script for node-red-contrib-nextcloud-zammad # Patches zammad nodes into existing nextcloud-node-red Docker image SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PACKAGE_NAME="node-red-contrib-nextcloud-zammad" # Auto-detect Node-RED directory if [[ -z "${NODERED_DIR:-}" ]]; then for dir in \ "/opt/nextcloud-node-red" \ "/home/ncdeploy/nextcloud-node-red" \ "/root/nextcloud-node-red" \ "$(dirname "$SCRIPT_DIR")/nextcloud-node-red" \ "$(docker inspect -f '{{.Config.Labels}}' nextcloud-node-red 2>/dev/null | grep -o 'com.docker.compose.project.working_dir=[^ ]*' | cut -d= -f2)"; do if [[ -n "$dir" && -d "$dir" && -f "$dir/Dockerfile" ]]; then NODERED_DIR="$dir" break fi done fi if [[ -z "${NODERED_DIR:-}" ]] || [[ ! -d "$NODERED_DIR" ]]; then echo "ERROR: Could not auto-detect nextcloud-node-red directory." echo "Set NODERED_DIR environment variable." exit 1 fi if [[ ! -f "$NODERED_DIR/Dockerfile" ]]; then echo "ERROR: No Dockerfile found in $NODERED_DIR" exit 1 fi echo "=== Nextcloud Zammad Node-RED Integration ===" echo "Source: $SCRIPT_DIR" echo "Target: $NODERED_DIR" # 1. Copy nodes to nextcloud-node-red nodes subdirectory NODES_TARGET="$NODERED_DIR/nodes/$PACKAGE_NAME" echo "[integrate] Copying zammad nodes to $NODES_TARGET..." mkdir -p "$NODES_TARGET" cp "$SCRIPT_DIR/nodes"/*.js "$NODES_TARGET/" cp "$SCRIPT_DIR/nodes"/*.html "$NODES_TARGET/" cp "$SCRIPT_DIR/nodes/package.json" "$NODES_TARGET/" echo " Nodes copied." # 2. Patch Dockerfile to COPY zammad nodes into /opt DOCKERFILE="$NODERED_DIR/Dockerfile" echo "[integrate] Patching Dockerfile..." if grep -q "$PACKAGE_NAME" "$DOCKERFILE"; then echo " Dockerfile already contains $PACKAGE_NAME" else cp "$DOCKERFILE" "$DOCKERFILE.bak.$(date +%s)" sed -i '/^COPY nodes\//a\ RUN mkdir -p /opt/nextcloud-nodes/'"$PACKAGE_NAME"'\ COPY nodes/'"$PACKAGE_NAME"' /opt/nextcloud-nodes/'"$PACKAGE_NAME"'\ ' "$DOCKERFILE" echo " Dockerfile patched with COPY for $PACKAGE_NAME." fi # 3. Patch entrypoint.sh to install zammad nodes at container start ENTRYPOINT="$NODERED_DIR/entrypoint.sh" echo "[integrate] Patching entrypoint.sh..." if [[ -f "$ENTRYPOINT" ]]; then cp "$ENTRYPOINT" "$ENTRYPOINT.bak.$(date +%s)" if ! grep -q "$PACKAGE_NAME" "$ENTRYPOINT"; then PATCH_TMP=$(mktemp) cat > "$PATCH_TMP" << 'PATCH_EOF' # --- node-red-contrib-nextcloud-zammad --- SRC_ZAMMAD="/opt/nextcloud-nodes/node-red-contrib-nextcloud-zammad" DST_ZAMMAD="/data/node_modules/node-red-contrib-nextcloud-zammad" if [ -d "$SRC_ZAMMAD" ]; then echo "[entrypoint] Installing zammad nodes into /data..." mkdir -p /data/node_modules rm -rf "$DST_ZAMMAD" cp -a "$SRC_ZAMMAD" /data/node_modules/ chown -R node-red:node-red "$DST_ZAMMAD" 2>/dev/null || true chmod -R a+rX "$DST_ZAMMAD" 2>/dev/null || true fi PATCH_EOF awk -v patchfile="$PATCH_TMP" ' /^exec/ && !done { while ((getline line < patchfile) > 0) print line; close(patchfile); done=1 } { print } ' "$ENTRYPOINT" > "$ENTRYPOINT.tmp" && mv "$ENTRYPOINT.tmp" "$ENTRYPOINT" rm -f "$PATCH_TMP" echo " entrypoint.sh patched (inserted before exec)." else echo " entrypoint.sh already contains $PACKAGE_NAME." fi else echo " WARNING: entrypoint.sh not found at $ENTRYPOINT" fi # 4. Create zammad nodes package in /opt for entrypoint to copy OPT_NODES_DIR="$NODERED_DIR/opt/nextcloud-nodes" echo "[integrate] Creating zammad nodes package in $OPT_NODES_DIR..." mkdir -p "$OPT_NODES_DIR/$PACKAGE_NAME/nodes" cp "$SCRIPT_DIR/nodes"/*.js "$OPT_NODES_DIR/$PACKAGE_NAME/nodes/" cp "$SCRIPT_DIR/nodes"/*.html "$OPT_NODES_DIR/$PACKAGE_NAME/nodes/" cp "$SCRIPT_DIR/nodes/package.json" "$OPT_NODES_DIR/$PACKAGE_NAME/package.json" echo " Package created." # 5. No docker-compose.yml changes needed - nodes are baked into the image echo "" echo "=== Integration Complete ===" echo "" echo "Next steps:" echo "1. Rebuild the Docker image:" echo " cd $NODERED_DIR && docker compose build --no-cache" echo "" echo "2. Restart the container:" echo " docker compose up -d" echo "" echo "3. In Node-RED, configure a 'zammad config' node with your API token." echo "" echo "4. Import example flows from: $SCRIPT_DIR/flows/"