#!/bin/bash
# Author: Steven Shiau <steven _at_ nchc org tw>
# License: GPL

# load setting
. /opt/drbl/sbin/drbl-conf-functions

# alias level
ip_alias_list="0 1 2 3 4 5"

usage() {
    echo "Usage:"
    echo "To get the up network devices or IP address:"
    echo "`basename $0` [OPTION]"
    echo " Options:"
    echo " -d, --all-net-dev:  Show only the up network devices, including alias IP address device."
    echo " -p, --public-ip-port:  Show only the public IP address ethernet port."
    echo " -t, --private-ip-port: Show only the private IP address ethernet port."
    echo " -a, --public-ip-address:  Show only the public IP address."
    echo " -r, --private-ip-address: Show only the public IP address."
    echo " -i, --all-ip-address:  Show all the IP addresses."
    echo " -v, --verbose        prints out verbose information"
}

show_mode=""
# Parse command-line options
while [ $# -gt 0 ]; do
  case "$1" in
    -a|--public-ip-address)
            shift; show_mode="public_ip_address"
            ;;
    -d|--all-net-dev)
            shift; show_mode="all_net_dev"
            ;;
    -i|--all-ip-address)
            shift; show_mode="all_ip_address"
            ;;
    -p|--public-ip-port)
            shift; show_mode="public_ip_eth_port"
            ;;
    -r|--private-ip-address)
            shift; show_mode="private_ip_address"
            ;;
    -t|--private-ip-port)
            shift; show_mode="private_ip_eth_port"
            ;;
    -v|--verbose)
		shift; VERBOSE="on"
                ;;
    -*)     echo "${0}: ${1}: invalid option" >&2
            usage >& 2
            exit 2 ;;
    *)      break ;;
  esac
done

NDVS="$($DRBL_SCRIPT_PATH/bin/get-nic-devs)"
i=0
for idev in $NDVS; do
  # physical network device IP
  IP="$($DRBL_SCRIPT_PATH/bin/get_ip $idev)"
  if [ -n "$IP" ]; then
    i=$((i+1))
    NETDEV[$i]="$idev"
    IPADDRS[$i]="$IP"
  fi
  # try alias IP
  for id in $ip_alias_list; do
    IP="$($DRBL_SCRIPT_PATH/bin/get_ip $idev:$id)"
    if [ -n "$IP" ]; then
      i=$((i+1))
      NETDEV[$i]="$idev:$id"
      IPADDRS[$i]="$IP"
    fi
  done
done
imax=$i

# found the public IP and ethx
i=0
public_IP_port=
public_IP_addr=
private_IP_port=
private_IP_addr=
while [ $i -le $imax ]; do
  i=$((i+1))
  if [ -n "$(echo ${IPADDRS[$i]} | grep -vE "^(192.168\..*|172\.(1[6-9]|2[0-9]|3[01])\..*|10\..*)")" ]; then
    public_IP_port="$public_IP_port ${NETDEV[$i]}"
    public_IP_addr="$public_IP_addr ${IPADDRS[$i]}"
  else
    private_IP_port="$private_IP_port ${NETDEV[$i]}"
    private_IP_addr="$private_IP_addr ${IPADDRS[$i]}"
  fi
done

case "$show_mode" in
  all_ip_address)
      echo ${IPADDRS[@]:0}
      ;;
  all_net_dev)
      echo ${NETDEV[@]:0}  
      ;;
  public_ip_address)
      echo $public_IP_addr
      ;;
  public_ip_eth_port)
      echo $public_IP_port
      ;;
  private_ip_address)
      echo $private_IP_addr
      ;;
  private_ip_eth_port)
      echo $private_IP_port
      ;;
esac
