#!/bin/bash set -e # write files owned by the user who runs the container # if your volume is mounted at /sitespeed.io, use it as CWD [[ -d /sitespeed.io && "$PWD" = "/" ]] && cd /sitespeed.io uid=$(stat -c '%u' . 2>/dev/null || echo 0) gid=$(stat -c '%g' . 2>/dev/null || echo 0) if [[ "$uid" -ne 0 && "$gid" -ne 0 ]]; then if ! getent group "$gid" >/dev/null 2>&1; then groupadd -g "$gid" sitespeedio-host 2>/dev/null || true fi if ! getent passwd "$uid" >/dev/null 2>&1; then useradd -u "$uid" -g "$gid" -M -d /tmp -s /bin/bash sitespeedio-host 2>/dev/null || true fi fi run_as_host() { if [[ "$uid" -ne 0 && "$gid" -ne 0 ]]; then HOME=/tmp chroot --skip-chdir --userspec="+${uid}:+${gid}" / "$@" else HOME=/tmp "$@" fi } # All browsers do not exist in all architectures. if [[ `which google-chrome` ]]; then google-chrome --version elif [[ `which chromium-browser` ]]; then chromium-browser --version fi if [[ `which firefox` ]]; then firefox --version 2>/dev/null fi if [[ `which microsoft-edge` ]]; then microsoft-edge --version fi ARCH="$(uname -m)" echo "Architecture: $ARCH" BROWSERTIME=/usr/src/app/bin/browsertimeWebPageReplay.js SITESPEEDIO=/usr/src/app/bin/sitespeed.js export DBUS_SESSION_BUS_ADDRESS=/dev/null MAX_OLD_SPACE_SIZE="${MAX_OLD_SPACE_SIZE:-2048}" HTTP_PORT=80 HTTPS_PORT=443 CERT_FILE=/webpagereplay/certs/wpr_cert.pem KEY_FILE=/webpagereplay/certs/wpr_key.pem SCRIPTS=/webpagereplay/scripts/deterministic.js if [ -n "$START_ADB_SERVER" ] ; then WPR_HTTP_PORT=${WPR_HTTP_PORT:-8080} WPR_HTTPS_PORT=${WPR_HTTPS_PORT:-8081} else WPR_HTTP_PORT=${WPR_HTTP_PORT:-80} WPR_HTTPS_PORT=${WPR_HTTPS_PORT:-443} fi # Need to explictly override the HOME directory to prevent dconf errors like: # (firefox:2003): dconf-CRITICAL **: 00:31:23.379: unable to create directory '/root/.cache/dconf': Permission denied. dconf will not work properly. export HOME=/tmp function execNode(){ run_as_host node "$@" } # If we run Chrome on Android, we need to start the ADB server function setupADB(){ # Start adb server and list connected devices if [ -n "$START_ADB_SERVER" ] ; then sudo adb start-server sudo adb devices if [ $REPLAY ] ; then sudo adb reverse tcp:$WPR_HTTP_PORT tcp:$WPR_HTTP_PORT sudo adb reverse tcp:$WPR_HTTPS_PORT tcp:$WPR_HTTPS_PORT fi fi } function runWebPageReplay() { # Inspired by docker-selenium way of shutting down function shutdown { kill -2 $replay_pid wait $replay_pid kill -s SIGTERM ${PID} wait $PID } LATENCY=${LATENCY:-100} WPR_PARAMS="--http_port $WPR_HTTP_PORT --https_port $WPR_HTTPS_PORT --https_cert_file $CERT_FILE --https_key_file $KEY_FILE --inject_scripts $SCRIPTS /tmp/archive.wprgo" WAIT=${WAIT:-5000} REPLAY_WAIT=${REPLAY_WAIT:-3} RECORD_WAIT=${RECORD_WAIT:-3} declare -i RESULT=0 echo 'Start WebPageReplay Record' wpr record $WPR_PARAMS > /tmp/wpr-record.log 2>&1 & record_pid=$! sleep $RECORD_WAIT execNode $BROWSERTIME --browsertime.chrome.webPageReplayHostResolver --browsertime.chrome.webPageReplayHTTPPort $WPR_HTTP_PORT --browsertime.chrome.webPageReplayHTTPSPort $WPR_HTTPS_PORT --browsertime.chrome.webPageReplayRecord true --browsertime.firefox.preference network.dns.forceResolve:127.0.0.1 --browsertime.firefox.acceptInsecureCerts true --browsertime.connectivity.engine throttle --browsertime.connectivity.throttle.localhost --browsertime.connectivity.profile custom --browsertime.connectivity.latency $LATENCY "$@" RESULT+=$? kill -2 $record_pid RESULT+=$? wait $record_pid echo 'Stopped WebPageReplay record' if [ $RESULT -eq 0 ] then echo 'Start WebPageReplay Replay' wpr replay $WPR_PARAMS > /tmp/wpr-replay.log 2>&1 & replay_pid=$! if [ $? -eq 0 ] then execNode --max-old-space-size=$MAX_OLD_SPACE_SIZE $SITESPEEDIO --browsertime.firefox.preference security.OCSP.enabled:0 --browsertime.firefox.acceptInsecureCerts true --browsertime.firefox.preference network.dns.forceResolve:127.0.0.1 --browsertime.chrome.webPageReplayHostResolver --browsertime.chrome.webPageReplayHTTPPort $WPR_HTTP_PORT --browsertime.chrome.webPageReplayHTTPSPort $WPR_HTTPS_PORT --browsertime.connectivity.engine throttle --browsertime.connectivity.throttle.localhost --replay --browsertime.connectivity.profile custom --browsertime.connectivity.rtt $LATENCY "$@" & PID=$! trap shutdown SIGTERM SIGINT wait $PID EXIT_STATUS=$? kill -s SIGTERM $replay_pid exit $EXIT_STATUS else echo "Replay server didn't start correctly" >&2 exit 1 fi else echo "Recording or accessing the URL failed, will not replay" >&2 exit 1 fi } function runSitespeedio(){ # Inspired by docker-selenium way of shutting down function shutdown { kill -s SIGTERM ${PID} wait $PID } execNode --max-old-space-size=$MAX_OLD_SPACE_SIZE $SITESPEEDIO "$@" & PID=$! trap shutdown SIGTERM SIGINT wait $PID } setupADB # Additional start script that the user can copy to the container if [ ! -z "$EXTRA_START_SCRIPT" ] && [ -f "$EXTRA_START_SCRIPT" ] then chmod +x $EXTRA_START_SCRIPT $EXTRA_START_SCRIPT fi if [ $REPLAY ] then runWebPageReplay "$@" else runSitespeedio "$@" fi