Como desinstalar productos bajo SMP/E una vez borrados manualmente

La receta de hoy explicará cómo deshacerse de funciones o programas registrados en SMP/E, que, quizás se han borrado manualmente, pero su rastro sigue permaneciendo bajo SMP/E.

Esto me paso cuando borre a lo bruto un producto, y cuando lo quise reinstalar, el sistema no me dejaba porque según SMP/E figuraba como ya instalado. Eso me hizo pernsar en morralla que podría irse acumulando si se borran manualmente cosas que dependen de SMP/E.

Como funciona SMP/E?

System Modification Programs / Extensions (SMP/E) es un conjunto de utilidades que mantienen una base de datos de productos instalados dentro del z/OS. Esto incluye updates, fixes, parches en definitiva, y el sistema permite llevar un control de lo que está instalado y lo que no, de forma que puedes actualizar o revertir el proceso.
SMP/E dispone de 3 zonas: La GLOBAL, donde se gestiona el repositorio completo de software. La TARGET, donde se mantiene una base de datos de productos instalados o a instalar y la DLIB, donde se lleva un control sobre el software “aceptado” una vez instalado.

Dicho esto, para instalar un producto, se siguen 3 pasos:

RECEIVE: Hacer un receive equivale a subir el paquete del programa a la zona GLOBAL.
APPLY: Hacer un apply implica realizar la instalación del programa previamente subido con el RECEIVE.
ACCEPT: Si se ha instalado bien, hacer un accept implica confirmar que el programa forma parte de nuestra instalación y pasa a ser uno mas en el z/OS.

Problemática

Pero volvamos a la problemática inicial: Hemos borrado manualmente unas librerías que conformaban nuestro producto, pero para SMP/E siguen instaladas, por tanto, nos las impide reinstalar. Para poder borrar el rastro de la vieja instalación, voy a recurrir a una pequeña trampa: Voy a instalar un producto ficticio en forma de SYSMOD, y haré que dicho producto tenga una precondición para que me borre el producto que quiero desinstalar. Y luego le diré que lo desinstale, haciendo que a la vez que el producto ficticio, se borre toda evidencia del producto que quiero desinstalar.

JCL de Borrado:

//RECEIVE  EXEC PGM=GIMSMP,REGION=0M,
//             PARM='CSI=SMPE.GLOBAL.CSI'
//*
//*  BE SURE TO ADD ANY DD'S FOR USERMODS THAT YOU NEED
//*  TO APPLY.
//*
//SMPPTFIN DD  DISP=SHR,DSN=SISTEMAS.JCL(SMPMCS)
//*
//*  BE SURE TO ADD ANY APPLY STATEMENTS FOR USERMODS THAT YOU NEED
//*  TO APPLY.
//*
//SMPCNTL  DD *
 SET BOUNDARY(GLOBAL).
 RECEIVE SYSMODS .
//APPLYCK  EXEC PGM=GIMSMP,REGION=0M,
//             PARM='CSI=SMPE.GLOBAL.CSI'
//SMPWRK3  DD UNIT=3390,SPACE=(3200,(1400,350,300))
//SMPCNTL  DD *
 SET BOUNDARY(TARGET) .
 APPLY S(DELFUNC) CHECK .
//APPLY    EXEC PGM=GIMSMP,REGION=0M,COND=(4,LT,APPLYCK),
//             PARM='CSI=SMPE.GLOBAL.CSI'
//SMPWRK3  DD UNIT=3390,SPACE=(3200,(1400,350,300))
//SMPCNTL  DD *
 SET BOUNDARY(TARGET) .
 APPLY S(DELFUNC) .
//ACCPTCK  EXEC PGM=GIMSMP,REGION=0M,
//             PARM='CSI=SMPE.GLOBAL.CSI'
//SMPWRK3  DD UNIT=3390,SPACE=(3200,(1400,350,300))
//SMPCNTL  DD *
 SET BOUNDARY(DLIB) .
 ACCEPT S(DELFUNC) CHECK .
//ACCEPT   EXEC PGM=GIMSMP,REGION=0M,COND=(4,LT,ACCPTCK),
//             PARM='CSI=SMPE.GLOBAL.CSI'
//SMPWRK3  DD UNIT=3390,SPACE=(3200,(1400,350,300))
//SMPCNTL  DD *
 SET BOUNDARY(DLIB) .
 ACCEPT S(DELFUNC) .
//DELETE   EXEC PGM=GIMSMP,REGION=0M,
//             PARM='CSI=SMPE.GLOBAL.CSI'
//SMPWRK3  DD UNIT=3390,SPACE=(3200,(1400,350,300))
//SMPCNTL  DD *
 SET     BDY(TARGET)      /* SET TO APPLICABLE TARGET. */.
 UCLIN.
 DEL     SYSMOD(DELFUNC)  /* DELETE SYSMOD ENTRIES FOR */.
 DEL     SYSMOD(XXXXXXX)  /* DUMMY AND OLD FUNCTION.   */.
 ENDUCL.
 SET     BDY(DLIB)        /* SET TO APPLICABLE DLIB.   */.
 UCLIN.
 DEL     SYSMOD(DELFUNC)  /* DELETE SYSMOD ENTRIES FOR */.
 DEL     SYSMOD(XXXXXXX)  /* DUMMY AND OLD FUNCTION.   */.
 ENDUCL                   /*                           */.
//REJECT   EXEC PGM=GIMSMP,REGION=0M,
//             PARM='CSI=SMPE.GLOBAL.CSI'
//SMPWRK3  DD UNIT=3390,SPACE=(3200,(1400,350,300))
//SMPCNTL  DD *
 SET    BDY(GLOBAL)       /* SET TO GLOBAL ZONE.       */.
 REJECT HOLDDATA NOFMID   /* REJECT SYSMODS, HOLDDATA  */
 PRODUCT                  /* PRODUCT INFORMATION       */
 DELETEFMID               /* FOR THE DELETED FUNCTIONS.*/
 (DELFUNC XXXXXXX)        /* DELETE THE FMIDS FROM THE */
                          /* GLOBALZONE ENTRY.         */.
//

Explicación del JCL:

Lo primero de todo, tengo que saber cual es mi fichero VSAM que contiene el CSI del SMP/E donde guardo la instalación. En mi ejemplo, dicho VSAM es SMPE.GLOBAL.CSI. Con eso editado correctamente y pasado como parámetro, hago un RECEIVE del producto, en base a la variable SMPPTFIN que apunta a un dataset secuencial llamado SISTEMAS.JCL(SMPMCS), con el siguiente contenido:

++FUNCTION(DELFUNC)     /* ANY VALID UNIQUE SYSMOD ID.   */.
++VER(Z038)             /* FOR SREL Z038 (MVS PRODUCTS). */
DELETE(XXXXXXXX)        /* DELETES MYFUNC1.              */.

Es decir, me creo una función llamada DELFUNC que lleva implícita la condición de borrar el producto XXXXXXXX

Lo siguiente, es realizar un APPLY CHECK, es decir, antes de instalarlo, pruebo a ver si va a dar algún problema. Si no lo da, se ejecuta el siguiente paso, que es APPLY.

Una vez realizado el APPLY, se pasa al siguiente paso, que es hacer un ACCEPT CHECK, para comprobar si el sistema acepta el nuevo producto. Nuevamente, si se ejecuta bien, pasará a hacer el ACCEPT en serio. Con eso, el producto ya ha mandado borrar el producto que quieres hacer desaparecer.

Por lo tanto, solo nos queda borrar el producto (paso DELETE) para borrar el resto del producto de la GLOBAL y la DLIB, y hacer por último, un REJECT, para eliminar todo rastro del producto. Sencillo, verdad?

About Urtzi Larrieta

Director de Proyectos de entornos Mainframe, AIX y AS/400, llevo mas de 10 años trabajando para el sector servicios y banca, así como proyectos de sistemas, renovación tecnológica, estrategias de backup, y consultoría de sistemas.