• principal_3

    Desde 2015, enseñando sobre el sistema operativo z/OS de IBM en esta web. z/OS se utiliza en máquinas llamadas Mainframe.

  • principal_1

    Para realizar el contenido, utilizo el producto de IBM llamado z/Development and Test Environtment Personal Edition. Este software permite emular un Mainframe y así poder utilizar z/OS para aprender.

  • principal_2

    Es utilizado por grandes empresas (bancos, aseguradoras...). Aquí aprenderás a instalar y configurar productos relacionados con z/OS.

  • principal_4

    ADCD es una distribución de z/OS que contiene productos de IBM como IMS, DB2, CICS, ZOWE, TWS, NetView, System Automation, etc.

TWS/OPC - Conectar un tracker a un controller de distinto sistema por TCPIP - Parte 2/2

En esta segunda y última parte vamos a terminar implementar el tracker del sistema secundario, haremos la configuración del controller del sistema principal y probaremos que todo funciona.

Vamos a empezar a compilar las EXITs de que usará el OPC. Las EXITs sirven para controlar los eventos que se producen, por ejemplo, poner un job como completado cuando ha terminado su ejecución y ha finalizado correctamente.

Para ello vamos a la opción 3.2 de ISPF y creamos la librería OPC.OP1C.OBJ. 

NOTA: Esto es necesario para que el controller del otro sistema se entere de la finalización de los jobs. En caso de no hacer bien este paso, el job se ejecutará y terminará pero en el OPC del otro sistema se quedará en estado “starting”.

 

Una vez creada la librería, vamos a empezar a compilar las EXITs:

 

EXIT7

Para compilar esta la exit "EXIT7" vamos a la librería OPC.OP2C.SAMPJCL y editamos el miembro EQQJES2. Confirmamos que los datos aparecen como en la imagen y submitimos.

La librería de la DD SYSLMOD es la librería donde se guardará el módulo ya compilado, en este caso usamos la librería ADCD.Z113.LPALIB, pero puede ser cualquier librería que esté definida en el miembro LPALST* de la librería ADCD.Z113.PARMLIB. Una vez modificado, submitimos.

NOTA: Hay que tener en cuenta que si tenemos dos módulos con el mismo nombre en dos librerías LPALIB se usará el de la librería que este primero en el miembro LPALST* de la librería ADCD.Z113.PARMLIB.

 

EXIT51

Para compilar esta EXIT, vamos a la librería OPC.OP2C.SAMPJCL y editamos el miembro EQQJES21.

 

Copiamos el miembro EQQJES2 a la misma librería, pero con nombre SMFEXITS para compilar las EXITs de SMF (IEFACTRT, IEFUJI e IEFU83).

 

Una vez copiado, lo editamos.

 

IEFUJI

Para la exit IEFUJI, editamos el miembro SMFEXITS con los siguientes datos y submitimos. También se guardará en la librería ADCD.Z113.LPALIB.

 

IEFU83

Igual que el caso anterior, editamos el JCL SMFEXITS con los datos de la imagen y submitimos. Si hemos puesto todo bien, terminará correctamente.

 

IEFACTRT

Como en los casos anteriores, editamos el JCL SMFEXITS con los datos de la imagen y submitimos.

 

Comprobamos que se han creado todas.

 

Ahora vamos a editar los parámetros del sistema (PARMLIB). En el siguiente enlace ya expliqué cómo saber dónde encontrar los parámetros que tenemos en uso. Podéis echarle un vistazo si necesitáis alguna aclaración:

Implementando TWS 8.6.0 (OPC) - Cuarta Parte

 

Miembro IEFSSN**

En mi caso, debo modificar el miembro IEFSSNDB de la PARLLIB ADCD.Z113.PARMLIB. Debemos añadir lo siguiente:

SUBSYS SUBNAME(OP2T) INITRTN(EQQINITJ) INITPARM ('300,J')  

NOTA: En el enlace anterior también expliqué lo que significa cada parámetro y cómo obtenerlo.

 

Podremos añadirlo dinámicamente desde SDSF con el comando:

/SETSSI ADD,SUBNAME=OP2T,INITRTN=EQQINITJ,INITPARM='300,J'

NOTA: Como el comando no entra entero, en SDSF pondremos una barra “/” sólo y pulsaremos Intro. Saldrá un panel nuevo donde podremos escribir el comando.

 

Miembro PROG**

Debemos añadir la librería de módulos TWS860.SEQQLMD0 y el volumen donde se encuentra a las librerías APF y la concatenación de LNKLST del miembro PROG que tengamos en uso. Para evitar un IPL, podremos añadir la librería de forma dinámica con los comandos:

SETPROG APF,ADD,DSNAME=TWS860.SEQQLMD0,VOLUME=ZDPRD1

SETPROG LNKLST,ADD,NAME=LNKLST00,DSNAME=TWS860.SEQQLMD0

 

Vamos a añadir una llamada a las EXITs que creamos anteriormente. Esto hay que en el mismo miembro PROG que nos encontramos. Después de la definición de las librerías APF, añadimos lo siguiente:

EXIT ADD EXITNAME(SYS.IEFU83) MODNAME(TWSU83)              

EXIT ADD EXITNAME(SYS.IEFACTRT) MODNAME(TWSACTRT)         

EXIT ADD EXITNAME(SYS.IEFUJI) MODNAME(TWSUJI)             

EXIT ADD EXITNAME(SYSSTC.IEFU83) MODNAME(TWSU83)          

EXIT ADD EXITNAME(SYSSTC.IEFACTRT) MODNAME(TWSACTRT)      

EXIT ADD EXITNAME(SYSSTC.IEFUJI) MODNAME(TWSUJI)          

EXIT ADD EXITNAME(SYSJES2.IEFU83) MODNAME(TWSU83)         

EXIT ADD EXITNAME(SYSJES2.IEFACTRT) MODNAME(TWSACTRT)     

EXIT ADD EXITNAME(SYSJES2.IEFUJI) MODNAME(TWSUJI)

 

NOTA: El “MODNAME” es el mismo que pusimos cuando creamos las exits en pasos anteriores.

 

Además del paso anterior, podremos añadir exits de forma dinámica por comando desde SDSF. Por ejemplo:

SETPROG EXIT,ADD,EXITNAME=SYS.IEFUJI,MODNAME=TWSUJI   

Deberemos hacer lo mismo con todas.

 

Miembro SMFPRM**

En mi caso, solo existe en miembro SMFPRM00. Lo editamos y añadimos lo siguiente al final:

SYS(TYPE(6,14,15,18,26,30,60,62,64,90),EXITS(IEFU83,IEFACTRT,IEFUJI))

SUBSYS(STC,EXITS(IEFUJI,IEFACTRT,IEFU83))

SUBSYS(JES2,EXITS(IEFUJI,IEFACTRT,IEFU83))

 

Miembro IKJTSO**

Este paso no sé si es necesario en caso de no usar controller en el mismo sistema, pero como es un paso muy corto, lo añadimos. En mi caso, el miembro en uso es el IKJTSO00. Añadiremos lo siguiente:

En "AUTHTSF NAMES", añadimos EQQMINOJ.

 

En "AUTHCMD NAMES", añadir lo siguiente (hay que tener en cuenta que al final de cada línea hay un +):

BACKUP               /*                          */ + 

BULKDISC             /*                          */ + 

JSUACT               /*                          */ + 

OPINFO               /*                          */ + 

OPSTAT               /*                          */ + 

SRSTAT               /*                          */ + 

WSSTAT               /*                          */ 

 

Miembro SCHED**

Buscaremos el miebro SCHED en uso. Una vez encontrado, lo editamos para añadir la siguiente línea:

PPT PGMNAME(EQQMAJOR) NOSWAP

 

EXITs JES2

Buscaremos en la PROCLIB del sistema donde tengamos ubicada la tarea JES2. Si entramos, deberíamos ver un parámetro llamado “MEMBER” que indica el miembro que debemos editar de la PARMLIB para añadir las exits a la configuración. En mi caso, es JES2PARM.

 

Lo editaremos poniendo especial cuidado y añadiremos lo siguiente:

LOAD(OPCAXIT7)                                     

EXIT(7) ROUTINES=OPCAENT7,STATUS=ENABLED           

LOAD(TWSXIT51)                                     

EXIT(51) ROUTINES=TWSENT51,STATUS=ENABLED    

NOTA: Si cometemos algún error de sintaxis, la tarea JES2 no arrancará. Revisad bien las líneas comentadas para evitar errores.

 

Ahora vamos a crear el miembro EQQGJCCT, para que cuando arranquemos el OPC no de error, que es la tabla de mensajes del JOB COMPLETION CHECKER.

Más información sobre la tabla de mensajes aquí.

Para crearlo, creamos un nuevo JCL en cualquier librería, yo me he creado una librería llamada IBMUSER.JCLS, y ponemos lo siguiente:

//OPCINSTA JOB (9999),'OPCSAMPLES',CLASS=A,MSGCLASS=Q,      

// MSGLEVEL=(1,1),REGION=0M,NOTIFY=&SYSUID                      

//ASMH     EXEC PGM=ASMA90                               

//SYSPRINT DD  SYSOUT=*                     

//SYSLIB   DD  DISP=SHR,DSN=TWS860.SEQQMAC0(EQQJCCT)       

//SYSLIN   DD  DISP=SHR,DSN=OPC.OP2C.JCLIB(EQQGJCCT)   

//SYSUT1   DD  UNIT=SYSDA,SPACE=(CYL,(2,1))             

//SYSIN    DD  *                                         

 EQQJCCT S=1,T=SKIPSTA,M='IDCAMS SYSTEM SERVICES'        

 END                                                     

/* 

NOTA: La librería de la DD SYSLIB tiene que ser la librería donde se encuentra el miembro EQQJCCT y la librería de salida (SYSLIN) la librería JCLIB de nuestra instalación

 

Ya tendremos implementado el tracker en el sistema secundario. Ahora vamos al sistema principal y editaremos las opciones del controller. Para saber las opciones del controller que debemos editar, buscaremos la tarea correspondiente en nuestra PROCLIB y miraremos el parámetro PARM. Debemos editar el miembro que aparezca ahí, que estará en la librería que se indica en la DD EQQPARM.

NOTA: Apuntaremos también el nombre del dataset de la DD EQQMLOG.

 

Editaremos el fichero de parámetros, en mi caso, TEAM1CTL y buscaremos el parámetro ROUTOPTS. En mi caso, ya tengo un tracker SNA definido, ahora añadiré el tracker TCPIP. Debemos ponerlo de la siguiente manera:

TCPIP(Destion:’IP de destion’/puerto)

En el caso de nuestra configuración, quedaría de la siguiente forma:

TCPIP(OP2T:'192.168.1.52'/4348)    

 

Ahora buscaremos la opción “TCPOPTS”. En esa opción definiremos la configuración TCPIP del controller.

TCPIPJOBNAME -> Pondremos el nombre de nuestra tarea TCPIP.

HOSTNAME -> Podremos usar la IP propia del sistema o el HOSTNAME correspondiente.

TRKPROTNUMBER -> El puerto que le daremos al Controller. Yo usaré el puerto 8888.

SSLLEVEL-> Lo pondremos OFF.

 

Salvamos la configuración y paramos/arrancamos el controller del sistema principal para que coja los cambios. Ahora vamos al segundo sistema y arrancaremos el tracker OP2T para que intente la conexión contra el controller. Para revisar si ha ido bien, iremos a los ficheros MLOG tanto del tracker OP2T como del controller OP1C.

En mi caso, al tratarse de un entorno de emulación la conexión del tracker no llega por su IP (192.168.1.52), sino por la IP de mi router (192.168.1.1).

 

Para arreglarlo solo tengo que cambiar la IP del parámetro ROUTOPTS del controller.

 

Tras parar y arrancar de nuevo controller y tracker, veremos que ya está conectado:

 

Ahora vamos a definir una Workstation, una aplicación y la ejecutaremos.

Para definir la Workstation seguiremos los pasos indicados en la siguiente entrada:

https://emuframe.com/index.php/tws-opc/20-creando-workstations-en-tws-8-6-0-opc

 

Los datos de la Workstation serán los siguientes. En el campo “Destination” tenemos que poner el destino que indicamos en el parámetro ROUTOPTS de la configuración del controller.

 

Para definir la aplicación seguiremos los pasos indicados en la siguiente entrada:

https://emuframe.com/index.php/tws-opc/22-creando-una-aplicacion-sencilla-en-tws-8-6-0-opc

Los datos de la aplicación serán los siguientes. Yo voy a usar un job que termine en error para la comprobación.

 

Antes de poder utilizar esta Workstation, deberemos hacer una extensión o un replan del Current Plan. En la siguiente entrada hay más datos de cómo hacerlo:

https://emuframe.com/index.php/tws-opc/24-creando-el-current-plan-en-tws-8-6-0-opc

Una vez terminado el replan o la extensión del Current Plan, añadiremos la aplicación desde la opción 5.1 de OPC.

 

Veremos que el job está en error:

 

Si buscamos la salida en el SDSF del sistema que sólo tiene tracker, veremos el error que ha dado.

 

Ya hemos podido comprobar que la conexión entre el controller del sistema principal y el tracker de un sistema “secundario” funciona correctamente. Si queremos, podemos corregir el error del job y relanzarlo para comprobar que se completa. En el caso de que se quede en estado “S”, y veamos su ejecución terminada en el otro sistema, es muy posible la exit IEFACTRT no estén bien cargada en el sistema que tiene el tracker.

Es recomendable reservar los puertos que hemos definido para controller y tracker en los parámetros de TCPIP para que sean usados por esa tarea. Para hacerlo debemos modificar el “PROFILE” que tengamos en uso en cada sistema y reiniciar la tarea TCPIP cuando podamos hacerlo. En la siguiente entrada expliqué cómo saber el perfil en uso:

https://emuframe.com/index.php/32-configurando-tcpip-en-zos

 

En el sistema principal que tiene el controller añadiremos lo que se ve en la imagen.

 

En el sistema secundario que tiene el tracker añadiremos lo que se ve en la imagen.

 

En principio, podemos dar por terminada la configuración. Espero que esta entrada os ayude en la conexión de un controller de TWS a trackers de otros sistemas.

 

Publish modules to the "offcanvs" position.