1#!/bin/bash 2# 3# Copyright (c) 2018, The OpenThread Authors. 4# All rights reserved. 5# 6# Redistribution and use in source and binary forms, with or without 7# modification, are permitted provided that the following conditions are met: 8# 1. Redistributions of source code must retain the above copyright 9# notice, this list of conditions and the following disclaimer. 10# 2. Redistributions in binary form must reproduce the above copyright 11# notice, this list of conditions and the following disclaimer in the 12# documentation and/or other materials provided with the distribution. 13# 3. Neither the name of the copyright holder nor the 14# names of its contributors may be used to endorse or promote products 15# derived from this software without specific prior written permission. 16# 17# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 18# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 21# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 22# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 23# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 24# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 25# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 26# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 27# POSSIBILITY OF SUCH DAMAGE. 28# 29 30set -euxo pipefail 31 32readonly OT_POSIX_CONFIG_RCP_BUS=${OT_POSIX_CONFIG_RCP_BUS:-UART} 33 34on_exit() 35{ 36 local status=$? 37 38 killall socat || true 39 docker stop "${OTBR_DOCKER_PID}" || true 40 killall ot-rcp || true 41 killall socat || true 42 43 return "${status}" 44} 45 46main() 47{ 48 sudo modprobe ip6table_filter 49 docker build -t otbr \ 50 --build-arg OTBR_OPTIONS=-DOT_POSIX_CONFIG_RCP_BUS="${OT_POSIX_CONFIG_RCP_BUS}" \ 51 --build-arg BACKBONE_ROUTER=0 \ 52 -f etc/docker/Dockerfile . 53 54 # SPI simulation is not available yet, so just verify the binary runs 55 if [[ ${OT_POSIX_CONFIG_RCP_BUS} == SPI ]]; then 56 docker run --rm -t --entrypoint otbr-agent otbr -h | grep 'spi://' 57 return 0 58 fi 59 60 local -r SOCAT_OUTPUT=/tmp/ot-socat 61 socat -d -d pty,raw,echo=0 pty,raw,echo=0 2>&1 | tee $SOCAT_OUTPUT & 62 while true; do 63 if test "$(head -n2 "$SOCAT_OUTPUT" | wc -l)" = 2; then 64 local -r DEVICE_PTY=$(head -n1 $SOCAT_OUTPUT | grep -o '/dev/.\+') 65 local -r DOCKER_PTY=$(head -n2 $SOCAT_OUTPUT | tail -n1 | grep -o '/dev/.\+') 66 break 67 fi 68 echo 'Waiting for socat ready...' 69 sleep 1 70 done 71 72 trap on_exit EXIT 73 74 # shellcheck disable=SC2094 75 ot-rcp 1 >"$DEVICE_PTY" <"$DEVICE_PTY" & 76 77 readonly OTBR_DOCKER_PID=$(docker run --rm -d \ 78 --sysctl "net.ipv6.conf.all.disable_ipv6=0 net.ipv4.conf.all.forwarding=1 net.ipv6.conf.all.forwarding=1" \ 79 --privileged -p 8080:80 --dns=127.0.0.1 --volume "$DOCKER_PTY":/dev/ttyUSB0 otbr --backbone-interface eth0) 80 sleep 10 81 sudo lsof -i :8080 82 83 local -r OTBR_WEB_URL="http://127.0.0.1:8080" 84 local -r OT_NETWORK_KEY=00112233445566778899aabbccddeeff 85 local -r OT_XPANID=0011223344556677 86 local -r OT_PANID=0xface 87 local -r OT_AGENT_PASSPHRASE=123456 88 local -r OT_CHANNEL=12 89 local -r OT_NETWORK_NAME=OpenThreadDocker 90 91 curl "${OTBR_WEB_URL}"/index.html | grep 'What is OpenThread' 92 curl --header "Content-Type: application/json" --request POST --data "{\"networkKey\":\"${OT_NETWORK_KEY}\",\"prefix\":\"fd11:22::\",\"defaultRoute\":true,\"extPanId\":\"${OT_XPANID}\",\"panId\":\"${OT_PANID}\",\"passphrase\":\"${OT_AGENT_PASSPHRASE}\",\"channel\":${OT_CHANNEL},\"networkName\":\"${OT_NETWORK_NAME}\"}" "${OTBR_WEB_URL}"/form_network | grep "success" 93} 94 95main "$@" 96