刘光辉
12 小时以前 0dfe84494048ce27ba8449831782128412d3eb13
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
#!/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"