HEX
Server: nginx/1.24.0
System: Linux nowruzgan 6.8.0-57-generic #59-Ubuntu SMP PREEMPT_DYNAMIC Sat Mar 15 17:40:59 UTC 2025 x86_64
User: babak (1000)
PHP: 8.3.6
Disabled: NONE
Upload Files
File: //usr/share/opensearch-dashboards/bin/use_node
#!/bin/sh

#
# SPDX-License-Identifier: Apache-2.0
#
# The OpenSearch Contributors require contributions made to
# this file be licensed under the Apache-2.0 license or a
# compatible open source license.
#
# Any modifications Copyright OpenSearch Contributors. See
# GitHub history for details.
#

# This script will find the appropriate Node.js runtime binary and execute it with any
# parameters passed in.
#
# Set a variable named OSD_USE_NODE_JS_FILE_PATH to have it prefixed with OSD_HOME and executed
# Example: SET OSD_USE_NODE_JS_FILE_PATH=\src\cli\dist
#
# NODE_OPTIONS is built using config/node.options and overridden by any previously set NODE_OPTIONS.
# To pass in any specific defaults that can be overridden by both of them, use OSD_NODE_OPTS_PREFIX.

SCRIPT="$0"

UNAME=$(uname -s)
if [ $UNAME = "FreeBSD" ]; then
  OS="freebsd"
elif [ $UNAME = "Darwin" ]; then
  OS="darwin"
else
  OS="other"
fi

# SCRIPT may be an arbitrarily deep series of symlinks. Loop until we have the concrete path.
while [ -h "$SCRIPT" ] ; do
  loc=$(ls -ld "$SCRIPT")
  # Drop everything prior to ->
  link=$(expr "$loc" : '.*-> \(.*\)$')
  if expr "$link" : '/.*' > /dev/null; then
    SCRIPT="$link"
  else
    SCRIPT=$(dirname "$SCRIPT")/"$link"
  fi
done

# Get an absolute path for OSD_HOME
OSD_HOME="$(cd "$(dirname "${SCRIPT}")/.."; pwd)"
CONFIG_DIR=${OSD_PATH_CONF:-"OSD_HOME/config"}

# Places to look for the Node.js binary in order: OSD_NODE_HOME > NODE_HOME > bundled with OSD > system-wide
if [ ! -z "$OSD_NODE_HOME" ]; then
  NODE="$OSD_NODE_HOME/bin/node"
  NODE_ERROR_MSG="in OSD_NODE_HOME"
  NODE_ERROR_SHOW=true
elif [ ! -z "$NODE_HOME" ]; then
  NODE="$NODE_HOME/bin/node"
  NODE_ERROR_MSG="in NODE_HOME"
  NODE_ERROR_SHOW=true
else
  # Set these variables outside, as catchalls, to show meaningful errors if needed
  NODE="$OSD_HOME/node/bin/node"
  NODE_ERROR_MSG="bundled with OpenSearch Dashboards"
  # A bin folder at the root is only present in release builds that have a bundled Node.js binary
  if [ -d "${OSD_HOME}/bin" ]; then
    NODE_ERROR_SHOW=true
    # Not all operating systems can run the latest Node.js and the fallback is for them
    "${NODE}" -v > /dev/null 2>&1
    if [ $? -ne 0 ] && [ -d "${OSD_HOME}/node/fallback" ]; then
      NODE="$OSD_HOME/node/fallback/bin/node"
    fi
  fi
fi

if [ -x "$NODE" ]; then
  # Node.js binary was found where it was expected; no need to show an error
  NODE_ERROR_SHOW=
elif [ $OS = "freebsd" ]; then
  NODE="${LOCALBASE}/bin/node"
else
  NODE="$(command -v node)"
fi

if [ ! -x "$NODE" ]; then
  # Irrespective of NODE_ERROR_SHOW, if NODE is not found or executable, show the error
  echo "Could not find a Node.js runtime binary $NODE_ERROR_MSG or on the system" >&2
  exit 1
fi

# Node.js binary was found but not where it was told to be, so show a warning
if [ ! -z "$NODE_ERROR_SHOW" ]; then
  echo "Could not find a Node.js runtime binary $NODE_ERROR_MSG but found one at $NODE" >&2
fi

if [ -f "${CONFIG_DIR}/node.options" ]; then
  OSD_NODE_OPTS="$(grep -v ^# < ${CONFIG_DIR}/node.options | xargs)"
fi

# If a file path was provided for execution, prefix with OSD_HOME; use relative paths to avoid the need for this.
if [ ! -z "$OSD_USE_NODE_JS_FILE_PATH" ]; then
  NODE_OPTIONS="$OSD_NODE_OPTS_PREFIX $OSD_NODE_OPTS $NODE_OPTIONS" exec "${NODE}" "${OSD_HOME}${OSD_USE_NODE_JS_FILE_PATH}" "${@}"
elif [ $# -ne 0 ]; then
  NODE_OPTIONS="$OSD_NODE_OPTS_PREFIX $OSD_NODE_OPTS $NODE_OPTIONS" exec "${NODE}" "${@}"
fi