#!/usr/bin/env bash set -euo pipefail echo "=== noVNC CAPTCHA 解決機能セットアップ ===" PROJECT_DIR="$(cd "$(dirname "$0")/.." && pwd)" # 1. システム依存パッケージのインストール echo "" echo "[1/6] システムパッケージをインストール中..." sudo apt-get update -qq sudo apt-get install -y -qq x11vnc websockify xvfb # 2. 確認 echo "" echo "[2/6] インストール確認..." for cmd in Xvfb x11vnc websockify; do if which "$cmd" > /dev/null 2>&1; then echo " ✓ $cmd: $(which "$cmd")" else echo " ✗ $cmd: 見つかりません" >&2 exit 1 fi done # 3. @novnc/novnc npm パッケージ確認 echo "" 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 " → 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/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 echo " ✓ vendor/noVNC/vnc.html: 配置済み" 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)" 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 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 INT TERM if [ -f "$NOVNC_DIR/vnc.html" ]; then echo " ✓ vendor/noVNC/vnc.html: 配置完了" else echo " ✗ vnc.html が見つかりません。配置に失敗しました" >&2 exit 1 fi fi # 5. ファイル選択の画面を禁じる管理ポリシー # noVNC の画面は人がブラウザをそのまま触れる。ファイルを選ぶボタンから # サーバー上のファイルを持ち出せてしまうので、選択画面そのものを禁じる (#1148)。 echo "" 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 # 旧 captcha_solve があっても normalizeConfig が display_mode に自動移行するのでそのまま echo " ✓ browser display_mode (または旧 captcha_solve) 設定は既に存在します" else echo " → browser セクションを追加中..." # browser セクションが存在するか確認 if grep -q "^browser:" "$CONFIG"; then # 既存 browser セクションに追加 sed -i '/^browser:/a\ display_mode: novnc\n max_captcha_pages: 5' "$CONFIG" else # browser セクションを新規追加 printf '\nbrowser:\n display_mode: novnc\n max_captcha_pages: 5\n' >> "$CONFIG" fi echo " ✓ display_mode: novnc を追加しました" fi else echo " ⚠ config.yaml が見つかりません。config.yaml.example からコピーして設定してください" fi echo "" echo "=== セットアップ完了 ===" echo "" echo "使い方:" echo " 1. サーバーを再起動: npm start" echo " 2. WebSearch を含むタスクを実行" echo " 3. CAPTCHA 検出時、UI に黄色いバナーが表示されます" echo " 4. 「noVNC で解決する」リンクをクリックしてブラウザ画面に接続" echo " 5. CAPTCHA を手動で解決 → Cookie が保持され次回から再利用されます"