:
#  ------------------------------------------------------------------------
#  Title        : BITs-service shell
#  ------------------------------------------------------------------------
#                  This is an UNPUBLISHED work COPYRIGHT by
#                 "ArtCom, Atelier fuer Computergrafik GmbH"
#          Schwachhauser Heerstr. 78, D-2800 Bremen 1, West-Germany
#       It may be used, copied, or distributed only as permitted in a
#                              written license.
#  ------------------------------------------------------------------------
#  Created      :            19-Mar-89 / 10:00 / (pf)
#  Version      :       Fri, 17-Nov-95 / 05:03 / (rb,pf,mk+)
#  Portability  : Bourne shell
#  State        : under development
#  Purpose      : belongs to BITS
#I Usage        : none, normally Login-shell for user 'service'
#I Remarks      : user 'service' must have root-rights !
#  ------------------------------------------------------------------------
#
# einige nuetzliche Bourne Shell Prozeduren
#
# PROCEDURE Yes : Prompt for yes or no answer - returns non-zero for no
Yes() {
	while	read yn
	do	case $yn in
		       [yYjJ])	return 0 	;;
		       [nN])	return 1	;;
		       *) Error 1
		       ;;
		esac
	done
}
#
# PROCEDURE Error (msgNum : CARDINAL);
Error() {
	PARAM=$1
	(echo "\007\c"; Print serviceSH 2;
	 echo " : "; PrintLn serviceSH ${PARAM}) >&2
	return 1
}
#
# PROCEDURE Super : BOOLEAN;  (* are we root ? else error ! *)
Super() {
    if [ -w /etc/passwd ]
    then	return 0
    else	
#> Sie muessen Superuser ('root') -Zugriffsrechte haben.
		Error 3
#> Der Benutzer 'service' sollte die userid-Nummer '0' haben !
#> Bitte pruefen Sie, ob Sie sich als service eingeloggt haben und was
#> in der /etc/passwd steht.
		MultiPrint serviceSH 4 5 6
	    return 1
    fi
}
#
Interuptus() {
    PrintLn serviceSH 7 #> *** Kommando abgebrochen !!! ***
    BREAK=1
}
#
Prolog() {
    [ "$OS" != "SCOSV" ] && [ "$OS" != "XENIX" ] && return 0
    # Sicherheitshalber (man weiss ja nie, ob vielleicht abgestuerzt):
    /bitslib/bin/ACDemon < /dev/tty12 > /dev/tty12 2> /dev/tty12 &
}
#
StartServer() {
    [ "$OS" != "SCOSV" ] && [ "$OS" != "XENIX" ] && return 0
    if [ "`ps -e | grep Server`" ]
    then	#> Es laeuft bereits ein Server !
	    PrintLn serviceSH 57
    else	GetThem
	    /bitslib/bin/clearipc
	    /bitslib/bin/VisKill
	    rm -f /bitslib/bin/*old 2> /dev/null
	    stty intr \^c
	    if [ -f /customer/ASYNCSVR ]
	    then nice --6 $SERVER -s
	    else nice --6 $SERVER
	    fi
	    stty intr \^?
    fi
}
#
CallTerminal() {
    Print serviceSH 8 #> Fernwartung. Haben Sie den Modemanruf angekuendigt ?
    if Yes
    then while 
#> Wo soll der Anruf hingehen ? 
#>    a. ArtCom-Bremen (0421-3491210) / Modellier- und Anwendungsprobleme ...
#>    b. Ralf Buchenau (0421-219163) / Software-Fehler Paint, Prism, Preview, ...
#>    c. Peter Funk (04222-6018)    / Software-Fehler Model, HiQIR, ...
#>    d. Wilfried Manske (04283-459) / System-Software, Hardware, ...
		MultiPrint serviceSH 9 10 11 12 13
		Print serviceSH 14 ; do #> Waehlen Sie einen Buchstaben > 
		    read zif
		    case "$zif" in
		       a*) if [ "$ARTCOM_KURZWAHL" ]
			   then NUM=$ARTCOM_KURZWAHL
			   else NUM=0421-3491210 
			   fi ;;
		       b*) if [ "$RABU_KURZWAHL" ]
			   then NUM=$RABU_KURZWAHL
			   else NUM=0421-219163 
			   fi ;;
		       c*) if [ "$PEFU_KURZWAHL" ]
			   then NUM=$PEFU_KURZWAHL
			   else NUM=04222-6018  
			   fi ;;
		       d*) if [ "$WM_KURZWAHL" ]
			   then NUM=$WM_KURZWAHL
			   else NUM=04283-459
			   fi ;;
		       *)  break ;;
		    esac
		    ct -s 2400 $NUM &
		    GetMessage serviceSH 15
		    echo $MESSAGEW
		    #> "Das Modem muesste jetzt die Nummer $NUM waehlen...
#> Beobachten Sie bitte an der 'DCD' bzw. 'CD'-Leuchtdiode des Modems, ob 
#> auch wirklich eine Verbindung zustande kommt."
		    MultiPrint serviceSH 16 17
		    sleep 5
		    break
	 done
    fi
}
#
Fernwartung() {
    if [ ! "$MODEMPORT" ]
    then MODEMPORT=tty2A
    fi
    while GetMessage serviceSH 18; echo $MESSAGE;
#>    1. Freischalten des Modem fuer ankommende Anrufe.
#>    2. Sperren das Modem fuer ankommende Anrufe.
#>    3. Eine Fernwartungs-Verbindung herstellen.
	MultiPrint serviceSH 19 20 21 ;
#>Waehlen Sie bitte eine Ziffer > \c" ; do
	Print serviceSH 22 ; do
	read fcmd
	case "$fcmd" in
	    1*) DIRECTPORT=`echo $MODEMPORT | tr "[A-Z]" "[a-z]"`
		disable $DIRECTPORT 2> /dev/null >/dev/null
		enable  $MODEMPORT
#> Am Modem muessten jetzt die 4 mittleren Laempchen an sein.
#> Speziell die mit 'DTR' oder 'TR' beschriftete Diode muesste leuchten"
		MultiPrint serviceSH 23 24
		;;
	    2*) disable $MODEMPORT
#> Am Modem muessten jetzt nur noch 2 Laempchen an sein.
#> Speziell die mit 'DTR' oder 'TR' beschriftete Diode muesste erloschen sein.
		MultiPrint serviceSH 25 26
		;;
	    3*) CallTerminal 
		;;
	    *) #> Es wurde keine der angebenen Ziffern ausgewaehlt
	       PrintLn serviceSH 27
	       break 
	       ;;
	esac
    done
}
#
#
# PROCDURE AssertDeviceNode (devicefilename : STRING; 
#			     drivername     : STRING;
#			     minorDeviceNum : INTEGER);
# richtet das Device-File ein, falls noch nicht vorhanden !
AssertDeviceNode() {
    if   [ -c $1 ] || [ -b $1 ]
    then : Device ist bereits da, wunderbar 
    else # Bestimmen der Major-Devicenumber mit Hilfe des Driver-Namens
	 # anhand der Informationen aus dem Link-Kit
	 if   [ "$OS" = "XENIX" ]
	 then MAJOR=`/usr/sys/conf/configure -j $2 -f /usr/sys/conf/master \
						      /usr/sys/conf/xenixconf`
	      mknod $1 c $MAJOR $3
         elif [ "$OS" = "SCOSV" ]
         then MAJOR=`(cd /etc/conf/cf.d;configure -j $2)`
	      mknod $1 c $MAJOR $3
         elif [ "$OS" = "SunOS" ]
         then /bitslib/service/bin/devconf -n
         fi
    fi
    if   [ -c $1 ] || [ -b $1 ]
    then return;
    else false;
    fi
}
# 
SystemSicherung() {
    while
#> --- Betriebssystem-Sicherungsband erstellen ---
#> Waehlen Sie ein Ausgabegeraet aus und legen dort ein Band ein :
#> 	1. Spulenmagnetband (/dev/rmt0)
#> 	2. EXAbyte - Kassette (/dev/exa)
#> 	3. Catridge - Streamer (/dev/erct0)
#> 	Z. Zurueck ins Service-Menue
	MultiPrint serviceSH 28 29 30 31 32 33
#> Waehlen Sie bitte eine Ziffer > 
	Print serviceSH 34 ; do
	read scmd
	case "$scmd" in
	    1*)    /bitslib/service/saveSystem
		   break 
		   ;;
	    2*)    if   [ "$OS" = "XENIX" ]
	           then AssertDeviceNode /dev/exar sseq 5
	           elif [ "$OS" = "SCOSV" ]
	           then AssertDeviceNode /dev/exa exa  4
		   else test -c /dev/exa
	           fi
		   if   [ "$?" = 0 ]
		   then /bitslib/service/saveSystem /dev/exa
		   fi
		   break 
		   ;;
	    3*)    /bitslib/service/saveSystem /dev/erct0
		   break 
		   ;;
	    [zZ]*) break 
		   ;;
	    *)     ;;
	esac
    done
}
#
SetTime() {
    if   [ "$OS" = SCOSV ] || [ "$OS" = XENIX ]
    then :
#> Mit dieser Zeiteinstellung wird auch die batteriegepufferte Uhr gestellt.
#> Bitte nur Ziffern und keine Doppelpunkte oder Punkte eingeben !
	 MultiPrint serviceSH 64 65
	 /etc/asktime
	 if [ -f /etc/hosts ]
	 then rdate
	      # Assume TCP/IP - Installation with timed running
	 fi
    else status=
	 while true;
	 do BlockPrint setTime intro
	    date; echo ""
	    set -- `date +"%d %m %y %H %M"`
	    day=$1; month=$2; year=$3; hour=$4; minute=$5
	    export day month year hour minute
	    export default
	    BREAK=
	    default=$day; GetMsg setTime 1;
	    read day; [ "$BREAK" ] && return;
	    [ -z "$day" ] && day=$default
	    default=$month; GetMsg setTime 2;
	    read month; [ "$BREAK" ] && return;
	    [ -z "$month" ] && month=$default
	    default=$year; GetMsg setTime 3;
	    read year; [ "$BREAK" ] && return;
	    [ -z "$year" ] && year=$default
	    default=$hour; GetMsg setTime 4;
	    read hour; [ "$BREAK" ] && return;
	    [ -z "$hour" ] && hour=$default
	    default=$minute; GetMsg setTime 5;
	    read minute; [ "$BREAK" ] && return;
	    [ -z "$minute" ] && minute=$default
	    date="$month$day$hour$minute$year"
	    case "$date" in 
		 [0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9])
		    if   status="\n`date "$date"`\n"
		    then return
		    fi
		    ;;
		 *) status=`GetMsg setTime wrongFormat`
		    ;;
	    esac
	 done
    fi
}
#
GetThem() {
	# Bei erstmaliger Installation von 2.2.2 fehlt in /customer/.cshrc
	# noch LANGUAGE, was zum Fehler in unten fuehrt; die csh bricht bei
	# Interpretation von $LANGUAGE das Pseudo-Pipe-Skript ab. Um diesen
	# Effekt (der auch bei spaeteren Erweiterungen beachtet werden muss)
	# zu vermeiden, definiere ich hier LANGUAGE schon mal vor. Wahrschein-
	# lich koennte man die gesamte Defaultbehandlung von unten unbedingt
	# hier hochziehen. Ein Test mit simplem Kopieren ist aber fehlgeschla-
	# gen, und ich habe keine Lust mehr...
	LANGUAGE=deu; export LANGUAGE
	STDTAPE=TAPE; export STDTAPE
	# Bisherige Einstellung pruefen...
	if [ -r /customer/.cshrc ]
	then cat << EOF | csh > /tmp/doitnow.$$
	     source /customer/.cshrc
	     echo "BITSENV=\$BITSENV"
	     echo "PATH=\$PATH"
	     echo "ICONS=\$ICONS"

	     echo "PHYSMEM=\$PHYSMEM"
	     echo "GRDEVICE=\$GRDEVICE"
	     echo "BGLCOPIES=\$BGLCOPIES"
	     echo "VMEMFLAG=\$VMEMFLAG"
	     echo "VMEM=\$VMEM"
	     echo "TMP=\$TMP"
	     echo "SCANNER=\$SCANNER"
	     echo "COLORPRN=\$COLORPRN"
	     echo "LANGUAGE=\$LANGUAGE"
	     echo "STDTAPE=\$STDTAPE"
EOF
	     . /tmp/doitnow.$$
	     rm /tmp/doitnow.$$
	fi
	# Assume some defaults for undefined environment variables :
	[ "$BITSENV" ]	|| BITSENV=/bitslib/env
	PATH=${PATH}:/bitslib/bin
	[ "$ICONS" ]	|| ICONS=/projects/icons:/bitslib/icons
	[ "$me" ]	|| me="xyz `who am i | awk '{print $2}'`"
	TERMLINE=`who am i | awk '{print $2}'`
	[ "$PHYSMEM" ]	|| PHYSMEM=400
	[ "$GRDEVICE" ]	|| GRDEVICE=WacomII
	[ "$BGLCOPIES" ]	|| BGLCOPIES=0
	[ "$VMEMFLAG" ]	|| VMEMFLAG=fix
	[ "$VMEM" ]	|| VMEM=/projects/vmem/.VMEM
	[ "$TMP" ]	|| TMP=/projects/tmp
	[ "$SCANNER" ]	|| SCANNER=NONE
	[ "$COLORPRN" ]	|| COLORPRN=versatec.dev
	[ "$LANGUAGE" ]	|| LANGUAGE=deu
	[ "$STDTAPE" ]	|| STDTAPE=TAPE
	[ "$BITSERR" ]  || BITSERR=bitserr.srf
	export BITSERR BITSENV PATH ICONS me TERMLINE \
	       PHYSMEM GRDEVICE BGLCOPIES VMEMFLAG VMEM TMP \
	       SCANNER COLORPRN LANGUAGE STDTAPE
}
# ===============================================================
# Main part starts here :
# ===============================================================
#
GetThem
if [ "${LANGUAGE}" ]
then :
else LANGUAGE=deu
fi
export LANGUAGE
MSG_CAT=/bitslib/service/SERVImsg.${LANGUAGE}
. /bitslib/bin/.Messages

# ASSERT, that we are 'root' :
Super || exit 1
#
trap Interuptus 1 2 3 15
if [ -r /customer/serviceenv ]
then . /customer/serviceenv
fi

SERVER=/bitslib/bin/Server
case `logname` in
     vservice) SCREEN=VGA;;
     nservice) SCREEN=NONE;;
     xservice) DISPLAY=artcomm:0.0; export DISPLAY ;;
     dservice) SCREEN=VGA;
	       SERVER=/bits/cross/ugnu/bin/Server;
	       PATH="$PATH:/bits/cross/ugnu/bin";;
	    *) SCREEN=;;
esac
export SCREEN

#> Verfuegbare Service-Kommandos :
#> 	 0. Server starten.
#> 	 1. BITs Software Update vom Magnetband installieren.
#> 	 2. Neue Benutzer-Accounts fuer Anwender einrichten.
#> 	 3. Die Zugriffsrechte auf der BITs-Software korrigieren.
#> 	    (Dies ist nur noetig, wenn durch eine Stoerung oder ein als
#> 	     root fehlerhaft eingegebenes Kommando die Zugriffsrechte
#> 	     an Dateien in /bitslib nicht mehr stimmen)
#> 	5b. Gesamt-Betriebssystem-Sicherung erstellen.
#> 	    (einschliesslich OS und 'BITs', aber ohne /projects !)
#> 	 7. System-Konfiguration veraendern.
#> 	 9. Systemuhr stellen.
#> 	10. System herunter fahren.
#> 	   
#> 	Waehlen Sie einen Menuepunkt oder 'e' fuer Ende : \c"

while 	stty sane erase \^h echoe ;
	tput clear
	BlockPrint serviceSH mainMenuHeader;
	[ -x "/bitslib/bin/Server" ] && BlockPrint serviceSH startServer;
	BlockPrint serviceSH mainMenu;
do	:
        Prolog
        read ans
	case "$ans" in
	0)	StartServer
		;;
	1)	
		#> ==> Installation neuer BITs-Software <==
		PrintLn serviceSH 59
#> Haben Sie das Band mit der neuen Software vorliegen ?
		Print serviceSH 60
		if   Yes
		then exec /bitslib/service/install
		fi
		;;
	2)	/bitslib/service/moreuser
		;;
	3)	/bitslib/service/fixp
		;;
	5b)	SystemSicherung
		;;
	7)	sh /bitslib/service/setup
		# ohne explizite "sh" erfolgte ein "shell memory fault" !?
		;;
        9)	SetTime
		;;
	10)
#> Bitte pruefen Sie, ob Sie nicht irgendwelche Programme im Hintergrund
#> gestartet haben, die durch den SHUTDOWN abgebrochen werden wuerden.
#> 
#> Wollen Sie das System jetzt herunter fahren ? (j/n) 
		MultiPrint serviceSH 66 67 68 69
		Yes && /bitslib/service/shutdown.sh
		;;
	[eEqQ]) break
		;;
	*)	
#> Bitte waehlen Sie eine der aufgelisteten Ziffern oder 'e' zum Verlassen.
		PrintLn serviceSH 70
		;;
	esac
	Print serviceSH 71 #> Weiter mit <Enter> : 
	read dummy
done

