#!/bin/sh

v_lsof="/usr/pkg/sbin/lsof -P -n -Di"
v_ipnat="/usr/sbin/ipnat -l"
v_nat_conf="/usr/pkg/etc/nidentd.nat"
v_fake_conf="/usr/pkg/etc/nidentd.fake"

# Protocol independent

get_question () {
read question
question=`echo $question | tr -c -d ' ,1234567890'`
qlport=`echo $question | awk -F"," '{ print $1 }' | tr -c -d '1234567890'`
qrport=`echo $question | awk -F"," '{ print $2 }' | tr -c -d '1234567890'`
if ([ -z $qlport ]) || ([ -z $qrport ])
	then
      printf "$qlport , $qrport : ERROR : X-INVALID-REQUEST\r\n"
		exit
fi
}

# fake responses

fake () {
fake_name=`grep "^$luname:" $v_fake_conf | awk -F: '{ print $2 }'`
if [ $fake_name ]
	then
		luname=$fake_name
		v_fake_done=1
fi
}

# NAT Connections

masq () {
lport=`$v_ipnat -l | grep "MAP" | grep " $qlport " | grep " $qrport" | awk '{ print $7 }'`
rport=`$v_ipnat -l | grep "MAP" | grep " $qlport " | grep " $qrport" | awk '{ print $9 }' | tr -d ] `
if [ -n $qlport ] && [ -n $qrport ] && [ -n $lport ] && [ $rport ]
  then
    if [ $qlport -eq $lport ] && [ $qrport -eq $rport ]
      then
		masqip=`$v_ipnat -l | grep "MAP" | grep " $qlport " | grep " $qrport" | awk '{ print $2 }' | tr -c -d '.1234567890'`
		hostn=`grep ^"$masqip:" $v_nat_conf | awk -F: '{ print $2 }'`
        if [ $hostn ]
          then
            printf "$qlport , $qrport : USERID : UNIX : $hostn\r\n"
            exit
          else
            masqipn=`echo $masqip | tr -d "."`
            printf "$qlport , $qrport : USERID : UNIX : $masqipn\r\n"
            exit
        fi
    fi
  else
      printf "$qlport , $qrport : NO-USER\r\n"
      exit
fi
}

# IPv4 only

v4 () {
llport=`$v_lsof -i4 | grep ":$qlport->.*:$qrport " | awk '{ print $9 }' | awk -F":" '{ print $2 }' | awk -F"->" '{ print $1 }'`
lrport=`$v_lsof -i4 | grep ":$qlport->.*:$qrport " | awk '{ print $9 }' | awk -F":" '{ print $3 }'`
luname=`$v_lsof -i4 | grep ":$qlport->.*:$qrport " | awk '{ print $3 }'`
if [ -n $qlport ] && [ -n $qrport ] && [ -n $llport ] && [ $lrport ]
  then
    if [ $qlport -eq $llport ] && [ $qrport -eq $lrport ]
      then
        if [ $luname ]
          then
				luname_ok=1
        fi
     fi
fi
}

# IPv6 only

v6 () {
llport=`$v_lsof -i6 | grep "]:$qlport->.*]:$qrport " | awk '{ print $9 }' | awk -F"]:" '{ print $2 }' | awk -F"->" '{ print $1 }'`
lrport=`$v_lsof -i6 | grep "]:$qlport->.*]:$qrport " | awk '{ print $9 }' | awk -F"]:" '{ print $3 }'`
luname=`$v_lsof -i6 | grep "]:$qlport->.*]:$qrport " | awk '{ print $3 }'`
if [ -n $qlport ] && [ -n $qrport ] && [ -n $llport ] && [ $lrport ]
	then
		if [ $qlport -eq $llport ] && [ $qrport -eq $lrport ]
			then
				if [ $luname ]
          then
            luname_ok=1
        fi
     fi
fi
}

random () {
random_user=`jot -r -c 8 a z | rs -g 0 8`
printf "$qlport , $qrport : USERID : UNIX : $random_user\r\n"
exit
}

# Checking/setting options

for arg in $*
do
        case $arg in
         -m)
               v_masq=1
               ;;
         -6)
               v_ipv6=1
               v_not_ipv4=1
               ;;
         -r)
               v_rand=1
               ;;
			-f)
					v_fake=1
					;;
        esac
done

# Main program

get_question

if ([ $v_masq ] && [ $v_ipv6 ]) || ([ $v_masq ] && [ $v_fake ]) || ([ $v_masq ] && [ $v_rand ])
	then
      printf "$qlport , $qrport : ERROR : UNKNOWN_ERROR\r\n"
		exit
fi

if [ $v_rand ]
   then
		if [ $v_fake ]
			then
				if [ $v_ipv6 ]
					then
      				v6
				fi
				if [ -z $v_not_ipv4 ]
					then
						v4
				fi
				if [ $luname_ok ]
					then
						fake
						if [ $v_fake_done ]
							then
								printf "$qlport , $qrport : USERID : UNIX : $luname\r\n"
								exit
							else
								random
								exit
						fi
					else
						random
						exit
				fi
			else
				random
				exit
		fi
fi

if [ $v_masq ]
	then
		masq
		exit
fi

if [ $v_ipv6 ]
	then
		v6
fi
if [ -z $v_not_ipv4 ]
	then
		v4
fi
if [ $luname_ok ]
	then
		if [ $v_fake ]
			then
				fake
			fi
		printf "$qlport , $qrport : USERID : UNIX : $luname\r\n"
		exit
	else
		printf "$qlport , $qrport : USERID : NO-USER\r\n"
		exit
fi
