diff --git a/emhttp/plugins/dynamix/Eth0.page b/emhttp/plugins/dynamix/Eth0.page index f7e197681..ed54cfc88 100644 --- a/emhttp/plugins/dynamix/Eth0.page +++ b/emhttp/plugins/dynamix/Eth0.page @@ -92,9 +92,31 @@ refresh(); // automatically include new ethernet ports Array.prototype.same = function(){return this.sort().filter(function(v,i,o){return i&&v===o[i-1]?v:0;}).length;} function prepareSettings(form) { - var metrics = []; - var metrics6 = []; + var bondnics = [], brnics = []; + for (var i=0,nic; nic=form.BONDNICS.options[i]; i++) { + if (nic.selected) { + bondnics.push(nic.value); + nic.selected = false; + } + } + nic = form.BONDNICS.options[0]; + nic.value = bondnics.join(','); + nic.selected = true; + nic.disabled = false; + for (var i=0,nic; nic=form.BRNICS.options[i]; i++) { + if (nic.selected) { + brnics.push(nic.value); + nic.selected = false; + } + } + nic = form.BRNICS.options[0]; + nic.value = form.BONDING.value=='yes' ? form.BONDNAME.value : brnics.join(','); + nic.selected = true; + nic.disabled = false; + if (brnics.length>1) form.BRSTP.value = 'yes'; if ($(form).find('input[name="#arg[1]"]').val()=='none') return true; + + var metrics = [], metrics6 = []; $(form).find('input[name^="METRIC:"]').each(function(){if($(this).val()>0) metrics.push($(this).val());}); $(form).find('input[name^="METRIC6:"]').each(function(){if($(this).val()>0) metrics6.push($(this).val());}); if (metrics.same() || metrics6.same()) { @@ -123,31 +145,6 @@ function prepareSettings(form) { return false; } } - var member = ''; - for (var i=0,item; item=form.BONDNICS.options[i]; i++) { - if (item.selected) { - if (member.length) member += ','; - member += item.value; - item.selected = false; - } - } - item = form.BONDNICS.options[0]; - item.value = member; - item.selected = true; - item.disabled = false; - var member = ''; - for (var i=0,item; item=form.BRNICS.options[i]; i++) { - if (item.selected) { - if (member.length) member += ','; - member += item.value; - item.selected = false; - } - } - item = form.BRNICS.options[0]; - item.value = form.BONDING.value=='yes' ? form.BONDNAME.value : member; - item.selected = true; - item.disabled = false; - if (member.indexOf(',')>0) form.BRSTP.value = 'yes'; $(form).find('select[name^="PROTOCOL:"]').each(function() { var protocol = $(this).val() || 'ipv4'; var i = $(this).attr('name').split(':')[1]; diff --git a/emhttp/plugins/dynamix/nchan/device_list b/emhttp/plugins/dynamix/nchan/device_list index 21dd74d1a..dbc5732a6 100755 --- a/emhttp/plugins/dynamix/nchan/device_list +++ b/emhttp/plugins/dynamix/nchan/device_list @@ -466,9 +466,9 @@ while (true) { }); if (count($current_subpools) < count($subpools)) { $current_subpools_list = str_replace("$pool~","", implode(',', $current_subpools)); - $subPoolButton = ""; + $subPoolButton = ""; } else { - $subPoolButton = ""; + $subPoolButton = ""; } $echo[$n] .= "$subPoolButton"; } diff --git a/emhttp/plugins/dynamix/scripts/netconfig b/emhttp/plugins/dynamix/scripts/netconfig index a38baeda7..0621a9c97 100755 --- a/emhttp/plugins/dynamix/scripts/netconfig +++ b/emhttp/plugins/dynamix/scripts/netconfig @@ -81,7 +81,7 @@ if ($run) { } // create configuration file for all available interfaces -$i = 0; $new = []; $new[] = "# Generated settings:"; +$i = 0; $new = ["# Generated settings:"]; foreach ($ini as $name => $port) { $bonding = $port['BONDING']=='yes'; $bridging = $port['BRIDGING']=='yes'; @@ -126,8 +126,8 @@ file_put_contents($cfg,implode("\r\n",$new)."\r\n"); // start interface with updated (new) configuration // don't execute when only interface description has changed if ($run) { - exec("/etc/rc.d/rc.inet1 {$ifname}_start >/dev/null 2>&1"); - exec("/usr/local/sbin/create_network_ini $ifname >/dev/null 2>&1 &"); + exec("/etc/rc.d/rc.inet1 {$ifname}_start &>/dev/null"); + exec("/usr/local/sbin/create_network_ini $ifname &>/dev/null &"); update_wireguard($ifname); } exit(0); diff --git a/etc/rc.d/rc.S b/etc/rc.d/rc.S index 2a7fb7074..daf7382ff 100755 --- a/etc/rc.d/rc.S +++ b/etc/rc.d/rc.S @@ -155,8 +155,9 @@ else [[ $RETVAL -gt 0 ]] && abort "failed to remount $UNRAIDROOT r/w with return value $RETVAL" fi -# invoke testing hook -if [[ -f /boot/config/rc.S.extra ]]; then +# invoke testing hook (only for test versions) +. /etc/unraid-version +if [[ -f /boot/config/rc.S.extra && $version =~ beta ]]; then . /boot/config/rc.S.extra fi # and continue in separate script diff --git a/etc/rc.d/rc.inet1 b/etc/rc.d/rc.inet1 index af848065b..01fb7f86c 100755 --- a/etc/rc.d/rc.inet1 +++ b/etc/rc.d/rc.inet1 @@ -62,6 +62,9 @@ # - added error logging to syslog # - replace logging for generic add-in module +# Adapted by Bergware for use in Unraid OS - August 2023 +# - added interface carrier check when polling for DHCP server + # Bergware - modified for Unraid OS, October 2023 ########### @@ -149,11 +152,18 @@ set_mtu(){ fi } +# function to wait for carrier of interface +carrier_up(){ + for i in {1..5}; do + [[ $(cat $SYSTEM/$1/carrier 2>/dev/null) == 1 ]] && return 0 || sleep 1 + done + return 1 +} + # function to create bond interface bond_up(){ [[ -d /proc/net/bonding ]] || modprobe bonding mode=${BONDING_MODE[$i]} miimon=${BONDING_MIIMON[$i]} run ip link add name ${BONDNAME[$i]} type bond mode ${BONDING_MODE[$i]} miimon ${BONDING_MIIMON[$i]} - run ip link set ${BONDNAME[$i]} up set_mtu ${BONDNAME[$i]} PRIMARY=; # loop thru assigned interfaces in bond @@ -167,8 +177,6 @@ bond_up(){ fi done [[ -n $PRIMARY ]] && run ip link set name ${BONDNAME[$i]} type bond primary $PRIMARY - # delay to allow bond initialization - sleep 3 } # function to delete bond interface @@ -194,7 +202,6 @@ br_up(){ BRSTP[$i]=${BRSTP[$i]/no/0} BRSTP[$i]=${BRSTP[$i]/yes/1} run ip link add name $BRIDGE type bridge stp_state ${BRSTP[$i]} forward_delay ${BRFD[$i]} - run ip link set $BRIDGE up # loop thru assigned interfaces in bridge for BRNIC in ${BRNICS[$i]}; do [[ $j -eq 0 ]] && BRIF=$BRNIC || BRIF=$BRNIC.${VLANID[$i,$j]} @@ -347,14 +354,22 @@ ipaddr_up(){ [[ $IP == ipv4 ]] && DHCP_OPTIONS="$DHCP_OPTIONS -4" [[ $IP == ipv6 ]] && DHCP_OPTIONS="$DHCP_OPTIONS -6" [[ $IP != ipv4 && -n $PRIV6 && -d $CONF6/$IFACE ]] && echo $PRIV6 >$CONF6/$IFACE/use_tempaddr - log "polling up to 60 sec for DHCP server on interface $IFACE" - if ! run timeout 60 dhcpcd -w $DHCP_OPTIONS $IFACE; then - log "can't obtain IP address, continue polling in background on interface $IFACE" + if carrier_up $IFACE; then + # interface is UP + log "interface $IFACE is UP, polling up to 60 sec for DHCP $IP server" + if ! run timeout 60 dhcpcd -w $DHCP_OPTIONS $IFACE; then + log "can't obtain IP address, continue polling in background on interface $IFACE" + run dhcpcd -b $DHCP_OPTIONS $IFACE + fi + else + # interface is DOWN + log "interface $IFACE is DOWN, polling DHCP $IP server in background" run dhcpcd -b $DHCP_OPTIONS $IFACE fi [[ $j -eq $((${VLANS[$i]}-1)) ]] && sleep 3 elif [[ $DHCP == no ]]; then # bring up interface using static IP address + [[ carrier_up ]] ipv6_addr 0 1 if [[ $IP != ipv6 ]]; then [[ $j -eq 0 ]] && ADDR=${IPADDR[$i]} || ADDR=${IPADDR[$i,$j]} @@ -461,6 +476,7 @@ if_up(){ [[ -n ${HWADDR[$i]} ]] && run ip link set $1 addr ${HWADDR[$i]} set_mtu $1 fi + run ip link set $IFACE up # set interface address [[ $i -eq 0 && $j -eq 0 ]] && MAIN=1 || MAIN= if [[ $IP == ipv4 ]]; then @@ -490,7 +506,6 @@ if_up(){ DHCP_KEEP_RESOLV=$DHCP6_KEEP_RESOLV ipaddr_up fi - run ip link set $IFACE up done } diff --git a/etc/rc.d/rc.messagebus b/etc/rc.d/rc.messagebus index f9a19126a..438f93112 100755 --- a/etc/rc.d/rc.messagebus +++ b/etc/rc.d/rc.messagebus @@ -49,7 +49,7 @@ dbus_stop(){ if ! dbus_running; then REPLY="Already stopped" else - run kill $(cat $PIDFILE 2>/dev/null) + run kill $(cat $PIDFILE) # Just in case: run killall dbus-daemon rm -f $PIDFILE diff --git a/etc/rc.d/rc.udev b/etc/rc.d/rc.udev index c21af4d1b..b89756fd2 100755 --- a/etc/rc.d/rc.udev +++ b/etc/rc.d/rc.udev @@ -107,10 +107,10 @@ case "$1" in cp --preserve=all --recursive --update /lib/udev/devices/* /dev 2>/dev/null # Add any locally defined additional device nodes: cp --preserve=all --recursive --update /etc/udev/devices/* /dev 2>/dev/null - log "Starting udevd: /sbin/udevd --daemon" + log "Starting udevd..." run udevd --daemon # Since udev is just now being started we want to use add events: - log "Triggering udev events: /sbin/udevadm trigger --action=add" + log "Triggering udev events..." # Call udevtrigger and udevsettle to do the device configuration: run udevadm trigger --type=subsystems --action=add run udevadm trigger --type=devices --action=add @@ -141,7 +141,7 @@ case "$1" in NEW=$(grep -Po $MAC $RAM | sort) # Bergware - set persistent rules of existing interfaces grep -B2 "$NEW" $ROM | /usr/bin/fromdos >$RAM - udevadm control --reload + run udevadm control --reload # Bergware - find the unique drivers currently in use by the interface(s) DRIVERS= for PORT in $(ls --indicator-style=none /sys/class/net | grep -P '^eth\d+$'); do @@ -166,15 +166,15 @@ case "$1" in # Update the hardware database index (/etc/udev/hwdb.bin), if possible: if touch /etc/udev/testfile 2>/dev/null; then rm -f /etc/udev/testfile - log "Updating hardware database index: udevadm hwdb --update" + log "Updating hardware database index..." run udevadm hwdb --update fi # Since udevd is running, most of the time we only need change events: - log "Triggering udev events: udevadm trigger --action=change" + log "Triggering udev events..." run udevadm trigger --type=subsystems --action=change run udevadm trigger --type=devices --action=change fi - udevadm settle --timeout=120 + run udevadm settle --timeout=120 ;; 'stop') log "Stopping udevd is STRONGLY discouraged and not supported."