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