| #!/bin/bash |
| # |
| # Copyright (c) 2017, 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. |
| # |
| |
| OTBR_TOP_BUILDDIR="${BUILD_DIR}/otbr" |
| readonly OTBR_TOP_BUILDDIR |
| |
| BORDER_ROUTING="${BORDER_ROUTING:-1}" |
| readonly BORDER_ROUTING |
| |
| BACKBONE_ROUTER="${BACKBONE_ROUTER:-1}" |
| readonly BACKBONE_ROUTER |
| |
| NAT64="${NAT64:-1}" |
| readonly NAT64 |
| |
| DISCOVERY_PROXY="${DISCOVERY_PROXY:-1}" |
| readonly DISCOVERY_PROXY |
| |
| # Handle deprecated DHCPV6_PD_REF flag |
| if [[ -n ${DHCPV6_PD_REF+x} ]]; then |
| echo >&2 "WARNING: DHCPV6_PD_REF is now deprecated, please use OTBR_DHCP6_PD_CLIENT instead:" |
| echo >&2 " DHCPV6_PD_REF=1 -> OTBR_DHCP6_PD_CLIENT=dhcpcd" |
| echo >&2 " DHCPV6_PD_REF=0 -> OTBR_DHCP6_PD_CLIENT=none" |
| echo >&2 " It is also possible to use native implementation by setting OTBR_DHCP6_PD_CLIENT=openthread" |
| |
| if [[ -z ${OTBR_DHCP6_PD_CLIENT+x} ]]; then |
| if [[ ${DHCPV6_PD_REF} == "1" ]]; then |
| OTBR_DHCP6_PD_CLIENT="dhcpcd" |
| echo >&2 " Setting OTBR_DHCP6_PD_CLIENT=dhcpcd" |
| else |
| OTBR_DHCP6_PD_CLIENT="none" |
| echo >&2 " Setting OTBR_DHCP6_PD_CLIENT=none" |
| fi |
| fi |
| fi |
| |
| OTBR_DHCP6_PD_CLIENT="${OTBR_DHCP6_PD_CLIENT:-none}" |
| readonly OTBR_DHCP6_PD_CLIENT |
| |
| OTBR_MDNS="${OTBR_MDNS:-openthread}" |
| readonly OTBR_MDNS |
| |
| OTBR_OPTIONS="${OTBR_OPTIONS-}" |
| readonly OTBR_OPTIONS |
| |
| REFERENCE_DEVICE="${REFERENCE_DEVICE:-0}" |
| readonly REFERENCE_DEVICE |
| |
| if [[ ${REFERENCE_DEVICE} == "0" ]]; then |
| OTBR_VENDOR_NAME="${OTBR_VENDOR_NAME:-OpenThread}" |
| else |
| OTBR_VENDOR_NAME="${OTBR_VENDOR_NAME:-RD:OpenThread}" |
| fi |
| readonly OTBR_VENDOR_NAME |
| |
| OTBR_PRODUCT_NAME="${OTBR_PRODUCT_NAME:-BorderRouter}" |
| readonly OTBR_PRODUCT_NAME |
| |
| otbr_uninstall() |
| { |
| if have systemctl; then |
| sudo systemctl stop otbr-web || true |
| sudo systemctl stop otbr-agent || true |
| sudo systemctl disable otbr-web || true |
| sudo systemctl disable otbr-agent || true |
| ! sudo systemctl is-enabled otbr-web |
| ! sudo systemctl is-enabled otbr-agent |
| fi |
| sudo killall otbr-web otbr-agent || true |
| |
| ( |
| if cd "${OTBR_TOP_BUILDDIR}"; then |
| # shellcheck disable=SC2024 |
| sudo xargs rm <install_manifests.txt || true |
| fi |
| ) |
| if have systemctl; then |
| sudo systemctl daemon-reload |
| fi |
| } |
| |
| otbr_install() |
| { |
| local otbr_options=( |
| "-DBUILD_TESTING=OFF" |
| "-DCMAKE_INSTALL_PREFIX=/usr" |
| "-DOTBR_DBUS=ON" |
| "-DOTBR_INFRA_IF_NAME=${INFRA_IF_NAME}" |
| "-DOTBR_DHCP6_PD_CLIENT=${OTBR_DHCP6_PD_CLIENT}" |
| "-DOTBR_MDNS=${OTBR_MDNS}" |
| "-DOTBR_VENDOR_NAME=${OTBR_VENDOR_NAME}" |
| "-DOTBR_PRODUCT_NAME=${OTBR_PRODUCT_NAME}" |
| # Force re-evaluation of version strings |
| "-DOTBR_VERSION=" |
| "-DOT_PACKAGE_VERSION=" |
| ) |
| |
| # If the user provided custom options, append them |
| if [[ -n ${OTBR_OPTIONS:-} ]]; then |
| local user_options=() |
| read -r -a user_options <<<"${OTBR_OPTIONS}" |
| otbr_options+=("${user_options[@]}") |
| fi |
| |
| if without BORDER_ROUTING; then |
| otbr_options+=( |
| "-DOTBR_BORDER_ROUTING=OFF" |
| ) |
| fi |
| |
| if with WEB_GUI; then |
| otbr_options+=("-DOTBR_WEB=ON") |
| fi |
| |
| if [[ ${OTBR_DHCP6_PD_CLIENT} == "openthread" || ${OTBR_DHCP6_PD_CLIENT} == "dhcpcd" ]]; then |
| otbr_options+=( |
| "-DOTBR_DHCP6_PD=ON" |
| ) |
| fi |
| |
| if with REST_API; then |
| otbr_options+=( |
| "-DOTBR_REST=ON" |
| "-DCPPHTTPLIB_REQUEST_URI_MAX_LENGTH=2048" # see cpp-httlplib issue #1288 and related. |
| ) |
| fi |
| |
| if without BACKBONE_ROUTER; then |
| otbr_options+=( |
| "-DOTBR_BACKBONE_ROUTER=OFF" |
| ) |
| fi |
| |
| if without NAT64; then |
| otbr_options+=( |
| "-DOTBR_NAT64=OFF" |
| ) |
| fi |
| |
| # OT Discovery Proxy depends on Border Routing. Disable it if Border Routing is disabled or if explicitly disabled. |
| if without DISCOVERY_PROXY || without BORDER_ROUTING; then |
| otbr_options+=( |
| "-DOTBR_OT_DISCOVERY_PROXY=OFF" |
| ) |
| fi |
| |
| if [[ ${REFERENCE_DEVICE} == "1" ]]; then |
| otbr_options+=( |
| "-DOTBR_NO_AUTO_ATTACH=1" |
| "-DOT_REFERENCE_DEVICE=ON" |
| "-DOT_DHCP6_CLIENT=ON" |
| "-DOT_DHCP6_SERVER=ON" |
| ) |
| fi |
| |
| if with FIREWALL; then |
| otbr_options+=( |
| "-DOT_FIREWALL=ON" |
| ) |
| else |
| otbr_options+=( |
| "-DOT_FIREWALL=OFF" |
| ) |
| fi |
| |
| (./script/cmake-build "${otbr_options[@]}" \ |
| && cd "${OTBR_TOP_BUILDDIR}" \ |
| && ninja \ |
| && sudo ninja install) |
| |
| if have systemctl; then |
| sudo systemctl reload dbus |
| sudo systemctl daemon-reload |
| without WEB_GUI || sudo systemctl enable otbr-web || true |
| sudo systemctl enable otbr-agent || true |
| sudo systemctl is-enabled otbr-agent || die 'Failed to enable otbr-agent!' |
| without WEB_GUI || sudo systemctl is-enabled otbr-web || die 'Failed to enable otbr-web!' |
| |
| if [[ ${REFERENCE_DEVICE} == "1" ]]; then |
| sudo systemctl enable testharness-discovery || true |
| sudo systemctl is-enabled testharness-discovery || die 'Failed to enable otbr-agent!' |
| fi |
| else |
| echo >&2 ' *** WARNING: systemctl not found. otbr cannot start on boot.' |
| fi |
| } |
| |
| otbr_update() |
| { |
| otbr_install |
| } |