Sei sulla pagina 1di 54

System i

Tips y Técnicas

2009 Grupo ASSSI


Temario

Unidades.

1. Operación y Administración.
2. Programación y Desarrollo de Aplicaciones.
3. Base de Datos.
4. Comunicaciones.
5. Seguridad.
6. Trivia.
1. Operación y Administración
1. Operación y Administración

Respaldar Archivos de Spool en V5R4


1. Operación y Administración

Ahora que ya están en V5R4, o que pronto lo van a estar, no hay que olvidar algo de lo
bueno.
¡ Ahora no se pierde ningún atributo al restaurarlos !

Nuevo parámetro adicionado a los comandos: SAVLIB, SAVOBJ, RSTLIB, RSTOBJ

SAVLIB LIB(PRUEBASLIB) DEV(TAP01) SPLFDTA(*ALL)

Este comando salva todos los archivos de spool de las output queues en la librería.

RSTLIB SAVLIB(PRUEBASLIB) DEV(TAP01) SPLFDTA(*NEW)

Este comando restaura todos los archivos de spool que no existan en las output
queues.
1. Operación y Administración

SAVOBJ OBJ(MIOUTQ) LIB(PRUEBSALIB) DEV(TAP01) OBJTYPE(*OUTQ)


SPLFDTA(*ALL)

Este comando salva la output queue MIOUTQ en la librería PRUEBALIB con todos
los archivos de spool que contenga.

RSTOBJ OBJ(MIOUTQ) SAVLIB(PRUEBASLIB) DEV(TAP01) OBJTYPE(*OUTQ)


SPLFDTA(*NEW)

Este comando restaura los archivos de spool de la output queue MIOUTQ en la


librería PRUEBALIB, que no existan en el sistema.
1. Operación y Administración

Como Monitorear Problemas de i5/OS


1. Operación y Administración

Mejores lugares para encontrar problemas:

• Cola de mensajes QSYSMSGQ.


• Cola de mensajes del Operador del Sistema QSYSOPR.
• Estadísticas de las Unidades de Disco.
• Entradas de los Trabajaos Activos.
• Colas de Trabajo y Colas de Salida.

Considerar alguna herramienta de monitoreo automático.


1. Operación y Administración

Cola de Mensajes QSYSMSGQ

• Se debe crear en la librería QSYS.

CRTMSGQ MSGQ(QSYS/QSYSMSG) TEXT(‘Cola de mensajes opcional


para recibir mensajes del sistema’)

• El sistema operativo envía de manera automática los problemas críticos del


sistema.

Existen diferentes formas de trabajar con esta cola de mensajes:

1. Utilizar una herramienta de monitoreo.


2. Crear un programa que lea los mensajes en QSYSMSGQ y realice cierta
acción cada vez que se reciba un mensaje.
3. Monitorear QSYSMSGQ en modo ‘break’

CHGMSGQ MSGQ(QSYSMSGQ) DLVRY(*BREAK)


1. Operación y Administración

Cola de Mensajes QSYSOPR

• Más compleja de monitorear ya que incluye tanto mensajes de rutina como


mensajes críticos.
• Utilizar una herramienta de monitoreo o escribir un programa.

Recomendaciones para monitorear de manera automática:

1. Mensajes que requieren una respuesta tal como C, D, I o R.

Cuando un trabajo requiere de una contestación, no informa de esto para


continuar.

2. Filtrar mensajes de consulta asociados con el usuario QSPLJOB.

Mensajes para tareas como cargar diferentes tipos en la impresora o alinear


formatos.
1. Operación y Administración

Cola de Mensajes QSYSOPR

3. Monitorear mensajes con un código de severidad de 80 o mayor.

9 Exceptuando los del usuario QSPLJOB.


9 Normalmente son mensajes que deben ser atendidos de inmediato.

4. Monitorear trabajos que no se completaron normalmente.

CPF1240 - Job &3/&2/&1 ended abnormally


CPC1234 - Job &3/&2/&1 ended from job queue by user &4
CPC1125 - Job &3/&2/&1 was ended by user &4
CPC1126 - Job &3/&2/&1 was ended by user &4
1. Operación y Administración

Cola de Mensajes QSYSOPR

5. Monitorear condiciones serias de almacenamiento.

CPF0907 - Serious storage condition may exist. Press HELP.

• Cubrimos la mayoría de los problemas típicos.


• Iniciarse en el monitoreo automático.
• En la 2ª parte revisaremos otros mensajes a monitorear.
1. Operación y Administración

Para la 2ª Parte

Analizaremos otras áreas críticas a monitorear, incluyendo:

• Cambios súbitos en la capacidad de disco utilizada.


• Objetos dañados.
• Problemas con trabajos activos en ejecución.
• Problemas con trabajos batch, incluyendo los de ejecución prolongada.
• Asegurarse que los subsistemas críticos están en ejecución.
• Asegurarse que los trabajos críticos de servidores están en ejecución.
• Problemas con impresiones de archivos de spool.
2. Programación y Desarrollo de Aplicaciones
2. Programación y Desarrollo de Aplicaciones

Eludir Registros Bloqueados


2. Programación y Desarrollo de Aplicaciones

Poner especial atención en la operación READ en el segundo cálculo:

FSomeFile UF E K Disk Prefix(SR_)

D Forever S N inz(*On)
D Open C Const(' ')
D Closed C Const('Z')

/Free
DoW Forever;
Read(E) SomeRec;
If %Eof(SomeFile);
Leave;
EndIf;
If %Error();
Read(N) SomeRec;
Iter;
EndIf;
If SR_Status = Open and SR_Balance = *Zero;
Eval SR_Status = Closed;
Update SomeRec %Fields(SR_Status);
EndIf;
EndDo;
Eval *InLR = *On;
Return;
/End-Free
2. Programación y Desarrollo de Aplicaciones

• La operación READ incluye en extender E, indicándole al compilador RPG no


detenerse si la operación termina en error.
• Después del READ y el chequeo usual por fin de archivo, utilizar la función
%ERROR para atrapar los registros bloqueados.
• Si falla el READ, volver a leer, esta vez sin el lock.
• Esta segunda lectura permite mover el apuntador del archivo al siguiente
registro.
• En este ejemplo no se revisó si el error se debió a un ‘lock’.
• Si se requiere, utilizar la función %STATUS, valor 1218.
2. Programación y Desarrollo de Aplicaciones

La Eficiencia de Variables de Longitud Variable


2. Programación y Desarrollo de Aplicaciones

• ¿Recuerdan los viejos tiempos en que los dinosaurios rondaban la tierra y la


única forma de construir strings de datos en RPG involucraba jugar juegos
ridículos con arreglos?

• O peor aún, utilizar combinaciones obscuras con operaciones MOVE.

• RPG IV introdujo funciones poderosas para manejar strings como %TRIM.

• Sin embargo, existen capacidades del lenguaje que pocos programadores


utilizan.

• Una de las mejores es la de variables de caracter, de longitud variable.

• Existen varias ventajas de su utilización, pero en este ejemplo, únicamente


nos enfocaremos a la de rendimiento.
2. Programación y Desarrollo de Aplicaciones

D Spec – Mostrar como se definen y mostrar cada parte

D varStruct DS
(A) D Campovar 256a Varying Inz

// Los siguiente campos se definen solamente para mostrar el layout de un campo variable

(B) D long 5i 0 Overlay(CampoVar)


(C) D datos 256a Overlay(CampoVar: *Next)

• Tienen 2 componentes: La longitud actual representada por un entero de 2-


bytes en las primeras 2 posiciones, seguido de los datos.

• Se diferencian por la Palabra Clave Varying (A).

• Codificar siempre la Palabra Clave Inz para asegurar que la longitud se asigne
correctamente. Esto es crítico cuando se incorporan campos de longitud
variable en estructuras de datos.

• ¿Por que?
2. Programación y Desarrollo de Aplicaciones

D Spec – Mostrar como se definen y mostrar cada parte

D varStruct DS
(A) D Campovar 256a Varying Inz

// Los siguiente campos se definen solamente para mostrar el layout de un campo variable

(B) D long 5i 0 Overlay(CampoVar)


(C) D datos 256a Overlay(CampoVar: *Next)

• Porque por omisión, las estructuras de datos se inicializan con espacios (hex
40), creando confusión al interpretarlo como la longitud del campo.

• En el ejemplo, (B) y (C), se definieron los 2 componentes como campos


separados para mostrar el layout.
2. Programación y Desarrollo de Aplicaciones

• Siempre que el contenido de un campo de longitud variable cambie, el


compilador ajusta la longitud para reflejar el nuevo contenido.

• Siempre se debe utilizar %TRIMX cuando se carguen datos desde un campo


de longitud fija.

• De lo contrario, los blancos restantes se contarán en la longitud del campo.

• Para saber la longitud del campo, utilizar la función %LEN() y obtener el valor
actual.
2. Programación y Desarrollo de Aplicaciones

• Vamos a ver como pueden mejorar notablemente el rendimiento.


• Observar los 2 siguientes códigos.
• Ambos construyen un string de 100 valores separados por comas.
• A primera vista, existe muy poca diferencia en la lógica, pero…

¿Creerían que el segundo puede ejecutar cientos, sino es que miles de veces más
rápido?

For i = 1 to 10;
For j = 1 to 10;
fixedField = %Subst(baseString: i: j );
longFixed = %TrimR(longFixed) + ',' + fixedField;
EndFor;
EndFor;

For i = 1 to 10;
For j = 1 to 10;
fixedField = %Subst(baseString: i: j );
longVarying += ',' + %TrimR(fixedField);
EndFor;
EndFor;
2. Programación y Desarrollo de Aplicaciones

For i = 1 to 10;
For j = 1 to 10;
fixedField = %Subst(baseString: i: j );
longFixed = %TrimR(longFixed) + ',' + fixedField;
EndFor;
EndFor;

Pasos que se llevan a cabo:

• Descubrir donde se encuentra el último caracter sin espacio.


• Adicionar la coma en la siguiente posición.
• Adicionar el contenido de fixedField en la siguiente y subsecuentes
posiciones.
• Si no se ha llenado longFixed, adicionar blancos hasta llenarlo.

Este proceso se repite para cada valor adicionado al string.


2. Programación y Desarrollo de Aplicaciones

For i = 1 to 10;
For j = 1 to 10;
fixedField = %Subst(baseString: i: j );
longVarying += ',' + %TrimR(fixedField);
EndFor;
EndFor;

Pasos que se llevan a cabo:

• Incrementar la longitud del campo en 1, y posicionar la coma en esa posición.


• Determinar la longitud del campo a adicionar (ej. Ignorar blancos).
• Copiar los datos al inicio de la longitud del campo, incrementando la longitud
del campo + 1 posición.

¡ Mucho más sencillo ! Y la diferencia en velocidad puede ser impresionante.


2. Programación y Desarrollo de Aplicaciones

For i = 1 to 10;
For j = 1 to 10;
fixedField = %Subst(baseString: i: j );
longFixed = %TrimR(longFixed) + ',' + fixedField;
EndFor;
EndFor;

Otro punto a considerar es que este código (Primer ejemplo), es más eficiente
que el utilizado normalmente:
longFixed = %TrimR(longFixed) + ',' + %TrimR(fixedField);

Al campo que se va a adicionar se le quitan los blancos, los cuales se adicionan


nuevamente si el campo destino no se llena completamente.

longFixed = %TrimR(longFixed) + ',';


longFixed = %TrimR(longFixed) + fixedField;
La separación de las 2 funciones, significa que los cálculos para la longitud
efectiva del campo destino y el llenado subsecuente de blancos ocurre 2 veces
por cada ‘loop’.
2. Programación y Desarrollo de Aplicaciones

For i = 1 to 10;
For j = 1 to 10;
fixedField = %Subst(baseString: i: j );
longFixed = %TrimR(longFixed) + ',' + fixedField;
EndFor;
EndFor;

Se utiliza simplemente para generar campos de diferentes longitudes (1 a 10


caracteres) para actuar como datos de prueba a ser adicionados al string destino.
2. Programación y Desarrollo de Aplicaciones

Enviar un Mensaje a Un Usuario Desde Un


Programa.
2. Programación y Desarrollo de Aplicaciones
Utilizar: Call QEZSNDMSG

Especificar toda la información vía parámetros, para enviar un mensaje de


interrupción desde un programa BATCH.

PGM PARM(&MSG &USERID) CHGVAR VAR(%BIN(&MSGLEN)) VALUE(32)


CHGVAR VAR(%BIN(&NUMUSERS)) VALUE(1)
DCL VAR(&MSGTYPE) TYPE(*CHAR) LEN(10) CHGVAR VAR(%BIN(&MSGSNT)) VALUE(0)
DCL VAR(&DELIVERY) TYPE(*CHAR) LEN(10) CHGVAR VAR(%BIN(&FUNCREQ)) VALUE(0)
DCL VAR(&MSG) TYPE(*CHAR) LEN(32) CHGVAR VAR(%BIN(&ERRORCODE 1 4)) VALUE(0)
DCL VAR(&MSGLEN) TYPE(*CHAR) LEN(4) CHGVAR VAR(%BIN(&CCSID)) VALUE(0)
DCL VAR(&USERID) TYPE(*CHAR) LEN(10)
DCL VAR(&NUMUSERS) TYPE(*CHAR) LEN(4) CALL PGM(QEZSNDMG) PARM(&MSGTYPE +
DCL VAR(&MSGSNT) TYPE(*CHAR) LEN(4) &DELIVERY +
DCL VAR(&FUNCREQ) TYPE(*CHAR) LEN(4) &MSG +
DCL VAR(&ERRORCODE) TYPE(*CHAR) LEN(8) &MSGLEN +
DCL VAR(&DISPLAY) TYPE(*CHAR) LEN(1) &USERID +
DCL VAR(&MSGQ) TYPE(*CHAR) LEN(20) &NUMUSERS +
DCL VAR(&DSTTYPE) TYPE(*CHAR) LEN(4) &MSGSNT +
DCL VAR(&CCSID) TYPE(*CHAR) LEN(4) &FUNCREQ +
&ERRORCODE +
CHGVAR VAR(&MSGTYPE) VALUE('*INFO') &DISPLAY +
CHGVAR VAR(&DELIVERY) VALUE('*BREAK') &MSGQ +
CHGVAR VAR(&DISPLAY) VALUE('N') &DSTTYPE +
CHGVAR VAR(&DSTTYPE) VALUE('*USR') &CCSID )

ENDPGM
3. Base de Datos
3. Base de Datos

Utilizar DRDA para ejecutar SQL en otro


System i
3. Base de Datos

• DRDA – Distribuited Relational Database Architecture.

• Para utilizar SQL en múltiples equipos o particiones.

• Puede ayudar en tareas administrativas.

• Muy útil para consultar datos en los tablas/archivos.

• Permite a un System i local, ejecutar sentencias SQL en un servidor remoto


(incluye otras plataformas).
3. Base de Datos

Configuración del Servidor Remoto

• DRDA utiliza el Servidor DDM (Distribuited Data Management) para recibir y


procesar SQL.

1. Revisar si está en ejecución el Trabajo QRWTSRVR en el subsistema


QSYSWRK.

2. Arrancar el Servidor;

STRTCPSVR SERVER(*DDM)
3. Base de Datos

Configuración del Servidor Local

• Adicionar una entrada del Servidor Remoto en el directorio de bases de datos


relacionales.

1. Utilizar el comando WRKRDBDIRE, y la opción 1 para adicionar una entrada


al directorio.

Base de datos relacional = Nombre que hace referencia al System i Remoto.


Localidad remota = Nombre de Host o Dirección IP.
Tipo de conexión = *IP

2. Utilizar el comando ADDRDBDIRE:

ADDRDBDIRE RDB(Remoto) RMTLOCNAME(xx.xx.xx.xx *IP)


3. Base de Datos

Utilizando DRDA

1. Arrancar SQL – STRSQL


2. Utilizar la sentencia CONNECT – Requiere el nombre especificado en el
parámetro RDB, nombre de usuario y contraseña:

CONNECT TO Remoto USER xxxxxx USING ‘contraseña’

3. Una vez conectado satisfactoriamente, todas las sentencias SQL se


ejecutarán con la base de datos remota, hasta finalizar la conexión.
4. Para conectarse entre servidores utilizar SET CONNECTION:

SET CONNECTION Remoto


SET CONNECTION Local

5. Para saber a cual están conectados, utilizar la sentencia CONNECT.


6. Para desconectar, utilizar el comando DISCONNECT Remoto.
4. Comunicaciones
4. Comunicaciones

NetServer
4. Comunicaciones

• ¿ Qué es NetServer ?

• Servidor para compartir directorios e impresoras con clientes Windows.

• Permite el acceso remoto a los recursos de System i.

• System i Access no es necesario.

• Se recomienda utilizar el Navegador para configurar NetServer.


4. Comunicaciones

Configuración de NetServer

1. Verificar que TCP/IP está activo y funcional.


2. Verificar el nombre correcto del Servidor NetServer.
Buscar en los mensajes del operador el mensaje CPIB680, el cual contiene el
nombre.
3. Si no es el nombre correcto, cambiar de la siguiente manera:
CALL QZLSCHSN PARM (nombre-servidor nombre-dominio ‘texto’
X’00000000’)
4. Finalizar y arrancar el Servidor NetServer:
ENDTCPSVR *NETSERVER
STRTCPSVR *NETSERVER
4. Comunicaciones

Configuración de NetServer

5. Revisar que se esté ejecutando el Trabajo QZLSSERVER en el subsistema


QSERVER.
6. Utilizar el comando NETSTAT *CNN para verificar que existen las siguientes
entradas:
** netbios>001:27:44 Listen
** netbios>000:00:01 *UDP
** netbios>000:00:00 *UDP
** netbios>000:30:57 Listen
** cifs>427:49:42 Listen
7. Revisar que se está ejecutando el trabajo QNPSERVD en el subsistema
QSYSWRK:
STRHOSTSVR *NETPRT
4. Comunicaciones

Compartir Archivos

Abrir el Navegador:

1. Seleccionar Red – Servidores.

2. Clic en TCP/IP para ver todos los servidores.

3. Clic derecho en NetServer y seleccionar Abrir.

4. Clic derecho en Objetos Compartidos y seleccionar Nuevo – Archivo.

5. Utilizar Propiedades Generales para configurar el nombre, descripción,


accesos, número máximo de usuarios, etc.
4. Comunicaciones

Configuración de la PC - Archivos

1. Verificar que se tiene conexión con el System i – Ping.


2. Seleccionar Inicio – Buscar – Equipos o Personas – Un equipo en la red –
nombre del servidor netserver (\\as400\)
3. Doble clic para seleccionar los recursos compartidos.
4. Clic derecho en el directorio a compartir y seleccionar compartir y seguridad.
5. Seleccionar la letra del drive.
6. Seleccionar si se desea conectar al arrancar el equipo.
7. Especificar usuario y contraseña.
4. Comunicaciones

Compartir Impresoras

Abrir el Navegador:

1. Seleccionar Red – Servidores.

2. Clic en TCP/IP para ver todos los servidores.

3. Clic derecho en NetServer y seleccionar Abrir.

4. Clic derecho en Objetos Compartidos y seleccionar Nuevo – Impresora.

5. Utilizar Propiedades Generales para configurar el nombre, descripción, cola


de salida, driver de la impresora, etc.
4. Comunicaciones

Configuración de la PC - Impresoras

1. Verificar que se tiene conexión con el System i – Ping.


2. Seleccionar Inicio – Buscar – Equipos o Personas – Un equipo en la red –
nombre del servidor netserver.
3. Doble click para seleccionar los recursos compartidos.
4. Click derecho en la impresora a compartir.
5. Instalar el driver de la impresora – AFP y SCS.

www.printers.ibm.com
Qca400\Win32\Install\Printer
5. Seguridad
5. Seguridad

Dando a Los Auditores Lo Que Solicitan


5. Seguridad

Mostrar información que comúnmente solicitan los molestos auditores.

1. Contraseñas por Omisión.

• Lista de todos los usuarios que utilizan la contraseña por omisión.


• Ocurren cuando son iguales al ID de Usuario.
• Son muy comunes ya que el sistema operativo la asigna al crear el ID de
Usuario.

Ejecutar el comando:

ANZDFTPWD ACTION(*NONE)

Crea un archivo de spool QPSECPWD con la lista de todos los usuarios con la
contraseña por omisión.

Puede deshabilitar los usuarios.

Lo mejor es que también genera un archivo físico QASECPWD en QUSRSYS.


5. Seguridad

2. Parámetros de Configuración de las Contraseñas.

Se puede obtener fácilmente con el Navegador, y crear un documento de Word:

a) Abrir un documento de Word.


b) Abrir el navegador y seguir la ruta Seguridad – Políticas – Contraseñas. Esta
ventana contiene 3 pestaña: General, Validación y Políticas de Expiración.
c) Clic en General. Se muestra el nivel de seguridad de contraseñas utilizado en
el sistema.
d) Presionar Alt-PrtSc para copiar la ventana completa al Clipboard de Windows.
e) En el documento de Word, seleccionar Paste.
f) Repetir los pasos d y e para las pestañas Validación y Políticas de Expiración.
5. Seguridad

3. Información de los Perfiles de Usuario.

Información referente a autorizaciones especiales asignadas a los usuarios.

a) Crear un archivo de información de perfiles de usuario (AIPU)


b) Fácil de crear:
DSPUSRPRF USRPRF(*ALL) TYPE(*BASIC) OUTPUT(*OUTFILE)
OUTFILE(lib/nombre_archivo)
c) En mi experiencia lo que más les interesa son los perfiles de usuario con
alguna de las siguientes clases o autorizaciones especiales:

• Clases de usuario *SECOFR (Oficial de Seguridad) o *PGMR (Programador).


• Autorizaciones especiales *ALLOBJ (All Objects) o *SECADM (Administrador
de
Seguridad).
• Usuarios con acceso a línea de comandos.
5. Seguridad

d) Para utilizar esta información se puede desarrollar un programa, ligar el


archivo a una base de datos de Access, o utilizar una de las 3 siguientes
sentencias SQL:
• Usuarios con Clases *SECOFR o *PGMR:
SELECT * FROM lib/nombre_archivo WHERE UPUSCL = '*SECOFR' OR
UPUSCL = '*PGMR‘
• Usuarios con autorizaciones especiales *ALLOBJ y/o *SECADM:
SELECT * FROM lib/nombre_archivo WHERE UPSPAU LIKE '%ALLOBJ%'
OR UPSPAU LIKE '%SECADM%‘
• Usuarios con autorización a línea de comandos:
SELECT * FROM LIB/FILENAME WHERE UPLTCP = '*NO‘
e) La parte más difícil es identificar cuales campos del archivo representan la
parte del perfil de usuario. Utilizar:
DSPFFD FILE(lib/nombre_archivo) OUTPUT(*PRINT)
5. Seguridad

4. Autorización para ciertos comandos.

Usuarios con acceso a comandos críticos del sistema, para trabajar con ‘jobs’, o el
scheduler, incluyendo:

• SBMJOB – Submitir trabajos.


• RLSJOB – Liberar trabajos.
• CHGJOB – Cambiar trabajos.
• ADDJOBSCDE – Adicionar trabajos al Scheduler.

Estos comandos indican quien puede ejecutar o manipular trabajos en el sistema.


Se puede imprimir la lista de usuarios autorizados y su autorización específica:

DSPOBJAUT OBJ(nombre_comando) OBJTYPE(*CMD) OUTPUT(*PRINT)


5. Seguridad

Los auditores quieren todo… y más.

Una cosa es segura con los auditores, no importa lo que les entreguen, siempre
quieren más. Pero si saben donde buscar la información, será sencillo actualizarla
cuando los auditores la requieran.
6. Trivia
6. Trivia

Base de Datos – Cierto o Falso

1. Join dinámico significa que el criterio no se aplica hasta que la consulta es


ejecutada.
2. Los triggers de SQL requieren que el journaling esté activo.
3. Existe una diferencia significativa entre DB2/400 y DB2 UDB para System i.
4. Es posible cambiar la longitud de un campo de un archivo físico sin
recompilarlo.
5. Las vistas de SQL no pueden ser indexadas.
6. Múltiples archivos planos pueden ser copiados en un archivo de DB2
utilizando el ‘Wildcard’ (*) en el comando CPYFRMSTMF.
7. El número de renglón no es soportado en DB2, y no existe forma de darle
vuelta.
8. “Índice Interno” significa que si DB2 genera un índice para forzar una
restricción referencial, el índice se oculta al usuario/administrador.

Potrebbero piacerti anche