xref: /aosp_15_r20/external/ot-br-posix/script/_dns64 (revision 4a64e381480ef79f0532b2421e44e6ee336b8e0d)
1*4a64e381SAndroid Build Coastguard Worker#!/bin/bash
2*4a64e381SAndroid Build Coastguard Worker#
3*4a64e381SAndroid Build Coastguard Worker#  Copyright (c) 2017, 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#   Description:
30*4a64e381SAndroid Build Coastguard Worker#       This script manipulates dns64 configuration.
31*4a64e381SAndroid Build Coastguard Worker#
32*4a64e381SAndroid Build Coastguard Worker
33*4a64e381SAndroid Build Coastguard WorkerBIND_CONF_OPTIONS=/etc/bind/named.conf.options
34*4a64e381SAndroid Build Coastguard WorkerNAT64_PREFIX=64:ff9b::/96
35*4a64e381SAndroid Build Coastguard Worker
36*4a64e381SAndroid Build Coastguard WorkerDNS64_NAMESERVER_ADDR=127.0.0.1
37*4a64e381SAndroid Build Coastguard WorkerDNS64_CONF="dns64 $(echo $NAT64_PREFIX | tr \"/\" \"/\") { clients { thread; }; recursive-only yes; };"
38*4a64e381SAndroid Build Coastguard Worker
39*4a64e381SAndroid Build Coastguard Worker# Currently solution was verified only on raspbian and ubuntu.
40*4a64e381SAndroid Build Coastguard Worker#
41*4a64e381SAndroid Build Coastguard Workerwithout NAT64 || without DNS64 || test "$PLATFORM" = ubuntu || test "$PLATFORM" = beagleboneblack || test "$PLATFORM" = raspbian || die "dns64 is not tested under $PLATFORM."
42*4a64e381SAndroid Build Coastguard Worker
43*4a64e381SAndroid Build Coastguard Workerif [ "$PLATFORM" = raspbian ]; then
44*4a64e381SAndroid Build Coastguard Worker    RESOLV_CONF_HEAD=/etc/resolv.conf.head
45*4a64e381SAndroid Build Coastguard Workerelif [ "$PLATFORM" = beagleboneblack ]; then
46*4a64e381SAndroid Build Coastguard Worker    RESOLV_CONF_HEAD=/etc/resolvconf/resolv.conf.d/head
47*4a64e381SAndroid Build Coastguard Workerelif [ "$PLATFORM" = ubuntu ]; then
48*4a64e381SAndroid Build Coastguard Worker    RESOLV_CONF_HEAD=/etc/resolvconf/resolv.conf.d/head
49*4a64e381SAndroid Build Coastguard Workerfi
50*4a64e381SAndroid Build Coastguard Worker
51*4a64e381SAndroid Build Coastguard Workerdns64_update_resolvconf()
52*4a64e381SAndroid Build Coastguard Worker{
53*4a64e381SAndroid Build Coastguard Worker    if [ "$PLATFORM" = ubuntu ]; then
54*4a64e381SAndroid Build Coastguard Worker        sudo resolvconf -u || true
55*4a64e381SAndroid Build Coastguard Worker    elif [ "$PLATFORM" = beagleboneblack ]; then
56*4a64e381SAndroid Build Coastguard Worker        sudo resolvconf -u || true
57*4a64e381SAndroid Build Coastguard Worker    elif [ "$PLATFORM" = raspbian ]; then
58*4a64e381SAndroid Build Coastguard Worker        if systemctl is-enabled NetworkManager; then
59*4a64e381SAndroid Build Coastguard Worker            sudo systemctl restart NetworkManager || true
60*4a64e381SAndroid Build Coastguard Worker        fi
61*4a64e381SAndroid Build Coastguard Worker
62*4a64e381SAndroid Build Coastguard Worker        if systemctl is-enabled dhcpcd; then
63*4a64e381SAndroid Build Coastguard Worker            sudo systemctl restart dhcpcd || true
64*4a64e381SAndroid Build Coastguard Worker        fi
65*4a64e381SAndroid Build Coastguard Worker    fi
66*4a64e381SAndroid Build Coastguard Worker}
67*4a64e381SAndroid Build Coastguard Worker
68*4a64e381SAndroid Build Coastguard Worker_detect_service_name()
69*4a64e381SAndroid Build Coastguard Worker{
70*4a64e381SAndroid Build Coastguard Worker    dpkg -L bind9 | grep /etc/init.d/ | cut -d/ -f4
71*4a64e381SAndroid Build Coastguard Worker}
72*4a64e381SAndroid Build Coastguard Worker
73*4a64e381SAndroid Build Coastguard Workerdns64_install()
74*4a64e381SAndroid Build Coastguard Worker{
75*4a64e381SAndroid Build Coastguard Worker    with NAT64 && with DNS64 || return 0
76*4a64e381SAndroid Build Coastguard Worker
77*4a64e381SAndroid Build Coastguard Worker    test -f $BIND_CONF_OPTIONS || die 'Cannot find bind9 configuration file!'
78*4a64e381SAndroid Build Coastguard Worker    sudo sed -i '/^};/i\\tlisten-on-v6 { thread; };' $BIND_CONF_OPTIONS
79*4a64e381SAndroid Build Coastguard Worker    sudo sed -i '/^\tlisten-on-v6 { a/d' $BIND_CONF_OPTIONS
80*4a64e381SAndroid Build Coastguard Worker    sudo sed -i '/^};/i\\tallow-query { any; };' $BIND_CONF_OPTIONS
81*4a64e381SAndroid Build Coastguard Worker    sudo sed -i '/^};/i\\tallow-recursion { thread; };' $BIND_CONF_OPTIONS
82*4a64e381SAndroid Build Coastguard Worker    sudo sed -i '/^};/i\\tforwarders { 8.8.8.8; 8.8.8.4; };' $BIND_CONF_OPTIONS
83*4a64e381SAndroid Build Coastguard Worker    sudo sed -i '/^};/i\\tforward only;' $BIND_CONF_OPTIONS
84*4a64e381SAndroid Build Coastguard Worker    sudo sed -i '/^};/i\\t'"$DNS64_CONF" $BIND_CONF_OPTIONS
85*4a64e381SAndroid Build Coastguard Worker    sudo sed -i '1s/^/acl thread {\n\tfe80::\/16;\n\tfc00::\/7;\n\t127.0.0.1;\n};\n\n/' $BIND_CONF_OPTIONS
86*4a64e381SAndroid Build Coastguard Worker
87*4a64e381SAndroid Build Coastguard Worker    service_name="$(_detect_service_name)"
88*4a64e381SAndroid Build Coastguard Worker
89*4a64e381SAndroid Build Coastguard Worker    if without DOCKER; then
90*4a64e381SAndroid Build Coastguard Worker        sudo sh -c "echo \"nameserver $DNS64_NAMESERVER_ADDR\" >> $RESOLV_CONF_HEAD"
91*4a64e381SAndroid Build Coastguard Worker    fi
92*4a64e381SAndroid Build Coastguard Worker
93*4a64e381SAndroid Build Coastguard Worker    if have systemctl; then
94*4a64e381SAndroid Build Coastguard Worker        sudo systemctl stop dnsmasq || true
95*4a64e381SAndroid Build Coastguard Worker        sudo systemctl disable dnsmasq || true
96*4a64e381SAndroid Build Coastguard Worker        sudo systemctl enable "${service_name}" || true
97*4a64e381SAndroid Build Coastguard Worker        sudo systemctl is-enabled "${service_name}" || die 'Failed to enable bind9!'
98*4a64e381SAndroid Build Coastguard Worker        sudo systemctl start "${service_name}" || die 'Failed to start bind9!'
99*4a64e381SAndroid Build Coastguard Worker    fi
100*4a64e381SAndroid Build Coastguard Worker
101*4a64e381SAndroid Build Coastguard Worker    if without DOCKER; then
102*4a64e381SAndroid Build Coastguard Worker        dns64_update_resolvconf
103*4a64e381SAndroid Build Coastguard Worker    fi
104*4a64e381SAndroid Build Coastguard Worker}
105*4a64e381SAndroid Build Coastguard Worker
106*4a64e381SAndroid Build Coastguard Workerdns64_uninstall()
107*4a64e381SAndroid Build Coastguard Worker{
108*4a64e381SAndroid Build Coastguard Worker    with NAT64 && with DNS64 || return 0
109*4a64e381SAndroid Build Coastguard Worker
110*4a64e381SAndroid Build Coastguard Worker    service_name="$(_detect_service_name)"
111*4a64e381SAndroid Build Coastguard Worker
112*4a64e381SAndroid Build Coastguard Worker    dns64_stop
113*4a64e381SAndroid Build Coastguard Worker    sudo sed -i '/^\tlisten-on-v6/d' $BIND_CONF_OPTIONS
114*4a64e381SAndroid Build Coastguard Worker    sudo sed -i '/^\tallow-query/d' $BIND_CONF_OPTIONS
115*4a64e381SAndroid Build Coastguard Worker    sudo sed -i '/^\tallow-recursion/d' $BIND_CONF_OPTIONS
116*4a64e381SAndroid Build Coastguard Worker    sudo sed -i '/^\tforward/d' $BIND_CONF_OPTIONS
117*4a64e381SAndroid Build Coastguard Worker    sudo sed -i '/^};/i\\tlisten-on-v6 { any; };' $BIND_CONF_OPTIONS
118*4a64e381SAndroid Build Coastguard Worker    sudo sed -i '/^\tdns64/d' $BIND_CONF_OPTIONS
119*4a64e381SAndroid Build Coastguard Worker    sudo sed -i '/^acl/,/^options/{/^options/!d}' $BIND_CONF_OPTIONS
120*4a64e381SAndroid Build Coastguard Worker
121*4a64e381SAndroid Build Coastguard Worker    sudo sed -i '/^nameserver '$DNS64_NAMESERVER_ADDR'/d' $RESOLV_CONF_HEAD || true
122*4a64e381SAndroid Build Coastguard Worker
123*4a64e381SAndroid Build Coastguard Worker    if without DOCKER; then
124*4a64e381SAndroid Build Coastguard Worker        dns64_update_resolvconf
125*4a64e381SAndroid Build Coastguard Worker    fi
126*4a64e381SAndroid Build Coastguard Worker
127*4a64e381SAndroid Build Coastguard Worker    if have systemctl; then
128*4a64e381SAndroid Build Coastguard Worker        sudo systemctl stop "${service_name}" || true
129*4a64e381SAndroid Build Coastguard Worker        sudo systemctl disable "${service_name}" || true
130*4a64e381SAndroid Build Coastguard Worker    fi
131*4a64e381SAndroid Build Coastguard Worker}
132*4a64e381SAndroid Build Coastguard Worker
133*4a64e381SAndroid Build Coastguard Workerdns64_start()
134*4a64e381SAndroid Build Coastguard Worker{
135*4a64e381SAndroid Build Coastguard Worker    with NAT64 && with DNS64 || return 0
136*4a64e381SAndroid Build Coastguard Worker
137*4a64e381SAndroid Build Coastguard Worker    service_name="$(_detect_service_name)"
138*4a64e381SAndroid Build Coastguard Worker
139*4a64e381SAndroid Build Coastguard Worker    if have systemctl; then
140*4a64e381SAndroid Build Coastguard Worker        sudo systemctl start "${service_name}" || die 'Failed to start bind9!'
141*4a64e381SAndroid Build Coastguard Worker    elif command -v service; then
142*4a64e381SAndroid Build Coastguard Worker        sudo service "${service_name}" start || die 'Failed to start bind9!'
143*4a64e381SAndroid Build Coastguard Worker    fi
144*4a64e381SAndroid Build Coastguard Worker}
145*4a64e381SAndroid Build Coastguard Worker
146*4a64e381SAndroid Build Coastguard Workerdns64_stop()
147*4a64e381SAndroid Build Coastguard Worker{
148*4a64e381SAndroid Build Coastguard Worker    with NAT64 && with DNS64 || return 0
149*4a64e381SAndroid Build Coastguard Worker
150*4a64e381SAndroid Build Coastguard Worker    service_name="$(_detect_service_name)"
151*4a64e381SAndroid Build Coastguard Worker
152*4a64e381SAndroid Build Coastguard Worker    if have systemctl; then
153*4a64e381SAndroid Build Coastguard Worker        sudo systemctl stop "${service_name}" || true
154*4a64e381SAndroid Build Coastguard Worker    elif command -v service; then
155*4a64e381SAndroid Build Coastguard Worker        sudo service "${service_name}" stop || true
156*4a64e381SAndroid Build Coastguard Worker    fi
157*4a64e381SAndroid Build Coastguard Worker}
158