segunda-feira, fevereiro 03, 2020

Gravar comandos da console no dataset

Depois de extensivas pesquisas, encontrei uma solução que, ao ser implementada, resolveu o meu problema. Imagine a seguinte circunstância: era necessário obter o resultado de um comando inserido no console e armazená-lo em um conjunto de dados (dataset) para posterior processamento por meio de um programa Natural, com o objetivo de apresentar as informações desejadas. No meu caso, precisava verificar se os aplicativos no mainframe estavam online, o que era visível ao executar o comando 'D A,L' no console. A questão era como capturar esse resultado na console e gravá-lo em um dataset.

Após dedicar um tempo significativo à pesquisa para solucionar esse desafio, encontrei um JCL (Job Control Language) que permitia obter o resultado do comando no console e gravá-lo em um dataset. Em seguida, usando um programa Natural, consegui realizar o filtro necessário para extrair as informações desejadas. No exemplo abaixo, demonstrarei como gravar no dataset a porcentagem de utilização do SMF:
MEMBER=@SDSF    000017 REC SAVE:03.05.2016 15:10 BY   USERID DBA2555  R=00000001
DSN=AAB.DIBD.JCLS                                LIB=S3 VOL=PRL303 UNIT=1526    
....+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8
//AAFSNATB JOB (AAF,TSS),'CLAU',CLASS=S,MSGCLASS=A                              
//*UQ ALLOW                                                                     
//* ----------------------------------------------------                        
//*            COMANDO DE JES2 - PELO SDSF                                      
//* ----------------------------------------------------                        
//SDSF    EXEC PGM=SDSF                                                         
//* ISFOUT  DD   SYSOUT=*                                                       
//ISFOUT  DD   DSN=AAF.S.TSSUSER4,DISP=SHR                                      
//LOGOUT  DD   SYSOUT=*                                                         
//ISFIN   DD *                                                                  
SET CONSOLE BATCH                                                               
SET DELAY 600                                                                   
/D SMF                                                                          
PRINT FILE CMDOUT                                                               
ULOG                                                                            
PRINT                                                                           
PRINT CLOSE

Após rodar esse job o dataset AAF.S.TSSUSER4 gravou essas informações - que a gente quer trabalhar no programa natural
  Menu  Utilities  Compilers  Help                                             
 -------------------------------------------------------------------------------
 BROWSE    AAF.S.TSSUSER4                             Line 00000180 Col 001 080 
                                                                                
 HQX7730 -----------------  SDSF PRIMARY OPTION MENU     COMMAND ISSUED         
 COMMAND INPUT ===>                                            SCROLL ===> PAGE 
 RESPONSE=CPAC                                                                  
  IEE949I 10.20.04 SMF DATA SETS 808                                            
            NAME      VOLSER SIZE(BLKS) %FULL  STATUS                           
          P-SYS1.MAN1 PRD27A    368640    46  ACTIVE                            
          S-SYS1.MAN2 PRD27A    368640     0  ALTERNATE                         
          S-SYS1.MAN3 PRD27A    368640     0  ALTERNATE                         
                                         NODE  Nodes                            
 LOG   System log                        SO    Spool offload                    
 SR    System requests                   SP    Spool volumes                    
 MAS   Members in the MAS                                                       
 JC    Job classes                       RM    Resource monitor                 
 SE    Scheduling environments           CK    Health checker                   
 RES   WLM resources                                                            
 ENC   Enclaves                          ULOG  User session log                 
 PS    Processes                                                                
 Command ===>                                                  Scroll ===> PAGE 
  F1=Help    F2=Split   F3=Exit    F5=Rfind   F7=Up      F8=Down    F9=Swap     
 F10=Left   F11=Right  F12=Cancel 

Este foi o programa Natural criado para pegar somente as informações do SMF que eu quero
 >                                       > +  Program     AAFSCSA1 Lib SUPORTE2 
 Top    ....+....1....+....2....+....3....+....4....+....5....+....6....+....7..
   0010 ** ----------------------------------------------------------------     
   0020 ** PROCEDIMENTO: FAZ UM FILTRO DO SMF RELATORIO % ATUAL                 
   0030 ** AUTOR       : CLAUDEMAR MARTINS DE SA                                
   0040 ** DATA        : 31/01/2020                                             
   0050 ** ----------------------------------------------------------------     
   0060 DEFINE DATA LOCAL                                                       
   0070 1 #CONT             (A04)                                               
   0080 1 #SMF1             (A88)                                               
   0090 1 REDEFINE #SMF1                                                        
   0100   2 FILLER           13X                                                
   0110   2 #NOME_SMF        (A09)                                              
   0120   2 FILLER           1X                                                 
   0130   2 #VOLSER          (A06)                                              
   0140   2 FILLER           1X                                                 
   0150   2 #SIZE            (A10)                                              
   0160   2 FILLER           1X                                                 
   0170   2 #FULL            (A5)                                               
   0180   2 FILLER           1X                                                 
   0190   2 #STATUS          (A9)                                               
   0200 ****                                                                    
   0210 1 #SMF2             (A88)                                               
   0220 1 REDEFINE #SMF2                                                        
   0230    2 FILLER           13X                                               
   0240    2 #NOME_SMF_2      (A09)                                             
   0250    2 FILLER           1X                                                
   0260    2 #VOLSER_2        (A06)                                             
   0270    2 FILLER           1X                                                
   0280    2 #SIZE_2          (A10)                                             
   0290    2 FILLER           1X                                                
   0300    2 #FULL_2          (A5)                                              
   0310    2 FILLER           1X                                                
   0320    2 #STATUS_2        (A9)                                              
   0330 END-DEFINE                                                              
   0340 * ---------------------------------------------------------------       
   0350     READ WORK FILE 1 #SMF1 #CONT                                        
   0360     IF #NOME_SMF = 'SYS1.MAN1' OR = 'SYS1.MAN2' OR = 'SYS1.MAN3'        
   0370 * ---------------------------------------------------------------       
   0380    MOVE #NOME_SMF TO #NOME_SMF_2                                        
   0390    MOVE #VOLSER   TO #VOLSER_2                                          
   0400    MOVE #SIZE     TO #SIZE_2                                            
   0410    MOVE #FULL     TO #FULL_2                                            
   0420    MOVE #STATUS   TO #STATUS_2                                          
   0430 * ---------------------------------------------------------------       
   0440      WRITE WORK FILE 2 #SMF2                                            
   0450 * ---------------------------------------------------------------       
   0460 END-IF                                                                  
   0470 END-WORK                                                                
   0480 END 

Rodando este JCL (pois vou gravar em um arquivo temporario) e vou usar o filtro que vamos usar do programa Natural
 //AAFSNATB JOB (AABS,DIST),CLAUDEMAR,CLASS=S,MSGCLASS=A                        
 //*UQ ALLOW                                                                    
 //* ----------------------------------------------------------------           
 //*         CHECANDO OS APLICATIVOS ONLINE NO MAINFRAME                        
 //* ----------------------------------------------------------------           
 //SDSF     EXEC PGM=SDSF                                                       
 //ISFOUT   DD DSN=&&TEMP01,DISP=(NEW,PASS),SPACE=(CYL,2),UNIT=SYSDA,           
 //            DCB=(LRECL=133,BLKSIZE=1330,RECFM=FBA)                           
 //ISFIN    DD *                                                                
 SET CONSOLE BATCH                                                              
 SET DELAY 600                                                                  
 ULOG                                                                           
 /D SMF                                                                         
 END                                                                            
 //* ----------------------------------------------------------------           
 //*           FAZENDO UM FILTRO PARA COLETAR AS INFORMACOES                    
 //* ----------------------------------------------------------------           
 //NATD EXEC NATURAL,PARM1='SYS=D,MT=0,STACK=(LOGON SUPORTE2)'                  
 //CMWKF01  DD DSN=&&TEMP01,DISP=SHR                                            
 //CMWKF02  DD SYSOUT=G                                                         
 //SYSOUT   DD SYSOUT=*                                                         
 //SYSPRINT DD SYSOUT=*                                                         
 //CMPRT01  DD SYSOUT=* 
 //SYSIN    DD *                                                                
 AAFSCSA1                                                                       
 /*

Este é o resultado que vai sair da sysout do job
             SYS1.MAN1 PRD27A    368640     0  ALTERNATE                        
             SYS1.MAN2 PRD27A    368640    38  ACTIVE                           
             SYS1.MAN3 PRD27A    368640     0  ALTERNATE                        
UQS0009 - END OF DATA SET.                                                      
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
--------------------------------------------------------------------------------
OP=S CL=ALL IN=ALL JB=AAFSNATB,05777 DS=2 SI=SO LR=1 LL=80 PP=0 DC= RL=999999   
AD=J DE= SC= PT= SQ=C RR=0 OC= SD=2000   03.02.2020,  9:42:25                   

Depois de conseguir fazer isso foi um passo enviar e-mail para monitorar os aplicativos online no mainframe.

1 comentário: