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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 z 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