From a660ec490e8934b36f54822ae762f71ece4ca9a7 Mon Sep 17 00:00:00 2001 From: Joseph Henry Date: Tue, 17 Nov 2015 02:28:23 -0800 Subject: [PATCH] Started work on automated unit test scripts --- docker-test/httpd_demo/Dockerfile | 20 +++---- docker-test/httpd_demo/build.sh | 18 ++++++ docker-test/httpd_demo/entrypoint.sh | 2 + docker-test/httpd_demo/test.sh | 2 + .../redis-3.0.4-1.fc23.x86_64/Dockerfile | 40 +++++++++++++ .../redis-3.0.4-1.fc23.x86_64/build.sh | 18 ++++++ .../redis-3.0.4-1.fc23.x86_64/entrypoint.sh | 14 +++++ .../generate_file.sh | 1 + docker-test/test.sh | 2 + .../throughput_httpd_2.4.6/entrypoint.sh | 2 + docker-test/throughput_httpd_2.4.6/intercept | 54 ++++++++++++++++++ docker-test/throughput_httpd_2.4.6/test.sh | 2 + netcon/README.md | 2 +- netcon/libintercept.so.1.0 | Bin 65976 -> 0 bytes 14 files changed, 165 insertions(+), 12 deletions(-) create mode 100755 docker-test/httpd_demo/build.sh create mode 100755 docker-test/httpd_demo/test.sh create mode 100644 docker-test/redis-3.0.4-1.fc23.x86_64/Dockerfile create mode 100755 docker-test/redis-3.0.4-1.fc23.x86_64/build.sh create mode 100644 docker-test/redis-3.0.4-1.fc23.x86_64/entrypoint.sh create mode 100644 docker-test/redis-3.0.4-1.fc23.x86_64/generate_file.sh create mode 100755 docker-test/test.sh create mode 100755 docker-test/throughput_httpd_2.4.6/intercept create mode 100755 docker-test/throughput_httpd_2.4.6/test.sh delete mode 100755 netcon/libintercept.so.1.0 diff --git a/docker-test/httpd_demo/Dockerfile b/docker-test/httpd_demo/Dockerfile index a5de2140e..6e1e5a785 100644 --- a/docker-test/httpd_demo/Dockerfile +++ b/docker-test/httpd_demo/Dockerfile @@ -1,6 +1,5 @@ # A basic harnessed application example using ZeroTier-One and user-space IP stack -FROM fedora:20 - +FROM fedora:23 MAINTAINER https://www.zerotier.com/ # Install Apache @@ -8,32 +7,31 @@ RUN yum -y update && yum clean all RUN yum -y install httpd && yum clean all # Add files -ADD zerotier-one / -ADD zerotier-cli / -ADD intercept / -ADD lib/libintercept.so.1.0 / -ADD lib/liblwip.so / ADD htdocs/index.html / ADD htdocs/ZeroTierIcon.png / -RUN cp libintercept.so.1.0 lib/libintercept.so.1.0 -RUN cp liblwip.so lib/liblwip.so + # Install sys-call intercept library +ADD zerotier-one / +ADD zerotier-cli / +ADD intercept / +ADD libintercept.so.1.0 / +ADD liblwip.so / +RUN cp liblwip.so lib/liblwip.so RUN cp libintercept.so.1.0 /lib/libintercept.so.1.0 RUN ln -sf /lib/libintercept.so.1.0 /lib/libintercept RUN /usr/bin/install -c intercept /usr/bin + RUN echo "Apache" >> /var/www/html/index.html EXPOSE 9993/udp - RUN mv index.html /var/www/html/index.html RUN mv ZeroTierIcon.png /var/www/html/ZeroTierIcon.png # Start ZeroTier-One RUN mkdir -p /var/lib/zerotier-one/networks.d RUN touch /var/lib/zerotier-one/networks.d/8056c2e21c000001.conf - ADD entrypoint.sh /entrypoint.sh RUN chmod -v +x /entrypoint.sh CMD ["./entrypoint.sh"] diff --git a/docker-test/httpd_demo/build.sh b/docker-test/httpd_demo/build.sh new file mode 100755 index 000000000..a651fc1c0 --- /dev/null +++ b/docker-test/httpd_demo/build.sh @@ -0,0 +1,18 @@ +cd ../../ +make clean +make +cd netcon +make -f make-intercept.mk lib +rm *.o +rm liblwip.so +make -f make-liblwip.mk + +cd ../docker-test/httpd_demo + +cp ../../zerotier-one zerotier-one +cp ../../zerotier-cli zerotier-cli + +cp ../../netcon/liblwip.so liblwip.so +cp ../../netcon/libintercept.so.1.0 libintercept.so.1.0 +cp ../../netcon/intercept intercept + diff --git a/docker-test/httpd_demo/entrypoint.sh b/docker-test/httpd_demo/entrypoint.sh index 3e8845b4e..6cb6e1990 100644 --- a/docker-test/httpd_demo/entrypoint.sh +++ b/docker-test/httpd_demo/entrypoint.sh @@ -2,6 +2,8 @@ export PATH=/bin:/usr/bin:/usr/local/bin:/sbin:/usr/sbin:/ +touch /opt/results/results.txt + echo '***' echo '*** ZeroTier Network Containers Preview' echo '*** https://www.zerotier.com/' diff --git a/docker-test/httpd_demo/test.sh b/docker-test/httpd_demo/test.sh new file mode 100755 index 000000000..ad78f9b13 --- /dev/null +++ b/docker-test/httpd_demo/test.sh @@ -0,0 +1,2 @@ +docker build --tag="throughput_httpd_2.4.6" . +docker run -it -v $PWD/../_results:/opt/results --device=/dev/net/tun throughput_httpd_2.4.6:latest diff --git a/docker-test/redis-3.0.4-1.fc23.x86_64/Dockerfile b/docker-test/redis-3.0.4-1.fc23.x86_64/Dockerfile new file mode 100644 index 000000000..77a1a26a0 --- /dev/null +++ b/docker-test/redis-3.0.4-1.fc23.x86_64/Dockerfile @@ -0,0 +1,40 @@ +# ZT Netcon Throughput test +FROM fedora:23 +MAINTAINER https://www.zerotier.com/ + +# Install apps +RUN yum -y update +RUN yum -y install httpd-2.4.17-3.fc23 +RUN yum -y install nano +RUN yum -y install strace +RUN yum clean all + +EXPOSE 9993/udp 9992/udp 9991/udp 9990/udp + +# Install sys-call intercept library +ADD intercept / +ADD libintercept.so.1.0 / +RUN cp libintercept.so.1.0 lib/libintercept.so.1.0 +RUN cp libintercept.so.1.0 /lib/libintercept.so.1.0 +RUN ln -sf /lib/libintercept.so.1.0 /lib/libintercept +RUN /usr/bin/install -c intercept /usr/bin + +# Add ZT files +RUN mkdir -p /var/lib/zerotier-one/networks.d +RUN touch /var/lib/zerotier-one/networks.d/e5cd7a9e1c5311ab.conf +ADD zerotier-one / +ADD zerotier-cli / + +# Install test-setup scripts +ADD generate_file.sh /generate_file.sh +RUN chmod -v +x /generate_file.sh +ADD entrypoint.sh /entrypoint.sh +RUN chmod -v +x /entrypoint.sh + +# Install LWIP library used by service +ADD liblwip.so / +RUN mkdir -p ext/bin/lwip +RUN cp liblwip.so ext/bin/lwip/liblwip.so + +# Start ZeroTier-One +CMD ["./entrypoint.sh"] diff --git a/docker-test/redis-3.0.4-1.fc23.x86_64/build.sh b/docker-test/redis-3.0.4-1.fc23.x86_64/build.sh new file mode 100755 index 000000000..d1c8b5c67 --- /dev/null +++ b/docker-test/redis-3.0.4-1.fc23.x86_64/build.sh @@ -0,0 +1,18 @@ +cd ../../ +make clean +make +cd netcon +make -f make-intercept.mk lib +rm *.o +rm liblwip.so +make -f make-liblwip.mk + +cd ../docker-test/redis-3.0.4-1.fc23.x86_64 + +cp ../../zerotier-one zerotier-one +cp ../../zerotier-cli zerotier-cli + +cp ../../netcon/liblwip.so liblwip.so +cp ../../netcon/libintercept.so.1.0 libintercept.so.1.0 +cp ../../netcon/intercept intercept + diff --git a/docker-test/redis-3.0.4-1.fc23.x86_64/entrypoint.sh b/docker-test/redis-3.0.4-1.fc23.x86_64/entrypoint.sh new file mode 100644 index 000000000..00fdd2be6 --- /dev/null +++ b/docker-test/redis-3.0.4-1.fc23.x86_64/entrypoint.sh @@ -0,0 +1,14 @@ +#!/bin/bash + +export PATH=/bin:/usr/bin:/usr/local/bin:/sbin:/usr/sbin:/ + +echo '***' +echo '*** ZeroTier Network Containers Test Image' +echo '*** https://www.zerotier.com/' +echo '***' + +./zerotier-one & +./zerotier-cli join e5cd7a9e1c5311ab +./zerotier-cli listnetworks + + diff --git a/docker-test/redis-3.0.4-1.fc23.x86_64/generate_file.sh b/docker-test/redis-3.0.4-1.fc23.x86_64/generate_file.sh new file mode 100644 index 000000000..ac5b24338 --- /dev/null +++ b/docker-test/redis-3.0.4-1.fc23.x86_64/generate_file.sh @@ -0,0 +1 @@ +dd if=/dev/urandom of=/var/www/html/big bs=100M count=1 diff --git a/docker-test/test.sh b/docker-test/test.sh new file mode 100755 index 000000000..aa081860b --- /dev/null +++ b/docker-test/test.sh @@ -0,0 +1,2 @@ +/httpd_demo/test.sh +/throughput_httpd.2.4.6/test.sh diff --git a/docker-test/throughput_httpd_2.4.6/entrypoint.sh b/docker-test/throughput_httpd_2.4.6/entrypoint.sh index 00fdd2be6..27f28717b 100644 --- a/docker-test/throughput_httpd_2.4.6/entrypoint.sh +++ b/docker-test/throughput_httpd_2.4.6/entrypoint.sh @@ -1,5 +1,7 @@ #!/bin/bash +touch /opt/results/results.txt + export PATH=/bin:/usr/bin:/usr/local/bin:/sbin:/usr/sbin:/ echo '***' diff --git a/docker-test/throughput_httpd_2.4.6/intercept b/docker-test/throughput_httpd_2.4.6/intercept new file mode 100755 index 000000000..3eb27ff7b --- /dev/null +++ b/docker-test/throughput_httpd_2.4.6/intercept @@ -0,0 +1,54 @@ +#!/bin/sh +# usage: +# /usr/bin/intercept program + +if [ $# = 0 ] ; then + echo "$0: insufficient arguments" + exit +fi + +case "$1" in + on) + if [ -z "$LD_PRELOAD" ] + then + export LD_PRELOAD="/lib/libintercept.so.1.0" + else + echo $LD_PRELOAD | grep -q "/lib/libintercept\.so.1.0" || \ + export LD_PRELOAD="/lib/libintercept.so $LD_PRELOAD" + fi + ;; + off) + export LD_PRELOAD=`echo -n $LD_PRELOAD | sed 's/\/lib\/libintercept.so.1.0 \?//'` + if [ -z "$LD_PRELOAD" ] + then + unset LD_PRELOAD + fi + ;; + show|sh) + echo "LD_PRELOAD=\"$LD_PRELOAD\"" + ;; + -h|-?) + echo "" + ;; + *) + if [ -z "$LD_PRELOAD" ] + then + export LD_PRELOAD="/lib/libintercept.so.1.0" + else + echo $LD_PRELOAD | grep -q "/lib/libintercept\.so.1.0" || \ + export LD_PRELOAD="/lib/libintercept.so.1.0 $LD_PRELOAD" + fi + + if [ $# = 0 ] + then + ${SHELL:-/bin/sh} + fi + + if [ $# -gt 0 ] + then + exec "$@" + fi + ;; +esac + +#EOF diff --git a/docker-test/throughput_httpd_2.4.6/test.sh b/docker-test/throughput_httpd_2.4.6/test.sh new file mode 100755 index 000000000..ad78f9b13 --- /dev/null +++ b/docker-test/throughput_httpd_2.4.6/test.sh @@ -0,0 +1,2 @@ +docker build --tag="throughput_httpd_2.4.6" . +docker run -it -v $PWD/../_results:/opt/results --device=/dev/net/tun throughput_httpd_2.4.6:latest diff --git a/netcon/README.md b/netcon/README.md index 2bdca7303..700120fc4 100644 --- a/netcon/README.md +++ b/netcon/README.md @@ -100,7 +100,7 @@ Network Containers have been tested with the following: curl [ WORKS as of 20151021] apache (debug mode) [ WORKS as of 20150810] apache (prefork MPM) [ WORKS as of 20151112] (2.4.6-31.x86-64 on Centos 7), (2.4.16-1.x84-64 on F22), (2.4.17-3.x86-64 on F22) - nginx [ WORKS as of 20151022] + nginx [BROKEN as of 20151022] 1.8.0-3 and 1.8.0-4 both suffer from lost intercept connections nodejs [ WORKS as of 20151021] java [ WORKS as of 20151010] tomcat [ WORKS as of 2015xxxx] diff --git a/netcon/libintercept.so.1.0 b/netcon/libintercept.so.1.0 deleted file mode 100755 index 163b1ac2eb6dc97d2d8db93f2c6ffb6cbb9b2b7f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65976 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 HQ2`+VQ|eX;