mirror of
https://github.com/unraid/webgui.git
synced 2026-02-27 04:41:20 -06:00
Improve wired/wireless detection
This commit is contained in:
@@ -36,10 +36,10 @@ function port($dev) {
|
||||
return file_exists("/sys/class/net/$dev");
|
||||
}
|
||||
|
||||
function carrier($dev) {
|
||||
function carrier($dev, $loop=10) {
|
||||
if (!port($dev)) return false;
|
||||
try {
|
||||
for ($n = 0; $n < 10; $n++) {
|
||||
for ($n = 0; $n < $loop; $n++) {
|
||||
if (@file_get_contents("/sys/class/net/$dev/carrier") == 1) return true;
|
||||
sleep(1);
|
||||
}
|
||||
@@ -51,7 +51,7 @@ function carrier($dev) {
|
||||
|
||||
function thisNet() {
|
||||
$dev = port('br0') ? 'br0' : (port('bond0') ? 'bond0' : 'eth0');
|
||||
if (!carrier($dev) && carrier('wlan0')) $dev = 'wlan0';
|
||||
if (!carrier($dev) && carrier('wlan0', 1)) $dev = 'wlan0';
|
||||
$ip4 = exec("ip -4 -br addr show dev $dev | awk '{print \$3;exit}'");
|
||||
$net = exec("ip -4 route show $ip4 dev $dev | awk '{print \$1;exit}'");
|
||||
$gw = exec("ip -4 route show default dev $dev | awk '{print \$3;exit}'");
|
||||
|
||||
@@ -37,81 +37,83 @@ TMP=/var/tmp/network.tmp
|
||||
|
||||
# function to wait for carrier of interface
|
||||
carrier(){
|
||||
local n
|
||||
[[ -e $SYSTEM/$1 ]] || return 1
|
||||
for n in {1..10}; do
|
||||
local n e
|
||||
[[ -e $SYSTEM/$1 ]] && e=${2:-10} || return 1
|
||||
for n in {1..$e}; do
|
||||
[[ $(cat $SYSTEM/$1/carrier 2>/dev/null) == 1 ]] && return 0 || sleep 1
|
||||
done
|
||||
return 1
|
||||
}
|
||||
|
||||
# determine active port name
|
||||
[[ -e $SYSTEM/bond0 ]] && PORT=bond0 || PORT=eth0
|
||||
[[ -e $SYSTEM/br0 ]] && PORT=br0
|
||||
[[ ! $(carrier $PORT) && $(carrier wlan0) ]] && PORT=wlan0
|
||||
docker_read_options(){
|
||||
# determine active port name
|
||||
[[ -e $SYSTEM/bond0 ]] && PORT=bond0 || PORT=eth0
|
||||
[[ -e $SYSTEM/br0 ]] && PORT=br0
|
||||
[[ ! $(carrier $PORT) && $(carrier wlan0) ]] && PORT=wlan0
|
||||
|
||||
# Set defaults used by the docker daemon
|
||||
if [[ -f $DOCKER_CFG ]]; then
|
||||
for NIC in $NICS; do
|
||||
if [[ ${NIC:0:3} == eth ]]; then
|
||||
if [[ -e $SYSTEM/${NIC/eth/br} ]]; then
|
||||
NIC=${NIC/eth/br}
|
||||
elif [[ -e $SYSTEM/${NIC/eth/bond} ]]; then
|
||||
NIC=${NIC/eth/bond}
|
||||
# Set defaults used by the docker daemon
|
||||
if [[ -f $DOCKER_CFG ]]; then
|
||||
for NIC in $NICS; do
|
||||
if [[ ${NIC:0:3} == eth ]]; then
|
||||
if [[ -e $SYSTEM/${NIC/eth/br} ]]; then
|
||||
NIC=${NIC/eth/br}
|
||||
elif [[ -e $SYSTEM/${NIC/eth/bond} ]]; then
|
||||
NIC=${NIC/eth/bond}
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
CFG=($(grep -Pom2 "_SUBNET_|_${NIC^^}(_[0-9]+)?=" $DOCKER_CFG))
|
||||
if [[ ${CFG[0]} == _SUBNET_ && -z ${CFG[1]} ]]; then
|
||||
# interface has changed, update configuration
|
||||
X=${NIC//[^0-9]/}
|
||||
sed -ri "s/_(BR|BOND|ETH|WLAN)$X(_[0-9]+)?=/_${NIC^^}\2=/; s/(br|bond|eth|wlan)$X(\.[0-9]+)? /$NIC\2 /g" $DOCKER_CFG
|
||||
fi
|
||||
done
|
||||
# Read (updated) Unraid docker configuration file
|
||||
. $DOCKER_CFG
|
||||
fi
|
||||
|
||||
# set storage driver to overlay2 if config value is found, otherwise fall back to native FS driver
|
||||
if [[ $(awk -F'"' '/^DOCKER_BACKINGFS=/{print $2}' $DOCKER_CFG 2>/dev/null) == overlay2 ]]; then
|
||||
DOCKER_OPTS="$DOCKER_OPTS --storage-driver=overlay2"
|
||||
else
|
||||
BACKINGFS=$(findmnt --output FSTYPE --noheadings $DOCKER_ROOT)
|
||||
if [[ $BACKINGFS == btrfs ]]; then
|
||||
DOCKER_OPTS="$DOCKER_OPTS --storage-driver=btrfs"
|
||||
elif [[ $BACKINGFS == xfs ]]; then
|
||||
DOCKER_OPTS="$DOCKER_OPTS --storage-driver=overlay2"
|
||||
elif [[ $BACKINGFS == zfs ]]; then
|
||||
DOCKER_OPTS="$DOCKER_OPTS --storage-driver=zfs"
|
||||
CFG=($(grep -Pom2 "_SUBNET_|_${NIC^^}(_[0-9]+)?=" $DOCKER_CFG))
|
||||
if [[ ${CFG[0]} == _SUBNET_ && -z ${CFG[1]} ]]; then
|
||||
# interface has changed, update configuration
|
||||
X=${NIC//[^0-9]/}
|
||||
sed -ri "s/_(BR|BOND|ETH|WLAN)$X(_[0-9]+)?=/_${NIC^^}\2=/; s/(br|bond|eth|wlan)$X(\.[0-9]+)? /$NIC\2 /g" $DOCKER_CFG
|
||||
fi
|
||||
done
|
||||
# Read (updated) Unraid docker configuration file
|
||||
. $DOCKER_CFG
|
||||
fi
|
||||
fi
|
||||
|
||||
# Less verbose logging by default
|
||||
DOCKER_OPTS="--log-level=fatal $DOCKER_OPTS"
|
||||
# set storage driver to overlay2 if config value is found, otherwise fall back to native FS driver
|
||||
if [[ $(awk -F'"' '/^DOCKER_BACKINGFS=/{print $2}' $DOCKER_CFG 2>/dev/null) == overlay2 ]]; then
|
||||
DOCKER_OPTS="$DOCKER_OPTS --storage-driver=overlay2"
|
||||
else
|
||||
BACKINGFS=$(findmnt --output FSTYPE --noheadings $DOCKER_ROOT)
|
||||
if [[ $BACKINGFS == btrfs ]]; then
|
||||
DOCKER_OPTS="$DOCKER_OPTS --storage-driver=btrfs"
|
||||
elif [[ $BACKINGFS == xfs ]]; then
|
||||
DOCKER_OPTS="$DOCKER_OPTS --storage-driver=overlay2"
|
||||
elif [[ $BACKINGFS == zfs ]]; then
|
||||
DOCKER_OPTS="$DOCKER_OPTS --storage-driver=zfs"
|
||||
fi
|
||||
fi
|
||||
|
||||
# Enable global docker LOG rotation
|
||||
if [[ $DOCKER_LOG_ROTATION == yes ]]; then
|
||||
[[ -z $DOCKER_LOG_SIZE ]] && DOCKER_LOG_SIZE=10m
|
||||
[[ -z $DOCKER_LOG_FILES ]] && DOCKER_LOG_FILES=1
|
||||
DOCKER_OPTS="--log-opt max-size=$DOCKER_LOG_SIZE --log-opt max-file=$DOCKER_LOG_FILES $DOCKER_OPTS"
|
||||
fi
|
||||
# Less verbose logging by default
|
||||
DOCKER_OPTS="--log-level=fatal $DOCKER_OPTS"
|
||||
|
||||
# Adjust MTU size if non-default
|
||||
MTU=$(ip link show $PORT | grep -Po 'mtu \K\d+')
|
||||
[[ -n $MTU && $MTU -ne 1500 ]] && DOCKER_OPTS="--mtu=$MTU $DOCKER_OPTS"
|
||||
# Enable global docker LOG rotation
|
||||
if [[ $DOCKER_LOG_ROTATION == yes ]]; then
|
||||
[[ -z $DOCKER_LOG_SIZE ]] && DOCKER_LOG_SIZE=10m
|
||||
[[ -z $DOCKER_LOG_FILES ]] && DOCKER_LOG_FILES=1
|
||||
DOCKER_OPTS="--log-opt max-size=$DOCKER_LOG_SIZE --log-opt max-file=$DOCKER_LOG_FILES $DOCKER_OPTS"
|
||||
fi
|
||||
|
||||
# Enable IPv6 for docker bridge network
|
||||
if [[ -n $(ip -6 route show default dev $PORT) ]]; then
|
||||
DOCKER0='fd17::/64'
|
||||
DOCKER_OPTS="--ipv6 --fixed-cidr-v6=$DOCKER0 $DOCKER_OPTS"
|
||||
IPV6_FORWARD=${IPV6_FORWARD:=accept}
|
||||
# create IPv6 NAT rule for docker0
|
||||
[[ -z $(ip6tables -t nat -S | grep -o "$DOCKER0") ]] && run ip6tables -t nat -A POSTROUTING -s $DOCKER0 ! -o docker0 -j MASQUERADE
|
||||
else
|
||||
# ipv6 disabled
|
||||
[[ -d $CONF6/docker0 ]] && echo 1 > $CONF6/docker0/disable_ipv6
|
||||
fi
|
||||
# Adjust MTU size if non-default
|
||||
MTU=$(ip link show $PORT | grep -Po 'mtu \K\d+')
|
||||
[[ -n $MTU && $MTU -ne 1500 ]] && DOCKER_OPTS="--mtu=$MTU $DOCKER_OPTS"
|
||||
|
||||
export DOCKER_RAMDISK=true
|
||||
# Enable IPv6 for docker bridge network
|
||||
if [[ -n $(ip -6 route show default dev $PORT) ]]; then
|
||||
DOCKER0='fd17::/64'
|
||||
DOCKER_OPTS="--ipv6 --fixed-cidr-v6=$DOCKER0 $DOCKER_OPTS"
|
||||
IPV6_FORWARD=${IPV6_FORWARD:=accept}
|
||||
# create IPv6 NAT rule for docker0
|
||||
[[ -z $(ip6tables -t nat -S | grep -o "$DOCKER0") ]] && run ip6tables -t nat -A POSTROUTING -s $DOCKER0 ! -o docker0 -j MASQUERADE
|
||||
else
|
||||
# ipv6 disabled
|
||||
[[ -d $CONF6/docker0 ]] && echo 1 > $CONF6/docker0/disable_ipv6
|
||||
fi
|
||||
|
||||
export DOCKER_RAMDISK=true
|
||||
}
|
||||
|
||||
# Get docker daemon PID (if existing)
|
||||
docker_pid(){
|
||||
@@ -260,7 +262,7 @@ docker_network_start(){
|
||||
fi
|
||||
X=${NIC//[^0-9]/}
|
||||
REF=$(grep -Pom1 "<Network>\K(br|bond|eth|wlan)$X" $XMLFILE)
|
||||
[[ $X == 0 && ! $(carrier $NIC) ]] && continue
|
||||
[[ $X == 0 && ! $(carrier $NIC 1) ]] && continue
|
||||
[[ $X == 0 && $NIC != wlan0 ]] && MAIN=$NIC
|
||||
[[ $NIC == wlan0 && -n $MAIN ]] && continue
|
||||
if [[ -n $REF && $REF != $NIC ]]; then
|
||||
@@ -642,6 +644,7 @@ docker_status(){
|
||||
|
||||
case "$1" in
|
||||
'start')
|
||||
docker_read_options
|
||||
docker_service_start
|
||||
docker_network_start
|
||||
docker_container_start &>/dev/null &
|
||||
@@ -661,6 +664,7 @@ case "$1" in
|
||||
docker_network_stop
|
||||
docker_service_stop
|
||||
sleep 1
|
||||
docker_read_options
|
||||
docker_service_start
|
||||
docker_network_start
|
||||
docker_container_start &>/dev/null &
|
||||
|
||||
@@ -78,9 +78,9 @@ hex(){
|
||||
|
||||
# function to wait for carrier of interface
|
||||
carrier(){
|
||||
local n
|
||||
[[ -e $SYSTEM/$1 ]] || return 1
|
||||
for n in {1..10}; do
|
||||
local n e
|
||||
[[ -e $SYSTEM/$1 ]] && e=${2:-10} || return 1
|
||||
for n in {1..$e}; do
|
||||
[[ $(cat $SYSTEM/$1/carrier 2>/dev/null) == 1 ]] && return 0 || sleep 1
|
||||
done
|
||||
return 1
|
||||
@@ -234,11 +234,11 @@ wifi_start(){
|
||||
$OPENSSL load
|
||||
# start active SSID
|
||||
$STARTWIFI
|
||||
if ! carrier $PORT; then
|
||||
if ! carrier $PORT 1; then
|
||||
# try the saved SSIDs
|
||||
for SSID in $(grep -P '^\[.+\]$' $CFG | sed 1d | sed -r 's/\[|\]/"/g'); do
|
||||
[[ -n $SSID ]] && $STARTWIFI "$SSID" || break
|
||||
if carrier $PORT; then break; fi
|
||||
if carrier $PORT 1; then break; fi
|
||||
done
|
||||
fi
|
||||
if wifi_running; then REPLY="Started"; else REPLY="Failed"; fi
|
||||
|
||||
Reference in New Issue
Block a user