#!/bin/bash

# Copyright 2022 The ChromiumOS Authors.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

# go/deshell-chromeos: this script is for test image only and should never
# be shipped to a release image.

usage() {
  cat <<EOF
Usage: l3info [--address] [--neighbor] [--route] [--firewall] [--all]

  --address: Print link and address information in all netns

  --neighbor: Print neighbor information in all netns

  --route: Print route and routing policy information

  --firewall: Print iptables information (requires root)

  --all: Equivalent to l3info --address --neighbor --route --firewall
EOF
}

log_run() {
  echo "#" "$@"
  "$@"
  echo
}

# Short awk script to dedupe inputs without sorting.
dedupe() {
  awk '!x[$0]++'
}

print_route() {
  local family
  local table
  for family in 4 6; do
    log_run ip -"${family}" rule show
    for table in $(ip -"${family}" rule show \
      | sed -E 's/.*lookup (.*)$/\1/' | dedupe); do
      if [[ "${table}" != "default" && "${table}" != "local" ]]; then
        log_run ip -"${family}" route show table "${table}"
      fi
    done
  done
}

print_iptables() {
  local iptables_command
  local table
  for iptables_command in iptables ip6tables; do
    for table in filter mangle nat; do
      log_run "${iptables_command}" -v -t "${table}" -S
    done
  done
}

print_address() {
  # `ip addr show` prints both IPv4 and IPv6 addresses.
  log_run ip addr show
  log_run ip -all netns exec ip addr show
}

print_neighbor() {
  # `ip neigh show` prints both IPv4 ARP and IPv6 NDP table.
  log_run ip neigh show
  log_run ip -all netns exec ip neigh show
}

main() {
  if [ $# -eq 0 ]; then
    usage
    exit 1
  fi
  local param
  for param in "$@"; do
    case "${param}" in
    route|--route)
      print_route
      ;;
    firewall|--firewall)
      print_iptables
      ;;
    address|addr|--address|--addr)
      print_address
      ;;
    neighbor|--neighbor)
      print_neighbor
      ;;
    all|--all)
      print_address
      print_neighbor
      print_route
      print_iptables
      exit 0
      ;;
    *)
      usage
      exit 1
      ;;
    esac
  done
  exit 0
}

main "$@"
