#!/bin/bash # # Copyright (c) 2018, The OpenThread Authors. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # 3. Neither the name of the copyright holder nor the # names of its contributors may be used to endorse or promote products # derived from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. # set -euxo pipefail on_exit() { local status=$? killall socat || true docker stop "${OTBR_DOCKER_PID}" || true local -r CONTAINER_RET=$(docker inspect "${OTBR_DOCKER_PID}" --format='{{.State.ExitCode}}') docker rm "${OTBR_DOCKER_PID}" if [[ ${CONTAINER_RET} != "0" ]]; then echo 'Container did not shutdown properly' fi killall ot-rcp || true killall socat || true return "${status}" } main() { sudo modprobe ip6table_filter docker build -t otbr \ --build-arg OTBR_OPTIONS=-DOT_POSIX_RCP_SPI_BUS=ON \ --build-arg BACKBONE_ROUTER=0 \ -f etc/docker/Dockerfile . # SPI simulation is not available yet, so just verify the binary runs docker run --rm -t --entrypoint otbr-agent otbr -h | grep 'spi://' local -r SOCAT_OUTPUT=/tmp/ot-socat socat -d -d pty,raw,echo=0 pty,raw,echo=0 2>&1 | tee $SOCAT_OUTPUT & while true; do if test "$(head -n2 "$SOCAT_OUTPUT" | wc -l)" = 2; then local -r DEVICE_PTY=$(head -n1 $SOCAT_OUTPUT | grep -o '/dev/.\+') local -r DOCKER_PTY=$(head -n2 $SOCAT_OUTPUT | tail -n1 | grep -o '/dev/.\+') break fi echo 'Waiting for socat ready...' sleep 1 done trap on_exit EXIT # shellcheck disable=SC2094 ot-rcp 1 >"$DEVICE_PTY" <"$DEVICE_PTY" & OTBR_DOCKER_PID=$(docker run -d \ --sysctl "net.ipv6.conf.all.disable_ipv6=0 net.ipv4.conf.all.forwarding=1 net.ipv6.conf.all.forwarding=1" \ --privileged -p 8080:80 --dns=127.0.0.1 --volume "$DOCKER_PTY":/dev/ttyUSB0 otbr --backbone-interface eth0) readonly OTBR_DOCKER_PID sleep 10 sudo lsof -i :8080 local -r OTBR_WEB_URL="http://127.0.0.1:8080" local -r OT_NETWORK_KEY=00112233445566778899aabbccddeeff local -r OT_XPANID=0011223344556677 local -r OT_PANID=0xface local -r OT_AGENT_PASSPHRASE=123456 local -r OT_CHANNEL=12 local -r OT_NETWORK_NAME=OpenThreadDocker curl "${OTBR_WEB_URL}"/index.html | grep 'What is OpenThread' 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" } main "$@"