139 lines
4.7 KiB
Bash
139 lines
4.7 KiB
Bash
#!/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. Verify docker-compose.yml has port 1880 mapping
|
|
COMPOSE="$NODERED_DIR/docker-compose.yml"
|
|
if [[ -f "$COMPOSE" ]]; then
|
|
echo "[integrate] Checking docker-compose.yml for port 1880..."
|
|
if ! grep -q "1880:1880" "$COMPOSE"; then
|
|
cp "$COMPOSE" "$COMPOSE.bak.$(date +%s)"
|
|
sed -i '/ports:/a\ - "1880:1880"' "$COMPOSE"
|
|
echo " Added 1880:1880 port mapping."
|
|
else
|
|
echo " Port 1880 mapping already present."
|
|
fi
|
|
fi
|
|
|
|
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/"
|