#!/bin/false # This is a ksh script library, to be sourced by utconfig, etc.
#
# ident "@(#)kiosk_config.ksh	1.9 07/06/08 SMI"
#
# Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
# Use is subject to license terms.
#

# Kiosk configuration functions
#
# Using functions in this file requires that the SUNWkio package is installed.
# This script requires that config_lib functions are available.

# Interfaces for use by utconfig:
#
# InitKioskVars - Call first, establishes default values and behavior
# PromptForKioskParameters - Interactively get the kiosk parameters 
# ForceKioskDefaults - Force the default kiosk parameter values to be applied
# ShowKioskConfig - Shows existing/applied kiosk configuration
# ShowNewKioskConfig - Shows new kiosk configuration, which ConfigKiosk would 
#                      apply, nothing if nothing would be changed.
# ConfigKiosk - Call to apply the selected kiosk configuration
# UnconfigKiosk - Call to remove existing kiosk configuration
# KioskConfigured - Check, if kiosk is configured currently


# Helper function for parameter verification.
# See the similar helpers in config_lib.
IsValidKioskUserPrefix()
{
   (($# == 1 && ${#1} <= 4)) || return 1

   param=$(echo $1 | tr ' ' '\000')
   [[ $param == *([a-zA-Z0-9])[a-zA-Z]*([a-zA-Z0-9]) ]]
}

KioskConfigured() {
  /opt/SUNWkio/bin/kioskstatus -c -q
}

InitKioskVars() {

  DEFAULT_KIOSK_PREFIX="utku"
  DEFAULT_KIOSK_GROUP="utkiosk"
  DEFAULT_KIOSK_IDSTART="150000"
  DEFAULT_KIOSK_IDCOUNT="25"
  KIOSK_GROUP_ID=""
  
  # KIOSK_CONF_NEW tells you if Kiosk configuration has to be changed.
  KIOSK_CONF_NEW=false     
  # KIOSK_CONF_OP tells you if Kiosk configuration is being created or modified
  KIOSK_CONF_OP=create

  # If there are current stored Kiosk Defaults, 
  # they can override the hardcoded values above.
  GetCurrentKioskDefaults || RestoreKioskDefaults

  return 0
}

ForceKioskDefaults() {
  KIOSK_PREFIX=$DEFAULT_KIOSK_PREFIX
  KIOSK_GROUP=$DEFAULT_KIOSK_GROUP
  KIOSK_IDSTART=$DEFAULT_KIOSK_IDSTART
  KIOSK_IDCOUNT=$DEFAULT_KIOSK_IDCOUNT

  if [ -z "$KIOSK_GROUP_ID" ] && ! GroupExists "$KIOSK_GROUP" ; then
    KIOSK_GROUP_ID="auto"
  fi

  if $KIOSK_INSTALLED ; then
    if ! KioskConfigured ; then
      KIOSK_CONF_NEW=true     
    fi
  fi 
}

ParseKioskDefaultOptions() {
  typeset PRESERVED_ARGS
  typeset PRESERVED_PREFIX  
  typeset PRESERVED_GROUP
  typeset PRESERVED_IDSTART
  typeset PRESERVED_IDCOUNT
  typeset PRESERVED_GROUP_ID
  typeset FOUND_GROUP_ID
  typeset SETTINGS_FOUND=false
  
# Should be "Existing" or "Migrated"
  typeset opttype=$1
  shift

  PRESERVED_ARGS="$*"

  typeset gbl_optind=$OPTIND
  OPTIND=1
  while getopts l:g:i:u:c: opt $PRESERVED_ARGS 
  do
    case $opt in
      l)
        PRESERVED_PREFIX=$OPTARG
	if IsValidKioskUserPrefix "$PRESERVED_PREFIX" ; then
	  DEFAULT_KIOSK_PREFIX=$PRESERVED_PREFIX
	  SETTINGS_FOUND=true
	else
	  print -u2 "$opttype kiosk user prefix '$PRESERVED_PREFIX' is not a valid kiosk user prefix - ignoring."
	fi
        ;;
      g)
        PRESERVED_GROUP=$OPTARG
	if IsValidGroup "$PRESERVED_GROUP" || GroupExists "$PRESERVED_GROUP" ; then
	  DEFAULT_KIOSK_GROUP=$PRESERVED_GROUP
	  SETTINGS_FOUND=true
	else
	  print -u2 "$opttype kiosk user group '$PRESERVED_GROUP' is not a valid group name - ignoring."
	fi
        ;;
      u)
        PRESERVED_IDSTART=$OPTARG
	if IsValidInteger "$PRESERVED_IDSTART" && (( $PRESERVED_IDSTART > 100 )) ; then
	  DEFAULT_KIOSK_IDSTART=$PRESERVED_IDSTART
	  SETTINGS_FOUND=true
	else
	  print -u2 "$opttype first kiosk user id ($PRESERVED_IDSTART) is not a valid kiosk user id - ignoring"
	fi
        ;;
      c)
        PRESERVED_IDCOUNT=$OPTARG
	if IsValidInteger "$PRESERVED_IDCOUNT" && (( $PRESERVED_IDCOUNT >= 1 )) ; then
	  DEFAULT_KIOSK_IDCOUNT=$PRESERVED_IDCOUNT
	  SETTINGS_FOUND=true
	else
	  print -u2 "$opttype kiosk user count ($PRESERVED_IDCOUNT) is not a valid number - ignoring"
	fi
        ;;
      i)
        PRESERVED_GROUP_ID=$OPTARG
	if [ "$PRESERVED_GROUP_ID" = "auto" ] || IsValidInteger "$PRESERVED_GROUP_ID" ; then
	  FOUND_GROUP_ID=$PRESERVED_GROUP_ID
	else
	  print -u2 "$opttype kiosk group id ($PRESERVED_GROUP_ID) is not a valid kiosk group id - ignoring"
	fi
        ;;
    esac
  done
  if [ -n "$FOUND_GROUP_ID" ] ; then
    if $SETTINGS_FOUND && [ "$DEFAULT_KIOSK_GROUP" = "$PRESERVED_GROUP" ] ; then
      KIOSK_GROUP_ID=$FOUND_GROUP_ID
    else	
      print -u2 "$opttype group id found ($FOUND_GROUP_ID) with no valid group setting - ignoring"
    fi
  fi    
	
  OPTIND=$gbl_optind  

  $SETTINGS_FOUND
}

GetCurrentKioskDefaults() {
  typeset CURRENT_ARGS
  
  CURRENT_ARGS="$(/opt/SUNWkio/bin/kioskuseradm show -p)"
  if [[ $? -ne 0 ]] || [ -z "$CURRENT_ARGS" ] ; then
    return 1
  fi    
      
  ParseKioskDefaultOptions "Existing" $CURRENT_ARGS
}

RestoreKioskDefaults() {
  typeset -r PRESERVED_KIOSK_FILE=${ETC_OPT_UT}/kioskuser.preserved
  typeset PRESERVED_ARGS
  
  if [ -s "$PRESERVED_KIOSK_FILE" ] ; then  
    PRESERVED_ARGS="$(cat $PRESERVED_KIOSK_FILE)"

    if [[ $? -ne 0 ]] ; then
      print -u2 "Cannot restore migrated kiosk configuration from file $PRESERVED_KIOSK_FILE"
      return 1
    fi  
      
    if ParseKioskDefaultOptions "Migrated" $PRESERVED_ARGS ; then
      print "Restored migrated kiosk configuration."
      return 0	
    fi
  fi
  # Did not parse successfully
  return 1
}

RemoveKioskPreservedData() {
  typeset -r PRESERVED_KIOSK_FILE=${ETC_OPT_UT}/kioskuser.preserved
  
  if [[ -e "$PRESERVED_KIOSK_FILE" ]] ; then
    if rm $PRESERVED_KIOSK_FILE ; then
      print "Removed migrated Kiosk Configuration." 
    else  
      print "Cannot remove migrated Kiosk Configuration."  
    fi
  fi
}

# Parameter $1, indicates whether kiosk should be configured by default
#    if "yes", no question is asked unless a configuration already exists
# Returns whether a new config is requested 
PromptForKioskConfig() {
  typeset -r default_config=${1:-no}

  if KioskConfigured ; then

    print "\nPrevious Sun Ray Kiosk Mode configuration:"
    ShowKioskConfig

    if [ $default_config = "yes" ] ; then
      if ! ReplyIsYes_ "Do you wish to change this configuration?"
      then
	return 1
      fi
    else
      if ReplyIsYes_ "Do you wish to preserve this configuration?"
      then
	return 1
      fi
    fi
          
    KIOSK_CONF_OP="modify -f"  

  elif [ $default_config != "yes" ] ; then

    if ReplyIsNo_ "\nConfigure Sun Ray Kiosk Mode?"
    then
      return 1
    fi
  fi    

  KIOSK_CONF_NEW=true

  return 0
}

PromptForKioskParameters() {

  print ""
  
  KIOSK_PREFIX_OK=false
 
  while ! $KIOSK_PREFIX_OK
  do
    print -n "Enter user prefix [$DEFAULT_KIOSK_PREFIX]: "
    read -r
    case "$REPLY" in
      "")     KIOSK_PREFIX="$DEFAULT_KIOSK_PREFIX"
	      echo $KIOSK_PREFIX >> $LOGFILE
	      KIOSK_PREFIX_OK=true;;
      *)
	      echo $REPLY >> $LOGFILE
	      if IsValidKioskUserPrefix $REPLY ; then
		KIOSK_PREFIX_OK=true 
		KIOSK_PREFIX="$REPLY"
	      else
		print -n "User prefix must be alphanumeric and no more than four characters"
		print -n "\nRe-"
	      fi

      ;;
    esac
  done
  
  print ""
  
  KIOSK_GROUP_OK=false
  while ! $KIOSK_GROUP_OK
  do
    print -n "Enter group [$DEFAULT_KIOSK_GROUP]: "
    read -r
    case "$REPLY" in
      "")	KIOSK_GROUP="$DEFAULT_KIOSK_GROUP";;
      *)	KIOSK_GROUP="$REPLY"
		KIOSK_GROUP_ID="";;
    esac
    echo $KIOSK_GROUP >> $LOGFILE
    if GroupExists "$KIOSK_GROUP"; then
      if ReplyIsYes_ "\nThe group '$KIOSK_GROUP' already exists.\nDo you want to use it anyway?"
      then
	KIOSK_GROUP_ID=""
	KIOSK_GROUP_OK=true 
      fi
    else
      if IsValidGroup $KIOSK_GROUP ; then
	# TODO: Ask for group id
	if [ -z "$KIOSK_GROUP_ID" ] ; then
	  KIOSK_GROUP_ID="auto"
	fi    
	KIOSK_GROUP_OK=true
      else
	print -n "Group must begin with a lowercase alphabetic character and may only consist of lower case alphabetic characters and numeric characters"
      fi
    fi
    if ! $KIOSK_GROUP_OK ; then
	    print -n "\nRe-"
    fi
  done
 
  print ""

  KIOSK_IDSTART_OK=false
  
  while ! $KIOSK_IDSTART_OK
  do
    print -n "Enter userID range start [$DEFAULT_KIOSK_IDSTART]: "
    read -r
    case "$REPLY" in
      "")     KIOSK_IDSTART="$DEFAULT_KIOSK_IDSTART"
	      echo $KIOSK_IDSTART >> $LOGFILE
	      KIOSK_IDSTART_OK=true;;
      *)
	      echo $REPLY >> $LOGFILE
	      if IsValidInteger $REPLY && (( $REPLY > 100 )); then
		KIOSK_IDSTART_OK=true 
		KIOSK_IDSTART="$REPLY"
	      else
		print -n "UserID's must start after 100 and must be an integer"
		print -n "\nRe-"
	      fi
      ;;
    esac
  done

  print ""

  KIOSK_IDCOUNT_OK=false

  while ! $KIOSK_IDCOUNT_OK
  do
    print -n "Enter number of users [$DEFAULT_KIOSK_IDCOUNT]: "
    read -r
    case "$REPLY" in
      "")     KIOSK_IDCOUNT="$DEFAULT_KIOSK_IDCOUNT"
	      echo $KIOSK_IDCOUNT >> $LOGFILE
	      KIOSK_IDCOUNT_OK=true;;
      *)
	      echo $REPLY >> $LOGFILE
	      if IsValidInteger $REPLY && (( $REPLY >= 1 )); then
		KIOSK_IDCOUNT_OK=true 
		KIOSK_IDCOUNT="$REPLY"
	      else
		print -n "Number of users must be an integer greater than 0"
		print -n "\nRe-"
	      fi
      ;;
    esac
  done

  print ""
}

ConfigKiosk() {	
  if $KIOSK_CONF_NEW; then
    CreateKioskConfig && 
      RemoveKioskPreservedData
  fi    
}

CreateKioskConfig() {
  if ! RemoveStaleUsers; then
    return 1
  fi    

  typeset kio_grp_opt=""
  if [ -n "$KIOSK_GROUP_ID" ] ; then
    kio_grp_opt="-i $KIOSK_GROUP_ID"
  fi    
  print "\nCreating new Sun Ray Kiosk Mode configuration ...\n"
  /opt/SUNWkio/bin/kioskuseradm $KIOSK_CONF_OP \
	  -l $KIOSK_PREFIX -g $KIOSK_GROUP $kio_grp_opt \
	  -u $KIOSK_IDSTART -c $KIOSK_IDCOUNT
  if [[ $? != 0 ]]; then
    PrintKioskAddErrorMsg
    return 1
  fi
}

ShowNewKioskConfig() {

  if $KIOSK_CONF_NEW;then   
    cat <<-!

	Sun Ray Kiosk Mode 4.0
	  User name prefix:   $KIOSK_PREFIX
	  Base user ID:       $KIOSK_IDSTART
	  Number of accounts: $KIOSK_IDCOUNT
	  Kiosk group name:   $KIOSK_GROUP
	!
    if [ -n "$KIOSK_GROUP_ID" ] ; then
      cat <<-!
	  Kiosk group ID:     $KIOSK_GROUP_ID
	!
    fi      
  fi
}

ShowKioskConfig() {

  /opt/SUNWkio/bin/kioskuseradm show
}

RemoveKioskConfig() {

  /opt/SUNWkio/bin/kioskuseradm delete -f
  /opt/SUNWkio/bin/kioskconfig reset > /dev/null
  RemoveStaleUsers >/dev/null 2>&1
}

RemoveStaleUsers() {

  /opt/SUNWkio/bin/kioskuseradm leakcheck >/dev/null 2>&1
  if [[ $? = 0 ]]; then
    return 0
  fi

  print "\nRemoving leftover Sun Ray Kiosk Mode user accounts ..."
  if /opt/SUNWkio/bin/kioskuseradm cleanup ; then
    return 0
  else
    PrintKioskRemoveErrorMsg
    return 1
  fi
}

PrintKioskAddErrorMsg() {
cat <<-!

	Sun Ray Kiosk Mode configuration failed!  
	!
}

PrintKioskRemoveErrorMsg() {
cat <<-!
 
	Removal of Sun Ray Kiosk Mode configuration has failed!
	Please remove all users with the comment field 'KioskSessionServiceUser'
	from the /etc/passwd file before attempting to configure
	Sun Ray Kiosk Mode again. 
	!
}

# Set global UNCONFIG_DONE for utkiosk
UnconfigKiosk() {
  if KioskConfigured; then
     print "\nRemoving Sun Ray Kiosk Mode configuration ...\n"
     UNCONFIG_DONE=true
     # remove kiosk config
     RemoveKioskConfig
  else
     # kiosk.conf file does not exist.  Remove kiosk config anyway
     # but dont display anything on the screen
     RemoveKioskConfig 2>&- >&-
  fi

  RemoveKioskPreservedData
}

