#!/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-filler.plugin
|
PLUGIN_GUID='{7F4E8F35-5D66-47F8-A5B4-6AB3FAACF565}'
|
MANIFEST_GUID='asc.{7F4E8F35-5D66-47F8-A5B4-6AB3FAACF565}'
|
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"
|