This commit is contained in:
+73
-16
@@ -2,16 +2,17 @@
|
||||
set -euo pipefail
|
||||
|
||||
echo "=== noVNC CAPTCHA 解決機能セットアップ ==="
|
||||
PROJECT_DIR="$(cd "$(dirname "$0")/.." && pwd)"
|
||||
|
||||
# 1. システム依存パッケージのインストール
|
||||
echo ""
|
||||
echo "[1/5] システムパッケージをインストール中..."
|
||||
echo "[1/6] システムパッケージをインストール中..."
|
||||
sudo apt-get update -qq
|
||||
sudo apt-get install -y -qq x11vnc websockify xvfb
|
||||
|
||||
# 2. 確認
|
||||
echo ""
|
||||
echo "[2/5] インストール確認..."
|
||||
echo "[2/6] インストール確認..."
|
||||
for cmd in Xvfb x11vnc websockify; do
|
||||
if which "$cmd" > /dev/null 2>&1; then
|
||||
echo " ✓ $cmd: $(which "$cmd")"
|
||||
@@ -23,21 +24,26 @@ done
|
||||
|
||||
# 3. @novnc/novnc npm パッケージ確認
|
||||
echo ""
|
||||
echo "[3/5] @novnc/novnc パッケージ確認..."
|
||||
if node -e "require.resolve('@novnc/novnc/package.json')" 2>/dev/null; then
|
||||
echo "[3/6] @novnc/novnc パッケージ確認..."
|
||||
if (cd "$PROJECT_DIR" && node -e 'require.resolve("@novnc/novnc/package.json")') 2>/dev/null; then
|
||||
echo " ✓ @novnc/novnc: インストール済み"
|
||||
else
|
||||
echo " → npm install @novnc/novnc ..."
|
||||
npm install @novnc/novnc
|
||||
echo " → lockfileを検査して安全に依存関係を復元中..."
|
||||
(
|
||||
cd "$PROJECT_DIR"
|
||||
node scripts/security/dependency-policy.mjs package-lock.json ui/package-lock.json
|
||||
npm ci --ignore-scripts --no-audit
|
||||
node scripts/security/rebuild-native.mjs
|
||||
)
|
||||
fi
|
||||
|
||||
# 4. noVNC スタンドアロン (vnc.html を含む Web 配布物) を vendor/noVNC に配置
|
||||
# npm の @novnc/novnc は lib のみで vnc.html を含まないため、
|
||||
# Browser タブの iframe 用に GitHub から tarball を取得する。
|
||||
echo ""
|
||||
echo "[4/5] noVNC Web 配布物 (vendor/noVNC) 確認..."
|
||||
NOVNC_VERSION="${NOVNC_VERSION:-1.6.0}"
|
||||
PROJECT_DIR="$(cd "$(dirname "$0")/.." && pwd)"
|
||||
echo "[4/6] noVNC Web 配布物 (vendor/noVNC) 確認..."
|
||||
NOVNC_VERSION=1.6.0
|
||||
NOVNC_SHA256=5066103959ef4e9b10f37e5a148627360dd8414e4cf8a7db92bdbd022e728aaa
|
||||
VENDOR_DIR="$PROJECT_DIR/vendor"
|
||||
NOVNC_DIR="$VENDOR_DIR/noVNC"
|
||||
if [ -f "$NOVNC_DIR/vnc.html" ]; then
|
||||
@@ -45,17 +51,56 @@ if [ -f "$NOVNC_DIR/vnc.html" ]; then
|
||||
else
|
||||
echo " → noVNC v$NOVNC_VERSION を取得中..."
|
||||
mkdir -p "$VENDOR_DIR"
|
||||
TMP_TGZ=""
|
||||
TMP_NOVNC_DIR=""
|
||||
NOVNC_BACKUP_DIR=""
|
||||
cleanup_novnc() {
|
||||
exit_status=$?
|
||||
trap - EXIT INT TERM
|
||||
if [ -n "$NOVNC_BACKUP_DIR" ] && [ ! -e "$NOVNC_DIR" ] && [ -e "$NOVNC_BACKUP_DIR" ]; then
|
||||
mv "$NOVNC_BACKUP_DIR" "$NOVNC_DIR"
|
||||
fi
|
||||
if [ -n "$NOVNC_BACKUP_DIR" ] && [ -e "$NOVNC_BACKUP_DIR" ]; then
|
||||
rm -rf "$NOVNC_BACKUP_DIR"
|
||||
fi
|
||||
[ -z "$TMP_TGZ" ] || rm -f "$TMP_TGZ"
|
||||
[ -z "$TMP_NOVNC_DIR" ] || rm -rf "$TMP_NOVNC_DIR"
|
||||
exit "$exit_status"
|
||||
}
|
||||
trap cleanup_novnc EXIT
|
||||
trap 'exit 130' INT
|
||||
trap 'exit 143' TERM
|
||||
TMP_TGZ="$(mktemp -t novnc.XXXXXX.tar.gz)"
|
||||
trap 'rm -f "$TMP_TGZ"' EXIT
|
||||
TMP_NOVNC_DIR="$(mktemp -d "$VENDOR_DIR/.noVNC.XXXXXX")"
|
||||
if ! curl -fSL "https://github.com/novnc/noVNC/archive/refs/tags/v${NOVNC_VERSION}.tar.gz" -o "$TMP_TGZ"; then
|
||||
echo " ✗ noVNC tarball の取得に失敗しました" >&2
|
||||
exit 1
|
||||
fi
|
||||
rm -rf "$NOVNC_DIR"
|
||||
mkdir -p "$NOVNC_DIR"
|
||||
tar -xzf "$TMP_TGZ" -C "$NOVNC_DIR" --strip-components=1
|
||||
if ! printf '%s %s\n' "$NOVNC_SHA256" "$TMP_TGZ" | sha256sum -c -; then
|
||||
echo " ✗ noVNC tarball のSHA-256検証に失敗しました" >&2
|
||||
exit 1
|
||||
fi
|
||||
tar -xzf "$TMP_TGZ" -C "$TMP_NOVNC_DIR" --strip-components=1
|
||||
if [ ! -f "$TMP_NOVNC_DIR/vnc.html" ]; then
|
||||
echo " ✗ vnc.html が見つかりません。配置に失敗しました" >&2
|
||||
exit 1
|
||||
fi
|
||||
NOVNC_BACKUP_DIR=""
|
||||
if [ -e "$NOVNC_DIR" ]; then
|
||||
NOVNC_BACKUP_DIR="$(mktemp -d "$VENDOR_DIR/.noVNC.backup.XXXXXX")"
|
||||
rmdir "$NOVNC_BACKUP_DIR"
|
||||
mv "$NOVNC_DIR" "$NOVNC_BACKUP_DIR"
|
||||
fi
|
||||
if ! mv "$TMP_NOVNC_DIR" "$NOVNC_DIR"; then
|
||||
if [ -n "$NOVNC_BACKUP_DIR" ]; then
|
||||
mv "$NOVNC_BACKUP_DIR" "$NOVNC_DIR"
|
||||
fi
|
||||
echo " ✗ noVNC vendorの置換に失敗しました" >&2
|
||||
exit 1
|
||||
fi
|
||||
[ -z "$NOVNC_BACKUP_DIR" ] || rm -rf "$NOVNC_BACKUP_DIR"
|
||||
rm -f "$TMP_TGZ"
|
||||
trap - EXIT
|
||||
trap - EXIT INT TERM
|
||||
if [ -f "$NOVNC_DIR/vnc.html" ]; then
|
||||
echo " ✓ vendor/noVNC/vnc.html: 配置完了"
|
||||
else
|
||||
@@ -64,9 +109,21 @@ else
|
||||
fi
|
||||
fi
|
||||
|
||||
# 5. config.yaml に display_mode 設定を追加(まだなければ)
|
||||
# 5. ファイル選択の画面を禁じる管理ポリシー
|
||||
# noVNC の画面は人がブラウザをそのまま触れる。ファイルを選ぶボタンから
|
||||
# サーバー上のファイルを持ち出せてしまうので、選択画面そのものを禁じる (#1148)。
|
||||
echo ""
|
||||
echo "[5/5] config.yaml 確認..."
|
||||
echo "[5/6] ファイル選択の画面を禁じるポリシーを配置..."
|
||||
if bash "$(dirname "$0")/install-browser-policy.sh"; then
|
||||
echo " ✓ 配置しました"
|
||||
else
|
||||
echo " ⚠ 配置に失敗しました。noVNC の画面からファイル選択画面を開けてしまいます。" >&2
|
||||
echo " 後から 'sudo scripts/install-browser-policy.sh' で入れてください。" >&2
|
||||
fi
|
||||
|
||||
# 6. config.yaml に display_mode 設定を追加(まだなければ)
|
||||
echo ""
|
||||
echo "[6/6] config.yaml 確認..."
|
||||
CONFIG="$(cd "$(dirname "$0")/.." && pwd)/config.yaml"
|
||||
if [ -f "$CONFIG" ]; then
|
||||
if grep -qE "display_mode|captcha_solve" "$CONFIG"; then
|
||||
|
||||
Reference in New Issue
Block a user