William A. Kennington III | c7454fb | 2021-09-14 16:01:37 -0700 | [diff] [blame] | 1 | #!/bin/bash |
| 2 | # Copyright 2021 Google LLC |
| 3 | # |
| 4 | # Licensed under the Apache License, Version 2.0 (the "License"); |
| 5 | # you may not use this file except in compliance with the License. |
| 6 | # You may obtain a copy of the License at |
| 7 | # |
| 8 | # http://www.apache.org/licenses/LICENSE-2.0 |
| 9 | # |
| 10 | # Unless required by applicable law or agreed to in writing, software |
| 11 | # distributed under the License is distributed on an "AS IS" BASIS, |
| 12 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| 13 | # See the License for the specific language governing permissions and |
| 14 | # limitations under the License. |
| 15 | |
William A. Kennington III | 37e6f39 | 2022-05-16 16:19:11 -0700 | [diff] [blame] | 16 | [ ! -e /usr/share/gbmc-br-lib.sh ] && exit |
| 17 | |
William A. Kennington III | c7454fb | 2021-09-14 16:01:37 -0700 | [diff] [blame] | 18 | source /usr/share/network/lib.sh || exit |
William A. Kennington III | 37e6f39 | 2022-05-16 16:19:11 -0700 | [diff] [blame] | 19 | source /usr/share/gbmc-br-lib.sh || exit |
William A. Kennington III | c7454fb | 2021-09-14 16:01:37 -0700 | [diff] [blame] | 20 | |
William A. Kennington III | 5b4b4f8 | 2021-10-15 12:22:08 -0700 | [diff] [blame] | 21 | NCSI_IF='@NCSI_IF@' |
| 22 | |
William A. Kennington III | c7454fb | 2021-09-14 16:01:37 -0700 | [diff] [blame] | 23 | old_pfx= |
William A. Kennington III | 5b4b4f8 | 2021-10-15 12:22:08 -0700 | [diff] [blame] | 24 | old_fqdn= |
William A. Kennington III | c7454fb | 2021-09-14 16:01:37 -0700 | [diff] [blame] | 25 | old_rtr= |
| 26 | |
William A. Kennington III | 5b4b4f8 | 2021-10-15 12:22:08 -0700 | [diff] [blame] | 27 | set_host() { |
| 28 | [ -n "$host" -a -n "$domain" -a -n "$hextet" ] || return |
William A. Kennington III | c7454fb | 2021-09-14 16:01:37 -0700 | [diff] [blame] | 29 | |
William A. Kennington III | 5b4b4f8 | 2021-10-15 12:22:08 -0700 | [diff] [blame] | 30 | local fqdn="$host-n$hextet.$domain" |
| 31 | [ "$fqdn" != "$old_fqdn" ] || return |
| 32 | old_fqdn="$fqdn" |
William A. Kennington III | c7454fb | 2021-09-14 16:01:37 -0700 | [diff] [blame] | 33 | |
William A. Kennington III | 5b4b4f8 | 2021-10-15 12:22:08 -0700 | [diff] [blame] | 34 | echo "Found hostname $fqdn" >&2 |
| 35 | hostnamectl set-hostname "$fqdn" || true |
| 36 | } |
William A. Kennington III | c7454fb | 2021-09-14 16:01:37 -0700 | [diff] [blame] | 37 | |
William A. Kennington III | 5b4b4f8 | 2021-10-15 12:22:08 -0700 | [diff] [blame] | 38 | set_net() { |
| 39 | [ -n "$pfx" -a -n "$rtr" ] || return |
| 40 | [[ "$pfx" != "$old_pfx" || "$rtr" != "$old_rtr" ]] || return |
| 41 | old_pfx="$pfx" |
| 42 | old_rtr="$rtr" |
| 43 | |
| 44 | echo "Found prefix $pfx from $rtr" >&2 |
| 45 | |
William A. Kennington III | 7843a81 | 2021-12-09 14:17:10 -0800 | [diff] [blame] | 46 | # We no longer need NCSId if we are in this configuration |
| 47 | systemctl stop --no-block ncsid@"$NCSI_IF" || true |
| 48 | |
William A. Kennington III | 37e6f39 | 2022-05-16 16:19:11 -0700 | [diff] [blame] | 49 | # Save the IP address for the interface |
| 50 | gbmc_br_set_ip "$pfx" || true |
William A. Kennington III | 71fc189 | 2021-12-13 14:32:20 -0800 | [diff] [blame] | 51 | |
| 52 | # DHCP Relay workaround until alternate source port is supported |
| 53 | # TODO: Remove this once internal relaying cleanups land |
| 54 | gbmc-ncsi-smartnic-wa.sh || true |
William A. Kennington III | 5b4b4f8 | 2021-10-15 12:22:08 -0700 | [diff] [blame] | 55 | } |
William A. Kennington III | c7454fb | 2021-09-14 16:01:37 -0700 | [diff] [blame] | 56 | |
William A. Kennington III | 5b4b4f8 | 2021-10-15 12:22:08 -0700 | [diff] [blame] | 57 | w=60 |
| 58 | while true; do |
| 59 | start=$SECONDS |
| 60 | while read line; do |
| 61 | if [ -z "$line" ]; then |
| 62 | hextet= |
| 63 | pfx= |
| 64 | host= |
| 65 | domain= |
| 66 | elif [[ "$line" =~ ^Prefix' '*:' '*(.*)/([0-9]+)$ ]]; then |
| 67 | t_pfx="${BASH_REMATCH[1]}" |
| 68 | t_pfx_len="${BASH_REMATCH[2]}" |
| 69 | ip_to_bytes t_pfx_b "$t_pfx" || continue |
| 70 | (( t_pfx_len == 76 && t_pfx_b[8] & 0xfd == 0xfd )) || continue |
| 71 | (( t_pfx_b[9] |= 1 )) |
| 72 | hextet="fd$(printf '%02x' ${t_pfx_b[9]})" |
| 73 | pfx="$(ip_bytes_to_str t_pfx_b)" |
William A. Kennington III | ba60019 | 2023-02-15 16:42:29 -0800 | [diff] [blame] | 74 | elif [[ "$line" =~ ^'DNS search list'' '*:' '*([^.]+)(.*[.]google[.]com)$ ]]; then |
| 75 | # Ideally, we use PCRE and with lookahead and can do this in a single regex |
| 76 | # ^([a-zA-Z0-9-]+(?=-n[a-fA-F0-9]{1,4})|[a-zA-Z0-9-]+(?!-n[a-fA-F0-9]{1,4}))[^.]*[.]((?:[a-zA-Z0-9]*[.])*google[.]com)$ |
| 77 | # Instead we do multiple steps to extract the needed info |
William A. Kennington III | 5b4b4f8 | 2021-10-15 12:22:08 -0700 | [diff] [blame] | 78 | host="${BASH_REMATCH[1]}" |
William A. Kennington III | ba60019 | 2023-02-15 16:42:29 -0800 | [diff] [blame] | 79 | domain="${BASH_REMATCH[2]#.}" |
| 80 | if [[ "$host" =~ (-n[a-fA-F0-9]{1,4})$ ]]; then |
| 81 | host="${host%${BASH_REMATCH[1]}}" |
| 82 | fi |
William A. Kennington III | 5b4b4f8 | 2021-10-15 12:22:08 -0700 | [diff] [blame] | 83 | elif [[ "$line" =~ ^from' '(.*)$ ]]; then |
| 84 | rtr="${BASH_REMATCH[1]}" |
| 85 | set_net || true |
| 86 | set_host || true |
William A. Kennington III | c7454fb | 2021-09-14 16:01:37 -0700 | [diff] [blame] | 87 | fi |
William A. Kennington III | 5b4b4f8 | 2021-10-15 12:22:08 -0700 | [diff] [blame] | 88 | done < <(rdisc6 -d -m "$NCSI_IF" -w $(( w * 1000 )) 2>/dev/null) |
William A. Kennington III | c7454fb | 2021-09-14 16:01:37 -0700 | [diff] [blame] | 89 | # If rdisc6 exits early we still want to wait the full `w` time before |
| 90 | # starting again. |
| 91 | (( timeout = start + w - SECONDS )) |
| 92 | sleep $(( timeout < 0 ? 0 : timeout )) |
| 93 | done |