/* REXX */
/* CLS2REXXed by UMLA01S on 5 Aug 2019 at 18:59:25  */
/*trace r?*/
Signal On NoValue
Call On Error
Signal On Failure
Signal On Syntax
Parse source opsys . exec_name .
 
/*********************************************************************/
/* 04/15/2004 JL Nelson Set up to test finding messages              */
/* 06/18/2004 JL Nelson Added EXIT code                              */
/* 06/22/2004 JL Nelson Added code to check security system          */
/* 02/23/2005 JL Nelson Changed constants to variables before        */
/*            rename.                                                */
/* 04/18/2005 JL Nelson Added TEST(MOD) to use input test file       */
/* 06/09/2005 JL Nelson Pass MAXCC in ZISPFRC variable               */
/* 06/15/2005 JL Nelson Reset return code to end job step            */
/* 07/09/2007 CL Fenton Changes made to include ASSET mbr of Dialog  */
/*            data set.  Obtaining CLASS for ASSET mbr.              */
/* 10/22/2015 CL Fenton Changed VMS asset to Asset Definition.       */
/* 08/05/2019 CL Fenton Converted script from CLIST to REXX.         */
/* 04/07/2021 CL Fenton ACP00000 automation for RACF-OS-000040 to    */
/*            determine which ACP is on the system, STS-026207.      */
/*                                                                   */
/*                                                                   */
/*                                                                   */
/*********************************************************************/
CONSLIST = "OFF"                  /* DEFAULT IS OFF                  */
COMLIST  = "OFF"                  /* DEFAULT IS OFF                  */
SYMLIST  = "OFF"                  /* DEFAULT IS OFF                  */
TERMMSGS = "OFF"                  /* DEFAULT IS OFF                  */
TYPERUN  = "FSO"                  /* Run for SRRAUDIT | FSO          */
CACC1000 = "CACC1000"             /* SELECT SECURITY CHECK PGM       */
CARM0409 = "CARM0009"             /* SELECT EDIT macro TEMP9         */
CARM040A = "CARM000A"             /* SELECT EDIT macro PDI           */
DATADDN  = "DIALOG"               /* Dialog DD name for review       */
ASSET    = "ASSET"                /* Dialog Asset Definition member  */
TEST     = "OFF"                  /* Finding Msgs (OFF|MOD|FINDING)  */
TRACE    = "OFF"                  /* TRACE ACTIONS AND ERRORS        */
esm      = "RACF"                 /* external security manager       */
pgmname = "CARC0005 04/07/21"
 
sysprompt = "OFF"                 /* CONTROL NOPROMPT                */
sysflush = "OFF"                  /* CONTROL NOFLUSH                 */
sysasis = "ON"                    /* CONTROL ASIS - caps off         */
Numeric digits 10                 /* default of 9 not enough         */
maxcc = 0
lminit_dialog_rc  = 0
lminit_temp9_rc   = 0
lminit_pdidd_rc   = 0
lmopen_pdidd_rc   = 0
lmclose_pdidd_rc  = 0
lmopen_dialog_rc  = 0
lmopen_temp9_rc   = 0
lmmfind_dialog_rc = 0
lmclose_dialog_rc = 0
lmclose_temp9_rc  = 0
rc05vput          = 0
view_temp9_rc     = 0
rm09vget          = 0
rm009rc           = 0
rm0avget          = 0
rm00arc           = 0
lmfree_dialog_rc  = 0
lmfree_temp9_rc   = 0
lmcomp_pdidd_rc   = 0
lmfree_pdidd_rc   = 0
return_code = 0
 
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"
zispfrc = 0
"VPUT (ZISPFRC) SHARED"
 
return_code = 0
"VPUT (SYMLIST CONSLIST COMLIST TERMMSGS CARM040A TYPERUN TEST)",
   "ASIS"
rc05vput = return_code
If return_code <> 0 then do
  Say pgmname "VPUT_RC =" return_code zerrsm
  return_code = return_code + 16
  SIGNAL ERR_EXIT
  end
 
/* Determine which security system is running */
return_code = 0
"SELECT CMD("cacc1000 "ACP)"
"VGET (ACPNAME ACPVERS) ASIS"
If acpname <> "RACF" then do
  Say pgmname "RACF Job running on the wrong system"
  Say pgmname acpname acpvers
/*return_code = 20
  SIGNAL ERR_EXIT*/
  end
old_resource = "               "
uidstr = "UID("
spc = "               "
/*******************************************/
/* 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
 
return_code = 0
"LMINIT DATAID(TEMP9) DDNAME(TEMP9)"
lminit_temp9_rc = return_code
If return_code <> 0 then do
  Say pgmname "LMINIT_TEMP9_RC =" return_code zerrsm
  Say pgmname zerrlm
  return_code = return_code + 16
  SIGNAL ERR_EXIT
  end
 
return_code = 0
"LMINIT DATAID(PDIDD) DDNAME(PDIDD)"
lminit_pdidd_rc = return_code
If return_code <> 0 then do
  Say pgmname "LMINIT_PDIDD_RC =" return_code zerrsm
  Say pgmname zerrlm
  return_code = return_code + 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)"
  lmopen_temp9_rc = return_code
  If return_code <> 0 then do
    Say pgmname "LMOPEN_TEMP9_RC =" return_code zerrsm
    Say pgmname zerrlm
    return_code = return_code + 16
    SIGNAL ERR_EXIT
    end
 
  x = outtrap("line.")
  cmd = "SETROPTS LIST"
  Address TSO cmd
  Do X = 1 to line.0
    ab = line.x
    return_code = 0
    "LMPUT DATAID("temp9") MODE(INVAR) DATALOC(AB)",
      "DATALEN("length(ab)") NOBSCAN"
    If return_code <> 0 then do
      Say pgmname "LMPUT_TEMP9_RC =" return_code zerrsm
      Say pgmname zerrlm
      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
    Say pgmname zerrlm
    return_code = return_code + 16
    SIGNAL ERR_EXIT
    end
  end
 
 
BYPASS_SETROPTS:
class = 9
return_code = 0
"LMMFIND DATAID("dataid") MEMBER("asset")"
lmmfind_dialog_rc = return_code
If return_code > 0 then do
  tst = 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
Else do until return_code = 8
  return_code = 0
  "LMGET DATAID("dataid") MODE(INVAR) DATALOC(TRECORD)",
    "MAXLEN(80) DATALEN(LRECL)"
  If return_code = 8 then leave
  If pos("CLASS ",trecord) = 1 then,
    class = substr(trecord,11,1)
  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) ASIS"
vput_pdidd_rc = return_code
If return_code > 4 then do
  Say pgmname "VPUT_PDIDD_RC =" return_code zerrsm
  Say pgmname zerrlm
  return_code = return_code + 16
  SIGNAL ERR_EXIT
  end
 
return_code = 0
"VIEW DATAID("temp9") MACRO("carm0409")"
view_temp9_rc = return_code
"VGET (RM009RC) ASIS"
If view_temp9_rc > 4 then do
  Say pgmname "VIEW_TEMP9_RC =" rm009rc zerrsm
  Say pgmname zerrlm
  end
 
return_code = 0
"LMFREE DATAID("temp9")"
lmfree_temp9_rc = return_code
 
return_code = 0
"LMCOMP DATAID("pdidd")"
lmcomp_pdidd_rc = return_code
 
return_code = 0
"LMFREE DATAID("pdidd")"
lmfree_pdidd_rc = return_code
 
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
"VGET (RM09VGET RM009RC RM0AVGET RM00ARC) ASIS"
If termmsgs = "ON" then do
  Say "==============================================================="
  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 "VPUT                  "rc05vput
  Say pgmname "VIEW_TEMP9_RC         "view_temp9_rc
  Say pgmname carm0409 "VGET         "rm09vget
  Say pgmname carm0409 "RM009RC      "rm009rc
  Say pgmname carm040a "VGET         "rm0avget
  Say pgmname carm040a "RM00ARC      "rm00arc
  Say pgmname "LMFREE_DIALOG_RC      "lmfree_dialog_rc
  Say pgmname "LMFREE_TEMP9_RC       "lmfree_temp9_rc
  Say pgmname "LMCOMP_PDIDD_RC       "lmcomp_pdidd_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 > 4 & RC <> 8 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
 
 
