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?