Mainframe Utility: IDFIX

Return to Mainframe Utilities Page

Module


/* REXX ***************************************************************/
/* UTILITY: IDFIX                                                     */
/* AUTHOR: DAVID LEIGH                                                */
/* FUNCTION: THIS UTILITY SCANS REGULAR PDS'S OR ISPF PROFILE PDS'S   */
/*           TO REPLACE OCCURANCES OF ONE'S OLD USER ID WITH ONE'S    */
/*           NEW USERID.                                              */
/*                                                                    */
/**********************************************************************/
ADDRESS ISPEXEC "CONTROL ERRORS RETURN"
/**********************************************************************/
/* GET THE ID EITHER PASSED IN OR PROMPT FOR IT                       */
/**********************************************************************/
PARSE UPPER ARG DSN OLDID

DO WHILE DSN = ''
    SAY 'PLEASE ENTER THE LIBRARY NAME TO SCAN OR "X" TO QUIT ==>'
    PULL DSN
    IF DSN = 'X' THEN EXIT
END

/**********************************************************************/
/* DETERMINE WHAT THE OLD ID WAS THAT YOU'RE CHANGING FROM            */
/**********************************************************************/

OLDID = SUBSTR(SYSVAR(SYSUID),1,2) ¦¦,
        SUBSTR(SYSVAR(SYSUID),4,3)

/**********************************************************************/
/* HAVE THE USER CONFIRM THIS AND GIVE THE OPPORTUNITY TO QUIT        */
/**********************************************************************/
ADDRESS ISPEXEC
"ADDPOP ROW(7) COLUMN(15)"

DO FOREVER
    "DISPLAY PANEL(IDFIX)"
    SELECT
        WHEN RC = 0 & OLDID > '' THEN DO
            "VPUT OLDID SHARED"
            LEAVE
        END
        WHEN RC = 8 THEN DO
            "REMPOP"
            EXIT
        END
        OTHERWISE NOP
    END
END

/**********************************************************************/
/* PREP THE DATASET NAME AND DETERMINE IF THIS IS THE ISPF PROFILE    */
/**********************************************************************/
QTE = "'"

IF POS(QTE,DSN) = 0 THEN DSN = QTE ¦¦ DSN ¦¦ QTE

IF DSN = "'" ¦¦ SYSVAR(SYSUID) ¦¦ ".ISPF.ISPPROF'" THEN
    PROFLIB = YES
ELSE
    PROFLIB = NO

/**********************************************************************/
/* SET UP THE PROCESSING MESSAGES TO GO TO A TEMPORARY FILE           */
/**********************************************************************/
ADDRESS TSO
DUMMY = OUTTRAP(NULL)
"FREE     DD(TEMPOUT)"
TEMPFILE = SYSVAR(SYSUID)".TEMP.IDFIX.D"SUBSTR(DATE('S'),3,6) ¦¦,
                                    ".T"SUBSTR(TIME('N'),1,2) ¦¦,
                                        SUBSTR(TIME('N'),4,2) ¦¦,
                                        SUBSTR(TIME('N'),7,2)
"DELETE '"TEMPFILE"'"
"ALLOCATE DD(TEMPOUT) DSN('"TEMPFILE"')" ,
                     "NEW CATALOG" ,
                     "UNIT(SYSDA) VOLUME(WRK$$$)" ,
                     "SPACE(1,1) CYLINDERS RELEASE" ,
                     "RECFM(F B) LRECL(255) BLKSIZE(23460) DSORG(PS)"
DROP NULL.

"NEWSTACK"
QUEUE "IDFIX RESULTS FOR DATASET: "DSN

"EXECIO 1 DISKW TEMPOUT"
"DELSTACK"

/**********************************************************************/
/* POINT TO THE DATASET TO BE PROCESSED AND DO A PRIMING MEMBER READ  */
/**********************************************************************/
ADDRESS ISPEXEC
"ADDPOP"
"LMINIT DATASET("DSN") DATAID(DID) ENQ(SHRW)"
IF PROFLIB = 'YES' THEN
    DO
        "LIBDEF ISPTLIB"
        "LIBDEF ISPTLIB LIBRARY ID(ISPPROF)"
        "VGET ZAPPLID"
    END

"LMOPEN DATAID("DID")"
"LMMLIST DATAID("DID") MEMBER(MBR) OPTION(LIST)"

/**********************************************************************/
/* LOOP THROUGH THE MEMBERS AND EDIT THEM TO FIX THEM.                */
/**********************************************************************/
DO WHILE RC = 0
    MBR = STRIP(MBR)
    IF PROFLIB = 'YES' THEN
        IF POS('PROF',MBR) = LENGTH(MBR) - 3 THEN
            DO
                APPL = SUBSTR(MBR,1,POS('PROF',MBR)-1)
                IF APPL ¬= 'ISPS' THEN
                    DO
                        IF APPL = ZAPPLID THEN
                            DO
                                APPL = ''
                                SAMEAPPL = 'YES'
                            END
                        ELSE
                            DO
                                APPL = "NEWAPPL("APPL")"
                                SAMEAPPL = 'NO'
                            END
                        "CONTROL DISPLAY LOCK"
                        "DISPLAY PANEL(IDFIX2)"
                        "SELECT CMD(%IDFIXPRF",
                                OLDID MBR SAMEAPPL ")" APPL
                    END
            END
        ELSE NOP
    ELSE
        DO
            "CONTROL DISPLAY LOCK"
            "DISPLAY PANEL(IDFIX2)"
            "EDIT DATAID("DID") MEMBER("MBR") MACRO(IDFIXLIB)"
            IF RC = 20 THEN DO
                XMBR = SUBSTR(MBR"        ",1,8) "-"
                QUEUE XMBR "RC = 20, MESSAGE:" ZERRLM
                ADDRESS TSO "EXECIO 1 DISKW TEMPOUT"
            END
        END
    "LMMLIST DATAID("DID") MEMBER(MBR) OPTION(LIST)"
END

/**********************************************************************/
/* CLEAN UP AND LET THE USER KNOW WHERE THE OUTPUT IS.                */
/**********************************************************************/
"LMMLIST DATAID("DID") MEMBER(MBR) OPTION(FREE)"
"LMCLOSE DATAID("DID")"
"LMFREE DATAID("DID")"
"REMPOP"
"REMPOP"

ADDRESS TSO
"EXECIO 0 DISKW TEMPOUT (FINIS"
"FREE DD(TEMPOUT)"

ADDRESS ISPEXEC "EDIT DATASET('"TEMPFILE"')"
            


Documentation


 IDFIX was created at a time when UNIPAC switched from 5 character logon ids to
 6 character logon ids.  It would be equally applicable, however, when anyone
 switched from one logon id to another.

 The problem that arises is as follows.  You build up, over time, a great deal
 of id-specific "settings" throughout ISPF.  These settings are stored in ISPF
 profile variables.  If your id should change for some reason but you want to
 maintain the effort expended in creating these settings over time...well...you
 have a problem.  Additionally, you build up a great deal of jobcards as well.
 Some of these jobcards are in ISPF profiles variables and some are in "plain
 ol'" JCL libraries.  If your id changes to one of the same length, you're ok to
 do a SCAN/REPLACE utility but if it gets LONGER, you could create invalid job
 cards.  IDFIX will take this into account and truncate the jobname to 8
 characters...in both standard JCL libararies and ISPF profile members.

 Each of these settings now has your "old" id in it and won't function the way
 you'd like.  This is where IDFIX comes in.

 IDFIX processes your ISPF profile library via ISPF services or standard JCL
 libraries via edit macros and changes instances of your old id to your new id.
 In the case of non-ISPF profile libraries, it only changes job cards.

 Type the following at an ISPF command/option line:

 COMMAND ===> tso idfix

 You'll be prompted to enter the name of your ISPF profile library or other PDS
 name that contains ISPF profile members.  Then you'll be prompted (with a
 confirmation prompt) for your "old" and "new" id values.  Then it will go to
 work.  When IDFIX completes, you'll be taken into an edit session on a "log"
 file of all IDFIX accomplished.
            


Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.