#!/bin/bash ### === VALIDATE ARGUMENTS === if [[ $# -eq 0 ]]; then echo "Usage: $0 " echo "Example: $0 0 1 2 3 4" exit 1 fi NODES=("$@") ### === CONFIGURATION === # NODES=(0 1 2 3 4 9 14 19 24) # List of all participating node numbers, in order SUBNET_BASE="10.0" ### === GET SELF ID === HOSTNAME=$(hostname) # NODE_ID="${HOSTNAME//[!0-9]/}" # Extract numeric part of "apuXX" NODE_ID=$(echo "$HOSTNAME" | grep -o '[0-9]\+' | sed 's/^0*//') # Extract numeric part of "apuXX" NODE_IP=$((NODE_ID + 10)) NODE_INDEX=-1 # Find our index in the node list for idx in "${!NODES[@]}"; do if [[ "${NODES[$idx]}" -eq "$NODE_ID" ]]; then NODE_INDEX=$idx break fi done if [[ "$NODE_INDEX" -lt 0 ]]; then echo "Skip [ETH line topology]: Node ID $NODE_ID not found in node list." exit 1 fi ### === IP ASSIGNMENT === CONFIG_CMDS="" # Configure eth1 (to previous node) if (( NODE_INDEX > 0 )); then # Not the first node (has a left neighbor) # Get the previous node ID LEFT_SUBNET=${NODES[$NODE_INDEX]} # Previous node ID SELF_IP="${SUBNET_BASE}.${LEFT_SUBNET}.${NODE_IP}" CONFIG_CMDS+="ip addr flush dev eth1; " CONFIG_CMDS+="ip addr add ${SELF_IP}/24 dev eth1; ip link set eth1 up; " fi # Configure eth2 (to next node) if (( NODE_INDEX < ${#NODES[@]} - 1 )); then # Get the next node ID RIGHT_SUBNET=${NODES[$NODE_INDEX +1]} # Next node ID SELF_IP="${SUBNET_BASE}.${RIGHT_SUBNET}.${NODE_IP}" CONFIG_CMDS+="ip addr flush dev eth2; " CONFIG_CMDS+="ip addr add ${SELF_IP}/24 dev eth2; ip link set eth2 up; " fi # Enable forwarding if not endpoint if (( NODE_INDEX > 0 && NODE_INDEX < ${#NODES[@]} - 1 )); then CONFIG_CMDS+="sysctl -w net.ipv4.ip_forward=1; " fi ### === ROUTING TO OTHER NODES === for target_idx in "${!NODES[@]}"; do if [[ "${NODES[$target_idx]}" -eq "$NODE_ID" ]]; then continue; fi SUBNET_TARGET_0=-1 SUBNET_TARGET_1=-1 IP_TARGET=$((${NODES[$target_idx]} +10)) if (( target_idx < NODE_INDEX )); then # left hand SUBNET_TARGET_0=$((${NODES[$target_idx]})) SUBNET_TARGET_1=$((${NODES[$target_idx +1]})) SUBNET_NEXT=$((${NODES[$NODE_INDEX]})) IP_NEXT=$((${NODES[$NODE_INDEX -1]} + 10)) IFACE="eth1" else # right hand SUBNET_TARGET_0=$((${NODES[$target_idx]})) if (( target_idx < ${#NODES[@]} -1 )); then # last node? SUBNET_TARGET_1=$((${NODES[$target_idx +1]})) fi SUBNET_NEXT=$((${NODES[$NODE_INDEX +1]})) IP_NEXT=$((${NODES[$NODE_INDEX +1]} + 10)) IFACE="eth2" fi if (( SUBNET_TARGET_0 != SUBNET_NEXT && SUBNET_TARGET_0 != -1 )); then TARGET_IP="${SUBNET_BASE}.${SUBNET_TARGET_0}.${IP_TARGET}" NEXT_IP="${SUBNET_BASE}.${SUBNET_NEXT}.${IP_NEXT}" CONFIG_CMDS+="ip route add ${TARGET_IP}/32 via ${NEXT_IP} dev ${IFACE} || true; " fi if (( SUBNET_TARGET_1 != SUBNET_NEXT && SUBNET_TARGET_1 != -1 )); then TARGET_IP="${SUBNET_BASE}.${SUBNET_TARGET_1}.${IP_TARGET}" NEXT_IP="${SUBNET_BASE}.${SUBNET_NEXT}.${IP_NEXT}" CONFIG_CMDS+="ip route add ${TARGET_IP}/32 via ${NEXT_IP} dev ${IFACE} || true; " fi done ### === EXECUTE CONFIGURATION === echo "line configuration:" echo "NODES: ${NODES[*]}" IFS=';' read -ra COMMANDS <<< "$CONFIG_CMDS" for cmd in "${COMMANDS[@]}"; do cmd=$(echo "$cmd" | xargs) # Trim whitespace if [[ -n "$cmd" ]]; then echo "[Running] $cmd" eval "$cmd" fi done # eval "$CONFIG_CMDS" echo "[$HOSTNAME] Configuration complete."