#!/bin/ksh

# Copyright 2004 Sun Microsystems, Inc. All Rights Reserved.
# ident "@(#)utfwload.sh	1.14 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
cmd=$0

connected=true
all=false
firmware=true
load=false
forceload=false
fwvers=
heading=false

# Text strings
disp_text=`gettext "DISP"`
user_text=`gettext "User"`
firmware_text=`gettext "Firmware Version"`
ip_text=`gettext "IP Address"`

if [ `uname` = "Linux" ]
then
	NAWK=/usr/bin/gawk
	IDLE=gdm
else
	NAWK=/usr/bin/nawk
	IDLE=root
fi

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

# Make sure that if this is invoked as root, the
# temporary directory used is writable only by root.
# This avoids certain attacks that could cause the
# script to write a root-owned file in an arbitrary place.

case "$(id)" in
	'uid=0('*) ISROOT=true; TMP=/var/opt/SUNWut/tmp;;
	*) ISROOT=false; TMP=/tmp;;
esac

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 firmware versions"`
	print -u2 `gettext "Usage: "`"$cmd [-alLH]"
	print -u2 "	-H	" \
		`gettext "Output column headings above the regular output"`
	print -u2 "	-a	" \
		`gettext "include idle (not logged in) sessions"`
	print -u2 "	-l	" \
		`gettext "do firmware upgrade of idle sessions"`
	print -u2 "	-L	" \
		`gettext "force firmware upgrade of all sessions"`
	exit 1
}

while getopts :alLH ARGNAME
do
	case $ARGNAME in
	   a)	all=true;;
	   H)	heading=true;;
	   l)	load=true;;
	   L)	load=true; forceload=true;;
	   *)	print -u2 `gettext "Invalid argument"` "$*"
		Usage;;
	esac
done

if [ $load = "true" ]
then
	all=true
	if [ $ISROOT = "false" ]
	then
	    print -u2 `gettext "Must be root to use -l option"`
	    exit
	fi
	fwvers=$(/opt/SUNWut/sbin/utfwadm -P | $NAWK '{ print $3; exit}')
	print `gettext "Upgrading units to version"` "$fwvers:"
fi

if [ $heading = "true" ]
then
	printf " %4s %-8s %-15s %s\n" "$disp_text" "$user_text" "$ip_text" \
		"$firmware_text"
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.$$

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

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

$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.$$

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)
	}

	/firmware=/ {
		fw = substr($0, index($0, "=") + 1)
	}

	/^end$/ {
		print token, ipa, tid, mhi, fw
		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 firmware=$firmware -v all=$all -v fwvers="$fwvers" \
		-v load=$load -v forceload=$forceload \
		-v host=`hostname` '{
		if (all == "false" && $3 == "????")
			next
		if (load == "true") {
			if ($7 == fwvers)
				next
			if (forceload == "false" && $3 != "????")
				next
			printf "%3d.%d %-8s %-15s %-15s %s\n", $1, $6, \
				$3, $4, $5, $7
			cmd = "/opt/SUNWut/lib/utload -S " host " -w -b -d " \
				$1 " -m " $6
			system(cmd)
		} else
			printf "%3d.%d %-8s %-15s %-15s %s\n", $1, $6, \
				$3, $4, $5, $7 }' | sort -n
