//RANDOMPW JOB (TSO),
//             'Install LISTPDS',
//             CLASS=A,
//             MSGCLASS=A,
//             MSGLEVEL=(1,1),
//             USER=IBMUSER,PASSWORD=SYS1
//* Installs REXX RANDOMPW to RXLIB
//ADDRAND  EXEC PGM=IEBGENER
//SYSPRINT DD SYSOUT=*
//SYSIN DD DUMMY
//SYSUT2 DD DSN=SYS2.EXEC(ADDSUBS),DISP=SHR
//SYSUT1 DD DATA,DLM=@@
/* REXX script to update/add subsystems to MVS */

/* This will add subsystems to MVS 3.8J */
/* First it checks for the existence of SYS1.UMODCNTL(ZJW0007) */
/* If it doesn't exist it will add the file and submit it */
/* If it does it will edit the file and submit */

parse arg subsystem yes

yes = upper(yes)
subsystem = upper(subsystem)

say 'subsystem is: "'|| subsystem ||'"'
say 'yes is: "'|| yes || '"'

if subsystem = '' then DO
    say "*** MISSING ARGUMENT"
    say "Add a MVS Subsystem"
    say "Usage:"
    say "      RX ADDSUBS <subsystem name> [y]"
    say "Where:"
    say "      subsystem name is a 4 byte alphanumeric string"
    say "      'y' will skip the user check to proceed"
    exit
end

if  yes \= '' & yes \= "Y" then do
    say "*** Second argument can only be Y"
    say "Add a MVS Subsystem"
    say "Usage:"
    say "      RX ADDSUBS <subsystem name> [y]"
    exit
end

if yes \= '' & yes = "Y" then 
    yes = 1
else
    yes = 0

if datatype(subsystem,alphanumeric) \= 1 then do
    say "*** Error subsystem must be alphanumeric:" subsystem
    exit
end

if length(subsystem) > 4 then do
    say "*** Error subsystem must be 4 characters or less:" subsystem
    exit
end

call check_usermod /* If the usermod doesn't exist add it */

ADDRESS TSO "ALLOC FI(USERMOD) DA('SYS1.UMODCNTL(ZJW0007)') SHR REUSE"
call check_rc rc
ADDRESS TSO "EXECIO * DISKR USERMOD (STEM usermod. OPEN FINIS"
call check_rc rc
ADDRESS TSO "FREE FI(USERMOD)"
newusermod.0 = 0
c = 1
indesc = 0

say "*** Adding" subsystem "to SYS1.UMODCNTL(ZJW0007)"

do i = 1 to usermod.0
    if usermod.i = "//* Desc: Install USERMOD ZJW0007" then indesc = 1

    if indesc & usermod.i = "//*" then do
      indesc = 0
      newusermod.c = "//*       "|| subsystem "added by" userid() "on",
      date(standard) 
      c = c + 1
    end

    if INDEX(usermod.i,"SGIEF0SS   JES2,") > 0 then do
        endof = index(usermod.i,")")
        IF SUBSTR(usermod.i,(endof-1),1) = "(" THEN DO
            usermod.i = LEFT(usermod.i,(ENDOF-1))||subsystem||")" 
        end

        IF SUBSTR(usermod.i,(ENDOF-1),1) \= "(" THEN 
        usermod.i = LEFT(usermod.i,(ENDOF-1))||","||subsystem||")"
    end
    newusermod.c = usermod.i
    c = c + 1
end

newusermod.0 = c - 1

say "***" subsystem "added"

if yes = 0 then do
    do i = 1 to newusermod.0
        say newusermod.i
    end
    say "Accept changes [y/n]:"
    pull reply
    if reply \= "Y" then exit
end

ADDRESS TSO "ALLOC FI(USERMOD) DA('SYS1.UMODCNTL(ZJW0007)') SHR REUSE"
call check_rc rc
ADDRESS TSO "EXECIO * DISKW USERMOD (STEM newusermod. OPEN FINIS"
call check_rc rc
ADDRESS TSO "FREE FI(USERMOD)"

ADDRESS TSO "SUBMIT 'SYS1.UMODCNTL(ZJW0007)'" 

exit

check_usermod: procedure
/* Original usermod */
IF SYSDSN("'SYS1.UMODCNTL(ZJW0007)'") \= "OK" THEN DO
    say "*** SYS1.UMODCNTL(ZJW0007) does not exist, adding"
/* 
bash one liner to generate this:

c=1;cat ZJW0007.jcl | while read i; do echo "UMOD.$c = \"$i\""; 
c=$((c+1)); done; echo "UMOD.0 = $((c-1))"
*/

    UMOD.1 = "//ZJW0007 JOB  (SMP),"
    UMOD.2 = "//             'Usermod ZJW0007',"
    UMOD.3 = "//             CLASS=A,"
    UMOD.4 = "//             MSGCLASS=X,"
    UMOD.5 = "//             MSGLEVEL=(1,1),"
    UMOD.6 = "//             REGION=4096K"
    UMOD.7 = "//*"
    UMOD.8 = "//* Name: SYS1.UMODCNTL(ZJW0007)"
    UMOD.9 = "//*"
    UMOD.10 = "//* DO NOT EDIT THIS FILE IT IS AUTOGENERATED FROM "
    UMOD.11 = "//*       SYS2.EXEC(ADDSUBS)"
    UMOD.12 = "//*"
    UMOD.13 = "//* REFER TO THAT SCRIPT TO ADD A SUBSYSTEM"
    UMOD.14 = "//*"
    UMOD.15 = "//* Desc: Install USERMOD ZJW0007"
    UMOD.16 = "//*       Regenerate the subsystem name table"
    UMOD.17 = "//*"
    UMOD.18 = "//* Assemble"
    UMOD.19 = "//*"
    UMOD.20 = "//SMPASM  EXEC SMPASM,M=IEFJESNM"
    UMOD.21 = "//ASM.SYSIN DD *"
    UMOD.22 = "      PRINT ON,NODATA"
    UMOD.23 = "         SGIEF0SS   JES2,()"
    UMOD.24 = "         END"
    UMOD.25 = "/*"
    UMOD.26 = "//*"
    UMOD.27 = "//* Receive and apply"
    UMOD.28 = "//*"
    UMOD.29 = "//RECAPP  EXEC SMPAPP,COND=(0,NE)"
    UMOD.30 = "//SMPPTFIN DD  *"
    UMOD.31 = "++USERMOD(ZJW0007)."
    UMOD.32 = "++VER(Z038) FMID(EBB1102)."
    UMOD.33 = "++MOD(IEFJESNM) TXLIB(UMODOBJ)."
    UMOD.34 = "//SMPCNTL  DD  *"
    UMOD.35 = " REJECT SELECT(ZJW0007)."
    UMOD.36 = " RESETRC."
    UMOD.37 = " RECEIVE SELECT(ZJW0007)."
    UMOD.38 = " APPLY SELECT(ZJW0007)."
    UMOD.39 = "/*"
  UMOD.0 = 39

  ADDRESS TSO "ALLOC FI(USERMOD) DA('SYS1.UMODCNTL(ZJW0007)') SHR REUSE"
  call check_rc rc
  ADDRESS TSO "EXECIO * DISKW USERMOD (STEM UMOD. OPEN FINIS"
  call check_rc rc
  ADDRESS TSO "FREE FI(USERMOD)"

END
return

check_rc:
  parse arg rcode
  if rcode > 0 then do
    say '*** ADDSUBS01 Unable to open SYS1.UMODCNTL(ZJW0007)'
    exit
  end
return

@@