Tools – COPYMBR

July 22, 2015 1 comment

During my daily work I often need to copy members from one PDS to another. The Partitioned data sets are always the same ones, just different members. I could use the ISPF Move/Copy Utility screens but it quickly gets tiresome to have to keep entering the data set and member information into the screens.

Since I’ve got my REXX library allocated to SYSPROC so that I can run execs from it directly using the TSO execname command on the ISPF command line I put together the following exec called COPYMBR to automate the process:

/* rexx                                              */
/* exec to copy a member from one pds to another     */

parse arg frommbr tombr '/' repl
tombr = strip(tombr)
upper repl
if frommbr = '' then do
   say "Syntax is COPYMBR from_mbr [to_mbr] [/r]"
   say "Specify to_mbr name to rename the copied member"
   say "Specify /r to replace the member in the target PDS"
   return 0
end
if tombr='' then tombr=frommbr

if length(frommbr) > 8 then do
   say "Source member name greater than 8 chars"
   return 0
end
if length(tombr) > 8 then do
   say "Target member name greater than 8 chars"
   return 0
end

address ispexec
"CONTROL ERRORS RETURN"
indsn="'"userid()||".LOAD'"     /* Source PDS */
outdsn="'"userid()||".LOAD2'"   /* Target PDS */
"LMINIT DATAID(IN) DATASET("indsn") ENQ(SHR)"
"LMINIT DATAID(OUT) DATASET("outdsn") ENQ(SHR)"

opt=''
if repl = 'R' then opt = "REPLACE'
"LMCOPY FROMID("in") FROMMEM("frommbr") TODATAID("out") ",
       "TOMEM("tombr") "opt
lastcc=rc
ins=''
if lastcc = 0 then nop
else if lastcc=12 then do
   if frommbr <> tombr then ins = 'as '||tombr
   say frommbr' not copied'||ins
   say tombr' already exists on target library.'
   end
else if lastcc=8 then do
   say frommbr' not found in source library.'
   end
else do
   say 'rc from LMCOPY='lastcc
   end

"LMFREE DATAID("in")"
"LMFREE DATAID("out")"
return 0

You can edit the lines marked “Source PDS” and “Target PDS” to specify any compatible load libraries. I just used my LOAD and LOAD2 libraries as an example.

The general syntax of the COPYMBR command on the ISPF command line is then:

TSO COPYMBR member_name [new_name] [/r]

Where:

member_name is the name of the member to copy from the source PDS

new_name is optional and is the new name to assign to the member on the target PDS. If not specified it defaults to the same name as the source member.

/r tells the exec to replace the member (or new member name if renaming) on the target PDS.

Note that when the copy is successful, the exec does NOT output any messages so there’s no need to press the enter key to clear a message except when there is something wrong.

Examples:

TSO COPYMBR MYPROG1 /r

Copy MYPROG1 from the source PDS to the target PDS and replace any existing version.

TSO COPYMBR MYPROG1 MYPROG2

Copy MYPROG1 from the source PDS to the target PDS and rename it to MYPROG2. Do not do the copy if MYPROG2 already exists on the target PDS.

TSO COPYMBR MYPROG1 MYPROG2 /r

Copy MYPROG1 from the source PDS to the target PDS and rename it to MYPROG2. Replace any existing version of MYPROG2 on the target PDS.

Advertisements
Categories: Tools Tags:

Customizing SYSPROC at TSO Logon time

July 17, 2015 3 comments

One of the things I like to do is to allocate my own REXX library to SYSPROC at TSO logon time so that I can execute REXX commands simply by typing in “TSO command_name”  on the ISPF command line.

On the TSO logon screen I have a command setup to invoke a REXX exec that will do that for me:

TSO_Logon_Screen

BEFORE just says to allocate my REXX library before the existing allocations so that anything in my library overrides anything in the existing allocation with the same name (useful for testing changes to existing EXECs). Specify ‘AFTER’ or let it default to allocate your library AFTER the existing allocations.

This is the exec (called ALLOCREX in the above screen shot):

/* rexx                                                    */
/* logon exec to concat my rexx library to SYSPROC so that */
/* I can run my own rexx commands easily without having    */
/* to specify the dataset name. EG TSO MYEXEC              */
/*                                                         */

parse arg opt                 /* BEFORE or AFTER (default) */

lib=userid()||".REXX"         /* dsn of rexx lib to alloc  */
if x> 4 then do
   say "Unable to locate '"lib"'."
   say 'SYSPROC alloc not changed.'
   signal exit
   end

rc=ddns('SYSPROC')    /* get current SYSPROC allocation */

/* extract dsns and check for my rexx lib already alloc */
list=''
comma=''
do while queued() > 0
   parse pull dsn
   if dsn=lib then do
      say lib 'already concat to SYSPROC.'
      say 'SYSPROC alloc not changed.'
      signal exit
   end
   list=list||comma||"'"||strip(dsn)||"'"
   comma=','
end
oldlist=list

/* add my rex lib to the list and realloc the DD */
if opt = 'BEFORE' then do
   list="'"lib"',"||list
end
else do
   list=list||",'"lib"'"
end
"ALLOC F(SYSPROC) DATASET("list") SHR REUSE"
allocrc=rc
if allocrc <> 0 then do
   say 'Alloc of SYSPROC faiuled with rc='allocrc
   say 'Restoring original allocation'
   "ALLOC F(SYSPROC) DATASET("oldlist") SHR REUSE"
   end

/* queue an ISPF command so this exec can end */
exit:
queue 'ISPF'
return 0
/*---------------------------------------------------------*/
ddns: procedure
/*---------------------------------------------------------*/
/*  Find dsns allocated to a specified ddname              */
/*  Output returned on the stack                           */
/*---------------------------------------------------------*/
/*                                                         */
parse arg ddname
upper ddname
x=outtrap("out.","*","noconcat",1)
address TSO 'listalc status'
if out.0 = 0  then do
  return 0    /* Nothing found */
  end

foundDD="N"
do i=1 to out.0 by 2
   parse var out.i dsn .
   j=i+1
   ddn=strip(substr(out.j,3,8))
   if ddn <> "" & ddn = ddname then foundDD="Y"
   if ddn <> "" & ddn <> ddname then foundDD="N"
   if foundDD = "Y" then do
      push dsn
   end
end
return 0
Categories: Tools Tags:

Wow, it’s been a year already…

January 4, 2015 4 comments

I know I have not posted anything here for almost a year but I have not died! I’ve just been very busy learning new products and product architectures.

I have to say though that it has been are really fabulous year for me that I have thoroughly enjoyed. With a bit of luck (and time) I’ll get back to posting a few things from time to time here.

Categories: Uncategorized

A time for change…

January 17, 2014 2 comments

It’s been a lot a fun working at IBM and I’ve had the opportunity to work with some truly amazing people and software products over the years but there comes a time when you have to look beyond the ‘safe’ zone and to take that leap of faith. It’s been quite a while since I’ve taken this sort of leap but I have to announce that today, I have left IBM and will be starting a new adventure very soon.

I hope to continue to post to this blog but obviously the topics for the most part will change although they will continue to be mostly about mainframe topics. So I hope that you, my few readers, continue to find something of interest here that will lure you back from time to time.

Categories: General Stuff

Update to the Enhanced 3270 User Interface Security Requirements

December 17, 2013 Leave a comment

In this post I mentioned that the recent OB700 IF1 update had added additional security checking for KOBASE and 04SRV resources and that without suitable RACF (or other security product) profiles to give the user read access to these  resources, users would not be able to log on to the Enhanced 3270 UI.

PTF UA71750 is now available and removes the security checking on these resources. As a result, these additional security profiles are no longer required.

 

New to PARMGEN…?

December 3, 2013 Leave a comment

If you need to know more about the PARMGEN configuration tool for the ITM z/OS environment, here are a couple of videos about it.

 

What is PARMGEN

Convert an ICAT RTE to PRMGEN and Upgrade the Products

Securing the Enhanced 3270 User Interface with RACF and OB 700 IF1

October 16, 2013 2 comments

In this post I talked about securing the enhanced 3270 User Interface with RACF

Since then a new level of the base code (FMID HKOB700) called Interim Feature One (IF1) has arrived in the form of PTF UA69877. But before you go off and apply that, don’t! Instead apply UA70618 which fixes some issues with the original code that may impact certain users.

In the hold doc (you do read all the hold doc don’t you!) for UA70618 are instructions on setting up new RACF profiles that may be needed if you are using security to protect the Enhanced 3270 User Interface environment. These are the new resources being checked:

KOBUI.USER.COMMAND.<command_name>                               
KOBUI.ADMIN.PREFS.AUTOUPDATE                                    
KOBUI.ADMIN.LISTUSERS                                           
KOBUI.ADMIN.TRACE.UI.<trace_type>                               
KOBUI.ADMIN.TRACE.INTERNAL.<trace_type>                         
KOBUI.ADMIN.USEHUB.<hub_name>                                   
KOBUI.ADMIN.MEMBER.WRITE.<dd_name>.<member_name>                
KOBUI.ADMIN.ITM.<hub_name>.SERVICEINDEX                         
KOBUI.ADMIN.ITM.<hub_name>.<servicepoint_name>.SERVICECONSOLE   
KOBUI.ADMIN.ITM.<hub_name>.<servicepoint_name>.SOAPCONSOLE      
SYSTEM.<managed_system_name>.<table_name>

You could protect these with the following RACF profiles:

PERMIT KOBUI.USER.** 
PERMIT KOBUI.ADMIN.**
PERMIT SYSTEM.**

Recently I came across a problem where a customer needed additional RACF profiles setting up  in order to log on to the Enhanced 3270 UI. These are:

KOBASE.**
O4SRV.**

The easiest way to add these would be with a UACC or READ but your installation standards may require a different implementation. I believe a tech note will be forthcoming on the issue soon.

This particular user had a default profile of * in the RACF class with a UACC of NONE so anything that was not specifically permitted was rejected. If you do not have such a profile in the RACF class used by the Enhanced 3270 UI then the default action is to allow the request if a profile does not exist which basically allows anyone to do anything unless you specifically lock it down. That approach results in the least amount of work to secure the Enhanced 3270 UI environment.

Categories: E3270UI, ITM, Mainframe Tags: ,