¡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:
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
Veremos el resultado como si de un fichero se tratase. En mi caso, en la ruta /home/ibmsys1
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"
Con el siguiente comando damos permisos de ejecución:
chmod +x tape_robot.sh
También tenemos que crear la carpeta “tapes” y dentro de esta carpeta, las carpetas “used” y “scratch”.
El script se quedará en ejecución esperando mensajes en la cola FIFO “tapes.pipe”.
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
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
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:
CONSOLE
DEVNUM(00E)
NAME(PRT1)
ROUTCODE(3)
UNIT(PRT)
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
Ahora vamos a ISMF para activar las nuevas rutinas.
Entramos en la opción 7 - Automatic Class Selection.
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”.
Rellenamos los datos y pulsamos intro.
Confirmamos que termine con 0.
Ahora entramos en la opción 3 – Validate, para validar que son correctas.
Dejamos los datos como en el panel y pulsamos intro.
Confirmamos que la validación es correcta.
Entramos en la opción 8 – Control Data Set del panel principal.
Elegimos la opción 5 – Activate.
Confirmamos que queda activado.
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.
En la salida del job comprobaremos que se han hecho los montajes correspondientes sin ninguna intervención. Ha usado la cinta T00013
También podemos ver la información del fichero de la cinta.
En Ubuntu, veremos las acciones que ha realizado el script “tape_robot”.
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.