576 lines
17 KiB
Plaintext
Executable File
576 lines
17 KiB
Plaintext
Executable File
$INCLUDE UNIVERSE.INCLUDE MTF.INCL.H
|
|
$INCLUDE UNIVERSE.INCLUDE MACHINE.NAME
|
|
$INCLUDE UNIVERSE.INCLUDE FILENAMES.H
|
|
******************************************************************************
|
|
*
|
|
* Routine to handle Deadlock Administration
|
|
*
|
|
* Module %M% Version %I% Date %H%
|
|
*
|
|
* (c) Copyright 1998 Ardent Software Inc. - All Rights Reserved
|
|
* This is unpublished proprietary source code of Ardent Software Inc.
|
|
* The copyright notice above does not evidence any actual or intended
|
|
* publication of such source code.
|
|
*
|
|
*******************************************************************************
|
|
*
|
|
* Maintenence log - insert most recent change descriptions at top
|
|
*
|
|
* Date.... GTAR# WHO Description........................................
|
|
* 10/14/98 23801 SAP Change copyrights.
|
|
* 10/11/96 19412 JEM Fixed uvlockd.log viewing
|
|
* 09/30/96 19315 PEJ On NT use uvbootd to start uvdlockd
|
|
* 07/11/96 18812 ALC Ported to NT
|
|
* 06/17/96 18403 DTM Changes due to testing
|
|
* 06/13/96 18403 DTM Initial programming
|
|
*
|
|
*******************************************************************************
|
|
* This subroutine will accept as an argument the value of the operation
|
|
* to perform. It can perform the following functions on spooler jobs:
|
|
******************************************************************************
|
|
id = "%W%"
|
|
******************************************************************************
|
|
* Various Prompts and Help string values
|
|
******************************************************************************
|
|
equ PRMPT.LOC to 2
|
|
equ SHRT.HELP to 4
|
|
equ LONG.HELP to 5
|
|
******************************************************************************
|
|
* Various other variables
|
|
******************************************************************************
|
|
equ PAINT to 1 ;* flag to paint forms
|
|
equ Yes to 1
|
|
equ No to 0
|
|
equ Default to 1
|
|
******************************************************************************
|
|
* Strings representing shell scripts to be executed and files used
|
|
******************************************************************************
|
|
temp=NULL
|
|
CALL *ISUSER.B(0,temp)
|
|
IF temp=0 THEN
|
|
TPRINT UVREADMSG(071000,"")
|
|
SLEEP 3
|
|
STOP
|
|
END
|
|
|
|
OPTION = FIELD( @SENTENCE, " ", 4 )
|
|
|
|
GOSUB init.messages ;* Initialize messages
|
|
|
|
BEGIN CASE
|
|
CASE OPTION = 1 ;* Examine the logfile
|
|
GOTO examine.log
|
|
CASE OPTION = 2 ;* start the daemon
|
|
GOSUB init.form.1
|
|
CASE OPTION = 3 ;* stop the daemon
|
|
GOTO stop.daemon
|
|
CASE OPTION = 4 ;* Purge the logfile
|
|
GOTO purge.log
|
|
CASE OPTION = 5 ;* check for deadlock
|
|
GOTO check.deadlock
|
|
CASE OPTION = 6 ;* select single victim
|
|
GOSUB init.form.2
|
|
END CASE
|
|
|
|
******************************************************************************
|
|
* In this section, we draw the first screen, print the menu bar and help
|
|
* areas, and put up the first title and form to fill out.
|
|
******************************************************************************
|
|
GOSUB init.menu
|
|
GOSUB init.screen
|
|
|
|
******************************************************************************
|
|
* Starting point for routines actual activity. Paint help message and
|
|
* continue
|
|
******************************************************************************
|
|
help.loop:
|
|
|
|
CALL *HELP.PRINT.B(form<form.line,SHRT.HELP>,1)
|
|
|
|
******************************************************************************
|
|
* Starting point for actual data input. Here we position the cursor to the
|
|
* place of the secondary prompt and get the input character, which is returned
|
|
* in special, if a special character was encountered, or in temp, is data
|
|
* was entered.
|
|
******************************************************************************
|
|
input.loop:
|
|
|
|
TPRINT form<form.line,PRMPT.LOC>: ;* position cursor
|
|
temp=temp.form<form.line>
|
|
CALL *CINPUT.B(SEC.PRMPT,temp,special,form<form.line,6>,form<form.line,7>)
|
|
|
|
******************************************************************************
|
|
* First section handles all the special characters.
|
|
******************************************************************************
|
|
IF special # 0 THEN ;* if special character encountered
|
|
BEGIN CASE
|
|
******************************************************************************
|
|
* Up arrow was pressed.
|
|
******************************************************************************
|
|
CASE special = UP.ARROW ;* Up arrow was pressed
|
|
TPRINT form<form.line,2>:PRMPT:
|
|
TPRINT temp.form<form.line>:
|
|
TPRINT STR(SPACE,form<form.line,6>-LEN(temp.form<form.line>))
|
|
form.line-=1
|
|
IF form.line < 1 THEN
|
|
form.line=form.size
|
|
END
|
|
GOTO help.loop ;* get more input
|
|
******************************************************************************
|
|
* Down arrow was pressed.
|
|
******************************************************************************
|
|
CASE special = DOWN.ARROW ;* Down arrow was pressed
|
|
TPRINT form<form.line,2>:PRMPT:
|
|
TPRINT temp.form<form.line>:
|
|
TPRINT STR(SPACE,form<form.line,6>-LEN(temp.form<form.line>))
|
|
form.line+=1
|
|
IF form.line > form.size THEN
|
|
form.line=1
|
|
END
|
|
GOTO help.loop ;* get more input
|
|
******************************************************************************
|
|
* Function key F1 was pushed. This key is used to display more involved
|
|
* Help messages
|
|
******************************************************************************
|
|
CASE special=F.1
|
|
CALL *HELP.PRINT.B(form<form.line,LONG.HELP>,3)
|
|
GOTO input.loop ;* get more input
|
|
******************************************************************************
|
|
* Escape key pressed. This is the systems signal to return to the calling
|
|
* procedure. First clear the screen however
|
|
******************************************************************************
|
|
CASE special = ESCAPE ;* escape was pressed
|
|
STOP @(-1)
|
|
CASE special = F.4
|
|
temp="*"
|
|
GOTO new.enter
|
|
CASE special = F.10
|
|
action.value=1
|
|
CALL *DO.MNU.BAR.B(Menu.Bar,action.value,form.size,form,temp.form)
|
|
BEGIN CASE
|
|
CASE action.value = 1
|
|
STOP @(-1)
|
|
CASE action.value = 2
|
|
STOP @(-1)
|
|
CASE action.value = 3
|
|
message=msg.app.help
|
|
CONVERT @FM TO " " IN message
|
|
CALL *HELP.BOX.B(3,10,60,message)
|
|
CASE action.value = 4
|
|
message=UVREADMSG(076001,"")
|
|
CONVERT @FM TO " " IN message
|
|
CALL *HELP.BOX.B(3,10,60,message)
|
|
CASE action.value = 5
|
|
CALL *HELP.BOX.B(3,10,45,UVREADMSG(076000,""))
|
|
END CASE
|
|
CALL *PUT.FORM.B(form.size,form,temp.form,PRMPT,PAINT)
|
|
GOTO help.loop
|
|
CASE Default
|
|
GOTO help.loop
|
|
END CASE ;* end of case
|
|
END ;* end of if statement
|
|
|
|
******************************************************************************
|
|
* If we reach here, we must have had data input, which is returned from
|
|
* *NINPUT in the variable temp. Therefore, process it and execute the
|
|
* desired operation.
|
|
******************************************************************************
|
|
ELSE
|
|
new.enter:
|
|
CALL *HELP.PRINT.B(NULL,3)
|
|
sel.val=1
|
|
BEGIN CASE
|
|
CASE form.line=1 ;* timer value || victim sig
|
|
IF NOT(NUM(temp)) THEN
|
|
CALL *HELP.BOX.B(10,5,30,msg.error2)
|
|
CALL *PUT.FORM.B(form.size,form,temp.form,PRMPT,PAINT)
|
|
GOTO help.loop
|
|
END
|
|
IF OPTION = 6 THEN
|
|
victim.sig = temp
|
|
GOTO victim.kill
|
|
END
|
|
timer = temp
|
|
temp.form< form.line > = temp
|
|
CASE form.line=2 ;* resolution strategy
|
|
IF NOT(NUM(temp)) THEN
|
|
CALL *HELP.BOX.B(10,5,30,msg.error2)
|
|
CALL *PUT.FORM.B(form.size,form,temp.form,PRMPT,PAINT)
|
|
GOTO help.loop
|
|
END
|
|
IF temp < 0 OR temp > 3 THEN
|
|
GOTO help.loop
|
|
END
|
|
res.strategy = temp
|
|
temp.form< form.line > = temp
|
|
CASE form.line=3 ;* log directory
|
|
log.directory = temp
|
|
temp.form< form.line > = temp
|
|
CASE form.line = 4 ;* Should we boot up with daemon started
|
|
boot.option = UPCASE(temp)
|
|
IF boot.option # "Y" AND boot.option # "N" THEN
|
|
CALL *HELP.BOX.B(10,5,25,msg.error3)
|
|
CALL *PUT.FORM.B(form.size,form,temp.form,PRMPT,PAINT)
|
|
GOTO help.loop
|
|
END
|
|
temp.form< form.line > = temp
|
|
CASE form.line = 5 ;* Should we store values in config file
|
|
config.option = UPCASE(temp)
|
|
IF config.option # "Y" AND config.option # "N" THEN
|
|
CALL *HELP.BOX.B(10,5,25,msg.error3)
|
|
CALL *PUT.FORM.B(form.size,form,temp.form,PRMPT,PAINT)
|
|
GOTO help.loop
|
|
END
|
|
temp.form< form.line > = temp
|
|
END CASE
|
|
jump.spot:
|
|
TPRINT form<form.line,PRMPT.LOC>:PRMPT:temp.form<form.line>:
|
|
TPRINT STR(SPACE,form<form.line,6>-LEN(temp.form<form.line>)):
|
|
form.line +=1
|
|
IF form.line <= form.size THEN
|
|
GOTO help.loop
|
|
END
|
|
|
|
IF config.option = "Y" THEN
|
|
GOSUB store.config.file
|
|
END
|
|
flag=0
|
|
|
|
LockOptions = "-t " : timer : " -r " : res.strategy : " -l " : log.directory
|
|
|
|
if OS.TYPE = "MSWIN" then
|
|
LockCommand = UV.BIN : UV.FSEP : "uvdlockd.exe"
|
|
|
|
LockCommand = UV.BIN : UV.FSEP : "uvbootd " : LockCommand
|
|
end else
|
|
LockCommand = UV.BIN : UV.FSEP : "uvdlockd"
|
|
end
|
|
|
|
ExecCommand = OS.EXEC : " " : squote( LockCommand : " " : LockOptions )
|
|
EXECUTE ExecCommand CAPTURING details
|
|
|
|
IF details = "" THEN
|
|
details = UVREADMSG( 074028, "" )
|
|
END
|
|
|
|
CALL *HELP.BOX.B( 10,5, 50, details )
|
|
END
|
|
|
|
|
|
******************************************************************************
|
|
* Init.form
|
|
* This routine initializes all the positional parameters, help strings,
|
|
* text strings, and default values for the two forms used in this subroutine
|
|
******************************************************************************
|
|
|
|
init.form.1:
|
|
temp.form=NULL
|
|
form=NULL
|
|
form.size=5
|
|
form<1,1>=@(2,5)
|
|
form<1,2>=@(38,5)
|
|
form<1,3>=UVREADMSG(074009,"")
|
|
form<1,4>=UVREADMSG(074010,"")
|
|
form<1,5>=form<1,4>
|
|
form<1,6>=10
|
|
form<1,7>=0
|
|
form<2,1>=@(2,7)
|
|
form<2,2>=@(38,7)
|
|
form<2,3>=UVREADMSG(074011,"")
|
|
form<2,4>=UVREADMSG(074012,"")
|
|
form<2,5>=form<2,4>
|
|
form<2,6>=1
|
|
form<2,7>=0
|
|
form<3,1>=@(2,9)
|
|
form<3,2>=@(38,9)
|
|
form<3,3>=UVREADMSG(074013,"")
|
|
form<3,4>=UVREADMSG(074014,"")
|
|
form<3,5>=form<3,4>
|
|
form<3,6>=35
|
|
form<3,7>=0
|
|
form<4,1>=@(2,11)
|
|
form<4,2>=@(52,11)
|
|
form<4,3>=UVREADMSG(074015,"")
|
|
form<4,4>=UVREADMSG(074016,"")
|
|
form<4,5>=form<4,4>
|
|
form<4,6>=1
|
|
form<4,7>=0
|
|
form<5,1>=@(2,13)
|
|
form<5,2>=@(65,13)
|
|
form<5,3>=UVREADMSG(074017,"")
|
|
form<5,4>=form<5,3>
|
|
form<5,5>=form<5,4>
|
|
form<5,6>=1
|
|
form<5,7>=0
|
|
form.line=1
|
|
temp.form<1>=60
|
|
temp.form<2>=0
|
|
temp.form<3>=UV.ROOT:UV.FSEP:"uvdlockd.log"
|
|
temp.form<4>="Y"
|
|
temp.form<5>="Y"
|
|
RETURN
|
|
|
|
init.form.2:
|
|
temp.form=NULL
|
|
form=NULL
|
|
form.size=1
|
|
form.line=1
|
|
form<1,1>=@(2,5)
|
|
form<1,2>=@(55,5)
|
|
form<1,3>=UVREADMSG(074018,"")
|
|
form<1,4>=UVREADMSG(074019,"")
|
|
form<1,5>=form<1,4>:UVREADMSG(074020,"")
|
|
form<1,6>=10
|
|
form<1,7>=0
|
|
RETURN
|
|
|
|
***************************************************************************
|
|
* init.menu - initializes menu bar
|
|
***************************************************************************
|
|
init.menu:
|
|
scratch=UVREADMSG(073087,"")
|
|
Menu.Bar = NULL
|
|
Menu.Bar<1,1> = 3 ;* Number of Items in Menu.Bar
|
|
Menu.Bar<1,2> = 1 ;* Line # on which to print the Menu Bar
|
|
* First Item
|
|
Menu.Bar<2,1,1>=scratch<1> ;* SubMenu Title
|
|
Menu.Bar<2,1,2>=1 ;* # of items in SubMenu
|
|
* SubMenu #1
|
|
Menu.Bar<2,2,1>=scratch<6> ;* SubMenu Item
|
|
Menu.Bar<2,2,2>=1 ;* Action Code (Returned to calling process)
|
|
Menu.Bar<2,2,3>=scratch<7>
|
|
* Second Item
|
|
Menu.Bar<3,1,1>=scratch<8> ;* SubMenu Title
|
|
Menu.Bar<3,1,2>=1 ;* # of items in SubMenu
|
|
* SubMenu #1
|
|
Menu.Bar<3,2,1>=scratch<6> ;* SubMenu Item
|
|
Menu.Bar<3,2,2>=2 ;* Action Code
|
|
Menu.Bar<3,2,3>=scratch<7>
|
|
scratch=UVREADMSG(073089,"")
|
|
Menu.Bar<4,1,1>=scratch<1>
|
|
Menu.Bar<4,1,2>=3
|
|
Menu.Bar<4,2,1>=scratch<2>
|
|
Menu.Bar<4,2,2>=3
|
|
Menu.Bar<4,2,3>=scratch<3>
|
|
Menu.Bar<4,3,1>=scratch<4>
|
|
Menu.Bar<4,3,2>=4
|
|
Menu.Bar<4,3,3>=scratch<5>
|
|
Menu.Bar<4,4,1>=scratch<6>
|
|
Menu.Bar<4,4,2>=5
|
|
Menu.Bar<4,4,3>=scratch<7>
|
|
RETURN
|
|
|
|
******************************************************************************
|
|
* Strings from help messages and such
|
|
******************************************************************************
|
|
init.messages:
|
|
msg.header = UVREADMSG(074000,"")
|
|
msg.stop = UVREADMSG(074001,"")
|
|
msg.purge = UVREADMSG(074002,"")
|
|
msg.details = UVREADMSG(074003,"")
|
|
msg.error1 = UVREADMSG(074005,"")
|
|
msg.error2 = UVREADMSG(074006,"")
|
|
msg.error3 = UVREADMSG(074007,"")
|
|
msg.error4 = UVREADMSG(074021, "")
|
|
msg.app.help = UVREADMSG(074008,"")
|
|
msg.nopurge = UVREADMSG(074022,"")
|
|
msg.nostop = UVREADMSG(074023,"")
|
|
msg.noexist = UVREADMSG(074024,"")
|
|
msg.store1 = UVREADMSG(074027,"")
|
|
|
|
RETURN
|
|
******************************************************************************
|
|
* init.screen - used for initial painint of screen
|
|
******************************************************************************
|
|
init.screen:
|
|
CALL *DRAW.SCRN.B(msg.header,1)
|
|
CALL *HELP.PRINT.B(UVREADMSG(073009,""),2)
|
|
CALL *PUT.FORM.B(form.size,form,temp.form,PRMPT,PAINT)
|
|
CALL *MNU.BAR.PR.B(Menu.Bar,1)
|
|
RETURN
|
|
|
|
******************************************************************************
|
|
* stop.daemon - stop the deadlock daemon
|
|
******************************************************************************
|
|
stop.daemon:
|
|
flag = No
|
|
CALL *YES.NO.BOX.B( 10, msg.stop, flag )
|
|
IF flag = Yes THEN
|
|
ExecCommand = OS.EXEC:" '":UV.BIN:UV.FSEP:"uvdlockd -stop":" '"
|
|
EXECUTE ExecCommand CAPTURING details
|
|
CALL *HELP.BOX.B(10,5,50,details)
|
|
END
|
|
ELSE
|
|
CALL *HELP.BOX.B(10,5,50,msg.nostop)
|
|
END
|
|
STOP @(-1)
|
|
RETURN
|
|
|
|
examine.log:
|
|
logrec = ''
|
|
linecnt = 0
|
|
OPEN '&UFD&' TO Fvar THEN
|
|
READ logrec FROM Fvar, 'uvdlockd.log' ELSE
|
|
CALL *HELP.BOX.B( 10, 5, 50,msg.noexist )
|
|
STOP @(-1)
|
|
END
|
|
lines = DCOUNT(logrec, @AM)
|
|
FOR i = 1 to lines
|
|
PRINT logrec<i>
|
|
linecnt += 1
|
|
if linecnt = 20 then
|
|
linecnt = 1
|
|
print "Press any key to Continue or Q to quit ... ":
|
|
prompt ""
|
|
input ans
|
|
if (ans = "q") or (ans = "Q") then stop
|
|
end
|
|
NEXT i
|
|
CLOSE Fvar
|
|
input WAIT,1
|
|
END
|
|
STOP @(-1)
|
|
|
|
purge.log:
|
|
flag = No
|
|
logrec = ''
|
|
CALL *YES.NO.BOX.B( 10, msg.purge, flag )
|
|
IF flag = Yes THEN
|
|
OPEN '&UFD&' TO Fvar THEN
|
|
READV logrec FROM Fvar, 'uvdlockd.log',0 ELSE
|
|
CALL *HELP.BOX.B( 10, 5, 50,msg.noexist )
|
|
STOP @(-1)
|
|
END
|
|
logrec = ''
|
|
WRITE logrec TO Fvar, 'uvdlockd.log' ELSE
|
|
CALL *HELP.BOX.B(10,5,50, msg.nopurge )
|
|
STOP @(-1)
|
|
END
|
|
CLOSE Fvar
|
|
END
|
|
END
|
|
ELSE
|
|
CALL *HELP.BOX.B(10,5,50, msg.nopurge )
|
|
END
|
|
STOP @(-1)
|
|
|
|
check.deadlock:
|
|
TPRINT @(-1)
|
|
ExecCommand = OS.EXEC:" '":UV.BIN:UV.FSEP:"uvdlockd -query":" '"
|
|
EXECUTE ExecCommand
|
|
CALL *HELP.BOX.B( 10,5,50, UVREADMSG( 001069, "" ) )
|
|
STOP @(-1)
|
|
|
|
victim.kill:
|
|
flag = No
|
|
msg.victim = UVREADMSG(074004,victim.sig)
|
|
CALL *YES.NO.BOX.B( 10, msg.victim, flag )
|
|
IF flag = Yes THEN
|
|
ExecCommand = OS.EXEC:" '":UV.BIN:UV.FSEP:"uvdlockd -victim ":victim.sig:" '"
|
|
EXECUTE ExecCommand CAPTURING details
|
|
CALL *HELP.BOX.B(10,5,50, UVREADMSG( 074025, victim.sig))
|
|
END
|
|
ELSE
|
|
CALL *HELP.BOX.B(10,5,50, UVREADMSG( 074026, victim.sig ))
|
|
END
|
|
STOP @(-1)
|
|
|
|
store.config.file:
|
|
config.file=UV.ROOT:UV.FSEP:"uvdlockd.config"
|
|
OPENSEQ config.file TO OUTPUT ELSE
|
|
CALL *HELP.BOX.B( 10,5,50, msg.error1 )
|
|
flag = 1
|
|
CALL *YES.NO.BOX.B( 10, msg.store1, flag )
|
|
IF flag=0 THEN
|
|
STOP @(-1)
|
|
END
|
|
ELSE
|
|
CREATE OUTPUT ELSE STOP @(-1)
|
|
rec=""
|
|
IF boot.option = 'Y' THEN
|
|
rec<1>="start=1"
|
|
END
|
|
ELSE
|
|
rec<1>="start=0"
|
|
END
|
|
rec<2>="timer=":timer
|
|
rec<3>="res=":res.strategy
|
|
rec<4>="log=":log.directory
|
|
CONVERT @FM TO CHAR(10) in rec
|
|
WRITESEQ rec TO OUTPUT ELSE STOP @(-1)
|
|
CLOSE OUTPUT
|
|
STOP @(-1)
|
|
END
|
|
END
|
|
rec=""
|
|
line.no = 0
|
|
line = ""
|
|
eof = 0
|
|
a1 = 0
|
|
a2 = 0
|
|
a3 = 0
|
|
a4 = 0
|
|
loop
|
|
READSEQ line FROM OUTPUT else eof = 1
|
|
until eof do
|
|
BEGIN CASE
|
|
CASE line[1,3]='sta'
|
|
if boot.option = 'Y' THEN
|
|
line="start=1"
|
|
END
|
|
ELSE
|
|
line="start=0"
|
|
END
|
|
a1 = 1
|
|
CASE line[1,3]='tim'
|
|
line="timer=":timer
|
|
a2 = 1
|
|
CASE line[1,3]='res'
|
|
line="res=":res.strategy
|
|
a3 = 1
|
|
CASE line[1,3]='log'
|
|
line="log=":log.directory
|
|
a4 = 1
|
|
CASE 1
|
|
line=line
|
|
END CASE
|
|
line.no += 1
|
|
rec< line.no > = line
|
|
repeat
|
|
CLOSE OUTPUT
|
|
IF a1 = 0 THEN
|
|
if boot.option = 'Y' THEN
|
|
rec< line.no > = "start=1"
|
|
end
|
|
else
|
|
rec< line.no > = "start=0"
|
|
end
|
|
line.no += 1
|
|
END
|
|
IF a2 = 0 THEN
|
|
rec<line.no> = "timer=":timer
|
|
line.no += 1
|
|
END
|
|
IF a3 = 0 THEN
|
|
rec<line.no> = "res=":res.strategy
|
|
line.no += 1
|
|
END
|
|
IF a4 = 0 THEN
|
|
rec<line.no> = "log=":log.directory
|
|
line.no += 1
|
|
END
|
|
OPENSEQ config.file TO OUTPUT ELSE
|
|
CALL *HELP.BOX.B( 10,5,50, msg.error1 )
|
|
END
|
|
FOR i = 1 TO line.no
|
|
WRITESEQ rec< i > TO OUTPUT else
|
|
CALL *HELP.BOX.B( 10,5,50,msg.error4)
|
|
STOP @(-1)
|
|
END
|
|
NEXT i
|
|
|
|
RETURN
|
|
|
|
STOP @(-1)
|
|
END
|