validate_uint() {
local name="$1"
local value="$2"
local min="${3:-0}"
local max="${4:-4294967295}"
if ! [[ "$value" =~ ^[0-9]+$ ]]; then echo"[sandbox] ERROR: $name must be an integer, got: ${value}" >&2
exit 1 fi if (( value < min || value > max )); then echo"[sandbox] ERROR: $name out of range (${min}..${max}), got: ${value}" >&2
exit 1 fi
}
validate_uint "CDP_PORT""$CDP_PORT" 1 65535
validate_uint "VNC_PORT""$VNC_PORT" 1 65535
validate_uint "NOVNC_PORT""$NOVNC_PORT" 1 65535
validate_uint "AUTO_START_TIMEOUT_MS""$AUTO_START_TIMEOUT_MS" 1 2147483647 if [[ -n "$RENDERER_PROCESS_LIMIT" ]]; then
validate_uint "RENDERER_PROCESS_LIMIT""$RENDERER_PROCESS_LIMIT" 0 2147483647 fi
cleanup() {
local code="${1:-1}"
trap - EXIT INT TERM
local pids=()
local pid
for pid in "${WEBSOCKIFY_PID:-}""${X11VNC_PID:-}""${SOCAT_PID:-}""${CHROME_PID:-}""${XVFB_PID:-}"; do if [[ -n "${pid:-}" ]]; then
pids+=("$pid") fi done
if ((${#pids[@]} > 0)); then
kill -TERM "${pids[@]}" 2>/dev/null || true
for _ in {1..10}; do
local alive=0 for pid in "${pids[@]}"; do if kill -0 "$pid" 2>/dev/null; then
alive=1
break fi done if [[ "$alive" == "0" ]]; then
break fi
sleep 0.2 done
if [[ "${HEADLESS}" == "1" ]]; then
CHROME_ARGS+=("--headless=new") fi
if [[ "${ALLOW_NO_SANDBOX}" == "1" ]]; then
CHROME_ARGS+=("--no-sandbox""--disable-setuid-sandbox") fi
DISABLE_GRAPHICS_FLAGS_LOWER="${DISABLE_GRAPHICS_FLAGS,,}" if [[ "${DISABLE_GRAPHICS_FLAGS_LOWER}" =~ ^(1|true|yes|on)$ ]]; then
CHROME_ARGS+=( "--disable-3d-apis" "--disable-gpu" "--disable-software-rasterizer"
) fi
DISABLE_EXTENSIONS_LOWER="${DISABLE_EXTENSIONS,,}" if [[ "${DISABLE_EXTENSIONS_LOWER}" =~ ^(1|true|yes|on)$ ]]; then
CHROME_ARGS+=("--disable-extensions") fi
if [[ "${RENDERER_PROCESS_LIMIT}" =~ ^[0-9]+$ && "${RENDERER_PROCESS_LIMIT}" -gt 0 ]]; then
CHROME_ARGS+=("--renderer-process-limit=${RENDERER_PROCESS_LIMIT}") fi
echo"[sandbox] Waiting up to ${AUTO_START_TIMEOUT_MS}ms for CDP on port ${CHROME_CDP_PORT}..."
while (( $(date +%s%3N) < deadline_ms )); do if ! kill -0 "${CHROME_PID}" 2>/dev/null; then echo"[sandbox] ERROR: Chromium exited before CDP became ready."
exit 1 fi
if curl -fsS --max-time 0.5 "${probe_url}" >/dev/null; then
CDP_READY=1
break fi
sleep 0.2 done
if [[ "${CDP_READY}" == "0" ]]; then echo"[sandbox] ERROR: CDP failed to start within ${AUTO_START_TIMEOUT_MS}ms."
exit 1 fi
echo"[sandbox] CDP ready. Starting socat..."
if [[ -z "${CDP_SOURCE_RANGE}" ]]; then echo"[sandbox-browser] WARNING: CDP_SOURCE_RANGE unset; socat CDP relay will not start." >&2 echo"[sandbox-browser] Set OPENCLAW_BROWSER_CDP_SOURCE_RANGE to an explicit CIDR to enable CDP access." >&2 else
SOCAT_LISTEN_ADDR="TCP-LISTEN:${CDP_PORT},fork,reuseaddr,bind=0.0.0.0"
SOCAT_LISTEN_ADDR="${SOCAT_LISTEN_ADDR},range=${CDP_SOURCE_RANGE}"
socat "${SOCAT_LISTEN_ADDR}""TCP:127.0.0.1:${CHROME_CDP_PORT}" &
SOCAT_PID=$! echo"[sandbox] socat started (PID: ${SOCAT_PID})" fi
if [[ "${ENABLE_NOVNC}" == "1" && "${HEADLESS}" != "1" ]]; then if [[ -z "${NOVNC_PASSWORD}" ]]; then
NOVNC_PASSWORD="$(< /proc/sys/kernel/random/uuid)"
NOVNC_PASSWORD="${NOVNC_PASSWORD//-/}"
NOVNC_PASSWORD="${NOVNC_PASSWORD:0:8}" fi
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.