aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/test/host
diff options
context:
space:
mode:
Diffstat (limited to 'test/host')
-rwxr-xr-xtest/host/test.sh147
1 files changed, 147 insertions, 0 deletions
diff --git a/test/host/test.sh b/test/host/test.sh
new file mode 100755
index 0000000..25d5a87
--- /dev/null
+++ b/test/host/test.sh
@@ -0,0 +1,147 @@
+#!/usr/bin/env bash
+
+set -o errexit -o nounset -o pipefail
+shopt -s inherit_errexit lastpipe
+
+script_dir="$( dirname -- "${BASH_SOURCE[0]}" )"
+script_dir="$( cd -- "$script_dir" && pwd )"
+readonly script_dir
+
+base_dir="$( mktemp -d )"
+readonly base_dir
+
+readonly subnet_base=192.168.166
+ip_counter=1
+port_counter=561
+
+add_device() {
+ local name
+ for name; do
+ local dir
+ dir="$base_dir/devices/$name"
+ mkdir -p -- "$dir"
+
+ local ip
+ ip="$subnet_base.$ip_counter"
+ ip_counter=$((ip_counter + 1))
+ echo "$ip" > "$dir/ip"
+
+ local port
+ port="$port_counter"
+ port_counter=$((port_counter + 1))
+ echo "$port" > "$dir/port"
+
+ wg genkey | tee "$dir/private" | wg pubkey > "$dir/public"
+ ip link add dev "$name" type wireguard
+ ip addr add "$ip/24" dev "$name"
+ wg set "$name" private-key "$dir/private"
+ wg set "$name" listen-port "$port"
+ done
+}
+
+connect_devices() {
+ if [ "$#" -ne 2 ]; then
+ echo "usage: ${FUNCNAME[0]} DEV1 DEV2" >&2
+ return 1
+ fi
+
+ local dev1="$1"
+ local dev2="$2"
+
+ local dev1_dir
+ dev1_dir="$base_dir/devices/$dev1"
+ local dev2_dir
+ dev2_dir="$base_dir/devices/$dev2"
+
+ local pubkey1
+ pubkey1="$( cat -- "$dev1_dir/public" )"
+ local port
+ port="$( cat -- "$dev1_dir/port" )"
+ local pubkey2
+ pubkey2="$( cat -- "$dev2_dir/public" )"
+ local ip
+ ip="$( cat -- "$dev2_dir/ip" )"
+
+ wg set "$dev1" peer "$pubkey2" allowed-ips "$ip/32"
+ wg set "$dev2" peer "$pubkey1" allowed-ips "$subnet_base.0/24" endpoint "127.0.0.1:$port" persistent-keepalive 25
+}
+
+up_device() {
+ local name
+ for name; do
+ ip link set "$name" up
+ done
+}
+
+show_device() {
+ local name
+ for name; do
+ echo ------------------------------------------------------------------
+ echo "Device: $name"
+ echo ------------------------------------------------------------------
+ wg show "$name"
+ echo
+ done
+}
+
+add_devices() {
+ add_device server
+ add_device client1
+ add_device client2
+ add_device client3
+ connect_devices server client1
+ connect_devices server client2
+ connect_devices server client3
+ up_device server client1 client2 client3
+ sleep 2
+ show_device server client1 client2 client3
+}
+
+build_services() {
+ echo ------------------------------------------------------------------
+ echo Pull third-party images
+ echo ------------------------------------------------------------------
+ docker-compose pull api
+
+ echo ------------------------------------------------------------------
+ echo Build wg-api-web
+ echo ------------------------------------------------------------------
+ docker-compose build --force-rm --progress plain --pull web
+
+ echo ------------------------------------------------------------------
+ echo docker-compose up
+ echo ------------------------------------------------------------------
+ WG_IFACE=server docker-compose up -d
+}
+
+cleanup() {
+ echo ------------------------------------------------------------------
+ echo Cleaning up
+ echo ------------------------------------------------------------------
+
+ if [ -d "$base_dir/devices" ]; then
+ local name
+ find "$base_dir/devices" -mindepth 1 -maxdepth 1 -type d -printf '%P\0' \
+ | while IFS= read -d '' -r name; do
+ echo "Removing device: $name"
+ ip link delete "$name" type wireguard || true
+ done
+ fi
+
+ echo "Removing $base_dir"
+ rm -rf -- "$base_dir"
+
+ echo "Brining down containers..."
+ docker-compose down -v --remove-orphans
+}
+
+main() {
+ cd -- "$script_dir/.."
+ trap cleanup EXIT
+
+ add_devices
+ build_services
+ "$script_dir/../check_api.sh"
+}
+
+main "$@"