aboutsummaryrefslogtreecommitdiffstats
path: root/coin/provisioning/common/shared/testserver
diff options
context:
space:
mode:
Diffstat (limited to 'coin/provisioning/common/shared/testserver')
-rw-r--r--coin/provisioning/common/shared/testserver/.gitattributes1
-rw-r--r--coin/provisioning/common/shared/testserver/apache2/Dockerfile8
-rw-r--r--coin/provisioning/common/shared/testserver/apache2_18.04/Dockerfile4
-rw-r--r--coin/provisioning/common/shared/testserver/californium/Dockerfile15
-rw-r--r--coin/provisioning/common/shared/testserver/californium/qt_changes.patch43
-rw-r--r--coin/provisioning/common/shared/testserver/cyrus/Dockerfile4
-rw-r--r--coin/provisioning/common/shared/testserver/cyrus_18.04/Dockerfile4
-rw-r--r--coin/provisioning/common/shared/testserver/danted/Dockerfile11
-rwxr-xr-xcoin/provisioning/common/shared/testserver/danted/danted93
-rwxr-xr-xcoin/provisioning/common/shared/testserver/danted/danted-authenticating97
-rw-r--r--coin/provisioning/common/shared/testserver/danted_18.04/Dockerfile4
-rwxr-xr-xcoin/provisioning/common/shared/testserver/docker_images.sh96
-rwxr-xr-xcoin/provisioning/common/shared/testserver/docker_machine.sh22
-rwxr-xr-xcoin/provisioning/common/shared/testserver/docker_testserver.sh26
-rw-r--r--coin/provisioning/common/shared/testserver/echo/Dockerfile4
-rw-r--r--coin/provisioning/common/shared/testserver/echo_18.04/Dockerfile4
-rw-r--r--coin/provisioning/common/shared/testserver/freecoap/Dockerfile14
-rw-r--r--coin/provisioning/common/shared/testserver/ftp-proxy/Dockerfile4
-rw-r--r--coin/provisioning/common/shared/testserver/ftp-proxy_18.04/Dockerfile4
-rw-r--r--coin/provisioning/common/shared/testserver/iptables/Dockerfile4
-rw-r--r--coin/provisioning/common/shared/testserver/iptables_18.04/Dockerfile4
-rw-r--r--coin/provisioning/common/shared/testserver/qt_ubuntu_16.04/Dockerfile5
-rw-r--r--coin/provisioning/common/shared/testserver/qt_ubuntu_18.04/Dockerfile5
-rwxr-xr-xcoin/provisioning/common/shared/testserver/settings.sh9
-rw-r--r--coin/provisioning/common/shared/testserver/squid/Dockerfile4
-rw-r--r--coin/provisioning/common/shared/testserver/squid_18.04/Dockerfile4
-rw-r--r--coin/provisioning/common/shared/testserver/vsftpd/Dockerfile7
-rw-r--r--coin/provisioning/common/shared/testserver/vsftpd_18.04/Dockerfile4
28 files changed, 504 insertions, 0 deletions
diff --git a/coin/provisioning/common/shared/testserver/.gitattributes b/coin/provisioning/common/shared/testserver/.gitattributes
new file mode 100644
index 00000000..fcadb2cf
--- /dev/null
+++ b/coin/provisioning/common/shared/testserver/.gitattributes
@@ -0,0 +1 @@
+* text eol=lf
diff --git a/coin/provisioning/common/shared/testserver/apache2/Dockerfile b/coin/provisioning/common/shared/testserver/apache2/Dockerfile
new file mode 100644
index 00000000..c3dc5d59
--- /dev/null
+++ b/coin/provisioning/common/shared/testserver/apache2/Dockerfile
@@ -0,0 +1,8 @@
+FROM qt_ubuntu_16.04
+ARG packages="avahi-daemon apache2 libcgi-session-perl"
+RUN apt-get update && apt-get install -y $packages && dpkg -l $packages
+EXPOSE 80 443
+
+# install configurations and test data
+
+COPY rfc3252.txt .
diff --git a/coin/provisioning/common/shared/testserver/apache2_18.04/Dockerfile b/coin/provisioning/common/shared/testserver/apache2_18.04/Dockerfile
new file mode 100644
index 00000000..1a629c47
--- /dev/null
+++ b/coin/provisioning/common/shared/testserver/apache2_18.04/Dockerfile
@@ -0,0 +1,4 @@
+FROM qt_ubuntu_18.04
+ARG packages="avahi-daemon apache2 libcgi-session-perl"
+RUN apt-get update && apt-get install -y $packages && dpkg -l $packages
+EXPOSE 80 443
diff --git a/coin/provisioning/common/shared/testserver/californium/Dockerfile b/coin/provisioning/common/shared/testserver/californium/Dockerfile
new file mode 100644
index 00000000..81d27f9b
--- /dev/null
+++ b/coin/provisioning/common/shared/testserver/californium/Dockerfile
@@ -0,0 +1,15 @@
+FROM qt_ubuntu_18.04
+ARG packages="avahi-daemon maven default-jdk patch"
+RUN apt-get update && apt-get -y install $packages
+
+# Get californium-based CoAP test server
+WORKDIR /root/src
+ADD californium-*.tar.gz .
+RUN mv californium-* californium
+WORKDIR /root/src/californium
+ADD qt_changes.patch ./
+RUN patch -p1 < qt_changes.patch
+RUN mvn clean install -q -DskipTests
+WORKDIR /
+
+EXPOSE 5683/udp 5684/udp
diff --git a/coin/provisioning/common/shared/testserver/californium/qt_changes.patch b/coin/provisioning/common/shared/testserver/californium/qt_changes.patch
new file mode 100644
index 00000000..732c0daa
--- /dev/null
+++ b/coin/provisioning/common/shared/testserver/californium/qt_changes.patch
@@ -0,0 +1,43 @@
+diff -ruN californium_3.8.0/demo-apps/cf-plugtest-server/src/main/java/org/eclipse/californium/plugtests/PlugtestServer.java californium/demo-apps/cf-plugtest-server/src/main/java/org/eclipse/californium/plugtests/PlugtestServer.java
+--- californium_3.8.0/demo-apps/cf-plugtest-server/src/main/java/org/eclipse/californium/plugtests/PlugtestServer.java 2023-07-21 11:16:21.142201240 +0200
++++ californium/demo-apps/cf-plugtest-server/src/main/java/org/eclipse/californium/plugtests/PlugtestServer.java 2023-07-21 11:16:51.074210378 +0200
+@@ -100,6 +100,14 @@
+ import org.eclipse.californium.unixhealth.NetSocketHealthLogger;
+ import org.eclipse.californium.unixhealth.NetStatLogger;
+
++import org.eclipse.californium.scandium.DTLSConnector;
++import org.eclipse.californium.scandium.config.DtlsConnectorConfig;
++import org.eclipse.californium.scandium.dtls.pskstore.AdvancedSinglePskStore;
++import org.eclipse.californium.core.network.CoapEndpoint;
++
++import java.net.InetSocketAddress;
++import java.net.InetAddress;
++
+ import picocli.CommandLine;
+ import picocli.CommandLine.ArgGroup;
+ import picocli.CommandLine.Command;
+@@ -437,7 +445,23 @@
+ // server.addEndpoint(new CoAPEndpoint(new InetSocketAddress("127.0.0.1", port)));
+ // server.addEndpoint(new CoAPEndpoint(new InetSocketAddress("2a01:c911:0:2010::10", port)));
+ // server.addEndpoint(new CoAPEndpoint(new InetSocketAddress("10.200.1.2", port)));
+- server.addEndpoints(config);
++ // server.addEndpoints(config);
++
++ CoapEndpoint.Builder endpointBuilder = new CoapEndpoint.Builder();
++ endpointBuilder.setPort(5683);
++ server.addEndpoint(endpointBuilder.build());
++
++ AdvancedSinglePskStore pskStore = new AdvancedSinglePskStore("Client_identity", "secretPSK".getBytes());
++
++ DtlsConnectorConfig.Builder builder = new DtlsConnectorConfig.Builder(new Configuration());
++ builder.setAddress(new InetSocketAddress(5684));
++ builder.setAdvancedPskStore(pskStore);
++ DTLSConnector dtlsConnector = new DTLSConnector(builder.build());
++
++ endpointBuilder = new CoapEndpoint.Builder();
++ endpointBuilder.setConnector(dtlsConnector);
++ server.addEndpoint(endpointBuilder.build());
++
+ if (server.getEndpoints().isEmpty()) {
+ System.err.println("no endpoint available!");
+ System.exit(ERR_INIT_FAILED);
diff --git a/coin/provisioning/common/shared/testserver/cyrus/Dockerfile b/coin/provisioning/common/shared/testserver/cyrus/Dockerfile
new file mode 100644
index 00000000..4708ef5b
--- /dev/null
+++ b/coin/provisioning/common/shared/testserver/cyrus/Dockerfile
@@ -0,0 +1,4 @@
+FROM qt_ubuntu_16.04
+ARG packages="avahi-daemon cyrus-imapd"
+RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y $packages && dpkg -l $packages
+EXPOSE 143 993
diff --git a/coin/provisioning/common/shared/testserver/cyrus_18.04/Dockerfile b/coin/provisioning/common/shared/testserver/cyrus_18.04/Dockerfile
new file mode 100644
index 00000000..c20ed4f9
--- /dev/null
+++ b/coin/provisioning/common/shared/testserver/cyrus_18.04/Dockerfile
@@ -0,0 +1,4 @@
+FROM qt_ubuntu_18.04
+ARG packages="avahi-daemon cyrus-imapd"
+RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y $packages && dpkg -l $packages
+EXPOSE 143 993
diff --git a/coin/provisioning/common/shared/testserver/danted/Dockerfile b/coin/provisioning/common/shared/testserver/danted/Dockerfile
new file mode 100644
index 00000000..0d3ca461
--- /dev/null
+++ b/coin/provisioning/common/shared/testserver/danted/Dockerfile
@@ -0,0 +1,11 @@
+FROM qt_ubuntu_16.04
+ARG packages="avahi-daemon"
+RUN apt-get update && apt-get install -y $packages && dpkg -l $packages
+COPY dante-server_1.4.1-1_amd64.deb .
+RUN apt -y install ./dante-server_1.4.1-1_amd64.deb \
+ && rm -f ./dante-server_1.4.1-1_amd64.deb
+EXPOSE 1080-1081
+
+# install configurations and test data
+COPY danted /etc/init.d/
+COPY danted-authenticating /etc/init.d/
diff --git a/coin/provisioning/common/shared/testserver/danted/danted b/coin/provisioning/common/shared/testserver/danted/danted
new file mode 100755
index 00000000..1da8203e
--- /dev/null
+++ b/coin/provisioning/common/shared/testserver/danted/danted
@@ -0,0 +1,93 @@
+#! /bin/sh
+### BEGIN INIT INFO
+# Provides: danted
+# Required-Start: $remote_fs $syslog
+# Required-Stop: $remote_fs $syslog
+# Default-Start: 2 3 4 5
+# Default-Stop: 0 1 6
+# Short-Description: SOCKS (v4 and v5) proxy daemon (danted)
+### END INIT INFO
+#
+# dante SOCKS server init.d file. Based on /etc/init.d/skeleton:
+# Version: @(#)skeleton 1.8 03-Mar-1998 miquels@cistron.nl
+
+PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
+DAEMON=/usr/sbin/danted
+NAME=danted
+DESC="Dante SOCKS daemon"
+PIDFILE=/var/run/$NAME.pid
+CONFFILE=/etc/$NAME.conf
+
+test -f $DAEMON || exit 0
+
+set -e
+
+# This function makes sure that the Dante server can write to the pid-file.
+touch_pidfile ()
+{
+ if [ -r $CONFFILE ]; then
+ uid="`sed -n -e 's/[[:space:]]//g' -e 's/#.*//' -e '/^user\.privileged/{s/[^:]*://p;q;}' \
+ $CONFFILE`"
+ if [ -n "$uid" ]; then
+ touch $PIDFILE
+ chown $uid $PIDFILE
+ fi
+ fi
+}
+
+. /lib/lsb/init-functions
+
+case "$1" in
+ start)
+ if ! egrep -cve '^ *(#|$)' \
+ -e '^(logoutput|user\.((not)?privileged|libwrap)):' $CONFFILE > /dev/null
+ then
+ echo "Not starting $DESC: not configured."
+ exit 0
+ fi
+ echo -n "Starting $DESC: "
+ touch_pidfile
+ start-stop-daemon --start --quiet --oknodo --pidfile $PIDFILE --exec $DAEMON -- -D
+ echo "$NAME."
+ ;;
+ stop)
+ echo -n "Stopping $DESC: "
+ start-stop-daemon --stop --quiet --oknodo --pidfile $PIDFILE --exec $DAEMON
+ echo "$NAME."
+ ;;
+ reload|force-reload)
+ #
+ # If the daemon can reload its config files on the fly
+ # for example by sending it SIGHUP, do it here.
+ #
+ # If the daemon responds to changes in its config file
+ # directly anyway, make this a do-nothing entry.
+ #
+ echo "Reloading $DESC configuration files."
+ start-stop-daemon --stop --signal 1 --quiet --pidfile $PIDFILE --exec $DAEMON -- -D
+ ;;
+ restart)
+ #
+ # If the "reload" option is implemented, move the "force-reload"
+ # option to the "reload" entry above. If not, "force-reload" is
+ # just the same as "restart".
+ #
+ echo -n "Restarting $DESC: "
+ start-stop-daemon --stop --quiet --pidfile $PIDFILE --exec $DAEMON
+ sleep 1
+ touch_pidfile
+ start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON -- -D
+ echo "$NAME."
+ ;;
+ status)
+ status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $?
+ ;;
+ *)
+ N=/etc/init.d/$NAME
+ # echo "Usage: $N {start|stop|restart|reload|force-reload}" >&2
+ echo "Usage: $N {start|stop|restart|force-reload}" >&2
+ exit 1
+ ;;
+esac
+
+exit 0
diff --git a/coin/provisioning/common/shared/testserver/danted/danted-authenticating b/coin/provisioning/common/shared/testserver/danted/danted-authenticating
new file mode 100755
index 00000000..7aa35db6
--- /dev/null
+++ b/coin/provisioning/common/shared/testserver/danted/danted-authenticating
@@ -0,0 +1,97 @@
+#! /bin/sh
+### BEGIN INIT INFO
+# Provides: danted-authenticating
+# Required-Start: $remote_fs $syslog
+# Required-Stop: $remote_fs $syslog
+# Default-Start: 2 3 4 5
+# Default-Stop: 0 1 6
+# Short-Description: SOCKS (v4 and v5) proxy daemon (danted)
+### END INIT INFO
+#
+# dante SOCKS server init.d file. Based on /etc/init.d/skeleton:
+# Version: @(#)skeleton 1.8 03-Mar-1998 miquels@cistron.nl
+
+PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
+DAEMON=/usr/sbin/danted
+NAME=danted-authenticating
+DESC="Dante SOCKS daemon"
+PIDFILE=/var/run/$NAME.pid
+CONFFILE=/etc/$NAME.conf
+DANTED_ARGS="-D -f $CONFFILE"
+
+test -f $DAEMON || exit 0
+
+set -e
+
+# This function makes sure that the Dante server can write to the pid-file.
+touch_pidfile ()
+{
+ if [ -r $CONFFILE ]; then
+ uid="`sed -n -e 's/[[:space:]]//g' -e 's/#.*//' -e '/^user\.privileged/{s/[^:]*://p;q;}' \
+ $CONFFILE`"
+ if [ -n "$uid" ]; then
+ touch $PIDFILE
+ chown $uid $PIDFILE
+ fi
+ fi
+}
+
+. /lib/lsb/init-functions
+
+case "$1" in
+ start)
+ if ! egrep -cve '^ *(#|$)' \
+ -e '^(logoutput|user\.((not)?privileged|libwrap)):' $CONFFILE > /dev/null
+ then
+ echo "Not starting $DESC: not configured."
+ exit 0
+ fi
+ echo -n "Starting $DESC: "
+ touch_pidfile
+ start-stop-daemon --start --quiet --oknodo --pidfile $PIDFILE \
+ --exec $DAEMON -- $DANTED_ARGS
+ echo "$NAME."
+ ;;
+ stop)
+ echo -n "Stopping $DESC: "
+ start-stop-daemon --stop --quiet --oknodo --pidfile $PIDFILE --exec $DAEMON
+ echo "$NAME."
+ ;;
+ reload|force-reload)
+ #
+ # If the daemon can reload its config files on the fly
+ # for example by sending it SIGHUP, do it here.
+ #
+ # If the daemon responds to changes in its config file
+ # directly anyway, make this a do-nothing entry.
+ #
+ echo "Reloading $DESC configuration files."
+ start-stop-daemon --stop --signal 1 --quiet --pidfile $PIDFILE \
+ --exec $DAEMON -- $DANTED_ARGS
+ ;;
+ restart)
+ #
+ # If the "reload" option is implemented, move the "force-reload"
+ # option to the "reload" entry above. If not, "force-reload" is
+ # just the same as "restart".
+ #
+ echo -n "Restarting $DESC: "
+ start-stop-daemon --stop --quiet --pidfile $PIDFILE --exec $DAEMON
+ sleep 1
+ touch_pidfile
+ start-stop-daemon --start --quiet --pidfile $PIDFILE \
+ --exec $DAEMON -- $DANTED_ARGS
+ echo "$NAME."
+ ;;
+ status)
+ status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $?
+ ;;
+ *)
+ N=/etc/init.d/$NAME
+ # echo "Usage: $N {start|stop|restart|reload|force-reload}" >&2
+ echo "Usage: $N {start|stop|restart|force-reload}" >&2
+ exit 1
+ ;;
+esac
+
+exit 0
diff --git a/coin/provisioning/common/shared/testserver/danted_18.04/Dockerfile b/coin/provisioning/common/shared/testserver/danted_18.04/Dockerfile
new file mode 100644
index 00000000..ba732bff
--- /dev/null
+++ b/coin/provisioning/common/shared/testserver/danted_18.04/Dockerfile
@@ -0,0 +1,4 @@
+FROM qt_ubuntu_18.04
+ARG packages="avahi-daemon dante-server"
+RUN apt-get update && apt-get install -y $packages && dpkg -l $packages
+EXPOSE 1080-1081
diff --git a/coin/provisioning/common/shared/testserver/docker_images.sh b/coin/provisioning/common/shared/testserver/docker_images.sh
new file mode 100755
index 00000000..e4782a72
--- /dev/null
+++ b/coin/provisioning/common/shared/testserver/docker_images.sh
@@ -0,0 +1,96 @@
+#!/usr/bin/env bash
+# Copyright (C) 2019 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+set -e
+
+PROVISIONING_DIR="$(dirname "$0")/../../../"
+# shellcheck source=../../../common/unix/common.sourced.sh
+source "$PROVISIONING_DIR"/common/unix/common.sourced.sh
+# shellcheck source=../../../common/unix/DownloadURL.sh
+source "$PROVISIONING_DIR"/common/unix/DownloadURL.sh
+
+# Sort files by their SHA-1, and then return the accumulated result
+sha1tree () {
+ # For example, macOS doesn't install sha1sum by default. In such case, it uses shasum instead.
+ [ -x "$(command -v sha1sum)" ] || SHASUM=shasum
+
+ find "$@" -type f -print0 | \
+ xargs -0 "${SHASUM-sha1sum}" | cut -d ' ' -f 1 | \
+ sort | "${SHASUM-sha1sum}" | cut -d ' ' -f 1
+}
+
+
+SERVER_PATH="$PROVISIONING_DIR/common/shared/testserver"
+
+source "$SERVER_PATH/settings.sh"
+
+
+# Download all necessary dependencies outside of the dockerfiles, so that we
+# can use provisioning functionality for cached and verified downloads. In the
+# dockerfiles we just do COPY to put them where needed.
+
+echo 'Downloading support files for the docker images'
+
+DownloadURL \
+ http://ci-files01-hki.ci.qt.io/input/docker/rfc3252.txt \
+ https://tools.ietf.org/rfc/rfc3252.txt \
+ 50c323dedce95e4fdc2db35cd1b8ebf9d74711bf5296ef438b88d186d7dd082d
+cp rfc3252.txt "$SERVER_PATH/vsftpd/"
+cp rfc3252.txt "$SERVER_PATH/apache2/"
+
+DownloadURL \
+ http://ci-files01-hki.ci.qt.io/input/docker/dante-server_1.4.1-1_amd64.deb \
+ http://ppa.launchpad.net/dajhorn/dante/ubuntu/pool/main/d/dante/dante-server_1.4.1-1_amd64.deb \
+ 674a06f356cebd92c64920cec38a6687650a6f880198fbbad05aaaccca5c0a21
+mv dante-server_1.4.1-1_amd64.deb "$SERVER_PATH/danted/"
+
+DownloadURL \
+ http://ci-files01-hki.ci.qt.io/input/docker/FreeCoAP-0.7.tar.gz \
+ https://github.com/keith-cullen/FreeCoAP/archive/v0.7.tar.gz \
+ fa6602e27dc8eaee6e34ff53400c0519da0c5c7cd47bf6f13acb564f52a693ee \
+ FreeCoAP-0.7.tar.gz
+mv FreeCoAP-0.7.tar.gz "$SERVER_PATH/freecoap/"
+
+# Eclipse Californium 3.8.0, requires to apply a custom patch from
+# $SERVER_PATH/californium/ before usage
+DownloadURL \
+ http://ci-files01-hki.ci.qt.io/input/docker/californium-3.8.0.tar.gz \
+ https://github.com/eclipse-californium/californium/archive/refs/tags/3.8.0.tar.gz \
+ 24f8ca393f26c922739462e4586b8ced1ff75f99bfa795defa34a967b5a4a5a0 \
+ californium-3.8.0.tar.gz
+mv californium-3.8.0.tar.gz "$SERVER_PATH/californium/"
+
+
+echo 'Building the docker images...'
+
+# Build the 2 base layers: qt_ubuntu_1604, qt_ubuntu_1804.
+# These are the base for all other docker images.
+for image in qt_ubuntu_16.04 qt_ubuntu_18.04
+do
+ docker build -t $image \
+ --build-arg COIN_RUNS_IN_QT_COMPANY="$COIN_RUNS_IN_QT_COMPANY" \
+ "$SERVER_PATH/$image"
+done
+
+
+for server in $testserver
+do
+
+ # We label each docker image with `-t name:tag`.
+ # A tag labels a specific image version. In the docker compose file
+ # (docker-compose.yml) that launches the containers, the tag used is
+ # "latest". Here the images are additionally tagged with the SHA1 of each
+ # image directory (context), so that if needed we can modify
+ # docker-compose.yml and modify "latest" to a SHA in order to launch a
+ # very specific image, thus providing a way to stage
+ # backwards-incompatible changes across repositories.
+
+ context="$SERVER_PATH/$server"
+ tag=$(sha1tree "$context")
+ docker build -t "qt-test-server-$server:latest" \
+ -t "qt-test-server-$server:$tag" \
+ "$context"
+done
+
+docker images
diff --git a/coin/provisioning/common/shared/testserver/docker_machine.sh b/coin/provisioning/common/shared/testserver/docker_machine.sh
new file mode 100755
index 00000000..9abf0caa
--- /dev/null
+++ b/coin/provisioning/common/shared/testserver/docker_machine.sh
@@ -0,0 +1,22 @@
+#!/usr/bin/env bash
+# Copyright (C) 2019 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+set -ex
+
+TestMachine='qt-test-server'
+
+# Deploy docker virtual machine (Boot2Docker) into VirtualBox only if it doesn't exist
+if [ -z "$(docker-machine ls -q --filter "name=$TestMachine")" ]
+then
+ docker-machine create "$@" "$TestMachine"
+ docker-machine ip "$TestMachine"
+else
+ # Otherwise, start the docker machine and update with new TLS certificates.
+ docker-machine start "$TestMachine" && docker-machine regenerate-certs -f "$TestMachine"
+fi
+
+# Switch the docker engine to $TestMachine
+eval "$(docker-machine env "$TestMachine")"
+
+docker-machine ls
diff --git a/coin/provisioning/common/shared/testserver/docker_testserver.sh b/coin/provisioning/common/shared/testserver/docker_testserver.sh
new file mode 100755
index 00000000..7e743a80
--- /dev/null
+++ b/coin/provisioning/common/shared/testserver/docker_testserver.sh
@@ -0,0 +1,26 @@
+#!/usr/bin/env bash
+# Copyright (C) 2019 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+set -ex
+
+[ -x "$(command -v realpath)" ] && FILE=$(realpath "${BASH_SOURCE[0]}") || FILE="${BASH_SOURCE[0]}"
+case $FILE in
+ */*) SERVER_PATH="${FILE%/*}" ;;
+ *) SERVER_PATH="." ;;
+esac
+
+# Create docker virtual machine (Boot2docker)
+case $1 in
+ VMX) source "$SERVER_PATH/docker_machine.sh" "-d virtualbox" ;;
+ Hyper-V)
+ # The Hyper-v has been enabled in Windows 10. Disable checking the hardware virtualization.
+ source "$SERVER_PATH/docker_machine.sh" "-d virtualbox --virtualbox-no-vtx-check" ;;
+ *) ;;
+esac
+
+# Display system-wide information of docker-engine
+docker info
+
+# Create images
+"$SERVER_PATH/docker_images.sh"
diff --git a/coin/provisioning/common/shared/testserver/echo/Dockerfile b/coin/provisioning/common/shared/testserver/echo/Dockerfile
new file mode 100644
index 00000000..a20419c6
--- /dev/null
+++ b/coin/provisioning/common/shared/testserver/echo/Dockerfile
@@ -0,0 +1,4 @@
+FROM qt_ubuntu_16.04
+ARG packages="avahi-daemon xinetd"
+RUN apt-get update && apt-get install -y $packages && dpkg -l $packages
+EXPOSE 7 7/UDP 13
diff --git a/coin/provisioning/common/shared/testserver/echo_18.04/Dockerfile b/coin/provisioning/common/shared/testserver/echo_18.04/Dockerfile
new file mode 100644
index 00000000..e86357a2
--- /dev/null
+++ b/coin/provisioning/common/shared/testserver/echo_18.04/Dockerfile
@@ -0,0 +1,4 @@
+FROM qt_ubuntu_18.04
+ARG packages="avahi-daemon xinetd"
+RUN apt-get update && apt-get install -y $packages && dpkg -l $packages
+EXPOSE 7 7/UDP 13
diff --git a/coin/provisioning/common/shared/testserver/freecoap/Dockerfile b/coin/provisioning/common/shared/testserver/freecoap/Dockerfile
new file mode 100644
index 00000000..7b2a27a7
--- /dev/null
+++ b/coin/provisioning/common/shared/testserver/freecoap/Dockerfile
@@ -0,0 +1,14 @@
+FROM qt_ubuntu_18.04
+ARG packages="avahi-daemon autoconf automake libtool make libgnutls28-dev"
+RUN apt-get update && apt-get -y install $packages
+
+WORKDIR /root/src
+ADD FreeCoAP-*.tar.gz .
+RUN mv FreeCoAP-* FreeCoAP
+WORKDIR /root/src/FreeCoAP
+RUN autoreconf --install && ./configure && make && make install
+WORKDIR sample/time_server
+RUN make
+WORKDIR /
+
+EXPOSE 5685/udp
diff --git a/coin/provisioning/common/shared/testserver/ftp-proxy/Dockerfile b/coin/provisioning/common/shared/testserver/ftp-proxy/Dockerfile
new file mode 100644
index 00000000..de3e5b86
--- /dev/null
+++ b/coin/provisioning/common/shared/testserver/ftp-proxy/Dockerfile
@@ -0,0 +1,4 @@
+FROM qt_ubuntu_16.04
+ARG packages="avahi-daemon ftp-proxy"
+RUN apt-get update && apt-get install -y $packages && dpkg -l $packages
+EXPOSE 2121
diff --git a/coin/provisioning/common/shared/testserver/ftp-proxy_18.04/Dockerfile b/coin/provisioning/common/shared/testserver/ftp-proxy_18.04/Dockerfile
new file mode 100644
index 00000000..383ba140
--- /dev/null
+++ b/coin/provisioning/common/shared/testserver/ftp-proxy_18.04/Dockerfile
@@ -0,0 +1,4 @@
+FROM qt_ubuntu_18.04
+ARG packages="avahi-daemon ftp-proxy"
+RUN apt-get update && apt-get install -y $packages && dpkg -l $packages
+EXPOSE 2121
diff --git a/coin/provisioning/common/shared/testserver/iptables/Dockerfile b/coin/provisioning/common/shared/testserver/iptables/Dockerfile
new file mode 100644
index 00000000..1c2a4b4d
--- /dev/null
+++ b/coin/provisioning/common/shared/testserver/iptables/Dockerfile
@@ -0,0 +1,4 @@
+FROM qt_ubuntu_16.04
+ARG packages="avahi-daemon iptables"
+RUN apt-get update && apt-get install -y $packages && dpkg -l $packages
+EXPOSE 1357
diff --git a/coin/provisioning/common/shared/testserver/iptables_18.04/Dockerfile b/coin/provisioning/common/shared/testserver/iptables_18.04/Dockerfile
new file mode 100644
index 00000000..49b277c7
--- /dev/null
+++ b/coin/provisioning/common/shared/testserver/iptables_18.04/Dockerfile
@@ -0,0 +1,4 @@
+FROM qt_ubuntu_18.04
+ARG packages="avahi-daemon iptables"
+RUN apt-get update && apt-get install -y $packages && dpkg -l $packages
+EXPOSE 1357
diff --git a/coin/provisioning/common/shared/testserver/qt_ubuntu_16.04/Dockerfile b/coin/provisioning/common/shared/testserver/qt_ubuntu_16.04/Dockerfile
new file mode 100644
index 00000000..a9c8b9ef
--- /dev/null
+++ b/coin/provisioning/common/shared/testserver/qt_ubuntu_16.04/Dockerfile
@@ -0,0 +1,5 @@
+FROM ubuntu:16.04
+ARG COIN_RUNS_IN_QT_COMPANY
+RUN test x"$COIN_RUNS_IN_QT_COMPANY" = xtrue \
+ && sed -i 's;\(archive\|security\)\.ubuntu\.com;repo-clones.ci.qt.io/apt-mirror/mirror;' /etc/apt/sources.list \
+ || echo "Internal package repository not found. Using public repositories."
diff --git a/coin/provisioning/common/shared/testserver/qt_ubuntu_18.04/Dockerfile b/coin/provisioning/common/shared/testserver/qt_ubuntu_18.04/Dockerfile
new file mode 100644
index 00000000..f62a29c6
--- /dev/null
+++ b/coin/provisioning/common/shared/testserver/qt_ubuntu_18.04/Dockerfile
@@ -0,0 +1,5 @@
+FROM ubuntu:18.04
+ARG COIN_RUNS_IN_QT_COMPANY
+RUN test x"$COIN_RUNS_IN_QT_COMPANY" = xtrue \
+ && sed -i 's;\(archive\|security\)\.ubuntu\.com;repo-clones.ci.qt.io/apt-mirror/mirror;' /etc/apt/sources.list \
+ || echo "Internal package repository not found. Using public repositories."
diff --git a/coin/provisioning/common/shared/testserver/settings.sh b/coin/provisioning/common/shared/testserver/settings.sh
new file mode 100755
index 00000000..03276eeb
--- /dev/null
+++ b/coin/provisioning/common/shared/testserver/settings.sh
@@ -0,0 +1,9 @@
+#!/usr/bin/env bash
+# Copyright (C) 2019 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+set -ex
+
+# A list of test servers to be provisioned
+testserver='apache2 squid vsftpd ftp-proxy danted echo cyrus iptables californium freecoap'
+testserver="$testserver apache2_18.04 squid_18.04 vsftpd_18.04 ftp-proxy_18.04 danted_18.04 echo_18.04 cyrus_18.04 iptables_18.04"
diff --git a/coin/provisioning/common/shared/testserver/squid/Dockerfile b/coin/provisioning/common/shared/testserver/squid/Dockerfile
new file mode 100644
index 00000000..330d3929
--- /dev/null
+++ b/coin/provisioning/common/shared/testserver/squid/Dockerfile
@@ -0,0 +1,4 @@
+FROM qt_ubuntu_16.04
+ARG packages="avahi-daemon squid"
+RUN apt-get update && apt-get install -y $packages && dpkg -l $packages
+EXPOSE 3128-3130
diff --git a/coin/provisioning/common/shared/testserver/squid_18.04/Dockerfile b/coin/provisioning/common/shared/testserver/squid_18.04/Dockerfile
new file mode 100644
index 00000000..239ea4c8
--- /dev/null
+++ b/coin/provisioning/common/shared/testserver/squid_18.04/Dockerfile
@@ -0,0 +1,4 @@
+FROM qt_ubuntu_18.04
+ARG packages="avahi-daemon squid"
+RUN apt-get update && apt-get install -y $packages && dpkg -l $packages
+EXPOSE 3128-3130
diff --git a/coin/provisioning/common/shared/testserver/vsftpd/Dockerfile b/coin/provisioning/common/shared/testserver/vsftpd/Dockerfile
new file mode 100644
index 00000000..4c2e00e4
--- /dev/null
+++ b/coin/provisioning/common/shared/testserver/vsftpd/Dockerfile
@@ -0,0 +1,7 @@
+FROM qt_ubuntu_16.04
+ARG packages="avahi-daemon vsftpd ftp"
+RUN apt-get update && apt-get install -y $packages && dpkg -l $packages
+EXPOSE 20-21
+
+# install configurations and test data
+COPY rfc3252.txt .
diff --git a/coin/provisioning/common/shared/testserver/vsftpd_18.04/Dockerfile b/coin/provisioning/common/shared/testserver/vsftpd_18.04/Dockerfile
new file mode 100644
index 00000000..8886308c
--- /dev/null
+++ b/coin/provisioning/common/shared/testserver/vsftpd_18.04/Dockerfile
@@ -0,0 +1,4 @@
+FROM qt_ubuntu_18.04
+ARG packages="avahi-daemon vsftpd"
+RUN apt-get update && apt-get install -y $packages && dpkg -l $packages
+EXPOSE 20-21