• 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.

ZD&T - Emular robot de cintas para ZPDT z/OS

ZD&T - Emular robot de cintas para ZPDT z/OS

Adjuntos:
Descargar este archivo (tape_robot.txt)tape_robot[Script que emula un robot de cintas básico]2 kB
Descargar este archivo (VTSPRUEB.txt)VTSPRUEB[Job para probar cintas]0.9 kB

¡Esta es una entrada de esas que me encantan! Es una entrada de TRASTEAR con el sistema.

Esta ocasión vamos a emular un robot de cintas para montar cintas de forma automática en z/OS. Tendremos nuestro sistema z/OS que hará peticiones de montaje de cintas y en mi sistema Ubuntu habrá un script que se encargue de hacer el montaje de esas cintas de forma automática sin que tengamos que intervenir (como ocurre en un entorno real).

Os dejo un video de demostración:

 

Esta entrada está basada en un script antiguo llamado “tape-robot.perl” (cinta número CBT696 de CBTTAPE) para el sistema FLEX-ES.

Yo lo voy a hacer un script similar “a mi manera” (siendo este uno de los pocos scripts que he hecho para Ubuntu), pero adaptado a los comandos de ZPDT (emulador de Mainframe de IBM).

Dejo el enlace al manual de ZDPT por si queréis revisar el uso de los comandos:

IBM zPDT Guide and Reference

El proceso consiste en lo siguiente:

  • En Ubuntu, definimos una cola FIFO. En esa cola, guardaremos los mensajes del sistema relacionados con el montaje y desmontaje de cintas.
  • En Ubuntu, creamos el script que lee los mensajes y monta las cintas correspondientes.
  • En ZDPT, definimos una impresora que almacene los mensajes en la cola FIFO.
  • En z/OS, definimos una consola tipo impresora para capturar los mensajes correspondientes que deben llegar a la cola FIFO.
  • En z/OS, en mi sistema hay un paso adicional por las rutinas ACS que vienen creadas en el sistema. Hay que modificarlas.

Para crear la cola FIFO, en Ubuntu usaremos el comando:

mkfifo nombre_fifo

Por ejemplo:

mkfifo tapes.pipe

001 watermark

 

Veremos el resultado como si de un fichero se tratase. En mi caso, en la ruta /home/ibmsys1

002 watermark

  

Ahora, en la misma ruta, vamos a crear un fichero nuevo con el script gestiona las cintas y los montajes. Lo llamaré tape_robot.sh

Es un script muy básico y, quizá, en el futuro le añado alguna función más, si es posible. Se puede descargar al principio de la entrada.

Consiste en un proceso que lee los mensajes de la cola FIFO “tapes.pipe”. Si el mensaje es un código de montaje (IEF233A), comprueba si es una cinta existente o una nueva. Si es una cinta nueva y no quedan cintas scratch, crea una nueva cinta y la monta.

Si es una cinta usada, la monta.

Si el mensaje es un código de desmontaje (IEF234E), comprueba si la cinta a desmontar existe en la carpeta de scratch y la mueve a la carpeta de usadas porque significa que esa cinta acaba de ser usada.

El script:

#!/bin/bash   

fifo_name="tapes.pipe"

scratch_dir="/home/ibmsys1/tapes/scratch"

used_dir="/home/ibmsys1/tapes/used"

while true

do

    #lee la cola FIFA creada con mkfifo

    if read line; then

                IFS=',' read -ra ADDR <<< "$line"

        #Mensaje IEF233A --> Montar cinta

                if [[ ${ADDR[0]} == *"IEF233A"* ]]; then

          #Si es una cinta PRIVAT es una cinta nueva para escribir

                  if [[ ${ADDR[1]} == *"PRIVAT"* ]]; then

                    #Coge la unidad donde se montara la cinta

                    unit=(${ADDR[0]})

            #Busca la primera cinta scratch disponible y la monta          

                    for entry in "$scratch_dir"/*

                    do

                      if [[ $entry != "/home/ibmsys1/tapes/scratch/*" ]]; then

                              

                               echo "awsmount ${unit[2]} -m $entry"

                               awsmount ${unit[2]} -m $entry

                        break

                      else

                               #Si no quedan cintas scratch, busca el numero de la ultima cinta usada

                        echo "No quedan cintas scratch."

                              

                                 for entry_tape in "$used_dir"/*

                                 do

                                   last_tape="${entry_tape}"

                                 done

                                

                                 IFS='/' read -ra ADDR <<< "$last_tape"

                                 # Cogemos el numero de cinta y quitamos los ceros iniciales

                                 tape_number=$(echo ${ADDR[5]:1:5} | sed 's/^0*//')

                                 # Sabiendo el numero de la ultima cinta usada, crea el nombre de la siguiente

                                 next_tape=$((tape_number + 1))

                  printf -v next_tape_format "%05d" ${next_tape}

                                 tape="T"${next_tape_format}

                                 #Inicializa la nueva cinta

                                 echo "aws_tapeInit ${tape} /home/ibmsys1/tapes/scratch/${tape}"   

                                 aws_tapeInit ${tape} /home/ibmsys1/tapes/scratch/${tape}

                                 #Monta la nueva cinta

                                 echo "awsmount ${unit[2]} -m /home/ibmsys1/tapes/scratch/${tape}"                                                                               

                                 awsmount ${unit[2]} -m /home/ibmsys1/tapes/scratch/${tape}

                      fi

                    done

          else

            #Si se necesita una cinta usada para leerla

            #Coge la unidad y la cinta solicitada y la monta

                    unit=(${ADDR[0]})

                    echo "awsmount ${unit[2]} -m /home/ibmsys1/tapes/used/${ADDR[1]}"

                    awsmount ${unit[2]} -m /home/ibmsys1/tapes/used/${ADDR[1]}

          fi

       

        #Si el mensaje es un desmontaje

                else

                  if [[ ${ADDR[0]} == *"IEF234E"* ]]; then

                    #Comprueba si la cinta desmontada esta en Scratch porque era nueva

                    #Si era nueva la mueve a la carpeta de usadas

                    if [ -f "$scratch_dir/${ADDR[1]}" ]; then

                               echo "mv "$scratch_dir"/"${ADDR[1]}" "$used_dir/${ADDR[1]}""

                               mv "$scratch_dir/${ADDR[1]}" "$used_dir/${ADDR[1]}"

            fi

          fi

        fi

    fi

done <"$fifo_name"

 003 watermark

 004 watermark

 

Con el siguiente comando damos permisos de ejecución:

chmod +x tape_robot.sh

005 watermark

 

También tenemos que crear la carpeta “tapes” y dentro de esta carpeta, las carpetas “used” y “scratch”.

006 watermark

007 watermark

 

El script se quedará en ejecución esperando mensajes en la cola FIFO “tapes.pipe”.

008 watermark

 

Definimos la impresora y unas unidades de cinta en el fichero de configuración de ZPDT.

Tienen que ser las direcciones 000E y 0580-0584 porque son las que están definidas en la configuración IODF.

Impresora:

[manager]

name awsprt 0011

device 00E 1403 2821 /home/ibmsys1/tapes.pipe

Unidades de cinta:

[manager]

name awstape 0012

device 580 3490 3490

device 581 3490 3490

device 582 3490 3490

device 583 3490 3490

device 584 3490 3490

009 watermark

 

Si, en algún momento, cuando estemos trabajando en z/OS vemos este mensaje del emulador ZPDT, significa que la impresora ha fallado (probablemente por un error en el script de las cintas) y habrá que parar el sistema z/OS, parar el emulador y volver a arrancar todo para que funcione de nuevo.

AWSSTA082E Device manager 13256 (AWSPRT), device 000E has terminated

AWSSTA084I ... performing restart of process AWSPRT

010 watermark

 

Vamos al sistema z/OS.

Definimos una nueva consola en el miembro CONSOLxx de la PARMLIB que dirija los mensajes tipo “3” (ROUTCODE (3)) a la impresora. Estos mensajes son los relacionados con cintas. Podemos ver el detalle en el siguiente enlace:

Routing code meaning

CONSOLE      

  DEVNUM(00E)

  NAME(PRT1) 

  ROUTCODE(3)

  UNIT(PRT)  

 011 watermark

 

Podemos activar dinámicamente la configuración con el comando “SET CON=xx”, pero en mi caso haré IPL porque tengo que cargar los cambios de configuración que hice en ZPDT para añadir la impresora y las unidades de cinta.

En mi sistema, hay definidas unas rutinas SMS que asignan la STORCLAS “SCBASE” por defecto.

Voy a editar el miembro SYS1.S0W1.DFSMS.CNTL(STORCLAS) para comentar la línea “SET &STORCLAS = 'SCBASE'” de la siguiente parte:

OTHERWISE                    

  DO                         

    SET &STORCLAS = 'SCBASE' 

    EXIT CODE(0)             

  END                        

012 watermark

 

Ahora vamos a ISMF para activar las nuevas rutinas.

Entramos en la opción 7 - Automatic Class Selection.

013 watermark

 

Ponemos el nombre del fichero CDS y entramos en la opción 2 -Translate.

NOTA: Para saber el nombre del fichero CDS, vamos a SDSF usamos el comando “D SMS”.

014 watermark

 

Rellenamos los datos y pulsamos intro.

015 watermark

 

Confirmamos que termine con 0.

016 watermark

 

Ahora entramos en la opción 3 – Validate, para validar que son correctas.

017 watermark

 

Dejamos los datos como en el panel y pulsamos intro.

018 watermark

 

Confirmamos que la validación es correcta.

019 watermark

 

Entramos en la opción 8 – Control Data Set del panel principal.

020 watermark

 

Elegimos la opción 5 – Activate.

021 watermark

022 watermark

 

Confirmamos que queda activado.

023 watermark

 

Ahora ejecutamos el siguiente job de prueba. Este job copia un fichero de disco a una cinta usando la unidad 580 y luego lee ese fichero.

Se puede descargar al principio de la entrada.

024 watermark

 

En la salida del job comprobaremos que se han hecho los montajes correspondientes sin ninguna intervención. Ha usado la cinta T00013

025 watermark

 

También podemos ver la información del fichero de la cinta.

026 watermark

 

En Ubuntu, veremos las acciones que ha realizado el script “tape_robot”.

027 watermark

 

En principio, las funciones básicas las realiza correctamente.

¡Espero que os guste y os sea de ayuda!

En el futuro, intentaré crear una librería de cintas en el sistema y configurar: IODF, SMS, OAM, RMM y, en una entrada posterior, HSM.

 

Publish modules to the "offcanvs" position.