#!/bin/sh
|
#
|
# The contents of this file are subject to the terms of the Common Development and
|
# Distribution License (the License). You may not use this file except in compliance with the
|
# License.
|
#
|
# You can obtain a copy of the License at legal/CDDLv1.0.txt. See the License for the
|
# specific language governing permission and limitations under the License.
|
#
|
# When distributing Covered Software, include this CDDL Header Notice in each file and include
|
# the License file at legal/CDDLv1.0.txt. If applicable, add the following below the CDDL
|
# Header, with the fields enclosed by brackets [] replaced by your own identifying
|
# information: "Portions copyright [year] [name of copyright owner]".
|
#
|
# Copyright 2026 3A Systems, LLC.
|
|
set -eu
|
root=$(CDPATH= cd -- "$(dirname "$0")/../.." && pwd)
|
test_dir=$(mktemp -d "${TMPDIR:-/tmp}/opendj-script-util.XXXXXX")
|
trap 'rm -rf "$test_dir"' 0
|
|
INSTALL_ROOT=$test_dir
|
INSTANCE_ROOT=$test_dir
|
SCRIPT_UTIL_CMD=
|
SCRIPT_NAME=setup
|
. "$root/opendj-server-legacy/resource/bin/_script-util.sh"
|
|
mkdir "$test_dir/tmp" "$test_dir/home"
|
OPENDJ_TMP_DIR=$test_dir/tmp
|
HOME=$test_dir/home
|
OPENDJ_JAVA_ARGS=
|
|
# On an executable filesystem, the real probe must succeed without shell errors
|
# or leaking its scratch variables into the caller.
|
res=caller
|
DIR_TO_TEST=$test_dir/caller
|
TMP_FILE=$test_dir/caller-file
|
remove_dir=caller
|
if ! set_bc_dir >"$test_dir/output" 2>&1; then
|
cat "$test_dir/output" >&2
|
exit 1
|
fi
|
if [ -s "$test_dir/output" ]; then
|
cat "$test_dir/output" >&2
|
exit 1
|
fi
|
test -z "$OPENDJ_JAVA_ARGS"
|
test "$res:$DIR_TO_TEST:$TMP_FILE:$remove_dir" = "caller:$test_dir/caller:$test_dir/caller-file:caller"
|
test -z "$(ls -A "$OPENDJ_TMP_DIR")"
|
|
# Prevent the probe file in the temporary directory from becoming executable,
|
# while allowing the real probe to make and execute its file in HOME.
|
chmod() {
|
case $2 in
|
"$OPENDJ_TMP_DIR"/*) ;;
|
*) command chmod "$@" ;;
|
esac
|
}
|
set_bc_dir >"$test_dir/output" 2>&1
|
unset -f chmod
|
test "$OPENDJ_JAVA_ARGS" = " -Dorg.bouncycastle.native.loader.install_dir=$HOME"
|
test -z "$(ls -A "$OPENDJ_TMP_DIR")"
|
test -z "$(ls -A "$HOME")"
|
OPENDJ_JAVA_ARGS=
|
|
# A directory created by the real probe must be removed afterwards.
|
check_noexec "$test_dir/missing"
|
test ! -e "$test_dir/missing"
|
|
# Simulate a noexec mount: the production selection logic still runs, while
|
# the probe returns the result of attempting to execute from each directory.
|
check_noexec() { [ "$1" = "$HOME" ]; }
|
set_bc_dir >"$test_dir/output" 2>&1
|
test "$OPENDJ_JAVA_ARGS" = " -Dorg.bouncycastle.native.loader.install_dir=$HOME"
|
grep -F "WARNING: $OPENDJ_TMP_DIR is mounted as noexec" "$test_dir/output" >/dev/null
|
if grep -F 'the OpenDJ installation could cause errors' "$test_dir/output" >/dev/null; then
|
cat "$test_dir/output" >&2
|
exit 1
|
fi
|
|
# An explicit BC installation directory must be preserved without probing.
|
OPENDJ_JAVA_ARGS='-Dorg.bouncycastle.native.loader.install_dir=/chosen'
|
check_noexec() { echo 'unexpected probe'; return 1; }
|
set_bc_dir >"$test_dir/output" 2>&1
|
test ! -s "$test_dir/output"
|
test "$OPENDJ_JAVA_ARGS" = '-Dorg.bouncycastle.native.loader.install_dir=/chosen'
|
|
# If neither directory permits execution, report it and do not set a fallback.
|
OPENDJ_JAVA_ARGS=
|
check_noexec() { return 1; }
|
set_bc_dir >"$test_dir/output" 2>&1
|
test -z "$OPENDJ_JAVA_ARGS"
|
grep -F 'the OpenDJ installation could cause errors' "$test_dir/output" >/dev/null
|
|
echo 'script-util checks passed'
|