From a804ec2ed22ec31b31c04fac5748deb3a4ae349e Mon Sep 17 00:00:00 2001 From: Joseph Walther Date: Thu, 19 Jun 2025 12:48:00 -0500 Subject: [PATCH 01/20] A SonarQube analysis performed during an Endevor package CAST --- .../PackageBuilder.moveout | 1262 ------------- .../C1UEXTR7.rex | 1289 +++++++++++++ .../C1UEXTT7.cob | 727 +++++++ .../CAST#JCL.jcl | 22 + .../CAST#JCL.skl | 22 + .../FTP#INC.skl | 15 + .../FTP#RUN.skl | 10 + .../GTUNIQUE.rex | 25 + .../SonarQube-interface-to-Endevor/README.md | 17 + .../SONARMDL.skl | 175 ++ .../SONARPRM.skl | 5 + .../SONARSET.skl | 13 + .../SONARTBL.skl | 3 + .../SONARW#1.skl | 17 + .../SONARW#2.skl | 14 + .../SONARW#3.skl | 13 + .../WAITFILE.rex | 46 + .../XCOM#INC.skl | 17 + .../XCOM#RUN.skl | 13 + .../Field-Developed-Programs/SonarQube.bat | 72 + .../TableToolExamples.moveout | 1665 ----------------- 21 files changed, 2515 insertions(+), 2927 deletions(-) delete mode 100644 endevor/Field-Developed-Programs/PackageBuilder.moveout create mode 100644 endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/C1UEXTR7.rex create mode 100644 endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/C1UEXTT7.cob create mode 100644 endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/CAST#JCL.jcl create mode 100644 endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/CAST#JCL.skl create mode 100644 endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/FTP#INC.skl create mode 100644 endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/FTP#RUN.skl create mode 100644 endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/GTUNIQUE.rex create mode 100644 endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/README.md create mode 100644 endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/SONARMDL.skl create mode 100644 endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/SONARPRM.skl create mode 100644 endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/SONARSET.skl create mode 100644 endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/SONARTBL.skl create mode 100644 endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/SONARW#1.skl create mode 100644 endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/SONARW#2.skl create mode 100644 endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/SONARW#3.skl create mode 100644 endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/WAITFILE.rex create mode 100644 endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/XCOM#INC.skl create mode 100644 endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/XCOM#RUN.skl create mode 100644 endevor/Field-Developed-Programs/SonarQube.bat delete mode 100644 endevor/Field-Developed-Programs/TableToolExamples.moveout diff --git a/endevor/Field-Developed-Programs/PackageBuilder.moveout b/endevor/Field-Developed-Programs/PackageBuilder.moveout deleted file mode 100644 index 44fa3ee..0000000 --- a/endevor/Field-Developed-Programs/PackageBuilder.moveout +++ /dev/null @@ -1,1262 +0,0 @@ -./ ADD NAME=@README -These are rex/CSIQCLS0 : Moveout Package PKGELES PkgMaint -These are pnl/CSIQPENU : PACKAGEP PKGESEL2 PKGESELS PMAINTPN -These are asm : LOADTABL -These are ispfmsg/CSIQMENU : CIUU02 -./ ADD NAME=Moveout -/* REXX */ -/* */ - "ISREDIT MACRO" - /* WRITTEN BY DAN WALTHER */ -/* TRACE R ; */ -/* ADDRESS ISREXEC " CONTROL RETURN ERRORS " ; */ - ADDRESS ISREDIT "CHANGE 'CE'X '4A'X ALL " ; - ADDRESS ISREDIT "CHANGE '6A'X '4F'X ALL " ; - ADDRESS ISREDIT "CHANGE 'B7'X '5F'X ALL " ; - ADDRESS ISREDIT "CHANGE 'FA'X '4F'X ALL " ; - ADDRESS ISREDIT "CHANGE '9A'X '5F'X ALL " ; - ADDRESS ISREDIT " CURSOR = 1 1 " ; - RETCODE = 0 ; - ADDRESS ISREDIT " (LPOS1,CPOS1) = CURSOR " ; - DO WHILE RETCODE = 0 - ADDRESS ISREDIT " (DLINE) = LINE "LPOS1 - MYMBR = STRIP(SUBSTR(DLINE,15,22),T) ; - ADDRESS ISREDIT " FIND './ ADD NAME=' 1 " - RETCODE = RC - IF RETCODE > 0 THEN , - DO - ADDRESS ISREDIT " CURSOR = .ZLAST " ; - ADDRESS ISREDIT " (LPOS2,CPOS2) = CURSOR " ; - IF LPOS2 > LPOS1 THEN, - ADDRESS ISREDIT " REPLACE "MYMBR LPOS1+1 LPOS2 - REPRC = RC ; - END ; /* IF RETCODE > 0 THEN */ - ELSE, - DO - ADDRESS ISREDIT " (LPOS2,CPOS2) = CURSOR " ; - LPOS2 = LPOS2 - 1 ; - IF LPOS1 < LPOS2 THEN, - ADDRESS ISREDIT " REPLACE "MYMBR LPOS1+1 LPOS2 - REPRC = RC - LPOS1 = 1 - END; /* ELSE (RETCODE ...) */ - IF REPRC = 0 THEN , - ADDRESS ISREDIT " DELETE "LPOS1 LPOS2 ; - END; /* DO WHILE RETCODE = 0 */ - IF SYSVAR(SYSENV) = BACK THEN , - DO - ADDRESS ISREDIT " SAVE " - ADDRESS ISREDIT " CANCEL " - END - ADDRESS ISREDIT " EXCLUDE ALL "; - ADDRESS ISREDIT " FIND './ ADD NAME=' 1 ALL" ; - EXIT 0 - -./ ADD NAME=Package - /* REXX */ -/* THESE ROUTINES ARE DISTRIBUTED BY THE CA TECHNOLOGIES STAFF - "AS IS". NO WARRANTY, EITHER EXPRESSED OR IMPLIED, IS MADE - FOR THEM. CA TECHNOLOGIES CANNOT GUARANTEE THAT THE ROUTINES - ARE ERROR FREE, OR THAT IF ERRORS ARE FOUND, THEY WILL BE - CORRECTED. -*/ - TRACE o ; -/* Is PACKAGE is allocated? If yes, then turn on Trace */ - isItThere = , - BPXWDYN("INFO FI(PACKAGE) INRTDSN(DSNVAR) INRDSNT(myDSNT)") - If isItThere = 0 then Trace ?r - -/* Variable settings for each site ---> */ - VCAPRN= '0' - VCAPYN = 'N' - - WhereIam = Strip(Left("@"MVSVAR(SYSNAME),8)) ; - /* Site-based logic was obsolete here, and was removed */ - - /* Decide on Temporary Dataset name prefix... */ - ADDRESS ISPEXEC "VGET (ZSCREEN zUSER zSYSID zPREFIX)" - if zSYSID = SPECIAL then do /* is this a special system? */ - /* insert system specific logic if required here */ - PkgsDsPrefix = left(zUSER,3)||'.'||zUser'.'|| , - STRIP(LEFT('E'||ZSYSID,8))||'.PKGE'||ZSCREEN - end - else /* otherwise we use some sensible defautls */ - if zPrefix \= '', /* is Prefix set? and NOT.. */ - & zPrefix \= zUSER then do /* the same as userid? */ - PkgsDsPrefix = zPrefix ||'.'|| zUser'.' || , - STRIP(LEFT('E'||ZSYSID,8)) || '.PKGE'||ZSCREEN - end - else do /* otherwise use user name */ - PkgsDsPrefix = zUser ||'.'|| , - STRIP(LEFT('E'||ZSYSID,8)) || '.PKGE' || ZSCREEN - end - -/* No additional changes are required. */ -/* However, if you wish to modify the */ -/* structure of package names, find below */ -/* "Examples for building the package name" */ -/* <---- Variable settings for each site */ -/* Initialize vars for WideScreen Support */ - LONGPANL = "PKGESELS" /* Default to pri scrn */ - - ADDRESS ISPEXEC, - "VGET (C1BJC1 C1BJC2 C1BJC3 C1BJC4) PROFILE " - ADDRESS ISPEXEC "VGET (EEVCCID) PROFILE" - UseCCID = Strip(EEVCCID); - ADDRESS ISPEXEC "VGET (EEVCOMM) PROFILE" - - VARWKCMD = "" ; - Element_List = " " ; - System_List = " " ; - - INPPKGE = ' ' -/* - Call Check_For_Package_Execution ; - ADDRESS ISPEXEC, - "VPUT (INPPKGE) SHARED" - - If INPPKGE /= ' ' then, /* Package Processing */ - Do - Mode = 'package' - Call Build_Package_Suffix ; - Call Calculate_Date_Fields ; - Call Process_Input_Package ; - Call Build_Package ; - If CASTPKGE = "Y" then Call CAST_Package; - Exit - End /* Package Processing */ - */ - - Mode = 'element' -/* Variable settings for each site ---> */ -/* <---- Variable settings for each site */ -/* */ -/* Use Table Status to work out which interface we're in... */ -/* */ -/* for table status... */ -/* 1 = table exists in the table input library chain */ -/* 2 = table does not exist in the table input library chain */ -/* 3 = table input library is not allocated. */ -/* */ -/* 1 = table is not open in this logical screen */ -/* 2 = table is open in NOWRITE mode in this logical screen */ -/* 3 = table is open in WRITE mode in this logical screen */ -/* 4 = table is open in SHARED NOWRITE mode in this logical screen*/ -/* 5 = table is open in SHARED WRITE mode in this logical screen. */ -/* */ -/* In Quick Edit ? */ - - UseTable = "EN"ZSCREEN"IE250" - ADDRESS ISPEXEC - "TBSTATS" UseTable "STATUS1(STATUS1) STATUS2(STATUS2)" - - IF STATUS2 /= 2 & STATUS2 /= 3 & STATUS2 /= 4 then, - do -/* no, so try LongName ??? */ - UseTable = "LN"ZSCREEN"IE250" - ADDRESS ISPEXEC - "TBSTATS" UseTable "STATUS1(STATUS1) STATUS2(STATUS2)" - IF STATUS2 /= 2 & STATUS2 /= 3 & STATUS2 /= 4 then, - do -/* finally, try In Endevor ??? */ - UseTable = "CIELMSL"ZSCREEN - ADDRESS ISPEXEC - "TBSTATS" UseTable "STATUS1(STATUS1) STATUS2(STATUS2)" - IF STATUS2 /= 2 & STATUS2 /= 3 & STATUS2 /= 4 then, - do - say "Must invoke Package from an", - "Element list " - exit ; - end; - END - END - - "TBQUERY "UseTable " KEYS(KEYLIST) NAMES(VARLIST) ROWNUM(ROWNUM)" - IF RC > 0 THEN EXIT - - "TBTOP "UseTable - - - If Substr(UseTable,1,7) = 'CIELMSL' then, - Call Build_Entries_Endevor - Else, - Call Build_Entries_QuickEdit ; - - COUNT = Words(Element_List) ; - Call Build_Package_Suffix ; - Call Calculate_Date_Fields ; - System_List = Strip(System_List) ; - - ACTION = 'MOVE' - Call SHOW_PANEL; - Call Build_Package ; - If CASTPKGE = "Y" then Call CAST_Package; - - exit - -Build_Entries_Endevor: - - Do row = 1 to rownum - "TBSKIP "UseTable - entry = element"/"environ"/"stage"/"system"/"subsys"/"type - entry = EMKNAME"/"EMKENV"/"EMKSTGI"/" ||, - EMKSYS"/"EMKSBS"/"EMKTYPE - If row=1 then, - Do - Environment = EMKENV ; - Stage = EMKSTGI ; - If Environment = 'ADMIN' then, - PKGPRFIX = EMKSBS ; - Else, - PKGPRFIX = EMKSYS ; - Call Get_Next_StgID ; - End; - Element_List = Element_List entry - if Wordpos(EMKSYS,System_List) = 0 then, - System_List = System_List EMKSYS ; - - End; /* do row = 1 to rownum */ - - Return ; - -Build_Entries_QuickEdit: - - Do row = 1 to rownum - "TBSKIP "UseTable - entry = element"/"environ"/"stage"/"system"/"subsys"/"type - entry = EEVETKEL"/"EEVETKEN"/"EEVETKSI"/" ||, - EEVETKSY"/"EEVETKSB"/"EEVETKTY - If row=1 then, - Do - Environment = EEVETKEN ; - Stage = EEVETKSI ; - PKGPRFIX = EEVETKSY ; - UseCCID = Strip(EEVETCCI) - If Environment = 'ADMIN' then, - PKGPRFIX = EEVETKSB ; - Else, - PKGPRFIX = EEVETKSY ; - Call Get_Next_StgID ; - End; - Element_List = Element_List entry - if Wordpos(EEVETKSY,System_List) = 0 then, - System_List = System_List EEVETKSY ; - - End; /* do row = 1 to rownum */ - - Return ; - -Build_Package_Suffix: - - PKGSTAGE = Stage /* Package Prefix */ - - NUMBERS = '123456789' ; - CHARACTERS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' ; - TODAY = DATE(O) ; - YEAR = SUBSTR(TODAY,1,2) + 1; - YEAR = SUBSTR(CHARACTERS||CHARACTERS||CHARACTERS||CHARACTERS,YEAR,1) - MONTH = SUBSTR(TODAY,4,2) ; - MONTH = SUBSTR(CHARACTERS,MONTH,1) ; - DAY = SUBSTR(TODAY,7,2) ; - DAY = SUBSTR(CHARACTERS || NUMBERS,DAY,1) ; - NOW = TIME(L); - HOUR = SUBSTR(NOW,1,2) ; - IF HOUR = '00' THEN HOUR = '0' - ELSE - HOUR = SUBSTR(CHARACTERS,HOUR,1) ; - - MINUTE = SUBSTR(NOW,4,2) ; - SECOND = SUBSTR(NOW,7,2) ; - Fractn = SUBSTR(NOW,10,6) ; - PKGUNIQ = YEAR || MONTH || DAY || HOUR ||, - MINUTE || SECOND || Fractn ; - - Return ; - -Get_Next_StgID: -/* */ - NEXT_STG = Stage ; - RETURN - SA= "CALLING LOADTABLE" -/* IF USING MULTIPLE DEFAULTS TABLES... */ -/* SET THE VALUE OF THE DEFAULTS TABLE NAME: */ -/* - C1DEFLTS = 'C1DEFLTS' - ADDRESS LINKMVS 'LOADTBLE' C1DEFLTS ; -*/ -/* IF NOT USING MULTIPLE DEFAULTS TABLES... */ - ADDRESS LINKMVS 'LOADTABL' 'C1DEFLTS' ; - C1DEFLTS_ADDR = C2X(TBLADDR) ; - POINTER_ADDR = D2X( X2D(C1DEFLTS_ADDR) + X2D(055) ) - NUMBER_OF_ENVIRONMENTS = C2D(STORAGE(POINTER_ADDR,01)); - POINTER_ADDR = D2X( X2D(C1DEFLTS_ADDR) + X2D(22E) ) - SITE_SYMBOLICS_TABLE_NAME = STORAGE(POINTER_ADDR,08) ; -/* */ - POINTER_ADDR = D2X( X2D(C1DEFLTS_ADDR) + X2D(400) ) -/* */ - DO CNT = 1 TO NUMBER_OF_ENVIRONMENTS - ENV_NAME_ADDR = D2X( X2D(POINTER_ADDR) + X2D(074) ) - NEXT_ENV_ADDR = D2X( X2D(POINTER_ADDR) + X2D(07C) ) - NEXT_STG_ADDR = D2X( X2D(POINTER_ADDR) + X2D(073) ) - C1STAGE1_ADDR = POINTER_ADDR - C1STAGE2_ADDR = D2X( X2D(POINTER_ADDR) + X2D(08A) ) - C1STGID1_ADDR = D2X( X2D(POINTER_ADDR) + X2D(0BE) ) - C1STGID2_ADDR = D2X( X2D(POINTER_ADDR) + X2D(0D3) ) - STAGE_1_ENTRY_ADDR = D2X( X2D(POINTER_ADDR)+ X2D(0F0)) - STAGE_2_ENTRY_ADDR = D2X( X2D(POINTER_ADDR)+ X2D(0F1)) - ENV_NAME = STORAGE(ENV_NAME_ADDR,08) ; - NEXT_ENV = STORAGE(NEXT_ENV_ADDR,08) ; - NEXT_STG = STORAGE(NEXT_STG_ADDR,01) ; - C1STAGE1 = STORAGE(POINTER_ADDR,08) ; - C1STAGE2 = STORAGE(C1STAGE2_ADDR,08) ; - C1STGID1 = STORAGE(C1STGID1_ADDR,01) ; - C1STGID2 = STORAGE(C1STGID2_ADDR,01) ; - STAGE_1_ENTRY_INDICATOR = STORAGE(STAGE_1_ENTRY_ADDR,01) ; - STAGE_2_ENTRY_INDICATOR = STORAGE(STAGE_2_ENTRY_ADDR,01) ; - - IF ENV_NAME = Environment then, - DO - If Stage = C1STGID1 then NEXT_STG = C1STGID2 ; - /* Otherwise user the value already in NEXT_STG */ - Leave ; - End; /* IF NEXT_ENV /= " " */ - - POINTER_ADDR = D2X( X2D(POINTER_ADDR) + X2D(100) ) - END /* DO CNT = 1 TO NUMBER_OF_ENVIRONMENTS */ - - Return ; - -Calculate_Date_Fields: - - GENERATE = "Y" ; - - - TEMP = DATE('N') - DAY = WORD(TEMP,1) - IF LENGTH(DAY) < 2 THEN DAY = "0"DAY ; - MON = WORD(TEMP,2) - YEAR = SUBSTR(WORD(TEMP,3),3,2) ; - IF LENGTH(YEAR) < 2 THEN YEAR = "0"YEAR ; - BTSTDATE = DAY || MON || YEAR; - ONSTDATE = DAY || MON || YEAR; - - TEMP = TIME('N') - BTSTTIME = SUBSTR(TEMP,1,5) - BTSTTIME = "00:00" - - BTENDATE = "31DEC79" - BTENTIME = "00:00" - - Return ; - -SHOW_PANEL: - - /* These are valid if we are in Quick Edit */ - CCID = EEVCCID - COMMENT = EEVCOMM - - If Substr(UseTable,1,7) = 'CIELMSL' then, - Do - CCID = ECTL# - COMMENT = EMCCOM - End -/* - Examples for building the package name...... - PACKAGE = PKGSTAGE||"#" ||Substr(PKGPRFIX,1,4)||PKGUNIQ ; - PACKAGE = STAGE ||"#" || PKGUNIQ ; - PACKAGE = PKGSTAGE ||"#" || PKGUNIQ ; - COMMENT = Left(UseCCID||':' COMMENT,50) -*/ - PACKAGE = UseCCID || PKGUNIQ - PKGPRFIX = Left(PKGPRFIX,4,'#') - PACKAGE = Substr(PKGPRFIX,1,4)|| '#' || PKGUNIQ - - PACKAGE = Left(PACKAGE,16,'#') - - ADDRESS ISPEXEC, - "DISPLAY PANEL(PACKAGEP) " - if rc > 0 then exit - DESCRIPT = TRANSLATE(DESCRIPT,"'",'"'); - - DATE = BTSTDATE ; - CALL VALIDATE_DATE ; - IF DATE_RC > 0 THEN SIGNAL SHOW_PANEL; - BATCH_START_DATE = NUMERIC_DATE ; - sa= "BATCH_START_DATE =" BATCH_START_DATE ; - - DATE = BTENDATE ; - CALL VALIDATE_DATE ; - IF DATE_RC > 0 THEN SIGNAL SHOW_PANEL; - - ADDRESS ISPEXEC, - "VPUT (C1BJC1 C1BJC2 C1BJC3 C1BJC4) PROFILE " - - IF Mode /= 'element' |, - PICKLIST /= 'Y' THEN RETURN ; - - PickLstTable = "EN"ZSCREEN"PKLST"; /* Use Pick List table */ - "ISPEXEC CONTROL DISPLAY SAVE" - Call Create_PickList_Table ; - "ISPEXEC CONTROL DISPLAY RESTORE" - If Selection = 0 then exit ; - - Return - -VALIDATE_DATE: - - DATE_RC = 0 ; - - /* BTENDATE = "31DEC79" */ - DAY = SUBSTR(DATE,1,2) ; - MON = SUBSTR(DATE,3,3) ; - YEAR = SUBSTR(DATE,6,2) ; - LIST_OF_MONTHS = "JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC" ; - NUMERIC_MON = WORDPOS(MON,LIST_OF_MONTHS) ; - IF LENGTH(NUMERIC_MON) < 2 THEN NUMERIC_MON = "0"NUMERIC_MON ; - - NUMERIC_DATE = YEAR || NUMERIC_MON || DAY ; - - IF DAY < "01" | DAY > "31" THEN DATE_RC = 8 ; - IF NUMERIC_MON = 0 THEN DATE_RC = 8 ; - IF YEAR < "01" | YEAR > "99" THEN DATE_RC = 8 ; - - IF DATE_RC > 0 THEN, - ADDRESS ISPEXEC "SETMSG MSG(CIUU026E)" ; - - return; - -Build_Package: - - ADDRESS TSO, - "ALLOC F(PKGESCL)", - "LRECL(80) BLKSIZE(800) SPACE(5,5)", - "RECFM(F B) TRACKS ", - "NEW UNCATALOG REUSE " ; - - Queue "SET OPTIONS CCID '"CCID"'" - Queue " COMMENT '"COMMENT"' " - ADDRESS ISPEXEC "VGET (EEVOOSGN) SHARED " - IF EEVOOSGN = "Y" THEN, - Queue " OVERRIDE SIGNOUT." - ELSE, - Queue " . " - - Do cnt = 1 to Words(Element_List) ; - entry = WORD(Element_List,cnt) ; - entry = Translate(entry," ","/"); - Queue ACTION "ELEMENT" - Queue "'"WORD(entry,1)"'" - Queue " FROM ENVIRONMENT" WORD(entry,2) - Queue " SYSTEM" WORD(entry,4) "SUBSYSTEM" WORD(entry,5) - Queue " TYPE" WORD(entry,6) "STAGE" WORD(entry,3) "." - End; - - ADDRESS TSO, - "EXECIO" QUEUED() "DISKW PKGESCL (FINIS " ; - - ADDRESS TSO, - "ALLOC F(C1MSGS1)", - "LRECL(133) BLKSIZE(13300) SPACE(5,5)", - "RECFM(V B) TRACKS ", - "NEW UNCATALOG REUSE " ; - - ADDRESS TSO, - "ALLOC F(ENPSCLIN)", - "LRECL(80) BLKSIZE(800) SPACE(5,5)", - "RECFM(F B) TRACKS ", - "NEW UNCATALOG REUSE " ; - - QUEUE " DEFINE PACKAGE '"PACKAGE"'" - QUEUE " IMPORT SCL FROM DDNAME 'PKGESCL'" - If APPEND = "Y" then, - QUEUE " APPEND " - QUEUE " DESCRIPTION '"DESCRIPT"'" - QUEUE " OPTIONS STANDARD SHARABLE BACKOUT ENABLED " - QUEUE " EXECUTION WINDOW FROM " BTSTDATE BTSTTIME - QUEUE " TO " BTENDATE BTENTIME - If PROMOTE = "Y" & ACTION = 'MOVE' then, - QUEUE " PROMOTION PACKAGE " - QUEUE " NOTES=('"VPHNOTE1"'," - QUEUE " '"VPHNOTE2"'," - QUEUE " '"VPHNOTE3"'," - QUEUE " '"VPHNOTE4"'," - QUEUE " '"VPHNOTE5"'," - QUEUE " '"VPHNOTE6"'," - QUEUE " '"VPHNOTE7"'," - QUEUE " '"VPHNOTE8"') . " - ADDRESS TSO, - "EXECIO" QUEUED() "DISKW ENPSCLIN (FINIS " ; - - ADDRESS LINK "ENBP1000" ; - IF RC > 4 THEN, - Do - Say "Could not build the package "PACKAGE - ADDRESS ISPEXEC "LMINIT DATAID(DDID) DDNAME(C1MSGS1)" - ADDRESS ISPEXEC "VIEW DATAID(&DDID)" - ADDRESS ISPEXEC "LMFREE DATAID(&DDID)" - EXIT(8) - End - - ADDRESS TSO "FREE F(C1MSGS1)" - ADDRESS TSO "FREE F(PKGESCL)" - ADDRESS TSO "FREE F(ENPSCLIN)" - - ADDRESS ISPEXEC "SETMSG MSG(CIUU020I)" ; - - return; - -CAST_Package: - - ADDRESS ISPEXEC "SETMSG MSG(CIUU021I)" ; - ADDRESS ISPEXEC "DISPLAY PANEL(ENDIE700) " - if rc > 0 then exit - - SCL_DSN = PkgsDsPrefix || "." || SUBSTR(PKGUNIQ,1,8) - - ADDRESS TSO, - "ALLOC F(CASTSCL) DA('"SCL_DSN"')", - "LRECL(80) BLKSIZE(800) SPACE(5,5)", - "RECFM(F B) TRACKS ", - "NEW CATALOG REUSE " ; - - If VALIDATE /= "Y" then, - Do - QUEUE " CAST PACKAGE '"PACKAGE"' " - QUEUE " OPTION DO NOT VALIDATE COMPONENT ." - End - Else, - QUEUE " CAST PACKAGE '"PACKAGE"' ." - /* - */ - pkg = Overlay('*',PACKAGE,Length(PACKAGE)) - If EXECUTE = "Y" then, - Do - QUEUE " EXECUTE PACKAGE '"pkg"' " - QUEUE " OPTIONS WHERE PACKAGE STATUS IS APPROVED . " - End - ADDRESS TSO, - "EXECIO" QUEUED() "DISKW CASTSCL (FINIS " ; - ADDRESS TSO "FREE F(CASTSCL)" - - ADDRESS ISPEXEC "VGET (VCAPRN) ASIS " - If VCAPRN > '1' then VCAPYN = 'Y' - - PDVINCJC = "Y" /* for ENSP1000 */ - PDVSCLDS = SCL_DSN ; /* for ENSP1000 */ - PDVDD01 = "//DELETEME DD DSN="SCL_DSN",DISP=(OLD,DELETE)" - - ADDRESS ISPEXEC "FTOPEN TEMP" - - ADDRESS ISPEXEC "FTINCL ENSP1000" - - ADDRESS ISPEXEC "FTCLOSE " - - ADDRESS ISPEXEC "VGET (ZUSER ZTEMPF ZTEMPN) ASIS" ; - DEBUG = 'YES' ; - DEBUG = 'NAW' ; - X = OUTTRAP("OFF") - IF DEBUG = 'YES' THEN, - DO - ADDRESS ISPEXEC "LMINIT DATAID(DDID) DDNAME(&ZTEMPN)" - ADDRESS ISPEXEC "EDIT DATAID(&DDID)" - ADDRESS ISPEXEC "LMFREE DATAID(&DDID)" - END; - ELSE, - DO - ADDRESS TSO "SUBMIT '"ZTEMPF"'" ; - END; - - return; - -Create_PickList_Table: - - /* Allow user to select from original list of elements */ - ADDRESS ISPEXEC "VGET (ZSCREEN) SHARED" - SA= "CREATE_SummaryLevels_Table SUM"ZSCREEN"LVL" - ADDRESS ISPEXEC, - "TBCREATE" PickLstTable, - 'NAMES(EEVETSEL EEVETKEL EEVETDMS EEVETKTY EEVETKEN EEVETKSI ', - ' EEVETPRC EEVETNRC EEVETUID EEVETCCI ', - ' EEVETKSY EEVETKSB EEVETDVL) WRITE ' ; - - ADDRESS ISPEXEC "TBTOP "UseTable ; - - Do row = 1 to ROWNUM - ADDRESS ISPEXEC "TBSKIP "UseTable - If Substr(UseTable,1,7) = 'CIELMSL' then, - Do - /* We are using an Endevor table - not a QE table */ - EEVETKEL = EMKNAME - EEVETKTY = EMKTYPE - EEVETKEN = EMKENV - EEVETKSI = EMKSTGI - EEVETKSY = EMKSYS - EEVETKSB = EMKSBS - EEVETDVL = ECVL - EEVETPRC = EPRC - EEVETNRC = EMRC - EEVETUID = EMLUID - EEVETCCI = ECTL# - End; - - IF TOSUBSYS = EEVETKSB THEN ITERATE ; - EEVETSEL = ' ' - EEVETDMS = ' ' - ADDRESS ISPEXEC "TBADD" PickLstTable "ORDER "; - End; /* do row = 1 to rownum */ - - ADDRESS ISPEXEC "TBSORT" PickLstTable, - "FIELDS(EEVETKEL,C,A) "; - SA= 'COMPLETED TBSORT ' ; - ADDRESS ISPEXEC "TBTOP" PickLstTable ; - - ADDRESS ISPEXEC "SETMSG MSG(CIUU025I)" ; - Selection = 0 ; - - VARC1LR = PASSTHRU /* enable Left/Right commands */ - DO FOREVER /* Till user presses END or CANCEL */ - ADDRESS ISPEXEC "TBDISPL" PickLstTable "PANEL("LONGPANL")" - TBDRC = RC - IF TBDRC >= 8 THEN, /* user want's out */ - DO - address ispexec "vget (zverb)" /* Cancel, End or Return? */ - if ZVERB == 'CANCEL' then Selection = 0 /* clear selection */ - VARC1LR = '' /* Allow standard Left/Right */ - If Selection = 0 then - Do - ADDRESS ISPEXEC "TBEND" PickLstTable ; - Return - End - Leave - end; - THISTOPR = ZTDTOP /* save the top row so we can restore it */ - DO WHILE ZTDSELS > 0 /* process any modified rows */ - SA= 'ZTDSELS=' ZTDSELS 'ZTDTOP=' ZTDTOP - sa= "PROCESSING ELEMENT " EEVETKEL C1ELTYPE - IF Strip(EEVETSEL) = "S" then, - Do - EEVETSEL = ' ' - If EEVETDMS /= '*SELECTED*' then Selection = Selection + 1 ; - EEVETDMS = '*SELECTED*' - ADDRESS ISPEXEC "TBPUT" PickLstTable ; - End; - IF Strip(EEVETSEL) = "U" then, - Do - EEVETSEL = ' ' - If EEVETDMS /= ' ' then Selection = Selection - 1 ; - EEVETDMS = ' ' - ADDRESS ISPEXEC "TBPUT" PickLstTable ; - End; - IF ZTDSELS = 1 then leave /* we got em all get out now */ - ADDRESS ISPEXEC "TBDISPL" PickLstTable ; /* get next */ - sa= 'ZTDSELS=' ZTDSELS 'RC=' rc - end - /* now process any primary commands */ - THISCMD = VARWKCMD; /* get any command */ - VARWKCMD = ""; /* reset the command */ - parse upper var THISCMD THISCMDW THISCMDP - - select - when THISCMDW == '' then NOP; - when THISCMDW == 'LEFT' then call Toggle_Screen; - when THISCMDW == 'RIGHT' then call Toggle_Screen; - otherwise - do - VARWKCMD = THISCMD /* restore command so it can be corrected */ - ADDRESS ISPEXEC "SETMSG MSG(LONG013E)" ; /* Cmd Not Recognized */ - end - End /* Do Forever */ - - /* re-position table */ - ADDRESS ISPEXEC "TBTOP "PickLstTable ; - ADDRESS ISPEXEC "TBSKIP "PickLstTable" NUMBER("THISTOPR")" - END; /* DO until user presses End or cancel */ - VARC1LR = '' /* Allow standard Left/Right */ - - If Selection = 0 then, - Do - ADDRESS ISPEXEC "TBEND" PickLstTable ; - Return ; - End - - ADDRESS ISPEXEC "TBTOP" PickLstTable ; - - Element_List = " " ; - COUNT = 0 - Do row = 1 to ROWNUM - ADDRESS ISPEXEC "TBSKIP" PickLstTable ; - If EEVETDMS /= '*SELECTED*' then iterate ; - entry = EEVETKEL"/"EEVETKEN"/"EEVETKSI"/" ||, - EEVETKSY"/"EEVETKSB"/"EEVETKTY - Element_List = Element_List entry; - - COUNT = COUNT + 1; - Sa= 'Adding 'EEVETKEL COUNT - End; /* do row = 1 to rownum */ - - ADDRESS ISPEXEC "TBEND" PickLstTable ; - if Count = 0 then - Selection = 0 /* nothing to do */ - else - UseTable = PickLstTable ; /* Use Pick List table now */ - Return ; - -Toggle_Screen: - - IF LONGPANL == PKGESELS THEN LONGPANL = "PKGESEL2" - ELSE LONGPANL = "PKGESELS" - - Return; - -Check_For_Package_Execution: - - ADDRESS ISPEXEC, - "VGET (ZSCREEN ZSCREENC ZSCREENI) SHARED" - - position = zscreenc; - Do forever - If position < 2 then exit(8) - If substr(zscreeni,(position-1),1) < '$' then leave; - position = position - 1; - End ; - - pkg = Strip(substr(zscreeni,position,16)) ; - SA= "Package =" pkg - if Length(pkg) < 16 then Return ; - INPPKGE = pkg - - Return - -Process_Input_Package: - SAY "GETTING CURRENT LOCATIONS FROM ENDEVOR" ; - ADDRESS TSO "ALLOC FI(C1MSGS1) DUMMY SHR REUSE" - ADDRESS TSO; - - "ALLOC FI(C1MSGS1) DUMMY SHR REUSE" - "ALLOC FI(C1MSGS2) DUMMY SHR REUSE" -/*'ALLOC F(BSTERR) DUMMY SHR REUSE ' */ -/*'ALLOC F(BSTAPI) DUMMY SHR REUSE ' */ - - 'ALLOC F(APILIST) LRECL(2048) BLKSIZE(22800) SPACE(5,5) ', - 'RECFM(V B) TRACKS NEW UNCATALOG REUSE ' ; - - 'ALLOC F(APIMSGS) LRECL(133) BLKSIZE(13300) SPACE(5,5) ', - 'RECFM(F B) TRACKS NEW UNCATALOG REUSE ' ; - - ADDRESS LINKMVS 'APIALPKG' INPPKGE ; /* Get pkg header */ - ADDRESS TSO "EXECIO * DISKR APILIST (STEM pkghdr. finis" - InpPackageStatus = Substr(pkghdr.1,116,12) ; - InpPackageDescription = Substr(pkghdr.1,30,50) ; - - 'ALLOC F(APILIST) LRECL(2048) BLKSIZE(22800) SPACE(5,5) ', - 'RECFM(V B) TRACKS NEW UNCATALOG REUSE ' ; - ADDRESS LINKMVS 'APIALSUM' INPPKGE ; /* Get pkg Actions*/ - - ADDRESS TSO "EXECIO * DISKR APILIST (STEM pkglst. finis" - IF pkglst.0 = 0 then, - Do - Say 'Package' INPPKGE ' is not-found or not-CAST ' - Exit (8) - End; - - ADDRESS ISPEXEC "VGET (ZSCREEN) SHARED" - PickLstTable = "EN"ZSCREEN"PKLST"; /* Use Pick List table */ - - ADDRESS ISPEXEC, - "TBCREATE" PickLstTable, - 'NAMES(EEVETSEL EEVETKEL EEVETDMS EEVETKTY EEVETKEN EEVETKSI ', - ' EEVETKSY EEVETKSB EEVETDVL) WRITE ' ; - plc = 191 ; /* Assume Source fields */ - If STRIP(InpPackageStatus) = 'EXECUTED' then plc = 304 ; - If STRIP(InpPackageStatus) = 'COMMITTED' then plc = 304 ; - If Substr(InpPackageDescription,47,4) = 'XFER' then plc = 191; - If Substr(pkglst.ROWNUM,304,1) < '$' then plc = 191; - Do ROWNUM = 1 to pkglst.0 - EEVETKEL = Substr(pkglst.ROWNUM,415,8) ; - EEVETKEN = Substr(pkglst.ROWNUM,plc,8) ; - EEVETKSY = Substr(pkglst.ROWNUM,(plc+8),8) ; - EEVETKSB = Substr(pkglst.ROWNUM,(plc+16),8) ; - EEVETKTY = Substr(pkglst.ROWNUM,(plc+26),8) ; - EEVETKSI = Substr(pkglst.ROWNUM,(plc+43),1) ; - EEVETSEL = ' ' - EEVETDMS = ' ' - If ROWNUM = 1 then, - Do - Environment = EEVETKEN ; - Stage = EEVETKSI ; - PKGPRFIX = EEVETKSY ; - If Environment = 'ADMIN' then, - PKGPRFIX = EEVETKSB ; - Else, - PKGPRFIX = EEVETKSY ; - Call Get_Next_StgID ; - End; - ADDRESS ISPEXEC "TBADD" PickLstTable "ORDER "; - End; /* Do ROWNUM = 1 to pkglst.0 */ - COUNT = pkglst.0 - - ADDRESS ISPEXEC "TBSORT" PickLstTable, - "FIELDS(EEVETKEL,C,A) "; - SA= 'COMPLETED TBSORT ' ; - ADDRESS ISPEXEC "TBTOP" PickLstTable ; - - Call SHOW_PANEL ; - - If PICKLIST = 'Y' THEN, - Do - VARC1LR = PASSTHRU /* enable Left/Right commands */ - ADDRESS ISPEXEC "SETMSG MSG(CIUU025I)" ; - ADDRESS ISPEXEC "TBDISPL" PickLstTable "PANEL("LONGPANL")"; - IF RC > 4 THEN, - DO - VARC1LR = '' /* Allow standard Left/Right */ - ADDRESS ISPEXEC "TBEND" PickLstTable ; - EXIT - end; - TBDISPL_RC = RC ; - DO FOREVER - ADDRESS ISPEXEC "SETMSG MSG(CIUU025I)" ; - SA= 'ZTDSELS=' ZTDSELS - sa= "PROCESSING ELEMENT " EEVETKEL C1ELTYPE - IF Strip(EEVETSEL) = "S" then, - Do - EEVETSEL = ' ' - EEVETDMS = '*SELECTED*' - ADDRESS ISPEXEC "TBPUT" PickLstTable ; - End; - IF Strip(EEVETSEL) = "U" then, - Do - EEVETSEL = ' ' - EEVETDMS = ' ' - ADDRESS ISPEXEC "TBPUT" PickLstTable ; - End; - If ZTDSELS > 0 then do - ADDRESS ISPEXEC "TBDISPL" PickLstTable ; - if RC > 4 then leave; - end - If ZTDSELS < 1 then leave ; - END; /* DO FOREVER */ - END; /* If PICKLIST = 'Y' */ - VARC1LR = '' /* Allow standard Left/Right */ - - ADDRESS ISPEXEC "TBTOP" PickLstTable ; - - Element_List = " " ; - COUNT = 0 - Do row = 1 to ROWNUM - ADDRESS ISPEXEC "TBSKIP" PickLstTable ; - If PICKLIST = 'Y' &, - EEVETDMS /= '*SELECTED*' then iterate ; - entry = EEVETKEL"/"EEVETKEN"/"EEVETKSI"/" ||, - EEVETKSY"/"EEVETKSB"/"EEVETKTY - Element_List = Element_List entry; - - COUNT = COUNT + 1; - End; /* do row = 1 to rownum */ - - ADDRESS ISPEXEC "TBEND" PickLstTable ; - UseTable = PickLstTable ; /* Use Pick List table now */ - - Return ; - - -./ ADD NAME=PKGELES - -./ ADD NAME=PACKAGEP -)ATTR DEFAULT(%+_) -/*---------------------------------------------------------------------- -/* (C) 2002 Computer Associates International, Inc. -/*---------------------------------------------------------------------- - ^ TYPE(OUTPUT) INTENS(HIGH) JUST(RIGHT) - | TYPE(OUTPUT) INTENS(LOW) - _ TYPE(INPUT) INTENS(HIGH) PADC(_) CAPS(ON) - { TYPE(INPUT) CAPS(&VARCACCI) FORMAT(&VARFMCCI) PADC(_) - ` TYPE(INPUT) CAPS(&VARCACOM) FORMAT(&VARFMCOM) PADC(_) - ~ TYPE(INPUT) CAPS(&VARCADES) FORMAT(&VARFMDES) PADC(_) -)BODY -%------------------------ ENDEVOR Package(s) Builds --------------------------- -%Command ===>_VARWKCMD -+ -+ Action :_ACTION + <- MOVE/GENERATE/DELETE for ^COUNT+Elements -+ CCID :_CCID +<- CCID _Z+_PACKAGE + _Z+<-Append Y/N -+ %Concur Act =====>_Z+ -+ Promote:_Z+ <- Y/N Cast:_Z+ <- Y/N Validate:_Z+ <- Y/N Execute:_Z+ <- Y/N -+ Description:_DESCRIPT + -+ EXECUTION WINDOW FROM%===>_Z _Z + TO%===>_Z _Z + -+ ----------------------%Package Note Text+------------------------------- -+ .........1.........2.........3.........4.........5.........6 -+ 1. `VPHNOTE1 + -+ 2. `VPHNOTE2 + -+ 3. `VPHNOTE3 + -+ 4. `VPHNOTE4 + -+ 5. `VPHNOTE5 + -+ 6. `VPHNOTE6 + -+ 7. `VPHNOTE7 + -+ 8. `VPHNOTE8 + -)INIT - VGET (VCAPRN) ASIS - &APPEND = 'N' - &CASTPKGE = 'Y' - &VALIDATE = 'Y' - &EXECUTE = 'N' - &ACTION = 'MOVE' - &DESCRIPT = &COMMENT - &PICKLIST = 'N' - .ZVARS = '( PICKLIST APPEND VCAPRN PROMOTE CASTPKGE VALIDATE + - EXECUTE BTSTDATE BTSTTIME BTENDATE BTENTIME)' -)PROC - VER (&ACTION,LIST,MOVE,GENERATE,DELETE) - VER (&VCAPRN,NUM) - &VARSPPKG = &PACKAGE - VPUT (VCAPRN) ASIS - VPUT (VARSPPKG) SHARED -)END -./ ADD NAME=PKGESEL2 -)ATTR -/*---------------------------------------------------------------------- -/* Copyright (C) 2007 CA. All Rights Reserved. -/*---------------------------------------------------------------------- - ^ TYPE(OUTPUT) INTENS(HIGH) - @ TYPE(OUTPUT) INTENS(LOW) - _ TYPE(INPUT) INTENS(HIGH) PADC(_) CAPS(ON) - ` TYPE(INPUT) CAPS(&VARCACOM) FORMAT(&VARFMCOM) PADC(_) - ~ TYPE(INPUT) CAPS(&VARCADES) FORMAT(&VARFMDES) PADC(_) -)BODY -%-------------------------- PACKAGE Selection List --------------------- -+Command ===>_VARWKCMD %Scroll == -+ -+ Element Options: -+ %S+Select Element(s) -+ % -+ S Element Message Type CCID User PRRC NDRC -+ -- ---------- ---------- -------- ----------- ------- --- --- -)MODEL -+_Z @Z ^Z @Z @Z + @Z + @Z + @Z + -)INIT - .ZVARS = '(EEVETSEL EEVETKEL EEVETDMS EEVETKTY EEVETCCI + - EEVETUID EEVETPRC EEVETNRC)' - .HELP = ENDHE250 - VGET (AMT) - IF (&AMT = '') - &AMT = PAGE -)PROC - VPUT (AMT) PROFILE - &VARWKSEL = &EEVETSEL - &EEVSELCH = &EEVETSEL -)END -./ ADD NAME=PKGESELS -)ATTR -/*---------------------------------------------------------------------- -/* Copyright (C) 2007 CA. All Rights Reserved. -/*---------------------------------------------------------------------- - ^ TYPE(OUTPUT) INTENS(HIGH) - @ TYPE(OUTPUT) INTENS(LOW) - _ TYPE(INPUT) INTENS(HIGH) PADC(_) CAPS(ON) - ` TYPE(INPUT) CAPS(&VARCACOM) FORMAT(&VARFMCOM) PADC(_) - ~ TYPE(INPUT) CAPS(&VARCADES) FORMAT(&VARFMDES) PADC(_) -)BODY -%-------------------------- PACKAGE Selection List --------------------- -+Command ===>_VARWKCMD %Scroll == -+ -+ Element Options: -+ %S+Select Element(s) -+ % -+ S Element Message Type Environment Stage System Subsystem -+ -- ---------- ---------- -------- ----------- ----- -------- --------- -)MODEL -+_Z @Z ^Z @Z @Z + @Z+ @Z @Z +@Z -)INIT - .ZVARS = '(EEVETSEL EEVETKEL EEVETDMS EEVETKTY EEVETKEN EEVETKSI + - EEVETKSY EEVETKSB EEVETDVL)' - .HELP = ENDHE250 - VGET (AMT) - IF (&AMT = '') - &AMT = PAGE -)PROC - VPUT (AMT) PROFILE - &VARWKSEL = &EEVETSEL - &EEVSELCH = &EEVETSEL -)END - -./ ADD NAME=LOADTABL -LOADTABL CSECT -* THESE ROUTINES ARE DISTRIBUTED BY THE BROADCOM STAFF -* "AS IS". NO WARRANTY, EITHER EXPRESSED OR IMPLIED, IS MADE -* FOR THEM. CA TECHNOLOGIES CANNOT GUARANTEE THAT THE ROUTINES -* ARE ERROR FREE, OR THAT IF ERRORS ARE FOUND, THEY WILL BE -* CORRECTED. -* -*********************************************************************** -* SEE IBM TSO EXTENSIONS FOR MVS * -* PROGRAMMING SERVICES * -* VERSION 2 RELEASE 5 * -* DOCUMENT NUMBER SC28-1875-08 * -* 24.8 EXAMPLES USING IKJCT441 * -*********************************************************************** -CVTPTR EQU 16 -CVTTVT EQU X'9C' -R15 EQU 15 -R14 EQU 14 -R13 EQU 13 -R12 EQU 12 -R11 EQU 11 -R07 EQU 7 -R01 EQU 1 -R00 EQU 0 - IKJTSVT -LOADTABL CSECT - STM R14,R12,12(R13) SAVE CALLER'S REGISTERS - BALR R12,0 ESTABLISH ADDRESSABILITY - USING *,R12 BASE REGISTER OF EXECUTING PROGRAM - ST R13,SAVEAREA+4 CALLER'S SAVEAREA ADDRESS - LA R15,SAVEAREA EXECUTING PROGRAM'S SAVEAREA ADDRESS - ST R15,8(,R13) EXECUTING PROGRAM'S SAVEAREA ADDRESS - LA R13,SAVEAREA EXECUTING PROGRAM'S SAVEAREA ADDRESS -* -*---------------------------------------------------------------------- -*- LOAD THE TABLE NAMED IN PARM STRING -*---------------------------------------------------------------------- -* - L R07,0(R01) GET TABLENAME IN PARAMETER S - MVC TABLELEN(10),0(R07) SAVE TABLE LEN AND NAME -* LENGTH (0 => NOT CALLED BY REXX) -* -* MVC SWTO+19(08),=C'LOADING ' -* MVC SWTO+27(10),0(R07) *DAN* -* BAL R14,SWTO *DAN* -* -* WTO 'LOADTABL - CALLING LOAD ',* -* ROUTCDE=(11) -* - LOAD EPLOC=TABLENAM - LTR R15,R15 VERIFY LOAD WAS SUCCESSFUL - BZ CONTINU1 - ST R15,VALUE SAVE ADDRESS INTO REXX VAR VALUE -* -* WTO 'LOADTABL - CALLED LOAD. RESULT FAILED. ',* -* ROUTCDE=(11) - B CONTINU2 -* -SWTO WTO 'SHOWME - ', * - ROUTCDE=(11) - MVC SWTO+19(40),SPACES *DAN* - BR R14 -* -* -CONTINU1 DS 0H CONTINUE - ST R00,VALUE SAVE ADDRESS INTO REXX VAR VALUE -* WTO 'LOADTABL - CALLED LOAD. RESULT OK. ',* -* ROUTCDE=(11) -* - LA R07,0 - LH R07,TABLELEN - C R07,=X'0000' - BE NOTREXX NOT CALLED BY REXX, JUST RETURN -* -* WTO 'LOADTABL - CALLED FROM REXX ',* -* ROUTCDE=(11) -* -CONTINU2 L R15,CVTPTR ACCESS THE CVT - L R15,CVTTVT(,R15) ACCESS THE TSVT - L R15,TSVTVACC-TSVT(,R15) ACCESS THE VARIABLE ACCESS RTN - -* INVOKE THE VARIABLE ACCESS SERVICE -* - LTR R15,R15 VERIFY TSVT ADDRESS PRESENT - BNZ CALL441 IF PRESENT, CALL IKJCT441 - -LINK441 LINK EP=IKJCT441, * - PARAM=(ECODE, ENTRY CODE * - NAMEPTR, POINTER TO VARIABLE NAME * - NAMELEN, LENGTH OF VARIABLE NAME * - VALUEPTR, POINTER TO VARIABLE VALUE * - VALUELEN, LENGTH OF VARIABLE VALUE * - TOKEN), TOKEN TO VARIABLE ACCESS SERVICE * - VL=1 CAUSES HI BIT ON IN THE PARM LIST - B RET441 -CALL441 CALL (15), * - (ECODE, ENTRY CODE * - NAMEPTR, POINTER TO VARIABLE NAME * - NAMELEN, LENGTH OF VARIABLE NAME * - VALUEPTR, POINTER TO VARIABLE VALUE * - VALUELEN, LENGTH OF VARIABLE VALUE * - TOKEN), TOKEN TO VARIABLE ACCESS SERVICE * - VL CAUSES HI BIT ON IN THE PARM LIST -* -RET441 LTR R15,R15 CHECK RETURN CODE - BNZ NOTREXX - L R13,4(,R13) CALLER'S SAVEAREA - L R14,12(,R13) RESTORE REGISTER 14 - LM R00,R12,20(R13) RESTORE REMAINING REGISTERS - BR R14 RETURN TO CALLER, REGISTER 15 CONTAINS -* THE RETURN CODE FROM IKJCT441 -NOTREXX DS 0H -* -* WTO 'LOADTABL - CALLED FROM OTHER THAN REXX ',* -* ROUTCDE=(11) -* - L R13,4(,R13) CALLER'S SAVEAREA - L R14,12(,R13) RESTORE REGISTER 14 - LM R00,R12,20(R13) RESTORE REMAINING REGISTERS - L R15,VALUE PROVIDE LOADED ADDRESS IN RETURNCODE - BR R14 RETURN TO CALLER, REGISTER 15 CONTAINS -* THE RETURN CODE FROM IKJCT441 -* -SPACES DC C' ' -TABLELEN DC CL02' ' LENGTH (0 => NOT CALLED BY REXX) -TABLENAM DC CL08' ' NAME OF THE TABLE TO BE LOADED -* 1234567890 -NAME DC CL07'TBLADDR' NAME OF THE REXX VARIABLE -NAMELEN DC F'07' LENGTH OF THE VARIABLE NAME -VALUE DC F'0' VARIABLE VALUE -VALUELEN DC F'4' LENGTH OF THE VARIABLE VALUE -NAMEPTR DC A(NAME) POINTER TO THE VARIABLE NAME -VALUEPTR DC A(VALUE) POINTER TO THE VARIABLE VALUE -TOKEN DC F'0' TOKEN (UNUSED HERE) -ECODE DC A(TSVEUPDT) ENTRY CODE FOR SETTING VALUES -SAVEAREA DS 18F - END - -./ ADD NAME=PkgMaint - /* REXX */ -/* THESE ROUTINES ARE DISTRIBUTED BY THE CA TECHNOLOGIES STAFF - "AS IS". NO WARRANTY, EITHER EXPRESSED OR IMPLIED, IS MADE - FOR THEM. CA TECHNOLOGIES CANNOT GUARANTEE THAT THE ROUTINES - ARE ERROR FREE, OR THAT IF ERRORS ARE FOUND, THEY WILL BE - CORRECTED. -*/ - TRACE O ; - - ADDRESS ISPEXEC - "VGET (ZSCREEN) SHARED" - ADDRESS ISPEXEC - "TBSTATS C1"ZSCREEN"P0200 STATUS1(STATUS1) STATUS2(STATUS2)" - -/* for table status... */ -/* 1 = table exists in the table input library chain */ -/* 2 = table does not exist in the table input library chain */ -/* 3 = table input library is not allocated. */ -/* */ -/* 1 = table is not open in this logical screen */ -/* 2 = table is open in NOWRITE mode in this logical screen */ -/* 3 = table is open in WRITE mode in this logical screen */ -/* 4 = table is open in SHARED NOWRITE mode in this logical screen*/ -/* 5 = table is open in SHARED WRITE mode in this logical screen. */ -/* */ - IF STATUS2 /= 2 & STATUS2 /= 3 & STATUS2 /= 4 then, - do - say "Must invoke PMAINT from a ", - "Package list Screen (C1SP0200)" ; - exit ; - end; - - "TBQUERY C1"ZSCREEN"P0200 KEYS(KEYLIST) NAMES(VARLIST) ROWNUM(ROWNUM)" - IF RC > 0 THEN EXIT - - ROWNUM = Strip(ROWNUM,'L','0') - - VARWKCMD = "" ; - "VGET (C1BJC1 C1BJC2 C1BJC3 C1BJC4) PROFILE " - - "DISPLAY PANEL(PMAINTPN) " - if rc > 0 then exit - "VPUT (C1BJC1 C1BJC2 C1BJC3 C1BJC4) PROFILE " - - SCL_DSN = USERID()".TEMPSCL.PKGMAINT" - PDVINCJC = "Y" - PDVSCLDS = SCL_DSN ; - PDVDD01 = "//DELETEME DD DSN="SCL_DSN",DISP=(OLD,DELETE)" - - ADDRESS TSO, - "ALLOC F(PKGESCL) DA('"SCL_DSN"')", - "LRECL(80) BLKSIZE(8000) SPACE(5,5)", - "RECFM(F B) TRACKS ", - "MOD CATALOG REUSE " ; - - "TBTOP C1"ZSCREEN"P0200 " - Do row = 1 to ROWNUM - "TBSKIP C1"ZSCREEN"P0200 " - cmd = " "ACTION "PACKAGE '"VPHPKGID"' ." - queue cmd - End; /* do row = 1 to ROWNUM */ - - ADDRESS TSO "EXECIO" QUEUED() "DISKW PKGESCL ( FINIS" - ADDRESS TSO "FREE F(PKGESCL)" - - "FTOPEN TEMP" - "FTINCL ENSP1000" - - "FTCLOSE " - - "VGET (ZUSER ZTEMPF ZTEMPN) ASIS" ; - DEBUG = 'YES' ; - DEBUG = 'NAW' ; - X = OUTTRAP("OFF") - IF DEBUG = 'YES' THEN, - DO - ADDRESS ISPEXEC "LMINIT DATAID(DDID) DDNAME(&ZTEMPN)" - ADDRESS ISPEXEC "EDIT DATAID(&DDID)" - ADDRESS ISPEXEC "LMFREE DATAID(&DDID)" - END; - ELSE, - DO - ADDRESS TSO "SUBMIT '"ZTEMPF"'" ; - END; - - exit - - -./ ADD NAME=PMAINTPN -)ATTR DEFAULT(%+_) -/*---------------------------------------------------------------------- -/* (C) 2002 Computer Associates International, Inc. -/*---------------------------------------------------------------------- - › TYPE(OUTPUT) INTENS(HIGH) JUST(RIGHT) - | TYPE(OUTPUT) INTENS(LOW) - _ TYPE(INPUT) INTENS(HIGH) PADC(_) CAPS(ON) - ¬ TYPE(INPUT) CAPS(&VARCACCI) FORMAT(&VARFMCCI) PADC(_) - ` TYPE(INPUT) CAPS(&VARCACOM) FORMAT(&VARFMCOM) PADC(_) - ~ TYPE(INPUT) CAPS(&VARCADES) FORMAT(&VARFMDES) PADC(_) -)BODY -%------------------------ ENDEVOR Package(s) Maintenance ---------------------- -%Command ===>_VARWKCMD -+ -+ Action :_ACTION + <- COMMIT,RESET,DELETE for ›ROWNUM+Packages -+ -+ Complete the JCL JOB card and press%ENTER+to submit the jobstream. -+ Enter the%END+command to terminate the submit. -+ -+ -+ _C1BJC1 + -+ _C1BJC2 + -+ _C1BJC3 + -+ _C1BJC4 + -+ -% -+ (PRESS%ENTER+ or%PF3+TO CANCEL OR END) -+ -)INIT - &ACTION = 'COMMIT' -)PROC - VER (&ACTION,LIST,COMMIT,RESET,DELETE) -)END - -./ ADD NAME=CIUU02 -CIUU020I '&PACKAGE CREATED' .ALARM=NO -'** Package &PACKAGE has been created*** ' -CIUU021I 'CAST &PACKAGE ' .ALARM=NO -'** &PACKAGE will be CAST by submitted batch job*** ' -CIUU024E 'PACKAGE RESET IS RESTRICTED' .ALARM=NO -'** An APPROVED Package cannot be RESET *** ' -CIUU025I '*Select Elems for Packageing' .ALARM=YES -'**Use this screen to select elements for Package processing**' -CIUU026E 'Incorrect Date field' .ALARM=NO -'** A date field is in an incorrect format*** ' -CIUU027E 'Incorrect Prod Date ' .ALARM=NO -'** Production date field is in an incorrect format*** ' -CIUU029E 'Must use PACKAGE Tool' .ALARM=NO -'** You must use the PACKAGE tool to create new packages ** ' - diff --git a/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/C1UEXTR7.rex b/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/C1UEXTR7.rex new file mode 100644 index 0000000..f38372f --- /dev/null +++ b/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/C1UEXTR7.rex @@ -0,0 +1,1289 @@ +/* rexx */ +/* Perform various Package actions in REXX */ +/* */ +/* A COBOL exit CALLS this REXX and provides values for */ +/* REXX variables, including these. */ +/* Find documentation on these in the TechDocs documentation */ +/* where each underscore appears as a dash in the documentation. */ +/* For example, PECB_PACKAGE_ID is documented as */ +/* PECB-PACKAGE-ID */ +/* */ +/* PECB_PACKAGE_ID PAPP_GROUP_NAME */ +/* PECB_FUNCTION_LITERAL PAPP_ENVIRONMENT */ +/* PECB_SUBFUNC_LITERAL PAPP_QUORUM_COUNT */ +/* PECB_BEF_AFTER_LITERAL PAPP_APPROVER_FLAG */ +/* PECB_USER_BATCH_JOBNAME PAPP_APPR_GRP_TYPE */ +/* PREQ_PKG_CAST_COMPVAL PAPP_APPR_GRP_DISQ */ +/* PHDR_PKG_SHR_OPTION PAPP_SEQUENCE_NUMBER */ +/* PHDR_PKG_ENV */ +/* PHDR_PKG_STGID */ +/* Address fields are provided for fields that may be */ +/* modified by the REXX. */ +/* Address_PECB_MESSAGE Address_MYSMTP_SUBJECT */ +/* Address_MYSMTP_MESSAGE Address_MYSMTP_TEXT */ +/* Address_MYSMTP_USERID Address_MYSMTP_URL */ +/* Address_MYSMTP_FROM Address_MYSMTP_EMAIL_IDS */ +/* MYSMTP_EMAIL_IDS MYSMTP_EMAIL_ID_SIZE */ +/* */ + /* If wanting to limit the use of this exit, uncomment... */ +/* + If USERID() /= 'IBMUSER' &, + USERID() /= 'JW61868' &, + USERID() /= 'JW618685' then Say USERID() +*/ + /* If wanting to send email, use these variables with */ + /* designated maximum lengths. The Rexx will put them */ + /* into their proper places. */ + /* */ + /* Variable Description max-Len */ + /* */ + /* MySMTP_Message Email Message 80 */ + /* MySMTP_From Email From name 50 */ + /* MySMTP_Subject Email Subject 50 */ + /* MySMTP_textline.1 Text line in email 133 */ + /* MySMTP_textline.2 " 133 */ + /* MySMTP_textline.nn up to 99 133 */ + /* MySMTP_textline.0 Number Text lines used (max 99) 2 */ + /* MySMTP_URL Y/N 1 */ + /* MYSMTP_EMAIL_IDS List of space delimited userids *Exit */ + /* The COBOL exit OCCURS clause determines / */ + /* In case these are not already allocated, these are attempted */ + STRING = "ALLOC DD(SYSTSPRT) SYSOUT(A) " + CALL BPXWDYN STRING; + STRING = "ALLOC DD(SYSTSIN) DUMMY" + CALL BPXWDYN STRING; + + /* If C1UEXTR7 is allocated to anything, turn on Trace */ + WhatDDName = 'C1UEXTR7' + CALL BPXWDYN "INFO FI("WhatDDName")", + "INRTDSN(DSNVAR) INRDSNT(myDSNT)" + if RESULT = 0 then TraceRQ = 'Y' + /* Values to be set for your site...... */ + /* For package REVIEW (APPROVE/DENY)..... */ + /* Enter location of Approver Group sequencing ... */ + ApproverGroupSequence= 'YOURSITE.NDVR.PARMLIB(APPROVER)' + ApproverGroupSequence= '' + + /* Do you want all CAST actions to be peformed in Batch? */ + Force_CAST_in_Batch = 'Y' ; /* Y/N */ + Force_CAST_in_Batch = 'N' ; /* Y/N */ + + Cast_with_SonarQube= '?' /* Y/N/?=Check Notes */ + + /* Parms are REXX statements passed from COBOL exit */ + Arg Parms + Parms = Strip(Parms) + sa= 'Parms len=' Length(Parms) + + If TraceRQ = 'Y' then, + Say 'C1UEXTR7 is called again:' + + /* Parms from C1UEXT07 is a string of REXX statements */ + + Interpret Parms + If TraceRQ = 'Y' & PECB_MODE = 'B' then Trace r + + /* Another way to Determine if Trace is wanted... */ + If Substr(PHDR_PKG_NOTE5,1,5) = 'TRACE' then TraceRQ = 'Y' + If TraceRQ = 'Y' then, + Do + Trace ?r + Sa= 'CALL_REASON = ' CALL_REASON + Sa= 'PECB_FUNCTION_LITERAL = ' PECB_FUNCTION_LITERAL + Sa= 'PECB_SUBFUNC_LITERAL = ' PECB_SUBFUNC_LITERAL + Sa= 'PECB_BEF_AFTER_LITERAL= ' PECB_BEF_AFTER_LITERAL + Sa= 'PECB_PACKAGE_ID = ' PECB_PACKAGE_ID + Sa= 'MYSMTP_EMAIL_ID_SIZE = ' MYSMTP_EMAIL_ID_SIZE + End + + /* Early outs .... */ + If PECB_FUNCTION_LITERAL = 'SETUP' then Exit + + /* Work to Do .... */ + + /* Unspecified about SonarQube? Let NOTES decide.... */ + If Cast_with_SonarQube /= 'N' then, + Do + Call CheckForSonarQubeOption + If Cast_with_SonarQube = 'Y' then, + Do + COBOL_Element_Types = 'COB* CBL*' + COBOL_Compile_StepNames = 'COMPILE COMP CMP COB' + TransmitMethod = 'FTP' /* **chose one ** */ + TransmitMethod = 'XCOM' /* **chose one ** */ + Call GetUnique_Name + SonarDSNPrefix = USERID()'.SONRQUBE.' || Unique_Name + SonarRemoteCommand =, + "python3 /opt/xfer/scripts/sqp3.py" Unique_Name.lst + TransmitTable = "" + End /* If Cast_with_SonarQube = 'Y' */ + End /* If Cast_with_SonarQube /= 'N' */ + + If PECB_FUNCTION_LITERAL ='CAST' &, + PECB_SUBFUNC_LITERAL ='CAST' &, + PECB_BEF_AFTER_LITERAL ='BEFORE' &, + PHDR_PACKAGE_STATUS ='IN-EDIT' &, + PECB_MODE = "T" &, /* TSO foreground */ + (Force_CAST_in_Batch= 'Y' | Cast_with_SonarQube= 'Y') then, + Do + Call SubmitBatchCAST + Exit + End + + /* Initialize variables.... */ + Message = '' + MessageCode = ' ' + MyRc = 0 + + /* Execute a SonarQube analysis? */ + If Cast_with_SonarQube = 'Y' &, + PECB_FUNCTION_LITERAL = 'CAST' &, + PECB_BEF_AFTER_LITERAL = 'BEFORE' Then + Do + If TraceRQ = 'Y' then Trace ?r + Call Allocate_Files_For_CSV_and_API + Elements.0 = 0 + Call ProcessPackageSCL + If COBOLinPackage = 'Y' then, + Do + Call RETRIEVE_Cobol_Elements + Call Use_ENTBJAPI_For_BX_Info + Trace r + Call SubmitandWaitForSonarQube + If myRC > 4 then, + Do + If message = '' then, + message = 'C1UEXTR7 -', + 'Package Failed the SonarQube Analysis' + MyRc = 8 + End /* If myRC > 4 */ + Else, + Do + MyRc = 4 + message = 'C1UEXTR7 -', + 'Package passed a SonarQube Analysis' + End /* Else */ + Call SetExitReturnInfo + Exit + End; /* If COBOLinPackage = 'Y' ... */ + Call FREE_Files_For_CSV_and_API + End; /* If Cast_with_SonarQube = 'Y' ... */ + + /* Validate Package prefix with ServiceNow */ + If PECB_FUNCTION_LITERAL ='CREATE' &, + PECB_BEF_AFTER_LITERAL ='BEFORE' &, + (Substr(PECB_PACKAGE_ID,1,3) = 'PRB' |, + Substr(PECB_PACKAGE_ID,1,3) = 'CHG' ) then, + Do + Call Validate_PackageID + If MyRc > 0 then Exit + End + + /* Enforce packages to be Backout Enabled */ + IF PREQ_BACKOUT_ENABLED /= 'Y' then, + Do + Message = 'C1UEXTR7 - Package made to be Backout enabled' + MyRc = 4 + hexAddress = D2X(Address_PREQ_BACKOUT_ENABLED) + storrep = STORAGE(hexAddress,,'Y') + Call SetExitReturnInfo + Exit + End; + + If PECB_FUNCTION_LITERAL ='CAST' &, + PECB_SUBFUNC_LITERAL ='CAST' &, + PECB_BEF_AFTER_LITERAL ='AFTER' then, + Call ManageEmails ; + + Exit + +GetUnique_Name: + + Unique_Name = GTUNIQUE() + If TraceRQ = 'Y' then, + SAY "Unique Member name is " Unique_Name + + Return + +CheckForSonarQubeOption: + + Cast_with_SonarQube = 'Y' /* Default */ + If Substr(PHDR_PKG_NOTE8,1,16)= 'BYPASS SONARQUBE' then, + Cast_with_SonarQube = 'N' + Else, + If Substr(PHDR_PKG_NOTE7,1,16)= 'BYPASS SONARQUBE' then, + Cast_with_SonarQube = 'N' + Else, + If Substr(PHDR_PKG_NOTE6,1,16)= 'BYPASS SONARQUBE' then, + Cast_with_SonarQube = 'N' + Else, + If Substr(PHDR_PKG_NOTE5,1,16)= 'BYPASS SONARQUBE' then, + Cast_with_SonarQube = 'N' + Else, + If Substr(PHDR_PKG_NOTE4,1,16)= 'BYPASS SONARQUBE' then, + Cast_with_SonarQube = 'N' + Else, + If Substr(PHDR_PKG_NOTE3,1,16)= 'BYPASS SONARQUBE' then, + Cast_with_SonarQube = 'N' + Else, + If Substr(PHDR_PKG_NOTE2,1,16)= 'BYPASS SONARQUBE' then, + Cast_with_SonarQube = 'N' + Else, + If Substr(PHDR_PKG_NOTE1,1,16)= 'BYPASS SONARQUBE' then, + Cast_with_SonarQube = 'N' + Return + +ManageEmails: + + If TraceRQ = 'Y' then Trace ?R + whereami = 'ManageEmails' + + /* Only run if the exit is giving us an Approver Group */ + If Substr(CALL_REASON,1,16) = 'APPROVER GROUP #' then, + Do + Call SaveOffApproverGrpInfo + Return + End + + /*****************************************************************/ + /* Initializaztion and Example statements */ + /*****************************************************************/ + MySMTP_Message =, + 'YOURSITE.NDVR.REXX(C1UEXTR7)' + MySMTP_Message =, + 'SHARE.ENDV.SHARABLE.REXX(C1UEXTR7)' + MySMTP_Subject = 'Please Approve Package' PECB_PACKAGE_ID + MySMTP_From = Left('YOURSITE your testing Endevor',50) + MySMTP_textline.1 = 'Package' PECB_PACKAGE_ID, + ' has been CAST and is ready for APPROVAL.' + MySMTP_textline.2 = 'Your Review and approval of package', + PECB_PACKAGE_ID 'is reqested.' + MySMTP_textline.3 = ' ' + MySMTP_textline.4 = ' ' + MySMTP_textline.0 = 4 + MYSMTP_EMAIL_IDS = '' + + /* Only run if the exit says all Approver Grps are done */ + If Substr(CALL_REASON,1,22) = 'NO MORE APPROVER GRPS ' then, + Do + Call CheckApproverGroupSequence + Return + End + + Return + +Validate_PackageID: + + If TraceRQ = 'Y' then Trace ?R + whereami = 'Validate_PackageID' + /* build STDENV input */ + CALL BPXWDYN , + "ALLOC DD(STDENV) LRECL(080) BLKSIZE(24000) SPACE(1,1) ", + " RECFM(F,B) TRACKS ", + " NEW UNCATALOG REUSE "; + Queue "EXPORT PATH=$PATH:" ||, + "'/usr/lpp/IBM/cyp/v3r11/pyz/lib/python3.11/'" + Queue "EXPORT VIRTUAL_ENV=" ||, + "'/u/users/NDVRTeam/venv/lib/python3.11/site-packages/'" + "EXECIO 2 DISKW STDENV (finis" + + /* build BPXBATCH inputs and outputs */ + /* build STDPARM input */ + CALL BPXWDYN , + "ALLOC DD(STDPARM) LRECL(080) BLKSIZE(24000) SPACE(1,1) ", + " RECFM(F,B) TRACKS ", + " NEW UNCATALOG REUSE "; + Queue "sh cd " ||, + "/u/users/NDVRTeam/venv/lib/python3.11/site-packages;" + Queue "python ServiceNow.py" Substr(PECB_PACKAGE_ID,1,10) + "EXECIO 2 DISKW STDPARM (finis" + + CALL BPXWDYN , + "ALLOC DD(STDOUT) LRECL(200) BLKSIZE(20000) SPACE(5,5) ", + " RECFM(F,B) TRACKS ", + " NEW UNCATALOG REUSE "; + Notnow =, + "ALLOC DD(STDOUT) DA('IBMUSER.STDOUT') OLD REUSE " + + CALL BPXWDYN , + "ALLOC DD(STDERR) LRECL(200) BLKSIZE(20000) SPACE(5,5) ", + " RECFM(F,B) TRACKS ", + " NEW UNCATALOG REUSE "; + Notnow =, + "ALLOC DD(STDERR) DA(*) SHR REUSE" + + CALL BPXWDYN "ALLOC DD(STDIN) DUMMY SHR REUSE" + CALL BPXWDYN "ALLOC DD(STDERR) DA(*) SHR REUSE" + + ADDRESS LINK 'BPXBATCH' + CallRC = RC + + "EXECIO * DISKR STDOUT (Stem stdout. finis" + lastrec# = stdout.0 + lastrecord = Substr(stdout.lastrec#,1,40) + + If Pos("Exists",lastrecord) = 0 then, + Do + Message = 'C1UEXTR7 - Package prefix' PECB_PACKAGE_ID ||, + ' is not defined to Service-Now' + MessageCode = 'U033' + MyRc = 8 + Call SetExitReturnInfo + End + + If CallRC = 0 then, + Do + CALL BPXWDYN "FREE DD(STDENV) " + CALL BPXWDYN "FREE DD(STDPARM)" + CALL BPXWDYN "FREE DD(STDOUT) " + CALL BPXWDYN "FREE DD(STDIN) " + CALL BPXWDYN "FREE DD(STDERR) " + End + + Return; + +SaveOffApproverGrpInfo: + + If TraceRQ = 'Y' then Trace ?R + PAPP_SEQUENCE_NUMBER = Substr(CALL_REASON,17,4) + numberQueued = QUEUED() + If PAPP_SEQUENCE_NUMBER = "0001" & numberQueued > 0 then, + Do numberQueued /* Clear out whatever is queued */ + pull leftovers + End + If PAPP_SEQUENCE_NUMBER = "0001" then, + CALL BPXWDYN , /* save Approver group data */ + "ALLOC DD(C1UEXTD7) LRECL(180) BLKSIZE(18000) SPACE(1,1) ", + " RECFM(F,B) TRACKS ", + " MOD UNCATALOG REUSE "; + + pkgGrp# = Strip(PAPP_SEQUENCE_NUMBER,'L','0') + PAPP_GROUP_NAME = Strip(PAPP_GROUP_NAME) + Queue 'pkgGrp# = 'pkgGrp# + Queue 'GROUP_NAME.pkgGrp# ="'PAPP_GROUP_NAME'"' + Queue 'ENVIRONMENT.pkgGrp# ="'Strip(PAPP_ENVIRONMENT)'"' + Queue 'APPR_GRP_TYPE.pkgGrp# ="'Strip(PAPP_APPR_GRP_TYPE)'"' + Queue 'APPR_GRP_DISQ.pkgGrp# ="'Strip(PAPP_APPR_GRP_DISQ)'"' + Queue 'APPROVAL_FLAGS.pkgGrp# ="'Strip(PAPP_APPROVAL_FLAGS)'"' + Queue 'STATUS.'PAPP_GROUP_NAME '="'Strip(PAPP_APPROVER_FLAG)'"' + Queue 'QUORUM.'PAPP_GROUP_NAME '='Strip(PAPP_QUORUM_COUNT,'L','0') + Queue 'USRLST.'PAPP_GROUP_NAME '="'Strip(PAPP_APPROVAL_IDS)'"' + + numberQueued = QUEUED() + "EXECIO" numberQueued " DISKW C1UEXTD7 " + + Return; + +CheckApproverGroupSequence: + + If TraceRQ = 'Y' then Trace ?R + whereami = 'CheckApproverGroupSequence' + + /* If C1UEXTD7 is allocated to anything, we have approvers */ + WhatDDName = 'C1UEXTD7' + CALL BPXWDYN "INFO FI("WhatDDName")", + "INRTDSN(DSNVAR) INRDSNT(myDSNT)" + If Substr(DSNVAR,1,1) = ' ' then Return + + "EXECIO 0 DISKW C1UEXTD7 (Finis" + "EXECIO * DISKR C1UEXTD7 (Finis" + CALL BPXWDYN "FREE DD(C1UEXTD7)" + numberQueued = QUEUED() + + /* Analyze Exit-provided Approver Group info */ + pkgGrp# = 0 + /* By default, ordered Approver Groups are not related */ + STATUS. = 'NotRelated' + QUORUM. = 0 + + /* Return Approver Group info for this package */ + Do q# = 1 to numberQueued + Parse Pull something + If TraceRQ = 'Y' then say "@187" something + interpret something + End; + ThisEnvironment = ENVIRONMENT.pkgGrp# + + /* Read the site's required Approver Group sequencing */ + CALL BPXWDYN, + "ALLOC DD(APPROVER) DA('"ApproverGroupSequence"') SHR REUSE" + "EXECIO * DISKR APPROVER (Stem ordered. Finis" + CALL BPXWDYN "FREE DD(APPROVER)" + + /* Build a sequenced list of all named Approver Groups */ + OrderedApproverGroups = '' + /* Set a default value to be 1 greater than number of groups */ + NotOrdered = ordered.0 + 1 + Sequence. = NotOrdered + Do ord# = 1 to ordered.0 + orderedEntry = ordered.ord# + orderedEnv = Word(orderedEntry,1) + If orderedEnv /= thisEnvironment then iterate + orderedApproverGroup = Word(orderedEntry,2) + If orderedApproverGroup = 'AllOthers' then, + DefaultOrder = ord# + SEQUENCE.orderedApproverGroup = ord# + If TraceRQ = 'Y' then, + say "@201 Sequence for" orderedApproverGroup "is" ord# + End; /* Do ord# = 1 to ordered.0 */ + + Sequence.NotOrdered = DefaultOrder + unsorted_list = "" + /* Build a list of Approver Groups for this package */ + PackageApproverGroups = '' + Do p# = 1 to pkgGrp# + PackageApproverGroup = GROUP_NAME.p# + thisSequence = SEQUENCE.PackageApproverGroup + entry = Right(thisSequence,4,'0') || '.' ||, + PackageApproverGroup + unsorted_list = unsorted_list entry + If TraceRQ = 'Y' then, + Say "unsorted_list=" unsorted_list + End; + + Call SortApproverGroupList; + + If TraceRQ = 'Y' then say "@220 PackageApproverGroups =", + sorted_list, + ' ThisEnvironment =' ThisEnvironment + /* Go through the Sorted list to identify the status */ + /* of the next group(s) to be approved */ + /* Find the 1st Approver group this user belongs to.... */ + thisApprover = USERID() + + lastSequence = NotOrdered + Do seq# = 1 to Words(sorted_list) + entry = Word(sorted_list,seq#) + Parse Var entry thisSequence '.' orderedApproverGroup + orderedGroupStatus = STATUS.orderedApproverGroup + If orderedGroupStatus = 'APPROVED' then Iterate; + orderedGroupQuorum = QUORUM.orderedApproverGroup + If orderedGroupQuorum = 0 then Iterate; + If thisSequence > lastSequence then, + Do + Sa= 'We need to wait' + Leave; + End; + lastSequence = thisSequence + ListApprovers = USRLST.orderedApproverGroup + whereApprover = Wordpos(thisApprover,ListApprovers) + thisApproversFlag = " " + If whereApprover > 0 then, + Do + thisApproverGroup = orderedApproverGroup + thisApproversFlag = Word(APPROVAL_FLAGS.grp#,whereApprover) + End + + If TraceRQ = 'Y' then, + Say orderedApproverGroup 'has status of' orderedGroupStatus, + " Quorum" orderedGroupQuorum + + IF whereApprover > 0 &, + orderedGroupStatus /= 'NotRelated' then, + sa= 'You must wait for the' orderedApproverGroup, + " group's approval" + + If Words(ListApprovers) > 0 then, + Do w# = 1 to Words(ListApprovers) + Approver = Word(ListApprovers,w#) + If Wordpos(Approver,MYSMTP_EMAIL_IDS) = 0 &, + Substr(Approver,1,1) > '00'X then, + MYSMTP_EMAIL_IDS = MYSMTP_EMAIL_IDS Approver + End; /* Do w# = 1 to Words(ListApprovers) */ + + End; /* Do seq# = 1 to Words(sorted_list) */ + + /* Prepare email to the usrids in MYSMTP_EMAIL_IDS */ + Call PrepareEmail + + Return; + +SortApproverGroupList: + + If TraceRQ = 'Y' then Trace ?R + whereami = 'SortApproverGroupList' + sa= words(unsorted_list) unsorted_list; + drop sorted_list; + sorted_list = ""; + do forever ; + if words(unsorted_list) = 0 then leave; + lowest_entry = 1; + do entry = 1 to words(unsorted_list) + if word(unsorted_list,entry) <, + word(unsorted_list,lowest_entry) then, + lowest_entry = entry; + end; /* do entry = 1 .... */ + sorted_list = sorted_list word(unsorted_list,lowest_entry); + sa= "sorted_list=" sorted_list ; + position = wordindex(unsorted_list,lowest_entry) ; + len = length(word(unsorted_list,lowest_entry)); + unsorted_list =, + overlay(copies(" ",len),unsorted_list,position) ; + sa= "unsorted_list=" unsorted_list ; + end; /* do forever */ + drop unsorted_list; + sa= words(sorted_list) sorted_list; + + Return; + +PrepareEmail: + + If TraceRQ = 'Y' then Trace ?R + whereami = 'PrepareEmail' +/* Here you can make last-moment adjustments to the email */ + shortlist = Substr(MYSMTP_EMAIL_IDS,1,100) + If Substr(MYSMTP_EMAIL_IDS,100,1) /= ' ' &, + Substr(MYSMTP_EMAIL_IDS,101,1) /= ' ' then, + Do + whereEnd = WordIndex(shortlist,Words(shortlist)) + shortlist = DELWORD(shortlist,whereEnd) + End + MySMTP_textline.4 = 'Sent to Group:' shortlist + +/* Code in the section below should not be changed */ +/* Code in the section below should not be changed */ +/* Code in the section below should not be changed */ + + MySMTP_Message = Left(MySMTP_Message,80) + hexAddress = D2X(Address_MYSMTP_MESSAGE) + storrep = STORAGE(hexAddress,,Message) + + MySMTP_From = Left(MySMTP_From,50) + hexAddress = D2X(Address_MYSMTP_FROM) + storrep = STORAGE(hexAddress,,MySMTP_From) + + MySMTP_Subject = Left(MySMTP_Subject,50) + hexAddress = D2X(Address_MySMTP_Subject) + storrep = STORAGE(hexAddress,,MySMTP_Subject) + +/* If TraceRQ = 'Y' then Trace ?r */ + MYSMTP_COUNTER = '' + numberLines = Right(MySMTP_textline.0,2,'0') + Do l# = 1 to Length(numberLines) + MYSMTP_COUNTER = MYSMTP_COUNTER ||, + 'F' || Substr(numberLines,l#,1) + End + If TraceRQ = 'Y' then say 'MYSMTP_COUNTER=' MYSMTP_COUNTER + + MYSMTP_TEXT = X2C(MYSMTP_COUNTER) + Do line# = 1 to numberLines + MYSMTP_TEXT = MYSMTP_TEXT || Left(MySMTP_textline.line#,133) + End; /* Do line# = 1 to MySMTP_textline.0 */ + + hexAddress = D2X(Address_MYSMTP_TEXT) + storrep = STORAGE(hexAddress,,MYSMTP_TEXT) + + MySMTP_URL = 'N' + hexAddress = D2X(Address_MYSMTP_URL) + storrep = STORAGE(hexAddress,,MySMTP_URL) + + /* Provide distribution list ( list of userids ) to Exit */ + MYSMTP_EMAIL_IDS =, + Space(Strip(Translate(MYSMTP_EMAIL_IDS,' ','00'x))) + MYSMTP_EMAIL_IDS = MYSMTP_EMAIL_IDS '0000'x + MYSMTP_EMAIL_IDS = Left(MYSMTP_EMAIL_IDS,MYSMTP_EMAIL_ID_SIZE) + hexAddress = D2X(Address_MYSMTP_EMAIL_IDS) + storrep = STORAGE(hexAddress,,MYSMTP_EMAIL_IDS) + + Return; + +SubmitBatchCAST: + + If TraceRQ = 'Y' then Trace ?R + whereami = 'SubmitBatchCAST' + + /* Variable settings for each site ---> */ + WhereIam = WHERE@M1() + interpret 'Call' WhereIam "'MySENULibrary'" + MySENULibrary = Result + interpret 'Call' WhereIam "'MySEN2Library'" + MySEN2Library = Result + + Unique_Name = GTUNIQUE() + /* Get job-related information from low address locations */ + MyAccountingCode = GETACCTC() + job_name = MVSVAR('SYMDEF',JOBNAME ) /*Returns JOBNAME */ + Jobname= BUMPJOB(job_name) + + /* Prepare and run a Table Tool to build CAST jcl....... */ + CALL BPXWDYN , + "ALLOC DD(TABLE) LRECL(80) BLKSIZE(27920) SPACE(1,1) ", + " RECFM(F,B) TRACKS ", + " NEW UNCATALOG REUSE "; + Queue "* Do" + Queue " * " + "EXECIO 2 DISKW TABLE (FINIS "; /* count queued */ + + CALL BPXWDYN "ALLOC DD(NOTHING) DUMMY" + + CALL BPXWDYN , + "ALLOC DD(OPTIONS) LRECL(80) BLKSIZE(27920) SPACE(1,1) ", + " RECFM(F,B) TRACKS ", + " NEW UNCATALOG REUSE "; + QUEUE "$nomessages ='Y'" + QUEUE "MyAccountingCode='"MyAccountingCode"'" + QUEUE "MySEN2Library ='"MySEN2Library"'" + QUEUE "MySENULibrary ='"MySENULibrary"'" + QUEUE "Unique_Name ='"Unique_Name"'" + QUEUE "PECB_PACKAGE_ID ='"PECB_PACKAGE_ID"'" + QUEUE "Jobname= '"Jobname"'" + QUEUE "TBLOUT = 'SUBMTJCL'" + "EXECIO 8 DISKW OPTIONS (FINIS "; /* count queued */ + + /* For CASTing a package in Batch */ + /* Build a JCL model, and name its location here.... */ + /* Name a work dataset to be created then deleted... */ + + CastPackageModel = MySEN2Library || '(CAST#JCL)' + "ALLOC F(MODEL) DA('"CastPackageModel"') SHR REUSE" + + /* Build the JCL for a Batch Cast */ + CastPackageJCL = USERID()".C1UEXTR7.SUBMIT."Unique_Name + "ALLOC F(SUBMTJCL) DA('"CastPackageJCL"') ", + "LRECL(80) BLKSIZE(16800) SPACE(5,5)", + "RECFM(F B) TRACKS ", + "NEW CATALOG REUSE " ; + + myRC = ENBPIU00("A") + "EXECIO 0 DISKW SUBMTJCL (Finis" + + "FREE DD(TABLE) " + "FREE DD(NOTHING) " + "FREE DD(OPTIONS) " + "FREE DD(MODEL) " + + Call Submit_n_save_jobInfo ; + + "FREE F(SUBMTJCL) DELETE " + Message = JobData + MyRc = 8 + PACKAGE = PECB_PACKAGE_ID + MessageCode = 'U033' + Call SetExitReturnInfo + + Return; + +Submit_n_save_jobInfo: /* submit CastPackageModel job and save job info */ + + If TraceRQ = 'Y' then Trace ?R + whereami = 'Submit_n_save_jobInfo' + If TraceRQ = 'Y' then Say 'Submit_n_save_jobInfo:' + + Address TSO "PROFILE NOINTERCOM" /* turn off msg notific */ + CALL MSG "ON" + CALL OUTTRAP "out." + ADDRESS TSO "SUBMIT '"CastPackageJCL"'" ; + If RC > 4 then, + Do + MyRC = 8 + Message = 'Cannot find Element member to submit.' + Call SetExitReturnInfo + Exit(12) + End + CALL OUTTRAP "OFF" + Address TSO "PROFILE INTERCOM" /* turn on msg notific */ + + JobData = Strip(out.1); + jobinfo = Word(JobData,2) ; + If jobinfo = 'JOB' then, + jobinfo = Word(JobData,3) ; + SelectJobName = Word(Translate(jobinfo,' ',')('),1) ; + SelectJobNumber = Word(Translate(jobinfo,' ',')('),2) ; + + Return; + +Allocate_Files_For_CSV_and_API: + + STRING = "ALLOC DD(C1MSGS1) DUMMY " + CALL BPXWDYN STRING; + STRING = "ALLOC DD(BSTERR) DA(*) " + CALL BPXWDYN STRING; + STRING = "ALLOC DD(BSTAPI) DA(*) " + CALL BPXWDYN STRING; + + STRING = "ALLOC DD(MSGFILE) LRECL(133) BLKSIZE(26600) ", + " DSORG(PS) ", + " SPACE(5,5) RECFM(F,B) TRACKS ", + " NEW UNCATALOG REUSE "; + CALL BPXWDYN STRING; + + Return; + +FREE_Files_For_CSV_and_API: + + CALL BPXWDYN STRING; + STRING = "FREE DD(C1MSGS1)" ; + CALL BPXWDYN STRING; + STRING = "FREE DD(BSTERR)" ; + CALL BPXWDYN STRING; + STRING = "FREE DD(BSTAPI)" ; + CALL BPXWDYN STRING; + STRING = "FREE DD(MSGFILE)"; + CALL BPXWDYN STRING; + + Return; + +CSV_to_List_Package_Actions: + + /* Get Package Action information for SonarQube preparations */ + + STRING = "ALLOC DD(EXTRACTM) LRECL(4000) BLKSIZE(32000) ", + " DSORG(PS) ", + " SPACE(1,5) RECFM(F,B) TRACKS ", + " NEW UNCATALOG REUSE "; + CALL BPXWDYN STRING; + + STRING = "ALLOC DD(BSTIPT01) LRECL(80) BLKSIZE(800) ", + " DSORG(PS) ", + " SPACE(1,5) RECFM(F,B) TRACKS ", + " NEW UNCATALOG REUSE "; + CALL BPXWDYN STRING; + + QUEUE "LIST PACKAGE ACTION FROM PACKAGE '"PECB_PACKAGE_ID"'" + QUEUE " TO DDNAME 'EXTRACTM' " + QUEUE " ." + + "EXECIO" QUEUED() "DISKW BSTIPT01 (FINIS "; + + ADDRESS LINK 'BC1PCSV0' ; /* load from authlib */ + + call_rc = rc ; + + "EXECIO * DISKR EXTRACTM (STEM CSV. finis" + + STRING = "FREE DD(EXTRACTM)" ; + CALL BPXWDYN STRING; + STRING = "FREE DD(BSTIPT01)" ; + /* To Search the package action data in CSV format. */ + /* Identify matches with Rules file, determining Ship Dests */ + + IF CSV.0 < 2 THEN RETURN; + + /* CSV data heading - showing CSV variables */ + $table_variables= Strip(CSV.1,'T') + + $table_variables = translate($table_variables,"_"," ") ; + $table_variables = translate($table_variables," ",',"') ; + $table_variables = translate($table_variables,"@","/") ; + $table_variables = translate($table_variables,"@",")") ; + $table_variables = translate($table_variables,"@","(") ; + + WantedCSVVariables= , + "ELM_@S@ ENV_NAME_@S@ STG_ID_@S@ ", + "SYS_NAME_@S@ SBS_NAME_@S@ TYPE_NAME_@S@ " + + Do rec# = 2 to CSV.0 + $detail = CSV.rec# + Drop SBS_NAME_@T@ + + Trace Off + /* Parse CSV fields in the Detail record until done */ + Do $column = 1 to Words($table_variables) + Call ParseDetailCSVline + End + + If TraceRc = 1 then Trace r + IF Substr(ENV_NAME_@S@,1,1) = '00'x |, + Substr(ENV_NAME_@S@,1,1) = ' ' then Iterate; + + elm# = Elements.0 + 1 + Elements.elm# = ELM_@S@ ENV_NAME_@S@ STG_ID_@S@, + SYS_NAME_@S@ SBS_NAME_@S@ TYPE_NAME_@S@ + Elements.0 = elm# + Sa= 'Messages from C1UEXTR7:' Elements.elm# + Trace Off + End; /* Do rec# = 1 to CSV.0 */ + + RETURN ; + +ParseDetailCSVline: + + /* Find the data for the current $column */ + + $dlmchar = Substr($detail,1,1); + + If $dlmchar = "'" then, + Do + SA= 'parsing with single quote ' + PARSE VAR $detail "'" $temp_value "'" $detail ; + If Substr($detail,1,1) = ',' then, + $detail = Strip(Substr($detail,2),'L') + End + Else, + If $dlmchar = '"' then, + Do + SA= 'parsing with double quote ' + PARSE VAR $detail '"' $temp_value '"' $detail ; + If Substr($detail,1,1) = ',' then, + $detail = Strip(Substr($detail,2),'L') + End + Else, + If $dlmchar = ',' then, + Do + SA= 'parsing with comma ' + PARSE VAR $detail ',' $temp_value ',' $detail ; + If Substr($detail,1,1)/= ',' then, + $detail = "," || $detail + $detail = Strip(Substr($detail,2),'L') */ + End + Else, + If Words($detail) = 0 then, + $temp_value = ' ' + Else, + Do + SA= 'parsing with comma ' + PARSE VAR $detail $temp_value ',' $detail ; + Sa= '$temp_value=>' $temp_value '<' + End + $temp_value = STRIP($temp_value) ; + $rslt = $temp_value + $rslt = Strip($rslt,'B','"') ; + $rslt = Strip($rslt,'B',"'") ; + if Length($rslt) < 1 then $rslt = ' ' + thisVariable = WORD($table_variables,$column) + If Wordpos(thisVariable,WantedCSVVariables) = 0 then Return + if Length($rslt) < 250 then, + $temp = WORD($table_variables,$column) '= "'$rslt'"'; + Else, + $temp = WORD($table_variables,$column) "=$rslt" + INTERPRET $temp; + If rec# < 3 then Say $temp + + RETURN ; + +ProcessPackageSCL: + + /* Do an EXPORT to Capture the Package SCL */ + SonarWorkfile = SonarDSNPrefix || '.SONARWRK' + SonarCOBOL = SonarDSNPrefix || '.SONARCOB' + + STRING = "ALLOC DD(WRKFILE) LRECL(080) BLKSIZE(24000) ", + " DA("SonarWorkfile") ", + " DSORG(PO) DSNTYPE(LIBRARY) DIR(9) ", + " SPACE(5,5) RECFM(F,B) CYL ", + " NEW CATALOG REUSE "; + CALL BPXWDYN STRING; + CALL BPXWDYN "FREE DD(WRKFILE)" + + STRING = "ALLOC DD(COBOL) LRECL(080) BLKSIZE(24000) ", + " DA("SonarCOBOL") ", + " DSORG(PO) DSNTYPE(LIBRARY) DIR(9) ", + " SPACE(5,5) RECFM(F,B) CYL ", + " NEW CATALOG REUSE "; + CALL BPXWDYN STRING; + CALL BPXWDYN "FREE DD(COBOL) " + + STRING = "ALLOC DD(SCL) DA("SonarWorkfile"(SCL)) SHR REUSE" + CALL BPXWDYN STRING; + + STRING="ALLOC DD(ENPSCLIN) DA("SonarWorkfile"(SCLEXPRT)) SHR REUSE" + CALL BPXWDYN STRING; + QUEUE "EXPORT PACKAGE '"PECB_PACKAGE_ID"'" + QUEUE " TO DDN 'SCL' ." + "EXECIO 2 DISKW ENPSCLIN (FINIS "; /* count queued */ + + ADDRESS LINK 'ENBP1000' ; /* run from CSIQAUTH*/ + call_rc = rc ; + + CALL BPXWDYN "FREE DD(ENPSCLIN)" ; + + STRING = "ALLOC DD(RESULTS) DA("SonarWorkfile"(PKGTBL)) SHR REUSE" + CALL BPXWDYN STRING; + + /* Use SCAN#SCL to create a TABLE from the SCL content */ + Call SCAN#SCL 'TABLE' + + CALL BPXWDYN "FREE DD(SCL)" ; + + /* Use TableTool to create multiple outputs */ + STRING = "ALLOC DD(TABLE) DA("SonarWorkfile"(PKGTBL)) SHR REUSE" + CALL BPXWDYN STRING; + + STRING="ALLOC DD(PARMLIST) DA("SonarWorkfile"(PARMLIST)) SHR REUSE" + CALL BPXWDYN STRING; + QUEUE " HEADING1 TBLOUT1 INITS2 1 " + QUEUE " HEADING3 TBLOUT3 NOTHING 1 " + QUEUE " MODEL1 TBLOUT1 OPTIONS# A " + QUEUE " TRAILER2 TBLOUT2 OPTIONS2 1 " + "EXECIO 4 DISKW PARMLIST (FINIS "; /* count queued */ + + STRING="ALLOC DD(INITS2) DA("SonarWorkfile"(INITS2)) SHR REUSE" + CALL BPXWDYN STRING; + QUEUE " COBOL_Element_Types = '"COBOL_Element_Types"'" + QUEUE " COBOL_Compile_StepNames = '"COBOL_Compile_StepNames"'" + QUEUE " SonarCOBOL = '"SonarCOBOL"'" + QUEUE " SonarWorkfile = '"SonarWorkfile"'" + QUEUE " $MultiplePDSmemberOuts = 'Y' /* mult PDS mbr outputs */ " + QUEUE "$nomessages ='Y'" + "EXECIO 6 DISKW INITS2 (FINIS "; /* count queued */ + + CALL BPXWDYN "ALLOC DD(NOTHING) DUMMY" + + STRING="ALLOC DD(HEADING1) DA("SonarWorkfile"(HEADING1)) SHR REUSE" + CALL BPXWDYN STRING; + QUEUE " SET TO DSN '"SonarCOBOL"'." + QUEUE " SET OPTIONS REPLACE NO SIGNOUT. " + "EXECIO 2 DISKW HEADING1 (FINIS "; + + STRING="ALLOC DD(MODEL1) DA("SonarWorkfile"(MODEL1)) SHR REUSE" + CALL BPXWDYN STRING; + QUEUE " RETRIEVE ELEMENT &Element " + QUEUE " FROM ENVIRONMENT &Envmnt STAGE &S " + QUEUE " SYSTEM &System SUBSYSTEM &Subsys TYPE &Type . " + "EXECIO 3 DISKW MODEL1 (FINIS "; + + STRING="ALLOC DD(OPTIONS#) DA("SonarWorkfile"(OPTIONS#)) SHR REUSE" + CALL BPXWDYN STRING; + Queue "$NumberModelsAndTblouts= 3 " + Queue "HaveCobol = 0 " + Queue "Do w# = 1 to Words(COBOL_Element_Types) ; + " + Queue " HaveCobol=QMATCH(Type Word(COBOL_Element_Types,w#)); +" + Queue " If HaveCobol = 1 then Do; $my_rc = 1; Leave; End; + " + Queue "End; " + Queue "If HaveCobol = 0 then $SkipRow='Y' " + Queue "AEELM= COPIES(' ',80); " + Queue "AEELM= Overlay('AEELMBC ',AEELM,1) ; " + Queue "AEELM= Overlay(Envmnt,AEELM,10) ; /* Env */ " + Queue "AEELM= Overlay(S,AEELM,18) ; /* stg id */ " + Queue "AEELM= Overlay(System,AEELM,19) ; /* Sys */ " + Queue "AEELM= Overlay(Subsys,AEELM,27) ; /* Sub */ " + Queue "AEELM= Overlay(Element,AEELM,35) ; /* Ele */ " + Queue "AEELM= Overlay(Type,AEELM,45); /* Typ */ " + Queue "* " + Queue "Element = Left(Element,08) " + "EXECIO 17 DISKW OPTIONS# (FINIS "; /* count queued */ + + STRING="ALLOC DD(OPTIONS2) DA("SonarWorkfile"(OPTIONS2)) SHR REUSE" + CALL BPXWDYN STRING; + Queue "$NumberModelsAndTblouts= 1 ; /* Number of MODEL inputs */" + "EXECIO 1 DISKW OPTIONS2 (FINIS "; /* count queued */ + + STRING="ALLOC DD(MODEL2) DA("SonarWorkfile"(MODEL2)) SHR REUSE" + CALL BPXWDYN STRING; + Queue "AACTL MSGFILE COMPLIST " + Queue "&AEELM " + Queue "RUN " + "EXECIO 3 DISKW MODEL2 (FINIS "; + + STRING="ALLOC DD(HEADING3) DA("SonarWorkfile"(HEADING3)) SHR REUSE" + CALL BPXWDYN STRING; + Queue "* Folder-- Member-- ", + "Dataset------------------------------------- " + "EXECIO 1 DISKW HEADING3 (FINIS "; + + STRING="ALLOC DD(MODEL3) DA("SonarWorkfile"(MODEL3)) SHR REUSE" + CALL BPXWDYN STRING; + Queue " COBOL &Element &SonarCOBOL " + "EXECIO 1 DISKW MODEL3 (FINIS "; + + STRING="ALLOC DD(TRAILER2) DA("SonarWorkfile"(TRAILER2)) SHR REUSE" + CALL BPXWDYN STRING; + Queue "AACTLY " + Queue "RUN " + Queue "QUIT " + "EXECIO 3 DISKW TRAILER2 (FINIS "; + + STRING="ALLOC DD(TBLOUT1) DA("SonarWorkfile"(RETRIEVE)) SHR REUSE" + CALL BPXWDYN STRING; + STRING="ALLOC DD(TBLOUT2) DA("SonarWorkfile"(AEELMBC)) SHR REUSE" + CALL BPXWDYN STRING; + STRING="ALLOC DD(TBLOUT3) DA("SonarWorkfile"(TRANSMIT)) SHR REUSE" + CALL BPXWDYN STRING; + + If TraceRQ = 'Y' then Trace R + myRC = ENBPIU00("PARMLIST") + If myRC = 1 then COBOLinPackage = 'Y' + + CALL BPXWDYN "FREE DD(SCL) " ; + CALL BPXWDYN "FREE DD(ENPSCLIN)" ; + CALL BPXWDYN "FREE DD(RESULTS) " ; + + CALL BPXWDYN "FREE DD(TABLE) " ; + CALL BPXWDYN "FREE DD(PARMLIST)" ; + CALL BPXWDYN "FREE DD(INITS2) " ; + CALL BPXWDYN "FREE DD(NOTHING) " ; + CALL BPXWDYN "FREE DD(HEADING1)" ; + CALL BPXWDYN "FREE DD(MODEL1) " ; + CALL BPXWDYN "FREE DD(OPTIONS#)" ; + CALL BPXWDYN "FREE DD(OPTIONS2)" ; + CALL BPXWDYN "FREE DD(MODEL2) " ; + CALL BPXWDYN "FREE DD(HEADING3)" ; + CALL BPXWDYN "FREE DD(MODEL3) " ; + CALL BPXWDYN "FREE DD(TRAILER2)" ; + CALL BPXWDYN "FREE DD(TBLOUT1) " ; + CALL BPXWDYN "FREE DD(TBLOUT2) " ; + CALL BPXWDYN "FREE DD(TBLOUT3) " ; + + RETURN ; + +RETRIEVE_Cobol_Elements: + + STRING="ALLOC DD(BSTIPT01) DA("SonarWorkfile"(RETRIEVE)) SHR REUSE" + CALL BPXWDYN STRING; + + ADDRESS LINK 'C1BM3000' + + RETURN ; + +Use_ENTBJAPI_For_BX_Info: + + /* See your CSIQJCL(BC1JAAPI) */ + /* V - COLUMN 6 = FORMAT SETTING */ + /* = ' ' FOR NO FORMAT, JUST EXTRACT ELEMENT */ + /* = 'B' FOR ENDEVOR BROWSE DISPLAY FORMAT */ + /* = 'C' FOR ENDEVOR CHANGE DISPLAY FORMAT */ + /* = 'H' FOR ENDEVOR HISTORY DISPLAY FORMAT */ + /* V - COLUMN 7 = Replay TYPE SETTING */ + /* = 'E' FOR ELEMENT */ + /* = 'C' FOR COMPONENT */ + /* VVVVVVVV - COLUMN 10-17 ENVIRONMENT NAME */ + /* V - COLUMN 18 = STAGE ID */ + /* VVVVVVVV - COLUMN 19-26 SYSTEM NAME */ + /* VVVVVVVV - COLUMN 27-34 SUBSYSTEM NAME */ + /* COLUMN 35-44 = ELEMENT NAME VVVVVVVVVV */ + /* COLUMN 45-52 = TYPE NAME VVVVVVVV */ + /* */ + + Sa= 'Use_ENTBJAPI_For_BX_Info' + + STRING="ALLOC DD(SYSIN) DA("SonarWorkfile"(AEELMBC)) SHR REUSE" + CALL BPXWDYN STRING; + + + STRING = "ALLOC DD(COMPLIST) LRECL(200) BLKSIZE(20000) ", + " DSORG(PS) ", + " SPACE(5,15) RECFM(F,B) TRACKS ", + " MOD UNCATALOG REUSE "; + CALL BPXWDYN STRING; + + /* Call Built-in API program for COBOL source extracts */ + /* and COBOL component List requests. */ + ADDRESS LINK "ENTBJAPI" + + CALL BPXWDYN "FREE DD(SYSIN) " + + "EXECIO * DISKR COMPLIST (Stem cmplist. FINIS "; + CALL BPXWDYN "FREE DD(COMPLIST)" + + sa= cmplist.0 + If cmplist.0 = 0 then Return; + + Call ProcessCopybookMembers; + Call UpdateSonarTransmitTable; + Drop element. + + RETURN ; + +ProcessCopybookMembers: + + Do rec# = 1 to cmplist.0 + complist = Substr(cmplist.rec#,73) + If Substr(complist,1,22) = Copies('-',22) then, + thisSection = Word(complist,2) + If thisSection /= 'INPUT' then iterate; + If Word(complist,1) = 'STEP:' then, + Do + StepName = Word(complist,2) + DDname = Substr(Word(complist,3),4) + DatasetName = Substr(Word(complist,5),5) + Iterate + End + If Substr(Word(complist,5),3,1) = ':' &, + WordPos(StepName,COBOL_Compile_StepNames) > 0 &, + DDname = 'SYSLIB' then, + Do + member = Word(complist,2) + entry = "COPYBOOK,"member","DatasetName + If Wordpos(entry,TransmitTable) = 0 then, + TransmitTable = TransmitTable entry + End + End; /* Do rec# = 1 to cmplist.0 */ + + RETURN ; + +UpdateSonarTransmitTable: + + STRING =, + "ALLOC DD(SONARXMT) DA("SonarWorkfile"(TRANSMIT)) SHR REUSE" + CALL BPXWDYN STRING; + "Execio * DISKR SONARXMT (Stem xmit. Finis" + xm# = xmit.0 + + Do w# = 1 to Words(TransmitTable) + xm# = xm# + 1 + transtable = Word(TransmitTable,w#) + Parse var transtable folder ',' member ',' dataset + entry = " " left(folder,8) left(member,10) dataset + xmit.xm# = entry + End; /* Do w# = 1 to Words(TransmitTable) */ + + "Execio * DISKW SONARXMT (Stem xmit. Finis" + + transtable = "" + RETURN ; + +SubmitandWaitForSonarQube: + + /* Allocate files for a TableTool driven submission of the + SonarQube job, and a series of waits for parts of the job + to complete. */ + /* Variable settings for each site ---> */ + WhereIam = WHERE@M1() + + interpret 'Call' WhereIam "'MySENULibrary'" + MySENULibrary = Result + interpret 'Call' WhereIam "'MySEN2Library'" + MySEN2Library = Result + interpret 'Call' WhereIam "'MyCLS0Library'" + MyCLS0Library = Result + interpret 'Call' WhereIam "'MyCLS2Library'" + MyCLS2Library = Result + interpret 'Call' WhereIam "'MyHomeAddress'" + MyHomeAddress = Result + + STRING="ALLOC DD(SETUP) LRECL(080) BLKSIZE(24000) SPACE(1,1) ", + " RECFM(F,B) TRACKS ", + " NEW UNCATALOG REUSE "; + CALL BPXWDYN STRING; + s# = 0 + s# = s#+1 + set.s# = "Package ='"PECB_PACKAGE_ID"'" + s# = s#+1 + set.s# = "MyHomeAddress ='"MyHomeAddress"'" + s# = s#+1 + set.s# = "MySENULibrary ='"MySENULibrary"'" + s# = s#+1 + set.s# = "MySEN2Library ='"MySEN2Library"'" + s# = s#+1 + set.s# = "MyCLS0Library ='"MyCLS0Library"'" + s# = s#+1 + set.s# = "MyCLS2Library ='"MyCLS2Library"'" + s# = s#+1 + set.s# = "SonarWorkfile ='"SonarWorkfile"'" + s# = s#+1 + set.s# = "Unique_Name ='"Unique_Name"'" + s# = s#+1 + ReportingPFX = USERID() || '.SONRQUBE.'Unique_Name'.RESULTS' + set.s# = "ReportingPFX = '"ReportingPFX"'" + s# = s#+1 + set.s# = "$nomessages = 'Y'" + myJob = MVSVAR('SYMDEF','JOBNAME' ) + s# = s#+1 + set.s# = "myJob = '"myJob"'" + Jobname = BUMPJOB(myJob) + s# = s#+1 + set.s# = "Jobname = '"Jobname"'" + s# = s#+1 + set.s# = "TransmitMethod = '"TransmitMethod"'" + s# = s#+1 + set.s# = "TransmitCOND ="0 + "Execio * DISKW SYSTSPRT (Stem set. Finis" + "Execio * DISKW SETUP (Stem set. Finis" + + STRING="ALLOC DD(PARMLIST) DA("MySEN2Library"(SONARPRM)) SHR REUSE" + CALL BPXWDYN STRING; + + STRING="ALLOC DD(MDL#JOB) ", + "DA("MySEN2Library"("TransmitMethod"#JOB) SHR REUSE" + CALL BPXWDYN STRING; + STRING="ALLOC DD(MDL#RCV) ", + "DA("MySEN2Library"("TransmitMethod"#RCV) SHR REUSE" + CALL BPXWDYN STRING; + STRING="ALLOC DD(MDL#RUN) ", + "DA("MySEN2Library"("TransmitMethod"#RUN) SHR REUSE" + CALL BPXWDYN STRING; + + STRING="ALLOC DD(JCL#JOB) ", + "DA("SonarWorkfile"("TransmitMethod"#JOB) SHR REUSE" + CALL BPXWDYN STRING; + STRING="ALLOC DD(JCL#RCV) ", + "DA("SonarWorkfile"("TransmitMethod"#RCV) SHR REUSE" + CALL BPXWDYN STRING; + STRING="ALLOC DD(JCL#RUN) ", + "DA("SonarWorkfile"("TransmitMethod"#RUN) SHR REUSE" + CALL BPXWDYN STRING; + + STRING="ALLOC DD(WAIT#1) DA("MySEN2Library"(SONARW#1)) SHR REUSE" + CALL BPXWDYN STRING; + STRING="ALLOC DD(WAIT#2) DA("MySEN2Library"(SONARW#2)) SHR REUSE" + CALL BPXWDYN STRING; + STRING="ALLOC DD(WAIT#3) DA("MySEN2Library"(SONARW#3)) SHR REUSE" + CALL BPXWDYN STRING; + STRING="ALLOC DD(MODEL) DA("MySEN2Library"(SONARMDL)) SHR REUSE" + CALL BPXWDYN STRING; + STRING="ALLOC DD(TABLE) DA("MySEN2Library"(SONARTBL)) SHR REUSE" + CALL BPXWDYN STRING; + STRING="ALLOC DD(NOTHING) DUMMY" + CALL BPXWDYN STRING; + STRING="ALLOC DD(SYSTSPRT) SYSOUT(A) " + CALL BPXWDYN STRING; + STRING="ALLOC DD(REPORT) SYSOUT(A) " + CALL BPXWDYN STRING; + STRING = "ALLOC DD(TBLOUT) SYSOUT(A) WRITER(INTRDR) REUSE " ; + CALL BPXWDYN STRING; + + myRC = ENBPIU00("PARMLIST") + + CALL BPXWDYN "FREE DD(TBLOUT) " + CALL BPXWDYN "FREE DD(REPORT) " + CALL BPXWDYN "FREE DD(PARMLIST)" + CALL BPXWDYN "FREE DD(SETUP) " + CALL BPXWDYN "FREE DD(WAIT#1) " + CALL BPXWDYN "FREE DD(WAIT#2) " + CALL BPXWDYN "FREE DD(WAIT#3) " + CALL BPXWDYN "FREE DD(MODEL) " + CALL BPXWDYN "FREE DD(TABLE) " + CALL BPXWDYN "FREE DD(NOTHING) " + CALL BPXWDYN "FREE DD(SYSTSPRT)" + + If myRC = 11 then, + message = 'C1UEXTR7 - could not submit the SonarQube job' + If myRC = 12 then, + message = 'C1UEXTR7 - File transmissions failed ' + If myRC = 13 then, + message = 'C1UEXTR7 - could not initiate SonarQube', + ' analysis' + + If myRC < 8 then, + Do + STRING="ALLOC DD(RESULTS)", + " DA("SonarWorkfile".RESULTS) SHR REUSE" + CALL BPXWDYN STRING; + "Execio * DISKR RESULTS (Stem rslt. Finis" + CALL BPXWDYN "FREE DD(RESULTS)" + lastline# = rslt.0 + lastline = rslt.lastline# + If Pos('Status: SUCCESS ',lastline) = 0 then myRc= 8 + End /* If myRC < 8 */ + + RETURN ; + +SetExitReturnInfo: + + If TraceRQ = 'Y' then Trace ?R + whereami = 'SetExitReturnInfo' + If TraceRQ = 'Y' then Say 'SetExitReturnInfo: ' + + hexAddress = D2X(Address_PECB_MESSAGE) + storrep = STORAGE(hexAddress,,Message) + hexAddress = D2X(Address_PECB_ERROR_MESS_LENGTH) + storrep = STORAGE(hexAddress,,'0084'X) + hexAddress = D2X(Address_PECB_MODS_MADE_TO_PREQ) + storrep = STORAGE(hexAddress,,'Y') + + If MessageCode /= ' ' then, + Do + hexAddress = D2X(Address_PECB_MESSAGE_ID) + storrep = STORAGE(hexAddress,,MessageCode) + End + +/* Set the return code for the exit */ +/* for PECB-NDVR-EXIT-RC */ + hexAddress = D2X(Address_PECB_NDVR_EXIT_RC) + If MyRc = 4 then, + storrep = STORAGE(hexAddress,,'00000004'X) + Else, + storrep = STORAGE(hexAddress,,'00000008'X) + + RETURN ; + diff --git a/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/C1UEXTT7.cob b/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/C1UEXTT7.cob new file mode 100644 index 0000000..15c39c8 --- /dev/null +++ b/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/C1UEXTT7.cob @@ -0,0 +1,727 @@ + PROCESS DYNAM OUTDD(DISPLAYS) + IDENTIFICATION DIVISION. + PROGRAM-ID. C1UEXT07. + ***************************************************************** + * DESCRIPTION: THIS PGM IS CALLED for misc Package actions. + * It gathers Endevor info from the exit blocks * + * then calls REXX program C1UEXTR7. * + * Together they can force CAST actions to be in Batch. * + ***************************************************************** + ENVIRONMENT DIVISION. + INPUT-OUTPUT SECTION. + FILE-CONTROL. + ** + DATA DIVISION. + FILE SECTION. + + WORKING-STORAGE SECTION. + + COPY NOTIFYDS. + + 01 WS-VGET PIC X(8) VALUE 'VGET '. + 01 WS-PROFILE PIC X(8) VALUE 'PROFILE '. + 01 WS-ISPLINK PIC X(8) VALUE 'ISPLINK ' . + + 01 WS-C1BJC1-JOBCARD PIC X(80) . + 01 WS-C1BJC1 PIC X(08) VALUE '(C1BJC1)'. + + 01 WS-C1PJC1-JOBCARD PIC X(80) . + 01 WS-C1PJC1 PIC X(08) VALUE '(C1PJC1)'. + + 01 WS-CALLING-REASON PIC X(24). + + 01 WS-VARIABLES. + 03 WS-POINTER PIC 9(09) COMP. + 03 WS-WORK-ADDRESS-ADR PIC 9(09) COMP SYNC . + 03 WS-WORK-ADDRESS-PTR REDEFINES WS-WORK-ADDRESS-ADR + USAGE IS POINTER . + + 03 WS-PECB-REQUEST-RETURNCODE PIC 9999 . + 03 WS-PECB-NDVR-HIGH-RC PIC 9999 . + + 03 WS-DISPLAY-NUMBER-FOR4 PIC 9(04) . + 03 WS-DISPLAY-NUMBER-FOR9 PIC 9(09) . + 00490200 + 01 PGM PIC X(8). + 01 MYSMTP-MESSAGE PIC X(80). + 01 MYSMTP-USERID PIC X(8). + 01 MYSMTP-FROM PIC X(50). + 01 MYSMTP-SUBJECT PIC X(50). + 01 MYSMTP-TEXT. + 03 MYSMTP-COUNTER PIC 9(2). + 03 MYSMTP-MSG-TEXT. + 05 MYSMTP-LINE PIC X(133) OCCURS 99. + 01 MYSMTP-URL PIC X(1). + 01 MYSMTP-EMAIL-IDS. + 03 FILLER PIC X(09) + OCCURS 320 . + 03 FILLER PIC X(8). + 01 MYSMTP-EMAIL-ID-SIZE PIC 9(8). + + 01 WS-ADDRESSES. + 03 ADDRESS-MYSMTP-MESSAGE PIC 9(09) . + 03 ADDRESS-MYSMTP-USERID PIC 9(09) . + 03 ADDRESS-MYSMTP-FROM PIC 9(09) . + 03 ADDRESS-MYSMTP-SUBJECT PIC 9(09) . + 03 ADDRESS-MYSMTP-TEXT PIC 9(09) . + 03 ADDRESS-MYSMTP-URL PIC 9(09) . + 03 ADDRESS-MYSMTP-EMAIL-IDS PIC 9(09) . + 00510000 + 03 ADDRESS-PECB-NDVR-EXIT-RC PIC 9(09) . + 03 ADDRESS-PECB-MESSAGE-ID PIC 9(09) . + 03 ADDRESS-PECB-MESSAGE PIC 9(09) . + 03 ADDRESS-PECB-ERROR-MESS-LENGTH PIC 9(09) . + 03 ADDRESS-PECB-MODS-MADE-TO-PREQ PIC 9(09) . + 03 ADDRESS-PREQ-SHARE-ENABLED PIC 9(09) . + 03 ADDRESS-PREQ-BACKOUT-ENABLED PIC 9(09) . + + 01 BPXWDYN PIC X(8) VALUE 'BPXWDYN'. + 01 ALLOC-STRING. + 05 ALLOC-LENGTH PIC S9(4) BINARY VALUE 100. + 05 ALLOC-TEXT PIC X(100). + + 01 IRXJCL PIC X(6) VALUE 'IRXJCL'. + 01 IRXEXEC-PGM PIC X(08) VALUE 'IRXEXEC'. + + * + * DEFINE THE IRXEXEC DATA AREAS AND ARG BLOCKS + * + 77 WS-INX PIC 9(08) COMP . + 77 FLAGS PIC S9(8) BINARY. + 77 REXX-RETURN-CODE PIC S9(8) BINARY. + 77 DUMMY-ZERO PIC S9(8) BINARY. + 77 LPAR-ID PIC X(04). + 88 DO-NOT-PROCESS-LPAR VALUE 'SKIP'. + 77 ARG1 PIC X(16). + 77 UPDPRINT-FILE-STATUS PIC X(02). + 77 ARGUMENT-PTR POINTER. + 77 EXECBLK-PTR POINTER. + 77 ARGTABLE-PTR POINTER. + 77 EVALBLK-PTR POINTER. + 77 TEMP-PTR POINTER. + + 01 EXECBLK. + 05 EXECBLK-ACRYN PIC X(08) VALUE 'IRXEXECB'. + 05 EXECBLK-LENGTH PIC S9(8) BINARY + VALUE 48. + 05 EXECBLK-RESERVED PIC S9(8) BINARY + VALUE 0. + 05 EXECBLK-MEMBER PIC X(08) VALUE 'C1UEXTR7'. + 05 EXECBLK-DDNAME PIC X(08) VALUE 'REXFILE7'. + 05 EXECBLK-SUBCOM PIC X(08) VALUE SPACES. + 05 EXECBLK-DSNPTR POINTER VALUE NULL. + 05 EXECBLK-DSNLEN PIC 9(04) COMP + VALUE 0. + + 01 EVALBLK. + 05 EVALBLK-EVPAD1 PIC S9(8) BINARY + VALUE 0. + 05 EVALBLK-EVSIZE PIC S9(8) BINARY + VALUE 34. + 05 EVALBLK-EVLEN PIC S9(8) BINARY + VALUE 0. + 05 EVALBLK-EVPAD2 PIC S9(8) BINARY + VALUE 0. + 05 EVALBLK-EVDATA PIC X(256). + + 01 ARGUMENT. + 02 ARGUMENT-1 OCCURS 1 TIMES. + 05 ARGSTRING-PTR POINTER. + 05 ARGSTRING-LENGTH PIC S9(8) BINARY. + 02 ARGSTRING-LAST1 PIC S9(8) BINARY + VALUE -1. + 02 ARGSTRING-LAST2 PIC S9(8) BINARY + VALUE -1. + + * The block of data below can be used with either an + * IRXJCL or IRXEXEC call to the rexx program C1UEXTR7. + * IRXJCL is used when running in batch (batch CAST) . + * IRXEXEC is used when running in foreground (CAST or APPROVE). + 01 PKG-C1UEXTR7-PARMS-IRXJCL. + 02 PKG-C1UEXTR7-PARMS-IRXJCL-TOP. + 03 PARM-LENGTH PIC X(2) VALUE X'0BC1'. + 03 REXX-NAME PIC X(8) VALUE 'C1UEXTR7'. + 03 FILLER PIC X(1) VALUE SPACE . + 02 PKG-C1UEXTR7-PARMS-IRXEXEC. + 03 WS-REXX-STATEMENTS PIC X(3000). + + LINKAGE SECTION. + COPY PKGXBLKS. + + PROCEDURE DIVISION USING + PACKAGE-EXIT-BLOCK + PACKAGE-REQUEST-BLOCK + PACKAGE-EXIT-HEADER-BLOCK + PACKAGE-EXIT-FILE-BLOCK + PACKAGE-EXIT-ACTION-BLOCK + PACKAGE-EXIT-APPROVER-MAP + PACKAGE-EXIT-BACKOUT-BLOCK + PACKAGE-EXIT-SHIPMENT-BLOCK + PACKAGE-EXIT-SCL-BLOCK. + **** + IF PECB-USER-BATCH-JOBNAME(1:7) NOT = 'IBMUSER' AND + PECB-USER-BATCH-JOBNAME(1:7) NOT = 'PL05958' + GOBACK. + **** + +********* DISPLAY 'C1UEXT07: GOT INTO C1UEXTT7'. +********* MOVE PECB-FUNCTION-CODE TO WS-DISPLAY-NUMBER-FOR9. +********* DISPLAY 'PECB-FUNCTION-CODE=' WS-DISPLAY-NUMBER-FOR9. + + IF SETUP-EXIT-OPTIONS + MOVE ZERO TO PECB-UEXIT-HOLD-FIELD +********* to enforce package create rules + MOVE 'Y' TO PECB-BEFORE-CREATE-BLD + MOVE 'Y' TO PECB-BEFORE-CREATE-COPY + MOVE 'Y' TO PECB-BEFORE-CREATE-EDIT + MOVE 'Y' TO PECB-BEFORE-CREATE-IMPT + MOVE 'Y' TO PECB-BEFORE-REV-APPR +********* to enforce Approver Group Sequencing + MOVE 'Y' TO PECB-AFTER-REV-APPR +********* to enforce package backout = Y + MOVE 'Y' TO PECB-BEFORE-CAST +********* to enforce Approver Group Sequencing + MOVE 'Y' TO PECB-AFTER-CAST + MOVE 'Y' TO PECB-MID-CAST +********* MOVE 'Y' TO PECB-BEFORE-MOD-IMPT +********* MOVE 'Y' TO PECB-AFTER-RESET +********* MOVE 'Y' TO PECB-AFTER-DELETE + MOVE ZEROS TO RETURN-CODE + GOBACK. + + MOVE 0 TO PECB-NDVR-EXIT-RC. + MOVE SPACES TO WS-REXX-STATEMENTS . + +********* If just starting out, request Approver Group info + IF PECB-REQUEST-RETURNCODE = 0 AND PECB-AFTER AND + (CAST-PACKAGE OR REVIEW-PACKAGE) + PERFORM 1000-ALLOCATE-REXFILE + MOVE 'Y' TO PECB-REQ-APPROVER-REC + GOBACK + ELSE +********* If Before the CAST, just pass Package info to the REXX + IF (PECB-BEFORE OR PECB-MID) AND + (CREATE-PACKAGE OR CAST-PACKAGE) + IF CREATE-PACKAGE + MOVE 'Before CREATE' TO WS-CALLING-REASON + ELSE + MOVE 'Before CAST' TO WS-CALLING-REASON + END-IF + PERFORM 1000-ALLOCATE-REXFILE + PERFORM 0500-CALL-C1UEXTR7-REXX + PERFORM 2000-FREE-REXFILES + GOBACK + END-IF . + +********* If we just received an Appprover Group block, +********* pass it to the REXX and ask for more... + IF PECB-SUCCESSFUL-RECORD-SENT + MOVE PAPP-SEQUENCE-NUMBER TO WS-DISPLAY-NUMBER-FOR4 + MOVE SPACES TO WS-CALLING-REASON + STRING 'Approver Group #' + WS-DISPLAY-NUMBER-FOR4 + DELIMITED BY SIZE + INTO WS-CALLING-REASON + END-STRING + PERFORM 0500-CALL-C1UEXTR7-REXX + MOVE 'Y' TO PECB-REQ-APPROVER-REC + GOBACK + END-IF . + +********* Endevor says 'no more Appprover Group blocks' +********* tell REXX and let it decide on email + IF PECB-END-OF-FILE-FOR-REC-TYP OR + PECB-NO-RECORDS-FOUND + MOVE 'NO MORE Approver Grps ' TO WS-CALLING-REASON + PERFORM 0500-CALL-C1UEXTR7-REXX + IF MYSMTP-COUNTER NUMERIC AND + MYSMTP-COUNTER GREATER THAN '00' AND + MYSMTP-EMAIL-IDS(1:1) GREATER THAN SPACE + MOVE 'BC1PMLIF' TO PGM + PERFORM 0900-SEND-EMAILS + END-IF + PERFORM 2000-FREE-REXFILES + GOBACK + END-IF . + + + 0100-MAIN-EXIT. + GOBACK. + + 0500-CALL-C1UEXTR7-REXX. + + * Give addresses of updatable fields to the REXX. + * MAKES A CALL TO THE REXX ROUTINE C1UEXTR7. + + SET WS-WORK-ADDRESS-PTR TO + ADDRESS OF MYSMTP-MESSAGE . + MOVE WS-WORK-ADDRESS-ADR + TO ADDRESS-MYSMTP-MESSAGE. + + SET WS-WORK-ADDRESS-PTR TO + ADDRESS OF MYSMTP-USERID . + MOVE WS-WORK-ADDRESS-ADR + TO ADDRESS-MYSMTP-USERID . + + SET WS-WORK-ADDRESS-PTR TO + ADDRESS OF MYSMTP-FROM . + MOVE WS-WORK-ADDRESS-ADR + TO ADDRESS-MYSMTP-FROM . + + SET WS-WORK-ADDRESS-PTR TO + ADDRESS OF MYSMTP-SUBJECT . + MOVE WS-WORK-ADDRESS-ADR + TO ADDRESS-MYSMTP-SUBJECT. + + SET WS-WORK-ADDRESS-PTR TO + ADDRESS OF MYSMTP-TEXT . + MOVE WS-WORK-ADDRESS-ADR + TO ADDRESS-MYSMTP-TEXT . + + SET WS-WORK-ADDRESS-PTR TO + ADDRESS OF MYSMTP-URL . + MOVE WS-WORK-ADDRESS-ADR + TO ADDRESS-MYSMTP-URL . + + MOVE SPACES TO MYSMTP-EMAIL-IDS . + + SET WS-WORK-ADDRESS-PTR TO + ADDRESS OF MYSMTP-EMAIL-IDS . + MOVE WS-WORK-ADDRESS-ADR + TO ADDRESS-MYSMTP-EMAIL-IDS . + SET WS-WORK-ADDRESS-PTR TO + ADDRESS OF MYSMTP-EMAIL-ID-SIZE . + COMPUTE MYSMTP-EMAIL-ID-SIZE = + WS-WORK-ADDRESS-ADR - 4 - + ADDRESS-MYSMTP-EMAIL-IDS . + + + SET WS-WORK-ADDRESS-PTR TO + ADDRESS OF PECB-NDVR-EXIT-RC . + MOVE WS-WORK-ADDRESS-ADR + TO ADDRESS-PECB-NDVR-EXIT-RC. + + SET WS-WORK-ADDRESS-PTR TO + ADDRESS OF PECB-MESSAGE . + MOVE WS-WORK-ADDRESS-ADR + TO ADDRESS-PECB-MESSAGE . + + SET WS-WORK-ADDRESS-PTR TO + ADDRESS OF PECB-ERROR-MESS-LENGTH . + MOVE WS-WORK-ADDRESS-ADR + TO ADDRESS-PECB-ERROR-MESS-LENGTH. + + SET WS-WORK-ADDRESS-PTR TO + ADDRESS OF PECB-MODS-MADE-TO-PREQ . + MOVE WS-WORK-ADDRESS-ADR + TO ADDRESS-PECB-MODS-MADE-TO-PREQ. + + SET WS-WORK-ADDRESS-PTR TO + ADDRESS OF PECB-MESSAGE-ID. + MOVE WS-WORK-ADDRESS-ADR + TO ADDRESS-PECB-MESSAGE-ID . + + SET WS-WORK-ADDRESS-PTR TO + ADDRESS OF PREQ-SHARE-ENABLED. + MOVE WS-WORK-ADDRESS-ADR + TO ADDRESS-PREQ-SHARE-ENABLED . + + SET WS-WORK-ADDRESS-PTR TO + ADDRESS OF PREQ-BACKOUT-ENABLED. + MOVE WS-WORK-ADDRESS-ADR + TO ADDRESS-PREQ-BACKOUT-ENABLED . + + MOVE PECB-REQUEST-RETURNCODE TO + WS-PECB-REQUEST-RETURNCODE. + + MOVE PECB-NDVR-HIGH-RC TO + WS-PECB-NDVR-HIGH-RC . + + ***** + ***** / Convert COBOL exit block Datanames into Rexx \ + ***** + ***** + MOVE 1 TO WS-POINTER. + + STRING + 'PECB_PACKAGE_ID = "' PECB-PACKAGE-ID '";' + 'PECB_FUNCTION_LITERAL="' PECB-FUNCTION-LITERAL '";' + 'PECB_SUBFUNC_LITERAL="' PECB-SUBFUNC-LITERAL '";' + 'PECB_BEF_AFTER_LITERAL="' PECB-BEF-AFTER-LITERAL '";' + 'PECB_USER_BATCH_JOBNAME="' PECB-USER-BATCH-JOBNAME '";' + 'PREQ_PKG_CAST_COMPVAL="' PREQ-PKG-CAST-COMPVAL '";' + 'PHDR_PKG_SHR_OPTION ="' PHDR-PKG-SHR-OPTION '";' + 'PHDR_PKG_ENV ="' PHDR-PKG-ENV '";' + 'PHDR_PKG_STGID ="' PHDR-PKG-STGID '";' + 'PECB_MODE = "' PECB-MODE '";' + 'PECB_AUTOCAST ="' PECB-AUTOCAST '";' + 'PECB_ACT_REC_EXIST_FLAG="' PECB-ACT-REC-EXIST-FLAG '";' + 'PECB_APP_REC_EXIST_FLAG="' PECB-APP-REC-EXIST-FLAG '";' + 'PECB_BAC_REC_EXIST_FLAG="' PECB-BAC-REC-EXIST-FLAG '";' + 'PECB_REQUEST_RETURNCODE=' WS-PECB-REQUEST-RETURNCODE ';' + 'PECB_NDVR_HIGH_RC = ' WS-PECB-NDVR-HIGH-RC ';' + 'PREQ_BACKOUT_ENABLED="' PREQ-BACKOUT-ENABLED '";' + 'Address_PREQ_BACKOUT_ENABLED=' + ADDRESS-PREQ-BACKOUT-ENABLED ';' + 'PREQ_SHARE_ENABLED="' PREQ-SHARE-ENABLED '";' + 'Address_PREQ_SHARE_ENABLED=' + ADDRESS-PREQ-SHARE-ENABLED ';' + 'Address_PECB_MODS_MADE_TO_PREQ=' + ADDRESS-PECB-MODS-MADE-TO-PREQ ';' + 'Address_PECB_NDVR_EXIT_RC=' + ADDRESS-PECB-NDVR-EXIT-RC ';' + 'Address_PECB_MESSAGE_ID=' ADDRESS-PECB-MESSAGE-ID ';' + 'Address_PECB_ERROR_MESS_LENGTH = ' + ADDRESS-PECB-ERROR-MESS-LENGTH ';' + 'Address_PECB_MESSAGE = ' ADDRESS-PECB-MESSAGE ';' + 'Address_MYSMTP_MESSAGE=' ADDRESS-MYSMTP-MESSAGE ';' + 'Address_MYSMTP_USERID =' ADDRESS-MYSMTP-USERID ';' + 'Address_MYSMTP_FROM =' ADDRESS-MYSMTP-FROM ';' + 'Address_MYSMTP_SUBJECT=' ADDRESS-MYSMTP-SUBJECT ';' + 'Address_MYSMTP_TEXT =' ADDRESS-MYSMTP-TEXT ';' + 'Address_MYSMTP_URL =' ADDRESS-MYSMTP-URL ';' + 'Address_MYSMTP_EMAIL_IDS=' + ADDRESS-MYSMTP-EMAIL-IDS ';' + 'MYSMTP_EMAIL_ID_SIZE=' + MYSMTP-EMAIL-ID-SIZE ';' + DELIMITED BY SIZE + INTO WS-REXX-STATEMENTS + WITH POINTER WS-POINTER . + +********* For these text fields, make sure none use a double quote +********* character. This ensures the integrity of the REXX + IF REVIEW-PACKAGE OR + (CAST-PACKAGE AND PECB-AFTER) + MOVE PAPP-QUORUM-COUNT TO WS-DISPLAY-NUMBER-FOR4 + STRING + 'CALL_REASON="' WS-CALLING-REASON '";' + 'PAPP_GROUP_NAME ="' PAPP-GROUP-NAME '";' + 'PAPP_GROUP_NAME ="' PAPP-GROUP-NAME '";' + 'PAPP_ENVIRONMENT="' PAPP-ENVIRONMENT '";' + 'PAPP_QUORUM_COUNT="' WS-DISPLAY-NUMBER-FOR4 '";' + 'PAPP_APPROVER_FLAG="' PAPP-APPROVER-FLAG '";' + 'PAPP_APPR_GRP_TYPE="' PAPP-APPR-GRP-TYPE '";' + 'PAPP_APPR_GRP_DISQ="' PAPP-APPR-GRP-DISQ '";' + DELIMITED BY SIZE + 'PAPP_APPROVAL_IDS= "' + DELIMITED BY SIZE + INTO WS-REXX-STATEMENTS + WITH POINTER WS-POINTER + END-STRING + PERFORM VARYING WS-INX FROM 1 BY 1 UNTIL + WS-INX GREATER THAN PAPP-APPROVER-NUMBER + STRING PAPP-APPROVAL-ID(WS-INX) ' ' + DELIMITED BY SIZE + INTO WS-REXX-STATEMENTS + WITH POINTER WS-POINTER + END-STRING + END-PERFORM + STRING '";' + 'PAPP_APPROVAL_FLAGS= "' + DELIMITED BY SIZE + INTO WS-REXX-STATEMENTS + WITH POINTER WS-POINTER + END-STRING + + PERFORM VARYING WS-INX FROM 1 BY 1 UNTIL + WS-INX GREATER THAN PAPP-APPROVER-NUMBER + STRING PAPP-APPROVAL-FLAG(WS-INX) ' ' + DELIMITED BY SIZE + INTO WS-REXX-STATEMENTS + WITH POINTER WS-POINTER + END-STRING + END-PERFORM + STRING '";' + DELIMITED BY SIZE + INTO WS-REXX-STATEMENTS + WITH POINTER WS-POINTER + END-STRING + END-IF. + +******* Replace any double quote characters in data to be passed + IF CAST-PACKAGE + INSPECT PREQ-PACKAGE-COMMENT REPLACING ALL '"' BY X'7D' + INSPECT PHDR-PKG-NOTE1 REPLACING ALL '"' BY X'7D' + INSPECT PHDR-PKG-NOTE2 REPLACING ALL '"' BY X'7D' + INSPECT PHDR-PKG-NOTE3 REPLACING ALL '"' BY X'7D' + INSPECT PHDR-PKG-NOTE4 REPLACING ALL '"' BY X'7D' + INSPECT PHDR-PKG-NOTE5 REPLACING ALL '"' BY X'7D' + INSPECT PHDR-PKG-NOTE6 REPLACING ALL '"' BY X'7D' + INSPECT PHDR-PKG-NOTE7 REPLACING ALL '"' BY X'7D' + INSPECT PHDR-PKG-NOTE8 REPLACING ALL '"' BY X'7D' + STRING + 'CALL_REASON="' WS-CALLING-REASON '";' + 'PREQ_PACKAGE_COMMENT = "' PREQ-PACKAGE-COMMENT '";' + 'PHDR_PACKAGE_TYPE = "' PHDR-PACKAGE-TYPE '";' + 'PHDR_PACKAGE_STATUS = "' PHDR-PACKAGE-STATUS '";' + 'PHDR_PKG_BACKOUT_STATUS="' PHDR-PKG-BACKOUT-STATUS '";' + 'PHDR_PKG_CREATE_USER = "' PHDR-PKG-CREATE-USER '";' + 'PHDR_PKG_CAST_USER = "' PHDR-PKG-CAST-USER '";' + 'PHDR_PKG_NOTE1 = "' PHDR-PKG-NOTE1 '";' + 'PHDR_PKG_NOTE2 = "' PHDR-PKG-NOTE2 '";' + 'PHDR_PKG_NOTE3 = "' PHDR-PKG-NOTE3 '";' + 'PHDR_PKG_NOTE4 = "' PHDR-PKG-NOTE4 '";' + 'PHDR_PKG_NOTE5 = "' PHDR-PKG-NOTE5 '";' + 'PHDR_PKG_NOTE6 = "' PHDR-PKG-NOTE6 '";' + 'PHDR_PKG_NOTE7 = "' PHDR-PKG-NOTE7 '";' + 'PHDR_PKG_NOTE8 = "' PHDR-PKG-NOTE8 '";' + 'PHDR_PKG_CAST_COMPVAL = "' PHDR-PKG-CAST-COMPVAL '";' + DELIMITED BY SIZE + INTO WS-REXX-STATEMENTS + WITH POINTER WS-POINTER + END-STRING + END-IF. + + ***** \ Convert COBOL exit block Datanames into Rexx / + ***** + + MOVE 'C1UEXTR7' TO EXECBLK-MEMBER . + MOVE 3000 TO ARGSTRING-LENGTH(1) + + IF PECB-TSO-MODE + CALL 'SET-ARG1-POINTER' USING ARGUMENT-PTR + PKG-C1UEXTR7-PARMS-IRXEXEC + PERFORM 0800-REXX-CALL-VIA-IRXEXEC + MOVE 0 TO PECB-NDVR-HIGH-RC + ELSE +********* DISPLAY 'C1UEXT07: Running in Batch ' + CALL IRXJCL USING PKG-C1UEXTR7-PARMS-IRXJCL . + + IF RETURN-CODE NOT = 0 + DISPLAY 'C1UEXT07: BAD CALL TO IRXJCL - RC = ' + RETURN-CODE + END-IF + + MOVE 0 TO RETURN-CODE + . + 0800-REXX-CALL-VIA-IRXEXEC. + *--- GET THE ADDRESS OF THE ARGUMENT(S) TO BE PASSED TO IXREXEC + *--- AND LOAD INTO THE ARGUMENT TABLES +******* IF PECB-USER-BATCH-JOBNAME(1:7) = 'PL05958' +******* DISPLAY 'C1UEXT07: SETTING UP REXX EXECUTION' +******* ' FOR PACKAGE 'PECB-PACKAGE-ID +******* END-IF . + SET ARGSTRING-PTR (1) TO ARGUMENT-PTR . + CALL 'SET-ARGUMENT-POINTER' USING ARGTABLE-PTR + ARGUMENT . + CALL 'SET-EXECBLK-POINTER' USING EXECBLK-PTR + EXECBLK . + CALL 'SET-EVALBLK-POINTER' USING EVALBLK-PTR + EVALBLK . + *--- SET FLAGS TO HEX 20000000 + * I.E. EXEC INVOKED AS SUBROUTINE + MOVE 536870912 TO FLAGS + MOVE 0 TO REXX-RETURN-CODE . + +********* DISPLAY 'C1UEXT07: CALLING IRXEXC ' +********* PECB-PACKAGE-ID . + *--- CALL THE REXX EXEC --- + CALL IRXEXEC-PGM USING EXECBLK-PTR + ARGTABLE-PTR + FLAGS + DUMMY-ZERO + DUMMY-ZERO + EVALBLK-PTR + DUMMY-ZERO + DUMMY-ZERO + DUMMY-ZERO . + + IF REXX-RETURN-CODE NOT = 0 + DISPLAY 'C1UEXT07: IRXEXEC RETURN CODE = ' + REXX-RETURN-CODE + END-IF + + CANCEL IRXEXEC-PGM + . + + 0900-SEND-EMAILS. + +********** DISPLAY 'C1UEXTT7: MYSMTP-MESSAGE=' MYSMTP-MESSAGE . +********** DISPLAY 'C1UEXTT7: MYSMTP-FROM =' MYSMTP-FROM . +********** DISPLAY 'C1UEXTT7: MYSMTP-SUBJECT=' MYSMTP-SUBJECT . +********** DISPLAY 'C1UEXTT7: MYSMTP-TEXT ' MYSMTP-TEXT(1:80). + + MOVE 1 TO WS-POINTER. + + PERFORM UNTIL + MYSMTP-EMAIL-IDS(WS-POINTER:1) = LOW-VALUES OR + MYSMTP-EMAIL-IDS(WS-POINTER:8) + LESS THAN OR EQUAL SPACES OR + WS-POINTER GREATER THAN OR EQUAL + MYSMTP-EMAIL-ID-SIZE + MOVE SPACES TO MYSMTP-USERID + UNSTRING MYSMTP-EMAIL-IDS + DELIMITED BY SPACE + INTO MYSMTP-USERID + WITH POINTER WS-POINTER + END-UNSTRING + + IF MYSMTP-USERID NOT = SPACES +********** DISPLAY 'C1UEXTT7: Emailing ' MYSMTP-USERID +********** ' WS-POINTER=' WS-POINTER ' ' +********** MYSMTP-EMAIL-IDS(WS-POINTER:60) + CALL PGM USING MYSMTP-MESSAGE + MYSMTP-USERID + MYSMTP-FROM + MYSMTP-SUBJECT + MYSMTP-TEXT + MYSMTP-URL + END-IF + + IF RETURN-CODE > 0 + DISPLAY 'CALL BC1PMLIF RC = ' RETURN-CODE + DISPLAY MYSMTP-MESSAGE + END-IF +********** ADD 1 TO WS-POINTER + END-PERFORM. + + *----------------------------------------------------------------- + + 1000-ALLOCATE-REXFILE. + + MOVE SPACES TO ALLOC-TEXT. + + IF PECB-BATCH-MODE + STRING 'ALLOC DD(SYSEXEC) ', + 'DA(YOURSITE.NDVR.REXX)' + DELIMITED BY SIZE + ' SHR REUSE' + DELIMITED BY SIZE + INTO ALLOC-TEXT + END-STRING + ELSE + STRING 'ALLOC DD(REXFILE7) ', + 'DA(YOURSITE.NDVR.REXX)' + DELIMITED BY SIZE + ' SHR REUSE' + DELIMITED BY SIZE + INTO ALLOC-TEXT + END-STRING + END-IF. + + PERFORM 9000-DYNAMIC-ALLOC-DEALLOC . + +********** MOVE 'CONCAT DDLIST(REXFILE,REXFILE2)' +********** TO ALLOC-TEXT . +********** +********** PERFORM 9000-DYNAMIC-ALLOC-DEALLOC . + + ***************************************************************** + ** DYNAMICALLY DE-ALLOCATE UNNEEDED REXX FILES + ***************************************************************** + 2000-FREE-REXFILES. + + MOVE SPACES TO ALLOC-TEXT. + + IF PECB-BATCH-MODE + MOVE 'FREE DD(SYSEXEC)' TO ALLOC-TEXT + ELSE + MOVE 'FREE DD(REXFILE7)' TO ALLOC-TEXT + END-IF. + + + PERFORM 9000-DYNAMIC-ALLOC-DEALLOC + . + ***************************************************************** + ** CALL BPXWDYN TO PREFORM REQUIRED REXX FUNCTIONS + ***************************************************************** + 9000-DYNAMIC-ALLOC-DEALLOC. + + CALL BPXWDYN USING ALLOC-STRING + + IF RETURN-CODE NOT = ZERO + DISPLAY 'C1UEXT07: ALLOCATION FAILED: RETURN CODE = ' + RETURN-CODE + DISPLAY ALLOC-TEXT + END-IF + +********* DISPLAY ALLOC-TEXT . + MOVE SPACES TO ALLOC-TEXT + . + + + ****************************************************************** + * BEGIN NESTED PROGRAMS USED TO SET THE POINTERS OF DATA AREAS + * THAT ARE BEING PASSED TO IRXEXEC SO THAT A REXX ROUTINE CAN + * PASS DATA (OTHER THAN A RETURN CODE) BACK TO A COBOL PROGRAM. + ****************************************************************** + + ******** SET-ARG1-POINTER ******** + IDENTIFICATION DIVISION. + PROGRAM-ID. SET-ARG1-POINTER. + ENVIRONMENT DIVISION. + DATA DIVISION. + WORKING-STORAGE SECTION. + LINKAGE SECTION. + 77 ARG-PTR POINTER. + 77 ARG1 PIC X(16). + PROCEDURE DIVISION USING ARG-PTR + ARG1. + SET ARG-PTR TO ADDRESS OF ARG1 + GOBACK. + END PROGRAM SET-ARG1-POINTER. + + ******** SET-ARGUMENT-POINTER ******** + IDENTIFICATION DIVISION. + PROGRAM-ID. SET-ARGUMENT-POINTER. + ENVIRONMENT DIVISION. + DATA DIVISION. + WORKING-STORAGE SECTION. + LINKAGE SECTION. + 77 ARGTABLE-PTR POINTER. + 01 ARGUMENT. + 02 ARGUMENT-1 OCCURS 1 TIMES. + 05 ARGSTRING-PTR POINTER. + 05 ARGSTRING-LENGTH PIC S9(8) BINARY. + 02 ARGSTRING-LAST1 PIC S9(8) BINARY. + 02 ARGSTRING-LAST2 PIC S9(8) BINARY. + PROCEDURE DIVISION USING ARGTABLE-PTR + ARGUMENT. + SET ARGTABLE-PTR TO ADDRESS OF ARGUMENT + GOBACK. + END PROGRAM SET-ARGUMENT-POINTER. + + ******** SET-EXECBLK-POINTER ******** + IDENTIFICATION DIVISION. + PROGRAM-ID. SET-EXECBLK-POINTER. + ENVIRONMENT DIVISION. + DATA DIVISION. + WORKING-STORAGE SECTION. + LINKAGE SECTION. + 77 EXECBLK-PTR POINTER. + 01 EXECBLK. + 03 EXECBLK-ACRYN PIC X(8). + 03 EXECBLK-LENGTH PIC 9(4) COMP. + 03 EXECBLK-RESERVED PIC 9(4) COMP. + 03 EXECBLK-MEMBER PIC X(8). + 03 EXECBLK-DDNAME PIC X(8). + 03 EXECBLK-SUBCOM PIC X(8). + 03 EXECBLK-DSNPTR POINTER. + 03 EXECBLK-DSNLEN PIC 9(4) COMP. + PROCEDURE DIVISION USING EXECBLK-PTR + EXECBLK. + SET EXECBLK-PTR TO ADDRESS OF EXECBLK + GOBACK. + END PROGRAM SET-EXECBLK-POINTER. + + ******** SET-EVALBLK-POINTER ******** + IDENTIFICATION DIVISION. + PROGRAM-ID. SET-EVALBLK-POINTER. + ENVIRONMENT DIVISION. + DATA DIVISION. + WORKING-STORAGE SECTION. + LINKAGE SECTION. + 77 EVALBLK-PTR POINTER. + 01 EVALBLK. + 03 EVALBLK-EVPAD1 PIC 9(4) COMP. + 03 EVALBLK-EVSIZE PIC 9(4) COMP. + 03 EVALBLK-EVLEN PIC 9(4) COMP. + 03 EVALBLK-EVPAD2 PIC 9(4) COMP. + 03 EVALBLK-EVDATA PIC X(256). + PROCEDURE DIVISION USING EVALBLK-PTR + EVALBLK. + SET EVALBLK-PTR TO ADDRESS OF EVALBLK + GOBACK. + END PROGRAM SET-EVALBLK-POINTER. + *--- END OF MAIN PROGRAM + END PROGRAM C1UEXT07. diff --git a/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/CAST#JCL.jcl b/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/CAST#JCL.jcl new file mode 100644 index 0000000..7a8087b --- /dev/null +++ b/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/CAST#JCL.jcl @@ -0,0 +1,22 @@ +//&Jobname JOB (&MyAccountingCode), +// 'CAST PACKAGE',CLASS=A,MSGCLASS=X,NOTIFY=&SYSUID +//*==================================================================* +// JCLLIB ORDER=(&MySEN2Library, +// &MySENULibrary) +//*==================================================================* +//*===== If you want all package CAST actions to be performed * +//*===== in batch, then set the Force_CAST_in_Batch option in * +//*===== C1UEXTR7, and this JCL will submit a batch CAST. * +//*==================================================================* +//ENBP1000 EXEC PGM=NDVRC1,PARM=ENBP1000, CAST#JCL +// DYNAMNBR=1500,REGION=4096K +// INCLUDE MEMBER=STEPLIB +//*C1UEXTR7 DD DUMMY <- Trace REXX exit +//ENPSCLIN DD * + CAST PACKAGE '&PECB_PACKAGE_ID'. +//C1MSGS1 DD SYSOUT=* +//C1MSGS2 DD SYSOUT=* +//REPORT DD SYSOUT=* +//SYSUDUMP DD SYSOUT=* +//SYMDUMP DD DUMMY +//JCLOUT DD DUMMY diff --git a/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/CAST#JCL.skl b/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/CAST#JCL.skl new file mode 100644 index 0000000..ae18cb6 --- /dev/null +++ b/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/CAST#JCL.skl @@ -0,0 +1,22 @@ +//&Jobname JOB (&MyAccountingCode), +// 'CAST PACKAGE',CLASS=A,MSGCLASS=X,NOTIFY=&SYSUID +//*==================================================================* +// JCLLIB ORDER=(&MySEN2Library, +// &MySENULibrary) +//*==================================================================* +//*===== If you want all package CAST actions to be performed * +//*===== in batch, then set the Force_CAST_in_Batch option in * +//*===== C1UEXTR7, and this JCL will submit a batch CAST. * +//*==================================================================* +//ENBP1000 EXEC PGM=NDVRC1,PARM=ENBP1000, CAST#JCL +// DYNAMNBR=1500,REGION=4096K +// INCLUDE MEMBER=STEPLIB +//*C1UEXTR7 DD DUMMY <- Trace REXX exit +//ENPSCLIN DD * + CAST PACKAGE '&PECB_PACKAGE_ID'. +//C1MSGS1 DD SYSOUT=* +//C1MSGS2 DD SYSOUT=* +//REPORT DD SYSOUT=* +//SYSUDUMP DD SYSOUT=* +//SYMDUMP DD DUMMY +//JCLOUT DD DUMMY diff --git a/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/FTP#INC.skl b/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/FTP#INC.skl new file mode 100644 index 0000000..2cb8400 --- /dev/null +++ b/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/FTP#INC.skl @@ -0,0 +1,15 @@ +//*---------- +//FTP1 DD *,SYMBOLS=JCLONLY FTP#INC + OPEN '&IPADDRSS' + ASCII +//FTP2 DD * <- All kinds of Stage info FTP#INC + PUT '&Dataset(&Member)' + + &Member.&extension +//FTP2XX DD * <- All kinds of Stage info **NOT USED** FTP#INC + PUT '&Dataset(&Member)' + + \&Folder\&Member.&extension +//FTP3 DD * <- All kinds of Stage info FTP#INC + PUT '&SonarWorkfile(TRANSMIT)' + + TransmitTable.&uniqueName.lst + QUIT +//*---------- diff --git a/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/FTP#RUN.skl b/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/FTP#RUN.skl new file mode 100644 index 0000000..06e62b1 --- /dev/null +++ b/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/FTP#RUN.skl @@ -0,0 +1,10 @@ +//*================================================================ +//C1BMXNDM EXEC PGM=FTP,COND=(4,LT) FTP#RUN +//ABNLIGNR DD DUMMY +//SYSPRINT DD SYSOUT=* +//SYSABEND DD SYSOUT=* +//NETRC DD DISP=SHR,DSN=&SYSUID..ENDEVOR.NETRC(SHIPPING) +//SYSOUT DD SYSOUT=* +//OUTPUT DD SYSOUT=* +//INPUT DD DSN=&&COMMANDS,DISP=(OLD,DELETE) FTP#RUN +//*================================================================ diff --git a/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/GTUNIQUE.rex b/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/GTUNIQUE.rex new file mode 100644 index 0000000..2d9999a --- /dev/null +++ b/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/GTUNIQUE.rex @@ -0,0 +1,25 @@ + /* REXX */ + /* Build a unique 8-byte name from date and time */ + + numbers = '123456789' ; + characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' ; + ToDay = DATE(O) ; + Year = SUBSTR(ToDay,1,2) + 1; + Year = SUBSTR(characters||characters||characters||characters,Year,1) + Month = SUBSTR(ToDay,4,2) ; + Month = SUBSTR(characters,Month,1) ; + Day = SUBSTR(ToDay,7,2) ; + + Day = SUBSTR(characters || numbers,Day,1) ; + NOW = TIME() ; + Hour = SUBSTR(NOW,1,2) ; + IF Hour = '00' THEN Hour = '0' + ELSE + Hour = SUBSTR(characters,Hour,1) ; + Minute = SUBSTR(NOW,4,2) ; + second = SUBSTR(NOW,7,2) ; + Unique_Name = Year || Month || Day || Hour ||, + Minute || second ; + SA= "Unique Member name is " Unique_Name + + Return Unique_Name diff --git a/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/README.md b/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/README.md new file mode 100644 index 0000000..67fa7a4 --- /dev/null +++ b/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/README.md @@ -0,0 +1,17 @@ +# SonarQube Interface to Endevor + +Items in this folder demonstrate an example method for interfacing SonarQube with Endevor. They support the automated execution of a SonarQube analysis during the CAST of an Endevor Package. If the SonarQube analysis returns a "failure", then the Endevor CAST action is made to fail. + +These samples are provided as is and are not officially supported (see [license](https://github.com/BroadcomMFD/broadcom-product-scripts/blob/main/LICENSE +) for more information). + +REXX, Python and "skeleton" components are found in this folder. + +Items not found in this folder are found in other locations of this GitHub, including: + +**[GETACCT.rex](https://github.com/BroadcomMFD/broadcom-product-scripts/blob/main/endevor/Automated-Test-Facility-Using-Test4Z/GETACCTC.rex)** for obtaining and re-using the users accounting code information + +**[BUMPJOB.rex](https://github.com/BroadcomMFD/broadcom-product-scripts/blob/main/endevor/Automated-Test-Facility-Using-Test4Z/BUMPJOB.rex)** for bumping an existing jobname to render a new job name + + +Use the SonarQube.bat commmand to bring the items together for your mainframe. diff --git a/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/SONARMDL.skl b/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/SONARMDL.skl new file mode 100644 index 0000000..7f9340c --- /dev/null +++ b/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/SONARMDL.skl @@ -0,0 +1,175 @@ +//&Jobname JOB (0000), +// CLASS=A,MSGCLASS=X,REGION=4M, +// NOTIFY=&SYSUID +//*==================================================================* +// JCLLIB ORDER=(&MySEN2Library, +// &MySENULibrary) +//*------------------------------------------------------------------- +// EXPORT SYMLIST=(*) +// SET RSLTPFX=&ReportingPFX +// SET SONARWRK=&SonarWorkfile +// SET PACKAGE='&Package' +// SET RETURNTO='&MyHomeAddress' +//*-------------------------------------------------------------------* +//*-- Report back that job is started -----------------* +//*-------------------------------------------------------------------* +//REPORT1 EXEC PGM=IKJEFT1B, <- Report that job started SONARMDL +// PARM='ENBPIU00 1' +//SYSTSPRT DD SYSOUT=* +//SYSTSIN DD DUMMY +//OPTIONS DD * + JobName = MVSVAR('SYMDEF',JOBNAME ) + X = OUTTRAP(LINE.); + address TSO "ST " JobName + JobData = Strip(LINE.1); + Say JobData + whereparen = Pos('(',JobData) + If whereparen > 0 then, + + JobNumber = Substr(JobData,whereparen+1,8) + Queue JobName JobNumber "at" DATE('O') TIME() ":--------------------" + Queue " Job starting" + Queue " Initiating File Transmissions" + Queue " reporting using &ReportingPFX.* " + Queue " Transmission Table: " + "EXECIO 5 DISKW REPORT " + "EXECIO * DISKR TABLE ( Finis" + "EXECIO * DISKW REPORT ( Finis" + Exit +//SYSEXEC DD DISP=SHR,DSN=&MyCLS2Library +// DD DISP=SHR,DSN=&MyCLS0Library +//TABLE DD DISP=SHR, +// DSN=&SonarWorkfile(TRANSMIT) +//REPORT DD DSN=&ReportingPFX.#1, +// DISP=(MOD,CATLG,KEEP),FREE=CLOSE, +// UNIT=SYSALLDA,SPACE=(TRK,(01,01),RLSE), +// DCB=(RECFM=FB,LRECL=80,BLKSIZE=0,DSORG=PS) +//*-------------------------------------------------------------------* +//*==================================================================* +//*- Build Transmit commands +//*==================================================================* +// SET METHOD=&TransmitMethod +// SET IPADDRSS=10.252.120.14 +//*------------------------------------------------------------------- +//* STEP 1 -- EXECUTE CSV UTILITY +//*------------------------------------------------------------------- +//TRANSMIT EXEC PGM=IRXJCL, <- Build Transmit commands SONARMDL +// PARM='ENBPIU00 PARMLIST' +//TABLE DD DISP=SHR, +// DSN=&SonarWorkfile(TRANSMIT) +//PARMLIST DD *,SYMBOLS=JCLONLY +&METHOD.1 TBLOUT NOTHING 1 +&METHOD.2 TBLOUT OPTIONS A +&METHOD.3 TBLOUT NOTHING 1 +//OPTIONS DD * +* Folder-- Member-- Dataset------------------------------------- +If Folder = 'COPYBOOK' then extension = 'cpy' +If Folder = 'COBOL' then extension = 'cbl' +NewXfer = 'NEWXFER' +If $tbl = $tablerec.0 then NewXfer = '*' +// INCLUDE MEMBER=&METHOD.#INC <- where are includes +//SYSTSPRT DD SYSOUT=* +//SYSEXEC DD DISP=SHR,DSN=&MyCLS2Library +// DD DISP=SHR,DSN=&MyCLS0Library +//NOTHING DD DUMMY +//SYSTSIN DD DUMMY +//TBLOUTX DD SYSOUT=* +//TBLOUT DD DSN=&&COMMANDS,DISP=(NEW,PASS), +// UNIT=SYSDA,SPACE=(TRK,(1,1)), +// DCB=(RECFM=FB,LRECL=80,BLKSIZE=8000) +//*----------------------------------------------------------------* +//* Print Commands +//*----------------------------------------------------------------* +//SHOWME EXEC PGM=IEBGENER <- Show File Transmit cmds SONARMDL +//SYSPRINT DD DUMMY +//SYSIN DD DUMMY +//SYSUT1 DD DSN=&&COMMANDS,DISP=(OLD,PASS) +//SYSUT2 DD SYSOUT=* +//* +//*----------------------------------------------------------------* +//*----------------------------------------------------------------* +// IF (RC < &TransmitCOND) THEN +// INCLUDE MEMBER=&METHOD.#RUN <- Exec the Transmission +// ENDIF +//*-------------------------------------------------------------------* +//*-------------------------------------------------------------------* +// IF (RC > 4) THEN +//*-------------------------------------------------------------------* +//REPORT2B EXEC PGM=IKJEFT1B, <- Report Transmit FAILED SONARMDL +// PARM='ENBPIU00 1',COND=EVEN +//SYSTSPRT DD SYSOUT=* +//SYSTSIN DD DUMMY +//OPTIONS DD * + JobName = MVSVAR('SYMDEF',JOBNAME ) + X = OUTTRAP(LINE.); + address TSO "ST " JobName + JobData = Strip(LINE.1); + Say JobData + whereparen = Pos('(',JobData) + If whereparen > 0 then, + + JobNumber = Substr(JobData,whereparen+1,8) + Queue JobName JobNumber "at" DATE('O') TIME() ":--------------------" + Queue " File Transmissions failed" + Queue " Stopping further action" + Quey= " reporting using &ReportingPFX.* " + "EXECIO 3 DISKW REPORT ( Finis" + Exit +// ELSE +//*-------------------------------------------------------------------* +//REPORT2A EXEC PGM=IKJEFT1B, <- Report Transmit is done SONARMDL +// PARM='ENBPIU00 1' +//SYSTSPRT DD SYSOUT=* +//SYSTSIN DD DUMMY +//OPTIONS DD * + JobName = MVSVAR('SYMDEF',JOBNAME ) + X = OUTTRAP(LINE.); + address TSO "ST " JobName + JobData = Strip(LINE.1); + Say JobData + whereparen = Pos('(',JobData) + If whereparen > 0 then, + + JobNumber = Substr(JobData,whereparen+1,8) + Queue JobName JobNumber "at" DATE('O') TIME() ":--------------------" + Queue " File Transmissions completed" + Queue " Starting the SonarQube Analysis" + Quey= " reporting using &ReportingPFX.* " + "EXECIO 3 DISKW REPORT ( Finis" + Exit +//SYSEXEC DD DISP=SHR,DSN=&MyCLS2Library +// DD DISP=SHR,DSN=&MyCLS0Library +//REPORT DD DSN=&ReportingPFX.#2, +// DISP=(MOD,CATLG,KEEP),FREE=CLOSE, +// UNIT=SYSALLDA,SPACE=(TRK,(01,01),RLSE), +// DCB=(RECFM=FB,LRECL=80,BLKSIZE=0,DSORG=PS) +//*-------------------------------------------------------------------* +//*------------------------------------------------------------------- +//SONRQUBE EXEC PGM=IEFBR14 <- Start SonarQube Analysis SONARMDL +//*------------------------------------------------------------------- +//*------------------------------------------------------------------- +//REPORT3 EXEC PGM=IKJEFT1B, <- Report SonarQube is done SONARMDL +// PARM='ENBPIU00 1' +//SYSTSPRT DD SYSOUT=* +//SYSTSIN DD DUMMY +//OPTIONS DD * + $QuietMessages = 'Y' /* Bypass messages Y/N */ + JobName = MVSVAR('SYMDEF',JOBNAME ) /*Returns JOBNAME */ + X = OUTTRAP(LINE.); + address TSO "ST " JobName + JobData = Strip(LINE.1); + Say JobData + whereparen = Pos('(',JobData) + If whereparen > 0 then, + + JobNumber = Substr(JobData,whereparen+1,8) + Queue JobName JobNumber "at" DATE('O') TIME() ":--------------------" + Queue " SonarQube Analysis is completed" + Queue " reporting using &ReportingPFX.* " + "EXECIO 3 DISKW REPORT ( Finis" + Exit +//SYSEXEC DD DISP=SHR,DSN=&MyCLS2Library +// DD DISP=SHR,DSN=&MyCLS0Library +//REPORT DD DSN=&ReportingPFX.#3, +// DISP=(MOD,CATLG,KEEP),FREE=CLOSE, +// UNIT=SYSALLDA,SPACE=(TRK,(01,01),RLSE), +// DCB=(RECFM=FB,LRECL=80,BLKSIZE=0,DSORG=PS) +//*-------------------------------------------------------------------* +// ENDIF +//*-------------------------------------------------------------------* diff --git a/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/SONARPRM.skl b/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/SONARPRM.skl new file mode 100644 index 0000000..6657e64 --- /dev/null +++ b/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/SONARPRM.skl @@ -0,0 +1,5 @@ + NOTHING NOTHING SETUP 0 + MODEL TBLOUT NOTHING 1 + NOTHING REPORT WAIT#1 1 + NOTHING REPORT WAIT#2 1 + NOTHING REPORT WAIT#3 1 diff --git a/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/SONARSET.skl b/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/SONARSET.skl new file mode 100644 index 0000000..9cf6a5b --- /dev/null +++ b/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/SONARSET.skl @@ -0,0 +1,13 @@ +* SETUP INPUT FOR THE FOREGROUND TABLE TOOL STEP DUING CAST +* If $row# = 0 then $SkipRow = 'Y' + uniqueName = GTUNIQUE() + ReportingPFX = USERID() || '.SONRQUBE.'uniqueName'.RESULTS' + $QuietMessages = 'Y' /* Bypass messages Y/N */ + myJob = MVSVAR('SYMDEF','JOBNAME' ) + Jobname = BUMPJOB(myJob) + OrderLibrary = '&MYISPSLB' + SonarWorkfile = '&SONARWRK' + TransmitMethod = 'XCOM' + TransmitMethod = 'FTP' + TransmitCOND = 4 /* Skip step if prev > TransmitCOND */ + TransmitCOND = 0 /* Skip step if prev > TransmitCOND */ diff --git a/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/SONARTBL.skl b/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/SONARTBL.skl new file mode 100644 index 0000000..2de5ddc --- /dev/null +++ b/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/SONARTBL.skl @@ -0,0 +1,3 @@ +* DO + * +*** Table for Table Tool step during Package Cast diff --git a/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/SONARW#1.skl b/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/SONARW#1.skl new file mode 100644 index 0000000..0beb4da --- /dev/null +++ b/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/SONARW#1.skl @@ -0,0 +1,17 @@ +* WAIT#1 for the SonarQube job to start + If $row# = 0 then $SkipRow = 'Y' + Say 'Jobname=' Jobname + Say 'myJob=' myJob + Say 'Execio 0 DISKW TBLOUT (Finis' + "Execio 0 DISKW TBLOUT (Finis" +* + ReportingDSN = ReportingPFX || '.#1' + say "ReportingDSN=" ReportingDSN +* a short wait to see if the submitted job starts + wait1 = WAITFILE(ReportingDSN 45 1) + say "ReportingDSN " ReportingDSN "is returned after" wait1 "secs" + if wait1 = 0 then, + + Do; Say '#1 is lost'; Exit(11); end + cmd = "ALLOC DD(STATUS1) DA("ReportingDSN") SHR REUSE " + CALL BPXWDYN cmd + MODEL = 'STATUS1' diff --git a/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/SONARW#2.skl b/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/SONARW#2.skl new file mode 100644 index 0000000..aa5538f --- /dev/null +++ b/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/SONARW#2.skl @@ -0,0 +1,14 @@ +* WAIT#2 input for file transmission to complete + If $row# = 0 then $SkipRow = 'Y' + ReportingDSN = ReportingPFX || '.#2' +* a longer wait for the File Transmission to finish + wait2 = (wait1 * 1.5) % 1 + wait2 = max(wait2,5) + Say 'SONARW#2 - waiting' wait2 'seconds between check loops' + wait2 = WAITFILE(ReportingDSN 25 wait2) + say "ReportingDSN " ReportingDSN "is returned after" wait2 "secs" + if wait2 = 0 then, + + Do; Say '#2 is lost'; Exit(12); end + cmd = "ALLOC DD(STATUS2) DA("ReportingDSN") SHR REUSE " + CALL BPXWDYN cmd + MODEL = 'STATUS2' diff --git a/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/SONARW#3.skl b/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/SONARW#3.skl new file mode 100644 index 0000000..17bf27d --- /dev/null +++ b/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/SONARW#3.skl @@ -0,0 +1,13 @@ +* WAIT#2 wait for the SonarQube analysis to complete + If $row# = 0 then $SkipRow = 'Y' + ReportingDSN = ReportingPFX || '.#3' +* LONGEST wait for the SonarQube Analysis to finish + wait3 = (wait2 * 1.5) % 1 + wait3 = max(wait3,10) + wait3 = WAITFILE(ReportingDSN 55 wait3) + say "ReportingDSN " ReportingDSN "is returned after" wait3 "secs" + if wait3 = 0 then, + + Do; Say '#2 is lost'; Exit(13); end + cmd = "ALLOC DD(STATUS3) DA("ReportingDSN") SHR REUSE " + CALL BPXWDYN cmd + MODEL = 'STATUS3' diff --git a/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/WAITFILE.rex b/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/WAITFILE.rex new file mode 100644 index 0000000..d58add5 --- /dev/null +++ b/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/WAITFILE.rex @@ -0,0 +1,46 @@ + /* REXX */ + /* Loop in Wait status until named file appears */ + /* Return 0 if file never appears after all waits */ + /* Return # for number of seconds used waiting */ + + Arg WaitForFilename MaxLoops WaitSeconds + + STRING = "ALLOC DD(WAITFILE)", + " DA('"WaitForFilename"') SHR REUSE" + seconds = WaitSeconds /* Number of Seconds to wait if needed */ + + Do MaxLoops + /* or at least until the file is available */ + Do Loop# = 1 to MaxLoops + CALL BPXWDYN STRING; + MyResult = RESULT ; + If MyResult = 0 then Return (Loop# * WaitSeconds) + Say 'WAITFILE is waiting for' WaitForFilename + Call WaitAwhile + End /* Do MaxLoops */ + + Return 0 + +WaitAwhile: + /* */ + /* A resource is unavailable. Wait awhile and try */ + /* accessing the resource again. */ + /* */ + /* The length of the wait is designated in the parameter */ + /* value which specifies a number of seconds. */ + /* A parameter value of '000003' causes a wait for 3 seconds. */ + /* */ + /*seconds = Abs(seconds) */ + /*seconds = Trunc(seconds,0) */ + Say "Waiting for" seconds "seconds at " DATE(S) TIME() + /* AOPBATCH and BPXWDYN are IBM programs */ + CALL BPXWDYN "ALLOC DD(STDOUT) DUMMY SHR REUSE" + CALL BPXWDYN "ALLOC DD(STDERR) DUMMY SHR REUSE" + CALL BPXWDYN "ALLOC DD(STDIN) DUMMY SHR REUSE" + + /* AOPBATCH and BPXWDYN are IBM programs */ + parm = "sleep "seconds + Address LINKMVS "AOPBATCH parm" + + Return + diff --git a/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/XCOM#INC.skl b/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/XCOM#INC.skl new file mode 100644 index 0000000..fcf5b3f --- /dev/null +++ b/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/XCOM#INC.skl @@ -0,0 +1,17 @@ +//XCOM1 DD DATA,DLM=QQ,SYMBOLS=JCLONLY XCOM#INC +TYPE=SEND +IPNAME=10.252.121.121 +IPPORT=8044 +CKPT=0 +FILEOPT=REPLACE +FILETYPE=FILE +USERID=sonaruser +PASSWORD=ndvruser +* +QQ +//XCOM2 DD *,SYMBOLS=JCLONLY XCOM#INC +FILE=/tmp/&Member.&extension +LFILE=&Dataset(&Member) +* +&NewXfer +//XCOM3 DD DUMMY XCOM#INC diff --git a/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/XCOM#RUN.skl b/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/XCOM#RUN.skl new file mode 100644 index 0000000..4d423b4 --- /dev/null +++ b/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/XCOM#RUN.skl @@ -0,0 +1,13 @@ +//*------------------------------------------------------------------- +//XCOMJOB EXEC PGM=XCOMJOB, <- Transmit Files 2 server XCOM#RUN +// PARM=('TYPE=EXECUTE') +//*PARM=('TYPE=SCHEDULE,STCIP=10.175.80.48,STCPORT=8044') +//STEPLIB DD DISP=SHR, +// DSN=SHARE.XCOM.CBXGLOAD * XCOM LOAD MODULES +// DD DISP=SHR, +// DSN=CEE.SCEERUN * IBM LE RUNTIME +//XCOMCNTL DD DISP=SHR, +// DSN=SHARE.XCOM.R120.CBXGPARM * CONTROL LIBRARY +//CAOESTOP DD DUMMY +//SYSIN01 DD DSN=&&COMMANDS,DISP=(OLD,DELETE) XCOM#RUN +//*------------------------------------------------------------------- diff --git a/endevor/Field-Developed-Programs/SonarQube.bat b/endevor/Field-Developed-Programs/SonarQube.bat new file mode 100644 index 0000000..f461ccf --- /dev/null +++ b/endevor/Field-Developed-Programs/SonarQube.bat @@ -0,0 +1,72 @@ +REM In Windows, execute this command file to collect all Package +@ECHO OFF +ECHO ./ ADD NAME=@README > SonarQube.moveout +ECHO These items come from the Endevor GitHub at >> SonarQube.moveout +ECHO https://github.com/BroadcomMFD/broadcom-product-scripts >> SonarQube.moveout +ECHO ------------------------------------------------------- >> SonarQube.moveout +ECHO These are rex/CSIQCLS0 : BUMPJOB C1UEXTR7 DTADJUST GETACCTC GTUNIQUE WAITFILE >> SonarQube.moveout +ECHO These are skl/CSIQSENU : CAST#JCL FTP#INC FTP#RCV FTP#RUN SONARMDL SONARPRM SONARSET SONARTBL SONARW#1 SONARW#2 SONARW#3 XCOM#INC XCOM#JOB XCOM#RCV XCOM#RUN >> SonarQube.moveout +ECHO ./ ADD NAME=BUMPJOB >> SonarQube.moveout +TYPE SonarQube-interface-to-Endevor\BUMPJOB.rex >> SonarQube.moveout +ECHO. >> SonarQube.moveout +ECHO ./ ADD NAME=C1UEXTR7 >> SonarQube.moveout +TYPE SonarQube-interface-to-Endevor\C1UEXTR7.rex >> SonarQube.moveout +ECHO. >> SonarQube.moveout +ECHO ./ ADD NAME=DTADJUST >> SonarQube.moveout +TYPE SonarQube-interface-to-Endevor\DTADJUST.rex >> SonarQube.moveout +ECHO. >> SonarQube.moveout +ECHO ./ ADD NAME=GETACCTC >> SonarQube.moveout +TYPE SonarQube-interface-to-Endevor\GETACCTC.rex >> SonarQube.moveout +ECHO. >> SonarQube.moveout +ECHO ./ ADD NAME=GTUNIQUE >> SonarQube.moveout +TYPE SonarQube-interface-to-Endevor\GTUNIQUE.rex >> SonarQube.moveout +ECHO. >> SonarQube.moveout +ECHO ./ ADD NAME=WAITFILE >> SonarQube.moveout +TYPE SonarQube-interface-to-Endevor\WAITFILE.rex >> SonarQube.moveout +ECHO. >> SonarQube.moveout +ECHO ./ ADD NAME=CAST#JCL >> SonarQube.moveout +TYPE SonarQube-interface-to-Endevor\CAST#JCL.skl >> SonarQube.moveout +ECHO. >> SonarQube.moveout +ECHO ./ ADD NAME=FTP#INC >> SonarQube.moveout +TYPE SonarQube-interface-to-Endevor\FTP#INC.skl >> SonarQube.moveout +ECHO. >> SonarQube.moveout +ECHO ./ ADD NAME=FTP#RCV >> SonarQube.moveout +TYPE SonarQube-interface-to-Endevor\FTP#RCV.skl >> SonarQube.moveout +ECHO. >> SonarQube.moveout +ECHO ./ ADD NAME=FTP#RUN >> SonarQube.moveout +TYPE SonarQube-interface-to-Endevor\FTP#RUN.skl >> SonarQube.moveout +ECHO. >> SonarQube.moveout +ECHO ./ ADD NAME=SONARMDL >> SonarQube.moveout +TYPE SonarQube-interface-to-Endevor\SONARMDL.skl >> SonarQube.moveout +ECHO. >> SonarQube.moveout +ECHO ./ ADD NAME=SONARPRM >> SonarQube.moveout +TYPE SonarQube-interface-to-Endevor\SONARPRM.skl >> SonarQube.moveout +ECHO. >> SonarQube.moveout +ECHO ./ ADD NAME=SONARSET >> SonarQube.moveout +TYPE SonarQube-interface-to-Endevor\SONARSET.skl >> SonarQube.moveout +ECHO. >> SonarQube.moveout +ECHO ./ ADD NAME=SONARTBL >> SonarQube.moveout +TYPE SonarQube-interface-to-Endevor\SONARTBL.skl >> SonarQube.moveout +ECHO. >> SonarQube.moveout +ECHO ./ ADD NAME=SONARW#1 >> SonarQube.moveout +TYPE SonarQube-interface-to-Endevor\SONARW#1.skl >> SonarQube.moveout +ECHO. >> SonarQube.moveout +ECHO ./ ADD NAME=SONARW#2 >> SonarQube.moveout +TYPE SonarQube-interface-to-Endevor\SONARW#2.skl >> SonarQube.moveout +ECHO. >> SonarQube.moveout +ECHO ./ ADD NAME=SONARW#3 >> SonarQube.moveout +TYPE SonarQube-interface-to-Endevor\SONARW#3.skl >> SonarQube.moveout +ECHO. >> SonarQube.moveout +ECHO ./ ADD NAME=XCOM#INC >> SonarQube.moveout +TYPE SonarQube-interface-to-Endevor\XCOM#INC.skl >> SonarQube.moveout +ECHO. >> SonarQube.moveout +ECHO ./ ADD NAME=XCOM#JOB >> SonarQube.moveout +TYPE SonarQube-interface-to-Endevor\XCOM#JOB.skl >> SonarQube.moveout +ECHO. >> SonarQube.moveout +ECHO ./ ADD NAME=XCOM#RCV >> SonarQube.moveout +TYPE SonarQube-interface-to-Endevor\XCOM#RCV.skl >> SonarQube.moveout +ECHO. >> SonarQube.moveout +ECHO ./ ADD NAME=XCOM#RUN >> SonarQube.moveout +TYPE SonarQube-interface-to-Endevor\XCOM#RUN.skl >> SonarQube.moveout +ECHO. >> SonarQube.moveout +REM diff --git a/endevor/Field-Developed-Programs/TableToolExamples.moveout b/endevor/Field-Developed-Programs/TableToolExamples.moveout deleted file mode 100644 index 365ed64..0000000 --- a/endevor/Field-Developed-Programs/TableToolExamples.moveout +++ /dev/null @@ -1,1665 +0,0 @@ -./ ADD NAME=@README -These items come from the Endevor GitHub at -https://github.com/BroadcomMFD/broadcom-product-scripts -------------------------------------------------------- -These are jcl : CLEANOVR CSVALENV CSVALTYP EXAMPL#1 EXAMPL#2 EXAMPL#3 EXAMPL#4 EXAMPL#5 EXAMPL#6 EXAMPL#7 EXAMPL#8 EXAMPL1A EXAMPL1B EXAMPL2$ EXAMPL2A EXAMPL2B EXAMPL2P EXAMPL2R LISTDSNS PKGEMNTR -./ ADD NAME=CLEANOVR -//IBMUSERO JOB (0000),'Dan Walther',CLASS=A,MSGCLASS=Z,MSGLEVEL=(1,1), -// NOTIFY=&SYSUID,REGION=0M -//*-------------------------------------------------------------------* -//*--Report processor group Overrides --------------------------------* -//*-------------------------------------------------------------------* -//* Output: YOURSITE.NDVR.TEAM.DEFINES(CLEANOVR) -//*------------------------------------------------------------------- -// JCLLIB ORDER=(YOURSITE.NDVR.TEAM.JCL) -//*------------------------------------------------------------------- -//* STEP 1 -- EXECUTE CSV UTILITY -//STEP1 EXEC PGM=NDVRC1, -// PARM='CONCALL,DDN:CONLIB,BC1PCSV0' (EXEC FROM NON-AUTH LIB) -// INCLUDE MEMBER=STEPLIB <- Endevor STEPLIB+CONLIB -//CSVIPT01 DD * - LIST PROCESSOR GROUP '*' - FROM ENVIRONMENT '*' SYSTEM '*' TYPE '*' STAGE '*' - OPTIONS NOSEARCH - TO FILE 'APIEXTR' . -//APIEXTR DD DSN=&&APIEXTR, -// DCB=(RECFM=FB,LRECL=1800,BLKSIZE=18000,DSORG=PS), -// DISP=(MOD,PASS),UNIT=3390, -// SPACE=(CYL,(10,10),RLSE) -//CSVMSGS1 DD SYSOUT=* -//C1MSGSA DD SYSOUT=* -//BSTERR DD SYSOUT=* -//SYMDUMP DD DUMMY -//SYSUDUMP DD SYSOUT=* -//*--------------------------------------------------------------------- -//STEP2 EXEC PGM=IRXJCL,PARM='ENBPIU00 A' -//TABLE DD DSN=&&APIEXTR,DISP=(OLD,PASS) -//OPTIONS DD * - If Substr(SYM_OVRD,1,1) = ' ' then $SkipRow = 'Y' - asterisk = ' ' - If PROC_GRP_NAME = 'DONTUSE1' then asterisk = '*' -//MODEL DD * -*Now: &UPDT_USRID on &UPDT_DATE / &SYM_OVRD ='&SYM_OVRD_VALUE' -&asterisk DELETE PROCESSOR SYMBOL -&asterisk FROM ENVIRONMENT '&ENV_NAME' -&asterisk SYSTEM '&SYS_NAME' TYPE '&TYPE_NAME' STAGE ID &STG_ID -&asterisk PROCESSOR GROUP &PROC_GRP_NAME PROCESSOR TYPE &PROC_TYPE -&asterisk SYMBOL = (&SYM_OVRD) -&asterisk . -// INCLUDE MEMBER=CSIQCLS0 <- Endevor CSIQCLS0 -//SYSTSPRT DD SYSOUT=* -//SYSPRINT DD SYSOUT=* -//TBLOUT DD DISP=SHR,DSN=YOURSITE.NDVR.TEAM.DEFINES(CLEANOVR) -//*--------------------------------------------------------------------- - - -./ ADD NAME=CSVALENV -//IBMUSERI JOB (0000),'EXAMPL2A',CLASS=B,PRTY=6, -// MSGCLASS=3,REGION=7M,NOTIFY=&SYSUID -/*JOBPARM SYSAFF=* -//*-------------------------------------------------------------- -// JCLLIB ORDER=(IBMUSER.JCL.CSV) -//*------------------------------------------------------------------- -//* CONVERT ENVIRONMENT INFO INTO REXX STEM ARRAY DATA -//* VIT902.JCL.CSV(CSVALENV) -//*------------------------------------------------------------------- -//* STEP 1 -- EXECUTE CSV UTILITY -//*------------------------------------------------------------------- -//STEP1 EXEC PGM=NDVRC1,REGION=4M, -// PARM='BC1PCSV0' -// INCLUDE MEMBER=STEPLIB -//BSTIPT01 DD * -LIST ENVIRONMENT -'*' -TO DDNAME 'EXTRACTS' -OPTIONS RETURN ALL. -//EXTRACTS DD DSN=&&EXTRACTS, -// DCB=(RECFM=FB,LRECL=1800,BLKSIZE=9000,DSORG=PS), -// DISP=(NEW,PASS), -// SPACE=(CYL,(5,1),RLSE) -//C1MSGS1 DD SYSOUT=* -//BSTERR DD SYSOUT=* -//*-------------------------------------------------------------------- -//SHOWME EXEC PGM=IEBGENER,REGION=1024K -//SYSPRINT DD SYSOUT=* MESSAGES -//SYSUT1 DD DSN=&&EXTRACTS,DISP=(OLD,PASS) -//SYSUT2 DD SYSOUT=* OUTPUT FILE -//SYSIN DD DUMMY CONTROL STATEMENTS -//SYSUDUMP DD SYSOUT=* -//*-------------------------------------------------------------------- -//ENV#RPT EXEC PGM=IRXJCL,PARM='ENBPIU00 PARMLIST' -//TABLE DD DSN=&&EXTRACTS,DISP=(OLD,DELETE) -//PARMLIST DD * -NOTHING TBLOUT OPTIONS0 0 -MODEL TBLOUT OPTIONS A -LISTENVS TBLOUT NOTHING 1 -// INCLUDE MEMBER=SYSEXEC -//MODEL DD * < BUILD REXX COMMANDS THAT TELL THE STORY -ENV_TITLE.&ENV_NAME = '&TITLE' -//LISTENVS DD * < BUILD REXX COMMANDS THAT TELL THE STORY -LISTENVS = '&LISTENVS' -//NOTHING DD DUMMY CONTROL STATEMENTS -//OPTIONS0 DD * CONTROL STATEMENTS -LISTENVS = '' -//OPTIONS DD * CONTROL STATEMENTS -TITLE = STRIP(TRANSLATE(TITLE,"'",'"')) -IF WORDPOS(ENV_NAME,LISTENVS) = 0 THEN, + -LISTENVS = STRIP(LISTENVS) ENV_NAME -//SYSTSPRT DD SYSOUT=* -//TBLOUT DD SYSOUT=* -//*------------------------------------------------------------------- - - -./ ADD NAME=CSVALTYP -//VIT902B JOB (0000), JOB00133 -// 'ENDEVOR JOB',MSGLEVEL=(1,1),CLASS=B,REGION=0M,MSGCLASS=A, -// NOTIFY=&SYSUID -//*------------------------------------------------------------------- -//* Report TYPE definition information -//* VIT902.JCL.CSV(CSVALTYP) -//*------------------------------------------------------------------- -//* STEP 1 -- EXECUTE CSV UTILITY -//*------------------------------------------------------------------- -//STEP1 EXEC PGM=NDVRC1,REGION=4M, -// PARM='BC1PCSV0' -//STEPLIB DD DISP=SHR,DSN=CAIEDUC.NDVR.V181.CSIQAUTU -// DD DISP=SHR,DSN=CAIEDUC.NDVR.V181.CSIQAUTH -// DD DISP=SHR,DSN=CAIEDUC.NDVR.V181.CSIQLOAD -//CONLIB DD DISP=SHR,DSN=CAIEDUC.NDVR.V181.CSIQLOAD -//BSTIPT01 DD * -LIST TYPE '*' - FROM ENVIRONMENT '*' STAGE '*' - SYSTEM 'FINANCE' - TO DDNAME 'EXTRACTS' - OPTIONS RETURN ALL. -//EXTRACTS DD DSN=&&EXTRACTS, -// DCB=(RECFM=FB,LRECL=1800,BLKSIZE=9000,DSORG=PS), -// DISP=(NEW,PASS), -// SPACE=(CYL,(5,10),RLSE) -//C1MSGS1 DD SYSOUT=* -//BSTERR DD SYSOUT=* -//*-------------------------------------------------------------------- -//SHOWME EXEC PGM=IEBGENER,REGION=1024K -//SYSPRINT DD SYSOUT=* MESSAGES -//SYSUT1 DD DSN=&&EXTRACTS,DISP=(OLD,PASS) -//SYSUT2 DD SYSOUT=* OUTPUT FILE -//SYSIN DD DUMMY CONTROL STATEMENTS -//SYSUDUMP DD SYSOUT=* -//*-------------------------------------------------------------------- -//SBS#RPT EXEC PGM=IRXJCL,PARM='ENBPIU00 A' -//TABLE DD DSN=&&EXTRACTS,DISP=(OLD,DELETE) -//SYSEXEC DD DISP=SHR,DSN=CAIEDUC.NDVR.V181.CSIQCLS0 -//MODEL DD * < Format TYPE information for TBLOUT - &ENV_NAME &SYS_NAME &TYPE_NAME - &UPDT_DATE &UPDT_TIME &UPDT_USRID -//NOTHING DD DUMMY CONTROL STATEMENTS -//OPTIONS DD * CONTROL STATEMENTS - TITLE = Strip(Translate(TITLE,"'",'"')) - If STG_# /= '1' then $SkipRow = 'Y' -//SYSTSPRT DD SYSOUT=* -//TBLOUT DD SYSOUT=* -//*-------------------------------------------------------------------- - - -./ ADD NAME=EXAMPL#1 -//IBMUSER1 JOB (0000), -// 'ENDEVOR JOB',MSGLEVEL=(1,1),CLASS=B,REGION=0M,MSGCLASS=A, -// NOTIFY=&SYSUID -//*------------------------------------------------------------------- -// SET SYSEXEC=CAPRD.NDVR.PROD.CATSNDVR.CEXEC -//*-------------------------------------------------------------- -//*- To Report and delete very old elements from Test ----------- -//*-------------------------------------------------------------- -//*--------------------------------------------------------------------* -//* STEP 1 -- Execute CSV Utility to locate inventory -//*--------------------------------------------------------------------* -//STEP1 EXEC PGM=NDVRC1,REGION=4M, -// PARM='BC1PCSV0' -//STEPLIB DD DISP=SHR,DSN=CAPRD.NDVR.V160PRD.CSIQAUTU -// DD DISP=SHR,DSN=CAPRD.NDVR.V160PRD.CSIQAUTH -// DD DISP=SHR,DSN=CAPRD.NDVR.V160PRD.CSIQLOAD -//BSTIPT01 DD * -LIST ELEMENT '*' - FROM ENVIRONMENT SMPLTEST SYSTEM '*' SUBSYSTEM '*' - TYPE '*' - STAGE NUMBER '*' - DATA BASIC - TO DDNAME 'CSVOUTPT' - OPTIONS NOSEARCH RETURN FIRST . -//C1MSGS1 DD SYSOUT=* -//BSTERR DD SYSOUT=* -//CSVOUTPT DD DSN=&&CSVFILE, -// DCB=(RECFM=FB,LRECL=1800,BLKSIZE=9000,DSORG=PS), -// DISP=(MOD,PASS), -// SPACE=(CYL,(5,5),RLSE) -//*-------------------------------------------------------------------- -//* SHOWME -- Show the API call results -//*-------------------------------------------------------------------- -//SHOWME EXEC PGM=IEBGENER,REGION=1024K,COND=(4,EQ,STEP1) -//SYSPRINT DD SYSOUT=* MESSAGES -//SYSUT1 DD DSN=&&CSVFILE,DISP=(OLD,PASS) -//SYSUT2 DD SYSOUT=* OUTPUT FILE -//SYSIN DD DUMMY CONTROL STATEMENTS -//SYSUDUMP DD SYSOUT=* -//*-------------------------------------------------------------------- -//* -//TAILOR EXEC PGM=IRXJCL,PARM='ENBPIU00 A' -//TABLE DD DSN=&&CSVFILE,DISP=(OLD,DELETE) -//OPTIONS DD * - DaysAgo = 240 /* Number of days for cutoff */ - BaseDate = DATE('B') /* Today in Base format */ - UpdateDate = Substr(UPDT_DATE,1,4) || Substr(UPDT_DATE,6,2) - UpdateDate = UpdateDate || Substr(UPDT_DATE,9,2) - If DATATYPE(UpdateDate) /= 'NUM' then $SkipRow = 'Y' - BaseOld = DATE(B,UpdateDate,S) /* Convert Upd date to Base fmt */ - ElementAge = BaseDate - BaseOld /* Determine how many days ago */ - If TYPE_NAME /= 'JAVA' & ElementAge < DaysAgo then $SkipRow = 'Y' -//SYSEXEC DD DSN=&SYSEXEC,DISP=SHR -//SYSTSPRT DD SYSOUT=* -//MODEL DD * -** &FULL_ELM_NAME &SYS_NAME &SBS_NAME &TYPE_NAME &SIGNOUT_ID -* &UPDT_DATE &UPDT_TIME (&ElementAge Days ago) - DELETE ELEMENT &FULL_ELM_NAME - FROM ENVIRONMENT &ENV_NAME - SYSTEM &SYS_NAME SUBSYSTEM &SBS_NAME - TYPE &TYPE_NAME STAGE &STG_ID . -//TBLOUT DD SYSOUT=* -//SYSPRINT DD SYSOUT=* -//SYSIN DD DUMMY -//TBLOUT DD SYSOUT=* -//*------------------------------------------------------------------- - - -./ ADD NAME=EXAMPL#2 -//IBMUSER2 JOB (0000), -// 'ENDEVOR JOB',MSGLEVEL=(1,1),CLASS=B,REGION=0M,MSGCLASS=A, -// NOTIFY=&SYSUID -//*------------------------------------------------------------------- -// SET SYSEXEC=CAPRD.NDVR.PROD.CATSNDVR.CEXEC -//*-------------------------------------------------------------- -//*- To Report Packages created over nnn days ago ----------- -//*-------------------------------------------------------------- -//*--------------------------------------------------------------------* -//* STEP 1 -- Execute CSV Utility to gather Package information -//*--------------------------------------------------------------------* -//STEP1 EXEC PGM=NDVRC1,REGION=4M, -// PARM='BC1PCSV0' -//STEPLIB DD DISP=SHR,DSN=CAPRD.NDVR.V160PRD.CSIQAUTU -// DD DISP=SHR,DSN=CAPRD.NDVR.V160PRD.CSIQAUTH -// DD DISP=SHR,DSN=CAPRD.NDVR.V160PRD.CSIQLOAD -//BSTIPT01 DD * -LIST PACKAGE ID '*' - WHERE DATE TYPE CR IS OLDER THAN 20 DAYS - TO DDNAME 'CSVOUTPT' . -//C1MSGS1 DD SYSOUT=* -//BSTERR DD SYSOUT=* -//CSVOUTPT DD DSN=&&CSVFILE, -// DCB=(RECFM=FB,LRECL=1800,BLKSIZE=9000,DSORG=PS), -// DISP=(MOD,PASS), -// SPACE=(CYL,(5,5),RLSE) -//*-------------------------------------------------------------------- -//* SHOWME -- Show the API call results -//*-------------------------------------------------------------------- -//SHOWME EXEC PGM=IEBGENER,REGION=1024K,COND=(4,EQ,STEP1) -//SYSPRINT DD SYSOUT=* MESSAGES -//SYSUT1 DD DSN=&&CSVFILE,DISP=(OLD,PASS) -//SYSUT2 DD SYSOUT=* OUTPUT FILE -//SYSIN DD DUMMY CONTROL STATEMENTS -//SYSUDUMP DD SYSOUT=* -//*-------------------------------------------------------------------- -//REPORT EXEC PGM=IRXJCL,PARM='ENBPIU00 PARMLIST' -//TABLE DD DSN=&&CSVFILE,DISP=(OLD,DELETE) -//PARMLIST DD * - MODEL TBLOUT OPTION0 0 - MODEL TBLOUT OPTIONS A -//HEADING DD * -* Package--------- Status----- CreateDate UpdateDate CreatorId- PackageAge -//*-+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8 -//MODEL DD * -&DetailLine -//OPTION0 DD * - LinesPerPage = 15 - LineCount = LinesPerPage + 1 - DaysAgo = 60 /* Number of days for cutoff */ -//OPTIONS DD * -* Bypass processing for Table header - If $row# < 1 then $SkipRow = 'Y' -* Calculate age of Package creation - BaseDate = DATE('B') /* Today in Base format */ - UpdateDate = Substr(UPDT_DATE,1,4) || Substr(UPDT_DATE,6,2) - UpdateDate = UpdateDate || Substr(UPDT_DATE,9,2) - If DATATYPE(UpdateDate) /= 'NUM' then $SkipRow = 'Y' - BaseOld = DATE(B,UpdateDate,S) /* Convert Upd date to Base fmt */ - PackageAge = BaseDate - BaseOld /* Determine how many days ago */ - If PackageAge < DaysAgo then $SkipRow = 'Y' /* Skip if recent */ -* Build report detail line .... - DetailLine = Copies(' ',120); - DetailLine = Overlay(PKG_ID,DetailLine,03) - DetailLine = Overlay(STATUS,DetailLine,20) - DetailLine = Overlay(CREATE_DATE,DetailLine,32) - DetailLine = Overlay(UPDT_DATE,DetailLine,43) - DetailLine = Overlay(CREATE_USRID,DetailLine,54) - DetailLine = Overlay(PackageAge,DetailLine,65) -* Determine whether it is time for page heading - LineCount = LineCount + 1 - If LineCount > LinesPerPage then x = BuildFromMODEL(HEADING) - If LineCount > LinesPerPage then LineCount = 1 -//SYSEXEC DD DSN=&SYSEXEC,DISP=SHR -//SYSTSPRT DD SYSOUT=* -//SYSPRINT DD SYSOUT=* -//SYSIN DD DUMMY -//TBLOUT DD SYSOUT=* -//*------------------------------------------------------------------- - - -./ ADD NAME=EXAMPL#3 -//IBMUSER3 JOB (0000), -// 'ENDEVOR JOB',MSGLEVEL=(1,1),CLASS=B,REGION=0M,MSGCLASS=A, -// NOTIFY=&SYSUID -//*------------------------------------------------------------------- -// SET SYSEXEC=CAPRD.NDVR.PROD.CATSNDVR.CEXEC -//*-------------------------------------------------------------- -//*- Add members of a PDS into Endevor ----------- -//*-------------------------------------------------------------- -//*------------------------------------------------------------------- -//* STEP 1 - Get a list of members in the dataset -//*------------------------------------------------------------------- -//STEP01 EXEC PGM=IKJEFT1B -//SYSTSIN DD * - LISTDS 'IBMUSER.ENDEVOR.SOURCE' MEMBERS -//SYSPRINT DD SYSOUT=* -//SYSTSPRT DD DSN=&&MBRLIST,DISP=(,PASS), -// SPACE=(CYL,(1,1)),UNIT=SYSDA, -// LRECL=120,RECFM=FB,BLKSIZE=0 -//* -//*--------------------------------------------------------------------* -//* STEP 2 -- Update Rexx Stem array for each member -//*--------------------------------------------------------------------* -//STEP02 EXEC PGM=IRXJCL,PARM='ENBPIU00 A' -//TABLE DD DSN=&&MBRLIST,DISP=(OLD,DELETE) -//POSITION DD * - Member 3 10 -//MODEL DD * - FoundMember.&Member = 'Y' -//OPTIONS DD * - If $row# < 8 then CSVoption = ' ' - If $row# < 8 then $SkipRow = 'Y' /* Skip if recent */ - Member = Strip(Member) - firstchar = Substr(Member,1,1) - if firstchar < 'A' | firstchar > 'Z' then $SkipRow = 'Y' - If $row# > 8 then CSVoption = 'NOCSV' -//SYSEXEC DD DSN=&SYSEXEC,DISP=SHR -//SYSTSPRT DD SYSOUT=* -//SYSIN DD DUMMY -//SYSPRINT DD SYSOUT=* -//TBLOUT DD DSN=&&STEMARRY,DISP=(MOD,PASS), -// SPACE=(CYL,(1,1)),UNIT=SYSDA, -// LRECL=80,RECFM=FB,BLKSIZE=0 -//* -//*-------------------------------------------------------------------- -//* SHOWME -- Show the Stem array settings -//*-------------------------------------------------------------------- -//SHOWME EXEC PGM=IEBGENER,REGION=1024K -//SYSPRINT DD SYSOUT=* MESSAGES -//SYSUT1 DD DSN=&&STEMARRY,DISP=(OLD,PASS) -//SYSUT2 DD SYSOUT=* OUTPUT FILE -//SYSIN DD DUMMY CONTROL STATEMENTS -//SYSUDUMP DD SYSOUT=* -//*--------------------------------------------------------------------* -//* STEP 3 -- Execute CSV Utility to locate inventory -//*--------------------------------------------------------------------* -//STEP03 EXEC PGM=NDVRC1,REGION=4M, -// PARM='BC1PCSV0' -//STEPLIB DD DISP=SHR,DSN=CAPRD.NDVR.V160PRD.CSIQAUTU -// DD DISP=SHR,DSN=CAPRD.NDVR.V160PRD.CSIQAUTH -// DD DISP=SHR,DSN=CAPRD.NDVR.V160PRD.CSIQLOAD -//BSTIPT01 DD * - LIST ELEMENT '*' FROM ENVIRONMENT SMPLPROD STAGE P - SYSTEM '*' SUBSYSTEM '*' TYPE "*" - OPTIONS NOSEARCH TO FILE CSVOUTPT . -//C1MSGS1 DD SYSOUT=* -//BSTERR DD SYSOUT=* -//CSVOUTPT DD DSN=&&CSVFILE, -// DCB=(RECFM=FB,LRECL=1800,BLKSIZE=9000,DSORG=PS), -// DISP=(MOD,PASS), -// SPACE=(CYL,(5,5),RLSE) -//*-------------------------------------------------------------------- -//* SHOWME -- Show the API call results -//*-------------------------------------------------------------------- -//SHOWME EXEC PGM=IEBGENER,REGION=1024K -//SYSPRINT DD SYSOUT=* MESSAGES -//SYSUT1 DD DSN=&&CSVFILE,DISP=(OLD,PASS) -//SYSUT2 DD SYSOUT=* OUTPUT FILE -//SYSIN DD DUMMY CONTROL STATEMENTS -//SYSUDUMP DD SYSOUT=* -//*-------------------------------------------------------------------- -//* -//STEP04 EXEC PGM=IRXJCL,PARM='ENBPIU00 PARMLIST' -//TABLE DD DSN=&&CSVFILE,DISP=(OLD,DELETE) -//PARMLIST DD * - NOTHING NOTHING STEMARRY 0 - MODEL TBLOUT OPTIONS A -//STEMARRY DD * < Build Stem Array FoundMember. - FoundMember. = 'N' -// DD DSN=&&STEMARRY,DISP=(OLD,DELETE) -//NOTHING DD DUMMY -//MODEL DD * -** &ELM_NAME &SYS_NAME &SBS_NAME &TYPE_NAME &SIGNOUT_ID - ADD ELEMENT &ELM_NAME - TO ENVIRONMENT SMPLTEST - SYSTEM &SYS_NAME SUBSYSTEM &SBS_NAME - TYPE &TYPE_NAME. -//OPTIONS DD * - ELM_NAME = Strip(ELM_NAME) - If FoundMember.ELM_NAME /= 'Y' then $SkipRow = 'Y' -//SYSEXEC DD DSN=&SYSEXEC,DISP=SHR -//SYSTSPRT DD SYSOUT=* -//SYSPRINT DD SYSOUT=* -//SYSIN DD DUMMY -//TBLOUT DD SYSOUT=* -//*------------------------------------------------------------------- - - -./ ADD NAME=EXAMPL#4 -//IBMUSER4 JOB (0000), JOB04207 -// 'ENDEVOR BATCH',MSGLEVEL=(1,1),CLASS=B,REGION=0M,MSGCLASS=A, -// NOTIFY=&SYSUID -//*-------------------------------------------------------------------* -//*-- Execute PDM to update elements out of sync. --------------------* -//*-- Outputs: IBMUSER.ENDEVOR.WIPFILE --------------------* -//*-------------------------------------------------------------------* -// SET SYSEXEC=SYS1.EXEC -// SET SYSEXEC=CAPRD.NDVR.PROD.CATSNDVR.CEXEC -//*-------------------------------------------------------------------* -//PDM#001 EXEC PGM=NDVRC1, -// DYNAMNBR=1500, -// REGION=4096K, -// PARM='C1BM3000' -//STEPLIB DD DISP=SHR,DSN=CAPRD.NDVR.V160PRD.CSIQAUTU -// DD DISP=SHR,DSN=CAPRD.NDVR.V160PRD.CSIQAUTH -// DD DISP=SHR,DSN=CAPRD.NDVR.V160PRD.CSIQLOAD -//CONLIB DD DISP=SHR,DSN=CAPRD.NDVR.V160PRD.CSIQLOAD -//C1MSGS1 DD SYSOUT=* -//C1MSGS2 DD DSN=&&C1MSGS2,DISP=(NEW,PASS), -// UNIT=SYSDA,SPACE=(TRK,(5,5)), -// DCB=(RECFM=FB,LRECL=120,BLKSIZE=0) -//SYSUDUMP DD SYSOUT=* -//SYMDUMP DD DUMMY -//SYSOUT DD SYSOUT=* -//SYSPRINT DD SYSOUT=* -//BSTIPT01 DD * - VALIDATE ELEMENT "*" - FROM ENVIRONMENT "SMPLTEST" - SYSTEM "*" SUBSYSTEM "*" - TYPE "*" STAGE "T" - . -//*-------------------------------------------------------------------* -//* -//SHOWME EXEC PGM=IEBGENER,REGION=1024K -//SYSPRINT DD SYSOUT=* MESSAGES -//SYSUT1 DD DSN=&&C1MSGS2,DISP=(OLD,PASS) -//SYSUT2 DD SYSOUT=* OUTPUT FILE -//SYSIN DD DUMMY CONTROL STATEMENTS -//SYSUDUMP DD SYSOUT=* -//*-------------------------------------------------------------------* -//PDM#002 EXEC PGM=IRXJCL,PARM='ENBPIU00 M 0008' -//SYSEXEC DD DSN=&SYSEXEC,DISP=SHR -//TABLE DD DSN=&&C1MSGS2,DISP=(OLD,DELETE) -//POSITION DD * - NDVRrc 40 43 - Element 22 29 - Environ 47 54 - System 61 68 - SubSys 71 78 - Type 83 90 - Stage 94 94 -//MODEL DD * - LIST ELEMENT &Element FROM ENVIRONMENT &Environ STAGE &Stage - SYSTEM '&System' SUBSYSTEM '&SubSys' TYPE "&Type" - OPTIONS NOSEARCH TO FILE APIEXTR . -//SYSTSPRT DD SYSOUT=* -//SYSPRINT DD SYSOUT=* -//OPTIONS DD DUMMY -//TBLOUT DD DSN=&&CSVLISTS,DISP=(NEW,PASS), -// UNIT=SYSDA,SPACE=(TRK,(1,1)), -// DCB=(RECFM=FB,LRECL=080,BLKSIZE=08000) -//*--------------------------------------------------------------------* -//* STEP 2 -- EXECUTE CSV UTILITY -//*--------------------------------------------------------------------* -//PDM#003 EXEC PGM=NDVRC1,REGION=4M, -// PARM='BC1PCSV0' -//STEPLIB DD DISP=SHR,DSN=CAPRD.NDVR.V160PRD.CSIQAUTU -// DD DISP=SHR,DSN=CAPRD.NDVR.V160PRD.CSIQAUTH -// DD DISP=SHR,DSN=CAPRD.NDVR.V160PRD.CSIQLOAD -//CONLIB DD DISP=SHR,DSN=CAPRD.NDVR.V160PRD.CSIQLOAD -//BSTIPT01 DD DSN=&&CSVLISTS,DISP=(OLD,DELETE) -//APIEXTR DD DSN=&&CSVFILE, -// DCB=(RECFM=FB,LRECL=1800,BLKSIZE=9000,DSORG=PS), -// DISP=(MOD,PASS), -// SPACE=(TRK,(5,1),RLSE) -//C1MSGS1 DD SYSOUT=* -//BSTERR DD SYSOUT=* -//*-------------------------------------------------------------------- -//*-------------------------------------------------------------------- -//SHOWME EXEC PGM=IEBGENER,REGION=1024K -//SYSPRINT DD SYSOUT=* MESSAGES -//SYSUT1 DD DSN=&&CSVFILE,DISP=(OLD,PASS) -//SYSUT2 DD SYSOUT=* OUTPUT FILE -//SYSIN DD DUMMY CONTROL STATEMENTS -//SYSUDUMP DD SYSOUT=* -//*-------------------------------------------------------------------* -//PDM#004 EXEC PGM=IRXJCL,PARM='ENBPIU00 A' -//SYSEXEC DD DSN=&SYSEXEC,DISP=SHR -//TABLE DD DSN=&&CSVFILE,DISP=(OLD,DELETE) -//MODEL DD DISP=SHR,DSN=IBMUSER.MODELS(PDM#ELM) -//OPTIONS DD * - jobchar = Substr(ELM NAME,1,1) /* First char of element name */ - jobchar = 'P' /* for PDM */ - Userid = USERID() - $delimiter = '/' -//SYSTSPRT DD SYSOUT=* -//TBLOUTX DD SYSOUT=* -//TBLOUT DD SYSOUT=(A,INTRDR) -//*-------------------------------------------------------------------* - - -./ ADD NAME=EXAMPL#5 -//IBMUSER5 JOB (0000),'ENDEVOR JOB',MSGLEVEL=(1,1),CLASS=B, -// REGION=0M,MSGCLASS=A,NOTIFY=&SYSUID -//*-------------------------------------------------------------------- -//*- Report the total Track consumption of a list of datasets --------- -//*- in a list created from a saved TSO 3.4 list. --------- -//*- Also identify and delete old datasets . --------- -//*- (RC=0004 is OK) --------- -//*-------------------------------------------------------------------- -// SET TABLE=IBMUSER.NDVR.DATASETS <- Saved 3.4 data -// SET TABLE=IBMUSER.PUBLIC.DATASETS <- Saved 3.4 data -// SET SYSEXEC=SYS1.EXEC <- Rexx library -// SET SYSEXEC=CAPRD.NDVR.EMER.CATSNDVR.CSIQCLS0 -//*-------------------------------------------------------------------- -//TEST001 EXEC PGM=IRXJCL,PARM='ENBPIU00 PARMLIST' -//TABLE DD DISP=SHR,DSN=&TABLE -//PARMLIST DD * - NOTHING NOTHING OPTIONS0 0 - MODEL1 TBLOUT1 OPTIONS1 A - MODEL2 TBLOUT2 OPTIONS2 A -//POSITION DD * - Dataset 01 44 - Dsorg 53 54 - Tracks 80 88 - CreateDate 108 117 - AccessDate 130 139 -//OPTIONS0 DD * - $StripData = 'N' ; /* Preserve spaces */ - BaseDate = DATE('B') /* Today in Base format */ - DaysAgo = 240 /* Number of days for cutoff */ - Total=0 /* Initialize variable */ -//OPTIONS1 DD * -* Determine how old is the dataset - Parse Var CreateDate yr '/' mo '/' da - date = yr || mo || da - If DATATYPE(date) /= 'NUM' then $SkipRow = 'Y' - BaseOld = DATE(B,date,S) /* Convert Upd date to Base fmt */ - ElementAge = BaseDate - BaseOld /* Determine how many days ago */ - ElementAge = Right(ElementAge,4,'0') /* For fixed width */ - If ElementAge < DaysAgo then $SpitRow = 'Y' /* Skip if recent */ -//OPTIONS2 DD * -* Calculate a running count of Tracks consumed - If $row#<1 then $SkipRow = 'Y' - If DATATYPE(Tracks) /= 'NUM' Then $SkipRow = 'Y' - Total = Total + Tracks - Total = Right(Total,8,'0') /* For fixed width */ - Tracks = Right(Tracks,6,'0') /* For fixed width */ - If Total > 1000 then $my_rc = 2 - If Total > 5000 then $my_rc = 4 -//MODEL1 DD * -&Dataset Date=&CreateDate DaysOld=&ElementAge -//MODEL2 DD * -&Dataset Total=&Total Tracks=&Tracks -//TBLOUT1 DD SYSOUT=* -//SYSEXEC DD DISP=SHR,DSN=&SYSEXEC -//TBLOUT2 DD SYSOUT=* -//SYSTSPRT DD SYSOUT=* -//SYSPRINT DD SYSOUT=* -//DISPLAYS DD SYSOUT=* -//SYSTSIN DD DUMMY -//*-------------------------------------------------------------------- - - -./ ADD NAME=EXAMPL#6 -//IBMUSER5 JOB (0000),'ENDEVOR JOB',MSGLEVEL=(1,1),CLASS=B, -// REGION=0M,MSGCLASS=A,NOTIFY=&SYSUID -//*-------------------------------------------------------------------- -//*- SYS1.EXEC(ALLOLIKE) -//*-------------------------------------------------------------------- -// SET DSNLIST=IBMUSER.MYLIST.DATASETS <- -// SET DSNLIST=IBMUSER.CAPRD.DATASETS <- -// SET DSNLIST=IBMUSER.TESTING.DATASETS <- -// SET SYSEXEC=SYS1.EXEC <- -//*-------------------------------------------------------------------- -//*- IBMUSER.JCL(EXAMPL#5) -------------------------------------------- -//*-------------------------------------------------------------------- -//BUILDS EXEC PGM=IRXJCL,PARM='ENBPIU00 PARMLIST' -//SYSEXEC DD DISP=SHR,DSN=&SYSEXEC -//TABLE DD DISP=SHR,DSN=&DSNLIST -//PARMLIST DD * - MODEL1 TBLOUT1 OPTIONS 180 - MODEL2 TBLOUT2 OPTIONS 180 - MODEL3 TBLOUT3 OPTIONS 180 -//MODEL1 DD * - ALLOC F(INDD) + - DA('&Dataset') SHR REUSE - ALLOC F(OUTDD) + - DA('&Dataset.NEW') + - NEW LIKE ('&Dataset') + - DSNTYPE(LIBRARY) - CALL *(IEBCOPY) - FREE F(INDD) - FREE F(OUTDD) -//MODEL2 DD * - RENAME '&Dataset' + - '&Dataset.OLD' - RENAME '&Dataset.NEW' + - '&Dataset' -//MODEL3 DD * - DELETE '&Dataset.OLD' -//OPTIONS DD * - If Dsorg /= 'PO' then $SkipRow = 'Y' -//POSITION DD * - Dataset 01 44 - Dsorg 53 56 - Tracks 80 88 - CreateDate 108 117 - AccessDate 130 139 -//SYSTSPRT DD SYSOUT=* -//NOTUSED DD DATA,DLM=QQ -//TBLOUT1 DD SYSOUT=* -//TBLOUT2 DD SYSOUT=* -//TBLOUT3 DD SYSOUT=* -// -QQ -//TBLOUT1 DD DSN=&&TBLOUT1,DISP=(NEW,PASS), -// SPACE=(CYL,(1,1)),UNIT=SYSDA, -// LRECL=80,RECFM=FB,BLKSIZE=0 -//TBLOUT2 DD DSN=&&TBLOUT2,DISP=(NEW,PASS), -// SPACE=(CYL,(1,1)),UNIT=SYSDA, -// LRECL=80,RECFM=FB,BLKSIZE=0 -//TBLOUT3 DD DSN=&&TBLOUT3,DISP=(NEW,PASS), -// SPACE=(CYL,(1,1)),UNIT=SYSDA, -// LRECL=80,RECFM=FB,BLKSIZE=0 -//*-------------------------------------------------------------------- -//ALLOCS EXEC PGM=IKJEFT1B -//SYSTSIN DD DSN=&&TBLOUT1,DISP=(OLD,DELETE) -//SYSIN DD * - COPY INDD=INDD,OUTDD=OUTDD -//SYSUT2 DD UNIT=SYSDA,SPACE=(CYL,(90,90)) -//SYSUT3 DD UNIT=SYSDA,SPACE=(CYL,(90,90)) -//SYSUT4 DD UNIT=SYSDA,SPACE=(CYL,(90,90)) -//SYSUT5 DD UNIT=SYSDA,SPACE=(CYL,(90,90)) -//SYSUT6 DD UNIT=SYSDA,SPACE=(CYL,(90,90)) -//SYSTSPRT DD SYSOUT=* -//SYSPRINT DD SYSOUT=* -//*-------------------------------------------------------------------- -//RENAMES EXEC PGM=IKJEFT1B -//SYSTSIN DD DSN=&&TBLOUT2,DISP=(OLD,DELETE) -//SYSTSPRT DD SYSOUT=* -//SYSPRINT DD SYSOUT=* -//*-------------------------------------------------------------------- -//DELETES EXEC PGM=IKJEFT1B -//SYSTSIN DD DSN=&&TBLOUT3,DISP=(OLD,DELETE) -//SYSTSPRT DD SYSOUT=* -//SYSPRINT DD SYSOUT=* -//*-------------------------------------------------------------------- -// -//TEST001 EXEC PGM=IRXJCL,PARM='ENBPIU00 PARMLIST' -//SYSEXEC DD DISP=SHR,DSN=&SYSEXEC -//TABLE DD DISP=SHR,DSN=IBMUSER.DSNLIST.DATASETS -//PARMLIST DD * - NOTHING NOTHING OPTIONS0 0 - MODEL1 TBLOUT1 OPTIONS1 A - MODEL2 TBLOUT2 OPTIONS2 A -//POSITION DD * - Dataset 01 44 - Dsorg 53 54 - Tracks 80 88 - CreateDate 108 117 - AccessDate 130 139 -//OPTIONS0 DD * - $StripData = 'N' ; /* Preserve spaces */ - BaseDate = DATE('B') /* Today in Base format */ - DaysAgo = 240 /* Number of days for cutoff */ - Total=0 /* Initialize variable */ -//OPTIONS1 DD * -* Determine how old is the dataset - Parse Var CreateDate yr '/' mo '/' da - date = yr || mo || da - If DATATYPE(date) /= 'NUM' then $SkipRow = 'Y' - BaseOld = DATE(B,date,S) /* Convert Upd date to Base fmt */ - ElementAge = BaseDate - BaseOld /* Determine how many days ago */ - ElementAge = Right(ElementAge,4,'0') /* For fixed width */ - If ElementAge < DaysAgo then $SpitRow = 'Y' /* Skip if recent */ -//OPTIONS2 DD * -* Calculate a running count of Tracks consumed - If $row#<1 then $SkipRow = 'Y' - If DATATYPE(Tracks) /= 'NUM' Then $SkipRow = 'Y' - Total = Total + Tracks - Total = Right(Total,6,'0') /* For fixed width */ - Tracks = Right(Tracks,6,'0') /* For fixed width */ - If Total > 1000 then $my_rc = 2 - If Total > 5000 then $my_rc = 4 -//MODEL1 DD * -&Dataset Date=&CreateDate DaysOld=&ElementAge -//MODEL2 DD * -&Dataset Total=&Total Tracks=&Tracks -//TBLOUT1 DD SYSOUT=* -//TBLOUT2 DD SYSOUT=* -//SYSTSPRT DD SYSOUT=* -//SYSPRINT DD SYSOUT=* -//DISPLAYS DD SYSOUT=* -//SYSTSIN DD DUMMY -//*-------------------------------------------------------------------- - - -./ ADD NAME=EXAMPL#7 - - -./ ADD NAME=EXAMPL#8 -//IBMUSERE JOB (0000), 00010000 -// 'ENDEVOR JOB',MSGLEVEL=(1,1),CLASS=B,REGION=0M,MSGCLASS=A, 00030000 -// NOTIFY=&SYSUID 00040000 -//*------------------------------------------------------------------- 00050000 -// SET WORKLIB=IBMUSER.PARMS 00060000 -// SET CSIQCLS0=CAPRD.NDVR.PROD.CATSNDVR.CSIQCLS0 00070000 -// SET NDVR#HLQ=CAPRD.NDVR.V180CA06 00080000 -//*------------------------------------------------------------------- 00090000 -//* Report processor usage 00100000 -//* Outputs: 00110000 -//* &WORKLIB(PRC#ENV1) IBMUSER.PARMS(PRC#ENV1) 00120000 -//* &WORKLIB(PRC#ENV2) IBMUSER.PARMS(PRC#ENV2) 00130000 -//* &WORKLIB(PRC#GRPS) IBMUSER.PARMS(PRC#GRPS) 00140000 -//* &WORKLIB(PROCUSED) IBMUSER.PARMS(PROCUSED) 00150000 -//* &WORKLIB(NOTUSED)) IBMUSER.PARMS(NOTUSED)) 00160000 -//*------------------------------------------------------------------- 00170000 -//* STEP 1 -- EXECUTE CSV UTILITY to Gather Environment info 00180000 -//*------------------------------------------------------------------- 00190000 -//STEP1 EXEC PGM=NDVRC1,REGION=4M, 00200000 -// PARM='BC1PCSV0' 00210000 -//STEPLIB DD DISP=SHR,DSN=&NDVR#HLQ..CSIQAUTU SCMM@LIB 00220000 -// DD DISP=SHR,DSN=&NDVR#HLQ..CSIQAUTH SCMM@LIB 00230000 -// DD DISP=SHR,DSN=&NDVR#HLQ..CSIQLOAD SCMM@LIB 00240000 -//CONLIB DD DISP=SHR,DSN=&NDVR#HLQ..CSIQLOAD SCMM@LIB 00250000 -//BSTIPT01 DD * 00260000 -LIST ENVIRONMENT 00270000 -'*' 00280000 - TO DDNAME 'EXTRACTS' 00290000 - OPTIONS RETURN ALL. 00300000 -//EXTRACTS DD DSN=&&EXTRACTS, 00310000 -// DCB=(RECFM=FB,LRECL=1800,BLKSIZE=9000,DSORG=PS), 00320000 -// DISP=(NEW,PASS), 00330000 -// SPACE=(TRK,(5,1),RLSE) 00340000 -//C1MSGS1 DD SYSOUT=* 00350000 -//BSTERR DD SYSOUT=* 00360000 -//*------ 00370000 -//WORKLIB DD DSN=&WORKLIB, 00380000 -// DCB=(RECFM=FB,LRECL=080,BLKSIZE=0,DSORG=PO), 00390000 -// DISP=(MOD,CATLG,KEEP),DSNTYPE=LIBRARY, 00400000 -// SPACE=(TRK,(5,5),RLSE) 00410000 -//*-------------------------------------------------------------------- 00420000 -//*------ Reformat Envionments into CSV requests for Procesor Grp info- 00430000 -//*-------------------------------------------------------------------- 00440000 -//STEP1A EXEC PGM=IRXJCL,PARM='ENBPIU00 A' 00450000 -//TABLE DD DSN=&&EXTRACTS,DISP=(OLD,DELETE) 00460000 -//SYSEXEC DD DISP=SHR,DSN=&CSIQCLS0 00470000 -//MODEL1 DD * 00480000 - LIST PROCESSOR GROUP '*' 00490000 - FROM ENVIRONMENT '&ENV_NAME' STAGE '*' 00500000 - SYSTEM '*' TYPE '*' 00510000 - OPTIONS NOSEARCH RETURN ALL TO FILE CSVEXTR . 00520000 -//MODEL2 DD * 00530000 -LIST ELEMENT 00540000 -'*' 00550000 - FROM ENVIRONMENT &ENV_NAME SYSTEM '*' SUBSYSTEM '*' 00560000 - TYPE 'PROCESS' 00570000 - STAGE NUMBER '*' 00580000 - TO DDNAME 'LISTELMS' 00590000 - OPTIONS SEARCH RETURN FIRST PATH PHYSICAL . 00600000 -//OPTIONS DD * CONTROL STATEMENTS 00610000 - $NumberModelsAndTblouts= 2 00620000 -//SYSTSPRT DD SYSOUT=* 00630000 -//TBLOUT1 DD DISP=SHR,DSN=&WORKLIB(PRC#ENV1) 00640000 -//TBLOUT2 DD DISP=SHR,DSN=&WORKLIB(PRC#ENV2) 00650000 -//* 00660000 -//*------------------------------------------------------------------- 00670000 -//* STEP 2 -- EXECUTE CSV UTILITY to collect processor group info 00680000 -//*------------------------------------------------------------------- 00690000 -//STEP2 EXEC PGM=NDVRC1,REGION=4M, 00700000 -// PARM='BC1PCSV0' 00710000 -//STEPLIB DD DISP=SHR,DSN=&NDVR#HLQ..CSIQAUTU SCMM@LIB 00720000 -// DD DISP=SHR,DSN=&NDVR#HLQ..CSIQAUTH SCMM@LIB 00730000 -// DD DISP=SHR,DSN=&NDVR#HLQ..CSIQLOAD SCMM@LIB 00740000 -//CONLIB DD DISP=SHR,DSN=&NDVR#HLQ..CSIQLOAD SCMM@LIB 00750000 -//BSTIPT01 DD DISP=SHR,DSN=&WORKLIB(PRC#ENV1) 00760000 -//CSVEXTR DD DSN=&&CSVFILE, 00770000 -// DCB=(RECFM=VB,LRECL=4092,BLKSIZE=4096,DSORG=PS), 00780000 -// DISP=(MOD,PASS), 00790000 -// SPACE=(TRK,(5,5),RLSE) 00800000 -//C1MSGS1 DD SYSOUT=* 00810000 -//BSTERR DD SYSOUT=* 00820000 -//*-------------------------------------------------------------------- 00830000 -//*------ Analyze Processor Group CSV data 00840000 -//*-------------------------------------------------------------------- 00850000 -//STEP2A EXEC PGM=IRXJCL,PARM='ENBPIU00 PARMLIST' 00860000 -//TABLE DD DSN=&&CSVFILE,DISP=(OLD,DELETE) 00870000 -//PARMLIST DD * 00880000 - NOTHING NOTHING OPTIONS0 0 00890000 - NOTHING NOTHING OPTIONS1 A 00900000 - HEADING TBLOUT1 NOTHING 1 00910000 - MODEL TBLOUT2 OPTIONS2 A 00920000 - IAMUSED PROCUSED OPTIONS3 A 00930000 -//HEADING DD * 00940000 -*Processr Environ- S System-- Type---- PrcGrp-- ProcType 00950000 -//MODEL DD * 00960000 - &PROC_NAME &ENV_NAME &STG_ID &SYS_NAME &TYPE_NAME &PROC_GRP_NAME &PROC_00970000 -//OPTIONS0 DD * CONTROL STATEMENTS 00980000 - Processor. = '' 00990000 - ProcessorUsed. = 'N' 01000000 - $nomessages = 'Y' /* Bypass messages Y/N */ 01010000 -//OPTIONS1 DD * CONTROL STATEMENTS 01020000 - if PROC_NAME = '*NOPROC*' Then $SkipRow = 'Y' 01030000 - entry= ENV_NAME SYS_NAME TYPE_NAME STG_ID PROC_TYPE PROC_GRP_NAME 01040000 - entry = Translate(entry,'_',' ') 01050000 - PROC_NAME = Strip(PROC_NAME) ; 01060000 - If Wordpos(entry,Processor.PROC_NAME) = 0 then, + 01070000 - Processor.PROC_NAME = Processor.PROC_NAME entry ; 01080000 - ProcessorUsed.PROC_NAME = 'Y' 01090000 - $SkipRow = 'Y' 01100000 -//IAMUSED DD * CONTROL STATEMENTS 01110000 - ProcessorUsed.&PROC_NAME = 'Y' 01120000 -//PROCUSED DD DISP=SHR,DSN=&WORKLIB(PROCUSED) 01130000 -//NOTHING DD DUMMY CONTROL STATEMENTS 01140000 -//OPTIONS2 DD * CONTROL STATEMENTS 01150000 - PROC_NAME = Strip(PROC_NAME) ; 01160000 - if PROC_NAME = '*NOPROC*' Then $SkipRow = 'Y' 01170000 - ProcessorEntries = Processor.PROC_NAME ; 01180000 - Processor.PROC_NAME = '' ; 01190000 - If ProcessorEntries = '' then $SkipRow = 'Y' 01200000 - PROC_NAME = Left(PROC_NAME,8) ; 01210000 - Do ent# = 1 to Words(ProcessorEntries); + 01220000 - entry= Word(ProcessorEntries,ent#) ; + 01230000 - entry = Translate(entry,' ','_') ; + 01240000 - ENV_NAME = Left(Word(entry,1),8); + 01250000 - SYS_NAME = Left(Word(entry,2),8); + 01260000 - TYPE_NAME = Left(Word(entry,3),8); + 01270000 - STG_ID = Left(Word(entry,4),1); + 01280000 - PROC_TYPE = Left(Word(entry,5),8); + 01290000 - PROC_GRP_NAME = Left(Word(entry,6),8); + 01300000 - x = BuildFromModel(MODEL); + 01310000 - Processor.PROC_NAME = '' ;+ 01320000 - End; 01330000 - $SkipRow = 'Y' 01340000 -//OPTIONS3 DD * CONTROL STATEMENTS 01350000 - PROC_NAME = Strip(PROC_NAME); 01360000 - If PROC_NAME = '*NOPROC*' then $SkipRow = 'Y' ; 01370000 - IsProcessorUsed = ProcessorUsed.PROC_NAME 01380000 - If IsProcessorUsed = 'Y' then x = BuildFromModel(IAMUSED) 01390000 - ProcessorUsed.PROC_NAME = 'done' 01400000 - $SkipRow = 'Y' 01410000 -//SYSTSPRT DD SYSOUT=* 01420000 -//NOTHING DD DUMMY CONTROL STATEMENTS 01430000 -//SYSEXEC DD DISP=SHR,DSN=&CSIQCLS0 01440000 -//TBLOUT1 DD DSN=&&TBLOUT1,DISP=(NEW,PASS), 01450000 -// UNIT=SYSALLDA,SPACE=(CYL,(1,5),RLSE), 01460000 -// DCB=(RECFM=FB,LRECL=080,BLKSIZE=0,DSORG=PS) 01470000 -//TBLOUT2 DD DSN=&&TBLOUT2,DISP=(NEW,PASS), 01480000 -// UNIT=SYSALLDA,SPACE=(CYL,(1,5),RLSE), 01490000 -// DCB=(RECFM=FB,LRECL=080,BLKSIZE=0,DSORG=PS) 01500000 -//********************************************************************* 01510000 -//* SORT DATA * 01520000 -//********************************************************************* 01530000 -//SORT EXEC PGM=SORT 01540000 -//SYSPRT DD SYSOUT=* 01550000 -//SYSPRINT DD SYSOUT=* 01560000 -//SYSOUT DD SYSOUT=* 01570000 -//SORTIN DD DSN=&&TBLOUT2,DISP=(OLD,PASS,DELETE) 01580000 -//SORTOUT DD DSN=&&TBLOUT2A,DISP=(NEW,PASS), 01590000 -// UNIT=SYSALLDA,SPACE=(CYL,(1,5),RLSE), 01600000 -// DCB=(RECFM=FB,LRECL=080,BLKSIZE=0,DSORG=PS) 01610000 -//SYSIN DD * 01620000 - SORT FIELDS=(01,80,CH,A) 01630000 -//* 01640000 -//*-------------------------------------------------------------------- 01650000 -//SAVEMBR EXEC PGM=IEBGENER,REGION=1024K 01660000 -//SYSPRINT DD SYSOUT=* MESSAGES 01670000 -//SYSUT1 DD DSN=&&TBLOUT1,DISP=(OLD,PASS,DELETE) 01680000 -// DD DSN=&&TBLOUT2A,DISP=(OLD,PASS,DELETE) 01690000 -//SYSIN DD DUMMY CONTROL STATEMENTS 01700000 -//SYSUDUMP DD SYSOUT=* 01710000 -//SYSUT2 DD DISP=SHR,DSN=&WORKLIB(PRC#GRPS) 01720000 -//* 01730000 -//*-------------------------------------------------------------------- 01740000 -//*------ Report UnUsed processors. 01750000 -//*------------------------------------------------------------------- 01760000 -//* STEP 3 -- EXECUTE CSV UTILITY 01770000 -//*------------------------------------------------------------------- 01780000 -//STEP3 EXEC PGM=NDVRC1,REGION=4M, 01790000 -// PARM='BC1PCSV0' 01800000 -//STEPLIB DD DISP=SHR,DSN=&NDVR#HLQ..CSIQAUTU 01810000 -// DD DISP=SHR,DSN=&NDVR#HLQ..CSIQAUTH 01820000 -// DD DISP=SHR,DSN=&NDVR#HLQ..CSIQLOAD 01830000 -//BSTIPT01 DD DISP=SHR,DSN=&WORKLIB(PRC#ENV2) 01840000 -//LISTELMS DD DSN=&&LISTELMS, 01850000 -// DCB=(RECFM=FB,LRECL=1800,BLKSIZE=9000,DSORG=PS), 01860000 -// DISP=(MOD,PASS), 01870000 -// SPACE=(CYL,(5,5),RLSE) 01880000 -//C1MSGS1 DD SYSOUT=* 01890000 -//BSTERR DD SYSOUT=* 01900000 -//*-------------------------------------------------------------------- 01910000 -//*------ Report UnUsed processors. 01920000 -//*-------------------------------------------------------------------- 01930000 -//STEP3A EXEC PGM=IRXJCL,PARM='ENBPIU00 PARMLIST' 01940000 -//TABLE DD DSN=&&LISTELMS,DISP=(OLD,DELETE) 01950000 -//PARMLIST DD * 01960000 - NOTHING NOTHING OPTIONS0 0 01970000 - HEADING NOTUSED PROCUSED 1 01980000 - MODEL NOTUSED OPTIONS2 A 01990000 -//OPTIONS0 DD * 02000000 - ProcessorUsed. = 'N' 02010000 - $nomessages = 'Y' /* Bypass messages Y/N */ 02020000 -//PROCUSED DD DISP=SHR,DSN=&WORKLIB(PROCUSED) 02030000 -//HEADING DD * 02040000 -*Element- Environ- System-- SubSystm Type---- St Msg------ 02050000 -//MODEL DD * 02060000 - &ELM_NAME &ENV_NAME &SYS_NAME &SBS_NAME &TYPE_NAME &STG_ID not used 02070000 -//OPTIONS2 DD * CONTROL STATEMENTS 02080000 - element = Strip(ELM_NAME) 02090000 - If Words(element) > 1 then $SkipRow = 'Y' 02100000 - IsProcessorUsed = ProcessorUsed.element 02110000 - If IsProcessorUsed /= 'N' then $SkipRow = 'Y' 02120000 - ProcessorUsed.element = 'done' 02130000 -* Format outputs 02140000 - ELM_NAME = Left(ELM_NAME,8) 02150000 - ENV_NAME = Left(ENV_NAME,8) 02160000 - SYS_NAME = Left(SYS_NAME,8) 02170000 - SBS_NAME = Left(SBS_NAME,8) 02180000 - TYPE_NAME = Left(TYPE_NAME,8) 02190000 -//SYSTSPRT DD SYSOUT=* 02200000 -//NOTHING DD DUMMY CONTROL STATEMENTS 02210000 -//SYSEXEC DD DISP=SHR,DSN=&CSIQCLS0 02220000 -//TBLOUT DD SYSOUT=* 02230000 -//NOTUSED DD DISP=SHR,DSN=&WORKLIB(NOTUSED) 02240000 -//*-------------------------------------------------------------------- 02250000 - - -./ ADD NAME=EXAMPL1A -//EXAMPL1A JOB (0000),'ENDEVOR JOB',MSGLEVEL=(1,1), JOB0 -// CLASS=B,REGION=0M,MSGCLASS=A,NOTIFY=&SYSUID -//*--------------------------------------------------------------------* -//*- Report Elements in DEV signed out to one userid -//*--------------------------------------------------------------------* -// JCLLIB ORDER=(YOURSITE.NDVR.TEAM.JCL) -//RUNCSV EXEC PGM=NDVRC1,REGION=4M, -// PARM='BC1PCSV0' -// INCLUDE MEMBER=STEPLIB -//BSTIPT01 DD * -LIST ELEMENT '*' - FROM ENVIRONMENT PRD SYSTEM '*' SUBSYSTEM '*' - TYPE '*' STAGE NUMBER 2 - DATA ALL TO DDNAME 'CSVOUTPT' - OPTIONS NOSEARCH. -//C1MSGS1 DD SYSOUT=* -//BSTERR DD SYSOUT=* -//CSVOUTPT DD DSN=&&CSVFILE, -// DCB=(RECFM=FB,LRECL=800,BLKSIZE=8000,DSORG=PS), -// DISP=(MOD,PASS),UNIT=3390, -// SPACE=(CYL,(5,5),RLSE) -//*-Report ----------------------------------------------------------- -//REPORT EXEC PGM=IRXJCL,PARM='ENBPIU00 A' -//OPTIONS DD * - $Table_Type = "CSV" - If ELM_LAST_LL_USRID /= 'NSIMEON' then $SkipRow = 'Y' -//MODEL DD * - &ELM_LAST_LL_USRID (ELM_LAST_LL_USRID) Element = &ELM_NAME - System/Subsys/Type = &SYS_NAME/&SBS_NAME/&TYPE_NAME/ - ELM_LAST_LL_DATE=&ELM_LAST_LL_DATE @ &ELM_LAST_LL_TIME -//TABLE DD DSN=&&CSVFILE,DISP=(OLD,DELETE) -//SYSTSPRT DD SYSOUT=* -//SYSEXEC DD DISP=SHR,DSN=CARSMINI.NDVR.R1801.CSIQCLS0 -//TBLOUT DD SYSOUT=* - - -./ ADD NAME=EXAMPL1B -//EXAMPL1B JOB (0000),'ENDEVOR JOB',MSGLEVEL=(1,1), JOB0 -// CLASS=B,REGION=0M,MSGCLASS=A,NOTIFY=&SYSUID -//*--------------------------------------------------------------------* -//*- Report Elements in DEV, flagging those in parallel development -//*--------------------------------------------------------------------* -// JCLLIB ORDER=(YOURSITE.NDVR.TEAM.JCL) -//RUNCSV EXEC PGM=NDVRC1,REGION=4M, -// PARM='BC1PCSV0' -// INCLUDE MEMBER=STEPLIB -//BSTIPT01 DD *,SYMBOLS=JCLONLY <- Permits JCL variables here -LIST ELEMENT '*' - FROM ENVIRONMENT DEV SYSTEM '*' SUBSYSTEM '*' - TYPE '*' STAGE NUMBER 2 - DATA BASIC TO DDNAME 'CSVOUTPT' - OPTIONS NOSEARCH NOCSV. -//C1MSGS1 DD SYSOUT=* -//BSTERR DD SYSOUT=* -//CSVOUTPT DD DSN=&&CSVFILE, -// DCB=(RECFM=FB,LRECL=800,BLKSIZE=8000,DSORG=PS), -// DISP=(MOD,PASS),UNIT=3390, -// SPACE=(CYL,(5,5),RLSE) -//*****Sort data by ele, typ, sys, sub ************************** -//SORT EXEC PGM=SORT -//SYSPRT DD SYSOUT=* -//SYSPRINT DD SYSOUT=* -//SYSOUT DD SYSOUT=* -//SORTIN DD DSN=&&CSVFILE,DISP=(OLD,DELETE) -//SORTOUT DD DSN=&&CSVFILE2, -// DCB=(RECFM=FB,LRECL=800,BLKSIZE=8000,DSORG=PS), -// DISP=(MOD,PASS),UNIT=3390, -// SPACE=(CYL,(5,5),RLSE) -//SYSIN DD * / sort by ele, typ, sys, sub - SORT FIELDS=(39,08,CH,A,49,08,CH,A,23,16,CH,A) -//*-Report ----------------------------------------------------------- -//REPORT EXEC PGM=IRXJCL,PARM='ENBPIU00 A' -//POSITION DD * - System 23 30 - Subsys 31 38 - Element 39 46 - Type 49 56 - Userid 95 102 - Date 79 86 -//OPTIONS DD * - $StripData = 'N' - If $row# = 1 then x = BuildFromMODEL(HEADING) - entry = Element Type - dup = ' ' - if entry = lastentry then dup ='***' - lastentry = entry -//HEADING DD * - --- Elements in the DEV Environment --- -Element- Type---- Dup System-- Subsys-- --Date-- Signout -//MODEL DD * -&Element &Type &dup &System &Subsys &Date &Userid -//TABLE DD DSN=&&CSVFILE2,DISP=(OLD,DELETE) -//SYSTSPRT DD SYSOUT=* -//SYSEXEC DD DISP=SHR,DSN=CARSMINI.NDVR.R1801.CSIQCLS0 -//TBLOUT DD SYSOUT=* - - -./ ADD NAME=EXAMPL2$ -//IBMUSER2 JOB (0000), -// 'ENDEVOR JOB',MSGLEVEL=(1,1),CLASS=B,REGION=0M,MSGCLASS=A, -// NOTIFY=&SYSUID -//*------------------------------------------------------------------- -// SET SYSEXEC=CAPRD.NDVR.PROD.CATSNDVR.CEXEC -//*-------------------------------------------------------------- -//*- To Report Packages created over nnn days ago ----------- -//*-------------------------------------------------------------- -//*--------------------------------------------------------------------* -//* STEP 1 -- Execute CSV Utility to gather Package information -//*--------------------------------------------------------------------* -//STEP1 EXEC PGM=NDVRC1,REGION=4M, -// PARM='BC1PCSV0' -//STEPLIB DD DISP=SHR,DSN=CAPRD.NDVR.V160PRD.CSIQAUTU -// DD DISP=SHR,DSN=CAPRD.NDVR.V160PRD.CSIQAUTH -// DD DISP=SHR,DSN=CAPRD.NDVR.V160PRD.CSIQLOAD -//BSTIPT01 DD * -LIST PACKAGE ID '*' - WHERE DATE TYPE CR IS OLDER THAN 20 DAYS - TO DDNAME 'CSVOUTPT' - OPTIONS NOCSV. -//C1MSGS1 DD SYSOUT=* -//BSTERR DD SYSOUT=* -//CSVOUTPT DD DSN=&&CSVFILE, -// DCB=(RECFM=FB,LRECL=1800,BLKSIZE=9000,DSORG=PS), -// DISP=(MOD,PASS), -// SPACE=(CYL,(5,5),RLSE) -//*-------------------------------------------------------------------- -//* SHOWME -- Show the API call results -//*-------------------------------------------------------------------- -//SHOWME EXEC PGM=IEBGENER,REGION=1024K,COND=(4,EQ,STEP1) -//SYSPRINT DD SYSOUT=* MESSAGES -//SYSUT1 DD DSN=&&CSVFILE,DISP=(OLD,PASS) -//SYSUT2 DD SYSOUT=* OUTPUT FILE -//SYSIN DD DUMMY CONTROL STATEMENTS -//SYSUDUMP DD SYSOUT=* -//*-------------------------------------------------------------------- -//REPORT EXEC PGM=IRXJCL,PARM='ENBPIU00 PARMLIST' -//TABLE DD DSN=&&CSVFILE,DISP=(OLD,DELETE) -//POSITION DD * - ALPKG_RS_PKGID 13 28 - ALPKG_RS_SITE 29 29 - ALPKG_RS_COMMENT 30 79 - ALPKG_RS_PKG_TYPE 80 89 - ALPKG_RS_STAT 116 127 - ALPKG_RS_CRD 155 161 - ALPKG_RS_CRU 167 174 - ALPKG_RS_MOD 175 181 -//PARMLIST DD * - MODEL TBLOUT OPTION0 0 - MODEL TBLOUT OPTIONS A -//HEADING DD * -* Package--------- Status----- CreateDate UpdateDate CreatorId- PackageAge -//*-+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8 -//MODEL DD * -&DetailLine -//OPTION0 DD * - LinesPerPage = 15 - LineCount = LinesPerPage + 1 - DaysAgo = 10 /* Number of days for cutoff */ - Months='JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC' -//OPTIONS DD * -* Bypass processing for Table header - If $row# < 1 then $SkipRow = 'Y' -* Calculate age of Package creation - - BaseDate = DATE('B') /* Today in Base format */ - year = Substr(ALPKG_RS_MOD,6,2) - If DATATYPE(year) /= 'NUM' then $SkipRow = 'Y' - if year < 50 then UpdateDate='20'year - if year >= 50 then UpdateDate='19'year - Say 'UpdateDate =' UpdateDate ALPKG_RS_PKGID - month = Substr(ALPKG_RS_MOD,3,3) - month# = WordPos(month,Months) - month# = Right(month#,2,'0') - Say 'UpdateDate =' UpdateDate ALPKG_RS_PKGID - UpdateDate = UpdateDate || month# - UpdateDate = UpdateDate || Substr(ALPKG_RS_MOD,1,2) - Say 'UpdateDate =' UpdateDate ALPKG_RS_PKGID - BaseOld = DATE(B,UpdateDate,S) /* Convert Upd date to Base fmt */ - - PackageAge = BaseDate - BaseOld /* Determine how many days ago */ - If PackageAge < DaysAgo then $SkipRow = 'Y' /* Skip if recent */ -* Build report detail line .... - DetailLine = Copies(' ',120); - DetailLine = Overlay(ALPKG_RS_PKG_TYPE,DetailLine,03) - DetailLine = Overlay(ALPKG_RS_STAT,DetailLine,20) - DetailLine = Overlay(ALPKG_RS_CRD,DetailLine,32) - DetailLine = Overlay(ALPKG_RS_MOD,DetailLine,43) - DetailLine = Overlay(ALPKG_RS_CRU,DetailLine,54) - DetailLine = Overlay(PackageAge,DetailLine,65) -* Determine whether it is time for page heading - LineCount = LineCount + 1 - If LineCount > LinesPerPage then x = BuildFromMODEL(HEADING) - If LineCount > LinesPerPage then LineCount = 1 -//SYSEXEC DD DSN=&SYSEXEC,DISP=SHR -//SYSTSPRT DD SYSOUT=* -//SYSPRINT DD SYSOUT=* -//SYSIN DD DUMMY -//TBLOUT DD SYSOUT=* -//*------------------------------------------------------------------- - - -./ ADD NAME=EXAMPL2A -//EXAMPL2A JOB (0000), JOB0 -// 'ENDEVOR JOB',MSGLEVEL=(1,1),CLASS=B,REGION=0M,MSGCLASS=A, -// NOTIFY=&SYSUID -//*------------------------------------------------------------------- -//*- To Report Element changes within a date range ----------- -//*------------------------------------------------------------------- -// JCLLIB ORDER=(YOURSITE.NDVR.TEAM.JCL) -// EXPORT SYMLIST=(*) <- make JCL symbols available -// SET STRTDATE='280 DAYS AGO' <- Specify date or # Days ago -// SET STOPDATE=2999/12/30 <- Specify stop/end date -// SET ENVIRON=PRD <- Specify Environment -// SET SYSTEM=* <- Specify System -//*--------------------------------------------------------------------* -//* STEP 1 -- Execute CSV Utility to gather Element information -//*--------------------------------------------------------------------* -//STEP1 EXEC PGM=NDVRC1,REGION=4M, -// PARM='BC1PCSV0' -// INCLUDE MEMBER=STEPLIB -//BSTIPT01 DD *,SYMBOLS=JCLONLY <- Permits JCL variables here -LIST ELEMENT '*' - FROM ENVIRONMENT &ENVIRON SYSTEM &SYSTEM SUBSYSTEM '*' - TYPE '*' - STAGE NUMBER 2 - DATA ALL - TO DDNAME 'CSVOUTPT' - OPTIONS NOSEARCH . -//C1MSGS1 DD SYSOUT=* -//BSTERR DD SYSOUT=* -//CSVOUTPT DD DSN=&&CSVFILE, -// DCB=(RECFM=FB,LRECL=1800,BLKSIZE=9000,DSORG=PS), -// DISP=(MOD,PASS),UNIT=3390, -// SPACE=(CYL,(5,5),RLSE) -//*-------------------------------------------------------------------* -//*-(To Report Element Move dates, then change to MOVE CSV parms) -//*-------------------------------------------------------------------* -//REPORT EXEC PGM=IRXJCL,PARM='ENBPIU00 PARMLIST' -//TABLE DD DSN=&&CSVFILE,DISP=(OLD,DELETE) -//PARMLIST DD * - HEADING REPORT SETUP 1 - MODEL REPORT OPTIONS A -//SETUP DD *,SYMBOLS=JCLONLY <- Permits JCL variables here - StartDate = '&STRTDATE' - StopDate = '&STOPDATE' - today = DATE('S') - TodaysDate = + - Substr(today,1,4)'/'||Substr(today,5,2)'/' || + - Substr(today,7); - If StopDate > TodaysDate then StopDate = TodaysDate ; - If Words(StartDate) = 3 then, + - Do; daysago = Word(StartDate,1) ; BaseDate = DATE('B'); + - NumDate = BaseDate - daysago; NewDate = DATE(S,NumDate,B); + - StartDate = + - Substr(NewDate,1,4)'/'||Substr(NewDate,5,2)'/' || + - Substr(NewDate,7); + - End - HeadingText= 'ENV_NAME ELM_NAME SYS_NAME SBS_NAME TYPE_NAME' - HeadingText= HeadingText 'Date------ Time------- Userid ' - HeadingText= HeadingText 'Package--------' -//OPTIONS DD * - If ELM_LAST_LL_DATE < StartDate then $SkipRow = 'Y' - If ELM_LAST_LL_DATE > StopDate then $SkipRow = 'Y' - ENV_NAME = Left(ENV_NAME,09) - ELM_NAME = Left(ELM_NAME,09) - SYS_NAME = Left(SYS_NAME,09) - SBS_NAME = Left(SBS_NAME,09) - TYPE_NAME = Left(TYPE_NAME,09) - Details=ELM_LAST_LL_DATE ELM_LAST_LL_TIME ELM_LAST_LL_USRID - Details=Details PKG_ID_@O@ -// INCLUDE MEMBER=SYSEXEC -//SYSTSPRT DD SYSOUT=* -//HEADING DD * - *** Report of Element Changes &StartDate thru &StopDate ****** -&HeadingText -//MODEL DD * -&ENV_NAME &ELM_NAME &SYS_NAME &SBS_NAME &TYPE_NAME &Details -//REPORT DD SYSOUT=* - - -./ ADD NAME=EXAMPL2B -//IBMUSERI JOB (0000),'EXAMPL2B',CLASS=B,PRTY=6, -// MSGCLASS=3,REGION=7M,NOTIFY=&SYSUID -/*JOBPARM SYSAFF=* -//*-------------------------------------------------------------- -// JCLLIB ORDER=(IBMUSER.JCL.CSV) -//*-- -//*- To Report Element changes within a date span ----------- -//*-------------------------------------------------------------- -// EXPORT SYMLIST=(*) <- make JCL symbols available -//*--- -// SET STRTDATE=2020/01/01 <- Specify date or # Days ago -// SET STRTDATE='365 DAYS AGO' <- Specify date or # Days ago -//*--- -// SET STOPDATE=2029/12/30 <- Specify stop/end data -//*--- -// SET ENVIRON=DEV <- Specify stop/end data -// SET SYSTEM=ESCMSNDV <- Specify stop/end data -//*------------------------------------------------------------------- -//*--------------------------------------------------------------------* -//* STEP 1 -- Execute CSV Utility to gather Element information -//*--------------------------------------------------------------------* -//STEP1 EXEC PGM=NDVRC1,REGION=4M, -// PARM='BC1PCSV0' -//*--------- your Steplib .... -// INCLUDE MEMBER=STEPLIB -//*--------- -//BSTIPT01 DD *,SYMBOLS=JCLONLY <- Permits JCL variables here -LIST ELEMENT '*' - FROM ENVIRONMENT &ENVIRON SYSTEM &SYSTEM SUBSYSTEM '*' - TYPE '*' - STAGE NUMBER 2 - DATA ALL - TO DDNAME 'CSVOUTPT' - OPTIONS NOSEARCH . -//C1MSGS1 DD SYSOUT=* -//BSTERR DD SYSOUT=* -//CSVOUTPT DD DSN=&&CSVFILE, -// DCB=(RECFM=FB,LRECL=1800,BLKSIZE=9000,DSORG=PS), -// DISP=(MOD,PASS),UNIT=3390, -// SPACE=(CYL,(5,5),RLSE) -//*-------------------------------------------------------------------- -//* SHOWME -- Show the CSV call results -//*-------------------------------------------------------------------- -//SHOWME EXEC PGM=IEBGENER,REGION=1024K,COND=(0,LE) -//SYSPRINT DD SYSOUT=* MESSAGES -//SYSUT1 DD DSN=&&CSVFILE,DISP=(OLD,PASS) -//SYSUT2 DD SYSOUT=* OUTPUT FILE -//SYSIN DD DUMMY CONTROL STATEMENTS -//SYSUDUMP DD SYSOUT=* -//*-------------------------------------------------------------------* -//*-(To Report Element Move dates, then change to MOVE CSV parms) -//*-------------------------------------------------------------------* -//REPORT EXEC PGM=IRXJCL,PARM='ENBPIU00 PARMLIST' -//TABLE DD DSN=&&CSVFILE,DISP=(OLD,DELETE) -//PARMLIST DD * - HEADING REPORT SETUP 1 - MODEL REPORT OPTIONS A -//SETUP DD *,SYMBOLS=JCLONLY <- Permits JCL variables here - StartDate = '&STRTDATE' - StopDate = '&STOPDATE' - today = DATE('S') - TodaysDate = + - Substr(today,1,4)'/'||Substr(today,5,2)'/' || + - Substr(today,7); - If StopDate > TodaysDate then StopDate = TodaysDate ; - If Words(StartDate) = 3 then, + - Do; daysago = Word(StartDate,1) ; BaseDate = DATE('B'); + - NumDate = BaseDate - daysago; NewDate = DATE(S,NumDate,B); + - StartDate = + - Substr(NewDate,1,4)'/'||Substr(NewDate,5,2)'/' || + - Substr(NewDate,7); + - End -//OPTIONS DD * -* If ELM_LAST_LL_DATE < StartDate then $SkipRow = 'Y' -* If ELM_LAST_LL_DATE > StopDate then $SkipRow = 'Y' - If MOVE_DATE < StartDate then $SkipRow = 'Y' - If MOVE_DATE > StopDate then $SkipRow = 'Y' - ENV_NAME = Left(ENV_NAME,09) - ELM_NAME = Left(ELM_NAME,09) - SYS_NAME = Left(SYS_NAME,09) - SBS_NAME = Left(SBS_NAME,09) - TYPE_NAME = Left(TYPE_NAME,09) - Details = MOVE_DATE MOVE_TIME MOVE_USRID -* Details = ELM_LAST_LL_DATE ELM_LAST_LL_TIME ELM_LAST_LL_USRID -//*-- -// INCLUDE MEMBER=SYSEXEC -//*-- -//NOTHING DD DUMMY -//SYSTSPRT DD SYSOUT=* -//HEADING DD * - *** Report of Elements Moved &StartDate thru &StopDate ****** -ENV_NAME ELM_NAME SYS_NAME SBS_NAME TYPE_NAME Date------ Time----- Userid -//MODEL DD * -&ENV_NAME &ELM_NAME &SYS_NAME &SBS_NAME &TYPE_NAME &Details -//REPORT DD SYSOUT=* - - -./ ADD NAME=EXAMPL2P -//IBMUSERA JOB (0000), JOB01236 -// 'ENDEVOR JOB',MSGLEVEL=(1,1),CLASS=B,REGION=0M,MSGCLASS=A, -// NOTIFY=&SYSUID -//*------------------------------------------------------------------- -// SET SYSEXEC=CAPRD.NDVR.PROD.CATSNDVR.CEXEC -//*-------------------------------------------------------------- -//*- To Report Packages created over nnn days ago ----------- -//*-------------------------------------------------------------- -//*--------------------------------------------------------------------* -//* STEP 1 -- Execute CSV Utility to gather Package information -//*--------------------------------------------------------------------* -//STEP1 EXEC PGM=NDVRC1,REGION=4M, -// PARM='BC1PCSV0' -//STEPLIB DD DISP=SHR,DSN=CAPRD.NDVR.V160PRD.CSIQAUTU -// DD DISP=SHR,DSN=CAPRD.NDVR.V160PRD.CSIQAUTH -// DD DISP=SHR,DSN=CAPRD.NDVR.V160PRD.CSIQLOAD -//BSTIPT01 DD * -LIST PACKAGE ID '*' - WHERE DATE TYPE CR IS OLDER THAN 20 DAYS - TO DDNAME 'CSVOUTPT' . -//C1MSGS1 DD SYSOUT=* -//BSTERR DD SYSOUT=* -//CSVOUTPT DD DSN=&&CSVFILE, -// DCB=(RECFM=FB,LRECL=1800,BLKSIZE=9000,DSORG=PS), -// DISP=(MOD,PASS), -// SPACE=(CYL,(5,5),RLSE) -//*-------------------------------------------------------------------- -//* SHOWME -- Show the API call results -//*-------------------------------------------------------------------- -//SHOWME EXEC PGM=IEBGENER,REGION=1024K,COND=(4,EQ,STEP1) -//SYSPRINT DD SYSOUT=* MESSAGES -//SYSUT1 DD DSN=&&CSVFILE,DISP=(OLD,PASS) -//SYSUT2 DD SYSOUT=* OUTPUT FILE -//SYSIN DD DUMMY CONTROL STATEMENTS -//SYSUDUMP DD SYSOUT=* -//*-------------------------------------------------------------------- -//REPORT EXEC PGM=IRXJCL,PARM='ENBPIU00 PARMLIST' -//TABLE DD DSN=&&CSVFILE,DISP=(OLD,DELETE) -//PARMLIST DD * - HEADING TBLOUT OPTIONS 1 - MODEL TBLOUT OPTIONS A -//HEADING DD * - Package--------- Status----- - \CreateDate UpdateDate CreatorId- Description------------------------ -//MODEL DD * - &PKG_ID &STATUS - &CREATE_DATE &UPDT_DATE &CREATE_USRID *** &DESCRIPTION *** -//OPTIONS DD DUMMY -//SYSEXEC DD DSN=&SYSEXEC,DISP=SHR -//SYSTSPRT DD SYSOUT=* -//SYSPRINT DD SYSOUT=* -//SYSIN DD DUMMY -//TBLOUT DD SYSOUT=* -//*------------------------------------------------------------------- - - -./ ADD NAME=EXAMPL2R -//IBMUSER2 JOB (0000), -// 'ENDEVOR JOB',MSGLEVEL=(1,1),CLASS=B,REGION=0M,MSGCLASS=A, -// NOTIFY=&SYSUID -//*------------------------------------------------------------------- -// SET CSVFILE=IBMUSER.PHONS.CSVFILE.#2 -// SET CSVFILE=IBMUSER.PHONS.CSVFILE.#3 -// SET CSVFILE=IBMUSER.PHONS.CSVFILE.#4 -// SET CSVFILE=IBMUSER.PHONS.CSVFILE -// SET SYSEXEC=IBMUSER.REXX -// SET SYSEXEC=CAPRD.NDVR.PROD.CATSNDVR.CEXEC -//*-------------------------------------------------------------- -//*- To Report Packages created over nnn days ago ----------- -//*--------------------------------------------------------------------* -//* STEP 1 -- Execute CSV Utility to gather Package information -//*--------------------------------------------------------------------* -//REPORT EXEC PGM=IRXJCL,PARM='ENBPIU00 PARMLIST' -//TABLE DD DSN=&CSVFILE,DISP=SHR -//PARMLIST DD * - MODEL TBLOUT OPTION0 0 - MODEL TBLOUT OPTIONS A -//HEADING DD * -* Package--------- Status----- CreateDate UpdateDate CreatorId- PackageAge -//*-+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8 -//MODEL DD * -&DetailLine -//OPTION0 DD * - LinesPerPage = 15 - LineCount = LinesPerPage + 1 - DaysAgo = 60 /* Number of days for cutoff */ -//OPTIONS DD * -* Bypass processing for Table header - If $row# < 1 then $SkipRow = 'Y' -* Calculate age of Package creation - BaseDate = DATE('B') /* Today in Base format */ - UpdateDate = Substr(UPDT_DATE,1,4) || Substr(UPDT_DATE,6,2) - UpdateDate = UpdateDate || Substr(UPDT_DATE,9,2) - If DATATYPE(UpdateDate) /= 'NUM' then $SkipRow = 'Y' - BaseOld = DATE(B,UpdateDate,S) /* Convert Upd date to Base fmt */ - PackageAge = BaseDate - BaseOld /* Determine how many days ago */ - If PackageAge < DaysAgo then $SkipRow = 'Y' /* Skip if recent */ -* Build report detail line .... - DetailLine = Copies(' ',120); - DetailLine = Overlay(PKG_ID,DetailLine,03) - DetailLine = Overlay(STATUS,DetailLine,20) - DetailLine = Overlay(CREATE_DATE,DetailLine,32) - DetailLine = Overlay(UPDT_DATE,DetailLine,43) - DetailLine = Overlay(CREATE_USRID,DetailLine,54) - DetailLine = Overlay(PackageAge,DetailLine,65) -* Determine whether it is time for page heading - LineCount = LineCount + 1 - If LineCount > LinesPerPage then x = BuildFromMODEL(HEADING) - If LineCount > LinesPerPage then LineCount = 1 -//SYSEXEC DD DSN=&SYSEXEC,DISP=SHR -//SYSTSPRT DD SYSOUT=* -//SYSPRINT DD SYSOUT=* -//SYSIN DD DUMMY -//TBLOUT DD SYSOUT=* -//*------------------------------------------------------------------- - - -./ ADD NAME=LISTDSNS -//IBMUSERI JOB (0000), -// 'ENDEVOR JOB',MSGLEVEL=(1,1),CLASS=B,REGION=0M,MSGCLASS=A, -// NOTIFY=&SYSUID -//**=================================================================** -//LISTDSNS EXEC PGM=IDCAMS -//SYSIN DD * - LISTCAT LEVEL('YOURSITE.NDVR.TEAM') NAME -//STEPLIB DD DISP=SHR,DSN=SYS1.LINKLIB -//AMSDUMP DD SYSOUT=* -//SYSPRINT DD DSN=&&LISTCAT,DISP=(,PASS), -// SPACE=(CYL,(1,1)),UNIT=SYSDA, -// LRECL=120,RECFM=FB,BLKSIZE=0 -//**=================================================================** -//LISTDSI EXEC PGM=IKJEFT1B,PARM='ENBPIU00 A ' -//POSITION DD * - NonVSAM 2 8 - Dataset 18 61 -//OPTIONS DD * - If $row# = 1 then x =BuildFromMODEL(HEADING) - If NonVSAM /= 'NONVSAM' then $SkipRow = 'Y' - x = LISTDSI("'"Dataset"'" DIRECTORY RECALL SMSINFO) - DSN = Left(Dataset,44) - ThisDSORG = Right(SYSDSORG,3) - ThisRECFM = Right(SYSRECFM,3) - ThisLRECL = Right(SYSLRECL,5) - ThisBLKSZ = Right(SYSBLKSIZE,5) - ThisMembs = Right(SYSMEMBERS,6) -//HEADING DD * -Dataset------------------------------------ DSorg Fmt Recz Blksz Mmbrs -//MODEL DD * -&DSN &ThisDSORG &ThisRECFM &ThisLRECL &ThisBLKSZ &ThisMembs -//TABLE DD DSN=&&LISTCAT,DISP=(OLD,DELETE) -//SYSEXEC DD DISP=SHR,DSN=CARSMINI.NDVR.R1801.CSIQCLS0 -//SYSTSIN DD DUMMY -//SYSTSPRT DD SYSOUT=* -//TBLOUT DD SYSOUT=* - - -./ ADD NAME=PKGEMNTR -//IBMUSERT JOB (0000), -// CLASS=A,MSGCLASS=X,REGION=4M,NOTIFY=&SYSUID -//*==================================================================* -//*- To run the Package Monitory report ------- -//*-------------------------------------------------------------- -// JCLLIB ORDER=(YOURSITE.NDVR.TEAM.JCL.CSV) -//*==================================================================* -// EXPORT SYMLIST=(*) <- make JCL symbols available -//*** STEP 1 -- EXECUTE CSV UTILITY to find APPROVED and EXEC packages -//STEP1 EXEC PGM=NDVRC1,REGION=4M, -// PARM='CONCALL,DDN:CONLIB,BC1PCSV0' (EXEC FROM NON-AUTH LIB) -// INCLUDE MEMBER=STEPLIB -//CSVIPT01 DD * - LIST PACKAGE ID '*' - WHERE STATUS = (APPROVED, EXECUTED, INAPPROVAL) - OPTIONS QUALIFIER QUOTE - TO FILE APIEXTR . -//APIEXTR DD DSN=&&APIPKGE, -// DCB=(DSORG=PS,RECFM=VB,LRECL=4092), -// DISP=(MOD,PASS,DELETE),UNIT=3390, -// SPACE=(CYL,(5,5),RLSE) -//CSVMSGS1 DD SYSOUT=* -//DISPLAYS DD DUMMY -//C1MSGSA DD SYSOUT=* -//BSTERR DD SYSOUT=* -//SYMDUMP DD DUMMY -//SYSUDUMP DD SYSOUT=* -//*------------------------------------------------------------------- -//* Identify Packages to monitor -//* build additional package CSV utility commands for shipment rqsts -//*------------------------------------------------------------------- -//STEP3 EXEC PGM=IRXJCL,PARM='ENBPIU00 PARMLIST' -//TABLE DD DSN=&&APIPKGE,DISP=(OLD,PASS) -// INCLUDE MEMBER=CSIQCLS0 -//PARMLIST DD * - MODELHD TBLOUT1 SELECTS 1 - MODEL1 TBLOUT1 OPTIONS1 A - MODEL2 TBLOUT2 OPTIONS2 A -//MODELHD DD * -*Note----- Package--------- Date------ Time- Dest Env- Status----- -//SELECTS DD * - $Table_Type = "CSV" - $StripData = 'N' ; - DESTTABLusers='FCFE FCAE FCMA FCOG SWEF' - tday= DATE(S) - today = Substr(tday,1,4)'/'Substr(tday,5,2)'/'Substr(tday,7) - BaseDate = DATE('B') - NewBase = BaseDate - 1; - yester = DATE(S,NewBase,B) - yestrday = Substr(yester,1,4)'/'Substr(yester,5,2)'/'Substr(yester,7) - NewBase = BaseDate + 1; - tomorw = DATE(S,NewBase,B) - tomorrow = Substr(tomorw,1,4)'/'Substr(tomorw,5,2)'/'Substr(tomorw,7) - Say 'tomorrow='tomorrow -* for the second set of outputs - ShipCount = 0 - myOptions = ' ' - $my_rc = 4 -//OPTIONS1 DD * - if $row# < 1 then $SkipRow='Y' - keeper = 'n' - Dest = ' ' - PkgPrfx=Substr(PKG_ID,1,4) - If WordPos(PkgPrfx,DESTTABLusers)>0 then Dest = 'Dest' -*If PROM_TGT_STGID = 'P' then keeper='Prod' - date=WINDOW_START_DATE - time=WINDOW_START_TIME - If STATUS='EXECUTED' then date=EXEC_BEGIN_DATE - If STATUS='EXECUTED' then time=EXEC_BEGIN_TIME - If date = today then keeper='Today' - If date = yestrday then keeper='yesterday' - If date = tomorrow then keeper='tomorrow ' - If date > tomorrow then keeper='future ' - PROM_TGT_ENV = Left(PROM_TGT_ENV,4) -*If PROM_TGT_ENV=' ' then PROM_TGT_ENV=Substr(NOTE8,8,4) - If keeper = 'n' then $SkipRow = 'Y' - $my_rc = 0 - STATUS = Left(STATUS,14) - keeper = left(keeper,10) - MyKeeper.PKG_ID = keeper - PKG_ID = Left(PKG_ID,16) -//OPTIONS2 DD * - if $row# < 1 then $SkipRow='Y' - If MyKeeper.PKG_ID = 'n' then $SkipRow='Y' - ShipCount = ShipCount + 1 - PKG_ID = Left(PKG_ID,16) -//MODEL1 DD * - &keeper &PKG_ID &date &time &Dest &PROM_TGT_ENV &STATUS -//MODEL2 DD * - LIST PACKAGE SHIP - FROM PACKAGE '&PKG_ID' - OPTIONS &myOptions - TO FILE APISHIP . -//SYSPRINT DD SYSOUT=* -//NOTHING DD DUMMY -//SYSTSPRT DD SYSOUT=* -//TBLOUT1 DD DSN=&&LISTPKGS, -// DCB=(DSORG=PS,RECFM=FB,LRECL=80), -// DISP=(NEW,PASS),UNIT=3390, -// SPACE=(TRK,(5,5),RLSE) -//TBLOUT2 DD DSN=&&CSVALSHP, -// DCB=(DSORG=PS,RECFM=FB,LRECL=80), -// DISP=(NEW,PASS),UNIT=3390, -// SPACE=(TRK,(5,5),RLSE) -//*------------------------------------------------------------------- -//* EXECUTE CSV UTILITY to capture package Shipment data -//* for packages identified/selected in prev step -//*------------------------------------------------------------------- -//STEP4 EXEC PGM=NDVRC1,REGION=4M, -// COND=(0,NE,STEP3), -// PARM='CONCALL,DDN:CONLIB,BC1PCSV0' (EXEC FROM NON-AUTH LIB) -//CSVIPT01 DD DSN=&&CSVALSHP,DISP=(OLD,DELETE) -// INCLUDE MEMBER=STEPLIB -//APISHIP DD DSN=&&APISHIP, -// DCB=(DSORG=PS,RECFM=VB,LRECL=4092), -// DISP=(MOD,PASS,DELETE),UNIT=3390, -// SPACE=(CYL,(5,5),RLSE) -//* EXECUTION MESSAGES (CSV LOG MESSAGES) -//CSVMSGS1 DD SYSOUT=* -//* EXECUTION MESSAGES (API LOG MESSAGES) -//C1MSGSA DD SYSOUT=* -//* ERROR FILE -//BSTERR DD SYSOUT=* -//SYMDUMP DD DUMMY -//DISPLAYS DD DUMMY -//SYSUDUMP DD SYSOUT=* -//*--------------------------------------------------------------------- -//*-- Save Shipment info in a format for next step -//*--------------------------------------------------------------------- -//STEP6 EXEC PGM=IRXJCL,PARM='ENBPIU00 A', -// COND=(0,NE,STEP3) -//TABLE DD DSN=&&APISHIP,DISP=(OLD,DELETE) -// INCLUDE MEMBER=CSIQCLS0 -//OPTIONS DD * - $Table_Type = "CSV" -//MODEL DD * - Shipment.&PKG_ID = "&DEST_ID &RMT_MOVE_RC" -//SYSPRINT DD SYSOUT=* -//SYSTSPRT DD SYSOUT=* -//TBLOUT DD DSN=&&SHIPDATA, -// DCB=(DSORG=PS,RECFM=FB,LRECL=80), -// DISP=(NEW,PASS),UNIT=3390, -// SPACE=(TRK,(1,1),RLSE) -//*--------------------------------------------------------------------- -//*-- Write report from all collected data -//*--------------------------------------------------------------------- -//STEP7 EXEC PGM=IRXJCL,PARM='ENBPIU00 PARMLIST', -// COND=(0,NE,STEP3) -//TABLE DD DSN=&&LISTPKGS,DISP=(OLD,DELETE) -// INCLUDE MEMBER=CSIQCLS0 -//SYSTSPRT DD SYSOUT=* -//PARMLIST DD * - NOTHING NOTHING SELECTS 0 - MODEL REPORT SHIPDATA 0 - HEADINGS REPORT HEADINGS 1 - MODEL REPORT DETAILS A -//SELECTS DD * - Shipment. = ' ' -//SHIPDATA DD DSN=&&SHIPDATA,DISP=(OLD,DELETE) -//MODELSEL DD * -** Selection Date range &StrDte - &EndDte -//HEADINGS DD * -*Note----- Package--------- Date------ Time- Status----- Shipment -//DETAILS DD * - $StripData = 'N' ; -* - Dest = Left(Dest,4) - Env = Left(Env,4) - Shipment = Shipment.Package - Package = Left(Package,16) -//MODEL DD * - &Note &Package &Date &Time &Status &Shipment -//SYSPRINT DD SYSOUT=* -//REPORT DD SYSOUT=* - - From 41d13dd2863a612c47738ba88e849047bb307397 Mon Sep 17 00:00:00 2001 From: Joseph Walther Date: Thu, 19 Jun 2025 13:33:13 -0500 Subject: [PATCH 02/20] SonarQube analysis during Package CAST --- .../Miscellaneous-items/GETACCTC.rex | 16 +++++ .../WAITFILE.rex | 0 .../BUMPJOB.rex | 20 ++++++ .../GTUNIQUE.rex | 25 +++++++ .../SonarQube-interface-to-Endevor/README.md | 10 ++- .../SYSDE32.NDVR.TEAM.BAT(SONRQUBE).txt | 69 +++++++++++++++++++ .../SYSDE32.NDVR.TEAM.FTP(SONRQUBE).txt | 17 +++++ 7 files changed, 156 insertions(+), 1 deletion(-) create mode 100644 endevor/Field-Developed-Programs/Miscellaneous-items/GETACCTC.rex rename endevor/Field-Developed-Programs/{SonarQube-interface-to-Endevor => Miscellaneous-items}/WAITFILE.rex (100%) create mode 100644 endevor/Field-Developed-Programs/Processor-Tools-and-Processor-Snippets/BUMPJOB.rex create mode 100644 endevor/Field-Developed-Programs/Processor-Tools-and-Processor-Snippets/GTUNIQUE.rex create mode 100644 endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/SYSDE32.NDVR.TEAM.BAT(SONRQUBE).txt create mode 100644 endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/SYSDE32.NDVR.TEAM.FTP(SONRQUBE).txt diff --git a/endevor/Field-Developed-Programs/Miscellaneous-items/GETACCTC.rex b/endevor/Field-Developed-Programs/Miscellaneous-items/GETACCTC.rex new file mode 100644 index 0000000..aa35080 --- /dev/null +++ b/endevor/Field-Developed-Programs/Miscellaneous-items/GETACCTC.rex @@ -0,0 +1,16 @@ +/* REXX */ +/* Find and return the Accounting code value for current user/job */ + + start = 540 /* it starts here */ + start = D2X(start) + TCB_Addr = C2D(Storage(start,4)) /* Current TCB Addr */ + JSCB_Addr = C2D(Storage(D2X(TCB_Addr+180),4)) + + JCT_Addr = C2D(Storage(D2X(JSCB_Addr+260),4)) + + ACT_Addr = C2D(Storage(D2X(JCT_Addr+56),3)) + ACT_Area = Storage(D2X(ACT_Addr),110) + ACT_len = C2D(Substr(ACT_Area,49,1)) + ACT_code = Substr(ACT_Area,50,ACT_len) + + Return ACT_code diff --git a/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/WAITFILE.rex b/endevor/Field-Developed-Programs/Miscellaneous-items/WAITFILE.rex similarity index 100% rename from endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/WAITFILE.rex rename to endevor/Field-Developed-Programs/Miscellaneous-items/WAITFILE.rex diff --git a/endevor/Field-Developed-Programs/Processor-Tools-and-Processor-Snippets/BUMPJOB.rex b/endevor/Field-Developed-Programs/Processor-Tools-and-Processor-Snippets/BUMPJOB.rex new file mode 100644 index 0000000..add9e10 --- /dev/null +++ b/endevor/Field-Developed-Programs/Processor-Tools-and-Processor-Snippets/BUMPJOB.rex @@ -0,0 +1,20 @@ +/* REXX */ +/* Bump the last character on a Jobname to next value */ +/* select is either empty/next for next character */ +/* or j/jump for a big gap */ + Trace O + Arg jobname select + Rotation = '12345678901', + 'ABCDEFGHIJKLMNOPQRSTUVWXYZA', + '@#$@' + jobname = word(jobname,1) + lastchar = Substr(jobname,Length(jobname)) + locatchar = Pos(lastchar,Rotation) + If select = 'j' | select = 'jump' then, + wherenext = (locatchar + length(Rotataton) // 2 + Else, + wherenext = locatchar + 1 + overlaychar = Substr(Rotation,wherenext,1) + wheretohit = Min(Length(jobname)+1,8) + nextJobname = overlay(overlaychar,jobname,wheretohit) + Return nextJobname diff --git a/endevor/Field-Developed-Programs/Processor-Tools-and-Processor-Snippets/GTUNIQUE.rex b/endevor/Field-Developed-Programs/Processor-Tools-and-Processor-Snippets/GTUNIQUE.rex new file mode 100644 index 0000000..2d9999a --- /dev/null +++ b/endevor/Field-Developed-Programs/Processor-Tools-and-Processor-Snippets/GTUNIQUE.rex @@ -0,0 +1,25 @@ + /* REXX */ + /* Build a unique 8-byte name from date and time */ + + numbers = '123456789' ; + characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' ; + ToDay = DATE(O) ; + Year = SUBSTR(ToDay,1,2) + 1; + Year = SUBSTR(characters||characters||characters||characters,Year,1) + Month = SUBSTR(ToDay,4,2) ; + Month = SUBSTR(characters,Month,1) ; + Day = SUBSTR(ToDay,7,2) ; + + Day = SUBSTR(characters || numbers,Day,1) ; + NOW = TIME() ; + Hour = SUBSTR(NOW,1,2) ; + IF Hour = '00' THEN Hour = '0' + ELSE + Hour = SUBSTR(characters,Hour,1) ; + Minute = SUBSTR(NOW,4,2) ; + second = SUBSTR(NOW,7,2) ; + Unique_Name = Year || Month || Day || Hour ||, + Minute || second ; + SA= "Unique Member name is " Unique_Name + + Return Unique_Name diff --git a/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/README.md b/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/README.md index 67fa7a4..b74d29a 100644 --- a/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/README.md +++ b/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/README.md @@ -9,9 +9,17 @@ REXX, Python and "skeleton" components are found in this folder. Items not found in this folder are found in other locations of this GitHub, including: + +**[BUMPJOB.rex](https://github.com/BroadcomMFD/broadcom-product-scripts/blob/main/endevor/Field-Developed-Programs/Processor-Tools-and-Processor-Snippets/BUMPJOB.rex)** for bumping an existing jobname to render a new job name + + **[GETACCT.rex](https://github.com/BroadcomMFD/broadcom-product-scripts/blob/main/endevor/Automated-Test-Facility-Using-Test4Z/GETACCTC.rex)** for obtaining and re-using the users accounting code information -**[BUMPJOB.rex](https://github.com/BroadcomMFD/broadcom-product-scripts/blob/main/endevor/Automated-Test-Facility-Using-Test4Z/BUMPJOB.rex)** for bumping an existing jobname to render a new job name +**[GTUNIQUE.rex](https://github.com/BroadcomMFD/broadcom-product-scripts/blob/main/endevor/Field-Developed-Programs/Processor-Tools-and-Processor-Snippets/GTUNIQUE.rex)** for obtaining a unique 8-byte name from the current date and time. +**[WAITFILE.rex](https://github.com/BroadcomMFD/broadcom-product-scripts/blob/main/endevor/Field-Developed-Programs/Miscellaneous-items/WAITFILE.rex)** for looping through wait periods of time, until a specific file becomes available. Use the SonarQube.bat commmand to bring the items together for your mainframe. + + + diff --git a/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/SYSDE32.NDVR.TEAM.BAT(SONRQUBE).txt b/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/SYSDE32.NDVR.TEAM.BAT(SONRQUBE).txt new file mode 100644 index 0000000..a2e06e4 --- /dev/null +++ b/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/SYSDE32.NDVR.TEAM.BAT(SONRQUBE).txt @@ -0,0 +1,69 @@ +REM In Windows, execute this command file to collect all Package +@ECHO OFF +ECHO ./ ADD NAME=@README > SonarQube.moveout +ECHO These items come from the Endevor GitHub at >> SonarQube.moveout +ECHO https://github.com/BroadcomMFD/broadcom-product-scripts >> SonarQube.moveout +ECHO ------------------------------------------------------- >> SonarQube.moveout +ECHO These are rex/CSIQCLS0 : GTUNIQUE BUMPJOB GETACCTC WAITFILE C1UEXTR7 >> SonarQube.moveout +ECHO These are skl/CSIQSENU : CAST#JCL FTP#INC FTP#RCV FTP#RUN SONARMDL SONARPRM SONARSET SONARTBL SONARW#1 SONARW#2 SONARW#3 XCOM#INC XCOM#JOB XCOM#RCV XCOM#RUN >> SonarQube.moveout +ECHO ./ ADD NAME=GTUNIQUE >> SonarQube.moveout +TYPE Processor-Tools-and-Processor-Snippets\GTUNIQUE.rex >> SonarQube.moveout +ECHO. >> SonarQube.moveout +ECHO ./ ADD NAME=BUMPJOB >> SonarQube.moveout +TYPE Processor-Tools-and-Processor-Snippets\BUMPJOB.rex >> SonarQube.moveout +ECHO. >> SonarQube.moveout +ECHO ./ ADD NAME=GETACCTC >> SonarQube.moveout +TYPE Miscellaneous-items\GETACCTC.rex >> SonarQube.moveout +ECHO. >> SonarQube.moveout +ECHO ./ ADD NAME=WAITFILE >> SonarQube.moveout +TYPE Miscellaneous-items\WAITFILE.rex >> SonarQube.moveout +ECHO. >> SonarQube.moveout +ECHO ./ ADD NAME=C1UEXTR7 >> SonarQube.moveout +TYPE SonarQube-interface-to-Endevor\C1UEXTR7.rex >> SonarQube.moveout +ECHO. >> SonarQube.moveout +ECHO ./ ADD NAME=CAST#JCL >> SonarQube.moveout +TYPE SonarQube-interface-to-Endevor\CAST#JCL.skl >> SonarQube.moveout +ECHO. >> SonarQube.moveout +ECHO ./ ADD NAME=FTP#INC >> SonarQube.moveout +TYPE SonarQube-interface-to-Endevor\FTP#INC.skl >> SonarQube.moveout +ECHO. >> SonarQube.moveout +ECHO ./ ADD NAME=FTP#RCV >> SonarQube.moveout +TYPE SonarQube-interface-to-Endevor\FTP#RCV.skl >> SonarQube.moveout +ECHO. >> SonarQube.moveout +ECHO ./ ADD NAME=FTP#RUN >> SonarQube.moveout +TYPE SonarQube-interface-to-Endevor\FTP#RUN.skl >> SonarQube.moveout +ECHO. >> SonarQube.moveout +ECHO ./ ADD NAME=SONARMDL >> SonarQube.moveout +TYPE SonarQube-interface-to-Endevor\SONARMDL.skl >> SonarQube.moveout +ECHO. >> SonarQube.moveout +ECHO ./ ADD NAME=SONARPRM >> SonarQube.moveout +TYPE SonarQube-interface-to-Endevor\SONARPRM.skl >> SonarQube.moveout +ECHO. >> SonarQube.moveout +ECHO ./ ADD NAME=SONARSET >> SonarQube.moveout +TYPE SonarQube-interface-to-Endevor\SONARSET.skl >> SonarQube.moveout +ECHO. >> SonarQube.moveout +ECHO ./ ADD NAME=SONARTBL >> SonarQube.moveout +TYPE SonarQube-interface-to-Endevor\SONARTBL.skl >> SonarQube.moveout +ECHO. >> SonarQube.moveout +ECHO ./ ADD NAME=SONARW#1 >> SonarQube.moveout +TYPE SonarQube-interface-to-Endevor\SONARW#1.skl >> SonarQube.moveout +ECHO. >> SonarQube.moveout +ECHO ./ ADD NAME=SONARW#2 >> SonarQube.moveout +TYPE SonarQube-interface-to-Endevor\SONARW#2.skl >> SonarQube.moveout +ECHO. >> SonarQube.moveout +ECHO ./ ADD NAME=SONARW#3 >> SonarQube.moveout +TYPE SonarQube-interface-to-Endevor\SONARW#3.skl >> SonarQube.moveout +ECHO. >> SonarQube.moveout +ECHO ./ ADD NAME=XCOM#INC >> SonarQube.moveout +TYPE SonarQube-interface-to-Endevor\XCOM#INC.skl >> SonarQube.moveout +ECHO. >> SonarQube.moveout +ECHO ./ ADD NAME=XCOM#JOB >> SonarQube.moveout +TYPE SonarQube-interface-to-Endevor\XCOM#JOB.skl >> SonarQube.moveout +ECHO. >> SonarQube.moveout +ECHO ./ ADD NAME=XCOM#RCV >> SonarQube.moveout +TYPE SonarQube-interface-to-Endevor\XCOM#RCV.skl >> SonarQube.moveout +ECHO. >> SonarQube.moveout +ECHO ./ ADD NAME=XCOM#RUN >> SonarQube.moveout +TYPE SonarQube-interface-to-Endevor\XCOM#RUN.skl >> SonarQube.moveout +ECHO. >> SonarQube.moveout +REM diff --git a/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/SYSDE32.NDVR.TEAM.FTP(SONRQUBE).txt b/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/SYSDE32.NDVR.TEAM.FTP(SONRQUBE).txt new file mode 100644 index 0000000..7897b2a --- /dev/null +++ b/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/SYSDE32.NDVR.TEAM.FTP(SONRQUBE).txt @@ -0,0 +1,17 @@ +get 'SYSDE32.NDVR.TEAM.GITHUB.UTILITY(GTUNIQUE)' Processor-Tools-and-Processor-Snippets\GTUNIQUE.rex +get 'SYSDE32.NDVR.TEAM.GITHUB.UTILITY(BUMPJOB)' Processor-Tools-and-Processor-Snippets\BUMPJOB.rex +get 'SYSDE32.NDVR.TEAM.GITHUB.UTILITY(GETACCTC)' Miscellaneous-items\GETACCTC.rex +get 'SYSDE32.NDVR.TEAM.GITHUB.UTILITY(WAITFILE)' Miscellaneous-items\WAITFILE.rex +get 'SYSDE32.NDVR.TEAM.GITHUB.PACKAGE(C1UEXTR7)' SonarQube-interface-to-Endevor\C1UEXTR7.rex +get 'SYSDE32.NDVR.TEAM.GITHUB.PACKAGE(CAST#JCL)' SonarQube-interface-to-Endevor\CAST#JCL.skl +get 'SYSDE32.NDVR.TEAM.GITHUB.PACKAGE(FTP#INC)' SonarQube-interface-to-Endevor\FTP#INC.skl +get 'SYSDE32.NDVR.TEAM.GITHUB.PACKAGE(FTP#RUN)' SonarQube-interface-to-Endevor\FTP#RUN.skl +get 'SYSDE32.NDVR.TEAM.GITHUB.PACKAGE(SONARMDL)' SonarQube-interface-to-Endevor\SONARMDL.skl +get 'SYSDE32.NDVR.TEAM.GITHUB.PACKAGE(SONARPRM)' SonarQube-interface-to-Endevor\SONARPRM.skl +get 'SYSDE32.NDVR.TEAM.GITHUB.PACKAGE(SONARSET)' SonarQube-interface-to-Endevor\SONARSET.skl +get 'SYSDE32.NDVR.TEAM.GITHUB.PACKAGE(SONARTBL)' SonarQube-interface-to-Endevor\SONARTBL.skl +get 'SYSDE32.NDVR.TEAM.GITHUB.PACKAGE(SONARW#1)' SonarQube-interface-to-Endevor\SONARW#1.skl +get 'SYSDE32.NDVR.TEAM.GITHUB.PACKAGE(SONARW#2)' SonarQube-interface-to-Endevor\SONARW#2.skl +get 'SYSDE32.NDVR.TEAM.GITHUB.PACKAGE(SONARW#3)' SonarQube-interface-to-Endevor\SONARW#3.skl +get 'SYSDE32.NDVR.TEAM.GITHUB.PACKAGE(XCOM#INC)' SonarQube-interface-to-Endevor\XCOM#INC.skl +get 'SYSDE32.NDVR.TEAM.GITHUB.PACKAGE(XCOM#RUN)' SonarQube-interface-to-Endevor\XCOM#RUN.skl From 2f6b743609fa7fd695b89ab94ef4b6c149d98955 Mon Sep 17 00:00:00 2001 From: Joseph Walther Date: Thu, 19 Jun 2025 13:34:57 -0500 Subject: [PATCH 03/20] Delete GTUNIQUE.rex --- .../GTUNIQUE.rex | 25 ------------------- 1 file changed, 25 deletions(-) delete mode 100644 endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/GTUNIQUE.rex diff --git a/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/GTUNIQUE.rex b/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/GTUNIQUE.rex deleted file mode 100644 index 2d9999a..0000000 --- a/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/GTUNIQUE.rex +++ /dev/null @@ -1,25 +0,0 @@ - /* REXX */ - /* Build a unique 8-byte name from date and time */ - - numbers = '123456789' ; - characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' ; - ToDay = DATE(O) ; - Year = SUBSTR(ToDay,1,2) + 1; - Year = SUBSTR(characters||characters||characters||characters,Year,1) - Month = SUBSTR(ToDay,4,2) ; - Month = SUBSTR(characters,Month,1) ; - Day = SUBSTR(ToDay,7,2) ; - - Day = SUBSTR(characters || numbers,Day,1) ; - NOW = TIME() ; - Hour = SUBSTR(NOW,1,2) ; - IF Hour = '00' THEN Hour = '0' - ELSE - Hour = SUBSTR(characters,Hour,1) ; - Minute = SUBSTR(NOW,4,2) ; - second = SUBSTR(NOW,7,2) ; - Unique_Name = Year || Month || Day || Hour ||, - Minute || second ; - SA= "Unique Member name is " Unique_Name - - Return Unique_Name From 6f2ec8351ef83531b102b009ae611b4fb4d37bd5 Mon Sep 17 00:00:00 2001 From: Joseph Walther Date: Thu, 19 Jun 2025 14:24:28 -0500 Subject: [PATCH 04/20] Corrected placement of members --- .../SYSDE32.NDVR.TEAM.BAT(SONRQUBE).txt | 69 ------------------- .../SYSDE32.NDVR.TEAM.FTP(SONRQUBE).txt | 17 ----- .../XCOM#INC.skl | 9 ++- .../XCOM#JOB.skl | 21 ++++++ .../XCOM#RCV.skl | 24 +++++++ .../XCOM#RUN.skl | 7 +- 6 files changed, 55 insertions(+), 92 deletions(-) delete mode 100644 endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/SYSDE32.NDVR.TEAM.BAT(SONRQUBE).txt delete mode 100644 endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/SYSDE32.NDVR.TEAM.FTP(SONRQUBE).txt create mode 100644 endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/XCOM#JOB.skl create mode 100644 endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/XCOM#RCV.skl diff --git a/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/SYSDE32.NDVR.TEAM.BAT(SONRQUBE).txt b/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/SYSDE32.NDVR.TEAM.BAT(SONRQUBE).txt deleted file mode 100644 index a2e06e4..0000000 --- a/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/SYSDE32.NDVR.TEAM.BAT(SONRQUBE).txt +++ /dev/null @@ -1,69 +0,0 @@ -REM In Windows, execute this command file to collect all Package -@ECHO OFF -ECHO ./ ADD NAME=@README > SonarQube.moveout -ECHO These items come from the Endevor GitHub at >> SonarQube.moveout -ECHO https://github.com/BroadcomMFD/broadcom-product-scripts >> SonarQube.moveout -ECHO ------------------------------------------------------- >> SonarQube.moveout -ECHO These are rex/CSIQCLS0 : GTUNIQUE BUMPJOB GETACCTC WAITFILE C1UEXTR7 >> SonarQube.moveout -ECHO These are skl/CSIQSENU : CAST#JCL FTP#INC FTP#RCV FTP#RUN SONARMDL SONARPRM SONARSET SONARTBL SONARW#1 SONARW#2 SONARW#3 XCOM#INC XCOM#JOB XCOM#RCV XCOM#RUN >> SonarQube.moveout -ECHO ./ ADD NAME=GTUNIQUE >> SonarQube.moveout -TYPE Processor-Tools-and-Processor-Snippets\GTUNIQUE.rex >> SonarQube.moveout -ECHO. >> SonarQube.moveout -ECHO ./ ADD NAME=BUMPJOB >> SonarQube.moveout -TYPE Processor-Tools-and-Processor-Snippets\BUMPJOB.rex >> SonarQube.moveout -ECHO. >> SonarQube.moveout -ECHO ./ ADD NAME=GETACCTC >> SonarQube.moveout -TYPE Miscellaneous-items\GETACCTC.rex >> SonarQube.moveout -ECHO. >> SonarQube.moveout -ECHO ./ ADD NAME=WAITFILE >> SonarQube.moveout -TYPE Miscellaneous-items\WAITFILE.rex >> SonarQube.moveout -ECHO. >> SonarQube.moveout -ECHO ./ ADD NAME=C1UEXTR7 >> SonarQube.moveout -TYPE SonarQube-interface-to-Endevor\C1UEXTR7.rex >> SonarQube.moveout -ECHO. >> SonarQube.moveout -ECHO ./ ADD NAME=CAST#JCL >> SonarQube.moveout -TYPE SonarQube-interface-to-Endevor\CAST#JCL.skl >> SonarQube.moveout -ECHO. >> SonarQube.moveout -ECHO ./ ADD NAME=FTP#INC >> SonarQube.moveout -TYPE SonarQube-interface-to-Endevor\FTP#INC.skl >> SonarQube.moveout -ECHO. >> SonarQube.moveout -ECHO ./ ADD NAME=FTP#RCV >> SonarQube.moveout -TYPE SonarQube-interface-to-Endevor\FTP#RCV.skl >> SonarQube.moveout -ECHO. >> SonarQube.moveout -ECHO ./ ADD NAME=FTP#RUN >> SonarQube.moveout -TYPE SonarQube-interface-to-Endevor\FTP#RUN.skl >> SonarQube.moveout -ECHO. >> SonarQube.moveout -ECHO ./ ADD NAME=SONARMDL >> SonarQube.moveout -TYPE SonarQube-interface-to-Endevor\SONARMDL.skl >> SonarQube.moveout -ECHO. >> SonarQube.moveout -ECHO ./ ADD NAME=SONARPRM >> SonarQube.moveout -TYPE SonarQube-interface-to-Endevor\SONARPRM.skl >> SonarQube.moveout -ECHO. >> SonarQube.moveout -ECHO ./ ADD NAME=SONARSET >> SonarQube.moveout -TYPE SonarQube-interface-to-Endevor\SONARSET.skl >> SonarQube.moveout -ECHO. >> SonarQube.moveout -ECHO ./ ADD NAME=SONARTBL >> SonarQube.moveout -TYPE SonarQube-interface-to-Endevor\SONARTBL.skl >> SonarQube.moveout -ECHO. >> SonarQube.moveout -ECHO ./ ADD NAME=SONARW#1 >> SonarQube.moveout -TYPE SonarQube-interface-to-Endevor\SONARW#1.skl >> SonarQube.moveout -ECHO. >> SonarQube.moveout -ECHO ./ ADD NAME=SONARW#2 >> SonarQube.moveout -TYPE SonarQube-interface-to-Endevor\SONARW#2.skl >> SonarQube.moveout -ECHO. >> SonarQube.moveout -ECHO ./ ADD NAME=SONARW#3 >> SonarQube.moveout -TYPE SonarQube-interface-to-Endevor\SONARW#3.skl >> SonarQube.moveout -ECHO. >> SonarQube.moveout -ECHO ./ ADD NAME=XCOM#INC >> SonarQube.moveout -TYPE SonarQube-interface-to-Endevor\XCOM#INC.skl >> SonarQube.moveout -ECHO. >> SonarQube.moveout -ECHO ./ ADD NAME=XCOM#JOB >> SonarQube.moveout -TYPE SonarQube-interface-to-Endevor\XCOM#JOB.skl >> SonarQube.moveout -ECHO. >> SonarQube.moveout -ECHO ./ ADD NAME=XCOM#RCV >> SonarQube.moveout -TYPE SonarQube-interface-to-Endevor\XCOM#RCV.skl >> SonarQube.moveout -ECHO. >> SonarQube.moveout -ECHO ./ ADD NAME=XCOM#RUN >> SonarQube.moveout -TYPE SonarQube-interface-to-Endevor\XCOM#RUN.skl >> SonarQube.moveout -ECHO. >> SonarQube.moveout -REM diff --git a/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/SYSDE32.NDVR.TEAM.FTP(SONRQUBE).txt b/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/SYSDE32.NDVR.TEAM.FTP(SONRQUBE).txt deleted file mode 100644 index 7897b2a..0000000 --- a/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/SYSDE32.NDVR.TEAM.FTP(SONRQUBE).txt +++ /dev/null @@ -1,17 +0,0 @@ -get 'SYSDE32.NDVR.TEAM.GITHUB.UTILITY(GTUNIQUE)' Processor-Tools-and-Processor-Snippets\GTUNIQUE.rex -get 'SYSDE32.NDVR.TEAM.GITHUB.UTILITY(BUMPJOB)' Processor-Tools-and-Processor-Snippets\BUMPJOB.rex -get 'SYSDE32.NDVR.TEAM.GITHUB.UTILITY(GETACCTC)' Miscellaneous-items\GETACCTC.rex -get 'SYSDE32.NDVR.TEAM.GITHUB.UTILITY(WAITFILE)' Miscellaneous-items\WAITFILE.rex -get 'SYSDE32.NDVR.TEAM.GITHUB.PACKAGE(C1UEXTR7)' SonarQube-interface-to-Endevor\C1UEXTR7.rex -get 'SYSDE32.NDVR.TEAM.GITHUB.PACKAGE(CAST#JCL)' SonarQube-interface-to-Endevor\CAST#JCL.skl -get 'SYSDE32.NDVR.TEAM.GITHUB.PACKAGE(FTP#INC)' SonarQube-interface-to-Endevor\FTP#INC.skl -get 'SYSDE32.NDVR.TEAM.GITHUB.PACKAGE(FTP#RUN)' SonarQube-interface-to-Endevor\FTP#RUN.skl -get 'SYSDE32.NDVR.TEAM.GITHUB.PACKAGE(SONARMDL)' SonarQube-interface-to-Endevor\SONARMDL.skl -get 'SYSDE32.NDVR.TEAM.GITHUB.PACKAGE(SONARPRM)' SonarQube-interface-to-Endevor\SONARPRM.skl -get 'SYSDE32.NDVR.TEAM.GITHUB.PACKAGE(SONARSET)' SonarQube-interface-to-Endevor\SONARSET.skl -get 'SYSDE32.NDVR.TEAM.GITHUB.PACKAGE(SONARTBL)' SonarQube-interface-to-Endevor\SONARTBL.skl -get 'SYSDE32.NDVR.TEAM.GITHUB.PACKAGE(SONARW#1)' SonarQube-interface-to-Endevor\SONARW#1.skl -get 'SYSDE32.NDVR.TEAM.GITHUB.PACKAGE(SONARW#2)' SonarQube-interface-to-Endevor\SONARW#2.skl -get 'SYSDE32.NDVR.TEAM.GITHUB.PACKAGE(SONARW#3)' SonarQube-interface-to-Endevor\SONARW#3.skl -get 'SYSDE32.NDVR.TEAM.GITHUB.PACKAGE(XCOM#INC)' SonarQube-interface-to-Endevor\XCOM#INC.skl -get 'SYSDE32.NDVR.TEAM.GITHUB.PACKAGE(XCOM#RUN)' SonarQube-interface-to-Endevor\XCOM#RUN.skl diff --git a/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/XCOM#INC.skl b/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/XCOM#INC.skl index fcf5b3f..2838ff3 100644 --- a/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/XCOM#INC.skl +++ b/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/XCOM#INC.skl @@ -10,8 +10,11 @@ PASSWORD=ndvruser * QQ //XCOM2 DD *,SYMBOLS=JCLONLY XCOM#INC -FILE=/tmp/&Member.&extension +FILE=/opt/xfer/inbound/&Member.&extension LFILE=&Dataset(&Member) * -&NewXfer -//XCOM3 DD DUMMY XCOM#INC +NEWXFER +//XCOM3 DD * XCOM#INC +FILE=/opt/xfer/inbound/&Unique_Name.lst +LFILE=&SonarWorkfile(TRANSMIT) +* diff --git a/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/XCOM#JOB.skl b/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/XCOM#JOB.skl new file mode 100644 index 0000000..1ad2a7c --- /dev/null +++ b/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/XCOM#JOB.skl @@ -0,0 +1,21 @@ +//*------------------------------------------------------------------- +//XCOM#JOB EXEC PGM=XCOMJOB, <- Exec SonarQube Analysis XCOM#JOB +// PARM=('TYPE=EXECUTE'),COND=(4,LT) +//STEPLIB DD DISP=SHR, +// DSN=SHARE.XCOM.CBXGLOAD * XCOM LOAD MODULES +// DD DISP=SHR, +// DSN=CEE.SCEERUN * IBM LE RUNTIME +//XCOMCNTL DD DISP=SHR, +// DSN=SHARE.XCOM.R120.CBXGPARM * CONTROL LIBRARY +//CAOESTOP DD DUMMY +//SYSIN01 DD * XCOM#JOB +TYPE=SEND +IPNAME=10.252.121.121 +IPPORT=8044 +CKPT=0 +FILEOPT=REPLACE +FILETYPE=JOB +LFILE=&SonarWorkfile(LINUX) +USERID=root +PASSWORD=Debug411 +//*--------------------------------------------------------XCOM#JOB--- diff --git a/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/XCOM#RCV.skl b/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/XCOM#RCV.skl new file mode 100644 index 0000000..27f8c25 --- /dev/null +++ b/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/XCOM#RCV.skl @@ -0,0 +1,24 @@ +//*------------------------------------------------------------------- +//XCOM#RCV EXEC PGM=XCOMJOB, <- Receive Results XCOM#RCV +// PARM=('TYPE=EXECUTE'),COND=(4,LT) +//STEPLIB DD DISP=SHR, +// DSN=SHARE.XCOM.CBXGLOAD * XCOM LOAD MODULES +// DD DISP=SHR, +// DSN=CEE.SCEERUN * IBM LE RUNTIME +//XCOMCNTL DD DISP=SHR, +// DSN=SHARE.XCOM.R120.CBXGPARM * CONTROL LIBRARY +//CAOESTOP DD DUMMY +//SYSIN01 DD * XCOM#RUN +TYPE=RECEIVE +IPNAME=10.252.121.121 +IPPORT=8044 +CKPT=0 +FILEOPT=REPLACE +FILETYPE=FILE +CODE=UTF8 +REMOTE_CHARSET=UTF8 +LFILE=&SonarWorkfile.RESULTS +FILE=/opt/xfer/outbound/&Unique_Name.rslt +USERID=sonaruser +PASSWORD=ndvruser +//*--------------------------------------------------------XCOM#RCV--- diff --git a/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/XCOM#RUN.skl b/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/XCOM#RUN.skl index 4d423b4..813b8df 100644 --- a/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/XCOM#RUN.skl +++ b/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/XCOM#RUN.skl @@ -1,7 +1,6 @@ //*------------------------------------------------------------------- -//XCOMJOB EXEC PGM=XCOMJOB, <- Transmit Files 2 server XCOM#RUN -// PARM=('TYPE=EXECUTE') -//*PARM=('TYPE=SCHEDULE,STCIP=10.175.80.48,STCPORT=8044') +//XCOM#RUN EXEC PGM=XCOMJOB, <- Exec SonarQube Analysis XCOM#RUN +// PARM=('TYPE=EXECUTE'),COND=(4,LT) //STEPLIB DD DISP=SHR, // DSN=SHARE.XCOM.CBXGLOAD * XCOM LOAD MODULES // DD DISP=SHR, @@ -9,5 +8,7 @@ //XCOMCNTL DD DISP=SHR, // DSN=SHARE.XCOM.R120.CBXGPARM * CONTROL LIBRARY //CAOESTOP DD DUMMY +//*-------- //SYSIN01 DD DSN=&&COMMANDS,DISP=(OLD,DELETE) XCOM#RUN //*------------------------------------------------------------------- +//*--------------------------------------------------------XCOM#RUN--- From e925b4350a32ec3c0ce93d64c611dabd158b2947 Mon Sep 17 00:00:00 2001 From: Chandru-Broadcom <136842024+Chandru-Broadcom@users.noreply.github.com> Date: Thu, 19 Jun 2025 15:29:42 -0500 Subject: [PATCH 05/20] Python Script for Sonar scanner --- .../SonarQube-interface-to-Endevor/snrscnr.py | 172 ++++++++++++++++++ 1 file changed, 172 insertions(+) create mode 100644 endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/snrscnr.py diff --git a/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/snrscnr.py b/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/snrscnr.py new file mode 100644 index 0000000..b92c5b0 --- /dev/null +++ b/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/snrscnr.py @@ -0,0 +1,172 @@ +import os +import sys +import subprocess +import time +import requests +import json +import logging +import textwrap + +logging.basicConfig( + filename='/opt/xxx/scripts/scanjob.log', # Provide your log file and its path + filemode='a', + format='%(asctime)s - %(levelname)s - %(message)s', + level=logging.DEBUG +) + +#CUSTOMIZE ALL THE FOLLOWING FIELDS TO YOUR VALUES +INBOUND_DIR = "/opt/xxx/inbound" +OUTBOUND_DIR = "/opt/xxx/outbound" +SONAR_SCANNER_PATH = "/opt/sonar-scanner/bin/sonar-scanner" +SONAR_HOST_URL = "https://" +SONAR_PROJECT_KEY = "= paging.get("total", 0): + break + params["p"] += 1 + return issues + +def main(): + if len(sys.argv) != 3: + logging.error("Usage: python3 script.py ") + sys.exit(1) + + config_filename = sys.argv[1] + config_path = os.path.join(INBOUND_DIR, config_filename) + output_filename = sys.argv[2] + + try: + with open(config_path, 'r') as f: + lines = f.readlines()[1:] + + + files_received = [] + + for line in lines: + parts = line.strip().split() + if len(parts) < 2: + continue + file_type, member = parts[0], parts[1] + extension = ".cbl" if file_type.upper() == "COBOL" else ".cpy" if file_type.upper() == "COPYBOOK" else "" + if extension: + files_received.append(f"{member}{extension}") + + ##Specify the path where your script needs to run from. In this sceneario above Inbound & Outbound folder structures. + os.chdir("/opt/xxx") + + # Run SonarScanner + run_sonar_scanner() + + # Wait for analysis to complete + ce_task_id = get_ce_task_id() + wait_for_analysis_completion(ce_task_id) + + # Retrieve analysis results + issues = get_analysis_results() + + # Organize issues by file + issues_by_file = {} + for issue in issues: + component = issue.get("component", "") + rel_path = component.split(":", 1)[-1] + base_name = os.path.basename(rel_path) + if base_name not in issues_by_file: + issues_by_file[base_name] = [] + issues_by_file[base_name].append({ + "type": issue.get("type"), + "severity": issue.get("severity"), + "message": issue.get("message") + }) + + # Write results to output file + output_path = os.path.join(OUTBOUND_DIR, output_filename) + with open(output_path, 'w',encoding='utf-8') as out: + wrapper = textwrap.TextWrapper(width=131, subsequent_indent=' ') + for file in files_received: + out.write(f" Analysis results for {file}:\n") + file_issues = issues_by_file.get(file, []) + if file_issues: + for issue in file_issues: + line = f" - [{issue['severity']}] {issue['type']}: {issue['message']}" + wrapped_lines = wrapper.wrap(line) + for wrapped_line in wrapped_lines: + out.write(f"{wrapped_line}\n") + else: + out.write(" - No issues found.\n") + out.write("\n") + out.write("Status: SUCCESS\n") + + logging.info(f"Processed {len(files_received)} files. Output written to {output_path}") + + + # Delete processed files + for file in files_received: + file_path = os.path.join(INBOUND_DIR, file) + if os.path.exists(file_path): + os.remove(file_path) + + except Exception as e: + logging.error(f"Error processing file: {e}") + sys.exit(1) + +if __name__ == "__main__": + main() + From ed1e67513d3424b6e4687c9b74567c6681ef3de2 Mon Sep 17 00:00:00 2001 From: Joseph Walther Date: Thu, 19 Jun 2025 15:33:09 -0500 Subject: [PATCH 06/20] Scrubbed --- .../FTP#INC.skl | 2 +- .../FTP#RUN.skl | 4 ++-- .../SONARMDL.skl | Bin 14175 -> 16646 bytes .../SONARPRM.skl | 3 +++ .../SONARSET.skl | 4 ++-- .../XCOM#INC.skl | 6 +++--- .../XCOM#JOB.skl | 6 +++--- .../XCOM#RCV.skl | 6 +++--- .../XCOM#RUN.skl | 4 ++-- 9 files changed, 19 insertions(+), 16 deletions(-) diff --git a/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/FTP#INC.skl b/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/FTP#INC.skl index 2cb8400..db8835e 100644 --- a/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/FTP#INC.skl +++ b/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/FTP#INC.skl @@ -10,6 +10,6 @@ \&Folder\&Member.&extension //FTP3 DD * <- All kinds of Stage info FTP#INC PUT '&SonarWorkfile(TRANSMIT)' + - TransmitTable.&uniqueName.lst + &uniqueName.lst QUIT //*---------- diff --git a/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/FTP#RUN.skl b/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/FTP#RUN.skl index 06e62b1..388f50f 100644 --- a/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/FTP#RUN.skl +++ b/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/FTP#RUN.skl @@ -1,10 +1,10 @@ //*================================================================ -//C1BMXNDM EXEC PGM=FTP,COND=(4,LT) FTP#RUN +//FTP#RUN EXEC PGM=FTP,COND=(4,LT) FTP#RUN //ABNLIGNR DD DUMMY //SYSPRINT DD SYSOUT=* //SYSABEND DD SYSOUT=* //NETRC DD DISP=SHR,DSN=&SYSUID..ENDEVOR.NETRC(SHIPPING) //SYSOUT DD SYSOUT=* //OUTPUT DD SYSOUT=* -//INPUT DD DSN=&&COMMANDS,DISP=(OLD,DELETE) FTP#RUN +//INPUT DD * FTP#RUN //*================================================================ diff --git a/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/SONARMDL.skl b/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/SONARMDL.skl index 7f9340ca69ad2fbae314e5d75c86f3301cd7a1a7..1b39f8909d1fc9198d90d7d9840be5725be8b0fd 100644 GIT binary patch delta 2085 zcmcIlO>7%g5XNcRl5LjY*ff8(Gl}EB#9iBQ67f@~a_ntzYW%Znr-_7AS?)$yIJRRu zsOD1O02idjdK{?KO7w(^5K2x+h$1*~4JWt&J##>C1qm_p*1v63ganrSX=dKH^WK}8 zH}iAp-FFNJDTCNdr4jBSFyBbpE($&$Y((Pm*cw1miONdI?NrO9T=i$u2754VEYwR<40XaW# zrsov#-{csO*4dOrK;1H^du;1pasAL{Wxq*FxNexH^`p~-cTI%1orJ$|e91-f`y7Ad zD7ndUljAYR84p>)K@+<)wAzvmI+Am~ZCeybstCmXMo5dI05B_W$&pwR=Gor7jCSK3 zt)5*V+~T-7O!CJZ?=RTdlqjM82VcA5rL{X8yEn!>p!KI`2zB`_ZqcJ!dzS1d4^dRt zV)5t}vl?S)JG4!)w~Z?(eQqSq)1!pj96#asC&xICk{+vHP3ZwqV3YpDDFBgOGSepq z=CoB5S}988b~OlrtDQ2^*`8y0Milz$f^+&T$O@phhQ-G2Jr_htPgQSlzCBO->B%dM zk^BY6bK@kx$}u2Cu@pqq|9V9KXo6V3Po&RLDAa8=mH=SionJ>Qn@kV4tl7*WnvWcp z2g$&UXV#kjVWhMiPm*;WU~RupybkeLBD)2V^6qY~be$cUp6?R5KYbnjfzf8vmAp=- z*T9m-F*Et=JdIRXc_rj}iXztZ51}&*Li@N>JM7rEE?^~Ps=2%dRW>shZu-wIpv5KM z(DH>c1RxqyuPA``%Vq-L2DPs3LRHI4uu~`%YUtYaIRC27Up$%LJ^?wT6WkPqN~8W- zxfBFnxl;Gt*wL!KTE1GS)N8)lUS(OTG@!Qvq++e!Z>ZLa_0FwP=nXzZqYzaSq5e+d z=Hc^rk=&efjQ52NZFuWcNPStsB)oWX=DMjFZG9ZO3~nU?7h%c6j;*V_rW+Qjk}p>X zyN|3ZJ+St#T(gmW$nn2yE)Qq*Mq*}*_7Lt+w$naebHuj6Q-ar)$=vl!1!a+0p-gCn7aIN>@-sk=6NnK3uR<|zb!EHZbYzEUCNt`YGcku#H zkppiV5H974jaq>jC(K^Try{G_ct*uah~odT@{wBWIFOupy7pOSMkCvCuiGE+`jOWXWG>euOPEN!OWnc;NLS7W=xaOEgklFryEqM%~M zSoWq<5JAM)Y3x6!TZcMyiV+nZqF{&EC5kRR->)(jL`5B5JRd%v=fm^s{oJ^wdsn(M zQX{H8B8)ea)#&qy6Y+F9bxeq?l8}{%6AQX1R&|7~KEnJa!h7brp74rsZ6*{32`?J9 z+(h`?+KIPKeVF&KFEf6aU@{O+F-y$TZuUP!uz3k(CN@C0zl~5cTJIX8s)3?e?FwJ` z95NAZGAqoIpP-XCY&)l9CQLIgBX)c;d$AHEctTycwZo6gA%Tk>CM<>y>V%dg7l>s> zwI^H1rWPx5a$clHVu^&3%S9x=HxLSVrGVcn1ws0NR`jCavno;Y%vXfwMBV20Z-e!t3W0S>-h=`tyJUTWcD_GNqYkq^% zn3@!h>ckX3IjV(;sbZyg+Upn9v&E9w@XO8qE;JAB$Ly|Nt-p;%7&(hfHh(;oNusci~QIwMj;!l}f?5z(Em6iU+< z&Q;^tOu~hS_8=!=!LPgH_$LwIiL TransmitCOND */ TransmitCOND = 0 /* Skip step if prev > TransmitCOND */ + TransmitCOND = 4 /* Skip step if prev > TransmitCOND */ diff --git a/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/XCOM#INC.skl b/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/XCOM#INC.skl index 2838ff3..75c9a92 100644 --- a/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/XCOM#INC.skl +++ b/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/XCOM#INC.skl @@ -1,6 +1,6 @@ //XCOM1 DD DATA,DLM=QQ,SYMBOLS=JCLONLY XCOM#INC TYPE=SEND -IPNAME=10.252.121.121 +IPNAME=12.345.678.9 IPPORT=8044 CKPT=0 FILEOPT=REPLACE @@ -10,11 +10,11 @@ PASSWORD=ndvruser * QQ //XCOM2 DD *,SYMBOLS=JCLONLY XCOM#INC -FILE=/opt/xfer/inbound/&Member.&extension +FILE=/your/uss/inbound/&Member.&extension LFILE=&Dataset(&Member) * NEWXFER //XCOM3 DD * XCOM#INC -FILE=/opt/xfer/inbound/&Unique_Name.lst +FILE=/your/uss/inbound/&Unique_Name.lst LFILE=&SonarWorkfile(TRANSMIT) * diff --git a/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/XCOM#JOB.skl b/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/XCOM#JOB.skl index 1ad2a7c..96d8fcf 100644 --- a/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/XCOM#JOB.skl +++ b/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/XCOM#JOB.skl @@ -2,15 +2,15 @@ //XCOM#JOB EXEC PGM=XCOMJOB, <- Exec SonarQube Analysis XCOM#JOB // PARM=('TYPE=EXECUTE'),COND=(4,LT) //STEPLIB DD DISP=SHR, -// DSN=SHARE.XCOM.CBXGLOAD * XCOM LOAD MODULES +// DSN=your.XCOM.CBXGLOAD * XCOM LOAD MODULES // DD DISP=SHR, // DSN=CEE.SCEERUN * IBM LE RUNTIME //XCOMCNTL DD DISP=SHR, -// DSN=SHARE.XCOM.R120.CBXGPARM * CONTROL LIBRARY +// DSN=your.XCOM.CBXGPARM * CONTROL LIBRARY //CAOESTOP DD DUMMY //SYSIN01 DD * XCOM#JOB TYPE=SEND -IPNAME=10.252.121.121 +IPNAME=12.345.678.9 IPPORT=8044 CKPT=0 FILEOPT=REPLACE diff --git a/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/XCOM#RCV.skl b/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/XCOM#RCV.skl index 27f8c25..a91c027 100644 --- a/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/XCOM#RCV.skl +++ b/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/XCOM#RCV.skl @@ -2,15 +2,15 @@ //XCOM#RCV EXEC PGM=XCOMJOB, <- Receive Results XCOM#RCV // PARM=('TYPE=EXECUTE'),COND=(4,LT) //STEPLIB DD DISP=SHR, -// DSN=SHARE.XCOM.CBXGLOAD * XCOM LOAD MODULES +// DSN=your.XCOM.CBXGLOAD * XCOM LOAD MODULES // DD DISP=SHR, // DSN=CEE.SCEERUN * IBM LE RUNTIME //XCOMCNTL DD DISP=SHR, -// DSN=SHARE.XCOM.R120.CBXGPARM * CONTROL LIBRARY +// DSN=your.XCOM.CBXGPARM * CONTROL LIBRARY //CAOESTOP DD DUMMY //SYSIN01 DD * XCOM#RUN TYPE=RECEIVE -IPNAME=10.252.121.121 +IPNAME=12.345.678.9 IPPORT=8044 CKPT=0 FILEOPT=REPLACE diff --git a/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/XCOM#RUN.skl b/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/XCOM#RUN.skl index 813b8df..1744529 100644 --- a/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/XCOM#RUN.skl +++ b/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/XCOM#RUN.skl @@ -2,11 +2,11 @@ //XCOM#RUN EXEC PGM=XCOMJOB, <- Exec SonarQube Analysis XCOM#RUN // PARM=('TYPE=EXECUTE'),COND=(4,LT) //STEPLIB DD DISP=SHR, -// DSN=SHARE.XCOM.CBXGLOAD * XCOM LOAD MODULES +// DSN=your.XCOM.CBXGLOAD * XCOM LOAD MODULES // DD DISP=SHR, // DSN=CEE.SCEERUN * IBM LE RUNTIME //XCOMCNTL DD DISP=SHR, -// DSN=SHARE.XCOM.R120.CBXGPARM * CONTROL LIBRARY +// DSN=your.XCOM.CBXGPARM * CONTROL LIBRARY //CAOESTOP DD DUMMY //*-------- //SYSIN01 DD DSN=&&COMMANDS,DISP=(OLD,DELETE) XCOM#RUN From 3b40cd47308c667b4838a1615ce3ed8fe509de62 Mon Sep 17 00:00:00 2001 From: Chandru-Broadcom <136842024+Chandru-Broadcom@users.noreply.github.com> Date: Wed, 25 Jun 2025 13:38:14 -0500 Subject: [PATCH 07/20] SonarScanner python --- .../SonarQube-interface-to-Endevor/snrscnr.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/snrscnr.py b/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/snrscnr.py index b92c5b0..eff66bd 100644 --- a/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/snrscnr.py +++ b/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/snrscnr.py @@ -71,7 +71,7 @@ def get_analysis_results(): "p": 1 } issues = [] - while True: + while True: response = requests.get(url, headers=headers, params=params) if response.status_code != 200: logging.error(f"Failed to retrieve issues: {response.status_code}") From 462a505af0f6278168d39492197cde600bdd5e71 Mon Sep 17 00:00:00 2001 From: Joseph Walther Date: Wed, 25 Jun 2025 13:43:46 -0500 Subject: [PATCH 08/20] Update README.md --- .../SonarQube-interface-to-Endevor/README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/README.md b/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/README.md index b74d29a..6f565a1 100644 --- a/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/README.md +++ b/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/README.md @@ -1,5 +1,8 @@ # SonarQube Interface to Endevor +Hello Chandru. going to enter more text when time allows. + + Items in this folder demonstrate an example method for interfacing SonarQube with Endevor. They support the automated execution of a SonarQube analysis during the CAST of an Endevor Package. If the SonarQube analysis returns a "failure", then the Endevor CAST action is made to fail. These samples are provided as is and are not officially supported (see [license](https://github.com/BroadcomMFD/broadcom-product-scripts/blob/main/LICENSE From 9acedf17c9a89bfcec0c403f0f47823bd30fe154 Mon Sep 17 00:00:00 2001 From: Joseph Walther Date: Sat, 28 Jun 2025 17:49:19 -0500 Subject: [PATCH 09/20] Update README.md --- .../SonarQube-interface-to-Endevor/README.md | 34 +++++++++++++++---- 1 file changed, 27 insertions(+), 7 deletions(-) diff --git a/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/README.md b/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/README.md index 6f565a1..74c4ce1 100644 --- a/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/README.md +++ b/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/README.md @@ -1,16 +1,36 @@ # SonarQube Interface to Endevor -Hello Chandru. going to enter more text when time allows. - - -Items in this folder demonstrate an example method for interfacing SonarQube with Endevor. They support the automated execution of a SonarQube analysis during the CAST of an Endevor Package. If the SonarQube analysis returns a "failure", then the Endevor CAST action is made to fail. +Items in this folder provide an example method for interfacing SonarQube with Endevor. They allow Endevor to initiate a SonarQube analysis for an Endevor package, receive the quality gates response from the SonarQube analysis, and pass or fail the CAST of the package depening on the results. These samples are provided as is and are not officially supported (see [license](https://github.com/BroadcomMFD/broadcom-product-scripts/blob/main/LICENSE ) for more information). -REXX, Python and "skeleton" components are found in this folder. - -Items not found in this folder are found in other locations of this GitHub, including: +Features of this solution are easily tailorable to fit your site. By default they include: + +1. Makes some initial analysis of a CASTing package to +determine whether to initiate the SonarQube +analysis: + - The Package must have at least one COBOL element. Element types of COB* or CBL* are selected, but you can designate your own choice. + - If any of rhe Package note lines can begin with the text "BYPASS SONARQUBE", no SonarQube analysis is done. +2. If conditions are met, and the package is being CAST in TSO foreground, the CAST action is resubmitted in Batch. Since it may be necessary to wait for time-consuming actions to run, it is best for this process to run in batch. +3. COBOL programs in the package are identified. +4. ACM is referenced to identify input components for packaged COBOL elements. Input components such as copybooks, do not need to be included in the package. Rather, the ACM information for COBOL elements will caulse copybooks to be included in the SonarQube analysis. +5. A separate (second) JOB is constructed and submitted. The steps of the separate job include: + - Report back to the Endevor exit (running as job #1 doing a CAST) that the second job is running + - COBOL elements are RETRIEVEd into a PDS dataset + - COBOL and copybook members are transmittted to the server that runs SonarQube. Cobol members are transmitted from the RETRIEVE dataset. Copybook members are transmitted from datasets named in the ACM references. + - Report back to the Endevor exit that the member transmissions are done + - A SonarQube analysis is executed + - The SonarQube results are transmitted back to the site running the Endevor CAST. + - Report back to the Endevor exit the SonarQube results. +6. The Endevor exit waits for confirmation that the separate job is running, and displays messages accordingly +7. The Endevor exit waits for confirmation that the file transmissions are done, and displays messages accordingly. +8. The Endevor exit waits for the return of the SonarQube analysis, and displays messages accordingly. +9. If any of the expected results are not returned, or the analysis indicates a code analysis failure, the package CAST is made to Fail. + +The COBOL exit is constructed to rely on a REXX subroutine to perform the main processing. A Python member orchestrates the SonarQube activity. The Python itself. File transmissions are performed with XCOM, in these examples, but can easily be swapped out with members that run your transmission tool. + +Some supporting items not found in this folder, since they are utilities, or already contribute to other solutions. They can be found in other locations of this GitHub, including: **[BUMPJOB.rex](https://github.com/BroadcomMFD/broadcom-product-scripts/blob/main/endevor/Field-Developed-Programs/Processor-Tools-and-Processor-Snippets/BUMPJOB.rex)** for bumping an existing jobname to render a new job name From 62d5613a97f650b7637d6282b8c43e767ff5949b Mon Sep 17 00:00:00 2001 From: Joseph Walther Date: Sat, 28 Jun 2025 18:44:29 -0500 Subject: [PATCH 10/20] Update README.md --- .../SonarQube-interface-to-Endevor/README.md | 43 +++++++++---------- 1 file changed, 20 insertions(+), 23 deletions(-) diff --git a/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/README.md b/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/README.md index 74c4ce1..313b808 100644 --- a/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/README.md +++ b/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/README.md @@ -5,30 +5,27 @@ Items in this folder provide an example method for interfacing SonarQube with En These samples are provided as is and are not officially supported (see [license](https://github.com/BroadcomMFD/broadcom-product-scripts/blob/main/LICENSE ) for more information). -Features of this solution are easily tailorable to fit your site. By default they include: - -1. Makes some initial analysis of a CASTing package to -determine whether to initiate the SonarQube -analysis: - - The Package must have at least one COBOL element. Element types of COB* or CBL* are selected, but you can designate your own choice. - - If any of rhe Package note lines can begin with the text "BYPASS SONARQUBE", no SonarQube analysis is done. -2. If conditions are met, and the package is being CAST in TSO foreground, the CAST action is resubmitted in Batch. Since it may be necessary to wait for time-consuming actions to run, it is best for this process to run in batch. -3. COBOL programs in the package are identified. -4. ACM is referenced to identify input components for packaged COBOL elements. Input components such as copybooks, do not need to be included in the package. Rather, the ACM information for COBOL elements will caulse copybooks to be included in the SonarQube analysis. -5. A separate (second) JOB is constructed and submitted. The steps of the separate job include: - - Report back to the Endevor exit (running as job #1 doing a CAST) that the second job is running +Features of this solution are easily tailorable to the requirements at your site. By default they include: + +1. During a package CAST, an analysis of the pckage content and package notes is done. + - It is determined whether the Package has at least one COBOL element. Element types of COB* or CBL* make the determination, but you can designate your own manner of recognition. + - If any of rhe Package note lines can begin with the text "BYPASS SONARQUBE", no SonarQube analysis will be done. If it becomes necessary to bypass the SonarQube processing, then a simple update of the package notes will bypass the SonarQube analysis. +2. If package contains COBOL elements, and the BYPASS is not selected, and the package is being CAST in TSO foreground, then the CAST action is resubmitted in Batch. Since it may be necessary to wait for time-consuming actions to complete, it is best for this process to run in batch. +3. All COBOL programs in the package are identified, and ACM queries are used for identifying input components for packaged COBOL elements. Input components such as copybooks, do not need to be included in the package. Rather, the ACM information for packaged COBOL elements will bring copybooks into the SonarQube analysis. +4. A separate (second) JOB is constructed and submitted. The steps of the separate job include: + - Reports back to the Endevor exit (running as job #1 doing a CAST) that the second job is running - COBOL elements are RETRIEVEd into a PDS dataset - - COBOL and copybook members are transmittted to the server that runs SonarQube. Cobol members are transmitted from the RETRIEVE dataset. Copybook members are transmitted from datasets named in the ACM references. - - Report back to the Endevor exit that the member transmissions are done - - A SonarQube analysis is executed - - The SonarQube results are transmitted back to the site running the Endevor CAST. - - Report back to the Endevor exit the SonarQube results. -6. The Endevor exit waits for confirmation that the separate job is running, and displays messages accordingly -7. The Endevor exit waits for confirmation that the file transmissions are done, and displays messages accordingly. -8. The Endevor exit waits for the return of the SonarQube analysis, and displays messages accordingly. -9. If any of the expected results are not returned, or the analysis indicates a code analysis failure, the package CAST is made to Fail. - -The COBOL exit is constructed to rely on a REXX subroutine to perform the main processing. A Python member orchestrates the SonarQube activity. The Python itself. File transmissions are performed with XCOM, in these examples, but can easily be swapped out with members that run your transmission tool. + - COBOL and copybook members are transmittted to the SonarQube server. Cobol members are transmitted from the RETRIEVE dataset. Copybook members are transmitted from datasets named in the ACM references. + - Reports back to the Endevor exit that the member transmissions are completed + - Executes a SonarQube analysis. + - Transmits the SonarQube results back to the site running the Endevor CAST. + +5. The Endevor exit waits for confirmation that the separate job is running, and displays messages accordingly +6. The Endevor exit waits for confirmation that the file transmissions are done, and displays messages accordingly. +7. The Endevor exit waits for the return of the SonarQube analysis, and displays messages accordingly. +8. If any of the expected results are not returned, or the analysis indicates a code analysis failure, the package CAST is made to Fail. + +Processing logic is primarily found in REXX, JCL and Python members. The Python member orchestrates the SonarQube activity. File transmissions are performed using XCOM, in these examples, but they easily be swapped out for members that use your transmission tool. Some supporting items not found in this folder, since they are utilities, or already contribute to other solutions. They can be found in other locations of this GitHub, including: From e55ac3558a14f2dc08c8dfcf29a9b398b443779a Mon Sep 17 00:00:00 2001 From: Joseph Walther Date: Sat, 28 Jun 2025 19:05:19 -0500 Subject: [PATCH 11/20] Update README.md --- .../SonarQube-interface-to-Endevor/README.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/README.md b/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/README.md index 313b808..7d9c1cb 100644 --- a/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/README.md +++ b/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/README.md @@ -1,6 +1,6 @@ # SonarQube Interface to Endevor -Items in this folder provide an example method for interfacing SonarQube with Endevor. They allow Endevor to initiate a SonarQube analysis for an Endevor package, receive the quality gates response from the SonarQube analysis, and pass or fail the CAST of the package depening on the results. +Items in this folder provide an example method for interfacing SonarQube with Endevor. They allow Endevor to initiate a SonarQube analysis for an Endevor package, receive the quality gates response from the SonarQube analysis, and pass or fail the CAST of the package depending on the results. These samples are provided as is and are not officially supported (see [license](https://github.com/BroadcomMFD/broadcom-product-scripts/blob/main/LICENSE ) for more information). @@ -11,19 +11,19 @@ Features of this solution are easily tailorable to the requirements at your site - It is determined whether the Package has at least one COBOL element. Element types of COB* or CBL* make the determination, but you can designate your own manner of recognition. - If any of rhe Package note lines can begin with the text "BYPASS SONARQUBE", no SonarQube analysis will be done. If it becomes necessary to bypass the SonarQube processing, then a simple update of the package notes will bypass the SonarQube analysis. 2. If package contains COBOL elements, and the BYPASS is not selected, and the package is being CAST in TSO foreground, then the CAST action is resubmitted in Batch. Since it may be necessary to wait for time-consuming actions to complete, it is best for this process to run in batch. -3. All COBOL programs in the package are identified, and ACM queries are used for identifying input components for packaged COBOL elements. Input components such as copybooks, do not need to be included in the package. Rather, the ACM information for packaged COBOL elements will bring copybooks into the SonarQube analysis. -4. A separate (second) JOB is constructed and submitted. The steps of the separate job include: +3. All COBOL programs in the package are identified, and ACM queries are used for identifying input components. Input components such as copybooks, do not need to be included in the package. Rather, the ACM information for packaged COBOL elements will bring copybooks into the SonarQube analysis. +4. Packaged COBOL elements are RETRIEVEd into a PDS. +5. A separate (second) JOB is constructed and submitted. The steps of the separate job include: - Reports back to the Endevor exit (running as job #1 doing a CAST) that the second job is running - - COBOL elements are RETRIEVEd into a PDS dataset - COBOL and copybook members are transmittted to the SonarQube server. Cobol members are transmitted from the RETRIEVE dataset. Copybook members are transmitted from datasets named in the ACM references. - Reports back to the Endevor exit that the member transmissions are completed - Executes a SonarQube analysis. - Transmits the SonarQube results back to the site running the Endevor CAST. -5. The Endevor exit waits for confirmation that the separate job is running, and displays messages accordingly -6. The Endevor exit waits for confirmation that the file transmissions are done, and displays messages accordingly. -7. The Endevor exit waits for the return of the SonarQube analysis, and displays messages accordingly. -8. If any of the expected results are not returned, or the analysis indicates a code analysis failure, the package CAST is made to Fail. +6. The Endevor exit waits for confirmation that the separate job is running, and displays messages accordingly +7. The Endevor exit waits for confirmation that the file transmissions are done, and displays messages accordingly. +8. The Endevor exit waits for the return of the SonarQube analysis, and displays messages accordingly. +9. If any of the expected results are not returned, or the analysis indicates a code analysis failure, the package CAST is made to Fail. Processing logic is primarily found in REXX, JCL and Python members. The Python member orchestrates the SonarQube activity. File transmissions are performed using XCOM, in these examples, but they easily be swapped out for members that use your transmission tool. From 80beaefc22c67ccb16d355d9d12e23e578515cbd Mon Sep 17 00:00:00 2001 From: Chandru-Broadcom <136842024+Chandru-Broadcom@users.noreply.github.com> Date: Mon, 30 Jun 2025 13:59:44 -0500 Subject: [PATCH 12/20] Update README.md --- .../SonarQube-interface-to-Endevor/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/README.md b/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/README.md index 7d9c1cb..1e1a850 100644 --- a/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/README.md +++ b/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/README.md @@ -9,7 +9,7 @@ Features of this solution are easily tailorable to the requirements at your site 1. During a package CAST, an analysis of the pckage content and package notes is done. - It is determined whether the Package has at least one COBOL element. Element types of COB* or CBL* make the determination, but you can designate your own manner of recognition. - - If any of rhe Package note lines can begin with the text "BYPASS SONARQUBE", no SonarQube analysis will be done. If it becomes necessary to bypass the SonarQube processing, then a simple update of the package notes will bypass the SonarQube analysis. + - If any of the Package note lines can begin with the text "BYPASS SONARQUBE", no SonarQube analysis will be done. If it becomes necessary to bypass the SonarQube processing, then a simple update of the package notes will bypass the SonarQube analysis. 2. If package contains COBOL elements, and the BYPASS is not selected, and the package is being CAST in TSO foreground, then the CAST action is resubmitted in Batch. Since it may be necessary to wait for time-consuming actions to complete, it is best for this process to run in batch. 3. All COBOL programs in the package are identified, and ACM queries are used for identifying input components. Input components such as copybooks, do not need to be included in the package. Rather, the ACM information for packaged COBOL elements will bring copybooks into the SonarQube analysis. 4. Packaged COBOL elements are RETRIEVEd into a PDS. From 8e0e9d80e0e66f48f9b5e6deb2ee431f27ba7efe Mon Sep 17 00:00:00 2001 From: Joseph Walther Date: Mon, 30 Jun 2025 14:21:48 -0500 Subject: [PATCH 13/20] Masking --- .../SonarQube-interface-to-Endevor/C1UEXTR7.rex | 2 +- .../{snrscnr.py => SonarDriver.py} | 0 .../SonarQube-interface-to-Endevor/XCOM#INC.skl | 2 +- .../SonarQube-interface-to-Endevor/XCOM#JOB.skl | 2 +- 4 files changed, 3 insertions(+), 3 deletions(-) rename endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/{snrscnr.py => SonarDriver.py} (100%) diff --git a/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/C1UEXTR7.rex b/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/C1UEXTR7.rex index f38372f..4980b3f 100644 --- a/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/C1UEXTR7.rex +++ b/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/C1UEXTR7.rex @@ -114,7 +114,7 @@ Call GetUnique_Name SonarDSNPrefix = USERID()'.SONRQUBE.' || Unique_Name SonarRemoteCommand =, - "python3 /opt/xfer/scripts/sqp3.py" Unique_Name.lst + "python3 /opt/xfer/scripts/SonarDriver.py" Unique_Name.lst TransmitTable = "" End /* If Cast_with_SonarQube = 'Y' */ End /* If Cast_with_SonarQube /= 'N' */ diff --git a/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/snrscnr.py b/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/SonarDriver.py similarity index 100% rename from endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/snrscnr.py rename to endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/SonarDriver.py diff --git a/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/XCOM#INC.skl b/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/XCOM#INC.skl index 75c9a92..517c0e2 100644 --- a/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/XCOM#INC.skl +++ b/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/XCOM#INC.skl @@ -6,7 +6,7 @@ CKPT=0 FILEOPT=REPLACE FILETYPE=FILE USERID=sonaruser -PASSWORD=ndvruser +PASSWORD=sonarpswd * QQ //XCOM2 DD *,SYMBOLS=JCLONLY XCOM#INC diff --git a/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/XCOM#JOB.skl b/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/XCOM#JOB.skl index 96d8fcf..951b81d 100644 --- a/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/XCOM#JOB.skl +++ b/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/XCOM#JOB.skl @@ -17,5 +17,5 @@ FILEOPT=REPLACE FILETYPE=JOB LFILE=&SonarWorkfile(LINUX) USERID=root -PASSWORD=Debug411 +PASSWORD= //*--------------------------------------------------------XCOM#JOB--- From 112da424eebf4a2fe9590bf9cb184e3c15921484 Mon Sep 17 00:00:00 2001 From: Joseph Walther Date: Mon, 30 Jun 2025 14:27:44 -0500 Subject: [PATCH 14/20] Masking --- .../SonarQube-interface-to-Endevor/SonarDriver.py | 2 +- .../SonarQube-interface-to-Endevor/XCOM#INC.skl | 4 ++-- .../SonarQube-interface-to-Endevor/XCOM#RCV.skl | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/SonarDriver.py b/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/SonarDriver.py index eff66bd..90e92d5 100644 --- a/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/SonarDriver.py +++ b/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/SonarDriver.py @@ -6,7 +6,7 @@ import json import logging import textwrap - +# logging.basicConfig( filename='/opt/xxx/scripts/scanjob.log', # Provide your log file and its path filemode='a', diff --git a/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/XCOM#INC.skl b/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/XCOM#INC.skl index 517c0e2..6295f8f 100644 --- a/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/XCOM#INC.skl +++ b/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/XCOM#INC.skl @@ -5,8 +5,8 @@ IPPORT=8044 CKPT=0 FILEOPT=REPLACE FILETYPE=FILE -USERID=sonaruser -PASSWORD=sonarpswd +USERID=root +PASSWORD= * QQ //XCOM2 DD *,SYMBOLS=JCLONLY XCOM#INC diff --git a/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/XCOM#RCV.skl b/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/XCOM#RCV.skl index a91c027..42bb2fd 100644 --- a/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/XCOM#RCV.skl +++ b/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/XCOM#RCV.skl @@ -19,6 +19,6 @@ CODE=UTF8 REMOTE_CHARSET=UTF8 LFILE=&SonarWorkfile.RESULTS FILE=/opt/xfer/outbound/&Unique_Name.rslt -USERID=sonaruser -PASSWORD=ndvruser +USERID=root +PASSWORD= //*--------------------------------------------------------XCOM#RCV--- From a6dd02078635c5f8e3ad0cb1157847553c7369a6 Mon Sep 17 00:00:00 2001 From: Joseph Walther Date: Mon, 29 Sep 2025 16:18:46 -0500 Subject: [PATCH 15/20] Update references and README --- .../Miscellaneous-items/BUMPJOB.rex | 20 ++++ .../Miscellaneous-items/GTUNIQUE.rex | 25 +++++ .../Miscellaneous-items/QMATCH.rex | 18 ++++ .../Miscellaneous-items/WAITFILE.rex | 92 +++++++++---------- .../SonarQube-interface-to-Endevor/README.md | 11 ++- 5 files changed, 119 insertions(+), 47 deletions(-) create mode 100644 endevor/Field-Developed-Programs/Miscellaneous-items/BUMPJOB.rex create mode 100644 endevor/Field-Developed-Programs/Miscellaneous-items/GTUNIQUE.rex create mode 100644 endevor/Field-Developed-Programs/Miscellaneous-items/QMATCH.rex diff --git a/endevor/Field-Developed-Programs/Miscellaneous-items/BUMPJOB.rex b/endevor/Field-Developed-Programs/Miscellaneous-items/BUMPJOB.rex new file mode 100644 index 0000000..d6dab6a --- /dev/null +++ b/endevor/Field-Developed-Programs/Miscellaneous-items/BUMPJOB.rex @@ -0,0 +1,20 @@ +/* REXX */ +/* Bump the last character on a Jobname to next value */ +/* select is either empty/next for next character */ +/* or j/jump for a big gap */ + Trace O + Arg jobname select + Rotation = '12345678901', + 'ABCDEFGHIJKLMNOPQRSTUVWXYZA', + '@#$@' + jobname = word(jobname,1) + lastchar = Substr(jobname,Length(jobname)) + locatchar = Pos(lastchar,Rotation) + If select = 'j' | select = 'jump' then, + wherenext = (locatchar + length(Rotataton) // 2 + Else, + wherenext = locatchar + 1 + overlaychar = Substr(Rotation,wherenext,1) + wheretohit = Min(Length(jobname)+1,8) + nextJobname = overlay(overlaychar,jobname,wheretohit) + Return nextJobname diff --git a/endevor/Field-Developed-Programs/Miscellaneous-items/GTUNIQUE.rex b/endevor/Field-Developed-Programs/Miscellaneous-items/GTUNIQUE.rex new file mode 100644 index 0000000..800b396 --- /dev/null +++ b/endevor/Field-Developed-Programs/Miscellaneous-items/GTUNIQUE.rex @@ -0,0 +1,25 @@ + /* REXX */ + /* Build a unique 8-byte name from date and time */ + + numbers = '123456789' ; + characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' ; + ToDay = DATE(O) ; + Year = SUBSTR(ToDay,1,2) + 1; + Year = SUBSTR(characters||characters||characters||characters,Year,1) + Month = SUBSTR(ToDay,4,2) ; + Month = SUBSTR(characters,Month,1) ; + Day = SUBSTR(ToDay,7,2) ; + + Day = SUBSTR(characters || numbers,Day,1) ; + NOW = TIME() ; + Hour = SUBSTR(NOW,1,2) ; + IF Hour = '00' THEN Hour = '0' + ELSE + Hour = SUBSTR(characters,Hour,1) ; + Minute = SUBSTR(NOW,4,2) ; + second = SUBSTR(NOW,7,2) ; + Unique_Name = Year || Month || Day || Hour ||, + Minute || second ; + SA= "Unique Member name is " Unique_Name + + Return Unique_Name diff --git a/endevor/Field-Developed-Programs/Miscellaneous-items/QMATCH.rex b/endevor/Field-Developed-Programs/Miscellaneous-items/QMATCH.rex new file mode 100644 index 0000000..03faef0 --- /dev/null +++ b/endevor/Field-Developed-Programs/Miscellaneous-items/QMATCH.rex @@ -0,0 +1,18 @@ + /* REXX */ + PARSE ARG Parm1 Parm2 + +/* Check to see if Parm1 is selected (or matches) Parm2 */ +/* Allowing for Parm2 to have wildcard characters */ + + If Parm1 = Parm2 then Return(1) + + If Parm1 ='*' | Parm2 ='*' then Return(1) + whereAsterisk = Pos('*',Parm2) + If whereAsterisk = 0 then Return(0) + If whereAsterisk > 1 then whereAsterisk = whereAsterisk - 1; + + If Substr(Parm1,1,whereAsterisk) = , + Substr(Parm2,1,whereAsterisk) then Return(1) + + Return(0) + diff --git a/endevor/Field-Developed-Programs/Miscellaneous-items/WAITFILE.rex b/endevor/Field-Developed-Programs/Miscellaneous-items/WAITFILE.rex index d58add5..e6f7019 100644 --- a/endevor/Field-Developed-Programs/Miscellaneous-items/WAITFILE.rex +++ b/endevor/Field-Developed-Programs/Miscellaneous-items/WAITFILE.rex @@ -1,46 +1,46 @@ - /* REXX */ - /* Loop in Wait status until named file appears */ - /* Return 0 if file never appears after all waits */ - /* Return # for number of seconds used waiting */ - - Arg WaitForFilename MaxLoops WaitSeconds - - STRING = "ALLOC DD(WAITFILE)", - " DA('"WaitForFilename"') SHR REUSE" - seconds = WaitSeconds /* Number of Seconds to wait if needed */ - - Do MaxLoops - /* or at least until the file is available */ - Do Loop# = 1 to MaxLoops - CALL BPXWDYN STRING; - MyResult = RESULT ; - If MyResult = 0 then Return (Loop# * WaitSeconds) - Say 'WAITFILE is waiting for' WaitForFilename - Call WaitAwhile - End /* Do MaxLoops */ - - Return 0 - -WaitAwhile: - /* */ - /* A resource is unavailable. Wait awhile and try */ - /* accessing the resource again. */ - /* */ - /* The length of the wait is designated in the parameter */ - /* value which specifies a number of seconds. */ - /* A parameter value of '000003' causes a wait for 3 seconds. */ - /* */ - /*seconds = Abs(seconds) */ - /*seconds = Trunc(seconds,0) */ - Say "Waiting for" seconds "seconds at " DATE(S) TIME() - /* AOPBATCH and BPXWDYN are IBM programs */ - CALL BPXWDYN "ALLOC DD(STDOUT) DUMMY SHR REUSE" - CALL BPXWDYN "ALLOC DD(STDERR) DUMMY SHR REUSE" - CALL BPXWDYN "ALLOC DD(STDIN) DUMMY SHR REUSE" - - /* AOPBATCH and BPXWDYN are IBM programs */ - parm = "sleep "seconds - Address LINKMVS "AOPBATCH parm" - - Return - + /* REXX */ + /* Loop in Wait status until named file appears */ + /* Return 0 if file never appears after all waits */ + /* Return # for number of seconds used waiting */ + + Arg WaitForFilename MaxLoops WaitSeconds + + STRING = "ALLOC DD(WAITFILE)", + " DA('"WaitForFilename"') SHR REUSE" + seconds = WaitSeconds /* Number of Seconds to wait if needed */ + + Do MaxLoops + /* or at least until the file is available */ + Do Loop# = 1 to MaxLoops + CALL BPXWDYN STRING; + MyResult = RESULT ; + If MyResult = 0 then Return (Loop# * WaitSeconds) + Say 'WAITFILE is waiting for' WaitForFilename + Call WaitAwhile + End /* Do MaxLoops */ + + Return 0 + +WaitAwhile: + /* */ + /* A resource is unavailable. Wait awhile and try */ + /* accessing the resource again. */ + /* */ + /* The length of the wait is designated in the parameter */ + /* value which specifies a number of seconds. */ + /* A parameter value of '000003' causes a wait for 3 seconds. */ + /* */ + /*seconds = Abs(seconds) */ + /*seconds = Trunc(seconds,0) */ + Say "Waiting for" seconds "seconds at " DATE(S) TIME() + /* AOPBATCH and BPXWDYN are IBM programs */ + CALL BPXWDYN "ALLOC DD(STDOUT) DUMMY SHR REUSE" + CALL BPXWDYN "ALLOC DD(STDERR) DUMMY SHR REUSE" + CALL BPXWDYN "ALLOC DD(STDIN) DUMMY SHR REUSE" + + /* AOPBATCH and BPXWDYN are IBM programs */ + parm = "sleep "seconds + Address LINKMVS "AOPBATCH parm" + + Return + diff --git a/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/README.md b/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/README.md index 1e1a850..70f6f96 100644 --- a/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/README.md +++ b/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/README.md @@ -39,7 +39,16 @@ Some supporting items not found in this folder, since they are utilities, or alr **[WAITFILE.rex](https://github.com/BroadcomMFD/broadcom-product-scripts/blob/main/endevor/Field-Developed-Programs/Miscellaneous-items/WAITFILE.rex)** for looping through wait periods of time, until a specific file becomes available. -Use the SonarQube.bat commmand to bring the items together for your mainframe. +**[SCAN#SCL](https://github.com/BroadcomMFD/broadcom-product-scripts/blob/main/endevor/Field-Developed-Programs/Multi-Package-Reporting-and-Validations/SCAN%23SCL.rex)** for converting SCL statements into a table format. + +**[QMATCH]( )** + +**[WHERE@M1](https://github.com/BroadcomMFD/broadcom-product-scripts/blob/main/endevor/Field-Developed-Programs/Package-Automation/WHERE%40M1.rex)** the utility used for supporting diversity of dataset names, and other differences, by Lpar. + + +Use the SonarQube.bat commmand to bring the items together for your mainframe. + + From df996e9e3a5b3ce758f0c51e3716b84263464e78 Mon Sep 17 00:00:00 2001 From: Joseph Walther Date: Mon, 29 Sep 2025 18:23:21 -0500 Subject: [PATCH 16/20] Simplification and Clarification --- .../C1UEXTR7.rex | 1537 +++-------------- .../SonarQube-interface-to-Endevor/README.md | 13 +- .../SONRQUBE.rex | 527 ++++++ 3 files changed, 782 insertions(+), 1295 deletions(-) create mode 100644 endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/SONRQUBE.rex diff --git a/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/C1UEXTR7.rex b/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/C1UEXTR7.rex index 4980b3f..16973bb 100644 --- a/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/C1UEXTR7.rex +++ b/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/C1UEXTR7.rex @@ -1,1289 +1,248 @@ -/* rexx */ -/* Perform various Package actions in REXX */ -/* */ -/* A COBOL exit CALLS this REXX and provides values for */ -/* REXX variables, including these. */ -/* Find documentation on these in the TechDocs documentation */ -/* where each underscore appears as a dash in the documentation. */ -/* For example, PECB_PACKAGE_ID is documented as */ -/* PECB-PACKAGE-ID */ -/* */ -/* PECB_PACKAGE_ID PAPP_GROUP_NAME */ -/* PECB_FUNCTION_LITERAL PAPP_ENVIRONMENT */ -/* PECB_SUBFUNC_LITERAL PAPP_QUORUM_COUNT */ -/* PECB_BEF_AFTER_LITERAL PAPP_APPROVER_FLAG */ -/* PECB_USER_BATCH_JOBNAME PAPP_APPR_GRP_TYPE */ -/* PREQ_PKG_CAST_COMPVAL PAPP_APPR_GRP_DISQ */ -/* PHDR_PKG_SHR_OPTION PAPP_SEQUENCE_NUMBER */ -/* PHDR_PKG_ENV */ -/* PHDR_PKG_STGID */ -/* Address fields are provided for fields that may be */ -/* modified by the REXX. */ -/* Address_PECB_MESSAGE Address_MYSMTP_SUBJECT */ -/* Address_MYSMTP_MESSAGE Address_MYSMTP_TEXT */ -/* Address_MYSMTP_USERID Address_MYSMTP_URL */ -/* Address_MYSMTP_FROM Address_MYSMTP_EMAIL_IDS */ -/* MYSMTP_EMAIL_IDS MYSMTP_EMAIL_ID_SIZE */ -/* */ - /* If wanting to limit the use of this exit, uncomment... */ -/* - If USERID() /= 'IBMUSER' &, - USERID() /= 'JW61868' &, - USERID() /= 'JW618685' then Say USERID() -*/ - /* If wanting to send email, use these variables with */ - /* designated maximum lengths. The Rexx will put them */ - /* into their proper places. */ - /* */ - /* Variable Description max-Len */ - /* */ - /* MySMTP_Message Email Message 80 */ - /* MySMTP_From Email From name 50 */ - /* MySMTP_Subject Email Subject 50 */ - /* MySMTP_textline.1 Text line in email 133 */ - /* MySMTP_textline.2 " 133 */ - /* MySMTP_textline.nn up to 99 133 */ - /* MySMTP_textline.0 Number Text lines used (max 99) 2 */ - /* MySMTP_URL Y/N 1 */ - /* MYSMTP_EMAIL_IDS List of space delimited userids *Exit */ - /* The COBOL exit OCCURS clause determines / */ - /* In case these are not already allocated, these are attempted */ - STRING = "ALLOC DD(SYSTSPRT) SYSOUT(A) " - CALL BPXWDYN STRING; - STRING = "ALLOC DD(SYSTSIN) DUMMY" - CALL BPXWDYN STRING; - - /* If C1UEXTR7 is allocated to anything, turn on Trace */ - WhatDDName = 'C1UEXTR7' - CALL BPXWDYN "INFO FI("WhatDDName")", - "INRTDSN(DSNVAR) INRDSNT(myDSNT)" - if RESULT = 0 then TraceRQ = 'Y' - /* Values to be set for your site...... */ - /* For package REVIEW (APPROVE/DENY)..... */ - /* Enter location of Approver Group sequencing ... */ - ApproverGroupSequence= 'YOURSITE.NDVR.PARMLIB(APPROVER)' - ApproverGroupSequence= '' - - /* Do you want all CAST actions to be peformed in Batch? */ - Force_CAST_in_Batch = 'Y' ; /* Y/N */ - Force_CAST_in_Batch = 'N' ; /* Y/N */ - - Cast_with_SonarQube= '?' /* Y/N/?=Check Notes */ - - /* Parms are REXX statements passed from COBOL exit */ - Arg Parms - Parms = Strip(Parms) - sa= 'Parms len=' Length(Parms) - - If TraceRQ = 'Y' then, - Say 'C1UEXTR7 is called again:' - - /* Parms from C1UEXT07 is a string of REXX statements */ - - Interpret Parms - If TraceRQ = 'Y' & PECB_MODE = 'B' then Trace r - - /* Another way to Determine if Trace is wanted... */ - If Substr(PHDR_PKG_NOTE5,1,5) = 'TRACE' then TraceRQ = 'Y' - If TraceRQ = 'Y' then, - Do - Trace ?r - Sa= 'CALL_REASON = ' CALL_REASON - Sa= 'PECB_FUNCTION_LITERAL = ' PECB_FUNCTION_LITERAL - Sa= 'PECB_SUBFUNC_LITERAL = ' PECB_SUBFUNC_LITERAL - Sa= 'PECB_BEF_AFTER_LITERAL= ' PECB_BEF_AFTER_LITERAL - Sa= 'PECB_PACKAGE_ID = ' PECB_PACKAGE_ID - Sa= 'MYSMTP_EMAIL_ID_SIZE = ' MYSMTP_EMAIL_ID_SIZE - End - - /* Early outs .... */ - If PECB_FUNCTION_LITERAL = 'SETUP' then Exit - - /* Work to Do .... */ - - /* Unspecified about SonarQube? Let NOTES decide.... */ - If Cast_with_SonarQube /= 'N' then, - Do - Call CheckForSonarQubeOption - If Cast_with_SonarQube = 'Y' then, - Do - COBOL_Element_Types = 'COB* CBL*' - COBOL_Compile_StepNames = 'COMPILE COMP CMP COB' - TransmitMethod = 'FTP' /* **chose one ** */ - TransmitMethod = 'XCOM' /* **chose one ** */ - Call GetUnique_Name - SonarDSNPrefix = USERID()'.SONRQUBE.' || Unique_Name - SonarRemoteCommand =, - "python3 /opt/xfer/scripts/SonarDriver.py" Unique_Name.lst - TransmitTable = "" - End /* If Cast_with_SonarQube = 'Y' */ - End /* If Cast_with_SonarQube /= 'N' */ - - If PECB_FUNCTION_LITERAL ='CAST' &, - PECB_SUBFUNC_LITERAL ='CAST' &, - PECB_BEF_AFTER_LITERAL ='BEFORE' &, - PHDR_PACKAGE_STATUS ='IN-EDIT' &, - PECB_MODE = "T" &, /* TSO foreground */ - (Force_CAST_in_Batch= 'Y' | Cast_with_SonarQube= 'Y') then, - Do - Call SubmitBatchCAST - Exit - End - - /* Initialize variables.... */ - Message = '' - MessageCode = ' ' - MyRc = 0 - - /* Execute a SonarQube analysis? */ - If Cast_with_SonarQube = 'Y' &, - PECB_FUNCTION_LITERAL = 'CAST' &, - PECB_BEF_AFTER_LITERAL = 'BEFORE' Then - Do - If TraceRQ = 'Y' then Trace ?r - Call Allocate_Files_For_CSV_and_API - Elements.0 = 0 - Call ProcessPackageSCL - If COBOLinPackage = 'Y' then, - Do - Call RETRIEVE_Cobol_Elements - Call Use_ENTBJAPI_For_BX_Info - Trace r - Call SubmitandWaitForSonarQube - If myRC > 4 then, - Do - If message = '' then, - message = 'C1UEXTR7 -', - 'Package Failed the SonarQube Analysis' - MyRc = 8 - End /* If myRC > 4 */ - Else, - Do - MyRc = 4 - message = 'C1UEXTR7 -', - 'Package passed a SonarQube Analysis' - End /* Else */ - Call SetExitReturnInfo - Exit - End; /* If COBOLinPackage = 'Y' ... */ - Call FREE_Files_For_CSV_and_API - End; /* If Cast_with_SonarQube = 'Y' ... */ - - /* Validate Package prefix with ServiceNow */ - If PECB_FUNCTION_LITERAL ='CREATE' &, - PECB_BEF_AFTER_LITERAL ='BEFORE' &, - (Substr(PECB_PACKAGE_ID,1,3) = 'PRB' |, - Substr(PECB_PACKAGE_ID,1,3) = 'CHG' ) then, - Do - Call Validate_PackageID - If MyRc > 0 then Exit - End - - /* Enforce packages to be Backout Enabled */ - IF PREQ_BACKOUT_ENABLED /= 'Y' then, - Do - Message = 'C1UEXTR7 - Package made to be Backout enabled' - MyRc = 4 - hexAddress = D2X(Address_PREQ_BACKOUT_ENABLED) - storrep = STORAGE(hexAddress,,'Y') - Call SetExitReturnInfo - Exit - End; - - If PECB_FUNCTION_LITERAL ='CAST' &, - PECB_SUBFUNC_LITERAL ='CAST' &, - PECB_BEF_AFTER_LITERAL ='AFTER' then, - Call ManageEmails ; - - Exit - -GetUnique_Name: - - Unique_Name = GTUNIQUE() - If TraceRQ = 'Y' then, - SAY "Unique Member name is " Unique_Name - - Return - -CheckForSonarQubeOption: - - Cast_with_SonarQube = 'Y' /* Default */ - If Substr(PHDR_PKG_NOTE8,1,16)= 'BYPASS SONARQUBE' then, - Cast_with_SonarQube = 'N' - Else, - If Substr(PHDR_PKG_NOTE7,1,16)= 'BYPASS SONARQUBE' then, - Cast_with_SonarQube = 'N' - Else, - If Substr(PHDR_PKG_NOTE6,1,16)= 'BYPASS SONARQUBE' then, - Cast_with_SonarQube = 'N' - Else, - If Substr(PHDR_PKG_NOTE5,1,16)= 'BYPASS SONARQUBE' then, - Cast_with_SonarQube = 'N' - Else, - If Substr(PHDR_PKG_NOTE4,1,16)= 'BYPASS SONARQUBE' then, - Cast_with_SonarQube = 'N' - Else, - If Substr(PHDR_PKG_NOTE3,1,16)= 'BYPASS SONARQUBE' then, - Cast_with_SonarQube = 'N' - Else, - If Substr(PHDR_PKG_NOTE2,1,16)= 'BYPASS SONARQUBE' then, - Cast_with_SonarQube = 'N' - Else, - If Substr(PHDR_PKG_NOTE1,1,16)= 'BYPASS SONARQUBE' then, - Cast_with_SonarQube = 'N' - Return - -ManageEmails: - - If TraceRQ = 'Y' then Trace ?R - whereami = 'ManageEmails' - - /* Only run if the exit is giving us an Approver Group */ - If Substr(CALL_REASON,1,16) = 'APPROVER GROUP #' then, - Do - Call SaveOffApproverGrpInfo - Return - End - - /*****************************************************************/ - /* Initializaztion and Example statements */ - /*****************************************************************/ - MySMTP_Message =, - 'YOURSITE.NDVR.REXX(C1UEXTR7)' - MySMTP_Message =, - 'SHARE.ENDV.SHARABLE.REXX(C1UEXTR7)' - MySMTP_Subject = 'Please Approve Package' PECB_PACKAGE_ID - MySMTP_From = Left('YOURSITE your testing Endevor',50) - MySMTP_textline.1 = 'Package' PECB_PACKAGE_ID, - ' has been CAST and is ready for APPROVAL.' - MySMTP_textline.2 = 'Your Review and approval of package', - PECB_PACKAGE_ID 'is reqested.' - MySMTP_textline.3 = ' ' - MySMTP_textline.4 = ' ' - MySMTP_textline.0 = 4 - MYSMTP_EMAIL_IDS = '' - - /* Only run if the exit says all Approver Grps are done */ - If Substr(CALL_REASON,1,22) = 'NO MORE APPROVER GRPS ' then, - Do - Call CheckApproverGroupSequence - Return - End - - Return - -Validate_PackageID: - - If TraceRQ = 'Y' then Trace ?R - whereami = 'Validate_PackageID' - /* build STDENV input */ - CALL BPXWDYN , - "ALLOC DD(STDENV) LRECL(080) BLKSIZE(24000) SPACE(1,1) ", - " RECFM(F,B) TRACKS ", - " NEW UNCATALOG REUSE "; - Queue "EXPORT PATH=$PATH:" ||, - "'/usr/lpp/IBM/cyp/v3r11/pyz/lib/python3.11/'" - Queue "EXPORT VIRTUAL_ENV=" ||, - "'/u/users/NDVRTeam/venv/lib/python3.11/site-packages/'" - "EXECIO 2 DISKW STDENV (finis" - - /* build BPXBATCH inputs and outputs */ - /* build STDPARM input */ - CALL BPXWDYN , - "ALLOC DD(STDPARM) LRECL(080) BLKSIZE(24000) SPACE(1,1) ", - " RECFM(F,B) TRACKS ", - " NEW UNCATALOG REUSE "; - Queue "sh cd " ||, - "/u/users/NDVRTeam/venv/lib/python3.11/site-packages;" - Queue "python ServiceNow.py" Substr(PECB_PACKAGE_ID,1,10) - "EXECIO 2 DISKW STDPARM (finis" - - CALL BPXWDYN , - "ALLOC DD(STDOUT) LRECL(200) BLKSIZE(20000) SPACE(5,5) ", - " RECFM(F,B) TRACKS ", - " NEW UNCATALOG REUSE "; - Notnow =, - "ALLOC DD(STDOUT) DA('IBMUSER.STDOUT') OLD REUSE " - - CALL BPXWDYN , - "ALLOC DD(STDERR) LRECL(200) BLKSIZE(20000) SPACE(5,5) ", - " RECFM(F,B) TRACKS ", - " NEW UNCATALOG REUSE "; - Notnow =, - "ALLOC DD(STDERR) DA(*) SHR REUSE" - - CALL BPXWDYN "ALLOC DD(STDIN) DUMMY SHR REUSE" - CALL BPXWDYN "ALLOC DD(STDERR) DA(*) SHR REUSE" - - ADDRESS LINK 'BPXBATCH' - CallRC = RC - - "EXECIO * DISKR STDOUT (Stem stdout. finis" - lastrec# = stdout.0 - lastrecord = Substr(stdout.lastrec#,1,40) - - If Pos("Exists",lastrecord) = 0 then, - Do - Message = 'C1UEXTR7 - Package prefix' PECB_PACKAGE_ID ||, - ' is not defined to Service-Now' - MessageCode = 'U033' - MyRc = 8 - Call SetExitReturnInfo - End - - If CallRC = 0 then, - Do - CALL BPXWDYN "FREE DD(STDENV) " - CALL BPXWDYN "FREE DD(STDPARM)" - CALL BPXWDYN "FREE DD(STDOUT) " - CALL BPXWDYN "FREE DD(STDIN) " - CALL BPXWDYN "FREE DD(STDERR) " - End - - Return; - -SaveOffApproverGrpInfo: - - If TraceRQ = 'Y' then Trace ?R - PAPP_SEQUENCE_NUMBER = Substr(CALL_REASON,17,4) - numberQueued = QUEUED() - If PAPP_SEQUENCE_NUMBER = "0001" & numberQueued > 0 then, - Do numberQueued /* Clear out whatever is queued */ - pull leftovers - End - If PAPP_SEQUENCE_NUMBER = "0001" then, - CALL BPXWDYN , /* save Approver group data */ - "ALLOC DD(C1UEXTD7) LRECL(180) BLKSIZE(18000) SPACE(1,1) ", - " RECFM(F,B) TRACKS ", - " MOD UNCATALOG REUSE "; - - pkgGrp# = Strip(PAPP_SEQUENCE_NUMBER,'L','0') - PAPP_GROUP_NAME = Strip(PAPP_GROUP_NAME) - Queue 'pkgGrp# = 'pkgGrp# - Queue 'GROUP_NAME.pkgGrp# ="'PAPP_GROUP_NAME'"' - Queue 'ENVIRONMENT.pkgGrp# ="'Strip(PAPP_ENVIRONMENT)'"' - Queue 'APPR_GRP_TYPE.pkgGrp# ="'Strip(PAPP_APPR_GRP_TYPE)'"' - Queue 'APPR_GRP_DISQ.pkgGrp# ="'Strip(PAPP_APPR_GRP_DISQ)'"' - Queue 'APPROVAL_FLAGS.pkgGrp# ="'Strip(PAPP_APPROVAL_FLAGS)'"' - Queue 'STATUS.'PAPP_GROUP_NAME '="'Strip(PAPP_APPROVER_FLAG)'"' - Queue 'QUORUM.'PAPP_GROUP_NAME '='Strip(PAPP_QUORUM_COUNT,'L','0') - Queue 'USRLST.'PAPP_GROUP_NAME '="'Strip(PAPP_APPROVAL_IDS)'"' - - numberQueued = QUEUED() - "EXECIO" numberQueued " DISKW C1UEXTD7 " - - Return; - -CheckApproverGroupSequence: - - If TraceRQ = 'Y' then Trace ?R - whereami = 'CheckApproverGroupSequence' - - /* If C1UEXTD7 is allocated to anything, we have approvers */ - WhatDDName = 'C1UEXTD7' - CALL BPXWDYN "INFO FI("WhatDDName")", - "INRTDSN(DSNVAR) INRDSNT(myDSNT)" - If Substr(DSNVAR,1,1) = ' ' then Return - - "EXECIO 0 DISKW C1UEXTD7 (Finis" - "EXECIO * DISKR C1UEXTD7 (Finis" - CALL BPXWDYN "FREE DD(C1UEXTD7)" - numberQueued = QUEUED() - - /* Analyze Exit-provided Approver Group info */ - pkgGrp# = 0 - /* By default, ordered Approver Groups are not related */ - STATUS. = 'NotRelated' - QUORUM. = 0 - - /* Return Approver Group info for this package */ - Do q# = 1 to numberQueued - Parse Pull something - If TraceRQ = 'Y' then say "@187" something - interpret something - End; - ThisEnvironment = ENVIRONMENT.pkgGrp# - - /* Read the site's required Approver Group sequencing */ - CALL BPXWDYN, - "ALLOC DD(APPROVER) DA('"ApproverGroupSequence"') SHR REUSE" - "EXECIO * DISKR APPROVER (Stem ordered. Finis" - CALL BPXWDYN "FREE DD(APPROVER)" - - /* Build a sequenced list of all named Approver Groups */ - OrderedApproverGroups = '' - /* Set a default value to be 1 greater than number of groups */ - NotOrdered = ordered.0 + 1 - Sequence. = NotOrdered - Do ord# = 1 to ordered.0 - orderedEntry = ordered.ord# - orderedEnv = Word(orderedEntry,1) - If orderedEnv /= thisEnvironment then iterate - orderedApproverGroup = Word(orderedEntry,2) - If orderedApproverGroup = 'AllOthers' then, - DefaultOrder = ord# - SEQUENCE.orderedApproverGroup = ord# - If TraceRQ = 'Y' then, - say "@201 Sequence for" orderedApproverGroup "is" ord# - End; /* Do ord# = 1 to ordered.0 */ - - Sequence.NotOrdered = DefaultOrder - unsorted_list = "" - /* Build a list of Approver Groups for this package */ - PackageApproverGroups = '' - Do p# = 1 to pkgGrp# - PackageApproverGroup = GROUP_NAME.p# - thisSequence = SEQUENCE.PackageApproverGroup - entry = Right(thisSequence,4,'0') || '.' ||, - PackageApproverGroup - unsorted_list = unsorted_list entry - If TraceRQ = 'Y' then, - Say "unsorted_list=" unsorted_list - End; - - Call SortApproverGroupList; - - If TraceRQ = 'Y' then say "@220 PackageApproverGroups =", - sorted_list, - ' ThisEnvironment =' ThisEnvironment - /* Go through the Sorted list to identify the status */ - /* of the next group(s) to be approved */ - /* Find the 1st Approver group this user belongs to.... */ - thisApprover = USERID() - - lastSequence = NotOrdered - Do seq# = 1 to Words(sorted_list) - entry = Word(sorted_list,seq#) - Parse Var entry thisSequence '.' orderedApproverGroup - orderedGroupStatus = STATUS.orderedApproverGroup - If orderedGroupStatus = 'APPROVED' then Iterate; - orderedGroupQuorum = QUORUM.orderedApproverGroup - If orderedGroupQuorum = 0 then Iterate; - If thisSequence > lastSequence then, - Do - Sa= 'We need to wait' - Leave; - End; - lastSequence = thisSequence - ListApprovers = USRLST.orderedApproverGroup - whereApprover = Wordpos(thisApprover,ListApprovers) - thisApproversFlag = " " - If whereApprover > 0 then, - Do - thisApproverGroup = orderedApproverGroup - thisApproversFlag = Word(APPROVAL_FLAGS.grp#,whereApprover) - End - - If TraceRQ = 'Y' then, - Say orderedApproverGroup 'has status of' orderedGroupStatus, - " Quorum" orderedGroupQuorum - - IF whereApprover > 0 &, - orderedGroupStatus /= 'NotRelated' then, - sa= 'You must wait for the' orderedApproverGroup, - " group's approval" - - If Words(ListApprovers) > 0 then, - Do w# = 1 to Words(ListApprovers) - Approver = Word(ListApprovers,w#) - If Wordpos(Approver,MYSMTP_EMAIL_IDS) = 0 &, - Substr(Approver,1,1) > '00'X then, - MYSMTP_EMAIL_IDS = MYSMTP_EMAIL_IDS Approver - End; /* Do w# = 1 to Words(ListApprovers) */ - - End; /* Do seq# = 1 to Words(sorted_list) */ - - /* Prepare email to the usrids in MYSMTP_EMAIL_IDS */ - Call PrepareEmail - - Return; - -SortApproverGroupList: - - If TraceRQ = 'Y' then Trace ?R - whereami = 'SortApproverGroupList' - sa= words(unsorted_list) unsorted_list; - drop sorted_list; - sorted_list = ""; - do forever ; - if words(unsorted_list) = 0 then leave; - lowest_entry = 1; - do entry = 1 to words(unsorted_list) - if word(unsorted_list,entry) <, - word(unsorted_list,lowest_entry) then, - lowest_entry = entry; - end; /* do entry = 1 .... */ - sorted_list = sorted_list word(unsorted_list,lowest_entry); - sa= "sorted_list=" sorted_list ; - position = wordindex(unsorted_list,lowest_entry) ; - len = length(word(unsorted_list,lowest_entry)); - unsorted_list =, - overlay(copies(" ",len),unsorted_list,position) ; - sa= "unsorted_list=" unsorted_list ; - end; /* do forever */ - drop unsorted_list; - sa= words(sorted_list) sorted_list; - - Return; - -PrepareEmail: - - If TraceRQ = 'Y' then Trace ?R - whereami = 'PrepareEmail' -/* Here you can make last-moment adjustments to the email */ - shortlist = Substr(MYSMTP_EMAIL_IDS,1,100) - If Substr(MYSMTP_EMAIL_IDS,100,1) /= ' ' &, - Substr(MYSMTP_EMAIL_IDS,101,1) /= ' ' then, - Do - whereEnd = WordIndex(shortlist,Words(shortlist)) - shortlist = DELWORD(shortlist,whereEnd) - End - MySMTP_textline.4 = 'Sent to Group:' shortlist - -/* Code in the section below should not be changed */ -/* Code in the section below should not be changed */ -/* Code in the section below should not be changed */ - - MySMTP_Message = Left(MySMTP_Message,80) - hexAddress = D2X(Address_MYSMTP_MESSAGE) - storrep = STORAGE(hexAddress,,Message) - - MySMTP_From = Left(MySMTP_From,50) - hexAddress = D2X(Address_MYSMTP_FROM) - storrep = STORAGE(hexAddress,,MySMTP_From) - - MySMTP_Subject = Left(MySMTP_Subject,50) - hexAddress = D2X(Address_MySMTP_Subject) - storrep = STORAGE(hexAddress,,MySMTP_Subject) - -/* If TraceRQ = 'Y' then Trace ?r */ - MYSMTP_COUNTER = '' - numberLines = Right(MySMTP_textline.0,2,'0') - Do l# = 1 to Length(numberLines) - MYSMTP_COUNTER = MYSMTP_COUNTER ||, - 'F' || Substr(numberLines,l#,1) - End - If TraceRQ = 'Y' then say 'MYSMTP_COUNTER=' MYSMTP_COUNTER - - MYSMTP_TEXT = X2C(MYSMTP_COUNTER) - Do line# = 1 to numberLines - MYSMTP_TEXT = MYSMTP_TEXT || Left(MySMTP_textline.line#,133) - End; /* Do line# = 1 to MySMTP_textline.0 */ - - hexAddress = D2X(Address_MYSMTP_TEXT) - storrep = STORAGE(hexAddress,,MYSMTP_TEXT) - - MySMTP_URL = 'N' - hexAddress = D2X(Address_MYSMTP_URL) - storrep = STORAGE(hexAddress,,MySMTP_URL) - - /* Provide distribution list ( list of userids ) to Exit */ - MYSMTP_EMAIL_IDS =, - Space(Strip(Translate(MYSMTP_EMAIL_IDS,' ','00'x))) - MYSMTP_EMAIL_IDS = MYSMTP_EMAIL_IDS '0000'x - MYSMTP_EMAIL_IDS = Left(MYSMTP_EMAIL_IDS,MYSMTP_EMAIL_ID_SIZE) - hexAddress = D2X(Address_MYSMTP_EMAIL_IDS) - storrep = STORAGE(hexAddress,,MYSMTP_EMAIL_IDS) - - Return; - -SubmitBatchCAST: - - If TraceRQ = 'Y' then Trace ?R - whereami = 'SubmitBatchCAST' - - /* Variable settings for each site ---> */ - WhereIam = WHERE@M1() - interpret 'Call' WhereIam "'MySENULibrary'" - MySENULibrary = Result - interpret 'Call' WhereIam "'MySEN2Library'" - MySEN2Library = Result - - Unique_Name = GTUNIQUE() - /* Get job-related information from low address locations */ - MyAccountingCode = GETACCTC() - job_name = MVSVAR('SYMDEF',JOBNAME ) /*Returns JOBNAME */ - Jobname= BUMPJOB(job_name) - - /* Prepare and run a Table Tool to build CAST jcl....... */ - CALL BPXWDYN , - "ALLOC DD(TABLE) LRECL(80) BLKSIZE(27920) SPACE(1,1) ", - " RECFM(F,B) TRACKS ", - " NEW UNCATALOG REUSE "; - Queue "* Do" - Queue " * " - "EXECIO 2 DISKW TABLE (FINIS "; /* count queued */ - - CALL BPXWDYN "ALLOC DD(NOTHING) DUMMY" - - CALL BPXWDYN , - "ALLOC DD(OPTIONS) LRECL(80) BLKSIZE(27920) SPACE(1,1) ", - " RECFM(F,B) TRACKS ", - " NEW UNCATALOG REUSE "; - QUEUE "$nomessages ='Y'" - QUEUE "MyAccountingCode='"MyAccountingCode"'" - QUEUE "MySEN2Library ='"MySEN2Library"'" - QUEUE "MySENULibrary ='"MySENULibrary"'" - QUEUE "Unique_Name ='"Unique_Name"'" - QUEUE "PECB_PACKAGE_ID ='"PECB_PACKAGE_ID"'" - QUEUE "Jobname= '"Jobname"'" - QUEUE "TBLOUT = 'SUBMTJCL'" - "EXECIO 8 DISKW OPTIONS (FINIS "; /* count queued */ - - /* For CASTing a package in Batch */ - /* Build a JCL model, and name its location here.... */ - /* Name a work dataset to be created then deleted... */ - - CastPackageModel = MySEN2Library || '(CAST#JCL)' - "ALLOC F(MODEL) DA('"CastPackageModel"') SHR REUSE" - - /* Build the JCL for a Batch Cast */ - CastPackageJCL = USERID()".C1UEXTR7.SUBMIT."Unique_Name - "ALLOC F(SUBMTJCL) DA('"CastPackageJCL"') ", - "LRECL(80) BLKSIZE(16800) SPACE(5,5)", - "RECFM(F B) TRACKS ", - "NEW CATALOG REUSE " ; - - myRC = ENBPIU00("A") - "EXECIO 0 DISKW SUBMTJCL (Finis" - - "FREE DD(TABLE) " - "FREE DD(NOTHING) " - "FREE DD(OPTIONS) " - "FREE DD(MODEL) " - - Call Submit_n_save_jobInfo ; - - "FREE F(SUBMTJCL) DELETE " - Message = JobData - MyRc = 8 - PACKAGE = PECB_PACKAGE_ID - MessageCode = 'U033' - Call SetExitReturnInfo - - Return; - -Submit_n_save_jobInfo: /* submit CastPackageModel job and save job info */ - - If TraceRQ = 'Y' then Trace ?R - whereami = 'Submit_n_save_jobInfo' - If TraceRQ = 'Y' then Say 'Submit_n_save_jobInfo:' - - Address TSO "PROFILE NOINTERCOM" /* turn off msg notific */ - CALL MSG "ON" - CALL OUTTRAP "out." - ADDRESS TSO "SUBMIT '"CastPackageJCL"'" ; - If RC > 4 then, - Do - MyRC = 8 - Message = 'Cannot find Element member to submit.' - Call SetExitReturnInfo - Exit(12) - End - CALL OUTTRAP "OFF" - Address TSO "PROFILE INTERCOM" /* turn on msg notific */ - - JobData = Strip(out.1); - jobinfo = Word(JobData,2) ; - If jobinfo = 'JOB' then, - jobinfo = Word(JobData,3) ; - SelectJobName = Word(Translate(jobinfo,' ',')('),1) ; - SelectJobNumber = Word(Translate(jobinfo,' ',')('),2) ; - - Return; - -Allocate_Files_For_CSV_and_API: - - STRING = "ALLOC DD(C1MSGS1) DUMMY " - CALL BPXWDYN STRING; - STRING = "ALLOC DD(BSTERR) DA(*) " - CALL BPXWDYN STRING; - STRING = "ALLOC DD(BSTAPI) DA(*) " - CALL BPXWDYN STRING; - - STRING = "ALLOC DD(MSGFILE) LRECL(133) BLKSIZE(26600) ", - " DSORG(PS) ", - " SPACE(5,5) RECFM(F,B) TRACKS ", - " NEW UNCATALOG REUSE "; - CALL BPXWDYN STRING; - - Return; - -FREE_Files_For_CSV_and_API: - - CALL BPXWDYN STRING; - STRING = "FREE DD(C1MSGS1)" ; - CALL BPXWDYN STRING; - STRING = "FREE DD(BSTERR)" ; - CALL BPXWDYN STRING; - STRING = "FREE DD(BSTAPI)" ; - CALL BPXWDYN STRING; - STRING = "FREE DD(MSGFILE)"; - CALL BPXWDYN STRING; - - Return; - -CSV_to_List_Package_Actions: - - /* Get Package Action information for SonarQube preparations */ - - STRING = "ALLOC DD(EXTRACTM) LRECL(4000) BLKSIZE(32000) ", - " DSORG(PS) ", - " SPACE(1,5) RECFM(F,B) TRACKS ", - " NEW UNCATALOG REUSE "; - CALL BPXWDYN STRING; - - STRING = "ALLOC DD(BSTIPT01) LRECL(80) BLKSIZE(800) ", - " DSORG(PS) ", - " SPACE(1,5) RECFM(F,B) TRACKS ", - " NEW UNCATALOG REUSE "; - CALL BPXWDYN STRING; - - QUEUE "LIST PACKAGE ACTION FROM PACKAGE '"PECB_PACKAGE_ID"'" - QUEUE " TO DDNAME 'EXTRACTM' " - QUEUE " ." - - "EXECIO" QUEUED() "DISKW BSTIPT01 (FINIS "; - - ADDRESS LINK 'BC1PCSV0' ; /* load from authlib */ - - call_rc = rc ; - - "EXECIO * DISKR EXTRACTM (STEM CSV. finis" - - STRING = "FREE DD(EXTRACTM)" ; - CALL BPXWDYN STRING; - STRING = "FREE DD(BSTIPT01)" ; - /* To Search the package action data in CSV format. */ - /* Identify matches with Rules file, determining Ship Dests */ - - IF CSV.0 < 2 THEN RETURN; - - /* CSV data heading - showing CSV variables */ - $table_variables= Strip(CSV.1,'T') - - $table_variables = translate($table_variables,"_"," ") ; - $table_variables = translate($table_variables," ",',"') ; - $table_variables = translate($table_variables,"@","/") ; - $table_variables = translate($table_variables,"@",")") ; - $table_variables = translate($table_variables,"@","(") ; - - WantedCSVVariables= , - "ELM_@S@ ENV_NAME_@S@ STG_ID_@S@ ", - "SYS_NAME_@S@ SBS_NAME_@S@ TYPE_NAME_@S@ " - - Do rec# = 2 to CSV.0 - $detail = CSV.rec# - Drop SBS_NAME_@T@ - - Trace Off - /* Parse CSV fields in the Detail record until done */ - Do $column = 1 to Words($table_variables) - Call ParseDetailCSVline - End - - If TraceRc = 1 then Trace r - IF Substr(ENV_NAME_@S@,1,1) = '00'x |, - Substr(ENV_NAME_@S@,1,1) = ' ' then Iterate; - - elm# = Elements.0 + 1 - Elements.elm# = ELM_@S@ ENV_NAME_@S@ STG_ID_@S@, - SYS_NAME_@S@ SBS_NAME_@S@ TYPE_NAME_@S@ - Elements.0 = elm# - Sa= 'Messages from C1UEXTR7:' Elements.elm# - Trace Off - End; /* Do rec# = 1 to CSV.0 */ - - RETURN ; - -ParseDetailCSVline: - - /* Find the data for the current $column */ - - $dlmchar = Substr($detail,1,1); - - If $dlmchar = "'" then, - Do - SA= 'parsing with single quote ' - PARSE VAR $detail "'" $temp_value "'" $detail ; - If Substr($detail,1,1) = ',' then, - $detail = Strip(Substr($detail,2),'L') - End - Else, - If $dlmchar = '"' then, - Do - SA= 'parsing with double quote ' - PARSE VAR $detail '"' $temp_value '"' $detail ; - If Substr($detail,1,1) = ',' then, - $detail = Strip(Substr($detail,2),'L') - End - Else, - If $dlmchar = ',' then, - Do - SA= 'parsing with comma ' - PARSE VAR $detail ',' $temp_value ',' $detail ; - If Substr($detail,1,1)/= ',' then, - $detail = "," || $detail - $detail = Strip(Substr($detail,2),'L') */ - End - Else, - If Words($detail) = 0 then, - $temp_value = ' ' - Else, - Do - SA= 'parsing with comma ' - PARSE VAR $detail $temp_value ',' $detail ; - Sa= '$temp_value=>' $temp_value '<' - End - $temp_value = STRIP($temp_value) ; - $rslt = $temp_value - $rslt = Strip($rslt,'B','"') ; - $rslt = Strip($rslt,'B',"'") ; - if Length($rslt) < 1 then $rslt = ' ' - thisVariable = WORD($table_variables,$column) - If Wordpos(thisVariable,WantedCSVVariables) = 0 then Return - if Length($rslt) < 250 then, - $temp = WORD($table_variables,$column) '= "'$rslt'"'; - Else, - $temp = WORD($table_variables,$column) "=$rslt" - INTERPRET $temp; - If rec# < 3 then Say $temp - - RETURN ; - -ProcessPackageSCL: - - /* Do an EXPORT to Capture the Package SCL */ - SonarWorkfile = SonarDSNPrefix || '.SONARWRK' - SonarCOBOL = SonarDSNPrefix || '.SONARCOB' - - STRING = "ALLOC DD(WRKFILE) LRECL(080) BLKSIZE(24000) ", - " DA("SonarWorkfile") ", - " DSORG(PO) DSNTYPE(LIBRARY) DIR(9) ", - " SPACE(5,5) RECFM(F,B) CYL ", - " NEW CATALOG REUSE "; - CALL BPXWDYN STRING; - CALL BPXWDYN "FREE DD(WRKFILE)" - - STRING = "ALLOC DD(COBOL) LRECL(080) BLKSIZE(24000) ", - " DA("SonarCOBOL") ", - " DSORG(PO) DSNTYPE(LIBRARY) DIR(9) ", - " SPACE(5,5) RECFM(F,B) CYL ", - " NEW CATALOG REUSE "; - CALL BPXWDYN STRING; - CALL BPXWDYN "FREE DD(COBOL) " - - STRING = "ALLOC DD(SCL) DA("SonarWorkfile"(SCL)) SHR REUSE" - CALL BPXWDYN STRING; - - STRING="ALLOC DD(ENPSCLIN) DA("SonarWorkfile"(SCLEXPRT)) SHR REUSE" - CALL BPXWDYN STRING; - QUEUE "EXPORT PACKAGE '"PECB_PACKAGE_ID"'" - QUEUE " TO DDN 'SCL' ." - "EXECIO 2 DISKW ENPSCLIN (FINIS "; /* count queued */ - - ADDRESS LINK 'ENBP1000' ; /* run from CSIQAUTH*/ - call_rc = rc ; - - CALL BPXWDYN "FREE DD(ENPSCLIN)" ; - - STRING = "ALLOC DD(RESULTS) DA("SonarWorkfile"(PKGTBL)) SHR REUSE" - CALL BPXWDYN STRING; - - /* Use SCAN#SCL to create a TABLE from the SCL content */ - Call SCAN#SCL 'TABLE' - - CALL BPXWDYN "FREE DD(SCL)" ; - - /* Use TableTool to create multiple outputs */ - STRING = "ALLOC DD(TABLE) DA("SonarWorkfile"(PKGTBL)) SHR REUSE" - CALL BPXWDYN STRING; - - STRING="ALLOC DD(PARMLIST) DA("SonarWorkfile"(PARMLIST)) SHR REUSE" - CALL BPXWDYN STRING; - QUEUE " HEADING1 TBLOUT1 INITS2 1 " - QUEUE " HEADING3 TBLOUT3 NOTHING 1 " - QUEUE " MODEL1 TBLOUT1 OPTIONS# A " - QUEUE " TRAILER2 TBLOUT2 OPTIONS2 1 " - "EXECIO 4 DISKW PARMLIST (FINIS "; /* count queued */ - - STRING="ALLOC DD(INITS2) DA("SonarWorkfile"(INITS2)) SHR REUSE" - CALL BPXWDYN STRING; - QUEUE " COBOL_Element_Types = '"COBOL_Element_Types"'" - QUEUE " COBOL_Compile_StepNames = '"COBOL_Compile_StepNames"'" - QUEUE " SonarCOBOL = '"SonarCOBOL"'" - QUEUE " SonarWorkfile = '"SonarWorkfile"'" - QUEUE " $MultiplePDSmemberOuts = 'Y' /* mult PDS mbr outputs */ " - QUEUE "$nomessages ='Y'" - "EXECIO 6 DISKW INITS2 (FINIS "; /* count queued */ - - CALL BPXWDYN "ALLOC DD(NOTHING) DUMMY" - - STRING="ALLOC DD(HEADING1) DA("SonarWorkfile"(HEADING1)) SHR REUSE" - CALL BPXWDYN STRING; - QUEUE " SET TO DSN '"SonarCOBOL"'." - QUEUE " SET OPTIONS REPLACE NO SIGNOUT. " - "EXECIO 2 DISKW HEADING1 (FINIS "; - - STRING="ALLOC DD(MODEL1) DA("SonarWorkfile"(MODEL1)) SHR REUSE" - CALL BPXWDYN STRING; - QUEUE " RETRIEVE ELEMENT &Element " - QUEUE " FROM ENVIRONMENT &Envmnt STAGE &S " - QUEUE " SYSTEM &System SUBSYSTEM &Subsys TYPE &Type . " - "EXECIO 3 DISKW MODEL1 (FINIS "; - - STRING="ALLOC DD(OPTIONS#) DA("SonarWorkfile"(OPTIONS#)) SHR REUSE" - CALL BPXWDYN STRING; - Queue "$NumberModelsAndTblouts= 3 " - Queue "HaveCobol = 0 " - Queue "Do w# = 1 to Words(COBOL_Element_Types) ; + " - Queue " HaveCobol=QMATCH(Type Word(COBOL_Element_Types,w#)); +" - Queue " If HaveCobol = 1 then Do; $my_rc = 1; Leave; End; + " - Queue "End; " - Queue "If HaveCobol = 0 then $SkipRow='Y' " - Queue "AEELM= COPIES(' ',80); " - Queue "AEELM= Overlay('AEELMBC ',AEELM,1) ; " - Queue "AEELM= Overlay(Envmnt,AEELM,10) ; /* Env */ " - Queue "AEELM= Overlay(S,AEELM,18) ; /* stg id */ " - Queue "AEELM= Overlay(System,AEELM,19) ; /* Sys */ " - Queue "AEELM= Overlay(Subsys,AEELM,27) ; /* Sub */ " - Queue "AEELM= Overlay(Element,AEELM,35) ; /* Ele */ " - Queue "AEELM= Overlay(Type,AEELM,45); /* Typ */ " - Queue "* " - Queue "Element = Left(Element,08) " - "EXECIO 17 DISKW OPTIONS# (FINIS "; /* count queued */ - - STRING="ALLOC DD(OPTIONS2) DA("SonarWorkfile"(OPTIONS2)) SHR REUSE" - CALL BPXWDYN STRING; - Queue "$NumberModelsAndTblouts= 1 ; /* Number of MODEL inputs */" - "EXECIO 1 DISKW OPTIONS2 (FINIS "; /* count queued */ - - STRING="ALLOC DD(MODEL2) DA("SonarWorkfile"(MODEL2)) SHR REUSE" - CALL BPXWDYN STRING; - Queue "AACTL MSGFILE COMPLIST " - Queue "&AEELM " - Queue "RUN " - "EXECIO 3 DISKW MODEL2 (FINIS "; - - STRING="ALLOC DD(HEADING3) DA("SonarWorkfile"(HEADING3)) SHR REUSE" - CALL BPXWDYN STRING; - Queue "* Folder-- Member-- ", - "Dataset------------------------------------- " - "EXECIO 1 DISKW HEADING3 (FINIS "; - - STRING="ALLOC DD(MODEL3) DA("SonarWorkfile"(MODEL3)) SHR REUSE" - CALL BPXWDYN STRING; - Queue " COBOL &Element &SonarCOBOL " - "EXECIO 1 DISKW MODEL3 (FINIS "; - - STRING="ALLOC DD(TRAILER2) DA("SonarWorkfile"(TRAILER2)) SHR REUSE" - CALL BPXWDYN STRING; - Queue "AACTLY " - Queue "RUN " - Queue "QUIT " - "EXECIO 3 DISKW TRAILER2 (FINIS "; - - STRING="ALLOC DD(TBLOUT1) DA("SonarWorkfile"(RETRIEVE)) SHR REUSE" - CALL BPXWDYN STRING; - STRING="ALLOC DD(TBLOUT2) DA("SonarWorkfile"(AEELMBC)) SHR REUSE" - CALL BPXWDYN STRING; - STRING="ALLOC DD(TBLOUT3) DA("SonarWorkfile"(TRANSMIT)) SHR REUSE" - CALL BPXWDYN STRING; - - If TraceRQ = 'Y' then Trace R - myRC = ENBPIU00("PARMLIST") - If myRC = 1 then COBOLinPackage = 'Y' - - CALL BPXWDYN "FREE DD(SCL) " ; - CALL BPXWDYN "FREE DD(ENPSCLIN)" ; - CALL BPXWDYN "FREE DD(RESULTS) " ; - - CALL BPXWDYN "FREE DD(TABLE) " ; - CALL BPXWDYN "FREE DD(PARMLIST)" ; - CALL BPXWDYN "FREE DD(INITS2) " ; - CALL BPXWDYN "FREE DD(NOTHING) " ; - CALL BPXWDYN "FREE DD(HEADING1)" ; - CALL BPXWDYN "FREE DD(MODEL1) " ; - CALL BPXWDYN "FREE DD(OPTIONS#)" ; - CALL BPXWDYN "FREE DD(OPTIONS2)" ; - CALL BPXWDYN "FREE DD(MODEL2) " ; - CALL BPXWDYN "FREE DD(HEADING3)" ; - CALL BPXWDYN "FREE DD(MODEL3) " ; - CALL BPXWDYN "FREE DD(TRAILER2)" ; - CALL BPXWDYN "FREE DD(TBLOUT1) " ; - CALL BPXWDYN "FREE DD(TBLOUT2) " ; - CALL BPXWDYN "FREE DD(TBLOUT3) " ; - - RETURN ; - -RETRIEVE_Cobol_Elements: - - STRING="ALLOC DD(BSTIPT01) DA("SonarWorkfile"(RETRIEVE)) SHR REUSE" - CALL BPXWDYN STRING; - - ADDRESS LINK 'C1BM3000' - - RETURN ; - -Use_ENTBJAPI_For_BX_Info: - - /* See your CSIQJCL(BC1JAAPI) */ - /* V - COLUMN 6 = FORMAT SETTING */ - /* = ' ' FOR NO FORMAT, JUST EXTRACT ELEMENT */ - /* = 'B' FOR ENDEVOR BROWSE DISPLAY FORMAT */ - /* = 'C' FOR ENDEVOR CHANGE DISPLAY FORMAT */ - /* = 'H' FOR ENDEVOR HISTORY DISPLAY FORMAT */ - /* V - COLUMN 7 = Replay TYPE SETTING */ - /* = 'E' FOR ELEMENT */ - /* = 'C' FOR COMPONENT */ - /* VVVVVVVV - COLUMN 10-17 ENVIRONMENT NAME */ - /* V - COLUMN 18 = STAGE ID */ - /* VVVVVVVV - COLUMN 19-26 SYSTEM NAME */ - /* VVVVVVVV - COLUMN 27-34 SUBSYSTEM NAME */ - /* COLUMN 35-44 = ELEMENT NAME VVVVVVVVVV */ - /* COLUMN 45-52 = TYPE NAME VVVVVVVV */ - /* */ - - Sa= 'Use_ENTBJAPI_For_BX_Info' - - STRING="ALLOC DD(SYSIN) DA("SonarWorkfile"(AEELMBC)) SHR REUSE" - CALL BPXWDYN STRING; - - - STRING = "ALLOC DD(COMPLIST) LRECL(200) BLKSIZE(20000) ", - " DSORG(PS) ", - " SPACE(5,15) RECFM(F,B) TRACKS ", - " MOD UNCATALOG REUSE "; - CALL BPXWDYN STRING; - - /* Call Built-in API program for COBOL source extracts */ - /* and COBOL component List requests. */ - ADDRESS LINK "ENTBJAPI" - - CALL BPXWDYN "FREE DD(SYSIN) " - - "EXECIO * DISKR COMPLIST (Stem cmplist. FINIS "; - CALL BPXWDYN "FREE DD(COMPLIST)" - - sa= cmplist.0 - If cmplist.0 = 0 then Return; - - Call ProcessCopybookMembers; - Call UpdateSonarTransmitTable; - Drop element. - - RETURN ; - -ProcessCopybookMembers: - - Do rec# = 1 to cmplist.0 - complist = Substr(cmplist.rec#,73) - If Substr(complist,1,22) = Copies('-',22) then, - thisSection = Word(complist,2) - If thisSection /= 'INPUT' then iterate; - If Word(complist,1) = 'STEP:' then, - Do - StepName = Word(complist,2) - DDname = Substr(Word(complist,3),4) - DatasetName = Substr(Word(complist,5),5) - Iterate - End - If Substr(Word(complist,5),3,1) = ':' &, - WordPos(StepName,COBOL_Compile_StepNames) > 0 &, - DDname = 'SYSLIB' then, - Do - member = Word(complist,2) - entry = "COPYBOOK,"member","DatasetName - If Wordpos(entry,TransmitTable) = 0 then, - TransmitTable = TransmitTable entry - End - End; /* Do rec# = 1 to cmplist.0 */ - - RETURN ; - -UpdateSonarTransmitTable: - - STRING =, - "ALLOC DD(SONARXMT) DA("SonarWorkfile"(TRANSMIT)) SHR REUSE" - CALL BPXWDYN STRING; - "Execio * DISKR SONARXMT (Stem xmit. Finis" - xm# = xmit.0 - - Do w# = 1 to Words(TransmitTable) - xm# = xm# + 1 - transtable = Word(TransmitTable,w#) - Parse var transtable folder ',' member ',' dataset - entry = " " left(folder,8) left(member,10) dataset - xmit.xm# = entry - End; /* Do w# = 1 to Words(TransmitTable) */ - - "Execio * DISKW SONARXMT (Stem xmit. Finis" - - transtable = "" - RETURN ; - -SubmitandWaitForSonarQube: - - /* Allocate files for a TableTool driven submission of the - SonarQube job, and a series of waits for parts of the job - to complete. */ - /* Variable settings for each site ---> */ - WhereIam = WHERE@M1() - - interpret 'Call' WhereIam "'MySENULibrary'" - MySENULibrary = Result - interpret 'Call' WhereIam "'MySEN2Library'" - MySEN2Library = Result - interpret 'Call' WhereIam "'MyCLS0Library'" - MyCLS0Library = Result - interpret 'Call' WhereIam "'MyCLS2Library'" - MyCLS2Library = Result - interpret 'Call' WhereIam "'MyHomeAddress'" - MyHomeAddress = Result - - STRING="ALLOC DD(SETUP) LRECL(080) BLKSIZE(24000) SPACE(1,1) ", - " RECFM(F,B) TRACKS ", - " NEW UNCATALOG REUSE "; - CALL BPXWDYN STRING; - s# = 0 - s# = s#+1 - set.s# = "Package ='"PECB_PACKAGE_ID"'" - s# = s#+1 - set.s# = "MyHomeAddress ='"MyHomeAddress"'" - s# = s#+1 - set.s# = "MySENULibrary ='"MySENULibrary"'" - s# = s#+1 - set.s# = "MySEN2Library ='"MySEN2Library"'" - s# = s#+1 - set.s# = "MyCLS0Library ='"MyCLS0Library"'" - s# = s#+1 - set.s# = "MyCLS2Library ='"MyCLS2Library"'" - s# = s#+1 - set.s# = "SonarWorkfile ='"SonarWorkfile"'" - s# = s#+1 - set.s# = "Unique_Name ='"Unique_Name"'" - s# = s#+1 - ReportingPFX = USERID() || '.SONRQUBE.'Unique_Name'.RESULTS' - set.s# = "ReportingPFX = '"ReportingPFX"'" - s# = s#+1 - set.s# = "$nomessages = 'Y'" - myJob = MVSVAR('SYMDEF','JOBNAME' ) - s# = s#+1 - set.s# = "myJob = '"myJob"'" - Jobname = BUMPJOB(myJob) - s# = s#+1 - set.s# = "Jobname = '"Jobname"'" - s# = s#+1 - set.s# = "TransmitMethod = '"TransmitMethod"'" - s# = s#+1 - set.s# = "TransmitCOND ="0 - "Execio * DISKW SYSTSPRT (Stem set. Finis" - "Execio * DISKW SETUP (Stem set. Finis" - - STRING="ALLOC DD(PARMLIST) DA("MySEN2Library"(SONARPRM)) SHR REUSE" - CALL BPXWDYN STRING; - - STRING="ALLOC DD(MDL#JOB) ", - "DA("MySEN2Library"("TransmitMethod"#JOB) SHR REUSE" - CALL BPXWDYN STRING; - STRING="ALLOC DD(MDL#RCV) ", - "DA("MySEN2Library"("TransmitMethod"#RCV) SHR REUSE" - CALL BPXWDYN STRING; - STRING="ALLOC DD(MDL#RUN) ", - "DA("MySEN2Library"("TransmitMethod"#RUN) SHR REUSE" - CALL BPXWDYN STRING; - - STRING="ALLOC DD(JCL#JOB) ", - "DA("SonarWorkfile"("TransmitMethod"#JOB) SHR REUSE" - CALL BPXWDYN STRING; - STRING="ALLOC DD(JCL#RCV) ", - "DA("SonarWorkfile"("TransmitMethod"#RCV) SHR REUSE" - CALL BPXWDYN STRING; - STRING="ALLOC DD(JCL#RUN) ", - "DA("SonarWorkfile"("TransmitMethod"#RUN) SHR REUSE" - CALL BPXWDYN STRING; - - STRING="ALLOC DD(WAIT#1) DA("MySEN2Library"(SONARW#1)) SHR REUSE" - CALL BPXWDYN STRING; - STRING="ALLOC DD(WAIT#2) DA("MySEN2Library"(SONARW#2)) SHR REUSE" - CALL BPXWDYN STRING; - STRING="ALLOC DD(WAIT#3) DA("MySEN2Library"(SONARW#3)) SHR REUSE" - CALL BPXWDYN STRING; - STRING="ALLOC DD(MODEL) DA("MySEN2Library"(SONARMDL)) SHR REUSE" - CALL BPXWDYN STRING; - STRING="ALLOC DD(TABLE) DA("MySEN2Library"(SONARTBL)) SHR REUSE" - CALL BPXWDYN STRING; - STRING="ALLOC DD(NOTHING) DUMMY" - CALL BPXWDYN STRING; - STRING="ALLOC DD(SYSTSPRT) SYSOUT(A) " - CALL BPXWDYN STRING; - STRING="ALLOC DD(REPORT) SYSOUT(A) " - CALL BPXWDYN STRING; - STRING = "ALLOC DD(TBLOUT) SYSOUT(A) WRITER(INTRDR) REUSE " ; - CALL BPXWDYN STRING; - - myRC = ENBPIU00("PARMLIST") - - CALL BPXWDYN "FREE DD(TBLOUT) " - CALL BPXWDYN "FREE DD(REPORT) " - CALL BPXWDYN "FREE DD(PARMLIST)" - CALL BPXWDYN "FREE DD(SETUP) " - CALL BPXWDYN "FREE DD(WAIT#1) " - CALL BPXWDYN "FREE DD(WAIT#2) " - CALL BPXWDYN "FREE DD(WAIT#3) " - CALL BPXWDYN "FREE DD(MODEL) " - CALL BPXWDYN "FREE DD(TABLE) " - CALL BPXWDYN "FREE DD(NOTHING) " - CALL BPXWDYN "FREE DD(SYSTSPRT)" - - If myRC = 11 then, - message = 'C1UEXTR7 - could not submit the SonarQube job' - If myRC = 12 then, - message = 'C1UEXTR7 - File transmissions failed ' - If myRC = 13 then, - message = 'C1UEXTR7 - could not initiate SonarQube', - ' analysis' - - If myRC < 8 then, - Do - STRING="ALLOC DD(RESULTS)", - " DA("SonarWorkfile".RESULTS) SHR REUSE" - CALL BPXWDYN STRING; - "Execio * DISKR RESULTS (Stem rslt. Finis" - CALL BPXWDYN "FREE DD(RESULTS)" - lastline# = rslt.0 - lastline = rslt.lastline# - If Pos('Status: SUCCESS ',lastline) = 0 then myRc= 8 - End /* If myRC < 8 */ - - RETURN ; - -SetExitReturnInfo: - - If TraceRQ = 'Y' then Trace ?R - whereami = 'SetExitReturnInfo' - If TraceRQ = 'Y' then Say 'SetExitReturnInfo: ' - - hexAddress = D2X(Address_PECB_MESSAGE) - storrep = STORAGE(hexAddress,,Message) - hexAddress = D2X(Address_PECB_ERROR_MESS_LENGTH) - storrep = STORAGE(hexAddress,,'0084'X) - hexAddress = D2X(Address_PECB_MODS_MADE_TO_PREQ) - storrep = STORAGE(hexAddress,,'Y') - - If MessageCode /= ' ' then, - Do - hexAddress = D2X(Address_PECB_MESSAGE_ID) - storrep = STORAGE(hexAddress,,MessageCode) - End - -/* Set the return code for the exit */ -/* for PECB-NDVR-EXIT-RC */ - hexAddress = D2X(Address_PECB_NDVR_EXIT_RC) - If MyRc = 4 then, - storrep = STORAGE(hexAddress,,'00000004'X) - Else, - storrep = STORAGE(hexAddress,,'00000008'X) - - RETURN ; - +/* rexx */ + /* Make CAST actions always be batch... */ + /* Values to be set for your site...... */ + /* Build a JCL model, and name its location here.... */ + CastPackageModel = your.hlq.SKELS(CASTPKGE)' + CastPackageModel = '' + /* Name a work dataset to be created then deleted... */ + CastPackageJCL = USERID()".C1UEXTR7.SUBMIT" + /* If wanting to limit the use of this exit, uncomment... */ +/* If USERID() /= 'IBMUSER' then exit */ + STRING = "ALLOC DD(SYSTSPRT) SYSOUT(A) " + CALL BPXWDYN STRING; + STRING = "ALLOC DD(SYSTSIN) DUMMY" + CALL BPXWDYN STRING; + /* If C1UEXTR7 is allocated to anything, turn on Trace */ + WhatDDName = 'C1UEXTR7' + CALL BPXWDYN "INFO FI("WhatDDName")", + "INRTDSN(DSNVAR) INRDSNT(myDSNT)" + if RESULT = 0 then Trace ?r + Sa= 'You called C1UEXTR7 ' + Message = '' + MessageCode = ' ' + /* Values to be set for your site...... */ + /* For package REVIEW (APPROVE/DENY)..... */ + /* Enter location of Approver Group sequencing ... */ + ApproverGroupSequence= 'YOURSITE.NDVR.PARMLIB(APPROVER)' + ApproverGroupSequence= '' + /* Do you want all CAST actions to be peformed in Batch? */ + Force_CAST_in_Batch = 'Y' ; /* Y/N */ + Force_CAST_in_Batch = 'N' ; /* Y/N */ + Cast_with_SonarQube= 'N' /* Y/N/?=Check Notes and pkg content*/ + Cast_with_SonarQube= 'Y' /* Y/N/?=Check Notes and pkg content*/ + Arg Parms + sa= 'Parms len=' Length(Parms) + MyRc = 0 + /* Parms from C1UEXT07 is a string of REXX statements */ + Interpret Parms + /* Is package ready to be automatically Executed..... */ + IF PHDR_PACKAGE_STATUS = 'APPROVED' &, + PECB_BEF_AFTER_LITERAL = 'AFTER' &, + (PECB_FUNCTION_LITERAL = 'CAST' |, + PECB_FUNCTION_LITERAL = 'REVIEW') Then, + Do + PKGEXECT_Parm = Copies(' ',055) + PKGEXECT_Parm = Overlay(PECB_PACKAGE_ID ,PKGEXECT_Parm,001) + PKGEXECT_Parm = Overlay(PHDR_PKG_ENV ,PKGEXECT_Parm,018) + PKGEXECT_Parm = Overlay(PHDR_PKG_STGID ,PKGEXECT_Parm,026) + PKGEXECT_Parm = Overlay(REXX_EXEC_MODE ,PKGEXECT_Parm,028) + PKGEXECT_Parm = Overlay(PHDR_PKG_CREATE_USER,PKGEXECT_Parm,029) + PKGEXECT_Parm = Overlay(PHDR_PKG_UPDATE_USER,PKGEXECT_Parm,037) + PKGEXECT_Parm = Overlay(PHDR_PKG_CAST_USER ,PKGEXECT_Parm,045) + Call PKGEXECT PKGEXECT_Parm + Exit + End + /* Is package ready to be CAST in batch ............. */ + /* Does PACKAGE builder indicate the package has COBOL ? */ + thisPackageHasCobol = 'N' + If Substr(PREQ_PACKAGE_COMMENT,47,4) = '+COB' then, + thisPackageHasCobol = 'Y' + If Cast_with_SonarQube= 'Y' & thisPackageHasCobol = 'Y' then, + Do + /* Does user want to BYPASS SonarQube for this package ? */ + AllNotes = , + PHDR_PKG_NOTE1 || PHDR_PKG_NOTE2 || PHDR_PKG_NOTE3 ||, + PHDR_PKG_NOTE4 || PHDR_PKG_NOTE5 || PHDR_PKG_NOTE6 ||, + PHDR_PKG_NOTE7 || PHDR_PKG_NOTE8 + If Pos('BYPASS SONARQUBE',AllNotes) > 0 then, + Cast_with_SonarQube= 'N' + End + /* If Going to interface with SonarQube, do CAST in Batch */ + /* if foreground, re-Submit in Batch */ + IF Cast_with_SonarQube= 'Y' &, + thisPackageHasCobol= 'Y' &, + PECB_FUNCTION_LITERAL = 'CAST' &, + PECB_BEF_AFTER_LITERAL = 'BEFORE' &, + PECB_MODE = "T" then, /* TSO foreground */ + Do + Call SubmitBatchCAST + Exit + End + /* If Going to interface with SonarQube, do CAST in Batch */ + /* if Batch, engage the interface with SonarQube */ + IF Cast_with_SonarQube= 'Y' &, + thisPackageHasCobol= 'Y' &, + PECB_FUNCTION_LITERAL = 'CAST' &, + PECB_BEF_AFTER_LITERAL = 'BEFORE' &, + PECB_MODE = "B" then, /* TSO foreground */ + Do + Message = SONRQUBE(PECB_PACKAGE_ID) + If Message /= '' then, + Do + MyRc = 8 + Call SetExitReturnInfo + End + Exit + End + EXIT + If Substr(PHDR_PKG_NOTE5,1,5) = 'TRACE' then TraceRc = 1 + IF PHDR_PACKAGE_STATUS = 'APPROVED' &, + PECB_BEF_AFTER_LITERAL = 'AFTER' &, + (PECB_FUNCTION_LITERAL = 'CAST' |, + PECB_FUNCTION_LITERAL = 'REVIEW') Then, + Do + PKGEXECT_Parm = Copies(' ',055) + PKGEXECT_Parm = Overlay(PECB_PACKAGE_ID ,PKGEXECT_Parm,001) + PKGEXECT_Parm = Overlay(PHDR_PKG_ENV ,PKGEXECT_Parm,018) + PKGEXECT_Parm = Overlay(PHDR_PKG_STGID ,PKGEXECT_Parm,026) + PKGEXECT_Parm = Overlay(REXX_EXEC_MODE ,PKGEXECT_Parm,028) + PKGEXECT_Parm = Overlay(PHDR_PKG_CREATE_USER,PKGEXECT_Parm,029) + PKGEXECT_Parm = Overlay(PHDR_PKG_UPDATE_USER,PKGEXECT_Parm,037) + PKGEXECT_Parm = Overlay(PHDR_PKG_CAST_USER ,PKGEXECT_Parm,045) + Call PKGEXECT PKGEXECT_Parm + Exit + End + /* Enforce packages to be Backout Enabled */ + IF PREQ_BACKOUT_ENABLED /= 'Y' then, + Do + Message = 'Package made to be Backout enabled' + MyRc = 4 + hexAddress = D2X(Address_PREQ_BACKOUT_ENABLED) + storrep = STORAGE(hexAddress,,'Y') + Call SetExitReturnInfo + End; + Exit +SubmitBatchCAST: + /* Preparing to CAST The package... */ + If PREQ_PKG_CAST_COMPVAL = 'Y' then, + CastOption = ' OPTION VALIDATE COMPONENTS' + Else, + If PREQ_PKG_CAST_COMPVAL = 'W' then, + CastOption = ' OPTION VALIDATE COMPONENT WITH WARNING' + Else, + CastOption = ' OPTION DO NOT VALIDATE COMPONENT' + /* Variable settings for each site ---> */ + WhereIam = WHERE@M1() + interpret 'Call' WhereIam "'MyDATALibrary'" + MyDATALibrary = Result + interpret 'Call' WhereIam "'MySEN2Library'" + MySEN2Library = Result + interpret 'Call' WhereIam "'MySENULibrary'" + MySENULibrary = Result + interpret 'Call' WhereIam "'AltIDAcctCode'" + AltIDAcctCode = Result + interpret 'Call' WhereIam "'MySENULibrary'" + MySENULibrary = Result + interpret 'Call' WhereIam "'AltIDJobClass'" + AltIDJobClass = Result + /* <---- Variable settings for each site */ + Sa= 'Running C1UEXTR7 ' + /* Allocate and prepare files for ENBPIU00 execution */ + /* OPTIONS will contain date and time values */ + /* */ + STRING = "ALLOC DD(OPTIONS) LRECL(80) BLKSIZE(27920) ", + " DSORG(PS) ", + " SPACE(1,1) RECFM(F,B) TRACKS ", + " NEW UNCATALOG REUSE "; + CALL BPXWDYN STRING; + QUEUE " $nomessages = 'Y' " ; + QUEUE " Package = '"PECB_PACKAGE_ID"'" ; + QUEUE " Userid = '"USERID()"'" ; + QUEUE " Userjob = '"USERID()|| SUBSTR(Package,1,1)"'" + QUEUE " AltIDAcctCode = '"AltIDAcctCode"'" + QUEUE " MySEN2Library = '"MySEN2Library"'" + QUEUE " MySENULibrary = '"MySENULibrary"'" + QUEUE " AltIDJobClass = '"AltIDJobClass"'" + QUEUE " CastOption = '"CastOption"'" + "EXECIO " QUEUED() "DISKW OPTIONS (FINIS" + /* */ + /* TABLE is simple to allow the CAST */ + /* */ + STRING = "ALLOC DD(TABLE) LRECL(80) BLKSIZE(8000) ", + " DSORG(PS) ", + " SPACE(1,1) RECFM(F,B) TRACKS ", + " NEW UNCATALOG REUSE "; + CALL BPXWDYN STRING; + QUEUE "* Do " + QUEUE " * " + "EXECIO 2 DISKW TABLE (FINIS" + STRING = 'ALLOC DD(MODEL) ', + "DA('"MySEN2Library"(CASTPKGE)') SHR REUSE " + CALL BPXWDYN STRING; + /* TBLOUT is assigned to a temporary dataset to receive the jcl */ + /* */ + STRING = "ALLOC DD(TBLOUT) LRECL(80) BLKSIZE(27920) ", + " DA("CastPackageJCL") ", + " DSORG(PS) ", + " SPACE(1,1) RECFM(F,B) TRACKS ", + " NEW CATALOG REUSE "; + CALL BPXWDYN STRING; + /* */ + /* Now call ENBPIU00 which does the rest */ + /* */ + "ENBPIU00 M 1 " + "EXECIO 0 DISKW TBLOUT (FINIS" + CALL BPXWDYN "FREE DD(OPTIONS)" ; + CALL BPXWDYN "FREE DD(TABLE)" ; + CALL BPXWDYN "FREE DD(MODEL)" ; + Call Submit_n_save_jobInfo ; + Message = JobData + MyRc = 8 + PACKAGE = PECB_PACKAGE_ID + MessageCode = 'U033' + Call SetExitReturnInfo + CALL BPXWDYN "FREE DD(TBLOUT) DELETE" + Return +Submit_n_save_jobInfo: /* submit CastPackageModel job and save job info */ + If TraceRc = 1 then Say 'Submit_n_save_jobInfo:' + Address TSO "PROFILE NOINTERCOM" /* turn off msg notific */ + CALL MSG "ON" + CALL OUTTRAP "out." + ADDRESS TSO "SUBMIT '"CastPackageJCL"'" ; + If RC > 4 then, + Do + MyRC = 8 + Message = 'Cannot find Element member to submit.' + Call SetExitReturnInfo + Exit(12) + End + CALL OUTTRAP "OFF" + Address TSO "PROFILE INTERCOM" /* turn on msg notific */ + JobData = Strip(out.1); + jobinfo = Word(JobData,2) ; + If jobinfo = 'JOB' then, + jobinfo = Word(JobData,3) ; + SelectJobName = Word(Translate(jobinfo,' ',')('),1) ; + SelectJobNumber = Word(Translate(jobinfo,' ',')('),2) ; + Return; +SetExitReturnInfo: + If TraceRc = 1 then Say 'SetExitReturnInfo: ' + hexAddress = D2X(Address_PECB_MESSAGE) + storrep = STORAGE(hexAddress,,Message) + hexAddress = D2X(Address_PECB_ERROR_MESS_LENGTH) + storrep = STORAGE(hexAddress,,'0084'X) + hexAddress = D2X(ADDRESS_PECB_MODS_MADE_TO_PREQ) + storrep = STORAGE(hexAddress,,'Y') + If MessageCode /= ' ' then, + Do + hexAddress = D2X(Address_PECB_MESSAGE_ID) + storrep = STORAGE(hexAddress,,MessageCode) + End +/* Set the return code for the exit */ +/* for PECB-NDVR-EXIT-RC */ + hexAddress = D2X(Address_PECB_NDVR_EXIT_RC) + If MyRc = 4 then, + storrep = STORAGE(hexAddress,,'00000004'X) + Else, + storrep = STORAGE(hexAddress,,'00000008'X) + RETURN ; diff --git a/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/README.md b/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/README.md index 70f6f96..bafc7ca 100644 --- a/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/README.md +++ b/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/README.md @@ -27,21 +27,22 @@ Features of this solution are easily tailorable to the requirements at your site Processing logic is primarily found in REXX, JCL and Python members. The Python member orchestrates the SonarQube activity. File transmissions are performed using XCOM, in these examples, but they easily be swapped out for members that use your transmission tool. -Some supporting items not found in this folder, since they are utilities, or already contribute to other solutions. They can be found in other locations of this GitHub, including: +Some supporting items are not found in this folder, since they are utilities, or already contribute to other solutions. They can be found in other locations of this GitHub, including: -**[BUMPJOB.rex](https://github.com/BroadcomMFD/broadcom-product-scripts/blob/main/endevor/Field-Developed-Programs/Processor-Tools-and-Processor-Snippets/BUMPJOB.rex)** for bumping an existing jobname to render a new job name +**[BUMPJOB.rex](https://github.com/BroadcomMFD/broadcom-product-scripts/blob/SonarQube-Interface-with-Endevor/endevor/Field-Developed-Programs/Miscellaneous-items/BUMPJOB.rex)** for bumping an existing jobname to render a new job name **[GETACCT.rex](https://github.com/BroadcomMFD/broadcom-product-scripts/blob/main/endevor/Automated-Test-Facility-Using-Test4Z/GETACCTC.rex)** for obtaining and re-using the users accounting code information -**[GTUNIQUE.rex](https://github.com/BroadcomMFD/broadcom-product-scripts/blob/main/endevor/Field-Developed-Programs/Processor-Tools-and-Processor-Snippets/GTUNIQUE.rex)** for obtaining a unique 8-byte name from the current date and time. +**[GTUNIQUE.rex](https://github.com/BroadcomMFD/broadcom-product-scripts/blob/SonarQube-Interface-with-Endevor/endevor/Field-Developed-Programs/Miscellaneous-items/GTUNIQUE.rex)** for obtaining a unique 8-byte name from the current date and time. -**[WAITFILE.rex](https://github.com/BroadcomMFD/broadcom-product-scripts/blob/main/endevor/Field-Developed-Programs/Miscellaneous-items/WAITFILE.rex)** for looping through wait periods of time, until a specific file becomes available. +**[QMATCH.rex](https://github.com/BroadcomMFD/broadcom-product-scripts/blob/SonarQube-Interface-with-Endevor/endevor/Field-Developed-Programs/Miscellaneous-items/QMATCH.rex)** for comparing two text strings, where one or both may have wild-carded values. -**[SCAN#SCL](https://github.com/BroadcomMFD/broadcom-product-scripts/blob/main/endevor/Field-Developed-Programs/Multi-Package-Reporting-and-Validations/SCAN%23SCL.rex)** for converting SCL statements into a table format. +**[SCAN#SCL.rex](https://github.com/BroadcomMFD/broadcom-product-scripts/blob/main/endevor/Field-Developed-Programs/Multi-Package-Reporting-and-Validations/SCAN%23SCL.rex)** for converting SCL statements into a table format. -**[QMATCH]( )** + +**[WAITFILE.rex](https://github.com/BroadcomMFD/broadcom-product-scripts/blob/SonarQube-Interface-with-Endevor/endevor/Field-Developed-Programs/Miscellaneous-items/WAITFILE.rex)** for looping through wait periods of time, until a specific file becomes available. **[WHERE@M1](https://github.com/BroadcomMFD/broadcom-product-scripts/blob/main/endevor/Field-Developed-Programs/Package-Automation/WHERE%40M1.rex)** the utility used for supporting diversity of dataset names, and other differences, by Lpar. diff --git a/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/SONRQUBE.rex b/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/SONRQUBE.rex new file mode 100644 index 0000000..b939b24 --- /dev/null +++ b/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/SONRQUBE.rex @@ -0,0 +1,527 @@ +/* rexx */ + /* If wanting to limit the use of this exit, uncomment... */ + If USERID() /= 'ibmuser' then exit + + /* If SONRQUBE is allocated to anything, turn on Trace */ + WhatDDName = 'SONRQUBE' + CALL BPXWDYN "INFO FI("WhatDDName")", + "INRTDSN(DSNVAR) INRDSNT(myDSNT)" + If RESULT = 0 then Trace r + + Arg PECB_PACKAGE_ID . + + Sa= 'You called SONRQUBE ' + /* Variable settings for each site ---> */ + WhereIam = WHERE@M1() + interpret 'Call' WhereIam "'MySENULibrary'" + MySENULibrary = Result + interpret 'Call' WhereIam "'MySEN2Library'" + MySEN2Library = Result + interpret 'Call' WhereIam "'MyCLS0Library'" + MyCLS0Library = Result + interpret 'Call' WhereIam "'MyCLS2Library'" + MyCLS2Library = Result + interpret 'Call' WhereIam "'MyHomeAddress'" + MyHomeAddress = Result + interpret 'Call' WhereIam "'AltIDAcctCode'" + AltIDAcctCode = Result + + Message = '' + MessageCode = ' ' + + /* Interfacing with SonarQube during package CAST in Batch */ + /* Local selections here... */ + + COBOL_Element_Types = 'COB* CBL*' + COBOL_Compile_StepNames = 'COMPILE COMP CMP COB' + + TransmitMethod = 'FTP' /* **chose one ** */ + TransmitMethod = 'XCOM' /* **chose one ** */ + Call GetUnique_Name + SonarDSNPrefix = USERID()'.SONRQUBE.' || Unique_Name + TransmitTable = "" + + Call Allocate_Files_For_CSV_and_API + Elements.0 = 0 + Call ProcessPackageSCL + If COBOLinPackage = 'Y' then, + Do + Call RETRIEVE_Cobol_Elements + Call Use_ENTBJAPI_For_BX_Info + Call SubmitandWaitForSonarQube + If myRC > 4 then, + Do + message = 'SONRQUBE -', + 'Package Failed the SonarQube Analysis' + MyRc = 8 + End /* If myRC > 4 */ + Else, + Do + MyRc = 4 + message = 'SONRQUBE -', + 'Package passed a SonarQube Analysis' + message = '' + End /* Else */ + End; /* If COBOLinPackage = 'Y' ... */ + + Call FREE_Files_For_CSV_and_API + + Return message + +GetUnique_Name: + + Unique_Name = GTUNIQUE() + If TraceRQ = 'Y' then, + SAY "Unique Member name is " Unique_Name + + Return + +Allocate_Files_For_CSV_and_API: + + STRING = "ALLOC DD(C1MSGS1) DUMMY " + CALL BPXWDYN STRING; + STRING = "ALLOC DD(BSTERR) DA(*) " + CALL BPXWDYN STRING; + STRING = "ALLOC DD(BSTAPI) DA(*) " + CALL BPXWDYN STRING; + + STRING = "ALLOC DD(MSGFILE) LRECL(133) BLKSIZE(26600) ", + " DSORG(PS) ", + " SPACE(5,5) RECFM(F,B) TRACKS ", + " NEW UNCATALOG REUSE "; + CALL BPXWDYN STRING; + + Return; + +FREE_Files_For_CSV_and_API: + + CALL BPXWDYN STRING; + STRING = "FREE DD(C1MSGS1)" ; + CALL BPXWDYN STRING; + STRING = "FREE DD(BSTERR)" ; + CALL BPXWDYN STRING; + STRING = "FREE DD(BSTAPI)" ; + CALL BPXWDYN STRING; + STRING = "FREE DD(MSGFILE)"; + CALL BPXWDYN STRING; + + Return; + +ProcessPackageSCL: + + /* Do an EXPORT to Capture the Package SCL */ + SonarWorkfile = SonarDSNPrefix || '.SONARWRK' + SonarCOBOL = SonarDSNPrefix || '.SONARCOB' + + STRING = "ALLOC DD(WRKFILE) LRECL(080) BLKSIZE(24000) ", + " DA("SonarWorkfile") ", + " DSORG(PO) DSNTYPE(LIBRARY) DIR(9) ", + " SPACE(5,5) RECFM(F,B) CYL ", + " NEW CATALOG REUSE "; + CALL BPXWDYN STRING; + CALL BPXWDYN "FREE DD(WRKFILE)" + + STRING = "ALLOC DD(COBOL) LRECL(080) BLKSIZE(24000) ", + " DA("SonarCOBOL") ", + " DSORG(PO) DSNTYPE(LIBRARY) DIR(9) ", + " SPACE(5,5) RECFM(F,B) CYL ", + " NEW CATALOG REUSE "; + CALL BPXWDYN STRING; + CALL BPXWDYN "FREE DD(COBOL) " + + STRING = "ALLOC DD(SCL) DA("SonarWorkfile"(SCL)) SHR REUSE" + CALL BPXWDYN STRING; + + STRING="ALLOC DD(ENPSCLIN) DA("SonarWorkfile"(SCLEXPRT)) SHR REUSE" + CALL BPXWDYN STRING; + QUEUE "EXPORT PACKAGE '"PECB_PACKAGE_ID"'" + QUEUE " TO DDN 'SCL' ." + "EXECIO 2 DISKW ENPSCLIN (FINIS "; /* count queued */ + + ADDRESS LINK 'ENBP1000' ; /* run from CSIQAUTH*/ + call_rc = rc ; + + CALL BPXWDYN "FREE DD(ENPSCLIN)" ; + + STRING = "ALLOC DD(RESULTS) DA("SonarWorkfile"(PKGTBL)) SHR REUSE" + CALL BPXWDYN STRING; + + /* Use SCAN#SCL to create a TABLE from the SCL content */ + Call SCAN#SCL 'TABLE' + + CALL BPXWDYN "FREE DD(SCL)" ; + + /* Use TableTool to create multiple outputs */ + STRING = "ALLOC DD(TABLE) DA("SonarWorkfile"(PKGTBL)) SHR REUSE" + CALL BPXWDYN STRING; + + STRING="ALLOC DD(PARMLIST) DA("SonarWorkfile"(PARMLST1)) SHR REUSE" + CALL BPXWDYN STRING; + QUEUE " NOTHING NOTHING OPTIONS0 0 " + QUEUE " HEADING1 TBLOUT1 OPTIONS$ 1 " + QUEUE " HEADING3 TBLOUT3 NOTHING 1 " + QUEUE " MODEL1 TBLOUT1 OPTIONS# A " + "EXECIO 4 DISKW PARMLIST (FINIS "; /* count queued */ + + STRING="ALLOC DD(OPTIONS0) DA("SonarWorkfile"(OPTIONS0)) SHR REUSE" + CALL BPXWDYN STRING; + QUEUE " $MultiplePDSmemberOuts = 'Y' /* mult PDS mbr outputs */ " + "EXECIO 1 DISKW OPTIONS0 (FINIS "; + + STRING="ALLOC DD(OPTIONS$) DA("SonarWorkfile"(OPTIONS$)) SHR REUSE" + CALL BPXWDYN STRING; + ReportingPFX = USERID() || '.SONRQUBE.'Unique_Name'.RESULTS' + myJob = MVSVAR('SYMDEF','JOBNAME' ) + Jobname = BUMPJOB(myJob) + + QUEUE " COBOL_Element_Types = '"COBOL_Element_Types"'" + QUEUE " COBOL_Compile_StepNames = '"COBOL_Compile_StepNames"'" + QUEUE " Package = '"PECB_PACKAGE_ID"'" + QUEUE " MyHomeAddress = '"MyHomeAddress"'" + QUEUE " SonarCOBOL = '"SonarCOBOL"'" + QUEUE " Unique_Name = '"Unique_Name"'" + QUEUE " AltIDAcctCode = '"AltIDAcctCode"'" + QUEUE " SonarWorkfile = '"SonarWorkfile"'" + QUEUE " MySENULibrary = '"MySENULibrary"'" + QUEUE " MySEN2Library = '"MySEN2Library"'" + QUEUE " MyCLS0Library = '"MyCLS0Library"'" + QUEUE " MyCLS2Library = '"MyCLS2Library"'" + QUEUE " TransmitMethod = '"TransmitMethod"'" + QUEUE " ReportingPFX = '"ReportingPFX"'" + QUEUE " Userid = '"USERID()"'" + QUEUE " myJob = '"myJob"'" + QUEUE " Jobname = '"Jobname"'" + "EXECIO 17 DISKW OPTIONS$ (FINIS "; /* count queued */ + CALL BPXWDYN "ALLOC DD(NOTHING) DUMMY" + + STRING="ALLOC DD(HEADING1) DA("SonarWorkfile"(HEADING1)) SHR REUSE" + CALL BPXWDYN STRING; + QUEUE " SET TO DSN '"SonarCOBOL"'." + QUEUE " SET OPTIONS REPLACE NO SIGNOUT. " + "EXECIO 2 DISKW HEADING1 (FINIS "; + + STRING="ALLOC DD(MODEL1) DA("SonarWorkfile"(MODEL1)) SHR REUSE" + CALL BPXWDYN STRING; + QUEUE " RETRIEVE ELEMENT &Element " + QUEUE " FROM ENVIRONMENT &Envmnt STAGE &S " + QUEUE " SYSTEM &System SUBSYSTEM &Subsys TYPE &Type . " + "EXECIO 3 DISKW MODEL1 (FINIS "; + + STRING="ALLOC DD(OPTIONS#) DA("SonarWorkfile"(OPTIONS#)) SHR REUSE" + CALL BPXWDYN STRING; + Queue "$NumberModelsAndTblouts= 3 " + Queue "HaveCobol = 0 " + Queue "Do w# = 1 to Words(COBOL_Element_Types) ; + " + Queue " HaveCobol=QMATCH(Type Word(COBOL_Element_Types,w#)); +" + Queue " If HaveCobol = 1 then Do; $my_rc = 1; Leave; End; + " + Queue "End; " + Queue "If HaveCobol = 0 then $SkipRow='Y' " + Queue "AEELM= COPIES(' ',80); " + Queue "AEELM= Overlay('AEELMBC ',AEELM,1) ; " + Queue "AEELM= Overlay(Envmnt,AEELM,10) ; /* Env */ " + Queue "AEELM= Overlay(S,AEELM,18) ; /* stg id */ " + Queue "AEELM= Overlay(System,AEELM,19) ; /* Sys */ " + Queue "AEELM= Overlay(Subsys,AEELM,27) ; /* Sub */ " + Queue "AEELM= Overlay(Element,AEELM,35) ; /* Ele */ " + Queue "AEELM= Overlay(Type,AEELM,45); /* Typ */ " + Queue "* " + Queue "Element = Left(Element,08) " + "EXECIO 17 DISKW OPTIONS# (FINIS "; /* count queued */ + + STRING="ALLOC DD(MODEL2) DA("SonarWorkfile"(MODEL2)) SHR REUSE" + CALL BPXWDYN STRING; + Queue "AACTL MSGFILE COMPLIST " + Queue "&AEELM " + Queue "RUN " + "EXECIO 3 DISKW MODEL2 (FINIS "; + + STRING="ALLOC DD(HEADING3) DA("SonarWorkfile"(HEADING3)) SHR REUSE" + CALL BPXWDYN STRING; + Queue "* Folder-- Member-- ", + "Dataset------------------------------------- " + "EXECIO 1 DISKW HEADING3 (FINIS "; + + STRING="ALLOC DD(MODEL3) DA("SonarWorkfile"(MODEL3)) SHR REUSE" + CALL BPXWDYN STRING; + Queue " COBOL &Element &SonarCOBOL " + "EXECIO 1 DISKW MODEL3 (FINIS "; + + STRING="ALLOC DD(TRAILER2) DA("SonarWorkfile"(TRAILER2)) SHR REUSE" + CALL BPXWDYN STRING; + Queue "AACTLY " + Queue "RUN " + Queue "QUIT " + "EXECIO 3 DISKW TRAILER2 (FINIS "; + + STRING="ALLOC DD(TBLOUT1) DA("SonarWorkfile"(RETRIEVE)) SHR REUSE" + CALL BPXWDYN STRING; + STRING="ALLOC DD(TBLOUT2) DA("SonarWorkfile"(AEELMBC)) SHR REUSE" + CALL BPXWDYN STRING; + STRING="ALLOC DD(TBLOUT3) DA("SonarWorkfile"(TRANSMIT)) SHR REUSE" + CALL BPXWDYN STRING; + + If TraceRQ = 'Y' then Trace R + myRC = ENBPIU00("PARMLIST") + If myRC = 1 then COBOLinPackage = 'Y' + + CALL BPXWDYN "FREE DD(SCL) " ; + CALL BPXWDYN "FREE DD(ENPSCLIN)" ; + CALL BPXWDYN "FREE DD(RESULTS) " ; + + CALL BPXWDYN "FREE DD(TABLE) " ; + CALL BPXWDYN "FREE DD(PARMLIST)" ; + CALL BPXWDYN "FREE DD(OPTIONS$) " ; + CALL BPXWDYN "FREE DD(NOTHING) " ; + CALL BPXWDYN "FREE DD(HEADING1)" ; + CALL BPXWDYN "FREE DD(MODEL1) " ; + CALL BPXWDYN "FREE DD(OPTIONS#)" ; + CALL BPXWDYN "FREE DD(OPTIONS$)" ; + CALL BPXWDYN "FREE DD(MODEL2) " ; + CALL BPXWDYN "FREE DD(HEADING3)" ; + CALL BPXWDYN "FREE DD(MODEL3) " ; + CALL BPXWDYN "FREE DD(TRAILER2)" ; + CALL BPXWDYN "FREE DD(TBLOUT1) " ; + CALL BPXWDYN "FREE DD(TBLOUT2) " ; + CALL BPXWDYN "FREE DD(TBLOUT3) " ; + + RETURN ; + +RETRIEVE_Cobol_Elements: + + STRING="ALLOC DD(BSTIPT01) DA("SonarWorkfile"(RETRIEVE)) SHR REUSE" + CALL BPXWDYN STRING; + + ADDRESS LINK 'C1BM3000' + + RETURN ; + +Use_ENTBJAPI_For_BX_Info: + + /* See your CSIQJCL(BC1JAAPI) */ + /* V - COLUMN 6 = FORMAT SETTING */ + /* = ' ' FOR NO FORMAT, JUST EXTRACT ELEMENT */ + /* = 'B' FOR ENDEVOR BROWSE DISPLAY FORMAT */ + /* = 'C' FOR ENDEVOR CHANGE DISPLAY FORMAT */ + /* = 'H' FOR ENDEVOR HISTORY DISPLAY FORMAT */ + /* V - COLUMN 7 = Replay TYPE SETTING */ + /* = 'E' FOR ELEMENT */ + /* = 'C' FOR COMPONENT */ + /* VVVVVVVV - COLUMN 10-17 ENVIRONMENT NAME */ + /* V - COLUMN 18 = STAGE ID */ + /* VVVVVVVV - COLUMN 19-26 SYSTEM NAME */ + /* VVVVVVVV - COLUMN 27-34 SUBSYSTEM NAME */ + /* COLUMN 35-44 = ELEMENT NAME VVVVVVVVVV */ + /* COLUMN 45-52 = TYPE NAME VVVVVVVV */ + /* */ + + Sa= 'Use_ENTBJAPI_For_BX_Info' + + STRING="ALLOC DD(SYSIN) DA("SonarWorkfile"(AEELMBC)) SHR REUSE" + CALL BPXWDYN STRING; + + + STRING = "ALLOC DD(COMPLIST) LRECL(200) BLKSIZE(20000) ", + " DSORG(PS) ", + " SPACE(5,15) RECFM(F,B) TRACKS ", + " MOD UNCATALOG REUSE "; + CALL BPXWDYN STRING; + + /* Call Built-in API program for COBOL source extracts */ + /* and COBOL component List requests. */ + ADDRESS LINK "ENTBJAPI" + + CALL BPXWDYN "FREE DD(SYSIN) " + + "EXECIO * DISKR COMPLIST (Stem cmplist. FINIS "; + CALL BPXWDYN "FREE DD(COMPLIST)" + + sa= cmplist.0 + If cmplist.0 = 0 then Return; + + Call ProcessCopybookMembers; + Call UpdateSonarTransmitTable; + Drop element. + + RETURN ; + +ProcessCopybookMembers: + + Do rec# = 1 to cmplist.0 + complist = Substr(cmplist.rec#,73) + If Substr(complist,1,22) = Copies('-',22) then, + thisSection = Word(complist,2) + If thisSection /= 'INPUT' then iterate; + If Word(complist,1) = 'STEP:' then, + Do + StepName = Word(complist,2) + DDname = Substr(Word(complist,3),4) + DatasetName = Substr(Word(complist,5),5) + Iterate + End + If Substr(Word(complist,5),3,1) = ':' &, + WordPos(StepName,COBOL_Compile_StepNames) > 0 &, + DDname = 'SYSLIB' then, + Do + member = Word(complist,2) + entry = "COPYBOOK,"member","DatasetName + If Wordpos(entry,TransmitTable) = 0 then, + TransmitTable = TransmitTable entry + End + End; /* Do rec# = 1 to cmplist.0 */ + + RETURN ; + +UpdateSonarTransmitTable: + + STRING =, + "ALLOC DD(SONARXMT) DA("SonarWorkfile"(TRANSMIT)) SHR REUSE" + CALL BPXWDYN STRING; + "Execio * DISKR SONARXMT (Stem xmit. Finis" + xm# = xmit.0 + + Do w# = 1 to Words(TransmitTable) + xm# = xm# + 1 + transtable = Word(TransmitTable,w#) + Parse var transtable folder ',' member ',' dataset + entry = " " left(folder,8) left(member,10) dataset + xmit.xm# = entry + End; /* Do w# = 1 to Words(TransmitTable) */ + + "Execio * DISKW SONARXMT (Stem xmit. Finis" + + transtable = "" + RETURN ; + +SubmitandWaitForSonarQube: + + /* Allocate files for a TableTool driven submission of the + SonarQube job, and a series of waits for parts of the job + to complete. + A TABLE TOOL step running with the PARMLIST option + (see PARMLST2 in the SonarWorkfile) + orchestrates the submission of the SONARJOB and the + the wait steps for the job completion. + */ + + STRING="ALLOC DD(SETUP) DA("SonarWorkfile"(OPTIONS$)) SHR REUSE" + CALL BPXWDYN STRING; + + STRING="ALLOC DD(PARMLIST) DA("SonarWorkfile"(PARMLST2)) SHR REUSE" + CALL BPXWDYN STRING; + Queue "NOTHING NOTHING SETUP 0" + Queue "MDL#JOB "TransmitMethod"#JOB NOTHING 1" + Queue "MDL#RCV "TransmitMethod"#RCV NOTHING 1" + Queue "MDL#RUN "TransmitMethod"#RUN NOTHING 1" + Queue "MODEL4 TBLOUT NOTHING 1" + Queue "TBLOUT READER NOTHING 1" + Queue "NOTHING REPORT WAIT#1 1" + Queue "NOTHING REPORT WAIT#2 1" + Queue "NOTHING REPORT WAIT#3 1" + "EXECIO 9 DISKW PARMLIST (FINIS "; + + STRING="ALLOC DD(MDL#JOB) ", + "DA("MySEN2Library"("TransmitMethod"#JOB) SHR REUSE" + CALL BPXWDYN STRING; + STRING="ALLOC DD(MDL#RCV) ", + "DA("MySEN2Library"("TransmitMethod"#RCV) SHR REUSE" + CALL BPXWDYN STRING; + STRING="ALLOC DD(MDL#RUN) ", + "DA("MySEN2Library"("TransmitMethod"#RUN) SHR REUSE" + CALL BPXWDYN STRING; + + STRING="ALLOC DD("TransmitMethod"#JOB) ", + "DA("SonarWorkfile"("TransmitMethod"#JOB) SHR REUSE" + CALL BPXWDYN STRING; + STRING="ALLOC DD("TransmitMethod"#RCV) ", + "DA("SonarWorkfile"("TransmitMethod"#RCV) SHR REUSE" + CALL BPXWDYN STRING; + STRING="ALLOC DD("TransmitMethod"#RUN) ", + "DA("SonarWorkfile"("TransmitMethod"#RUN) SHR REUSE" + CALL BPXWDYN STRING; + + STRING = "ALLOC DD(READER) SYSOUT(A) WRITER(INTRDR) REUSE " ; + CALL BPXWDYN STRING; + + /* Replicate the next several files for improved visibility */ + STRING="ALLOC DD(TEMP#1) DA("MySEN2Library"(SONARW#1)) SHR REUSE" + CALL BPXWDYN STRING; + "EXECIO * DISKR TEMP#1 (Stem wait. Finis" + CALL BPXWDYN "FREE DD(TEMP#1) " + STRING="ALLOC DD(WAIT#1) DA("SonarWorkfile"(WAIT#1)) SHR REUSE" + CALL BPXWDYN STRING; + "EXECIO * DISKW WAIT#1 (Stem wait. Finis" + + Drop wait. + STRING="ALLOC DD(TEMP#2) DA("MySEN2Library"(SONARW#2)) SHR REUSE" + CALL BPXWDYN STRING; + "EXECIO * DISKR TEMP#2 (Stem wait. Finis" + CALL BPXWDYN "FREE DD(TEMP#2) " + STRING="ALLOC DD(WAIT#2) DA("SonarWorkfile"(WAIT#2)) SHR REUSE" + CALL BPXWDYN STRING; + "EXECIO * DISKW WAIT#2 (Stem wait. Finis" + + Drop wait. + STRING="ALLOC DD(TEMP#3) DA("MySEN2Library"(SONARW#3)) SHR REUSE" + CALL BPXWDYN STRING; + "EXECIO * DISKR TEMP#3 (Stem wait. Finis" + CALL BPXWDYN "FREE DD(TEMP#3) " + STRING="ALLOC DD(WAIT#3) DA("SonarWorkfile"(WAIT#3)) SHR REUSE" + CALL BPXWDYN STRING; + "EXECIO * DISKW WAIT#3 (Stem wait. Finis" + + STRING="ALLOC DD(TEMPMD) DA("MySEN2Library"(SONARMDL)) SHR REUSE" + CALL BPXWDYN STRING; + "EXECIO * DISKR TEMPMD (Stem mdl. Finis" + CALL BPXWDYN "FREE DD(TEMPMD) " + STRING="ALLOC DD(MODEL4) DA("SonarWorkfile"(MODEL4)) SHR REUSE" + CALL BPXWDYN STRING; + "EXECIO * DISKW MODEL4 (Stem mdl. Finis" + + STRING="ALLOC DD(TABLE) DA("MySEN2Library"(SONARTBL)) SHR REUSE" + CALL BPXWDYN STRING; + STRING="ALLOC DD(NOTHING) DUMMY" + CALL BPXWDYN STRING; + STRING="ALLOC DD(SYSTSPRT) SYSOUT(A) " + CALL BPXWDYN STRING; + STRING="ALLOC DD(REPORT) SYSOUT(A) " + CALL BPXWDYN STRING; + STRING = "ALLOC DD(TBLOUT) DA("SonarWorkfile"(SONARJOB) SHR REUSE" + CALL BPXWDYN STRING; + + /* The next statement does the submit and wait */ + myRC = ENBPIU00("PARMLIST") + + CALL BPXWDYN "FREE DD(REPORT) " + CALL BPXWDYN "FREE DD(PARMLIST)" + CALL BPXWDYN "FREE DD(SETUP) " + CALL BPXWDYN "FREE DD(WAIT#1) " + CALL BPXWDYN "FREE DD(WAIT#2) " + CALL BPXWDYN "FREE DD(WAIT#3) " + CALL BPXWDYN "FREE DD(MODEL4) " + CALL BPXWDYN "FREE DD(TABLE) " + CALL BPXWDYN "FREE DD(NOTHING) " + CALL BPXWDYN "FREE DD(SYSTSPRT)" + CALL BPXWDYN "FREE DD(TBLOUT) " + + If myRC = 11 then, + message = 'SONRQUBE - could not submit the SonarQube job' + If myRC = 12 then, + message = 'SONRQUBE - File transmissions failed ' + If myRC = 13 then, + message = 'SONRQUBE - could not initiate SonarQube', + ' analysis' + + If myRC < 8 then, + Do + STRING="ALLOC DD(RESULTS)", + " DA("SonarWorkfile".RESULTS) SHR REUSE" + CALL BPXWDYN STRING; + "Execio * DISKR RESULTS (Stem rslt. Finis" + CALL BPXWDYN "FREE DD(RESULTS)" + lastline# = rslt.0 + lastline = rslt.lastline# + If Pos('Status: SUCCESS ',lastline) = 0 then myRc= 8 + End /* If myRC < 8 */ + + RETURN ; + From 55872a19454c6d3da55952c4500805301fd42517 Mon Sep 17 00:00:00 2001 From: Joseph Walther Date: Mon, 29 Sep 2025 18:34:27 -0500 Subject: [PATCH 17/20] README update --- .../SonarQube-interface-to-Endevor/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/README.md b/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/README.md index bafc7ca..9650c95 100644 --- a/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/README.md +++ b/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/README.md @@ -29,9 +29,10 @@ Processing logic is primarily found in REXX, JCL and Python members. The Python Some supporting items are not found in this folder, since they are utilities, or already contribute to other solutions. They can be found in other locations of this GitHub, including: +**[@SITE.rex](https://github.com/BroadcomMFD/broadcom-product-scripts/blob/main/endevor/Field-Developed-Programs/Package-Automation/%40site.rex)** the member to be renamed with an "@" and your lpar name. Its content has Lpar-specific details, allowing other software items to be void of details, and able to run anywhere unchanged. See the description for **[@siteMult.rex](https://github.com/BroadcomMFD/broadcom-product-scripts/tree/main/endevor/Shipments-for-Multiple-Destinations%20(zowe))** -**[BUMPJOB.rex](https://github.com/BroadcomMFD/broadcom-product-scripts/blob/SonarQube-Interface-with-Endevor/endevor/Field-Developed-Programs/Miscellaneous-items/BUMPJOB.rex)** for bumping an existing jobname to render a new job name +**[BUMPJOB.rex](https://github.com/BroadcomMFD/broadcom-product-scripts/blob/SonarQube-Interface-with-Endevor/endevor/Field-Developed-Programs/Miscellaneous-items/BUMPJOB.rex)** for bumping an existing jobname to render a new job name **[GETACCT.rex](https://github.com/BroadcomMFD/broadcom-product-scripts/blob/main/endevor/Automated-Test-Facility-Using-Test4Z/GETACCTC.rex)** for obtaining and re-using the users accounting code information From e8d1a6520accf13dcb428694674686fac4c6d81d Mon Sep 17 00:00:00 2001 From: Joseph Walther Date: Mon, 29 Dec 2025 12:27:18 -0600 Subject: [PATCH 18/20] Include SCAN#SCL --- .../SonarQube-interface-to-Endevor/README.md | 2 - .../SCAN#SCL.rex | 171 ++++++++++++++++++ 2 files changed, 171 insertions(+), 2 deletions(-) create mode 100644 endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/SCAN#SCL.rex diff --git a/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/README.md b/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/README.md index 9650c95..90e537e 100644 --- a/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/README.md +++ b/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/README.md @@ -40,8 +40,6 @@ Some supporting items are not found in this folder, since they are utilities, or **[QMATCH.rex](https://github.com/BroadcomMFD/broadcom-product-scripts/blob/SonarQube-Interface-with-Endevor/endevor/Field-Developed-Programs/Miscellaneous-items/QMATCH.rex)** for comparing two text strings, where one or both may have wild-carded values. -**[SCAN#SCL.rex](https://github.com/BroadcomMFD/broadcom-product-scripts/blob/main/endevor/Field-Developed-Programs/Multi-Package-Reporting-and-Validations/SCAN%23SCL.rex)** for converting SCL statements into a table format. - **[WAITFILE.rex](https://github.com/BroadcomMFD/broadcom-product-scripts/blob/SonarQube-Interface-with-Endevor/endevor/Field-Developed-Programs/Miscellaneous-items/WAITFILE.rex)** for looping through wait periods of time, until a specific file becomes available. diff --git a/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/SCAN#SCL.rex b/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/SCAN#SCL.rex new file mode 100644 index 0000000..e97e722 --- /dev/null +++ b/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/SCAN#SCL.rex @@ -0,0 +1,171 @@ +/* REXX */ +/* ---------------------------------------------------------- */ +/* Scan Endevor element-level SCL, parse the words, and */ +/* write out into a format that other processes can use. */ +/* ---------------------------------------------------------- */ +/* */ + /* If SCAN#SCL is allocated to anything, turn on Trace */ + WhatDDName = 'SCAN#SCL' + CALL BPXWDYN "INFO FI("WhatDDName")", + "INRTDSN(DSNVAR) INRDSNT(myDSNT)" + If Substr(DSNVAR,1,1) /= ' ' then Trace R + + /* Either Allocate SCL in the JCL, or name SCL dataset here */ + Arg Parameters; + Format = 'Table' /* Table or Rexx */ + If Words(Parameters) > 1 then Format = Word(Parameters,2) + SCLDataset = Word(Parameters,1) + + If Pos('.',SCLDataset) = 0 & Words(Parameters) = 1 then, + Format = Word(Parameters,1) + If Pos('.',SCLDataset) > 0 then, + CALL BPXWDYN, + "ALLOC DD(SCL) DA("SCLDataset") SHR REUSE" + + "EXECIO * DISKR SCL (Stem scl. Finis" + If RC > 4 then, + Do + Say 'SCAN#SCL- unable to find input SCL' + Exit(8) + End + If scl.0 > 0 then, + Do + Result = , + Left('Command',8), + Left('Envmnt',8), + Left('S',1), + Left('System',8), + Left('Subsys',8), + Left('Type',8), + 'Element ' + If Format = 'TABLE' then, + Result = "*" || Result + Else, + Result = "SCL.000000 ='" || Result || " '" + Queue Result + End; + + /* Establish Defaults */ + Count = 0 + DfltC1Envmnt = ' ' + DfltC1Stgid = ' ' + DfltC1System = ' ' + DfltC1Subsys = ' ' + DfltC1Element = ' ' + DfltC1ElType = ' ' + + Do s# = 1 to scl.0 + Call FindStatement + Call ProcessStatement + End; + + "EXECIO" QUEUED() "DISKW RESULTS (Finis" + + Exit + +FindStatement: + + Statement = ' ' + + Do Forever + sclLine = Strip(scl.s#,'T') + If Substr(sclLine,1,1) /= '*' then, + Statement = Statement sclLine + If Substr(Statement,Length(Statement),1) = '.' then Return; + if s# = scl.0 then Return; + s# = s# + 1; + End; /* Do forever */ + + Return; + +ProcessStatement: + + Classifications = 'ENV ENVIRONMENT SYS SYSTEM SUB SUBSYSTEM ', + 'TYP TYPE STA STAGE ELE ELEMENT ' + Commands = 'SET MOV MOVE TRA TRANSFER GEN GENERATE ', + ' DEL DELETE ' + + thisCommand = Word(Statement,1) + If Words(Statement) < 1 Then Return; + + C1Envmnt = DfltC1Envmnt + C1Stgid = DfltC1Stgid + C1System = DfltC1System + C1Subsys = DfltC1Subsys + C1Element= DfltC1Element + C1ElType = DfltC1ElType + + If Words(Statement) > 1 Then, + Do w# = 2 to Words(Statement) +/* MG added Translate */ + thisWord = Translate(Word(Statement,w#)) + If w# < Words(Statement) then, + nextWord = Word(Statement,w#+1) + Else, + nextWord = ' ' + If (thisWord = 'CCID' |, + thisWord = 'COMMENT' ) &, + Substr(nextWord,1,1) = "'" then, + Do + w# = w# + 1 + whereAmI = Wordindex(Statement,w#) + whereQuote = Pos("'",Statement,whereAmi+1) + if whereQuote <= whereAmI then Iterate; + Do forever; + If WordIndex(Statement,w#+1) > whereQuote then Leave; + w# = w# + 1; + sa= WordIndex(Statement,w#+1) whereQuote + End; /* Do forever */ + Iterate; + End + + nextWord = Strip(nextWord,'B',"'"); + nextWord = Strip(nextWord,'B','"'); + + If thisWord = 'OPTIONS' then Leave ; + If WordPos(thisWord,Classifications) = 0 then iterate; + + If thisCommand = 'SET' then, + Do + If Substr(thisWord,1,3) = 'ENV' then DfltC1Envmnt = nextWord + If Substr(thisWord,1,3) = 'STA' then DfltC1Stgid = nextWord + If Substr(thisWord,1,3) = 'SYS' then DfltC1System = nextWord + If Substr(thisWord,1,3) = 'SUB' then DfltC1Subsys = nextWord + If Substr(thisWord,1,3) = 'ELE' then DfltC1Element= nextWord + If Substr(thisWord,1,3) = 'TYP' then DfltC1ElType = nextWord + End + Else, + Do + If Substr(thisWord,1,3) = 'ENV' then C1Envmnt = nextWord + If Substr(thisWord,1,3) = 'STA' then C1Stgid = nextWord + If Substr(thisWord,1,3) = 'SYS' then C1System = nextWord + If Substr(thisWord,1,3) = 'SUB' then C1Subsys = nextWord + If Substr(thisWord,1,3) = 'ELE' then C1Element= nextWord + If Substr(thisWord,1,3) = 'TYP' then C1ElType = nextWord + End + w# = w# + 1 + End; /* Do w# = 2 to Words(Statement) */ + + If thisCommand = 'SET' then Return ; + If Length(C1Element) > 10 then, + C1Element = Translate(C1Element,'_',' '); + + Count = Count + 1 + ShowCount = Right(Count,6,'0') + Result =, + Left(thisCommand,8), + Left(C1Envmnt,8), + Left(C1Stgid,1), + Left(C1System,8), + Left(C1Subsys,8), + Left(C1ElType,8), + Left(C1Element,10) + If Format = 'TABLE' then, + Result = " " || Result + Else, + Result = 'SCL.'ShowCount "='" || Result || "'" +/* MG added Translate */ + Result = Translate(Result) + Queue Result + + Return; From ae6391a87138eb53f979ba42df2d5ad6650af7f2 Mon Sep 17 00:00:00 2001 From: Joseph Walther Date: Mon, 29 Dec 2025 16:48:49 -0600 Subject: [PATCH 19/20] Update README.md --- .../SonarQube-interface-to-Endevor/README.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/README.md b/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/README.md index 90e537e..5f8bf08 100644 --- a/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/README.md +++ b/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/README.md @@ -27,6 +27,8 @@ Features of this solution are easily tailorable to the requirements at your site Processing logic is primarily found in REXX, JCL and Python members. The Python member orchestrates the SonarQube activity. File transmissions are performed using XCOM, in these examples, but they easily be swapped out for members that use your transmission tool. + + Some supporting items are not found in this folder, since they are utilities, or already contribute to other solutions. They can be found in other locations of this GitHub, including: **[@SITE.rex](https://github.com/BroadcomMFD/broadcom-product-scripts/blob/main/endevor/Field-Developed-Programs/Package-Automation/%40site.rex)** the member to be renamed with an "@" and your lpar name. Its content has Lpar-specific details, allowing other software items to be void of details, and able to run anywhere unchanged. See the description for **[@siteMult.rex](https://github.com/BroadcomMFD/broadcom-product-scripts/tree/main/endevor/Shipments-for-Multiple-Destinations%20(zowe))** @@ -45,9 +47,18 @@ Some supporting items are not found in this folder, since they are utilities, or **[WHERE@M1](https://github.com/BroadcomMFD/broadcom-product-scripts/blob/main/endevor/Field-Developed-Programs/Package-Automation/WHERE%40M1.rex)** the utility used for supporting diversity of dataset names, and other differences, by Lpar. +This code in the SONRQUBE.rexx is used for identifying COBOL elements and copybooks. You might need to tweak it for your site: + +The cobol element type is expected to begin with COB or CBL + + COBOL_Element_Types = 'COB* CBL*' + COBOL_Compile_StepNames = 'COMPILE COMP CMP COB' +Then the compile step should be one of those above. +The ProcessCopybookMembers routine looks for Input components from SYSLIB in a compile step. +When the process runs, it places members into the dataset you name as the **SonarWorkfile**. You can use the members to see details of actions performed, and to help resolve issues. Use the SonarQube.bat commmand to bring the items together for your mainframe. From c03e2d3a570e6ee4f55e2743f818b22903498b75 Mon Sep 17 00:00:00 2001 From: Joseph Walther Date: Tue, 30 Dec 2025 11:38:04 -0600 Subject: [PATCH 20/20] Rename to CASTPKGE --- .../SonarQube-interface-to-Endevor/{CAST#JCL.skl => CASTPKGE.skl} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/{CAST#JCL.skl => CASTPKGE.skl} (100%) diff --git a/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/CAST#JCL.skl b/endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/CASTPKGE.skl similarity index 100% rename from endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/CAST#JCL.skl rename to endevor/Field-Developed-Programs/SonarQube-interface-to-Endevor/CASTPKGE.skl