#!/bin/ksh
#
# This version of the CDE dtconfig script is for use in the Solaris(TM)
# operating environment.
#
# Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
# Use is subject to license terms.
#  (c) Copyright 1993, 1994 Hewlett-Packard Company
#  (c) Copyright 1993, 1994 International Business Machines Corp.
#  (c) Copyright 1993, 1994 Sun Microsystems, Inc.
#  (c) Copyright 1993, 1994 Novell, Inc.
#  (c) Copyright 1993, 1994 Unix System Labs, Inc., a subsidiary of
#
# This script can be run after CDE installation to configure CDE within 
# the host platforms operating environment.  For example, when auto-start  
# is selected, the CDE desktop login window will be displayed at end of the 
# workstation's power up boot cycle. 
# 
# Location:    $PKG_INSTALL_ROOT/bin/dtconfig
#
#pragma ident	"@(#)dtconfig.src	1.41	06/05/19 SMI"
#
# Main service
#   svc:/application/graphical-login/cde-login:default
#
# CDE inetd-based services
#   svc:/network/rpc/cde-ttdbserver:tcp
#   svc:/network/rpc/cde-calendar-manager:udp
#   svc:/network/cde-spc:default

FMRI=svc:application/graphical-login/cde-login:default
mode=$1
arg_count=$#
prg_name=$0

Message()
{
# Message() - display message from dtconfig.cat
#   $1 - message id
#   $2 - fallback message text

  if [ -x $DTDSPMSG ]; then
        $DTDSPMSG -s 20 dtconfig $1 "$2" "$3"
        echo " "
  else
        echo "$2"
  fi
}

usage_error() {
    echo " "
    Message 1 " CDE configuration utility"
    echo " "
    Message 2  "  $prg_name -d        (disable auto-start)" $prg_name
    Message 3  "  $prg_name -e        (enable auto-start)" $prg_name
    Message 4  "  $prg_name -kill     (kill dtlogin)" $prg_name
    Message 5  "  $prg_name -reset    (reset dtlogin)" $prg_name
    Message 6  "  $prg_name -p        (printer action update)" $prg_name
    Message 25 "  $prg_name -inetd    (inetd.conf /usr/dt daemons)" $prg_name
    Message 26 "  $prg_name -inetd.ow (inetd.conf /usr/openwin daemons)" $prg_name
    echo " "
}

#
# Allow for configured and factory versions of dtlogin.rc
#

if [ -f $PKG_INSTALL_ROOT//etc/dt/config/dtlogin.rc ]
then
  RC_MASTER=$PKG_INSTALL_ROOT//etc/dt/config/dtlogin.rc
elif [ -f $PKG_INSTALL_ROOT//usr/dt/config/dtlogin.rc ]
then
  RC_MASTER=$PKG_INSTALL_ROOT//usr/dt/config/dtlogin.rc
fi

RC_COPY=$PKG_INSTALL_ROOT/etc/init.d/dtlogin

DTDSPMSG=$PKG_INSTALL_ROOT/usr/dt/bin/dtdspmsg


set `/bin/id`
if [ $1 != "uid=0(root)" ]; then
        Message 7 "$prg_name: this script must be run as root" $prg_name
        exit 1
fi


if [ $arg_count -ne 1 ]; then
        echo " "
#
# Display error message for too many arguments
#
        if [ $arg_count -gt 1 ]; then
                Message 8 "Usage: Too many arguments"
 
#
# Display error message for NULL arguments passed
#
        elif [ $arg_count -eq 0 ]; then
                Message 9 "Usage: Needs one argument"
 
        fi
        usage_error
        exit 1
fi


rc_master_check() {
        if [ ! -x $RC_MASTER ]; then
           Message 10 "option failed"
           Message 11 "could not execute $RC_MASTER" $RC_MASTER
           exit 1
        fi
}

#
# Upgrade user calendars at system upgrade time.
#

do_sdtcm_convert() {

  SDTCM_CONVERT=$PKG_INSTALL_ROOT/usr/dt/bin/sdtcm_convert
  CALENDAR_DIR=$PKG_INSTALL_ROOT/var/spool/calendar

# Check for existence of /var/spool/calendar.
  if [ ! -d $CALENDAR_DIR ]; then
    return 1
  fi

# Check for local /var/spool/calendar.
  ret=`/bin/df -l $CALENDAR_DIR`
  if [ $? != 0 ]; then   
    Message 36 "Skipping the upgrade of user calendar files - \n  /var/spool/calendar is not a local file system." 
    return 1
  fi

# Check for existence of calendar files.
  count=`(ls $CALENDAR_DIR/callog.* | wc -l) 2>/dev/null`
  if [ $count = 0 ]; then
    return 1
  fi

# Check for existence of $SDTCM_CONVERT.
  if [ ! -x $SDTCM_CONVERT ]; then
     Message 37 "Skipping the upgrade of user calendar files - \n  sdtcm_convert is not available." 
     return 1
  fi

  cd $CALENDAR_DIR
  Message 38 "\nUpgrading Calendar Files ..."

# Create links needed by sdtcm_convert.
  if [ ! -r /var/spool ]; then
    /bin/mkdir -p /var/spool 1>/dev/null 2>&1
  fi
  if [ ! -r /var/spool/calendar ]; then
    /bin/ln -s $CALENDAR_DIR /var/spool/calendar 1>/dev/null 2>&1
  fi
  if [ ! -r /usr/spool ]; then
    /bin/ln -s /var/spool /usr/spool 1>/dev/null 2>&1
  fi

  for file in $CALENDAR_DIR/callog.* ; do
# Split off the username.
    user=`echo $file | /usr/bin/sed "s/.*callog\.//"`
    print ""
    Message 39 "Checking calendar $user ..."
    if [ -r calorig.${user} ]; then
# Save the backup, in case the calendar is OK, and does not
# need to be upgraded.
      /bin/mv calorig.${user} calorig.${user}.tmp 1>/dev/null 2>&1
    fi
    export LD_LIBRARY_PATH=${PKG_INSTALL_ROOT}/usr/dt/lib:${LD_LIBRARY_PATH}
    $SDTCM_CONVERT -v 4 $user </dev/null 1>/dev/null
# Handle error condition.
    status=$?
# echo "Status: " $status
    if [ $status -gt 0 ]; then
      Message 40 "Cannot upgrade calendar $user at this time."
    elif [ ! -r calorig.${user} ]; then
      Message 41 "Calendar OK."
    else
      Message 42 "Calendar $user upgraded, old version saved in /var/spool/calendar/calorig.$user."
    fi
# Restore the backup of the backup if no new backup was created,
# because the calendar was OK, and did not need to be upgraded.
    if [ ! -r calorig.${user} -a -r calorig.${user}.tmp ]; then
      /bin/mv calorig.${user}.tmp calorig.${user} 1>/dev/null 2>&1
    elif [ calorig.${user}.tmp ]; then
      /bin/rm -f calorig.${user}.tmp 1>/dev/null 2>&1
    fi
  done
  
  Message 43 "\nDone Upgrading Calendar Files.\n" 
}

is_enabled()
{

        enabled=`/usr/bin/svcs -l $1 | /usr/bin/grep '^enabled' | awk '{print $2}'`
        [ "$enabled" = "true" ] && /usr/sbin/svcadm enable -t $1 || /usr/sbin/svcadm disable -t $1

}

disable_dtlogin () 
{
	is_enabled $FMRI
	/usr/sbin/svccfg -s $FMRI setprop general/enabled = boolean: false

        if [ $? = 0 ]; then
                Message 14 "done"
                Message 15 "desktop auto-start disabled."
        else
                Message 12 "disable failed"
        fi
}

enable_dtlogin () 
{
	is_enabled $FMRI
	/usr/sbin/svccfg -s $FMRI setprop general/enabled = boolean: true

        if [ $? = 0 ]; then
                Message 14 "done"
                Message 20 "desktop auto-start enabled."
        else
                Message 16 "enable failed"
        fi
}

kill_dtlogin ()
{
        /usr/sbin/svcadm disable -t $FMRI

	if [ $? = 0 ]; then
                Message 14 "done"
                Message 21 "dtlogin kill complete."
        fi
}

refresh_dtlogin ()
{
        /usr/sbin/svcadm refresh $FMRI

        if [ $? = 0 ]; then
                Message 14 "done"
                Message 22 "dtlogin config resources reloaded."
        fi
}

print_actions ()
{
        rc_master_check

        $RC_MASTER update_printers

        Message 14 "done"
        Message 23 "printer action update is complete"
}

enable_inetd () {

        Message 27 "Next system boot, following will be run from /usr/dt/bin"

        /usr/sbin/svcadm enable network/rpc/cde-ttdbserver:tcp
        if [ $? = 0 ];then
                Message 28 "    rpc.ttdbserverd         (ToolTalk)"
        fi

        /usr/sbin/svcadm enable network/cde-spc:default
        if [ $? = 0 ];then
                Message 30 "    dtspcd                  (Subprocess Control)"
        fi
        
        /usr/sbin/svcadm enable network/rpc/cde-calendar-manager:udp
        if [ $? = 0 ];then
                Message 29 "    rpc.cmsd                (Calendar Manager)"
        fi
        do_sdtcm_convert

}

enable_inetd_openwin () {
        echo dtconfig: obsolete openwin services removed
}

case "$mode" in
        -d)     disable_dtlogin
                ;;

        -e)     enable_dtlogin
                ;;

        -kill)  kill_dtlogin
                ;;

        -reset) refresh_dtlogin
                ;;

        -p)     print_actions
                ;;

        -inetd) enable_inetd
                ;;

        -inetd.ow) enable_inetd_openwin
                ;;

        *)      Message 24 "Usage:"
                usage_error
		exit 1
                ;;
esac
exit 0
