Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
78 changes: 77 additions & 1 deletion Makefile

Large diffs are not rendered by default.

173 changes: 134 additions & 39 deletions NodeBase/generate_config
Original file line number Diff line number Diff line change
Expand Up @@ -8,17 +8,86 @@ function short_version() {
echo "${__major}.${__minor:0:1}"
}

# A global array of environment variable prefixes supports different browser suffixes
ENV_PREFIXES=(
"SE_NODE_STEREOTYPE"
"SE_NODE_BROWSER_NAME"
"SE_NODE_BROWSER_VERSION"
"SE_NODE_PLATFORM_NAME"
"SE_BROWSER_BINARY_LOCATION"
"SE_NODE_STEREOTYPE_EXTRA"
"SE_NODE_MAX_SESSIONS"
)

function backup_original_env_vars() {
echo "Backing up original environment variables..."

for prefix in "${ENV_PREFIXES[@]}"; do
local backup_var="${prefix}_ORIGINAL"
local common_var="${prefix}"

# Backup original value if not already backed up
if [[ -z "${!backup_var}" ]] && [[ -n "${!common_var}" ]]; then
eval "${backup_var}=\"${!common_var}\""
echo "Backed up original ${common_var}=${!common_var} to ${backup_var}"
fi
done
}

function restore_original_env_vars() {
echo "Restoring original environment variables..."

for prefix in "${ENV_PREFIXES[@]}"; do
local backup_var="${prefix}_ORIGINAL"
local common_var="${prefix}"

# Restore original value if backup exists
if [[ -n "${!backup_var}" ]]; then
eval "${common_var}=\"${!backup_var}\""
echo "Restored original ${backup_var}=${!backup_var} to ${common_var}"
else
# Clear the variable if no backup exists
eval "${common_var}=\"\""
echo "Cleared ${common_var} (no original backup)"
fi
done
}

function assign_browser_specific_env_vars() {
local browser_name=$1

# Set browser-specific values or inherit original values
for prefix in "${ENV_PREFIXES[@]}"; do
local browser_specific_var="${prefix}_${browser_name}"
local common_var="${prefix}"
local backup_var="${prefix}_ORIGINAL"

# Check if the browser-specific environment variable exists
if [[ -n "${!browser_specific_var}" ]]; then
# Assign the browser-specific value to the common variable
eval "${common_var}=\"${!browser_specific_var}\""
echo "Assigned ${browser_specific_var}=${!browser_specific_var} to ${common_var}"
elif [[ -n "${!backup_var}" ]]; then
# Inherit original value if browser-specific value is not set
eval "${common_var}=\"${!backup_var}\""
echo "Inherited original ${backup_var}=${!backup_var} to ${common_var}"
fi
done
}

if [[ -z "$CONFIG_FILE" ]]; then
FILENAME="/opt/selenium/config.toml"
else
FILENAME="$CONFIG_FILE"
fi

echo -n "" >"$FILENAME"

if [[ -n "${SE_EVENT_BUS_HOST}" ]]; then
echo "[events]
publish = \"tcp://${SE_EVENT_BUS_HOST}:${SE_EVENT_BUS_PUBLISH_PORT}\"
subscribe = \"tcp://${SE_EVENT_BUS_HOST}:${SE_EVENT_BUS_SUBSCRIBE_PORT}\"
" >"$FILENAME"
" >>"$FILENAME"
fi

if [[ -z "${SE_NODE_HOST}" ]] && [[ -z "${SE_NODE_PORT}" ]]; then
Expand All @@ -39,6 +108,11 @@ else
echo "port = \"${SE_NODE_PORT}\"" >>"$FILENAME"
fi

if [[ -n "${SE_RELAX_CHECKS}" ]]; then
echo "[network]" >>"$FILENAME"
echo "relax-checks = ${SE_RELAX_CHECKS}" >>"$FILENAME"
fi

echo "[node]" >>"$FILENAME"
# String, Url where the Grid can be reached
if [[ -z "${SE_NODE_GRID_URL}" ]]; then
Expand All @@ -50,44 +124,65 @@ echo "session-timeout = ${SE_NODE_SESSION_TIMEOUT}" >>"$FILENAME"
echo "override-max-sessions = ${SE_NODE_OVERRIDE_MAX_SESSIONS}" >>"$FILENAME"
echo "detect-drivers = false" >>"$FILENAME"
echo "drain-after-session-count = ${DRAIN_AFTER_SESSION_COUNT:-$SE_DRAIN_AFTER_SESSION_COUNT}" >>"$FILENAME"
echo "max-sessions = ${SE_NODE_MAX_SESSIONS}
" >>"$FILENAME"
echo "" >>"$FILENAME"

if [ -f /opt/selenium/browser_name ]; then
SE_NODE_BROWSER_NAME=$(cat /opt/selenium/browser_name)
fi
if [ -f /opt/selenium/browser_version ] && [ "${SE_NODE_BROWSER_VERSION,,}" = "stable" ]; then
SE_NODE_BROWSER_VERSION=$(short_version $(cat /opt/selenium/browser_version))
fi
if [ -f /opt/selenium/browser_binary_location ] && [ -z "${SE_BROWSER_BINARY_LOCATION}" ]; then
SE_BROWSER_BINARY_LOCATION=$(cat /opt/selenium/browser_binary_location)
fi
SE_NODE_CONTAINER_NAME="${SE_NODE_CONTAINER_NAME:-$(hostname)}"

# 'browserName' is mandatory for default stereotype
if [[ -z "${SE_NODE_STEREOTYPE}" ]] && [[ -n "${SE_NODE_BROWSER_NAME}" ]] && ([[ -z "${SE_NODE_RELAY_URL}" ]] || [[ "${SE_NODE_RELAY_ONLY}" = "false" ]]); then
SE_NODE_STEREOTYPE="{\"browserName\": \"${SE_NODE_BROWSER_NAME}\", \"browserVersion\": \"${SE_NODE_BROWSER_VERSION}\", \"platformName\": \"${SE_NODE_PLATFORM_NAME}\", \"se:containerName\": \"${SE_NODE_CONTAINER_NAME}\", \"container:hostname\": \"$(hostname)\"}"
if [[ -n "${SE_BROWSER_BINARY_LOCATION}" ]]; then
SE_NODE_STEREOTYPE="$(python3 /opt/bin/json_merge.py "${SE_NODE_STEREOTYPE}" "{${SE_BROWSER_BINARY_LOCATION}}")"
fi
else
SE_NODE_STEREOTYPE="${SE_NODE_STEREOTYPE}"
fi
if [[ -n "${SE_NODE_STEREOTYPE_EXTRA}" ]]; then
echo "Merging SE_NODE_STEREOTYPE_EXTRA=${SE_NODE_STEREOTYPE_EXTRA} to main stereotype"
SE_NODE_STEREOTYPE="$(python3 /opt/bin/json_merge.py "${SE_NODE_STEREOTYPE}" "${SE_NODE_STEREOTYPE_EXTRA}")"
if [[ $? -ne 0 ]]; then
echo "Failed to merge SE_NODE_STEREOTYPE_EXTRA. Please check the format of the JSON string. Keep using main stereotype."
else
echo "Merged stereotype: ${SE_NODE_STEREOTYPE}"
fi
fi
# Check if /opt/selenium/browsers directory exists and iterate through browser folders
if [ -d "/opt/selenium/browsers" ]; then
# Backup original environment variables before processing browsers
backup_original_env_vars

# 'stereotype' setting is mandatory
if [[ -n "${SE_NODE_STEREOTYPE}" ]]; then
echo "[[node.driver-configuration]]" >>"$FILENAME"
echo "display-name = \"${SE_NODE_BROWSER_NAME}\"" >>"$FILENAME"
echo "stereotype = '${SE_NODE_STEREOTYPE}'" >>"$FILENAME"
echo "max-sessions = ${SE_NODE_MAX_SESSIONS}
" >>"$FILENAME"
for browser_dir in /opt/selenium/browsers/*/; do
if [ -d "$browser_dir" ]; then
browser_name=$(basename "$browser_dir" | tr '[:lower:]' '[:upper:]')
echo "===Start generating stereotype for browser: ${browser_name}==="
# Assign environment variables with browser suffix to common variables
assign_browser_specific_env_vars "$browser_name"

if [ -f "${browser_dir}name" ]; then
SE_NODE_BROWSER_NAME=$(cat "${browser_dir}name")
fi
if [ -f "${browser_dir}version" ] && [ "${SE_NODE_BROWSER_VERSION,,}" = "stable" ]; then
SE_NODE_BROWSER_VERSION=$(short_version "$(cat "${browser_dir}version")")
fi
if [ -f "${browser_dir}binary_location" ] && [ -z "${SE_BROWSER_BINARY_LOCATION}" ]; then
SE_BROWSER_BINARY_LOCATION=$(cat "${browser_dir}binary_location")
fi
SE_NODE_CONTAINER_NAME="${SE_NODE_CONTAINER_NAME:-$(hostname)}"

# 'browserName' is mandatory for default stereotype
if [[ -z "${SE_NODE_STEREOTYPE}" ]] && [[ -n "${SE_NODE_BROWSER_NAME}" ]] && ([[ -z "${SE_NODE_RELAY_URL}" ]] || [[ "${SE_NODE_RELAY_ONLY}" = "false" ]]); then
SE_NODE_STEREOTYPE="{\"browserName\": \"${SE_NODE_BROWSER_NAME}\", \"browserVersion\": \"${SE_NODE_BROWSER_VERSION}\", \"platformName\": \"${SE_NODE_PLATFORM_NAME}\", \"se:containerName\": \"${SE_NODE_CONTAINER_NAME}\", \"container:hostname\": \"$(hostname)\"}"
if [[ -n "${SE_BROWSER_BINARY_LOCATION}" ]]; then
SE_NODE_STEREOTYPE="$(python3 /opt/bin/json_merge.py "${SE_NODE_STEREOTYPE}" "${SE_BROWSER_BINARY_LOCATION}")"
fi
else
SE_NODE_STEREOTYPE="${SE_NODE_STEREOTYPE}"
fi
if [[ -n "${SE_NODE_STEREOTYPE_EXTRA}" ]]; then
echo "Merging SE_NODE_STEREOTYPE_EXTRA=${SE_NODE_STEREOTYPE_EXTRA} to main stereotype for $browser_name"
SE_NODE_STEREOTYPE="$(python3 /opt/bin/json_merge.py "${SE_NODE_STEREOTYPE}" "${SE_NODE_STEREOTYPE_EXTRA}")"
if [[ $? -ne 0 ]]; then
echo "Failed to merge SE_NODE_STEREOTYPE_EXTRA for $browser_name. Please check the format of the JSON string. Keep using main stereotype."
else
echo "Merged stereotype for $browser_name: ${SE_NODE_STEREOTYPE}"
fi
fi

# 'stereotype' setting is mandatory
if [[ -n "${SE_NODE_STEREOTYPE}" ]]; then
echo "[[node.driver-configuration]]" >>"$FILENAME"
echo "display-name = \"${SE_NODE_BROWSER_NAME}\"" >>"$FILENAME"
echo "stereotype = '${SE_NODE_STEREOTYPE}'" >>"$FILENAME"
# Validate SE_NODE_MAX_SESSIONS is a positive integer
if [[ "${SE_NODE_MAX_SESSIONS}" =~ ^[0-9]+$ ]] && [[ "${SE_NODE_MAX_SESSIONS}" -gt 0 ]]; then
echo "max-sessions = ${SE_NODE_MAX_SESSIONS}" >>"$FILENAME"
fi
echo "" >>"$FILENAME"
fi

# Restore original environment variables for next browser iteration
restore_original_env_vars
echo "===Stop generating stereotype for browser: ${browser_name}==="
fi
done
fi
7 changes: 4 additions & 3 deletions NodeChrome/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -49,9 +49,10 @@ USER ${SEL_UID}
#============================================
# Dumping Browser information for config
#============================================
RUN echo "chrome" > /opt/selenium/browser_name
RUN google-chrome --version | awk '{print $3}' > /opt/selenium/browser_version
RUN echo "\"goog:chromeOptions\": {\"binary\": \"/usr/bin/google-chrome\"}" > /opt/selenium/browser_binary_location
RUN mkdir -p /opt/selenium/browsers/chrome \
&& echo "chrome" > /opt/selenium/browsers/chrome/name \
&& google-chrome --version | awk '{print $3}' > /opt/selenium/browsers/chrome/version \
&& echo '{"goog:chromeOptions": {"binary": "/usr/bin/google-chrome"}}' > /opt/selenium/browsers/chrome/binary_location

ENV SE_OTEL_SERVICE_NAME="selenium-node-chrome" \
SE_NODE_ENABLE_MANAGED_DOWNLOADS="true"
13 changes: 7 additions & 6 deletions NodeChromium/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ USER root
# Install Chromium
ARG CHROMIUM_VERSION="latest"
ARG CHROMIUM_DEB_SITE="http://deb.debian.org/debian"
RUN echo "deb ${CHROMIUM_DEB_SITE}/ sid main" >> /etc/apt/sources.list \
RUN echo "deb ${CHROMIUM_DEB_SITE}/ sid main" >/etc/apt/sources.list.d/debian.list \
&& wget -qO- https://ftp-master.debian.org/keys/archive-key-12.asc | gpg --dearmor > /etc/apt/trusted.gpg.d/debian-archive-keyring.gpg \
&& wget -qO- https://ftp-master.debian.org/keys/archive-key-12-security.asc | gpg --dearmor > /etc/apt/trusted.gpg.d/debian-archive-security-keyring.gpg \
&& apt-get update -qqy \
Expand All @@ -24,7 +24,7 @@ RUN echo "deb ${CHROMIUM_DEB_SITE}/ sid main" >> /etc/apt/sources.list \
&& apt-get -qqyf install /tmp/chromium/chromium-common.deb /tmp/chromium/chromium.deb /tmp/chromium/chromium-l10n.deb /tmp/chromium/chromium-driver.deb \
&& rm -rf /tmp/chromium; \
fi \
&& rm -rf /var/lib/apt/lists/* /var/cache/apt/*
&& rm -rf /var/lib/apt/lists/* /var/cache/apt/* /etc/apt/sources.list.d/debian.list

#=================================
# Chromium Launch Script Wrapper
Expand All @@ -43,9 +43,10 @@ USER ${SEL_UID}
#============================================
# Dumping Browser information for config
#============================================
RUN echo "chrome" > /opt/selenium/browser_name
RUN chromium --version | awk '{print $2}' > /opt/selenium/browser_version
RUN echo "\"goog:chromeOptions\": {\"binary\": \"/usr/bin/chromium\"}" > /opt/selenium/browser_binary_location
RUN mkdir -p /opt/selenium/browsers/chrome \
&& echo "chrome" > /opt/selenium/browsers/chrome/name \
&& chromium --version | awk '{print $2}' > /opt/selenium/browsers/chrome/version \
&& echo '{"goog:chromeOptions": {"binary": "/usr/bin/chromium"}}' > /opt/selenium/browsers/chrome/binary_location

ENV SE_OTEL_SERVICE_NAME="selenium-node-chromium" \
ENV SE_OTEL_SERVICE_NAME="selenium-node-chrome" \
SE_NODE_ENABLE_MANAGED_DOWNLOADS="true"
7 changes: 4 additions & 3 deletions NodeEdge/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -66,9 +66,10 @@ USER ${SEL_UID}
#============================================
# Dumping Browser information for config
#============================================
RUN echo "MicrosoftEdge" > /opt/selenium/browser_name
RUN microsoft-edge --version | awk '{print $3}' > /opt/selenium/browser_version
RUN echo "\"ms:edgeOptions\": {\"binary\": \"/usr/bin/microsoft-edge\"}" > /opt/selenium/browser_binary_location
RUN mkdir -p /opt/selenium/browsers/edge \
&& echo "MicrosoftEdge" > /opt/selenium/browsers/edge/name \
&& microsoft-edge --version | awk '{print $3}' > /opt/selenium/browsers/edge/version \
&& echo '{"ms:edgeOptions": {"binary": "/usr/bin/microsoft-edge"}}' > /opt/selenium/browsers/edge/binary_location

ENV SE_OTEL_SERVICE_NAME="selenium-node-edge" \
SE_NODE_ENABLE_MANAGED_DOWNLOADS="true"
7 changes: 4 additions & 3 deletions NodeFirefox/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -85,9 +85,10 @@ USER ${SEL_UID}
#============================================
# Dumping Browser information for config
#============================================
RUN echo "firefox" > /opt/selenium/browser_name \
&& firefox --version | awk '{print $3}' > /opt/selenium/browser_version \
&& echo "\"moz:firefoxOptions\": {\"binary\": \"/usr/bin/firefox\"}" > /opt/selenium/browser_binary_location
RUN mkdir -p /opt/selenium/browsers/firefox \
&& echo "firefox" > /opt/selenium/browsers/firefox/name \
&& firefox --version | awk '{print $3}' > /opt/selenium/browsers/firefox/version \
&& echo '{"moz:firefoxOptions": {"binary": "/usr/bin/firefox"}}' > /opt/selenium/browsers/firefox/binary_location

ENV SE_OTEL_SERVICE_NAME="selenium-node-firefox" \
SE_NODE_ENABLE_MANAGED_DOWNLOADS="true"
Loading
Loading