#!/bin/ksh

# Copyright 2004 Sun Microsystems, Inc. All Rights Reserved.
# ident "@(#)utwho.sh	1.15 05/06/30 SMI"

# This script uses internal Sun Ray interfaces that are private and not
# guaranteed to remain stable. As such, works derived from this script
# are discouraged.

PATH=/bin:/usr/bin
UTBASE=/etc/opt/SUNWut/basedir
UTNETPIPE=$UTBASE/lib/utnetpipe
XCONFIG=/tmp/SUNWut/config/xconfig/Xconfig
TMP=/tmp
cmd=$0
if [ `uname` = "Linux" ]
then
	NAWK=/usr/bin/gawk
	IDLE=gdm
else
	NAWK=/usr/bin/nawk
	IDLE=root
fi

connected=false
all=false
heading=false

# Text strings
disp_text=`gettext "DISP"`
token_text=`gettext "Token"`
user_text=`gettext "User"`
ip_text=`gettext "IP Address"`
modelcid_text=`gettext "Model.CID"`

if [ ! -d /tmp/SUNWut ]
then
	print -u2 `gettext "utwho must be run on a Sun Ray server"`
	exit 1
fi

trap "rm -f $TMP/map1.$$ $TMP/map2.$$ $TMP/map3.$$ $TMP/map4.$$" 0 1 2 15

function Usage
{
	print -u2 `gettext "Usage: "`"$cmd"
	print -u2 "	" `gettext "list Sun Ray sessions"`
	print -u2 `gettext "Usage: "`"$cmd [-caH]"
	print -u2 "	-H	" \
		`gettext "Output column headings above the regular output"`
	print -u2 "	-c	" \
		`gettext "list only connected sessions"`
	print -u2 "	-a	" \
		`gettext "include idle (not logged in) sessions"`
	exit 1
}

while getopts :caH ARGNAME
do
	case $ARGNAME in
	   c)	connected=true;;	
	   a)	all=true;;
	   H)	heading=true;;
	   *)	print -u2 `gettext "Invalid argument"` "$*"
		Usage;;
	esac
done

sessfiles=`find /tmp/SUNWut/session_proc -type f -print`

if [ -z "$sessfiles" ]
then
	exit 1
fi

if [ $heading = "true" ]
then
	if [ $connected = "false" ]
	then
		printf "%4s    %-32s %-8s\n" \
			"$disp_text" "$token_text" "$user_text"
	else
		printf " %4s     %-28s %-8s %-15s %-s\n" \
			"$disp_text" "$token_text" "$user_text" "$ip_text" \
			"$modelcid_text"
	fi
fi

#export LC_ALL=C

$NAWK '/SUN_SUNRAY_TOKEN/ {
	sub(".*\\.\\*_", "", $1)
	sub("\\..*:", "", $1)
	sub("SUN_SUNRAY_TOKEN=", "", $2)
	sub("JavaBadge-nonPers", "JavaBadgeNP", $2)
	print $1, $2
	}' $XCONFIG | sort >$TMP/map1.$$

$NAWK -v idlename=$IDLE '
	BEGIN {
		name = ""
		disp = ""
	}

	FILENAME != fn {
		if (name != "" && disp != "") {
			print disp, name
			name = ""
			disp = ""
		}
		fn = FILENAME
	}

	/uid=/ {
		user = substr($0, index($0, "=") + 1)
		cmd = "getent passwd " user
		cmd | getline name
		close(cmd)
		sub(":.*", "", name)
		if (name == idlename)
			name = "????"
	}

	/XID=/ {
		disp = substr($0, index($0, "=") + 1)
		name = "????"
	}

	END {
		if (name != "" && disp != "")
			print disp, name
	}' $sessfiles | sort >$TMP/map2.$$

join -j 1 $TMP/map1.$$ $TMP/map2.$$ | sort +1 > $TMP/map4.$$

if [ $connected = "false" ]
then
	sort -n $TMP/map4.$$ | \
		$NAWK -v all=$all '
			{
				if (all == "false" && $3 == "????")
					next
				printf "%3d %-36s %-8s\n", $1, $2, $3
			}'
	exit
fi
	
print status | $UTNETPIPE 0.0.0.0 7010 | \
$NAWK '
	BEGIN {
		mhi = 0
	}

	/terminalId=/ {
		tid = substr($0, index($0, "=") + 1)
		sub("^Corona", "", tid)
		sub("^SunRay", "", tid)
		sub("\\-...\\.", ".", tid)
	}

	/tokenName=/ {
		token = substr($0, index($0, "=") + 1)
		sub("JavaBadge-nonPers", "JavaBadgeNP", token)
	}

	/terminalIPA=/ {
		ipa = substr($0, index($0, "=") + 1)
	}

	/MultiheadTerminalIndex=/ {
		mhi = substr($0, index($0, "=") + 1)
	}

	/^end$/ {
		print token, ipa, tid, mhi
		mhi = 0
	}
	' | sort >$TMP/map3.$$

join -j1 2 -j2 1 -o 1.1 1.2 1.3 2.2 2.3 2.4 2.5 $TMP/map4.$$ $TMP/map3.$$ | \
	$NAWK -v all=$all -v host=`hostname` '{
		if (all == "false" && $3 == "????")
			next
		printf "%3d.%d %-32s %-8s %-15s %-s\n", $1, $6, \
				$2, $3, $4, $5 }' | sort -n
