From b4dba6ef55f6617aafcac656c01aba8b2f145228 Mon Sep 17 00:00:00 2001 From: AuxXxilium Date: Thu, 15 Feb 2024 23:46:55 +0100 Subject: [PATCH] network: rework ip/mac functions Signed-off-by: AuxXxilium --- files/initrd/opt/arc/arc.sh | 30 ++++++------ files/initrd/opt/arc/boot.sh | 44 ++++++++--------- files/initrd/opt/arc/include/network.sh | 37 +++++++-------- files/initrd/opt/arc/init.sh | 63 ++++++++++++++----------- 4 files changed, 91 insertions(+), 83 deletions(-) diff --git a/files/initrd/opt/arc/arc.sh b/files/initrd/opt/arc/arc.sh index 63b835c9..71a2a93f 100755 --- a/files/initrd/opt/arc/arc.sh +++ b/files/initrd/opt/arc/arc.sh @@ -192,7 +192,6 @@ function arcMenu() { writeConfigKey "arc.paturl" "" "${USER_CONFIG_FILE}" writeConfigKey "arc.pathash" "" "${USER_CONFIG_FILE}" writeConfigKey "arc.sn" "" "${USER_CONFIG_FILE}" - writeConfigKey "arc.mac1" "" "${USER_CONFIG_FILE}" if [ "${DT}" = "true" ]; then deleteConfigKey "cmdline.SataPortMap" "${USER_CONFIG_FILE}" deleteConfigKey "cmdline.DiskIdxMap" "${USER_CONFIG_FILE}" @@ -990,8 +989,8 @@ function cmdlineMenu() { 3) MSG="Note: (MAC will not be set to NIC, Only for activation services.)" sn="${SN}" - mac1="${MAC1}" - mac2="${MAC2}" + mac1="$(readConfigKey "mac.eth0" "${USER_CONFIG_FILE}")" # TO-DO + mac2="$(readConfigKey "mac.eth1" "${USER_CONFIG_FILE}")" while true; do dialog --backtitle "$(backtitle)" \ --title "Customize Mac" \ --extra-button --extra-label "Random" \ @@ -1011,9 +1010,9 @@ function cmdlineMenu() { SN="${sn}" writeConfigKey "sn" "${SN}" "${USER_CONFIG_FILE}" MAC1="${mac1}" - writeConfigKey "mac1" "${MAC1}" "${USER_CONFIG_FILE}" + writeConfigKey "mac.eth0" "${MAC1}" "${USER_CONFIG_FILE}" MAC2="${mac2}" - writeConfigKey "mac2" "${MAC2}" "${USER_CONFIG_FILE}" + writeConfigKey "mac.eth1" "${MAC2}" "${USER_CONFIG_FILE}" writeConfigKey "arc.builddone" "false" "${USER_CONFIG_FILE}" BUILDDONE="$(readConfigKey "arc.builddone" "${USER_CONFIG_FILE}")" break @@ -2422,11 +2421,11 @@ function fullsysinfo() { # Shows Networkdiag to user function networkdiag() { MSG="" - for iface in $(ls /sys/class/net/ | grep -v lo || true) - do - MSG+="Interface: ${iface}\n" - addr=$(getIP ${iface}) - netmask=$(ifconfig eth0 | grep inet | grep 255 | awk '{print $4}' | cut -f2 -d':') + ETHX=$(ls /sys/class/net/ | grep -v lo) || true + for ETH in ${ETHX}; do + MSG+="Interface: ${ETH}\n" + addr=$(getIP ${ETH}) + netmask=$(ifconfig ${ETH} | grep inet | grep 255 | awk '{print $4}' | cut -f2 -d':') MSG+="IP Address: ${addr}\n" MSG+="Netmask: ${netmask}\n" MSG+="\n" @@ -2755,7 +2754,6 @@ function resetLoader() { initConfigKey "arc.paturl" "" "${USER_CONFIG_FILE}" initConfigKey "arc.pathash" "" "${USER_CONFIG_FILE}" initConfigKey "arc.sn" "" "${USER_CONFIG_FILE}" - initConfigKey "arc.mac1" "" "${USER_CONFIG_FILE}" initConfigKey "arc.staticip" "false" "${USER_CONFIG_FILE}" initConfigKey "arc.ipv6" "false" "${USER_CONFIG_FILE}" initConfigKey "arc.offline" "false" "${USER_CONFIG_FILE}" @@ -2772,6 +2770,8 @@ function resetLoader() { initConfigKey "arc.odp" "false" "${USER_CONFIG_FILE}" initConfigKey "arc.hddsort" "false" "${USER_CONFIG_FILE}" initConfigKey "arc.version" "${ARC_VERSION}" "${USER_CONFIG_FILE}" + initConfigKey "ip" "{}" "${USER_CONFIG_FILE}" + initConfigKey "mac" "{}" "${USER_CONFIG_FILE}" deleteConfigKey "cmdline.SataPortMap" "${USER_CONFIG_FILE}" deleteConfigKey "cmdline.DiskIdxMap" "${USER_CONFIG_FILE}" deleteConfigKey "cmdline.sata_remap" "${USER_CONFIG_FILE}" @@ -2784,8 +2784,10 @@ function resetLoader() { fi CONFDONE="$(readConfigKey "arc.confdone" "${USER_CONFIG_FILE}")" BUILDDONE="$(readConfigKey "arc.builddone" "${USER_CONFIG_FILE}")" - dialog --backtitle "$(backtitle)" --colors --title "Reset Loader" \ - --msgbox "Clean is complete." 5 30 + dialog --backtitle "$(backtitle)" --title "Reset Loader" --aspect 18 \ + --yesno "Clean successful.\nReboot?" 0 0 + [ $? -ne 0 ] && continue + exec reboot clear } @@ -2878,7 +2880,7 @@ while true; do fi echo "p \"Arc Patch Settings \" " >>"${TMP_PATH}/menu" echo "S \"Custom StoragePanel \" " >>"${TMP_PATH}/menu" - echo "D \"DHCP/Static Loader IP \" " >>"${TMP_PATH}/menu" + #echo "D \"DHCP/Static Loader IP \" " >>"${TMP_PATH}/menu" TO-DO fi if [ "${ADVOPTS}" = "true" ]; then echo "5 \"\Z1Hide Advanced Options\Zn \" " >>"${TMP_PATH}/menu" diff --git a/files/initrd/opt/arc/boot.sh b/files/initrd/opt/arc/boot.sh index c2eb3cfa..3cdcc37b 100755 --- a/files/initrd/opt/arc/boot.sh +++ b/files/initrd/opt/arc/boot.sh @@ -94,11 +94,10 @@ done VID="$(readConfigKey "vid" "${USER_CONFIG_FILE}")" PID="$(readConfigKey "pid" "${USER_CONFIG_FILE}")" SN="$(readConfigKey "arc.sn" "${USER_CONFIG_FILE}")" -MAC1="$(readConfigKey "arc.mac1" "${USER_CONFIG_FILE}")" -MAC2="$(readConfigKey "arc.mac2" "${USER_CONFIG_FILE}")" KERNELLOAD="$(readConfigKey "arc.kernelload" "${USER_CONFIG_FILE}")" KERNELPANIC="$(readConfigKey "arc.kernelpanic" "${USER_CONFIG_FILE}")" DIRECTBOOT="$(readConfigKey "arc.directboot" "${USER_CONFIG_FILE}")" +ETHX=$(ls /sys/class/net/ | grep -v lo) || true declare -A CMDLINE @@ -129,16 +128,21 @@ CMDLINE['loglevel']="15" CMDLINE['log_buf_len']="32M" CMDLINE['sn']="${SN}" CMDLINE['net.ifnames']="0" -CMDLINE['netif_num']="0" +N=0 if [ "${MACSYS}" = "hardware" ]; then - [[ -z "${MAC1}" && -n "${MAC2}" ]] && MAC1=${MAC2} && MAC2="" # Sanity check - [ -n "${MAC1}" ] && CMDLINE['netif_num']="1" && CMDLINE['mac1']="${MAC1}" && CMDLINE['skip_vender_mac_interfaces']="0,1,2,3,4,5,6,7" - [ -n "${MAC2}" ] && CMDLINE['netif_num']="2" && CMDLINE['mac2']="${MAC2}" && CMDLINE['skip_vender_mac_interfaces']="0,1,2,3,4,5,6,7" + for ETH in ${ETHX}; do + MAC="$(readConfigKey "mac.${ETH}" "${USER_CONFIG_FILE}")" + [ -n "${MAC}" ] && N=$((${N} + 1)) && CMDLINE["mac${N}"]="${MAC}" + done + CMDLINE['skip_vender_mac_interfaces']="0,1,2,3,4,5,6,7" elif [ "${MACSYS}" = "custom" ]; then - [[ -z "${MAC1}" && -n "${MAC2}" ]] && MAC1=${MAC2} && MAC2="" # Sanity check - [ -n "${MAC1}" ] && CMDLINE['netif_num']="1" && CMDLINE['mac1']="${MAC1}" && CMDLINE['skip_vender_mac_interfaces']="1,2,3,4,5,6,7" - [ -n "${MAC2}" ] && CMDLINE['netif_num']="2" && CMDLINE['mac2']="${MAC2}" && CMDLINE['skip_vender_mac_interfaces']="2,3,4,5,6,7" + for ETH in ${ETHX}; do + MAC="$(readConfigKey "mac.${ETH}" "${USER_CONFIG_FILE}")" + [ -n "${MAC}" ] && N=$((${N} + 1)) && CMDLINE["mac${N}"]="${MAC}" + done + CMDLINE['skip_vender_mac_interfaces']="$(seq -s, ${N} 7)" fi +CMDLINE['netif_num']="${N}" # Read cmdline while IFS=': ' read -r KEY VALUE; do @@ -165,30 +169,29 @@ if [ "${DIRECTBOOT}" = "true" ]; then echo -e " \033[1;34mReboot with Directboot\033[0m" exec reboot elif [ "${DIRECTBOOT}" = "false" ]; then - ETHX=$(ls /sys/class/net/ | grep -v lo) || true - ETH=$(echo ${ETHX} | wc -w) STATICIP="$(readConfigKey "arc.staticip" "${USER_CONFIG_FILE}")" BOOTIPWAIT="$(readConfigKey "arc.bootipwait" "${USER_CONFIG_FILE}")" - echo -e " \033[1;34mDetected ${ETH} NIC.\033[0m \033[1;37mWaiting for Connection:\033[0m" - for N in ${ETHX}; do + echo -e " \033[1;34mDetected ${N} NIC.\033[0m \033[1;37mWaiting for Connection:\033[0m" + for ETH in ${ETHX}; do IP="" - DRIVER=$(ls -ld /sys/class/net/${N}/device/driver 2>/dev/null | awk -F '/' '{print $NF}') + DRIVER=$(ls -ld /sys/class/net/${ETH}/device/driver 2>/dev/null | awk -F '/' '{print $NF}') COUNT=0 while true; do - if [[ "${STATICIP}" = "true" && "${N}" = "eth0" && -n "${ARCIP}" ]]; then - ARCIP="$(readConfigKey "arc.ip" "${USER_CONFIG_FILE}")" + ARCIP="$(readConfigKey "ip.${ETH}" "${USER_CONFIG_FILE}")" + if [[ "${STATICIP}" = "true" && -n "${ARCIP}" ]]; then NETMASK="$(readConfigKey "arc.netmask" "${USER_CONFIG_FILE}")" IP="${ARCIP}" NETMASK=$(convert_netmask "${NETMASK}") - ip addr add ${IP}/${NETMASK} dev eth0 + ip addr add ${IP}/${NETMASK} dev ${ETH} MSG="STATIC" else - IP="$(getIP ${N})" + IP="$(getIP ${ETH})" MSG="DHCP" fi if [ -n "${IP}" ]; then - SPEED=$(ethtool ${N} | grep "Speed:" | awk '{print $2}') + SPEED=$(ethtool ${ETH} | grep "Speed:" | awk '{print $2}') echo -e "\r \033[1;37m${DRIVER} (${SPEED} | ${MSG}):\033[0m Access \033[1;34mhttp://${IP}:5000\033[0m to connect to DSM via web." + ethtool -s ${ETH} wol g 2>/dev/null [ ! -n "${IPCON}" ] && IPCON="${IP}" break fi @@ -197,13 +200,12 @@ elif [ "${DIRECTBOOT}" = "false" ]; then break fi sleep 3 - if ethtool ${N} | grep 'Link detected' | grep -q 'no'; then + if ethtool ${ETH} | grep 'Link detected' | grep -q 'no'; then echo -e "\r \033[1;37m${DRIVER}:\033[0m NOT CONNECTED" break fi COUNT=$((${COUNT} + 3)) done - ethtool -s ${N} wol g 2>/dev/null done BOOTWAIT=1 w | awk '{print $1" "$2" "$4" "$5" "$6}' >WB diff --git a/files/initrd/opt/arc/include/network.sh b/files/initrd/opt/arc/include/network.sh index c02097e1..a13e4b69 100755 --- a/files/initrd/opt/arc/include/network.sh +++ b/files/initrd/opt/arc/include/network.sh @@ -17,36 +17,37 @@ function getnet() { done dialog --clear --backtitle "$(backtitle)" \ --nocancel --title "Mac Setting" \ - --menu "Choose a MAC" 0 0 0 \ + --menu "Choose a MAC for eth0" 0 0 0 \ --file "${TMP_PATH}/opts" \ 2>"${TMP_PATH}/resp" resp="$(<"${TMP_PATH}/resp")" [ -z "${resp}" ] && return 1 MAC="${resp}" - writeConfigKey "arc.mac1" "${MAC}" "${USER_CONFIG_FILE}" + writeConfigKey "mac.eth0" "${MAC}" "${USER_CONFIG_FILE}" elif [ "${ARCPATCH}" = "random" ]; then - # Generate Random Mac - MAC=($(generateMacAddress "${MODEL}" 1)) - writeConfigKey "arc.mac1" "${MAC}" "${USER_CONFIG_FILE}" + for ETH in ${ETHX}; do + MACS=$(generateMacAddress "${MODEL}" 1) + writeConfigKey "mac.${ETH}" "${MAC}" "${USER_CONFIG_FILE}" + done elif [ "${ARCPATCH}" = "user" ]; then # User Mac - MAC="$(cat /sys/class/net/eth0/address | sed 's/://g')" RET=1 - for N in ${ETH}; do + for ETH in ${ETHX}; do + MAC="$(cat /sys/class/net/${ETH}/address | sed 's/://g')" dialog --backtitle "$(backtitle)" --title "Mac Setting" \ - --inputbox "Type a custom MAC for ${N}. NIC.\n Eq. 001132123456" 0 0 "${MAC}"\ + --inputbox "Type a custom MAC for ${ETH}. NIC.\n Eq. 001132123456" 0 0 "${MAC}"\ 2>"${TMP_PATH}/resp" RET=$? [ ${RET} -ne 0 ] && break 2 MAC="$(<"${TMP_PATH}/resp")" - [ -z "${MAC}" ] && MAC="$(readConfigKey "arc.mac${N}" "${USER_CONFIG_FILE}")" - [ -z "${MAC}" ] && MAC="$(cat /sys/class/net/eth0/address | sed 's/://g')" + [ -z "${MAC}" ] && MAC="$(readConfigKey "mac.${ETH}" "${USER_CONFIG_FILE}")" + [ -z "${MAC}" ] && MAC="$(cat /sys/class/net/${ETH}/address | sed 's/://g')" MAC="$(echo "${MAC}" | sed "s/:\|-\| //g")" - writeConfigKey "arc.mac${N}" "${MAC}" "${USER_CONFIG_FILE}" - writeConfigKey "arc.macsys" "custom" "${USER_CONFIG_FILE}" + writeConfigKey "mac.${ETH}" "${MAC}" "${USER_CONFIG_FILE}" [ ${#MAC} -eq 12 ] && break dialog --backtitle "$(backtitle)" --title "Mac Setting" --msgbox "Invalid MAC" 0 0 done + writeConfigKey "arc.macsys" "custom" "${USER_CONFIG_FILE}" fi # Ask for Macsys dialog --clear --backtitle "$(backtitle)" \ @@ -67,12 +68,8 @@ function getnet() { # Get Amount of NIC ETHX=$(ls /sys/class/net/ | grep -v lo) || true -ETH=$(echo ${ETHX} | wc -w) -writeConfigKey "device.nic" "${ETH}" "${USER_CONFIG_FILE}" # Get actual IP -ARCIP="$(readConfigKey "arc.ip" "${USER_CONFIG_FILE}")" -if [ -n "${ARCIP}" ]; then - IPCON="${ARCIP}" -else - IPCON="$(getIP)" -fi \ No newline at end of file +for ETH in ${ETHX}; do + IPCON="$(readConfigKey "ip.${ETH}" "${USER_CONFIG_FILE}")" + [ -n "${IPCON}" ] && break +done \ No newline at end of file diff --git a/files/initrd/opt/arc/init.sh b/files/initrd/opt/arc/init.sh index 2a129c61..1e43f375 100755 --- a/files/initrd/opt/arc/init.sh +++ b/files/initrd/opt/arc/init.sh @@ -39,7 +39,6 @@ initConfigKey "arc.builddone" "false" "${USER_CONFIG_FILE}" initConfigKey "arc.paturl" "" "${USER_CONFIG_FILE}" initConfigKey "arc.pathash" "" "${USER_CONFIG_FILE}" initConfigKey "arc.sn" "" "${USER_CONFIG_FILE}" -initConfigKey "arc.mac1" "" "${USER_CONFIG_FILE}" initConfigKey "arc.staticip" "false" "${USER_CONFIG_FILE}" initConfigKey "arc.ipv6" "false" "${USER_CONFIG_FILE}" initConfigKey "arc.offline" "false" "${USER_CONFIG_FILE}" @@ -57,28 +56,35 @@ initConfigKey "arc.odp" "false" "${USER_CONFIG_FILE}" initConfigKey "arc.hddsort" "false" "${USER_CONFIG_FILE}" initConfigKey "arc.version" "${ARC_VERSION}" "${USER_CONFIG_FILE}" initConfigKey "device" "{}" "${USER_CONFIG_FILE}" +initConfigKey "ip" "{}" "${USER_CONFIG_FILE}" +initConfigKey "mac" "{}" "${USER_CONFIG_FILE}" # Init Network ETHX=$(ls /sys/class/net/ | grep -v lo) || true -ETH=$(echo ${ETHX} | wc -w) -# No network devices -[ ${ETH} -le 0 ] && die "No NIC found! - Loader does not work without Network connection." MACSYS="$(readConfigKey "arc.macsys" "${USER_CONFIG_FILE}")" -if [ "${MACSYS}" = "custom" ]; then - MACR="$(cat /sys/class/net/eth0/address | sed 's/://g')" - MACA="$(readConfigKey "arc.mac1" "${USER_CONFIG_FILE}")" - if [[ -n "${MACA}" && "${MACA}" != "${MACR}" ]]; then - MAC="${MACA:0:2}:${MACA:2:2}:${MACA:4:2}:${MACA:6:2}:${MACA:8:2}:${MACA:10:2}" - echo "Setting eth0 MAC to ${MAC}" - ip link set dev eth0 address "${MAC}" >/dev/null 2>&1 && - (/etc/init.d/S41dhcpcd restart >/dev/null 2>&1 &) || true - sleep 2 - elif [ -z "${MACA}" ]; then - # Write real Mac to cmdline config - writeConfigKey "arc.mac1" "${MACR}" "${USER_CONFIG_FILE}" +# Write Mac to config +N=0 +for ETH in ${ETHX}; do + MACR="$(cat /sys/class/net/${ETH}/address | sed 's/://g')" + initConfigKey "mac.${ETH}" "${MACR}" "${USER_CONFIG_FILE}" + if [ "${MACSYS}" = "custom" ]; then + MACA="$(readConfigKey "mac.${ETH}" "${USER_CONFIG_FILE}")" + if [[ -n "${MACA}" && "${MACA}" != "${MACR}" ]]; then + MAC="${MACA:0:2}:${MACA:2:2}:${MACA:4:2}:${MACA:6:2}:${MACA:8:2}:${MACA:10:2}" + echo "Setting ${ETH} MAC to ${MAC}" + ip link set dev ${ETH} address "${MAC}" >/dev/null 2>&1 && + (/etc/init.d/S41dhcpcd restart >/dev/null 2>&1 &) || true + sleep 2 + fi + echo fi - echo -fi + ethtool -s ${ETH} wol g 2>/dev/null + N=$((${N} + 1)) +done +# Write NIC Amount to config +writeConfigKey "device.nic" "${N}" "${USER_CONFIG_FILE}" +# No network devices +[ ${N} -le 0 ] && die "No NIC found! - Loader does not work without Network connection." # Get the VID/PID if we are in USB VID="0x46f4" @@ -128,26 +134,28 @@ echo STATICIP="$(readConfigKey "arc.staticip" "${USER_CONFIG_FILE}")" BOOTIPWAIT="$(readConfigKey "arc.bootipwait" "${USER_CONFIG_FILE}")" [ -z "${BOOTIPWAIT}" ] && BOOTIPWAIT=20 -echo -e "\033[1;34mDetected ${ETH} NIC.\033[0m \033[1;37mWaiting for Connection:\033[0m" -for N in ${ETHX}; do +echo -e "\033[1;34mDetected ${N} NIC.\033[0m \033[1;37mWaiting for Connection:\033[0m" +for ETH in ${ETHX}; do IP="" - DRIVER=$(ls -ld /sys/class/net/${N}/device/driver 2>/dev/null | awk -F '/' '{print $NF}') + DRIVER=$(ls -ld /sys/class/net/${ETH}/device/driver 2>/dev/null | awk -F '/' '{print $NF}') COUNT=0 while true; do - if [[ "${STATICIP}" = "true" && "${N}" = "eth0" && -n "${ARCIP}" ]]; then - ARCIP="$(readConfigKey "arc.ip" "${USER_CONFIG_FILE}")" + ARCIP="$(readConfigKey "ip.${ETH}" "${USER_CONFIG_FILE}")" + if [[ "${STATICIP}" = "true" && -n "${ARCIP}" ]]; then NETMASK="$(readConfigKey "arc.netmask" "${USER_CONFIG_FILE}")" IP="${ARCIP}" NETMASK=$(convert_netmask "${NETMASK}") - ip addr add ${IP}/${NETMASK} dev eth0 + ip addr add ${IP}/${NETMASK} dev ${ETH} MSG="STATIC" else - IP="$(getIP ${N})" + IP="$(getIP ${ETH})" MSG="DHCP" fi if [ -n "${IP}" ]; then - SPEED=$(ethtool ${N} | grep "Speed:" | awk '{print $2}') + SPEED=$(ethtool ${ETH} | grep "Speed:" | awk '{print $2}') + writeConfigKey "ip.${ETH}" "${IP}" "${USER_CONFIG_FILE}" echo -e "\r\033[1;37m${DRIVER} (${SPEED} | ${MSG}):\033[0m Access \033[1;34mhttp://${IP}:7681\033[0m to connect to Arc via web." + ethtool -s ${ETH} wol g 2>/dev/null break fi if [ ${COUNT} -gt ${BOOTIPWAIT} ]; then @@ -155,13 +163,12 @@ for N in ${ETHX}; do break fi sleep 3 - if ethtool ${N} | grep 'Link detected' | grep -q 'no'; then + if ethtool ${ETH} | grep 'Link detected' | grep -q 'no'; then echo -e "\r\033[1;37m${DRIVER}:\033[0m NOT CONNECTED" break fi COUNT=$((${COUNT} + 3)) done - ethtool -s ${N} wol g 2>/dev/null done # Inform user