/* REXX - RECOVER * * * * * * * * * * * * * * * * * * * * * * * * * */ /* FUNCTION: */ /* THIS CLIST DISPLAYS PANEL GDOLDA01 TO GET THE DEV ADDRESS, */ /* ISSUES VARIOUS OPERATOR COMMANDS TO FIND THE VOLSER, ETC... */ /* FORMATS THE PERTANENT INFORMATION AND DISPLAYS IT BACK ON */ /* GDOLDA03 PANEL. */ /*********************************************************************/ ENTRY: /*********************************************************************/ /* ON RETURN FROM GDOLDA01 THE FOLLOWING FIELDS ARE RETURNED */ /* &DEV THE DEVICE ADDRESS OF THE VOLUME EXPERIENCING THE ERRORS */ /* &NOGO = "N" IF PF3 WAS PRESSED */ /*********************************************************************/ "ISPEXEC DISPLAY PANEL(GDOLDA01)" IF NOGO = 'N' THEN EXIT /*********************************************************************/ /* INITIALIZE VARIOUS VARIABLES TO NULLS */ /*********************************************************************/ VOLSER = DEVTYPE = SDEVTYPE = ALTDEV = TDUPLXST = D1MSG1 = D2MSG1 = D1JOB. = /************************************************************************/ /* GET THE DEVICE VOLSER, SMS AND OTHER INFORMAION */ /* ISSUE OPERATOR COMMANDS "DS S,DEV,1" */ /* AND "DS P,DEV,1" */ /************************************************************************/ ADDRESS TSO "CONSPROF SOLDISPLAY(NO)" /* TURN OFF MESSAGE DISPLAY */ CONSOLE ACTIVATE /* ACTIVATE THE CONSOLE FEATURE*/ DUDEV = DEV /* PLUG THE DEV FOR "D U," CMD */ "CONSOLE SYSCMD(DS S,"DEV",1)" /* ISSUE THE DS S COMMAND */ RESP = GETMSG("CONSMSG.","SOL",,,30) /* RETRIEVE MESSAGES/WAIT 30 SE*/ RESPADD = SUBSTR(CONSMSG.3,4,3) /* GET THE SMS SG NAME */ IF RESPADD ª= DEV THEN /* VERIFY THE DEVICE IS VALID */ DO /* IF NOT THEN */ MSGDSN = 'THE SPECIFIED DEVICE ADDRESS IS NOT ON-LINE' SIGNAL ENTRY /* */ END /* REDISPLAY PANEL */ SMSSTAT = SUBSTR(CONSMSG.3,37,8) /* GET THE SMS SG NAME */ ALLOC = SUBSTR(CONSMSG.3,15,1) /* GET THE DEVICE STATUS */ /************************************************************************/ /* ALLOC IS THE DEVICE ALLOCATION STATUS */ /* A = ALLOCATED F = OFFLINE */ /* M = MOUNT PENDING N = NOT ALLOCATED */ /* O = ONLINE P = PENDING OFFLINE */ /* IF THE STATUS IS ONLINE, ALLOCATED, NOT ALLOCATED THEN PROCEED */ /* ELSE PROBABLE ERROR IN THE ADDRESS SPECIFIED */ /************************************************************************/ IF ALLOC = 'O' | ALLOC = 'A' | ALLOC = 'N' | ALLOC = 'F' THEN SIGNAL PROCEED1 IF ALLOC = 'M' THEN MSGDSN = 'MOUNT PENDING ON DEVICE' IF ALLOC = 'P' THEN MSGDSN = 'DEVICE IS PENDING OFFLINE' SIGNAL ENTRY PROCEED1: IF SMSSTAT = "VOLUME N" THEN /* IF NOT SMS MANAGED */ SMSSTAT = "NON SMS " /* SET TO "NON SMS" MESSAGE */ "CONSOLE SYSCMD(DS P,"DEV",1)" /* ISSUE THE DS P COMMAND */ RESP = GETMSG("CONSMSG.","SOL",,,30) /* RETRIEVE MESSAGES/WAIT 30 SE*/ VOLSER = SUBSTR(CONSMSG.4,20,6) /* GET THE VOLSER */ DEVTYPE = SUBSTR(CONSMSG.4,7,5) /* GET THE DEVICE TYPE */ DEVX = SUBSTR(CONSMSG.4,7,4) /* GET 3380/3390 INFORMATION */ IF DEVX = 3380 THEN /* IF IT IS A 3380, NO DUPLEX */ DO /* INFORMATION EXISTS */ D1MSG1 = '' /* SET THE MESSAGE TO SPACES */ SIGNAL BYPASS1 /* BRANCH AROUND DUPLEX BUILD */ END DUPLXST = SUBSTR(CONSMSG.5,40,3) /* GET THE DUPLEX STATUS */ ALTDEV = SUBSTR(CONSMSG.5,61,3) /* GET THE ALTERNATE DC ADDRESS*/ /************************************************************************/ /* IF VOLSER = " " THEN THIS MUST BE A SECONDARY DEVICE, */ /* WE HAVE TO ISSUE A "DS P,"ALTDEV",1)" */ /************************************************************************/ IF VOLSER = "" THEN DO "CONSOLE SYSCMD(DS P,"ALTDEV",1)" /* ISSUE THE DS P COMMAND */ RESP = GETMSG("CONSMSG.","SOL",,,30) /* RETRIEVE MESSAGES/WAIT 30 SE*/ VOLSER = SUBSTR(CONSMSG.4,20,6) /* GET THE VOLSER (ONLY IF NOT */ DUDEV = SUBSTR(CONSMSG.4,3,3) /* GET THE DEV FOR "D U," CMD */ ALLOC = SUBSTR(CONSMSG.4,14,1) /* FIND IF THE DEV IS ALLOCATED*/ END IF DUPLXST = 'PRI' THEN /* FILL OUT THE DUPLEX STATUS */ DUPLXST = 'PRIMARY ' /* FIELD BASED ON THE 3 BYTE*/ IF DUPLXST = 'SEC' THEN /* FETCHED FROM THE MESSAGE */ DUPLXST = 'SECONDARY' IF DUPLXST = 'SIM' THEN DUPLXST = 'SIMPLEX ' /************************************************************************/ /* BUILD THE DUPLEX STATUS MESSAGE, LEAVE BLANK IF 3380 */ /************************************************************************/ IF DUPLXST = 'SECONDARY' | DUPLXST = 'PRIMARY' THEN DO D1MSG1 = 'IT IS THE ' D1MSG1 = INSERT(DUPLXST,D1MSG1,10) D1MSG1 = INSERT('VOLUME IN A DUAL COPY PAIR, ',D1MSG1,20) D1MSG1 = INSERT('THE OTHER DEVICE IS ',D1MSG1,48) D1MSG1 = INSERT(ALTDEV,D1MSG1,69) END ELSE IF DUPLXST = 'SIMPLEX ' THEN DO D1MSG1 = 'ITS DUPLEX STATUS IS' D1MSG1 = INSERT(DUPLXST,D1MSG1,21) END /************************************************************************/ /* BUILD D1MSG2 THROUGH D1MSG7 MESSAGES & D1MORE */ /************************************************************************/ /* EXECUTE THE IDCAMS LISTDATA COMMAND & PUT THE */ /* RESULTS INTO STEM X. */ /************************************************************************/ BYPASS1: "ALLOC DD(SYSPRINT) DSN('NULLFILE') SHR REUSE" "ALLOC DD(SYSIN) NEW LRECL(80) REUSE" "ALLOC DD(OUTDS) NEW LRECL(264) RECFM(V B) REUSE" QUEUE ' LISTDATA DSTATUS SUBSYSTEM NOLEGEND VOLUME('VOLSER') UNIT(3390) - ' QUEUE ' OFILE(OUTDS) ' QUEUE '' "EXECIO * DISKW SYSIN (FINIS" "CALL 'SYS1.LINKLIB(IDCAMS)'" "EXECIO * DISKR OUTDS (STEM X. FINIS" "FREE F(SYSIN)" "FREE F(OUTDS)" "DELSTACK" /************************************************************************/ /* SEARCH THE RESULTS OF THE LISTDATA COMMAND */ /* LOOKING FOR THE DEVICE ADDRESS */ /************************************************************************/ DO I = 1 TO X.0 IF POS(DEV,X.I) = 4 THEN /* LOOK FOR THE DEVICE ADDRESS */ DO CCA1=SUBSTR(X.I,18,2) /* WHEN FOUND PLUG INTO SCREEN */ DDC1=SUBSTR(X.I,22,2) /* FIELDS */ CAC1=SUBSTR(X.I,28,3) DFW1=SUBSTR(X.I,37,3) OCC1=SUBSTR(X.I,73,2) I = X.0 END END /***********************************************************************/ /* ISSUE AN OPERATOR COMMAND "D U,,ALLOC,DEV,1 */ /* PUT THE RESULTS INTO D1MSG3 THRU D1MSG7 & D1MORE IF REQ */ /* IF DUPLXST = SECONDARY THEN MUST FORMULATE THE */ /* ACTUAL DEVICE ADDRESS USING BYTE 1 * OCC1 */ /***********************************************************************/ J = 1 IF ALLOC = 'A' THEN /* IF DEVICE IS ALLOCATED */ DO /* ISSUE THE D U,,ALLOC COMMAND */ "CONSOLE SYSCMD(D U,,ALLOC,"DUDEV",1)" RESP = GETMSG('CONSMSG.','SOL',,,30) IF POS(DUDEV,CONSMSG.3) > 0 THEN /* IF RESPONSE CONTAINS ADDRESS */ DO J = 1 TO CONSMSG.0 /* PUT INTO SAVE AREA FIELDS */ D1JOB.J = CONSMSG.J END ELSE /* ELSE, SAY NO JOBS ALLOCATED */ D1JOB.J = "NO JOBS ARE CURRENTLY ALLOCATED TO " DUDEV J = J + 1 END ELSE /* ELSE, SAY NO JOBS ALLOCATED */ D1JOB.J = "NO JOBS ARE CURRENTLY ALLOCATED TO " DUDEV CONSMSG. = '' /***********************************************************************/ /* FIND THE OTHER DEVICE SHARING THE HDA */ /* IF IT IS AN 3380 TYPE DEVICE THEN FIND THE DEVICE ADDRESS BY USING */ /* THE "DEV" ADDRESS & TRANSLATING THE LAST BYTE */ /* IF IT IS AN 3390 TYPE DEVICE THEN WE HAVE TO USE THE DDC ADDRESS */ /* RETRIEVED FROM PREVIOUS COMMANDS, TRANSLATE THE DDC ADDRESS */ /* AND THEN SEARCH THE LISTDATA OUTPUT */ /***********************************************************************/ DEVCOMP = SUBSTR(DEVTYPE,1,4) FOUND = 'N' IF DEVCOMP = '3380' THEN DO LOD = SUBSTR(DEV,3,1) LOD = TRANSLATE(LOD,'0123456789ABCDEF','1032547698BADCFE') SHRDEV = OVERLAY(LOD,DEV,3,1) FOUND = 'Y' END ELSE DO LOD = SUBSTR(DDC1,2,1) /* GET LAST BYTE OF DDC ADDRESS */ LOD = TRANSLATE(LOD,'0123456789ABCDEF','1032547698BADCFE') SRCHDEV = DDC1 SRCHDEV = OVERLAY(LOD,DDC1,2,1) DO I = 1 TO X.0 COMPDEV = SUBSTR(X.I,22,2) IF COMPDEV = SRCHDEV THEN DO SHRDEV = SUBSTR(X.I,4,3) I = X.0 FOUND = 'Y' /* INDICATE THAT IT WAS FOUND */ END END END IF FOUND = 'N' THEN /* IF ALTERNATE ADDR NOT FOUND */ DO /* SET MESSAGES INDICATING SO */ SMSSTATS = '' D2MSG1 = 'VOLUME NOT ONLINE, CHECK OTHER SYSTEMS' SHRDEV = '' SIGNAL BYPASS3 /* & FORGO FOLLOWING */ END /***********************************************************************/ DUDEV = SHRDEV /* PLUG THE ADDR FOR "D U," CMD */ "CONSOLE SYSCMD(DS S,"SHRDEV",1)" /* ISSUE THE DS S COMMAND */ RESP = GETMSG("CONSMSG.","SOL",,,30) /* RETRIEVE MESSAGES/WAIT 30 SE */ SMSSTATS = SUBSTR(CONSMSG.3,37,8) /* GET THE SMS SG NAME */ ALLOC2 = SUBSTR(CONSMSG.3,15,1) /* GET THE DEVICE STATUS */ IF SMSSTATS = "VOLUME N" THEN /* IF NOT SMS MANAGED */ SMSSTATS = "NON SMS " /* SET MESSAGE INDICATING SO */ /***********************************************************************/ /* ALLOC2 IS THE DEVICE ALLOCATION STATUS */ /* A = ALLOCATED F = OFFLINE */ /* M = MOUNT PENDING N = NOT ALLOCATED */ /* O = ONLINE P = PENDING OFFLINE */ /***********************************************************************/ IF ALLOC2 = 'O' | ALLOC2 = 'A' | ALLOC2 = 'N' | ALLOC2 = 'F' THEN SIGNAL PROCEED2 D2MSG1 = 'UNKNOWN DEVICE STATUS' IF ALLOC2 = 'M' THEN D2MSG1 = 'MOUNT PENDING ON DEVICE' IF ALLOC2 = 'P' THEN D2MSG1 = 'DEVICE IS PENDING OFFLINE' SIGNAL BYPASS2 PROCEED2: "CONSOLE SYSCMD(DS P,"SHRDEV",1)" /* ISSUE THE DS P COMMAND */ RESP = GETMSG("CONSMSG.","SOL",,,30) /* RETRIEVE MESSAGES/WAIT 30 SE */ SHRVOL = SUBSTR(CONSMSG.4,20,6) /* GET THE VOLSER (ONLY IF NOT */ SDEVTYPE = SUBSTR(CONSMSG.4,7,5) /* GET THE DEVICE TYPE */ DEVX = SUBSTR(CONSMSG.4,7,4) /* GET 3380/3390 INFORMATION */ IF DEVX = 3380 THEN /* IF IT IS A 3380, NO DUPLEX */ DO /* INFORMATION EXISTS */ D2MSG1 = '' /* SET THE MESSAGE TO SPACES */ SIGNAL BYPASS2 /* BRANCH AROUND DUPLEX BUILD */ END DUPLXST = SUBSTR(CONSMSG.5,40,3) /* GET THE DUPLEX STATUS */ ALTDEV = SUBSTR(CONSMSG.5,61,3) /* GET THE ALTERNATE DC ADDRESS */ /***********************************************************************/ /* IF AVOLSER = " " THEN THIS MUST BE A SECONDARY DEVICE, */ /* WE HAVE TO ISSUE A "DS P,"ALTDEV",1)" */ /***********************************************************************/ IF SHRVOL = "" THEN DO "CONSOLE SYSCMD(DS P,"ALTDEV",1)" /* ISSUE THE DS P COMMAND */ RESP = GETMSG("CONSMSG.","SOL",,,30) /* RETRIEVE MESSAGES/WAIT */ SHRVOL = SUBSTR(CONSMSG.4,20,6) /* GET THE VOLSER */ DUDEV = SUBSTR(CONSMSG.4,3,3) /* GET THE UNIT ADDRESS */ ALLOC2 = SUBSTR(CONSMSG.4,14,1) /* GET THE ALLOCATION STATUS */ END /* *********************************************************************/ IF DUPLXST = 'PRI' THEN /* FILL OUT THE DUPLEX STATUS */ DUPLXST = 'PRIMARY ' IF DUPLXST = 'SEC' THEN DUPLXST = 'SECONDARY' IF DUPLXST = 'SIM' THEN DUPLXST = 'SIMPLEX ' /***********************************************************************/ /* BUILD THE DUPLEX STATUS MESSAGE, LEAVE BLANK IF 3380 */ /***********************************************************************/ IF DUPLXST = 'SECONDARY' | DUPLXST = 'PRIMARY' THEN DO D2MSG1 = 'IT IS THE ' D2MSG1 = INSERT(DUPLXST,D2MSG1,10) D2MSG1 = INSERT('VOLUME IN A DUAL COPY PAIR, ',D2MSG1,20) D2MSG1 = INSERT('THE OTHER DEVICE IS ',D2MSG1,48) D2MSG1 = INSERT(ALTDEV,D2MSG1,69) END ELSE IF DUPLXST = 'SIMPLEX ' THEN DO D2MSG1 = 'ITS DUPLEX STATUS IS' D2MSG1 = INSERT(DUPLXST,D2MSG1,21) END ELSE NOP /***********************************************************************/ /* BUILD D2MSG2 THROUGH D2MSG7 MESSAGES & D2MORE */ /* USING OUTPUT FROM PREVIOUS LISTDATA COMMAND */ /***********************************************************************/ BYPASS2: DO I = 1 TO X.0 IF POS(SHRDEV,X.I) = 4 THEN /* LOOK FOR THE DEVICE ADDRESS */ DO CCA2=SUBSTR(X.I,18,2) DDC2=SUBSTR(X.I,22,2) CAC2=SUBSTR(X.I,28,3) DFW2=SUBSTR(X.I,37,3) OCC2=SUBSTR(X.I,73,2) I = X.0 END END /***********************************************************************/ /* ISSUE AN OPERATOR COMMAND "D U,,ALLOC,DEV,1 */ /* PUT THE RESULTS INTO D1MSG3 THRU D1MSG7 */ /* IF DUPLXST = SECONDARY THEN MUST FORMULATE THE */ /* ACTUAL DEVICE ADDRESS USING BYTE 1 * OCC1 */ /***********************************************************************/ IF ALLOC2 = 'A' THEN DO "CONSOLE SYSCMD(D U,,ALLOC,"DUDEV",1)" RESP = GETMSG('CONSMSG.','SOL',,,30) IF POS(DUDEV,CONSMSG.3) > 0 THEN DO K = 1 TO CONSMSG.0 D1JOB.J = CONSMSG.K J = J + 1 END ELSE D1JOB.J = "NO JOBS ARE CURRENTLY ALLOCATED TO " DUDEV END ELSE D1JOB.J = "NO JOBS ARE CURRENTLY ALLOCATED TO " DUDEV BYPASS3: CONSOLE DEACTIVATE ADDRESS TSO "CONSPROF SOLDISPLAY(YES)" SDV = SHRDEV /* PUT WORK VARIABLES */ SDVTY = SDEVTYPE /* INTO SCREEN FIELDS */ D1JOB1 = D1JOB.1 D1JOB2 = D1JOB.2 D1JOB3 = D1JOB.3 D1JOB4 = D1JOB.4 D1JOB5 = D1JOB.5 D1JOB6 = D1JOB.6 D1JOB7 = D1JOB.7 D1JOB8 = D1JOB.8 D1JOB9 = D1JOB.9 D1JOB10 = D1JOB.10 D1JOB11 = D1JOB.11 D1JOB12 = D1JOB.12 D1JOB13 = D1JOB.13 D1JOB14 = D1JOB.14 D1JOB15 = D1JOB.15 D1JOB16 = D1JOB.16 D1JOB17 = D1JOB.17 D1JOB18 = D1JOB.18 D1JOB19 = D1JOB.19 D1JOB20 = D1JOB.20 D1JOB21 = D1JOB.21 D1JOB22 = D1JOB.22 D1JOB23 = D1JOB.23 D1JO234 = D1JOB.24 D1JOB25 = D1JOB.25 D1JOB26 = D1JOB.26 D1JOB27 = D1JOB.27 D1JOB28 = D1JOB.28 D1JOB29 = D1JOB.29 D1JOB30 = D1JOB.30 D1JOB31 = D1JOB.31 D1JOB32 = D1JOB.32 D1JOB33 = D1JOB.33 D1JOB34 = D1JOB.34 D1JOB35 = D1JOB.35 D1JOB36 = D1JOB.36 D1JOB37 = D1JOB.37 D1JOB38 = D1JOB.38 D1JOB39 = D1JOB.39 D1JOB40 = D1JOB.40 D1JOB41 = D1JOB.41 D1JOB42 = D1JOB.42 D1JOB43 = D1JOB.43 D1JOB44 = D1JOB.44 D1JOB45 = D1JOB.45 D1JOB46 = D1JOB.46 D1JOB47 = D1JOB.47 D1JOB48 = D1JOB.48 D1JOB49 = D1JOB.49 D1JOB50 = D1JOB.50 BYPASS3: "ISPEXEC DISPLAY PANEL(GDOLDA03)" IF NOGO = 'N' THEN EXIT /***********************************************************************/ /* IF EREP SUBMISSION HAS BEEN REQUESTED THEN SUBMIT JOB FROM PDS */ /* SSU.JOBLIB(SSLOGREC) */ /***********************************************************************/ IF E = Y THEN DO "ALLOC DA('SSU.JOBLIB(SSLOGREC)') OLD F(JCL)" ADDRESS TSO "NEWSTACK" "EXECIO * DISKR JCL (FINIS" QUEUE "GO" "SUBMIT * END(GO)" END EXIT