#!/usr/bin/env sh set -eu SCRIPT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd) PLUGIN_DIR=$(CDPATH= cd -- "$SCRIPT_DIR/.." && pwd) CONTAINER=${1:-cx-onlyoffice} PACKAGE_NAME=eln-template-annotator.plugin PLUGIN_GUID='{2D6D6CB6-F6FC-45B7-8EC7-0CC1940F1A6F}' MANIFEST_GUID='asc.{2D6D6CB6-F6FC-45B7-8EC7-0CC1940F1A6F}' CONTAINER_PACKAGE="/tmp/$PACKAGE_NAME.$$" PLUGINS_DIR=/var/www/onlyoffice/documentserver/sdkjs-plugins TOOLS_DIR=/var/www/onlyoffice/documentserver/server/tools LIB_DIR=/var/www/onlyoffice/documentserver/server/FileConverter/bin REPLACE_SCRIPT="$SCRIPT_DIR/replace-plugin-directory.sh" CONTAINER_REPLACE_SCRIPT="/tmp/replace-plugin-directory.$$.sh" INSTALL_DIR="$PLUGINS_DIR/.$PLUGIN_GUID.install.$$" BACKUP_DIR="$PLUGINS_DIR/.$PLUGIN_GUID.backup.$$" if [ ! -f "$REPLACE_SCRIPT" ]; then printf '%s\n' "Plugin replacement script does not exist: $REPLACE_SCRIPT" >&2 exit 1 fi if [ -n "${ONLYOFFICE_PLUGIN_PACKAGE:-}" ]; then case "$ONLYOFFICE_PLUGIN_PACKAGE" in /*) ;; *) printf '%s\n' 'ONLYOFFICE_PLUGIN_PACKAGE must be an absolute file path' >&2 exit 1 ;; esac if [ ! -f "$ONLYOFFICE_PLUGIN_PACKAGE" ]; then printf '%s\n' "ONLYOFFICE_PLUGIN_PACKAGE does not exist: $ONLYOFFICE_PLUGIN_PACKAGE" >&2 exit 1 fi PACKAGE=$ONLYOFFICE_PLUGIN_PACKAGE else PACKAGE=$("$SCRIPT_DIR/package.sh") fi unzip -tq "$PACKAGE" >/dev/null ARCHIVE_ENTRIES=$(unzip -Z1 "$PACKAGE") has_archive_file() { printf '%s\n' "$ARCHIVE_ENTRIES" | grep -F -x -e "$1" >/dev/null } if ! has_archive_file 'config.json'; then printf '%s\n' 'Plugin package is missing config.json' >&2 exit 1 fi if ! has_archive_file 'translations/langs.json'; then printf '%s\n' 'Plugin package is missing translations/langs.json' >&2 exit 1 fi MANIFEST=$(unzip -p "$PACKAGE" config.json) printf '%s\n' "$MANIFEST" | jq -e \ --arg guid "$MANIFEST_GUID" \ '.guid == $guid and .version == "0.1.0"' >/dev/null PAGE_ENTRY=$(printf '%s\n' "$MANIFEST" | jq -e -r \ '.variations[0].url | select(type == "string") | split("?")[0] | select(. == "index.html")') if ! has_archive_file "$PAGE_ENTRY"; then printf '%s\n' "Plugin package is missing manifest page: $PAGE_ENTRY" >&2 exit 1 fi printf '%s\n' "$MANIFEST" | jq -e \ '.variations[0].icons | type == "array" and length > 0 and all(.[]; type == "string" and length > 0)' >/dev/null ICON_ENTRIES=$(printf '%s\n' "$MANIFEST" | jq -r '.variations[0].icons[]') printf '%s\n' "$ICON_ENTRIES" | while IFS= read -r icon_entry; do if ! has_archive_file "$icon_entry"; then printf '%s\n' "Plugin package is missing manifest icon: $icon_entry" >&2 exit 1 fi done cleanup_container_package() { status=$? trap - EXIT HUP INT TERM docker exec "$CONTAINER" rm -f "$CONTAINER_PACKAGE" "$CONTAINER_REPLACE_SCRIPT" >/dev/null 2>&1 || true exit "$status" } trap cleanup_container_package EXIT trap 'exit 1' HUP INT TERM docker cp "$PACKAGE" "$CONTAINER:$CONTAINER_PACKAGE" docker cp "$REPLACE_SCRIPT" "$CONTAINER:$CONTAINER_REPLACE_SCRIPT" if docker exec "$CONTAINER" test -f "$PLUGINS_DIR/$PLUGIN_GUID/config.json"; then docker exec "$CONTAINER" sh "$CONTAINER_REPLACE_SCRIPT" "$CONTAINER_PACKAGE" "$PLUGINS_DIR/$PLUGIN_GUID" "$INSTALL_DIR" "$BACKUP_DIR" else docker exec \ -e LD_LIBRARY_PATH="$LIB_DIR" \ "$CONTAINER" \ "$TOOLS_DIR/pluginsmanager" \ --directory="$PLUGINS_DIR" \ --install="$CONTAINER_PACKAGE" fi docker exec "$CONTAINER" find "$PLUGINS_DIR/$PLUGIN_GUID" -type f -name '*.gz' -delete printf '%s\n' "Installed $PACKAGE_NAME into $CONTAINER"