/* rexx */
/* ------------------------------------------------------- */
/* Transfer CFT - RXALT1                                   */
/* Version : 1.0   - Date : Oct 2016                       */
/* [NAME_PRODUCT] [PRODUCT_VERSION] */
/* [PRODUCT_COPYRIGHT] */
/* ------------------------------------------------------- */
/* Parameter: function SJ (submit JCL)                     */
/* ------------------------------------------------------- */
/* INPUT:  //PARM DD *                                     */
/* OUTPUT: //JOBLOG DD SYSOUT=*                            */
/*         //OUTVAR DD DSN=&TMP1 (variable CFTUTIL %JOBS%  */
/* ------------------------------------------------------- */
/* //PARM      DD  *,DLM=OK                                */
/*    set   CFTJCL    '&PARM'    JCL name                  */
/* *                                                       */
/*    rep& 'IDTU'       '&IDTU'                            */
/*    rep& 'FNAME'      '&FNAME'                           */
/*    rep& 'RUNTIMEDIR' '&RUNTIMEDIR'                      */
/*    rep& 'PART'       '&PART'                            */
/*    rep& 'XIDT'       '&7.2IDT'                          */
/* OK                                                      */
/* ------------------------------------------------------- */
/* RC = 0 ok                                               */
/* RC = 8 Error                                            */
/* ------------------------------------------------------- */
   'PROFILE NOPREFIX'
BEGIN:

 parse arg fct .

 upper fct
 fct         = strip(fct)

 rc_ko       = 8
 rc_ww       = 4
 rc_ok       = 0
 rc_notsub   = 1
 rrc         = 0
 xtrace      = 'Y'
 ddparm      = 'PARM'
 ddCFTJCLREF = 'CFTJCL'
 CFTJCL      = 'CFTJCL'
 nlog        = 0
 /* Default value */
 jobid       = '?'
 job_log     = 'Y'
 /* ------------- */
 ddlog       = 'JOBLOG'
 ddoutvar    = 'OUTVAR'
 log.0       = 0
 outv.0      = 0
 submitted_job_inf  = ''
 submitted_job_name = ''
 submitted_job_num  = ''
 vjes     = word(sysvar(SYSJES),1)
 vsysnode = word(sysvar(SYSNODE),1)
 vsysplex = word(mvsvar(SYSPLEX),1)
 vsysclone= word(mvsvar(SYSCLONE),1)
 vsysname = word(mvsvar(SYSNAME),1)

 Parse Source . . procname proctype procmode .
 JOBNAME   = 'JOBNAME'

 a=PMSG("I00","Started" DATE() ,
        'jobname='MVSVAR('SYMDEF',JOBNAME)',user='userid())

 say " "

 a = syscalls('ON')
 if a > 3 then
    a=PMSG("E03","Unable to establish the SYSCALL environment, rc="a)

 a=load_parm()

 say " "
 a=PMSG("I01","Function:" fct)
 say " "
 a=PMSG("I08","sysvar(SYSJES):  " vjes)
 a=PMSG("I08","sysvar(SYSNODE): " vsysnode)
 a=PMSG("I08","mvsvar(SYSPLEX): " vsysplex)
 a=PMSG("I08","mvsvar(SYSCLONE):" vsysclone)
 a=PMSG("I08","mvsvar(SYSNAME): " vsysname)
 say " "

 CFTJCL = strip(CFTJCL)

 if (CFTJCL = '' | CFTJCL = '_NONE_') then
    do
      a=PMSG("I09","No JCL to submit.").
      rrc = rc_notsub
      signal FINISH2
    end

 if JOB_LOG <> 'N' then
    a=get_hostname()

 if fct = 'SJ' then
    a = loadjcl(CFTJCL)

 if fct = 'SJ' then
    a = submit_job(CFTJCL,ljobid)

 if JOB_LOG <> 'N' then
    a = info_log(fct,ljobid)

 /* Jobname/jobnum submitted (variable CFTUTIL) */
 outv.0 = 1
 outv.1 = " char name=JOBS,size=20,init='",
          ||submitted_job_name "("submitted_job_num")'"
 "EXECIO" outv.0 "DISKW" ddoutvar "(stem outv. FINIS"
 IF RC \= 0 THEN DO
    rcode = RC
    say "write" ddoutvar "file fails, code" rcode
 End

FINISH:

  if JOB_LOG <> "N" then
     a=gen_log()

FINISH2:
  a=PMSG("I07","Ended,Return code:" rrc);

  exit(rrc)

/* ------------------------------------- */
/* Sub routines                          */
/* ------------------------------------- */
/* --------------------------- */
/* load PARM  parameters       */
/* --------------------------- */
load_parm:
parm.0   = 0
p_kw.0   = 0
p_va.0   = 0
iset     = 0
ireplace = 0
rc       = 0

"EXECIO * DISKR "ddparm" (STEM parm. FINIS)"

if rc > 0 then
   a=PMSG("E01","Open/Read error on ddname="ddparm ",rc="rc)

if parm.0 = 0 then return 1

do i=1 to parm.0
   parm.i = strip(parm.i)
   if substr(parm.i,1,1) = '*' then iterate i
   ins = strip(word(parm.i,1))
   kw  = strip(word(parm.i,2))
   va  = strip(subword(parm.i,3))
   upper ins

   if ins = 'SET' | ins = 'SET_' then
      do
        upper kw va
        if kw = 'TRACE' then kw = 'XTRACE'
        iset = iset + 1
        p_kw.iset = kw
        p_va.iset = va
        p_kw.0    = iset
        p_va.0    = iset
        kw = normalize_string(p_kw.iset)
        if ins = 'SET' then
           do
             interpret kw '=' va
             a=PMSG('I04','Set  ' kw '=' va )
           end
        if ins = 'SET_' then
           do
             interpret kw '=va'
             a=PMSG('I05','Set_ ' kw '=' va )
           end
      end
   if (ins = 'REPLACE' | ins = 'REP') then
      do
        ireplace = ireplace + 1
        r_old.0      = ireplace
        r_new.0      = ireplace
        old          = ''
        interpret 'old=' kw
        r_old.ireplace = old
        r_new.ireplace = va
        a=PMSG('I06','Replace ' old 'by' va )
      end
   if (ins = 'REP&') then  /* prefix by '&' */
      do
        ireplace = ireplace + 1
        r_old.0      = ireplace
        r_new.0      = ireplace
        old          = ''
        interpret 'old=' kw
        r_old.ireplace = '&'old
        r_new.ireplace = va
        a=PMSG('I06','Replace &'old 'by' va )
      end
end
return 0
/* ------------------------------------- */
/*                                       */
/* ------------------------------------- */
normalize_string:
RS = arg(1)
upper RS
RS = TRANSLATE(RS,'_','.')
RS = TRANSLATE(RS,'_','-')
return RS
/* --------------------------- */
/* Read JCL to be submitted    */
/* --------------------------- */
loadjcl:
wname          = arg(1)
flag_alloc_file=0

if wname = ddCFTJCLREF then
   dd_jcl = wname
else
  do
   if SYSDSN("'"wname"'") <> 'OK' then
      do
        a = PMSG("E12","File not found:"wname)
      end
   a      = falloc(wname,"CFTJCLA")
   dd_jcl = "CFTJCLA"
   flag_alloc_file=1
  end
j.0    = 0
rc     = 0
"EXECIO * DISKR "dd_jcl" (STEM j. FINIS)"
if rc > 0 then
   a = PMSG("E06","Open/Read error on "dd_jcl "rc="rc)
if j.0 =  0 then
   a = PMSG("E08","file dd:"dd_jcl "is empty")

if flag_alloc_file = 1 then
   "FREE FI(CFTJCLA)"

if xtrace = 'Y' then
   say '>> first jcl line:' strip(j.1)

pv = pos("JOB",j.1)
if pv = 0 then
   a = PMSG("E07","First line is not a JOB card" j.1)
wjob1 = substr(j.1,3)
jname = word(wjob1,1)

drop wjob1 flag_alloc_file

return 0
/* ------------------------------------- */
/* submit a job                          */
/* ------------                          */
/*  stem j. ==> JCL (created by readjcl) */
/* ------------------------------------- */
submit_job:
wname= arg(1)
wjob = arg(2)

wjob1 = substr(j.1,3)
wjob2 = word(wjob1,1)

/* Replace strings in JCL */
if r_old.0 > 0 then
   do
     do ir=1 to r_new.0
        new_val=''
        interpret 'new_val=' r_new.ir
        r_new.ir = new_val
     end
     do ij=1 to j.0
        do ir=1 to r_old.0
           j.ij = change(j.ij, r_old.ir, r_new.ir)
           j.ij = substr(j.ij,1,80,' ')
        end
     end
   end
NEWSTACK
do q=1 to j.0
   QUEUE j.q
end
QUEUE "ZZ"
QUEUE ""
x = OUTTRAP("o.")
"SUBMIT * END(ZZ)"
/* o.1 = IKJ56274A ENTER INPUT JOB STREAM:         */
/* o.2 = IKJ56250I JOB xxxxxxx(JOByyyyy) SUBMITTED */
x   = OUTTRAP("OFF")
o.2 = strip(o.2)
submitted_job_inf = o.2
a=PMSG("I03",o.2)
parse var o.2 fil.1 fil.2 fil.3 '(' fil.4 ')' .
submitted_job_name = fil.3
submitted_job_num  = fil.4
drop fil. j. o. wjob1 wjob2 x
DELSTACK
return 0
/* ------------------------------------- */
/* Get hostname                          */
/* ------------------------------------- */
get_hostname:

   src = socket('INITIALIZE', "MYSET01")
   HOSTID      = "?"
   HOSTNAME    = "?"
   HOSTBYADDR  = "?"

   if perror(src,"INITIALIZE") = 0 then
   do
      src = socket("GETHOSTID")
      HOSTID = word(src , 2)
      src = socket("GETHOSTNAME")
      HOSTNAME = word(src , 2)
      src = socket("GETHOSTBYADDR",HOSTID)
      HOSTBYADDR=word(src , 2)
      src = socket('TERMINATE', "MYSET01")
   end
   else
      a=PMSG("E04","Unable to initialize REXX SOCKET API rc="src)
return 0
/* ---------------------------------------------- */
/* Interpret REXX API SOCKET return code          */
/* ---------------------------------------------- */
perror:
if word(arg(1),1) = 0 then return 0
Say arg(2) "Error : "arg(1);
return -1
/* ---------------------------------------------- */
/* change                                         */
/* ---------------------------------------------- */
change:
val = arg(1)
old = arg(2)
new = arg(3)

l = length(old)
if l > 0 then Do
  pv = pos(old,val)
  if pv > 0 then Do
     if pv=1 then val=new||substr(val,l+1)
     else
       do
         xx=substr(val,1,pv-1)
         val=delstr(val,1,pv+l-1)
         val=xx||new||val
       end
  end
  drop pv
end
drop l old new xx pv
return val
/* ---------------------------------------------- */
/* Process error message                          */
/* ---------------------------------------------- */
PMSG:
coderr  = arg(1)
msgerr  = arg(2)

say "> ("procname"-"coderr"-"time()")" msgerr
wr = substr(coderr,1,1)
select
  when wr = "E" then do
       rrc = rc_ko
       signal finish
   end
  when wr = "K" then rrc = rc_ko
  when wr = "I" then nop
  when wr = "W" then rrc = rc_ww
  otherwise
       say "> ("procname"-"coderr"-"time()") Invalid coderr="coderr
end
drop coderr msgerr wr
return 0
/* ---------------------------------- */
/* alloc file                         */
/* ---------------------------------- */
falloc:
wfile = arg(1)
wdd   = arg(2)
 "ALLOC FI("wdd") SHR DA('"wfile"'"
 if RC >0 then
    a=PMSG("E16","Error on alloc DA("wfile"),ddn("wdd"),rc="RC)
 a=PMSG("I17","Alloc Dataset("wfile"),ddname("wdd")rc="RC)
drop wdd wfile
return RC
/* ---------------------------------- */
/* I/O on log                         */
/* ---------------------------------- */
GEN_log:
if (nlog > 0) Then DO
   "EXECIO" nlog "DISKW" ddlog "(stem llog. FINIS"
   IF RC \= 0 THEN DO
      rcode = RC
      say "write" ddlog "file fails, code" rcode
   End
End
ADD_LOG:
nlog      = nlog + 1
llog.0    = nlog
llog.nlog = arg(1)
return 0

INFO_LOG:
a=add_log(copies("-",80))
inf = "Submit" CFTJCL "_" DATE() "at" time()
a=add_log(inf)
inf = ". Plex="mvsvar(SYSPLEX)",Sysname="mvsvar(SYSNAME),
      ",Version="mvsvar(SYSOPSYS)
a=add_log(inf)
inf=  ". Hostname="HOSTNAME",Hostid="HOSTID
a=add_log(inf)
inf="." submitted_job_inf "by Userid="userid()
a=add_log(inf)
drop wwjobid inf
return 0
