init
This commit is contained in:
@@ -0,0 +1,28 @@
|
||||
FROM golang:1.17 as go
|
||||
|
||||
COPY choose /choose
|
||||
|
||||
COPY rproxy /rproxy
|
||||
|
||||
RUN \
|
||||
apt-get update && \
|
||||
apt-get install -y upx-ucl && \
|
||||
cd /choose && \
|
||||
GOOS=linux GOARCH=amd64 go build -ldflags="-s -w" && \
|
||||
upx /choose/choose && \
|
||||
cd /rproxy && \
|
||||
GOOS=linux GOARCH=amd64 go build -ldflags="-s -w" && \
|
||||
upx /rproxy/rproxy
|
||||
|
||||
FROM ubuntu:18.04
|
||||
|
||||
COPY --from=go /choose/choose /usr/local/bin/
|
||||
COPY --from=go /rproxy/rproxy /usr/local/bin/
|
||||
|
||||
RUN \
|
||||
apt update && \
|
||||
apt -y install xvfb x11-utils x11vnc tigervnc-common tigervnc-viewer
|
||||
|
||||
COPY entrypoint.sh /
|
||||
ENTRYPOINT ["/entrypoint.sh"]
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
#browsers.json
|
||||
|
||||
```
|
||||
"MicrosoftEdge": {
|
||||
"default": "77",
|
||||
"versions": {
|
||||
"77": {
|
||||
"image": "selenoid/external-host:1.0.0",
|
||||
"port": "4444",
|
||||
"path": "/",
|
||||
"env": ["URLS=[\"http://172.17.0.1:4444/\"]","VNC_PASSWORD=longpassword","SCREEN_RESOLUTION=1921x1080x24"]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
```
|
||||
@@ -0,0 +1,30 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"os"
|
||||
"time"
|
||||
"fmt"
|
||||
"encoding/json"
|
||||
"math/rand"
|
||||
)
|
||||
|
||||
var (
|
||||
s rand.Source
|
||||
r *rand.Rand
|
||||
)
|
||||
|
||||
func init() {
|
||||
s = rand.NewSource(time.Now().Unix())
|
||||
r = rand.New(s)
|
||||
}
|
||||
|
||||
func main() {
|
||||
var hosts []string
|
||||
if err := json.Unmarshal([]byte(os.Getenv("URLS")), &hosts); err != nil {
|
||||
fmt.Printf("unmarshal json: %v", err)
|
||||
os.Exit(1)
|
||||
}
|
||||
if l := len(hosts); l > 0 {
|
||||
fmt.Println(hosts[r.Intn(l)])
|
||||
}
|
||||
}
|
||||
Executable
+51
@@ -0,0 +1,51 @@
|
||||
#!/bin/bash
|
||||
SCREEN_RESOLUTION=${SCREEN_RESOLUTION:-"1920x1080x24"}
|
||||
DISPLAY_NUM=99
|
||||
URLS=${URLS:-'["http://172.17.0.1:4444/"]'}
|
||||
VNC_PASSWORD=${VNC_PASSWORD:-"password"}
|
||||
export URLS
|
||||
export VNC_PASSWORD
|
||||
export DISPLAY=":$DISPLAY_NUM"
|
||||
|
||||
clean() {
|
||||
if [ -n "$XVFB_PID" ]; then
|
||||
kill -TERM "$XVFB_PID"
|
||||
fi
|
||||
if [ -n "$X11VNC_PID" ]; then
|
||||
kill -TERM "$X11VNC_PID"
|
||||
fi
|
||||
if [ -n "$RPROXY_PID" ]; then
|
||||
kill -TERM "$RPROXY_PID"
|
||||
fi
|
||||
|
||||
}
|
||||
|
||||
trap clean SIGINT SIGTERM
|
||||
|
||||
URL=$(choose $URL)
|
||||
HOST=$(echo $URL | sed -e 's@\(.*\)://@@' -e 's@[:/]\(.*\)$@@')
|
||||
|
||||
/bin/bash -c 'echo -e "$VNC_PASSWORD\n$VNC_PASSWORD\nn\n" | vncpasswd file.passwd'>/dev/null
|
||||
|
||||
xvfb-run -l -n $DISPLAY_NUM -s "-ac -screen 0 $SCREEN_RESOLUTION -noreset -listen tcp" \
|
||||
vncviewer passwd=file.passwd $HOST &
|
||||
XVFB_PID=$!
|
||||
|
||||
retcode=1
|
||||
until [ $retcode -eq 0 ]; do
|
||||
xdpyinfo -display $DISPLAY >/dev/null 2>&1
|
||||
retcode=$?
|
||||
if [ $retcode -ne 0 ]; then
|
||||
echo Waiting xvfb...
|
||||
sleep 1
|
||||
fi
|
||||
done
|
||||
|
||||
x11vnc -display $DISPLAY -passwd selenoid -shared -forever -loop500 -rfbport 5900 -rfbportv6 5900 -logfile /dev/null &
|
||||
X11VNC_PID=$!
|
||||
|
||||
rproxy $URL &
|
||||
RPROXY_PID=$!
|
||||
|
||||
wait
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"log"
|
||||
"net/http"
|
||||
"net/http/httputil"
|
||||
"net/url"
|
||||
"os"
|
||||
)
|
||||
|
||||
func main() {
|
||||
u, err := url.Parse(os.Args[1])
|
||||
if err != nil {
|
||||
log.Fatalf("parse url: %v", err)
|
||||
}
|
||||
log.Fatal(http.ListenAndServe(":4444", httputil.NewSingleHostReverseProxy(u)))
|
||||
}
|
||||
Reference in New Issue
Block a user