126 lines
3.4 KiB
Bash
126 lines
3.4 KiB
Bash
#!/system/bin/sh
|
||
|
||
valid_interface=()
|
||
NAT_INTERFACE=""
|
||
NAT_IP=""
|
||
NAT_FREQ=""
|
||
IS_NETWORK_CHANGE=0
|
||
|
||
# 输出日志到Android的logcat
|
||
# 需要两个参数,第一个固定为$LINENO
|
||
# 第二个为要输出的日志
|
||
# 如:print_log $LINENO "print_log test"
|
||
print_log(){
|
||
line_no=$1
|
||
log=$2
|
||
logcat="/system/bin/log -t host_network.sh\(line:$line_no\) $log"
|
||
|
||
eval "$logcat"
|
||
}
|
||
|
||
# 使用host网络,需要重新配置tcp port,重启adbd,避免网络adb异常
|
||
# 这边tcp port选择与aic.sh中定义的一致
|
||
restart_adbd(){
|
||
print_log $LINENO "restart adbd"
|
||
container_no=$(getprop ro.container.container_id)
|
||
tcp_port_pre="110"
|
||
tcp_port=$tcp_port_pre$container_no
|
||
# 默认server端口号是5037,使用host网络,会和宿主机adbd的server端口冲突
|
||
server_port=$((5038+$container_no))
|
||
print_log $LINENO "restart adbd tcp_port: $tcp_port"
|
||
setprop service.adb.tcp.port $tcp_port
|
||
setprop ro.container.adbd.server.port $server_port
|
||
kill -9 `pgrep adb`
|
||
start adbd
|
||
}
|
||
|
||
get_interface(){
|
||
valid_interface=()
|
||
all_interfaces=$(ip link show | awk -F': ' '{print $2}' | grep -v "lo" | grep -v veth | grep -v docker | grep -v dummy0)
|
||
for interface in $all_interfaces; do
|
||
if ping -I $interface -c 1 -W 1 www.baidu.com &> /dev/null; then
|
||
print_log $LINENO "foud valid interface: $interface"
|
||
valid_interface+=($interface)
|
||
fi
|
||
done
|
||
}
|
||
|
||
set_nat_for_docker0(){
|
||
interface=$1
|
||
# get default gateway
|
||
gateway=$(ip -4 route list table 0 | grep default | grep $interface | awk '{print $3}')
|
||
# get ip_addr: 172.16.21.199/24
|
||
ip_addr=$(ip -4 addr show dev $interface | awk '/inet / {print $2}')
|
||
NAT_INTERFACE=$interface
|
||
NAT_IP=$ip_addr
|
||
NAT_FREQ=$(iw dev $interface link | grep freq |awk '{print $2}')
|
||
print_log $LINENO "interface=$interface, gateway=$gateway, ip_addr=$ip_addr, freq=$NAT_FREQ"
|
||
|
||
ip rule add from all lookup main pref 9999
|
||
ip r a default via $gateway dev $interface proto static t main
|
||
ndc nat enable docker0 $interface 2 $ip_addr
|
||
echo 1 > /proc/sys/net/ipv4/ip_forward
|
||
|
||
restart_adbd
|
||
}
|
||
|
||
is_network_change(){
|
||
interface=$1
|
||
ip_addr=$(ip -4 addr show dev $interface | awk '/inet / {print $2}')
|
||
|
||
if [ "$ip_addr" == "$NAT_IP" ]; then
|
||
ping -I $interface -c 1 -W 1 www.baidu.com &> /dev/null
|
||
if [ $? -ne 0 ] ; then
|
||
IS_NETWORK_CHANGE=1
|
||
fi
|
||
# wifi切换频率(2.4G->5G)也有可能导致使用bridge网络的容器网络异常
|
||
# 所以网络频率切换也视为网络变化
|
||
FREQ=$(iw dev $interface link | grep freq |awk '{print $2}')
|
||
if [ "$FREQ" == "$NAT_FREQ" ]; then
|
||
IS_NETWORK_CHANGE=0
|
||
else
|
||
IS_NETWORK_CHANGE=1
|
||
fi
|
||
else
|
||
IS_NETWORK_CHANGE=1
|
||
fi
|
||
}
|
||
|
||
main(){
|
||
while true; do
|
||
get_interface
|
||
if [ ${#valid_interface[@]} -eq 0 ]; then
|
||
print_log $LINENO "Not found valid interface to connect network"
|
||
sleep 5
|
||
else
|
||
first_interface=${valid_interface[0]}
|
||
set_nat_for_docker0 $first_interface
|
||
break
|
||
fi
|
||
done
|
||
while true; do
|
||
is_network_change $NAT_INTERFACE
|
||
if [ $IS_NETWORK_CHANGE == "1" ] ; then
|
||
print_log $LINENO "May network status change, will reset nat for docker0"
|
||
get_interface
|
||
if [ ${#valid_interface[@]} -eq 0 ]; then
|
||
print_log $LINENO "Not found valid interface to connect network"
|
||
NAT_IP=""
|
||
NAT_FREQ=""
|
||
sleep 3
|
||
continue
|
||
fi
|
||
first_interface=${valid_interface[0]}
|
||
set_nat_for_docker0 $first_interface
|
||
fi
|
||
# 执行adb root等命令可能导致adbd异常退出,原因待查,此为workround
|
||
adbd_pid=$(pgrep adbd)
|
||
if [ -z $adbd_pid ]; then
|
||
restart_adbd
|
||
fi
|
||
sleep 3
|
||
done
|
||
}
|
||
|
||
main "$@"
|