/* REXX */
/* CLS2REXXed by UMLA01S on 7 Dec 2020 at 19:47:54  */
/*trace ?r*/
Signal On NoValue
Call On Error
Signal On Failure
Signal On Syntax
Parse source opsys . exec_name .
 
/*********************************************************************/
/* 06/23/2004 JL Nelson Added code to check security system.         */
/* 12/20/2005 C Stern Added CAAM0007 to VPUT statement.              */
/* 12/22/2005 C Stern Added TEST option to bypass TEMP9 open.        */
/* 03/23/2006 C Stern Modifications per JL Nelson.                   */
/* 06/06/2006 C Stern Updated ERROR ROUTINE.                         */
/* 07/09/2007 CL Fenton Changes made to include ASSET mbr of Dialog  */
/*            data set.  Obtaining CLASS for ASSET mbr.              */
/* 02/28/2009 CL Fenton Changes made removing compress and delete    */
/*            for PDI dataset.                                       */
/* 07/16/2009 CL Fenton Changes to evaluate masked sysid.            */
/* 10/22/2015 CL Fenton Changed VMS asset to Asset Definition.       */
/* 12/09/2020 CL Fenton Converted script from CLIST to REXX.         */
/* 04/19/2021 CL Fenton ACP00000 automation for ACF2-ES-000450 to    */
/*            determine which ACP is on the system, STS-026207.      */
/* 10/17/2025 CL Fenton Changed output for error codes.              */
/*                                                                   */
/*                                                                   */
/*                                                                   */
/*                                                                   */
/*********************************************************************/
pgmname = "CAAC0003 10/17/25"
CONSLIST = "OFF"              /* DEFAULT IS OFF                      */
COMLIST  = "OFF"              /* DEFAULT IS OFF                      */
SYMLIST  = "OFF"              /* DEFAULT IS OFF                      */
TERMMSGS = "ON"               /* DEFAULT IS OFF                      */
TEST     = "OFF"              /* FINDING MESSAGES = OFF|MOD|FINDING  */
TRACE    = "OFF"              /* TRACE ACTIONS AND ERRORS            */
TYPERUN  = "FSO"              /* RUN FOR SRRAUDIT|FSO                */
PDIDDN   = "PDIDD"            /* PDI DDNAME IN JCL                   */
DATADDN  = "DIALOG"           /* Dialog DD name for review           */
ASSET    = "ASSET"            /* Dialog Asset Definition member      */
CAAM0007 = "CAAM0507"         /* PDI EDIT MACRO                      */
CAAM0006 = "CAAM0006"         /* PDI EDIT MACRO                      */
CACC1000 = "CACC1000"         /* PDI EDIT MACRO                      */
sysprompt = "OFF"             /* CONTROL NOPROMPT                    */
sysflush = "OFF"              /* CONTROL NOFLUSH                     */
sysasis = "ON"                /* CONTROL ASIS - caps off             */
esm      = "ACF2"             /* external security manager           */
Numeric digits 10             /* default of 9 not enough             */
maxcc = 0
vput_rc           = "N/A"
lminit_dialog_rc  = "N/A"
lminit_temp9_rc   = "N/A"
lminit_pdidd_rc   = "N/A"
lmopen_pdidd_rc   = "N/A"
lmclose_pdidd_rc  = "N/A"
lmopen_dialog_rc  = "N/A"
lmopen_temp9_rc   = "N/A"
lmclose_temp9_rc  = "N/A"
lmmfind_dialog_rc = "N/A"
lmclose_dialog_rc = "N/A"
lmfree_dialog_rc  = "N/A"
vput_pdidd_rc     = "N/A"
view_temp9_rc     = "N/A"
vget_rc           = "N/A"
am06vge           = "N/A"
am07vge           = "N/A"
lmfree_temp9_rc   = "N/A"
lmfree_pdidd_rc   = "N/A"
zerrsm = " "
 
Arg OPTION
do until OPTION = ""
  parse var OPTION key"("val")" OPTION
  val = strip(val,"b","'")
  val = strip(val,"b",'"')
  optcmd = key '= "'val'"'
  interpret optcmd
  end
 
return_code = 0
If trace = "ON" then do            /* TURN messages on          */
  termmsgs = "ON"                  /* CONTROL MSG               */
  comlist = "ON"                   /* CONTROL LIST              */
  conslist = "ON"                  /* CONTROL CONLIST           */
  symlist = "ON"                   /* CONTROL SYMLIST           */
  end
 
If CONSLIST = "ON" | COMLIST = "ON" | SYMLIST = "ON" | TRACE = "ON",
  then Trace ?r
 
syssymlist = symlist          /* CONTROL SYMLIST/NOSYMLIST */
sysconlist = conslist         /* CONTROL CONLIST/NOCONLIST */
syslist = comlist             /* CONTROL LIST/NOLIST       */
sysmsg = termmsgs             /* CONTROL MSG/NOMSG         */
Address ISPEXEC
"CONTROL NONDISPL ENTER"
"CONTROL ERRORS RETURN"
/***********************************************/
/* CONSLIST = CONLIST                          */
/* COMLIST = LIST                              */
/* SYMLIST = SYMLIST                           */
/* TERMMSGS = MESSAGES                         */
/* TRACE TURNS ON MESSAGING                    */
/***********************************************/
return_code = 0                 /* SET RETURN CODE TO 0 */
old_resource = "               "
uidstr = "UID("
zispfrc = 0
"VPUT (ZISPFRC) SHARED"
return_code = 0
"VPUT (CONSLIST COMLIST SYMLIST TERMMSGS TEST CAAM0007) ASIS"
vput_rc = return_code
If return_code <> 0 then do
  Say pgmname "VPUT RC =" return_code strip(zerrsm)
  return_code = return_code + 16
  SIGNAL ERR_EXIT
  end
 
return_code = 0
"SELECT CMD("cacc1000 "ACP)"
"VGET (ACPNAME,ACPVERS) ASIS"
If acpname <> "ACF2" then do
  Say pgmname "ACF2 Job running on the wrong system"
  Say pgmname acpname acpvers
/*return_code = 20
  SIGNAL ERR_EXIT*/
  end
 
/*******************************************/
/* INITIALIZE LIBRARY MANAGEMENT           */
/*******************************************/
return_code = 0
"LMINIT DATAID(DATAID) DDNAME("dataddn")"
lminit_dialog_rc = return_code
If return_code <> 0 then do
  Say pgmname "LMINIT_DIALOG_RC =" return_code zerrsm
  Say pgmname zerrlm
  return_code = return_code + 16
  SIGNAL ERR_EXIT
  end
 
"LMINIT DATAID(TEMP9) DDNAME(TEMP9)"
lminit_temp9_rc = return_code             /* TRAP ERROR CODE */
If return_code <> 0 then do
  Say pgmname "LMINIT_TEMP9_RC =" return_code zerrsm
  return_code = return_code + 16
  SIGNAL ERR_EXIT
  end
 
"LMINIT DATAID(PDIDD) DDNAME(PDIDD) ENQ(EXCLU)"
lminit_pdidd_rc = return_code
If return_code <> 0 then do
  Say pgmname "LMINIT_PDIDD_RC =" return_code zerrsm
  return_code = return_code + 16
  SIGNAL ERR_EXIT
  end
 
/*Call ListDSI pdiddn "FILE"*/
x = listdsi(pdiddn "FILE")
If sysreason = 0 then do
  pdidsn = sysdsname
  end
Else do
  Say pgmname "UNABLE TO DETERMINE DSNAME FOR" pdiddn,
    "SYSREASON" sysreason zerrsm
  Say pgmname sysmsglvl1
  Say pgmname sysmsglvl2
  return_code = sysreason + 16
  SIGNAL ERR_EXIT
  end
 
return_code = 0
"LMOPEN DATAID("pdidd") OPTION(OUTPUT)"
lmopen_pdidd_rc = return_code
If return_code <> 0 then do
  Say pgmname "LMOPEN_PDIDD_RC =" return_code zerrsm
  Say pgmname zerrlm
  return_code = return_code + 16
  SIGNAL ERR_EXIT
  end
 
If acpname = esm then do
  ac   = ""
  line = acpname "is running on the system."
  end
Else do
  ac   = esm "is not installed and active on the system."
  line = "Found" acpname "running on the system."
  end
call process_pdi "ACP00000#"ac"$"line
 
return_code = 0
"LMCLOSE DATAID("pdidd")"
lmclose_pdidd_rc = return_code
If return_code <> 0 then do
  Say pgmname "LMCLOSE_PDIDD_RC =" return_code zerrsm
  Say pgmname zerrlm
  return_code = return_code + 16
  SIGNAL ERR_EXIT
  end
 
return_code = 0
"LMOPEN DATAID("dataid")"
lmopen_dialog_rc = return_code
If return_code <> 0 then do
  Say pgmname "LMOPEN_DIALOG_RC =" return_code zerrsm
  Say pgmname zerrlm
  return_code = return_code + 16
  SIGNAL ERR_EXIT
  end
 
If test <> "MOD" then do
  return_code = 0
  "LMOPEN DATAID("temp9") OPTION(OUTPUT)"  /* OPEN TEMP9 */
  lmopen_temp9_rc = return_code
  If return_code > 4 then do
    Say pgmname "LMOPEN_TEMP9_RC =" return_code zerrsm
    return_code = return_code + 16
    SIGNAL ERR_EXIT
    end
 
  x = outtrap("out.")
 
  queue "SET CONTROL(GSO)"
  queue "LIST LIKE(-)"
  queue "QUIT"
  Address TSO "ACF"
  Do X = 1 to out.0
    ab = out.x
    abl = length(ab)
    return_code = 0
    "LMPUT DATAID("temp9") MODE(INVAR) DATALOC(AB) DATALEN("abl")",
      "NOBSCAN"
    If return_code > 4 then do
      Say pgmname "LMPUT TEMP9 RC =" return_code zerrsm
      return_code = return_code + 16
      SIGNAL ERR_EXIT
      end
    end
 
  x = outtrap("out.")
 
  queue "SET CONTROL(GSO)"
  queue "SET SYSID(****)"
  queue "LIST LIKE(-)"
  queue "QUIT"
  Address TSO "ACF"
  Do X = 1 to out.0
    ab = out.x
    abl = length(ab)
    return_code = 0
    "LMPUT DATAID("temp9") MODE(INVAR) DATALOC(AB) DATALEN("abl")",
      "NOBSCAN"
    If return_code > 4 then do
      Say pgmname "LMPUT TEMP9 RC =" return_code zerrsm
      return_code = return_code + 16
      SIGNAL ERR_EXIT
      end
    end
 
  return_code = 0
  "LMCLOSE DATAID("temp9")"
  lmclose_temp9_rc = return_code
  If return_code > 4 then do
    Say pgmname "LMCLOSE_TEMP9_RC =" return_code zerrsm
    return_code = return_code + 16
    SIGNAL ERR_EXIT
    end
  end
 
 
BYPASS_SETROPTS:
return_code = 0
class = 9
"LMMFIND DATAID("dataid") MEMBER("asset")"
lmmfind_dialog_rc = return_code
If return_code <> 0 then do
  x = listdsi(dataddn "FILE")
  datadsn = sysdsname
  Say pgmname "The following members are missing from the",
    "Dialog data set" datadsn"."
  Say pgmname "  ASSET    - Member containing Asset Definition",
    "information."
  Say pgmname "    To correct the above enter the Dialog",
    "process and select the following options:"
  Say pgmname "      Option C - Review reports for Findings,",
    "User access & Dataset rules."
  Say pgmname "      Option F - Asset Definition Process"
  Say pgmname "        Enter the information requested on the",
    "screen.  Enter CREATE to create the"
  Say pgmname "        Asset File and save the information.  Or",
    "enter SAVE to save the information."
  Say
  end
 
 
GET_DIALOG:
do while return_code = 0
  return_code = 0
  "LMGET DATAID("dataid") MODE(INVAR) DATALOC(TRECORD) MAXLEN(80)",
    "DATALEN(LRECL)"
  If return_code = 8 then,
    leave
  If left(trecord,10) = "CLASS" then do
    class = substr(trecord,11,1)
    leave
    end
  end
 
 
BYPASS_DIALOG:
return_code = 0
"LMCLOSE DATAID("dataid")"
lmclose_dialog_rc = return_code
If return_code <> 0 then do
  Say pgmname "LMCLOSE_DIALOG_RC =" return_code zerrsm
  Say pgmname zerrlm
  end
 
return_code = 0
"LMFREE DATAID("dataid")"
lmfree_dialog_rc = return_code
 
return_code = 0
"VPUT (CLASS PDIDD PDIDSN) ASIS"
vput_pdidd_rc = return_code
If return_code > 4 then do
  Say pgmname "VPUT_PDIDD_RC =" return_code zerrsm
  return_code = return_code + 16
  SIGNAL ERR_EXIT
  end
 
"VIEW DATAID("temp9") MACRO("caam0006")"
view_temp9_rc = return_code
If return_code > 4 then do
  Say pgmname "VIEW_TEMP9_RC =" return_code zerrsm
  return_code = return_code + 16
  SIGNAL ERR_EXIT
  end
 
return_code = 0
"VGET (AM06VGE AM07VGE) ASIS"
vget_rc = return_code
 
return_code = 0
"LMFREE DATAID("temp9")"
lmfree_temp9_rc = return_code
 
return_code = 0
"LMFREE DATAID("pdidd")"
lmfree_pdidd_rc = return_code
 
 
END_EXIT:
return_code = 0
/*******************************************/
/* ERROR EXIT                              */
/*******************************************/
 
 
ERR_EXIT:
If maxcc >= 16 | return_code > 0 then do
  "VGET (ZISPFRC) SHARED"
  If maxcc > zispfrc then,
    zispfrc = maxcc
  Else,
    zispfrc = return_code
  "VPUT (ZISPFRC) SHARED"
  Say pgmname "ZISPFRC =" zispfrc
  end
 
If termmsgs = "ON" then do
  Say "==============================================================="
  Say pgmname "VPUT_RC                           "vput_rc
  Say pgmname "LMINIT_DIALOG_RC                  "lminit_dialog_rc
  Say pgmname "LMINIT_TEMP9_RC                   "lminit_temp9_rc
  Say pgmname "LMINIT_PDIDD_RC                   "lminit_pdidd_rc
  Say pgmname "LMOPEN_DIALOG_RC                  "lmopen_dialog_rc
  Say pgmname "LMOPEN_PDIDD_RC                   "lmopen_pdidd_rc
  Say pgmname "LMOPEN_TEMP9_RC                   "lmopen_temp9_rc
  Say pgmname "LMMFIND_DIALOG_RC                 "lmmfind_dialog_rc
  Say pgmname "LMCLOSE_DIALOG_RC                 "lmclose_dialog_rc
  Say pgmname "LMCLOSE_PDIDD_RC                  "lmclose_pdidd_rc
  Say pgmname "LMCLOSE_TEMP9_RC                  "lmclose_temp9_rc
  Say pgmname "LMFREE_DIALOG_RC                  "lmfree_dialog_rc
  Say pgmname "VPUT_PDIDD_RC                     "vput_pdidd_rc
  Say pgmname "VIEW_TEMP9_RC                     "view_temp9_rc
  Say pgmname "VGET_RC                           "vget_rc
  Say pgmname caam0006 "AM06VGE                  "am06vge
  Say pgmname caam0007 "AM07VGE                  "am07vge
  Say pgmname "LMFREE_TEMP9_RC                   "lmfree_temp9_rc
  Say pgmname "LMFREE_PDIDD_RC                   "lmfree_pdidd_rc
  Say "==============================================================="
  end
Exit 0
 
 
/*******************************************/
/*  SYSCALL SUBROUTINES                    */
/*******************************************/
NoValue:
Failure:
Syntax:
say pgmname 'REXX error' rc 'in line' sigl':' strip(ERRORTEXT(rc))
say SOURCELINE(sigl)
SIGNAL ERR_EXIT
 
 
Error:
return_code = RC
if RC >= 16 then do
  say pgmname "LASTCC =" RC strip(zerrlm)
  say pgmname 'REXX error' rc 'in line' sigl':' ERRORTEXT(rc)
  say SOURCELINE(sigl)
  end
if return_code > maxcc then
  maxcc = return_code
return
 
 
process_pdi:
Address ISPEXEC
parse arg pdi "#" findtxt "$" finding
os = "999999"
bl = " "
say PGMNAME 'Processing PDI' pdi'.'
if findtxt = "" then do
  ac = "Not a Finding"
  "LMPUT DATAID("pdidd") MODE(INVAR) DATALOC(ac)",
    "DATALEN("length(ac)") MEMBER("pdi")"
  end
else ,
  "LMPUT DATAID("pdidd") MODE(INVAR) DATALOC(findtxt)",
    "DATALEN("length(findtxt)") MEMBER("pdi")"
sp = "    "
do until finding = ""
  if finding = "" then leave
  parse value finding with s"{"text"}"finding
  if s <> os then do
    "LMPUT DATAID("pdidd") MODE(INVAR) DATALOC(bl)",
      "DATALEN("length(bl)") MEMBER("pdi")"
    if s <> '' then do
      ac = '    ' s
      "LMPUT DATAID("pdidd") MODE(INVAR) DATALOC(ac)",
        "DATALEN("length(ac)") MEMBER("pdi")"
      sp = '         '
      end
    os = s
    end
  if text <> "" then do
    ac = sp text
    "LMPUT DATAID("pdidd") MODE(INVAR) DATALOC(ac)",
      "DATALEN("length(ac)") MEMBER("pdi")"
    end
  end
 
 
replace:
"LMMADD DATAID("pdidd") MEMBER("pdi")"
if RC = 4 then do
  "LMMREP DATAID("pdidd") MEMBER("pdi")"
  if RC <> 0 then,
    say PGMNAME 'LMMREP_PDIDD =' RC PDI ZERRSM
  end
return
 
 
