f16725e 3 months ago History
1 contributor
129 lines | 4.511kb
#!/usr/bin/env bash
# deploy_tb.sh — Thunderbolt bridge deploy (Bash 3 compatible)

set -eo pipefail

# ---------- EDIT THESE ----------
get_mgmt_ip() {
  case "$1" in
    baobab) echo "192.168.2.91" ;;
    ebony)  echo "192.168.2.92" ;;
    tapia)  echo "192.168.2.93" ;;
    *)      echo "" ;;
  esac
}
get_tb_ip() {
  case "$1" in
    baobab) echo "192.168.10.91" ;;
    ebony)  echo "192.168.10.92" ;;
    tapia)  echo "192.168.10.93" ;;
    *)      echo "" ;;
  esac
}
# --------------------------------

TARGETS=("$@")
if [ ${#TARGETS[@]} -eq 0 ]; then
  TARGETS=(baobab ebony tapia)
fi

SSH_USER="root"
SSH_OPTS="-o BatchMode=yes -o ConnectTimeout=5 -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null"
BASE_DIR="$(pwd)"

COMMON_UDEV="$BASE_DIR/common/udev/rules.d/90-thunderbolt-net-systemd.rules"
COMMON_SVC1="$BASE_DIR/common/systemd/system/tb-enlist@.service"
COMMON_SVC2="$BASE_DIR/common/systemd/system/tb-bridge.service"
COMMON_SVC3="$BASE_DIR/common/systemd/system/tb-recover.service"
COMMON_TMR1="$BASE_DIR/common/systemd/system/tb-recover.timer"
COMMON_BIN1="$BASE_DIR/common/sbin/tb-recover.sh"

require() {
  for f in "$@"; do
    [ -f "$f" ] || { echo "Missing required file: $f" >&2; exit 1; }
  done
}

# try mgmt IP first, then TB IP; print chosen IP and return 0 if SSH works
pick_ip() {
  local host="$1" ip=""
  ip="$(get_mgmt_ip "$host")"
  if [ -n "$ip" ] && ssh $SSH_OPTS -q "${SSH_USER}@${ip}" true 2>/dev/null; then
    echo "$ip"; return 0
  fi
  ip="$(get_tb_ip "$host")"
  if [ -n "$ip" ] && ssh $SSH_OPTS -q "${SSH_USER}@${ip}" true 2>/dev/null; then
    echo "$ip"; return 0
  fi
  # fall back to mgmt for error messaging
  ip="$(get_mgmt_ip "$host")"
  [ -n "$ip" ] && echo "$ip"
  return 1
}

deploy_node() {
  local host="$1"
  local node_dir="$BASE_DIR/$host"
  [ -d "$node_dir" ] || { echo "No node directory: $node_dir" >&2; exit 1; }

  local ip
  ip="$(pick_ip "$host")" || {
    echo "!! [$host] SSH not reachable on $(get_mgmt_ip "$host") or $(get_tb_ip "$host")). Fix IPs or firewall." >&2
    exit 1
  }

  echo "==> [$host@$ip] prepare remote dirs"
  ssh $SSH_OPTS "${SSH_USER}@${ip}" "mkdir -p /etc/udev/rules.d /etc/systemd/system /etc/network/interfaces.d /usr/local/sbin"

  echo "==> [$host@$ip] copy COMMON files"
  scp -q "$COMMON_UDEV" "${SSH_USER}@${ip}:/etc/udev/rules.d/90-thunderbolt-net-systemd.rules"
  scp -q "$COMMON_SVC1" "${SSH_USER}@${ip}:/etc/systemd/system/tb-enlist@.service"
  scp -q "$COMMON_SVC2" "${SSH_USER}@${ip}:/etc/systemd/system/tb-bridge.service"
  scp -q "$COMMON_SVC3" "${SSH_USER}@${ip}:/etc/systemd/system/tb-recover.service"
  scp -q "$COMMON_TMR1" "${SSH_USER}@${ip}:/etc/systemd/system/tb-recover.timer"
  scp -q "$COMMON_BIN1" "${SSH_USER}@${ip}:/usr/local/sbin/tb-recover.sh"

  echo "==> [$host@$ip] copy NODE config"
  require "$node_dir/etc/network/interfaces" "$node_dir/etc/network/interfaces.d/10-thunderbolt"
  scp -q "$node_dir/etc/network/interfaces" "${SSH_USER}@${ip}:/etc/network/interfaces"
  scp -q "$node_dir/etc/network/interfaces.d/10-thunderbolt" "${SSH_USER}@${ip}:/etc/network/interfaces.d/10-thunderbolt"

  echo "==> [$host@$ip] enable + reload"
  ssh $SSH_OPTS "${SSH_USER}@${ip}" bash -s <<'EOF'
set -e
chmod 0644 /etc/udev/rules.d/90-thunderbolt-net-systemd.rules
chmod 0644 /etc/systemd/system/tb-enlist@.service
chmod 0644 /etc/systemd/system/tb-bridge.service
chmod 0644 /etc/systemd/system/tb-recover.service
chmod 0644 /etc/systemd/system/tb-recover.timer
chmod 0755 /usr/local/sbin/tb-recover.sh
systemctl daemon-reload
udevadm control --reload
command -v ifreload >/dev/null 2>&1 && ifreload -a || true
systemctl enable --now tb-bridge.service
systemctl enable --now tb-recover.timer
systemctl start tb-recover.service
udevadm trigger --subsystem-match=net --action=add
EOF

  echo "==> [$host@$ip] status"
  ssh $SSH_OPTS "${SSH_USER}@${ip}" bash -s <<'EOF'
set -e
systemctl --no-pager --plain --full status tb-bridge.service | sed -n '1,6p'
systemctl --no-pager --plain --full status tb-recover.timer | sed -n '1,8p'
systemctl --no-pager --plain --full list-units 'tb-enlist@*.service' | sed -n '1,12p' || true
ip -d link show thunderbridge | sed -n '1,3p'
bridge link | grep -E 'thunderbolt|thunderbridge' || true
EOF

  echo "==> [$host@$ip] done."
  echo
}

require "$COMMON_UDEV" "$COMMON_SVC1" "$COMMON_SVC2" "$COMMON_SVC3" "$COMMON_TMR1" "$COMMON_BIN1"

for h in "${TARGETS[@]}"; do
  deploy_node "$h"
done

echo "All done. Go poke the cables and watch systemd behave."