/* REXX | | Name: SYSPLEX | | V1R4 - Sept, 2002 - Converted Commands to a Stem var brg | - Primary Panel converted to scroll type brg | - added additional display commands brg | V1R3M1.1 Sept, 2000 - wrktmp1 alloc from track (2,1) to (5,5) vca | and ATTRIB DCB BLKSI from (80) to (0) | V1R3M1 - Sept, 1999 - added rc checking to getmsg brg | V1R3M0 - July, 1999 - general clean-up & add logger info brg | V1R2M0 - Nov, 1998 - added STR placement check routine brg | V1R1M0 - April, 1997 - added interactive IXCMAIPU feature brg | V1R0M0 - March, 1997 - initial Console command processor brg | | Purpose: Driving EXEC for the SYSPLEX ISPF application | Application: Sysplex/Parallel Sysplex Display Command Processor | | Tested on OS/390 2.10 | | Setup: | Add SYS1.MIGLIB to PROGxx | Add IXCMIAPU to IKJTSO00 AUTHPGM section | RACF rights to Console services | | Disclaimer: | The "Sysplex" utility IS NOT in the Public Domain Freeware Software. | You may use the "Sysplex" utility AT YOUR OWN RISK, it is provided for | your enjoyment and neither the Author or his Employer provides any | warranty for its use. | | Please leave author name and internet e-mail address in the comment section... | | Author: | Bruce R. Gillispie | 16001 Dallas Parkway | Dallas Tx, 75001 | (469) 201-6429 | gillispi@texasrock.com | Bruce.Gillispie@mbna.com | */ /* trace ?r */ /* --------------------------------------------------------------- */ /* DSN is used by LIBDEFs to define where this exec will run from. */ /* --------------------------------------------------------------- */ DSN = "'YOUR.USER.EXECS'" /* ------------------------------------ */ /* assign panel names to variables */ /* ------------------------------------ */ sysplexg = 'SYSPLEXP'; /* Commands Panel - Scroll Type */ sysplexw = 'SYSPLEXW'; /* provide user entertainment */ call initialize_cmds /* load supported commands into a Stem */ call add_libdefs /* add libdefs - did you update DSN(?) */ call plex_information /* invoke routine - Enlightenment */ call del_libdefs /* del libdefs - clean up this mess... */ exit 00 /*/\/\_oo_/\/\ /\/\_oo_/\/\ /\/\_oo_/\/\ /\/\_oo_/\/\ /\/\_oo_/\/\*/ plex_information: /* Display User Selection */ drop sw /* unassigns variables */ drop UserIn /* unassigns variables */ address ISPEXEC "DISPLAY PANEL("SYSPLEXG")" if rc <> 0 then do call del_libdefs; exit 01 end address ISPEXEC "VGET (UserIn) PROFILE" select when UserIn = '1' then do sw='2'; UserIn = 'List LogStream (SYSLOG)'; CNTL_DATA. = ' DATA TYPE(LOGR)', 'LIST LOGSTREAM NAME(SYSPLEX.OPERLOG) DETAIL(YES)'; end when UserIn = '2' then do sw='2'; UserIn = 'Produce a CFRM report'; CNTL_DATA. = ' DATA TYPE(CFRM) REPORT(YES)'; end when UserIn = '3' then do sw='3'; UserIn = 'Structure Placement Check'; end otherwise UserIn = strip(cmd.UserIn); sw = '1'; end /* end select */ /* - - - - - - - - - - - - - - - - - - - - - - - */ /* Select routine to process User Data */ /* - - - - - - - - - - - - - - - - - - - - - - - */ select when sw = '1' then call issue_standard_cmds; when sw = '2' then call invoke_utility; when sw = '3' then call check_structure_placement; otherwise nop; end call plex_information return issue_standard_cmds: /* - - - - - - - - - - - - - - - - - - - - - - - */ /* free work file going into this routine */ /* - - - - - - - - - - - - - - - - - - - - - - - */ address TSO msg_status = MSG("OFF"); "FREE FI("wrktmp1")"; "FREE ATTRLIST(DCB)"; msg_status = MSG("ON"); /* - - - - - - - - - - - - - - - - - - - - - - - */ /* allocate work file */ /* - - - - - - - - - - - - - - - - - - - - - - - */ "ATTRIB DCB RECFM(F) LRECL(80) BLKSIZE(0)"; "ALLOC FILE("wrktmp1") UNIT(VIO) SP(5,5) TRACK USING(DCB) NEW" /* - - - - - - - - - - - - - - - - - - - - - - - */ /* Display "UserIn" and Working panel */ /* - - - - - - - - - - - - - - - - - - - - - - - */ function = "===>" UserIn address ISPEXEC "CONTROL DISPLAY LOCK" address ISPEXEC "DISPLAY PANEL("sysplexw")" /* - - - - - - - - - - - - - - - - - - - - - - - */ /* Turn Console off going into this routine */ /* - - - - - - - - - - - - - - - - - - - - - - - */ address TSO msg_status = MSG("OFF"); "console deactivate" msg_status = MSG("ON"); /* - - - - - - - - - - - - - - - - - - - - - - - */ /* Construct command */ /* - - - - - - - - - - - - - - - - - - - - - - - */ Cart_V = 'PLEX1'random(100,) /* build CART value */ pass_arg. = "CONSOLE SYSCMD("UserIn") CART("Cart_V")" /* - - - - - - - - - - - - - - - - - - - - - - - */ /* Issue message to Console Services */ /* - - - - - - - - - - - - - - - - - - - - - - - */ address TSO "consprof soldisp(no) solnum(300) unsoldisp(no)" "console activate name("Cart_V") cart("Cart_V")" /* - - - - - - - - - - - - - - - - - - - - - - - */ /* Get Message Results */ /* - - - - - - - - - - - - - - - - - - - - - - - */ address TSO pass_arg. /* present command */ getcode = getmsg('issue_back.','SOL',Cart_V,,30) if getcode <> 0 then do say "getmsg error retrieving message. return code is" getcode end /* - - - - - - - - - - - - - - - - - - - - - - - */ /* Turn Console off going out of this routine */ /* - - - - - - - - - - - - - - - - - - - - - - - */ address TSO msg_status = MSG("OFF"); "console deactivate" msg_status = MSG("ON"); /* - - - - - - - - - - - - - - - - - - - - - - - */ /* Write message to work file */ /* - - - - - - - - - - - - - - - - - - - - - - - */ address TSO "EXECIO * DISKW "wrktmp1" (STEM issue_back." /* - - - - - - - - - - - - - - - - - - - - - - - */ /* Close work file */ /* - - - - - - - - - - - - - - - - - - - - - - - */ address TSO "EXECIO 0 DISKW "wrktmp1" (FINIS"; /* - - - - - - - - - - - - - - - - - - - - - - - */ /* Library Services */ /* - - - - - - - - - - - - - - - - - - - - - - - */ address ISPEXEC "LMINIT DATAID(LMID) DDNAME("wrktmp1")"; /* address ISPEXEC "edit DATAID(&LMID)"; edit rc = 4 */ address ISPEXEC "edit DATAID(&LMID)"; address ISPEXEC "LMFREE DATAID(&LMID)"; /* - - - - - - - - - - - - - - - - - - - - - - - */ /* post routine clean-up */ /* - - - - - - - - - - - - - - - - - - - - - - - */ address TSO drop pass_arg. /* unassigns variables */ drop issue_back. /* unassigns variables */ msg_status = MSG("OFF"); "FREE FI("wrktmp1")"; "FREE ATTRLIST(DCB)"; msg_status = MSG("ON"); return invoke_utility: /* - - - - - - - - - - - - - - - - - - - - - - - */ /* Display "UserIn" and Working panel */ /* - - - - - - - - - - - - - - - - - - - - - - - */ function = "===>" UserIn address ISPEXEC "CONTROL DISPLAY LOCK" address ISPEXEC "DISPLAY PANEL("sysplexw")" /* - - - - - - - - - - - - - - - - - - - - - - - */ /* House Keeping going into routine... */ /* - - - - - - - - - - - - - - - - - - - - - - - */ msg_status = MSG("OFF"); address TSO; "FREE FI(SYSIN SYSPRINT)"; "FREE ATTRLIST(DCB01 DCB02)"; msg_status = MSG("ON"); address TSO "ATTRIB DCB01 RECFM(F) LRECL(80) BLKSIZE(80)"; "ATTRIB DCB02 RECFM(F) LRECL(121) BLKSIZE(0)"; "ALLOC FILE(SYSIN) UNIT(VIO) SP(1,1) TRACK USING(DCB01)"; "ALLOC FILE(SYSPRINT) UNIT(VIO) SP(1,1) TRACK USING(DCB02)"; "EXECIO 1 DISKW SYSIN (STEM CNTL_data."; "EXECIO 0 DISKW SYSIN (FINIS"; /* - - - - - - - - - - - - - - - - - - - - - - - */ /* IBM's SysPlex/Parallel SysPlex Utility */ /* SYS1.MIGLIB needs to be added to PROGxx */ /* add IXCMIAPU to IKJTSO00 AUTHPGM section */ address TSO "call 'sys1.miglib(ixcmiapu)'"; /* - - - - - - - - - - - - - - - - - - - - - - - */ /* Library Services */ /* - - - - - - - - - - - - - - - - - - - - - - - */ address ISPEXEC "LMINIT DATAID(LMID) DDNAME("sysprint")"; /* address ISPEXEC "edit DATAID(&LMID)"; edit rc = 4 */ address ISPEXEC "edit DATAID(&LMID)"; address ISPEXEC "LMFREE DATAID(&LMID)"; /* - - - - - - - - - - - - - - - - - - - - - - - */ /* House Keeping going out of routine... */ /* - - - - - - - - - - - - - - - - - - - - - - - */ msg_status = MSG("OFF"); address TSO; "FREE FI(SYSIN SYSPRINT)"; "FREE ATTRLIST(DCB01 DCB02)"; msg_status = MSG("ON"); return check_structure_placement: /* trace ?r */ /* - - - - - - - - - - - - - - - - - - - - - - - */ /* Set UserIn console command */ /* - - - - - - - - - - - - - - - - - - - - - - - */ UserIn = 'D XCF,STR,STRNAME=*' /* - - - - - - - - - - - - - - - - - - - - - - - */ /* free work file going into this routine */ /* - - - - - - - - - - - - - - - - - - - - - - - */ address TSO msg_status = MSG("OFF"); "FREE FI("wrktmp1")"; "FREE ATTRLIST(DCB)"; msg_status = MSG("ON"); /* - - - - - - - - - - - - - - - - - - - - - - - */ /* allocate work file */ /* - - - - - - - - - - - - - - - - - - - - - - - */ "ATTRIB DCB RECFM(F) LRECL(80) BLKSIZE(0)"; "ALLOC FILE("wrktmp1") UNIT(VIO) SP(5,5) TRACK USING(DCB) NEW" /* - - - - - - - - - - - - - - - - - - - - - - - */ /* Display "UserIn" and Working panel */ /* - - - - - - - - - - - - - - - - - - - - - - - */ function = "===>" UserIn address ISPEXEC "CONTROL DISPLAY LOCK" address ISPEXEC "DISPLAY PANEL("sysplexw")" /* - - - - - - - - - - - - - - - - - - - - - - - */ /* Turn Console off going into this routine */ /* - - - - - - - - - - - - - - - - - - - - - - - */ address TSO msg_status = MSG("OFF"); "console deactivate" msg_status = MSG("ON"); /* - - - - - - - - - - - - - - - - - - - - - - - */ /* Construct command */ /* - - - - - - - - - - - - - - - - - - - - - - - */ Cart_V = 'PLEX1'random(100,) /* build CART value */ pass_arg. = "CONSOLE SYSCMD("UserIn") CART("Cart_V")" /* - - - - - - - - - - - - - - - - - - - - - - - */ /* Issue message to Console Services */ /* - - - - - - - - - - - - - - - - - - - - - - - */ address TSO "consprof soldisp(no) solnum(300) unsoldisp(no)" "console activate name("Cart_V") cart("Cart_V")" /* - - - - - - - - - - - - - - - - - - - - - - - */ /* Get Message Results */ /* - - - - - - - - - - - - - - - - - - - - - - - */ address TSO pass_arg. /* present command */ getcode = getmsg('issue_back.','SOL',Cart_V,,30) /* - - - - - - - - - - - - - - - - - - - - - - - */ /* Turn Console off going out of this routine */ /* - - - - - - - - - - - - - - - - - - - - - - - */ address TSO msg_status = MSG("OFF"); "console deactivate" msg_status = MSG("ON"); /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ /* logic to parse Structure status information - gillispie 1999 */ /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ do i=1 to issue_back.0 if substr(issue_back.i,1,9) = ' STRNAME:' then do sn = issue_back.i; i = i + 1; if substr(issue_back.i,1,19) = ' STATUS: ALLOCATED' then do st = issue_back.i; i = i + 1; do k = i to issue_back.0 until , Substr(pl,1,19) = ' PREFERENCE LIST:' ; parse var issue_back.k pl '=' data ; if Substr(pl,1,19) = ' PREFERENCE LIST:' then do pl = issue_back.k; i = k + 1; do k = i to issue_back.0 until , Substr(cf,1,19) = ' CFNAME :' ; parse var issue_back.k cf '=' data ; if Substr(cf,1,19) = ' CFNAME :' then do cf = issue_back.k; i = k + 1; str_info.1 = sn ; str_info.2 = st ; str_info.3 = pl ; str_info.4 = cf ; QUEUE '--------------------------------------------------------'; QUEUE str_info.1 ; QUEUE str_info.2 ; QUEUE str_info.3 ; strchk = compare(substr(str_info.3,21,6), , substr(str_info.4,21,6)); if strchk = 0 then QUEUE str_info.4 'Structure location is OK.'; else do QUEUE '*** Warning *** Warning *** Warning ***', '*** Warning *** Warning ***'; QUEUE str_info.4 'Structure has been relocated', 'to backup CF'; QUEUE '*** Warning *** Warning *** Warning ***', '*** Warning *** Warning ***'; end end else iterate end k end else iterate end k end else iterate end else iterate end i /* - - - - - - - - - - - - - - - - - - - - - - - */ /* Write STACK to work file */ /* - - - - - - - - - - - - - - - - - - - - - - - */ address TSO QUEUE '' /* Add a null line to indicate the end of the info */ "EXECIO * DISKW "wrktmp1" (FINIS" /* - - - - - - - - - - - - - - - - - - - - - - - */ /* Library Services */ /* - - - - - - - - - - - - - - - - - - - - - - - */ address ISPEXEC "LMINIT DATAID(LMID) DDNAME("wrktmp1")"; /* address ISPEXEC "edit DATAID(&LMID)"; edit rc = 4 */ address ISPEXEC "edit DATAID(&LMID)"; address ISPEXEC "LMFREE DATAID(&LMID)"; /* - - - - - - - - - - - - - - - - - - - - - - - */ /* post routine clean-up */ /* - - - - - - - - - - - - - - - - - - - - - - - */ address TSO drop pass_arg. /* unassigns variables */ drop issue_back. /* unassigns variables */ msg_status = MSG("OFF"); "FREE FI("wrktmp1")"; "FREE ATTRLIST(DCB)"; msg_status = MSG("ON"); return /* - - - - - - - - - - - - - - - - - - - - - - - */ /* add libdefs */ /* - - - - - - - - - - - - - - - - - - - - - - - */ add_libdefs: address TSO x = LISTDSI(dsn) if x <> 0 then do say "Exec SYSPLEX - Could not locate DSN="dsn exit 99 end "ALTLIB ACTIVATE APPLICATION(EXEC) DA("dsn")" "ISPEXEC LIBDEF ISPPLIB DATASET ID("dsn")" return /* - - - - - - - - - - - - - - - - - - - - - - - */ /* del libdefs */ /* - - - - - - - - - - - - - - - - - - - - - - - */ del_libdefs: address TSO "ALTLIB DEACTIVATE APPLICATION(EXEC) " "ISPEXEC LIBDEF ISPPLIB DATASET" return /* - - - - - - - - - - - - - - - - - - - - - - - */ /* Supported Commands - order is same in Panel */ /* - - - - - - - - - - - - - - - - - - - - - - - */ initialize_cmds: cmd.1 ='LIST LOGR (SYSLOG)' cmd.2 ='CFRM Report' cmd.3 ='CFRM Structure Health Check' cmd.4 ='D ETR,DATA' cmd.5 ='D CF' cmd.6 ='D XCF,SYSPLEX,ALL' cmd.7 ='D XCF,COUPLE' cmd.8 ='D XCF,POLICY' cmd.9 ='RO *ALL,D XCF,PI,DEV=ALL' cmd.10 ='RO *ALL,D XCF,PO,DEV=ALL' cmd.11 ='RO *ALL,D XCF,PI,STRNAME=IXC*' cmd.12 ='RO *ALL,D XCF,PO,STRNAME=IXC*' cmd.13 ='D XCF,STR' cmd.14 ='D XCF,STR,STRNAME=*' cmd.15 ='D XCF,CF,CFNAME=*' cmd.16 ='D XCF,LOCALMSG' cmd.17 ='D XCF,GROUP' cmd.18 ='D XCF,STR,STAT=ALLOCATED' cmd.19 ='D XCF,STR,STAT=ALTER' cmd.20 ='D XCF,STR,STAT=DEALLOCPENDING' cmd.21 ='D XCF,STR,STAT=DUPREBUILD' cmd.22 ='D XCF,STR,STAT=FPCONN' cmd.23 ='D XCF,STR,STAT=INCLEANUP' cmd.24 ='D XCF,STR,STAT=NOCONN' cmd.25 ='D XCF,STR,STAT=NOTALLOCATED' cmd.26 ='D XCF,STR,STAT=POLICYCHANGE' cmd.27 ='D XCF,STR,STAT=REBUILD' cmd.28 ='D WLM,SYSTEMS' cmd.29 ='D LOGGER,STATUS' cmd.30 ='D LOGGER,L' cmd.31 ='D LOGGER,CONNECTION' cmd.32 ='D LOGGER,STRUCTURE' cmd.33 ='D XCF,ARMS,STATE=START' cmd.34 ='D XCF,ARMS,STATE=AVAIL' cmd.35 ='D XCF,ARMS,STATE=FAILED' cmd.36 ='D XCF,ARMS,STATE=RESTART' cmd.37 ='D XCF,ARMS,STATE=RECOVER' cmd.38 ='D XCF,ARMS' return