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 32on_exit() 33{ 34 local status=$? 35 36 killall socat || true 37 38 docker stop "${OTBR_DOCKER_PID}" || true 39 local -r CONTAINER_RET=$(docker inspect "${OTBR_DOCKER_PID}" --format='{{.State.ExitCode}}') 40 docker rm "${OTBR_DOCKER_PID}" 41 42 if [[ ${CONTAINER_RET} != "0" ]]; then 43 echo 'Container did not shutdown properly' 44 fi 45 46 killall ot-rcp || true 47 killall socat || true 48 49 return "${status}" 50} 51 52main() 53{ 54 sudo modprobe ip6table_filter 55 docker build -t otbr \ 56 --build-arg OTBR_OPTIONS=-DOT_POSIX_RCP_SPI_BUS=ON \ 57 --build-arg BACKBONE_ROUTER=0 \ 58 -f etc/docker/Dockerfile . 59 60 # SPI simulation is not available yet, so just verify the binary runs 61 docker run --rm -t --entrypoint otbr-agent otbr -h | grep 'spi://' 62 63 local -r SOCAT_OUTPUT=/tmp/ot-socat 64 socat -d -d pty,raw,echo=0 pty,raw,echo=0 2>&1 | tee $SOCAT_OUTPUT & 65 while true; do 66 if test "$(head -n2 "$SOCAT_OUTPUT" | wc -l)" = 2; then 67 local -r DEVICE_PTY=$(head -n1 $SOCAT_OUTPUT | grep -o '/dev/.\+') 68 local -r DOCKER_PTY=$(head -n2 $SOCAT_OUTPUT | tail -n1 | grep -o '/dev/.\+') 69 break 70 fi 71 echo 'Waiting for socat ready...' 72 sleep 1 73 done 74 75 trap on_exit EXIT 76 77 # shellcheck disable=SC2094 78 ot-rcp 1 >"$DEVICE_PTY" <"$DEVICE_PTY" & 79 80 OTBR_DOCKER_PID=$(docker run -d \ 81 --sysctl "net.ipv6.conf.all.disable_ipv6=0 net.ipv4.conf.all.forwarding=1 net.ipv6.conf.all.forwarding=1" \ 82 --privileged -p 8080:80 --dns=127.0.0.1 --volume "$DOCKER_PTY":/dev/ttyUSB0 otbr --backbone-interface eth0) 83 readonly OTBR_DOCKER_PID 84 sleep 10 85 sudo lsof -i :8080 86 87 local -r OTBR_WEB_URL="http://127.0.0.1:8080" 88 local -r OT_NETWORK_KEY=00112233445566778899aabbccddeeff 89 local -r OT_XPANID=0011223344556677 90 local -r OT_PANID=0xface 91 local -r OT_AGENT_PASSPHRASE=123456 92 local -r OT_CHANNEL=12 93 local -r OT_NETWORK_NAME=OpenThreadDocker 94 95 curl "${OTBR_WEB_URL}"/index.html | grep 'What is OpenThread' 96 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" 97} 98 99main "$@" 100