#!/bin/zsh -feu

zmodload zsh/regex

source /usr/share/mmc-shell/mmc-functions.sh

HOST_FILE=/etc/hosts
GREP=(/bin/grep --color)

usage()
{
cat <<EOF
usage: ${0##*/} [+-h] [-v] [--] HOSTNAME
       ${0##*/} [+-h] [-v] [--] HOSTNAME  IP

-v  verbose

- dump the IP in $HOST_FILE
- or update the IP of the HOST in $HOST_FILE. -- overwrites the line.

Does it work with alias names on the same line?

It is assumed the hostname is separated by whitespace on the line.
EOF
}

dump_ip_of()
{
    readonly HOSTNAME=$1
    $GREP -E "\b($HOSTNAME |$HOSTNAME$)" $HOST_FILE || :
}

while getopts :hv OPT; do
    case $OPT in
        h|+h)
            usage
            exit 0
            ;;
        v)
            set -x
            ;;
        *)
            usage >&2
            exit 2
    esac
done
shift OPTIND-1
OPTIND=1


if [ $# = 0 ]; then
    usage
    exit 1
fi


HOSTNAME=$1

# Only read it
if [ $# = 1 ]; then
    dump_ip_of $HOSTNAME
    exit 0
fi

IP=$2

check_ip()
{
    # [[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+
    IP_REGEXP="[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+"

    if [[ ! $1 -regex-match "$IP_REGEXP" ]]
    then
        die "invalid IP: $IP"
    fi
}

check_ip $IP
dump_ip_of $HOSTNAME

# sudo sed -ie "s/.*\b$HOSTNAME/$IP $HOSTNAME/" $HOST_FILE
# 10.17.150.209
# sudo sed -ie "s/.*\b\($HOSTNAME \|$HOSTNAME\$\)/$IP $HOSTNAME/" $HOST_FILE
SUFFIX=.old
# sed -ie 's/tup/tulipan/;t log; b; : log ;w /dev/stdout'  zapis
if sudo sed --regexp-extended --in-place=$SUFFIX \
        -e "s/^($IP_REGEXP)(.*\b)($HOSTNAME( .*)|$HOSTNAME$)/$IP\2$HOSTNAME\4/; t log; b;: log; w /dev/stdout" \
        $HOST_FILE | grep --quiet --fixed-strings $HOSTNAME >& /dev/null
then

    # dump all IP addresses:
    # sed -E -n -e "s/^([[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+)(.*)/\1/g;T;p" /etc/hosts

    dump_ip_of $HOSTNAME

    diff --color /etc/hosts$SUFFIX $HOST_FILE
else
    # append
    echo "$IP $HOSTNAME" |sudo tee -a $HOST_FILE
fi
