#!/bin/bash
#
# __copy1__
# __copy2__
#
CMD=$(basename $0)
CMDVER="1.2"
CMDSTR="$CMD v.$CMDVER (2019/07)"

set -e -u


usage()
{
	echo "
=== $CMDSTR == returns geo infos about an ip address ===

usage:	$CMD ip [type]

type:	json, xml, raw, terse (default: raw)

* service courtesy by $provider_name ($provider_url)
	" >&2
	exit 1
}


# (MAIN)

provider_name="IPinfoDB"
provider_url="http://ipinfodb.com"

[ $# -lt 1 -o $# -gt 2 ] && usage

IP=$1
TYPE=${2:-}

# config
#
cfgfile=/etc/ipgeo.conf

key=			# THE ONLY MANDATORY VARIABLE

CLEAN_MTIME="90"
WGET_OPTIONS=
WGET_AGENT="Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)"


[ -f "$cfgfile" ] || {
	echo "config file '$cfgfile' not found" >&2
	exit 1
}
. $cfgfile

[ "$key" = "" ] && {
	echo "$CMD error: 'key' variable not defined in config file '$cfgfile'" >&2
	echo "you should obtain a valid key from $provider_name ($provider_url)" >&2
	exit 1
}



case "$0" in
	*city)	URL="http://api.ipinfodb.com/v3/ip-city/?key=$key&ip=" ;;
	*)	URL="http://api.ipinfodb.com/v3/ip-country/?key=$key&ip=" ;;
esac

url="$URL$IP"
cachedir="$HOME/.cache/$CMD"

case $TYPE in
	json)	url="${url}&format=json"; cachedir=$cachedir/json ; match="ipAddress\" : \"$IP\"" ;;
	xml)	url="${url}&format=xml" ; cachedir=$cachedir/xml ; match="<ipAddress>$IP<" ;;
	*) 	cachedir=$cachedir/raw ; match=";$IP;" ;;
esac

###echo "url=$url" >&2

[ -d $cachedir ] || {
	mkdir -p "$cachedir" 2>/dev/null || :
}


# clean old entries?
#
[ "X${CLEAN_MTIME:-}" != "X" ] && {
	[ -d "$cachedir" ] && {
		find "$cachedir" -mtime +$CLEAN_MTIME -delete 2>/dev/null || :
	}
}

out=
stat=0

if [ -s "$cachedir/$IP" ]
then
	out=$(cat "$cachedir/$IP")
else
	out=$(wget $WGET_OPTIONS -qO- --user-agent="$WGET_AGENT" $url) || {
		stat=$?
		echo -e "\n$CMD error $stat\n" >&2
		echo -e "$out\n" >&2
		exit $stat
	}
	sleep 0.5	# avoid service flooding
fi

case $TYPE in
	terse)	echo "$out" | tr ';' ' '
		;;
	*)	echo "$out"
		;;
esac

# caches result
#
[ -d "$cachedir" ] && {
	(echo "$out" >"$cachedir/$IP") 2>/dev/null || :
}

exit 0
