mirror of
https://github.com/unraid/webgui.git
synced 2026-01-06 01:29:54 -06:00
Docker networking fixes
This commit is contained in:
@@ -30,6 +30,7 @@ DOCKER_TIMEOUT=$(awk -F'"' '/^DOCKER_TIMEOUT=/{print $2}' $DOCKER_CFG 2>/dev/nul
|
||||
|
||||
# network file references
|
||||
INI=/var/local/emhttp/network.ini
|
||||
STA=/var/local/emhttp/statics.ini
|
||||
TMP=/var/tmp/network.tmp
|
||||
|
||||
# run & log functions
|
||||
@@ -57,6 +58,18 @@ carrier(){
|
||||
return 1
|
||||
}
|
||||
|
||||
# add entry to watch list
|
||||
add_entry(){
|
||||
rm -f /var/tmp/${1%% *}.down
|
||||
[[ -e $STA ]] && echo "$1" >>$STA
|
||||
}
|
||||
|
||||
# delete enty from watch list
|
||||
del_entry(){
|
||||
[[ -e $STA ]] && sed -i "/^$1 .*/d" $STA
|
||||
touch /var/tmp/$1.down
|
||||
}
|
||||
|
||||
# initialize docker settings
|
||||
docker_read_options(){
|
||||
# determine active port name
|
||||
@@ -178,11 +191,6 @@ network(){
|
||||
docker network ls --filter driver="$1" --format='{{.Name}}' 2>/dev/null | grep -P "^[a-z]+$2(\$|\.)" | tr '\n' ' '
|
||||
}
|
||||
|
||||
# Does the ipv4 address exist?
|
||||
ipv4_exist(){
|
||||
ip -4 -br addr show to $2 dev $1 | awk '{print $3;exit}'
|
||||
}
|
||||
|
||||
# Is container running?
|
||||
container_running(){
|
||||
local CONTAINER
|
||||
@@ -414,22 +422,29 @@ docker_network_start(){
|
||||
done
|
||||
# hack to let containers talk to host
|
||||
if [[ $TYPE == br ]]; then
|
||||
LINK=shim-$NETWORK
|
||||
SHIM=shim-$NETWORK
|
||||
if [[ $DOCKER_ALLOW_ACCESS == yes && -n $IPV4 ]]; then
|
||||
# create shim interface
|
||||
[[ -e $SYSTEM/$LINK ]] || run ip link add link $NETWORK name $LINK type $ATTACH mode $MODE
|
||||
# disable IPv6 on shim interface
|
||||
echo 1 >$CONF6/$LINK/disable_ipv6
|
||||
run ip -6 addr flush dev $LINK
|
||||
if [[ ! -e $SYSTEM/$SHIM ]]; then
|
||||
run ip link add link $NETWORK name $SHIM type $ATTACH mode $MODE
|
||||
run ip link set $SHIM up
|
||||
# disable IPv6 on shim interface
|
||||
echo 1 >$CONF6/$SHIM/disable_ipv6
|
||||
run ip -6 addr flush dev $SHIM
|
||||
fi
|
||||
# copy parent IPv4 address to shim interface
|
||||
run ip addr add $IPV4 dev $LINK metric 0
|
||||
run ip link set $LINK up
|
||||
log "created network $LINK for host access"
|
||||
elif [[ -e $SYSTEM/$LINK ]]; then
|
||||
# remove shim interface
|
||||
run ip addr flush dev $LINK
|
||||
run ip link set $LINK down
|
||||
run ip link del $LINK
|
||||
run ip addr add $IPV4 dev $SHIM metric 0
|
||||
add_entry "$SHIM $IPV4 metric 0"
|
||||
GW4=$(ip -4 route show to default dev $NETWORK | awk '{print $3;exit}')
|
||||
if [[ -n $GW4 ]]; then
|
||||
run ip -4 route add default via $GW4 dev $SHIM metric 0
|
||||
add_entry "$SHIM GW4 default via $GW4 metric 0"
|
||||
fi
|
||||
log "created network $SHIM for host access"
|
||||
elif [[ -e $SYSTEM/$SHIM ]]; then
|
||||
# remove shim interface assignment
|
||||
del_entry $SHIM
|
||||
run ip -4 addr flush dev $SHIM
|
||||
fi
|
||||
else
|
||||
if [[ $TYPE == wlan ]]; then
|
||||
@@ -442,11 +457,18 @@ docker_network_start(){
|
||||
echo 1 >$CONF6/$VHOST/disable_ipv6
|
||||
run ip -6 addr flush dev $VHOST
|
||||
# copy parent IPv4 address to vhost interface
|
||||
[[ -z $(ipv4_exist $VHOST ${IPV4%/*}) ]] && run ip addr add $IPV4 dev $VHOST metric 0
|
||||
run ip addr add $IPV4 dev $VHOST metric 0
|
||||
add_entry "$VHOST $IPV4 metric 0"
|
||||
GW4=$(ip -4 route show to default dev $NETWORK | awk '{print $3;exit}')
|
||||
if [[ -n $GW4 ]]; then
|
||||
run ip -4 route add default via $GW4 dev $VHOST metric 0
|
||||
add_entry "$VHOST GW4 default via $GW4 metric 0"
|
||||
fi
|
||||
log "created network $VHOST for host access"
|
||||
elif [[ -n $IPV4 && -e $SYSTEM/$VHOST && -n $(ipv4_exist $VHOST ${IPV4%/*}) ]]; then
|
||||
# remove parent IPv4 address from vhost interface
|
||||
run ip addr del $IPV4 dev $VHOST metric 0
|
||||
elif [[ -n $IPV4 && -e $SYSTEM/$VHOST ]]; then
|
||||
# remove vhost interface assignment
|
||||
del_entry $VHOST
|
||||
run ip -4 addr flush dev $VHOST
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
@@ -470,23 +492,21 @@ docker_network_stop(){
|
||||
for NETWORK in $(network $ATTACH ${NIC//[^0-9]/}); do
|
||||
[[ $STOCK =~ ${NETWORK%%[0-9]*} || $DOCKER_USER_NETWORKS != preserve ]] && docker network rm $NETWORK &>/dev/null
|
||||
TYPE=${NETWORK//[0-9.]/}
|
||||
if [[ $TYPE == br ]]; then
|
||||
LINK=shim-$NETWORK
|
||||
if [[ -e $SYSTEM/$LINK ]]; then
|
||||
run ip addr flush dev $LINK
|
||||
run ip link set $LINK down
|
||||
run ip link del $LINK
|
||||
if [[ $TYPE == br || $TYPE == wlan ]]; then
|
||||
SHIM=shim-$NETWORK
|
||||
if [[ -e $SYSTEM/$SHIM ]]; then
|
||||
del_entry $SHIM
|
||||
run ip addr flush dev $SHIM
|
||||
fi
|
||||
elif [[ $TYPE != wlan ]]; then
|
||||
else
|
||||
VHOST=vhost${NETWORK//[^0-9.]/}
|
||||
[[ -e $SYSTEM/$VHOST ]] && run ip addr flush dev $VHOST
|
||||
if [[ -e $SYSTEM/$VHOST ]]; then
|
||||
del_entry $VHOST
|
||||
run ip addr flush dev $VHOST
|
||||
fi
|
||||
fi
|
||||
done
|
||||
done
|
||||
if [[ -e $SYSTEM/shim-wlan0 ]]; then
|
||||
IPV4=$(ip -4 -br addr show scope global primary dev shim-wlan0 | awk '{print $3,$4,$5;exit}')
|
||||
[[ -n $IPV4 ]] && run ip addr del $IPV4 dev shim-wlan0
|
||||
fi
|
||||
log "Network stopped."
|
||||
}
|
||||
|
||||
|
||||
@@ -163,7 +163,8 @@ for ((i=0; i<${SYSNICS:-1}; i++)); do
|
||||
IPV4="$(ip -4 -br addr show scope global primary dev $IFACE | awk '{$2="";print;exit}')"
|
||||
if [[ -n $IPV4 ]]; then
|
||||
echo "$IPV4" >>$STA
|
||||
echo "$IFACE GW4 $(ip -4 route show to default dev $IFACE)" >>$STA
|
||||
GW4="$(ip -4 route show to default dev $IFACE)"
|
||||
[[ -n $GW4 ]] && echo "$IFACE GW4 $GW4" >>$STA
|
||||
fi
|
||||
fi
|
||||
echo "USE_DHCP6:0=\"${USE_DHCP6[$i]}\"" >>$INI
|
||||
@@ -187,7 +188,8 @@ for ((i=0; i<${SYSNICS:-1}; i++)); do
|
||||
IPV6="$(ip -6 -br addr show scope global primary -deprecated dev $IFACE | awk '{$2="";print;exit}')"
|
||||
if [[ -n $IPV6 ]]; then
|
||||
echo "$IPV6" >>$STA
|
||||
echo "$IFACE GW6 $(ip -6 route show to default dev $IFACE)" >>$STA
|
||||
GW6="$(ip -6 route show to default dev $IFACE)"
|
||||
[[ -n $GW6 ]] && echo "$IFACE GW6 $GW6" >>$STA
|
||||
fi
|
||||
fi
|
||||
echo "USE_MTU=\"${USE_MTU[$i]}\"" >>$INI
|
||||
@@ -219,7 +221,8 @@ for ((i=0; i<${SYSNICS:-1}; i++)); do
|
||||
IPV4="$(ip -4 -br addr show scope global primary dev $DEV | awk '{$2="";print;exit}')"
|
||||
if [[ -n $IPV4 ]]; then
|
||||
echo "${IPV4/@$IFACE/}" >>$STA
|
||||
echo "$DEV GW4 $(ip -4 route show to default dev $DEV)" >>$STA
|
||||
GW4="$(ip -4 route show to default dev $DEV)"
|
||||
[[ -n $GW4 ]] && echo "$DEV GW4 $GW4" >>$STA
|
||||
fi
|
||||
fi
|
||||
echo "USE_DHCP6:$j=\"${USE_DHCP6[$i,$j]}\"" >>$INI
|
||||
@@ -244,7 +247,8 @@ for ((i=0; i<${SYSNICS:-1}; i++)); do
|
||||
IPV6="$(ip -6 -br addr show scope global primary -deprecated dev $DEV | awk '{$2="";print;exit}')"
|
||||
if [[ -n $IPV6 ]]; then
|
||||
echo "${IPV6/@$IFACE/}" >>$STA
|
||||
echo "$DEV GW6 $(ip -6 route show to default dev $DEV)" >>$STA
|
||||
GW6="$(ip -6 route show to default dev $DEV)"
|
||||
[[ -n $GW6 ]] && echo "$DEV GW6 $GW6" >>$STA
|
||||
fi
|
||||
fi
|
||||
done
|
||||
|
||||
@@ -58,23 +58,34 @@ while :; do
|
||||
for i in ${!TASK[@]}; do
|
||||
ADDR=(${TASK[$i]})
|
||||
PORT=${ADDR[0]}
|
||||
[[ $LAST != $PORT ]] && STATE=$(state $PORT)
|
||||
[[ $LAST != ${PORT%.*} ]] && STATE=$(state ${PORT%.*})
|
||||
case $STATE in
|
||||
1) # up
|
||||
case ${ADDR[1]} in
|
||||
GW4)
|
||||
# no existing default and new default is defined?
|
||||
ROUTE=$(ip -4 route show to default dev $PORT)
|
||||
[[ -z $ROUTE && "${TASK[$i]}" =~ "default" ]] && ip -4 route add dev ${TASK[$i]/GW4/}
|
||||
IPV4=$(ip -4 -br addr show scope global primary dev $PORT | awk '{print $3;exit}')
|
||||
if [[ -n $IPV4 ]]; then
|
||||
ROUTE=$(ip -4 route show to default dev $PORT)
|
||||
[[ -z $ROUTE && "${TASK[$i]}" =~ "default" ]] && ip -4 route add dev ${TASK[$i]/GW4/}
|
||||
fi
|
||||
;;
|
||||
GW6)
|
||||
# no existing default and new default is defined?
|
||||
ROUTE=$(ip -6 route show to default dev $PORT)
|
||||
[[ -z $ROUTE && "${TASK[$i]}" =~ "default" ]] && ip -6 route add dev ${TASK[$i]/GW6/}
|
||||
IPV6=$(ip -6 -br addr show scope global primary -deprecated dev $PORT | awk '{print $3;exit}')
|
||||
if [[ -n $IPV6 ]]; then
|
||||
ROUTE=$(ip -6 route show to default dev $PORT)
|
||||
[[ -z $ROUTE && "${TASK[$i]}" =~ "default" ]] && ip -6 route add dev ${TASK[$i]/GW6/}
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
# IP address not present? create it
|
||||
[[ "$(ip -br addr show dev $PORT)" =~ "${ADDR[1]}" ]] || ip addr add dev ${TASK[$i]}
|
||||
if [[ -f /var/tmp/$PORT.down ]]; then
|
||||
# Special treatment for shim and vhost interfaces
|
||||
[[ "$(ip -br addr show dev $PORT)" =~ "${ADDR[1]}" ]] && ip addr flush dev $PORT
|
||||
else
|
||||
# IP address not present? create it
|
||||
[[ "$(ip -br addr show dev $PORT)" =~ "${ADDR[1]}" ]] || ip addr add dev ${TASK[$i]}
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
@@ -83,7 +94,7 @@ while :; do
|
||||
[[ "$(ip -br addr show dev $PORT)" =~ "${ADDR[1]}" ]] && ip addr del dev ${TASK[$i]}
|
||||
;;
|
||||
esac
|
||||
LAST=$PORT
|
||||
LAST=${PORT%.*}
|
||||
done
|
||||
fi
|
||||
# check every 3 seconds
|
||||
|
||||
Reference in New Issue
Block a user