diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..700b511 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +res/ diff --git a/1.Dockerfile b/1.Dockerfile new file mode 100644 index 0000000..2d050ee --- /dev/null +++ b/1.Dockerfile @@ -0,0 +1,41 @@ +FROM ubuntu:18.10 +LABEL maintainer="urielCh " + +ENV VNC_PASSWORD="" \ + DEBIAN_FRONTEND="noninteractive" \ + LC_ALL="C.UTF-8" \ + LANG="en_US.UTF-8" \ + LANGUAGE="en_US.UTF-8" + +ADD res/setup_10.x /tmp/ +# ADD res/google-chrome-stable_current_amd64.deb /tmp/ + +# dpkg -i /tmp/google-chrome-stable_current_amd64.deb &&\ +RUN \ + sed -i s@http://archive\.ubuntu\.com/ubuntu/@mirror://mirrors.ubuntu.com/mirrors.txt@ /etc/apt/sources.list &&\ + apt-get update && apt-get install -y --no-install-recommends apt-utils gnupg2 &&\ + cat /tmp/setup_10.x | bash - &&\ + apt-get update &&\ + apt-get install -y curl xvfb nodejs fonts-takao pulseaudio supervisor x11vnc xdg-utils libnss3 wget libnspr4 libcairo2 libatk1.0-0 fonts-liberation libappindicator3-1 libatk-bridge2.0-0 libpango-1.0-0 chromium-browser &&\ + apt-get clean &&\ + rm -rf /var/cache/* /var/log/apt/* /var/lib/apt/lists/* /tmp/setup_10.x + +RUN useradd --create-home --groups pulse-access --password chrome chrome &&\ + { echo "chrome"; echo "chrome"; } | passwd chrome &&\ + chown -R chrome:chrome /home/chrome/ + +ADD /res/plugin /home/chrome/plugin +ADD /res/webRobotJS /home/chrome/webRobotJS +# RUN apt-get install -y xvfb && echo rm -rf /tmp/* +#RUN apt-get update && apt-get install -y && dpkg -i /tmp/google-chrome-stable_current_amd64.deb +ADD conf/ / + +RUN chmod +x /*.sh + +VOLUME ["/home/chrome"] + +EXPOSE 5900 + +ENTRYPOINT ["/bin/bash", "/entrypoint.sh"] + +CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/conf.d/supervisord.conf"] diff --git a/2.Dockerfile b/2.Dockerfile new file mode 100644 index 0000000..f4426e5 --- /dev/null +++ b/2.Dockerfile @@ -0,0 +1,38 @@ +# docker rm -f chrome; docker build -f 2.Dockerfile -t urielch/chrome-vnc2 .; docker run -t -i -p 5900:5900 --name chrome urielch/chrome-vnc2; +FROM ubuntu:18.10 +LABEL maintainer="urielCh " + +ENV VNC_PASSWORD="" \ + DEBIAN_FRONTEND="noninteractive" \ + LC_ALL="C.UTF-8" \ + LANG="en_US.UTF-8" \ + LANGUAGE="en_US.UTF-8" + +ADD res/setup_10.x /tmp/ +# ADD res/google-chrome-stable_current_amd64.deb /tmp/ +# dpkg -i /tmp/google-chrome-stable_current_amd64.deb &&\ +RUN \ + sed -i s@http://archive\.ubuntu\.com/ubuntu/@mirror://mirrors.ubuntu.com/mirrors.txt@ /etc/apt/sources.list &&\ + apt-get update && apt-get install -y --no-install-recommends apt-utils gnupg2 &&\ + cat /tmp/setup_10.x | bash - &&\ + apt-get update &&\ + apt-get install -y curl xvfb nodejs pulseaudio x11vnc xdg-utils libnss3 wget libnspr4 libcairo2 libatk1.0-0 fonts-liberation libappindicator3-1 libatk-bridge2.0-0 libpango-1.0-0 fluxbox wmctrl chromium-browser &&\ + apt-get clean &&\ + rm -rf /var/cache/* /var/log/apt/* /var/lib/apt/lists/* /tmp/setup_10.x + +RUN useradd --create-home --groups pulse-access --password chrome chrome &&\ + { echo "chrome"; echo "chrome"; } | passwd chrome &&\ + chown -R chrome:chrome /home/chrome/ + +ADD /res/plugin /home/chrome/plugin +ADD /res/webRobotJS /home/chrome/webRobotJS +ADD conf/ / + +# build from windows platform +RUN chmod +x /*.sh +USER chrome +EXPOSE 5900 + +# ENTRYPOINT ["/bin/bash", "/entrypoint.sh"] + +ENTRYPOINT ["/chomevnc.sh"] diff --git a/LICENSE b/LICENSE index 0c1d62d..88d23c7 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2019 UrielCh +Copyright (c) 2019 Uriel Chemouni Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/conf/chomevnc.sh b/conf/chomevnc.sh new file mode 100644 index 0000000..af5c4bb --- /dev/null +++ b/conf/chomevnc.sh @@ -0,0 +1,122 @@ +#!/bin/bash + +# Based on: http://www.richud.com/wiki/Ubuntu_Fluxbox_GUI_with_x11vnc_and_Xvfb + +[ -f /run/secrets/URL ] && URL="$(cat /run/secrets/URL)" +URL="${URL:-https://www.docker.com/}" +VNC_SERVER_PASSWORD=${VNC_SERVER_PASSWORD:-/run/secrets/vncpasswd} +#X11_W=${X11_W:-1920} +#X11_H=${X11_H:-1080} + +main() { + log_i "Starting xvfb virtual display..." + launch_xvfb + log_i "Starting window manager..." + launch_window_manager + log_i "Starting VNC server..." + run_vnc_server + log_i "Starting Chrome..." + launch_chrome +} + +launch_xvfb() { + local xvfbLockFilePath="/tmp/.X1-lock" + if [ -f "${xvfbLockFilePath}" ] + then + log_i "Removing xvfb lock file '${xvfbLockFilePath}'..." + if ! rm -v "${xvfbLockFilePath}" + then + log_e "Failed to remove xvfb lock file" + exit 1 + fi + fi + + # Set defaults if the user did not specify envs. + export DISPLAY=${XVFB_DISPLAY:-:1} + local screen=${XVFB_SCREEN:-0} + local resolution=${XVFB_RESOLUTION:-1280x960x24} + local timeout=${XVFB_TIMEOUT:-5} + + # Start and wait for either Xvfb to be fully up or we hit the timeout. + Xvfb ${DISPLAY} -screen ${screen} ${resolution} & + local loopCount=0 + until xdpyinfo -display ${DISPLAY} > /dev/null 2>&1 + do + loopCount=$((loopCount+1)) + sleep 1 + if [ ${loopCount} -gt ${timeout} ] + then + log_e "xvfb failed to start" + exit 1 + fi + done +} + +launch_window_manager() { + local timeout=${XVFB_TIMEOUT:-5} + + # Start and wait for either fluxbox to be fully up or we hit the timeout. + fluxbox & + local loopCount=0 + until wmctrl -m > /dev/null 2>&1 + do + loopCount=$((loopCount+1)) + sleep 1 + if [ ${loopCount} -gt ${timeout} ] + then + log_e "fluxbox failed to start" + exit 1 + fi + done +} + +run_vnc_server() { + local passwordArgument='-nopw' + + if [ -e "${VNC_SERVER_PASSWORD}" ] + then + export X11VNC_AUTH="-rfbauth ${VNC_SERVER_PASSWORD}" + log_i "The VNC server will ask for a password" + else + log_w "The VNC server will NOT ask for a password" + fi + + x11vnc -ncache 10 -display ${DISPLAY} -wait 20 -forever ${X11VNC_AUTH} & + # wait $! +} + +launch_chrome() { + export HOME="/home/chrome" + export USER="chrome" + /chrome.sh + # wait $! +} + + + +log_i() { + log "[INFO] ${@}" +} + +log_w() { + log "[WARN] ${@}" +} + +log_e() { + log "[ERROR] ${@}" +} + +log() { + echo "[$(date '+%Y-%m-%d %H:%M:%S')] ${@}" +} + +control_c() { + echo "" + exit +} + +trap control_c SIGINT SIGTERM SIGHUP + +main + +exit \ No newline at end of file diff --git a/conf/chrome.sh b/conf/chrome.sh new file mode 100755 index 0000000..5eb8d73 --- /dev/null +++ b/conf/chrome.sh @@ -0,0 +1,30 @@ +#!/bin/sh + +[ -f /run/secrets/URL ] && URL="$(cat /run/secrets/URL)" +URL="${URL:-https://www.docker.com/}" +# /usr/bin/google-chrome-stable +/usr/bin/chromium-browser \ + --clear-token-service \ + --disable-background-mode \ + --disable-gpu \ + --disable-infobars \ + --disable-metrics \ + --disable-preconnect \ + --disable-speech-api \ + --disable-sync \ + --disable-sync-app-list \ + --disable-translate \ + --disable-voice-input \ + --disable-webgl \ + --disable-web-security \ + --force-device-scale-factor=1 \ + --ignore-certificate-errors \ + --load-extension=/home/chrome/plugin \ + --no-first-run \ + --no-pings \ + --no-sandbox \ + --reset-variation-state \ + --user-data-dir \ + --window-position=0,0 \ + --window-size=${X11_W},${X11_H} \ + "${URL}" diff --git a/conf/entrypoint.sh b/conf/entrypoint.sh new file mode 100644 index 0000000..e7dc9aa --- /dev/null +++ b/conf/entrypoint.sh @@ -0,0 +1,34 @@ +#!/bin/bash +set -e +echo ENTRY POINT +# VNC default no password +export X11VNC_AUTH="-nopw" + +#touch /opt/vncpasswd +#echo "chrome" | vncpasswd -f > /opt/vncpasswd + +# look for VNC password file in order (first match is used) +passwd_files=( + /home/chrome/.vnc/passwd + /run/secrets/vncpasswd +# /opt/vncpasswd +) + +for passwd_file in ${passwd_files[@]}; do + if [[ -f ${passwd_file} ]]; then + export X11VNC_AUTH="-rfbauth ${passwd_file}" + break + fi +done + +# override above if VNC_PASSWORD env var is set (insecure!) +if [[ "$PASSWORD" != "" ]]; then + export X11VNC_AUTH="-passwd $PASSWORD" +fi + +[ -z $X11_W ] && X11_W=1920 +[ -z $X11_H ] && X11_H=1080 +export X11_W +export X11_H + +exec "$@" diff --git a/conf/env.sh b/conf/env.sh new file mode 100644 index 0000000..838d97b --- /dev/null +++ b/conf/env.sh @@ -0,0 +1,3 @@ +#!/bin/sh +X11_W=${X11_W:-1920} +X11_H=${X11_H:-1080} diff --git a/conf/etc/supervisor/conf.d/supervisord.conf b/conf/etc/supervisor/conf.d/supervisord.conf new file mode 100644 index 0000000..9c694e2 --- /dev/null +++ b/conf/etc/supervisor/conf.d/supervisord.conf @@ -0,0 +1,45 @@ +[supervisord] +nodaemon=true + +[program:xvfb] +command=/xvfb.sh +autorestart=true +priority=100 + +[program:chromium-browser] +environment=HOME="/home/chrome",DISPLAY=":1",USER="chrome" +command=/chrome.sh +user=chrome +autorestart=true +priority=200 + +[program:node] +environment=HOME="/home/chrome",DISPLAY=":1",USER="chrome" +directory=/home/chrome/webRobotJS +command=/usr/bin/node zService.js +user=chrome +autorestart=true +priority=200 + +[program:x11vnc] +command=/usr/bin/x11vnc -display :1 %(ENV_X11VNC_AUTH)s -wait 5 -forever -xrandr +user=chrome +autorestart=true +priority=300 + +#[program:xrdp-sesman] +#command=/usr/sbin/xrdp-sesman --nodaemon +#user=root +#process_name = xrdp-sesman +#autorestart=true +#priority=400 + +#[program:xrdp] +##command=/usr/sbin/xrdp -nodaemon +#command=/etc/init.d/xrdp restart +#user=root +#process_name = xrdp +#autorestart=true +#stderr_logfile=/var/log/xrdp-error.log +#stdout_logfile=/var/log/xrdp.log +#priority=500 diff --git a/conf/xvfb.sh b/conf/xvfb.sh new file mode 100644 index 0000000..7efc715 --- /dev/null +++ b/conf/xvfb.sh @@ -0,0 +1,3 @@ +#!/bin/sh +. /env.sh +/usr/bin/Xvfb :1 -screen 0 ${X11_W}x${X11_H}x24 +extension RANDR \ No newline at end of file diff --git a/dep.Dockerfile b/dep.Dockerfile new file mode 100644 index 0000000..1dace58 --- /dev/null +++ b/dep.Dockerfile @@ -0,0 +1,42 @@ +FROM ubuntu:18.10 +LABEL maintainer="urielCh " + +ENV DEBIAN_FRONTEND="noninteractive" \ + LC_ALL="C.UTF-8" \ + LANG="en_US.UTF-8" \ + LANGUAGE="en_US.UTF-8" + +RUN \ + sed -i s@http://archive\.ubuntu\.com/ubuntu/@mirror://mirrors.ubuntu.com/mirrors.txt@ /etc/apt/sources.list &&\ + apt-get update && apt-get upgrade -y && apt-get install -y --no-install-recommends git curl ca-certificates apt-utils gnupg2 build-essential libxtst-dev libpng++-dev &&\ + curl https://deb.nodesource.com/setup_10.x -o /setup_10.x &&\ + chmod +x /setup_10.x && /setup_10.x &&\ + apt-get install -y nodejs &&\ + apt-get clean && rm -rf /var/cache/* /var/log/* /var/lib/apt/lists/* +# apt update &&\ + +RUN \ + git clone https://github.com/UrielCh/webRobotJS &&\ + cd webRobotJS &&\ + rm -rf .git &&\ + npm install && cd .. &&\ + git clone https://github.com/UrielCh/zombie-plugin &&\ + cd zombie-plugin &&\ + rm -rf .git &&\ + npm install &&\ + npm install -g typescript browserify &&\ + tsc -p . &&\ + cp ./built/client.js ./dist/js/client.js &&\ + browserify ./built/popup.js > ./dist/js/popup.js &&\ + browserify ./built/background.js > ./dist/js/background.js &&\ + cd .. +# echo 'curl https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb -o /opt/google-chrome-stable_current_amd64.deb' >> dl.sh &&\ +RUN \ + echo '#!/bin/bash' > /dl.sh &&\ + echo 'cp -r /webRobotJS /opt' >> dl.sh &&\ + echo 'cp -r /zombie-plugin/dist /opt/plugin' >> dl.sh &&\ + echo 'cp /setup_10.x /opt' >> dl.sh &&\ + echo 'echo All Done' >> dl.sh &&\ + chmod +x /dl.sh + +WORKDIR /opt