Improve wired/wireless detection

This commit is contained in:
bergware
2025-04-27 02:29:52 +02:00
parent 7346aacbdf
commit 2d2a3fc1cd
3 changed files with 75 additions and 71 deletions

View File

@@ -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}'");

View File

@@ -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 &

View File

@@ -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