#!/bin/sh
#  Copyright (c) 2006, 2020, Oracle and/or its affiliates.
#
#  Component: Printing
#  Author:    Bill Weir
#
#  Move queued print jobs from one Tarantella server to another.

# This is a generic product script used to establish an environment
# before starting/stopping a product or component.
# This script was built from shell library
#   $Id$
# This script has to run on every platform we support.  Any suggestions
# for improvement are welcome (but must be portable!)

# Version numbers
PRODUCT_VERSION="5.60.514"
PRODUCT_VERSION_FULL="5.60.514"
PRODUCT_VERSION_MAJOR=5
PRODUCT_VERSION_FEATURE=6
PRODUCT_VERSION_BUG=0
PRODUCT_VERSION_BUILD=514
PRODUCT_VERSION_BUILD_DECIMAL=514
PRODUCT_VERSION_AS_NUMBER=560514
PRODUCT_VERSION_CAB=5,6,0,514
PRODUCT_VERSION_RPM=5.60-514

# Product names
PRODUCT_FULL_NAME="Oracle Secure Global Desktop"
PRODUCT_SHORT_NAME="Secure Global Desktop"
PRODUCT_IDENT="SSGD"
PRODUCT_SHORT_FILENAME="Tarantella"
PRODUCT_LSBSCRIPTNAME="sun.com-sgd-base"
PRODUCT_LSBSCRIPT_RUN_LEVEL="90"
TSP_FULL_NAME="Oracle Secure Global Desktop Security Pack"
TSP_SHORT_NAME="Security Pack"
WCP_FULL_NAME="Oracle Secure Global Desktop Windows Connectivity Pack"
WCP_SHORT_NAME="Windows Connectivity Pack"
TN3270_FULL_NAME="Oracle Secure Global Desktop Mainframe Connectivity Pack"
TN3270_SHORT_NAME="Mainframe Connectivity Pack"
AS400_FULL_NAME="Oracle Secure Global Desktop AS/400 Connectivity Pack"
AS400_SHORT_NAME="AS/400 Connectivity Pack"
S1PSTK_FULL_NAME="Oracle Secure Global Desktop Channel for Sun ONE Portal Server"
S1PSIP_FULL_NAME="Oracle Secure Global Desktop Integration Pack for Sun ONE Portal Server"
S1PSTK_SHORT_NAME="Secure Global Desktop Channel for Sun ONE Portal Server"
S1PSIP_SHORT_NAME="Secure Global Desktop Integration Pack for Sun ONE Portal Server"

OBJECT_MGR_NAME="Object Manager"
ARRAY_MGR_NAME="Array Manager"
NATIVE_WIN16_FULL_NAME="Oracle Secure Global Desktop Native Client for Windows 3.1"
NATIVE_WIN16_SHORT_NAME="Native Client for Windows 3.1"
NATIVE_WIN32_FULL_NAME="Oracle Secure Global Desktop Native Client for Windows 95, 98 and NT"
NATIVE_WIN32_SHORT_NAME="Native Client for Windows 95, 98 and NT"
NATIVE_WYSE_FULL_NAME="Oracle Secure Global Desktop Native Client for Wyse"
NATIVE_WYSE_SHORT_NAME="Native Client for Wyse"
NATIVE_FULL_NAME="Oracle Secure Global Desktop Native Client"
NATIVE_SHORT_NAME="Native Client"
NATIVE_REGISTRY_NAME="Tarantella Native Client"
INTCLI_FULL_NAME="Oracle Secure Global Desktop Client"
INTCLI_SHORT_NAME="Client"
TCC_FULL_NAME="Oracle Secure Global Desktop Client"
TCC_HELPER_NAME="Oracle Secure Global Desktop Client Helper"
TCC_ACTIVEX_NAME="Oracle Secure Global Desktop ActiveX Control"
TCC_PLUGIN_NAME="Oracle Secure Global Desktop Netscape Plug-in"
T3COMPONENT_WIN_NAME="Oracle Secure Global Desktop Enhancement Module for Windows"
T3COMPONENT_UNIX_NAME="Oracle Secure Global Desktop Enhancement Module for UNIX(TM) and Linux Platforms"
T3COMPONENT_SHORT_UNIX_NAME="tem"
T3COMPONENT_NAME="Oracle Secure Global Desktop Enhancement Module"
T3COMPONENT_LSBSCRIPTNAME="sun.com-sgd-em"
T3COMPONENT_LSBSCRIPT_RUN_LEVEL="90"
GWCOMPONENT_UNIX_NAME="Oracle Secure Global Desktop Gateway for UNIX(TM) and Linux Platforms"
GWCOMPONENT_NAME="Oracle Secure Global Desktop Gateway"
GWCOMPONENT_SHORTNAME="SGD Gateway"
GWCOMPONENT_LSBSCRIPTNAME="sun.com-sgd-gw"
GWCOMPONENT_LSBSCRIPT_RUN_LEVEL="91"

# Watch the length of these names: IE refuses to remove packages if
# the name is too long.
ARCHIVE_NAME_ttalw="TCC Helper, version"
ARCHIVE_NAME_asad="3.x Framework Java Archive"
#ARCHIVE_NAME_tta="3.x Java Archive"
#ARCHIVE_NAME_tta="3.x Combined Java Archive"
ARCHIVE_NAME_tta="Client, "
ARCHIVE_NAME_tsp="3.x Security Java Archive"
ARCHIVE_NAME_proxy="3.x Proxy Java Archive"
WEBSTART_JAR_NAME="sgdwscs"
ARCHIVE_SUFFIX="K"

NS_REGKEY="java/download/com/tarantella/tta"

PRODUCT_VENDOR="Oracle Corporation, Inc."
PRODUCT_SHORT_VENDOR="Oracle"

# Capabilities:
# The format for the capabilities required by the client end of a
# connection is: CAPABILITIES_protocol_type_REQUIRED="expression"

# The format for the capabilities provided by the server end of a
# connection is: CAPABILITIES_protocol_type_PROVIDED="c1 c2 ... c3"

# Asad between a webtop client and server:
CAPABILITIES_ASAD_WEBTOPCLIENT_REQUIRED="(1.1 || 1.2)"
CAPABILITIES_ASAD_WEBTOPCLIENT_PROVIDED="1.1 1.2"

# Asad between two peer servers, or an admin tool and a server:
# 1.1 is core E3 array functionality.
# 1.2 is 3.01 array interoperability functionality.
# 2.1 is core Pisa client device mapping functionality (not a requirement)
CAPABILITIES_ASAD_PEER_REQUIRED="(1.1 || 1.2)"
CAPABILITIES_ASAD_PEER_PROVIDED="1.1 1.2 2.1"

# Client versions of server strings; same format, name prefixed by CLIENT
# Asad between a webtop client and server:
CLIENTCAPABILITIES_ASAD_WEBTOPCLIENT_REQUIRED="(1.1 || 1.2)"
CLIENTCAPABILITIES_ASAD_WEBTOPCLIENT_PROVIDED="1.1 1.2"

# Top-level item names in ENS datastore
DEFAULT_ROOT_ENS="organization"
SYSTEM_ROOT_ENS="Tarantella System Objects"
APP_ROOT_ENS="applications"
APPSERVER_ROOT_ENS="appservers"

WEB_SERVICES_VERSION=1.9


# be paranoid about the current path
if [ -d /bin ]; then
  PATH=/bin:$PATH
fi
if [ -d /sbin ]; then
  PATH=/sbin:$PATH
fi
if [ -d /usr/bin ]; then
  PATH=/usr/bin:$PATH
fi
if [ -d /usr/sbin ]; then
  PATH=/usr/sbin:$PATH
fi
if [ -d /etc ]; then
  PATH=/etc:$PATH
fi
export PATH

N=""
C=""
if echo -n | grep n > /dev/null
then
  C="\c"
else
  N="-n"
fi
case "$MACHINEARCH" in
i3li*|ppli*) N="$N -e" ;;
esac
_ss_headlines="--------------------------------------------------------------------------"

u="`LANG=C LC_ALL=C id | sed 's/.*uid=\([0-9][0-9]*\).*/\1/'`"
if [ "$u" = "0" ]
then
  : # all is okay
else
  echo "You must be root to run this program"
  exit 15
fi

if [ -z "$0" ]; then
  who_i_am=""
else
  who_i_am=`expr "//$0" : '.*/\(.*\)' `
fi

ttacommand=$0
case "$ttacommand" in
/*) cd `dirname $ttacommand`
    ;;
*)  fullpath=`pwd`/$ttacommand
    cd `dirname $fullpath`
esac

lf_nomessages="No message files installed for LANG="
l_langdefault="Attempting to use default English (en-us) messages"
l_langunknown="Unrecognized \$LANG: "
l_langunset="\$LANG is not set."
lf_langright="Please check the \$LANG variable is correct."
l_langsetto="\$LANG is currently set to: "
l_gottheselangs="Message files are installed for the following languages:"
l_usinglang="Using messages in"
[ -z "$LANG" ] && LANG="C"

TTALANG=$LANG
case "$TTALANG" in
C)  TTALANG="en-us"
    ;;
[a-z][a-z]_[A-Z][A-Z])
    # convert LANG format from ab_CD to ab-cd
    TTALANG=`echo "$TTALANG" | LANG=C LC_ALL=C tr '[A-Z]_' '[a-z]-'`
esac

if [ ! -d $TTALANG -o -z "$TTALANG" ]; then
  [ ! -z "$TTALANG" ] && posslangs=`find . -type d -name "$TTALANG*" -print 2>/dev/null | sed 's;.*\/.*\/.*;;'`

  [ -z "$posslangs" ] && posslangs=`find . -type d -name '[a-z][a-z]-[a-z][a-z]*' -print 2>/dev/null | sed 's;.*\/.*\/.*;;'`

  nposslangs=`echo $posslangs | wc -w`
  if [ "$nposslangs" -gt 1 ]; then
    case "$TTALANG" in ?) TTALANG=en-us;; esac
    tmpTTALANG=$TTALANG
    for a_lang in $posslangs; do
      output=`echo $a_lang | sed -e 's/.*\///'`
      if [ -f $output/common -o -f ../$output/common ]; then
	[ "$tmpTTALANG" != "en-us" ] && tmpTTALANG=$output
      fi
    done
    [ "$TTALANG" = "$tmpTTALANG" ] && TTALANG=en-us || TTALANG=$tmpTTALANG	
  elif [ "$nposslangs" -eq 1 ]; then
    TTALANG=`echo $posslangs | sed -e 's/.*\///'`
  else
    echo "$lf_reinst"
    exit 5
  fi
fi

TTAMSG=`pwd`/$TTALANG
export TTAMSG TTALANG
if [ $trace ]; then echo "   trace: Language dir = $TTAMSG"; fi

if [ -f $TTAMSG/common -a -f $TTAMSG/print_move ]; then
  . $TTAMSG/common
  . $TTAMSG/print_move
else
  echo "Unable to open message file: $TTAMSG/print_move"
  exit 1
fi


ARCH="@@ARCH@@"
TTADIR="@@TTADIR@@"
OK=t
case "${ARCH}" in
@@*@@) 	OK="";;
*)	case "${TTADIR}" in
	@@*@@) OK=""
	esac
esac
[ -z "${OK}" ] && { echo "Fatal error in $0" >&2; exit 1; }

QUEUEDIR="${TTADIR}/var/print/queue"
TTA_HOST=""
TTA_PRINTER="tta_printer"
APP_PRINTER="tta_prtmove"
CUPS=""
USAGE=""
PRESERVE=""
PRINTCAP_FULL=/etc/printcap
PRINTCAP_LOCAL=/etc/printcap.local

while [ -z "${USAGE}" -a -n "$1" ]; do
    case "$1" in
    --help) 
	echo "${m_longusage}" >&2
	exit 0
        ;;
    --server) 
	TTA_HOST="$2"
	shift
        ;;
    --printer) 
	TTA_PRINTER="$2"
	shift
        ;;
    --cups) 
	case "$2" in
	[${a_case_yes}]*) CUPS=y;  shift;;
	[${a_case_no}]*)  CUPS=n;  shift;;
	${a_auto})        CUPS=""; shift;;
	*)  echo "${m_unknownarg}--cups $2"
	    USAGE="t"
	esac
        ;;
    --preserve) 
	PRESERVE="t"
        ;;
    *)  echo "${m_unknownarg}$1"
	USAGE="t"
    esac
    shift
done

if [ -n "${USAGE}" -o -z "${TTA_HOST}" ]; then
    echo "${m_shortusage}" >&2
    exit 1
fi

cd ${QUEUEDIR}
jobCount=`ls | wc -l`

if [ "${jobCount}" -eq 0 ]; then
    echo "${m_nojobs}" >&2
    exit 0
fi

getProcessInfo() #######################################################
{
    case "${ARCH}" in
    i3li*|ppli*) processInfo=`ps ajx 2>/dev/null | awk '$2=="'"$1"'"{print}'` ;;
    *)     processInfo=`ps -fp$1 2>/dev/null | awk '$2=="'"$1"'"{print}'`
	   [ -z "$processInfo" ] && processInfo=`ps -ajx 2>/dev/null | awk '$2=="'"$1"'"{print}'`
    esac
    echo "$processInfo"
    return 0
}

LPRngTidy() ############################################################
{
    PATH=/usr/sbin:/usr/bin:/etc:${PATH} export PATH

    # For LPRng we need to tell the running lpd daemon that we have
    # changed the printer configuration.  Hopefully if we are not 
    # running LPRng this command will fail silently.
    #
    # For some unknown reason "lpc reread" sometimes hangs forever, so we
    # run it in background and kill it if it's still around after a minute.
    #
    # Only use the lpc from tarantella install
    _lpc= ${TTADIR}/bin/bin/lpc
    [ -n "${_lpc}" ] && { ${_lpc} reread >/dev/null 2>&1 & pid=$!; }
    for i in 0 1 2 3 4 5 6 7 8 9 A B; do
	processInfo=`getProcessInfo $pid`
	if [ -z "$processInfo" ]; then
	    # process has exited
	    pid=''
	    break
	fi
	sleep 5
    done
    if [ -n "$pid" -a "$pid" != "1" ]; then
	kill $pid 2>/dev/null
	sleep 1
	kill -9 $pid 2>/dev/null
    fi

    # For some other unknown reason "lpc reread" sometimes doesn't work
    # at all, so try sending SIGHUP to the running lpd process.
    case "${ARCH}" in
    i3li*|ppli*) _psflags="ajx" _parentfield=1;;
    *) 	   _psflags="-ef" _parentfield=3
    esac
    _pid=`ps "${_psflags}" 2>/dev/null |
	  egrep '( |/)lpd( |$)' |
	  awk '$'"${_parentfield}"'==1{print $2}'`
    [ -n "${_pid}" ] && kill -1 "${_pid}"


    # Some Linux systems have a checkpc command that fixes things like
    # spool directory permissions.  Its man page says that it may need
    # to be run several times.
_checkpc=''
for _dir in `echo "$PATH" | tr : ' '`; do
    case "${_dir}" in
    /*) [ -x "${_dir}/checkpc" ] && { _checkpc="${_dir}/checkpc"; break; }
    esac
done

    [ -n "${_checkpc}" ] && {
	${_checkpc} -f >/dev/null 2>&1
	${_checkpc} -f >/dev/null 2>&1
	${_checkpc} -f >/dev/null 2>&1
    }
    
    return 0
}

CreateRemotePrinter()
{
    ${TTADIR}/bin/bin/lpadmin -x ${APP_PRINTER} 2>/dev/null
    ${TTADIR}/bin/bin/lpadmin -p ${APP_PRINTER} -v lpd://${TTA_HOST}/${TTA_PRINTER} -E
    return 0
}

if CreateRemotePrinter; then
    real_lpr="" real_lp=""

    # Configure the print commands to only use the SGD server installed cups.
    if [ -f ${TTADIR}/bin/bin/lp ];  then real_lp="${TTADIR}/bin/bin/lp" ; fi
    if [ -f ${TTADIR}/bin/bin/lpr ]; then real_lpr="${TTADIR}/bin/bin/lpr" ; fi

    ls | while read jobName; do
	case "${ARCH}" in
	i3li|ppli) echo ${real_lpr} -P${APP_PRINTER} ${jobName}
	      ${real_lpr} -P${APP_PRINTER} ${jobName}
	      [ $? -eq 0 -a -z "${PRESERVE}" ] && rm -f ${jobName}
	      ;;
	*)    echo ${real_lp} -c -d${APP_PRINTER} ${jobName}
	      ${real_lp} -d${APP_PRINTER} ${jobName}
	      [ $? -eq 0 -a -z "${PRESERVE}" ] && rm -f ${jobName}
	esac
    done
fi

exit 0
