diff --git a/setup.sh b/setup.sh index 1b7a2e06..de56f60c 100644 --- a/setup.sh +++ b/setup.sh @@ -1,61 +1,74 @@ #!/bin/sh -NET="192.168.100.0/24" -echo "Searching talos nodes in $NET..." +default_scan_networks=$(ip -o route | awk '$3 !~ /^(docker|cni)/ && $2 == "dev" {print $1}' | paste -d ' ' -s) +scan_networks=$(dialog --inputbox "Enter networks to scan:" 8 80 "$default_scan_networks" 3>&1 1>&2 2>&3) || exit 0 +scan_networks=$(echo "$scan_networks" | tr , " ") -CANDIDATE_NODES=$(nmap -Pn -n -p 50000 $NET -vv | awk '/Discovered open port/ {print $NF}') +node_list_file=$(mktemp) +{ + printf "%s\nXXX\n%s\n%s\nXXX\n" "20" "Searching talos nodes in $scan_networks..." + CANDIDATE_NODES=$(nmap -Pn -n -p 50000 $scan_networks -vv | awk '/Discovered open port/ {print $NF}') -echo found: -printf " - %s\n" $CANDIDATE_NODES + #echo found: + #printf " - %s\n" $CANDIDATE_NODES -echo "Filtering nodes in maintenance mode..." -NODES= -for node in $CANDIDATE_NODES; do - if talosctl -n "$node" get info -i >/dev/null 2>/dev/null; then - NODES="$NODES $node" - fi -done + printf "%s\nXXX\n%s\n%s\nXXX\n" "50" "Filtering nodes in maintenance mode..." + NODES= + for node in $CANDIDATE_NODES; do + if talosctl -n "$node" get info -i >/dev/null 2>/dev/null; then + NODES="$NODES $node" + fi + done + + #echo filtered: + #printf " - %s\n" $NODES -echo filtered: -printf " - %s\n" $NODES + printf "%s\nXXX\n%s\n%s\nXXX\n" "70" "Collecting information about the nodes..." + node_list=$( + seen= + for node in $NODES; do + mac=$(talosctl -n "$node" get hardwareaddresses.net.talos.dev first -i -o jsonpath={.spec.hardwareAddr}) + case " $seen " in *" $mac "*) continue ;; esac # remove duplicated nodes + seen="$seen $mac" + name="$node" + hostname=$(talosctl -n "$node" get hostname -i -o jsonpath='{.spec.hostname}') + if [ -n "$hostname" ]; then + name="$name ($hostname)" + fi + manufacturer=$(talosctl -n "$node" get cpu -i -o jsonpath={.spec.manufacturer} | head -n1) + cpu=$(talosctl -n "$node" get cpu -i -o jsonpath={.spec.threadCount} -i | awk '{sum+=$1;} END{print sum "-core";}') + ram=$(talosctl -n "$node" get ram -o jsonpath={.spec.sizeMiB} -i | awk '{sum+=$1;} END{print sum/1024 "GB";}') + disks=$(talosctl -n "$node" disks -i | awk -F' +' 'NR>1 {print $1 ":" $9}' | sed 's|^/dev/||' | tr -d ' ' | paste -d, -s) + echo "\"$name\"" "\"$mac, $cpu ${manufacturer:-CPU}, RAM: $ram, Disks: [$disks]\"" + done + ) + + echo "$node_list" > "$node_list_file" +} | dialog --gauge "Please wait" 10 70 0 3>&1 1>&2 2>&3 + +node_list=$(cat "$node_list_file") + +if [ -z "$node_list" ]; then + dialog --msgbox "No talos nodes in maintenance mode found! + +Searched networks: $scan_networks" 10 60 + exit 1 +fi # Screen 1: node list - -node_list=$( - seen= - for node in $NODES; do - mac=$(talosctl -n "$node" get hardwareaddresses.net.talos.dev first -i -o jsonpath={.spec.hardwareAddr}) - case " $seen " in *" $mac "*) continue ;; esac # remove duplicated nodes - seen="$seen $mac" - name="$node" - hostname=$(talosctl -n "$node" get hostname -i -o jsonpath='{.spec.hostname}') - if [ -n "$hostname" ]; then - name="$name ($hostname)" - fi - manufacturer=$(talosctl -n "$node" get cpu -i -o jsonpath={.spec.manufacturer} | head -n1) - cpu=$(talosctl -n "$node" get cpu -i -o jsonpath={.spec.threadCount} -i | awk '{sum+=$1;} END{print sum "-core";}') - ram=$(talosctl -n "$node" get ram -o jsonpath={.spec.sizeMiB} -i | awk '{sum+=$1;} END{print sum/1024 "GB";}') - disks=$(talosctl -n "$node" disks -i | awk -F' +' 'NR>1 {print $1 ":" $9}' | sed 's|^/dev/||' | tr -d ' ' | paste -d, -s) - echo "\"$name\"" "\"$mac, $cpu ${manufacturer:-CPU}, RAM: $ram, Disks: [$disks]\"" - done -) - node=$(echo "$node_list" | dialog --menu "choose node to bootstrap" 0 0 0 --file /dev/stdin 3>&1 1>&2 2>&3) || exit 0 # cut hostname node=$(echo "$node" | awk '{print $1}') # Screen 2: Choose hostname - default_hostname=$(talosctl -n "$node" get hostname -i -o jsonpath='{.spec.hostname}') hostname=$(dialog --inputbox "Enter hostname:" 8 40 "$default_hostname" 3>&1 1>&2 2>&3) || exit 0 # Screen 3: Choose disk to install - disks_list=$(talosctl -n "$node" disks -i | awk 'NR>1 {printf "\"" $1 "\""; $1=""; print " \"" $0 "\""}') disk=$(echo "$disks_list" | dialog --menu "choose disk to install" 0 0 0 --file /dev/stdin 3>&1 1>&2 2>&3) # Screen 4: Choose interface - link_list=$(talosctl -n "$node" get link -i | awk -F' +' 'NR>1 && $4 ~ /^(ID|eno|eth|enp|enx)/ {print $4 "|" $(NF-2)}') address_list=$(talosctl -n "$node" get addresses -i | awk 'NR>1 {print $NF " " $(NF-1)}') || exit 0 @@ -80,6 +93,7 @@ interface=$(echo "$interface_list" | dialog --default-item "$default_interface" # Screen 5: configure networks default_addresses=$(talosctl -n "$node" get nodeaddress default -i -o jsonpath={.spec.addresses[*]} | paste -d, -) addresses=$(dialog --inputbox "Enter addresses:" 8 40 "$default_addresses" 3>&1 1>&2 2>&3) || exit 0 +addresses=$(echo "$dns_servers" | paste -d, -s) address=$(echo "$addresses" | awk -F/ '{print $1}') # Screen 6: configure default gateway @@ -89,6 +103,7 @@ gateway=$(dialog --inputbox "Enter gateway:" 8 40 "$default_gateway" 3>&1 1>&2 2 # Screen 7: configure dns servers default_dns_servers=$(talosctl -n 192.168.100.127 get resolvers resolvers -i -o jsonpath='{.spec.dnsServers[*]}' | paste -d, -s) dns_servers=$(dialog --inputbox "Enter dns servers:" 8 80 "$default_dns_servers" 3>&1 1>&2 2>&3) || exit 0 +dns_servers=$(echo "$dns_servers" | paste -d, -s) # Screen 9: Confirm configuration machine_config=$(cat <