顯示具有 STRWCH 標籤的文章。 顯示所有文章
顯示具有 STRWCH 標籤的文章。 顯示所有文章

星期四, 11月 30, 2023

Using Event Watches on the IBM iSeries

For example: In this case, when the message CPF4128 appears in any job log.

STRWCH SSNID(WCHCPF4128)
  WCHPGM(QGPL/WCHCPF4128)
  WCHMSG((CPF4128))
  WCHMSGQ((*JOBLOG))
  WCHJOB((*ALL/*ALL))

Sample Watch Exit Program



/***********************************************************************/
/*             Author:   Vernon M. Hamberg                             */
/*       Date written:   07/11/2011                                    */
/*            Purpose:   Sample exit program for watches               */
/*                                                                     */
/*               Note:   Minimum release for this code is V5R4. The    */
/*                       variables are declared with *DEFINED and      */
/*                       *BASED storage, and pointers are used for     */
/*                       variable-length variables. Since watches were */
/*                       first introduced at V5R4, this code can be    */
/*                       used as is.                                   */
/*                                                                     */
/*            Version:   1.00                                          */
/*               Desc:   Initial sample source                         */
/***********************************************************************/
PGM        PARM(&WCHOPTSET &SESSID &ERRDTCT &EVTDTA)

/* Parameters */
DCL        VAR(&WCHOPTSET) TYPE(*CHAR) LEN(10)
DCL        VAR(&SESSID) TYPE(*CHAR) LEN(10)
DCL        VAR(&ERRDTCT) TYPE(*CHAR) LEN(10)
DCL        VAR(&EVTDTA) TYPE(*CHAR) LEN(2048) /* This should be long +
         enough to handle most situations, since the fixed portion +
         is around 450 bytes long - modify as needed */

/* Doesn't work to use *DEFINED on an incoming parameter */
DCL        VAR(&EVTDTADFND) TYPE(*CHAR) LEN(2048)

/* Event data elements - fixed-length data */
DCL        VAR(&LENWCHINF) TYPE(*INT) STG(*DEFINED) LEN(4) +
         DEFVAR(&EVTDTADFND 1)
DCL        VAR(&MSGID) TYPE(*CHAR) STG(*DEFINED) LEN(7) +
         DEFVAR(&EVTDTADFND 5)
DCL        VAR(&RSVD1) TYPE(*CHAR) STG(*DEFINED) LEN(1) +
         DEFVAR(&EVTDTADFND 12)
DCL        VAR(&MSGQNAM) TYPE(*CHAR) STG(*DEFINED) LEN(10) +
         DEFVAR(&EVTDTADFND 13)
DCL        VAR(&MSGQLIB) TYPE(*CHAR) STG(*DEFINED) LEN(10) +
         DEFVAR(&EVTDTADFND 23)
DCL        VAR(&JOBNAM) TYPE(*CHAR) STG(*DEFINED) LEN(10) +
         DEFVAR(&EVTDTADFND 33)
DCL        VAR(&JOBUSR) TYPE(*CHAR) STG(*DEFINED) LEN(10) +
         DEFVAR(&EVTDTADFND 43)
DCL        VAR(&JOBNBR) TYPE(*CHAR) STG(*DEFINED) LEN(6) +
         DEFVAR(&EVTDTADFND 53)
DCL        VAR(&RSVD2) TYPE(*CHAR) STG(*DEFINED) LEN(4) +
         DEFVAR(&EVTDTADFND 59)
DCL        VAR(&SNDPGMNAM) TYPE(*CHAR) STG(*DEFINED) LEN(256) +
         DEFVAR(&EVTDTADFND 63)
DCL        VAR(&SNDMODNAM) TYPE(*CHAR) STG(*DEFINED) LEN(10) +
         DEFVAR(&EVTDTADFND 319)
DCL        VAR(&OFSSNDPRC) TYPE(*INT) STG(*DEFINED) LEN(4) +
         DEFVAR(&EVTDTADFND 329)
DCL        VAR(&LENSNDPRC) TYPE(*INT) STG(*DEFINED) LEN(4) +
         DEFVAR(&EVTDTADFND 333)
DCL        VAR(&RCVPGMNAM) TYPE(*CHAR) STG(*DEFINED) LEN(10) +
         DEFVAR(&EVTDTADFND 337)
DCL        VAR(&RCVMODNAM) TYPE(*CHAR) STG(*DEFINED) LEN(10) +
         DEFVAR(&EVTDTADFND 347)
DCL        VAR(&OFSRCVPRC) TYPE(*INT) STG(*DEFINED) LEN(4) +
         DEFVAR(&EVTDTADFND 357)
DCL        VAR(&LENRCVPRC) TYPE(*INT) STG(*DEFINED) LEN(4) +
         DEFVAR(&EVTDTADFND 361)
DCL        VAR(&MSGSEV) TYPE(*INT) STG(*DEFINED) LEN(4) +
         DEFVAR(&EVTDTADFND 365)
DCL        VAR(&MSGTYP) TYPE(*CHAR) STG(*DEFINED) LEN(10) +
         DEFVAR(&EVTDTADFND 369)
DCL        VAR(&MSGTIMSTP) TYPE(*CHAR) STG(*DEFINED) LEN(8) +
         DEFVAR(&EVTDTADFND 379)
DCL        VAR(&MSGKEY) TYPE(*CHAR) STG(*DEFINED) LEN(4) +
         DEFVAR(&EVTDTADFND 387)
DCL        VAR(&MSGFNAM) TYPE(*CHAR) STG(*DEFINED) LEN(10) +
         DEFVAR(&EVTDTADFND 391)
DCL        VAR(&MSGFLIB) TYPE(*CHAR) STG(*DEFINED) LEN(10) +
         DEFVAR(&EVTDTADFND 401)
DCL        VAR(&RSVD3) TYPE(*CHAR) STG(*DEFINED) LEN(2) +
         DEFVAR(&EVTDTADFND 411)
DCL        VAR(&OFSCMPDTA) TYPE(*INT) STG(*DEFINED) LEN(4) +
         DEFVAR(&EVTDTADFND 413)
DCL        VAR(&LENCMPDTA) TYPE(*INT) STG(*DEFINED) LEN(4) +
         DEFVAR(&EVTDTADFND 417)
DCL        VAR(&CMPAGAINST) TYPE(*CHAR) STG(*DEFINED) LEN(10) +
         DEFVAR(&EVTDTADFND 421)
DCL        VAR(&RSVD4) TYPE(*CHAR) STG(*DEFINED) LEN(2) +
         DEFVAR(&EVTDTADFND 431)
DCL        VAR(&CMPDTACSID) TYPE(*INT) STG(*DEFINED) LEN(4) +
         DEFVAR(&EVTDTADFND 433)
DCL        VAR(&OFSCDTAFND) TYPE(*INT) STG(*DEFINED) LEN(4) +
         DEFVAR(&EVTDTADFND 437)
DCL        VAR(&OFSRPLDTA) TYPE(*INT) STG(*DEFINED) LEN(4) +
         DEFVAR(&EVTDTADFND 441)
DCL        VAR(&LENRPLDTA) TYPE(*INT) STG(*DEFINED) LEN(4) +
         DEFVAR(&EVTDTADFND 445)
DCL        VAR(&RPLDTACSID) TYPE(*INT) STG(*DEFINED) LEN(4) +
         DEFVAR(&EVTDTADFND 449)
DCL        VAR(&SNDUSRPRF) TYPE(*CHAR) STG(*DEFINED) LEN(10) +
         DEFVAR(&EVTDTADFND 453) /* 6.1 */
DCL        VAR(&TGTJOBNAM) TYPE(*CHAR) STG(*DEFINED) LEN(10) +
         DEFVAR(&EVTDTADFND 463) /* 6.1 */
DCL        VAR(&TGTJOBUSR) TYPE(*CHAR) STG(*DEFINED) LEN(10) +
         DEFVAR(&EVTDTADFND 473) /* 6.1 */
DCL        VAR(&TGTJOBNBR) TYPE(*CHAR) STG(*DEFINED) LEN(6) +
         DEFVAR(&EVTDTADFND 483) /* 6.1 */

/* Event DATA elements - variable-length data */
DCL        VAR(&PSNDPRCNAM) TYPE(*PTR)
DCL        VAR(&BSNDPRCNAM) TYPE(*CHAR) STG(*BASED) LEN(256) +
         BASPTR(&PSNDPRCNAM)
DCL        VAR(&SNDPRCNAM) TYPE(*CHAR) LEN(256)

DCL        VAR(&PRCVPRCNAM) TYPE(*PTR)
DCL        VAR(&BRCVPRCNAM) TYPE(*CHAR) STG(*BASED) LEN(256) +
         BASPTR(&PRCVPRCNAM)
DCL        VAR(&RCVPRCNAM) TYPE(*CHAR) LEN(256)

DCL        VAR(&PMSGCMPDTA) TYPE(*PTR)
DCL        VAR(&BMSGCMPDTA) TYPE(*CHAR) STG(*BASED) LEN(72) +
         BASPTR(&PMSGCMPDTA)
DCL        VAR(&MSGCMPDTA) TYPE(*CHAR) LEN(72)

DCL        VAR(&PMSGRPLDTA) TYPE(*PTR)
DCL        VAR(&BMSGRPLDTA) TYPE(*CHAR) STG(*BASED) LEN(512) +
         BASPTR(&PMSGRPLDTA)
DCL        VAR(&MSGRPLDTA) TYPE(*CHAR) LEN(512)

/* Job attributes */
DCL        VAR(&WCHJOBNAM) TYPE(*CHAR) LEN(10)
DCL        VAR(&WCHJOBUSR) TYPE(*CHAR) LEN(10)
DCL        VAR(&WCHJOBNBR) TYPE(*CHAR) LEN(6)

/* Copy parameter to work data */
CHGVAR     VAR(&EVTDTADFND) VALUE(&EVTDTA)

/* Set pointers to variable-length data */
/* Sending procedure name */
CHGVAR     VAR(&PSNDPRCNAM) VALUE(%ADDR(&EVTDTADFND))
CHGVAR     VAR(%OFS(&PSNDPRCNAM)) VALUE(%OFS(&PSNDPRCNAM) + &OFSSNDPRC)

IF         COND(&LENSNDPRC *GT 0) THEN(DO)
CHGVAR     VAR(&SNDPRCNAM) VALUE(%SST(&BSNDPRCNAM 1 &LENSNDPRC))
ENDDO

/* Receiving procedure name */
CHGVAR     VAR(&PRCVPRCNAM) VALUE(%ADDR(&EVTDTADFND))
CHGVAR     VAR(%OFS(&PRCVPRCNAM)) VALUE(%OFS(&PRCVPRCNAM) + &OFSRCVPRC)

IF         COND(&LENSNDPRC *GT 0) THEN(DO)
CHGVAR     VAR(&RCVPRCNAM) VALUE(%SST(&BRCVPRCNAM 1 &LENRCVPRC))
ENDDO

/* Message compare data */
CHGVAR     VAR(&PMSGCMPDTA) VALUE(%ADDR(&EVTDTADFND))
CHGVAR     VAR(%OFS(&PMSGCMPDTA)) VALUE(%OFS(&PMSGCMPDTA) + &OFSCMPDTA)

IF         COND(&LENSNDPRC *GT 0) THEN(DO)
CHGVAR     VAR(&MSGCMPDTA) VALUE(%SST(&BMSGCMPDTA 1 &LENCMPDTA))
ENDDO

/* Message replacement data */
CHGVAR     VAR(&PMSGRPLDTA) VALUE(%ADDR(&EVTDTADFND))
CHGVAR     VAR(%OFS(&PMSGRPLDTA)) VALUE(%OFS(&PMSGRPLDTA) + &OFSRPLDTA)

IF         COND(&LENSNDPRC *GT 0) THEN(DO)
CHGVAR     VAR(&MSGRPLDTA) VALUE(%SST(&BMSGRPLDTA 1 &LENRPLDTA))
ENDDO

/* Here is where the action happens. Some things */
/* that might be done are to print the job log,  */
/* print a dump of this program, check object    */
/* locks, etc. This all depends on the kind of   */
/* message that is defined in the watch.         */

/* Print job log where error occurred */
DSPJOBLOG  JOB(&JOBNBR/&JOBUSR/&JOBNAM) OUTPUT(*PRINT)

/* Dump the variables in this program */
DMPCLPGM

/* Notify system operator that error occurred */
/* and point to spooled output from this job  */
RTVJOBA    JOB(&WCHJOBNAM) USER(&WCHJOBUSR) NBR(&WCHJOBNBR)
SNDPGMMSG  MSG('Error occurred in job ' *CAT &JOBNBR *TCAT '/' *CAT +
         &JOBUSR *TCAT '/' *CAT &JOBNAM *TCAT ' - WRKJOB ' *CAT +
         &WCHJOBNBR *TCAT '/' *CAT &WCHJOBUSR *TCAT '/' *CAT +
         &WCHJOBNAM *TCAT ' OPTION(*SPLF) and WRKJOB ' *CAT &JOBNBR +
         *TCAT '/' *CAT &JOBUSR *TCAT '/' *CAT &JOBNAM *TCAT ' to +
         see more information.') TOMSGQ(*SYSOPR)

/* Return blank for error-detected, */
/* so that watch is not ended       */
CHGVAR     VAR(&ERRDTCT) VALUE(' ')

ENDPGM




星期四, 11月 09, 2023

2016-02-02 即時監控工作站錯誤訊息 CPF5140,並終止該工作站


即時監控工作站錯誤訊息 CPF5140,並終止該工作站

Monitor interactive job which got CPF5140 error message and end it
即時監控工作站錯誤訊息 CPF5140,並終止該工作站。
因為使用者有時會因等待輸入暫停過久,直接將5250工作站直接點擊右上角關閉方塊,
此時系統會拋出 CPF5140 錯誤,此時若該工作站正執行大量資料的存取,系統仍會繼續
執行,但最終仍無法傳回資訊,導致系統浪費資源,要防止此狀況發生,就須即時監控並
終止該工作站 JOB。


File  : QCLSRC
Member: WCHCPF5140
Type  : CLP
Usage : CRTCLPGM PGM(QGPL/WCHCPF5140)
        Start 
		  STRWCH SSNID(WCHCPF5140) WCHPGM(QGPL/WCHCPF5140)                 
          WCHMSG((CPF5140))                                         
          WCHMSGQ((*JOBLOG))                                        
          WCHJOB((*ALL/*ALL/*ALL))
		End
		  WRKWCH *ALL use option 2 to End Watch
		
        




/* ================================================================ */
/*                                                                  */
/* Program    : WCHCPF5140                                          */
/*                                                                  */
/* Description: Monitor interactive job which got CPF5410           */
/*              and end it to prevent system from high CPU usage    */
/*                                                                  */
/* Date       : 2016/02/01                                          */
/*                                                                  */
/* Author     : Vengoal Chang                                       */
/* ================================================================ */
/*                                                                  */
/*                                                                  */
/* CRTCLPGM PGM(WCHCPF5140)                                         */
/*                                                                  */
/*                                                                  */
/* STRWCH SSNID(WCHCPF5140) WCHPGM(QGPL/WCHCPF5140)                 */
/*        WCHMSG((CPF5140))                                         */
/*        WCHMSGQ((*JOBLOG))                                        */
/*        WCHJOB((*ALL/*ALL/*ALL))                                  */
/*                                                                  */
/* ================================================================ */

     Pgm        Parm(&Type &Session &Error &Data)
     Dcl        Var(&Type)      Type(*Char) Len(10)
     Dcl        Var(&Session)   Type(*Char) Len(10)
     Dcl        Var(&Error)     Type(*Char) Len(10)
     Dcl        Var(&Data)      Type(*Char) Len(2000)

     Dcl        Var(&LenEvtDta) Type(*Int)  Len(4) +
                     Stg(*Defined) DefVar(&Data   1)
     Dcl        Var(&Job)       Type(*Char) Len(10) +
                     Stg(*Defined) DefVar(&Data 33)
     Dcl        Var(&User)      Type(*Char) Len(10) +
                     Stg(*Defined) DefVar(&Data 43)
     Dcl        Var(&Nbr )      Type(*Char) Len( 6) +
                     Stg(*Defined) DefVar(&Data 53)
     Dcl        Var(&MSGID)     Type(*Char) Len(7) +
                     Stg(*Defined) DefVar(&Data 5)
     Dcl        Var(&MsgF)      Type(*Char) Len(10) +
                     Stg(*Defined) DefVar(&Data 391)
     Dcl        Var(&MsgFLib)   Type(*Char) Len(10) +
                     Stg(*Defined) DefVar(&Data 401)
     Dcl        Var(&OffRplDta) Type(*Int)  Len(4) +
                     Stg(*Defined) DefVar(&Data 441)
     Dcl        Var(&LenRplDta) Type(*Int)  Len(4) +
                     Stg(*Defined) DefVar(&Data 445)
     Dcl        Var(&OrgLenRpl) Type(*Int)  Len(4) +
                     Stg(*Defined) DefVar(&Data 59)

     Dcl        Var(&MsgDtaPtr) Type(*Ptr)
     Dcl        Var(&MsgDta)    Type(*Char) Len(1010) +
                     Stg(*Based)   BasPtr(&MsgDtaPtr)

     /* CPF5140 char data */
     Dcl        Var(&MsgUser  )    Type(*Char) Len(10) +
                     Stg(*Defined) DefVar(&MsgDta  1)
     Dcl        Var(&Host     ) Type(*Char) Len(255) +
                     Stg(*Defined) DefVar(&MsgDta 11)

     Dcl        Var(&QualMsgf)   Type(*Char) Len(20)
     Dcl        Var(&MsgTxt )    Type(*Char) Len(1024)
     Dcl        Var(&Rtvm0100  ) Type(*Char) Len(1024)
     Dcl        Var(&RplDta )    Type(*Char) Len(1024)
     Dcl        Var(&SysValTo)   Type(*Char) Len(500)
     Dcl        VAR(&MsgTxtLenC) Type(*Char) Len(4)
     Dcl        VAR(&MsgTxtLen ) Type(*Dec ) Len(5 0)
     Dcl        VAR(&RplDtaLenC) Type(*Char) Len(4)
     Dcl        VAR(&ErrCode)    Type(*Char) Len(15) /* Error Code */

/* Check to make sure this is a *MSGID watch                         */
    If         Cond(&Type = '*MSGID') Then(Do)
/* Check to make sure this is for CPF5140                            */

     If      Cond(&MsgID = 'CPF5140') Then(Do)

             ChgVar Var(&MsgDtaPtr) Value(%Addr(&Data))
             Chgvar Var(%Offset(&MsgDtaPtr)) +
                    Value(%Offset(&MsgDtaPtr) + &OffRplDta)

             ChgVar &RplDta       %sst(&MsgDta 1 &LenRplDta)
             ChgVar &QualMsgf     (&MsgF *Cat &MsgFLib)

             ChgVar     %BIN(&MSGTXTLENC)        1024
             ChgVar     %BIN(&RplDtaLenC)        &LenRplDta
             ChgVar     %BIN(&ErrCode     1  4)    15
             Call       QMHRTVM ( +
                                 &Rtvm0100               +
                                 &MsgTxtLenC             +
                                 'RTVM0100'              +
                                 &MSGID                  +
                                 &QUALMSGF               +
                                 &RplDta                 +
                                 &RplDtaLenC             +
                                 '*YES      '            +
                                 '*NO       '            +
                                 &Errcode)

             ChgVar &MsgTxtLenC    %SST(&Rtvm0100  9 4)
             ChgVar &MsgTxtLen     %BIN(&MsgTxtLenC)
             ChgVar &MsgTxt (&MSGID *CAT ':' *BCAT               +
                             %SST(&Rtvm0100 25 &MsgTxtLen) *BCAT  +
                             'Job ' *BCAT    +
                      &Nbr *CAT '/' *CAT &User *Tcat '/' *CAT &Job +
                      *BCAT 'was ended by watch program')

             EndJob     Job(&NBR/&USER/&JOB) Option(*IMMED)
             MonMsg     CPF0000
             SndPgmMsg  MsgId(CPF9898) Msgf(QCPFMSG) MsgDta(&MsgTxt) +

                          ToUsr(*SYSOPR)

     EndDo

    EndDo /* End If &Type = *MSGID */

    ChgVar       Var(&Error) Value('          ')
    EndPgm



						
						


參照: STRWCH - Watch Exit Programs Explained with CL Example





星期三, 11月 08, 2023

2011-09-27 如何收集使用者透過非 5250 終端機模式存取系統資源(DB, Data queue...) 的相關資訊(IP, user ,job ) ?


如何收集使用者透過非 5250 終端機模式存取系統資源(DB, Data queue...) 的相關資訊(IP, user ,job ) ?

從 V5R4 後系統即時提供監控 System QHST log 或 任何一個 Job 的 job log 的 Message ID,我們可以透過
這個機制來收集非 5250 終端機模式存取系統資源(DB, Data queue...) 的相關資訊(IP, user ,job )。
1. 程式 WCHCPIAD09 監控 HSTLOG MSGID CPIAD09 訊息 User &4 from client &8 connected to job &3/&2/&1 in subsystem &6 in &7 on &5.
   會傳送 CPIAD09 至 HSTLOG 的相關JOB 有透過 JDBC或ODBC存取資料庫,Client Access 檔案上下傳,透過 TCPIP DDM 存取 AS/400 Data queue等的 Job.
2. 程式 WCHCPIAD12 監控 QZLSFILE JOB LOG MSGID CPIAD12 訊息 Servicing user profile &1 from client &2.
   會傳送 CPIAD09 至 Job log 有透過 Net Server 網路芳鄰存取 AS/400 IFS 目錄檔案等相關的 Job.
   
上述二支程式會使用到 CVTDTS command,請參照  2011-08-12 如何將 DTS 格式的時間...  
上述二支程式會將訊息中的變數記錄在 QGPL/CNNLOGP 檔案中。可以使用 DSPPFM QGPL/CNNLOGP 檢視紀錄。
使用 WRKWCH WCH(*ALL) 檢視執行狀況,如下畫面:
                              Work with Watches                                
                                                            System:   SYSNAME  
Type options, press Enter.                                                     
  1=Start   2=End   5=Display                                                  
                                                                               
Opt    Type/Session                     Origin        User          Status     
                                                                               
       STRWCH                                                                  
         WCHCPIAD09                     STRWCH        VENGOAL       ACTIVE     
         WCHCPIAD12                     STRWCH        VENGOAL       ACTIVE     
                                                                               
                                                                               
                                                                               
                                                                               
                                                                               
                                                                               
                                                                               
                                                                               
                                                                               
                                                                        Bottom 
Parameters or command                                                          
===>                                                                           
F1=Help   F3=Exit   F4=Prompt   F5=Refresh   F9=Retrieve   F12=Cancel          


File  : QCLSRC

Member: WCHCPIAD09

Type  : CLP

Usage : CRTCLPGM QGPL/WCHCPIAD09

        執行 Command:
        STRWCH SSNID(WCHCPIAD09) WCHPGM(QGPL/WCHCPIAD09)                 
               WCHMSG((CPIAD09))                                         
               WCHMSGQ((*HSTLOG))
OS    : V5R4

/* ================================================================ */
/*                                                                  */
/* Program    : WCHCPIAD09                                          */
/*                                                                  */
/* Description: Monitor QHST log msgid CPIAD09 for job QZDASOINIT   */
/*                                                     QZHQSSRV     */
/*                                                     QNPSERVS     */
/*                                                     QZRCSRVS     */
/*                                                     QTFPJTCP     */
/*                                                     QPWFSERVSO   */
/*              Log connect user, client ip, job information        */
/*              to file QGPL/CNNLOGP.                               */
/*                                                                  */
/* Date       : 2011/08/24                                          */
/*                                                                  */
/* Author     : Vengoal Chang                                       */
/* ================================================================ */
/*                                                                  */
/*                                                                  */
/* CRTCLPGM PGM(WCHCPIAD09)                                         */
/*                                                                  */
/* Use following command to find what job issue CPIAD12 to job log  */
/* and issue CPIAD09 to history log.                                */
/*                                                                  */
/* DSPLOG PERIOD((*AVAIL *CURRENT) (*AVAIL *CURRENT)) MSGID(CPIAD09)*/
/* then record job name and append to STRWCH command parameter      */
/* WCHJOB                                                           */
/*                                                                  */
/* QZLSFILE job don't send CPIAD09 to history log.                  */
/* so need monitor CPIAD12 for job QZLSFILE                         */
/*                                                                  */
/* Before run STRWCH command, first create cnnlogp                  */
/* CRTPF QGPL/CNNLOGP RCDLEN(512)                                   */
/* log data is msgid CPIAD09 + message replacement data             */
/*  &1       *CHAR            10    jobname                         */
/*  &2       *CHAR            10    jobuser                         */
/*  &3       *CHAR             6    jobnumber                       */
/*  &4       *CHAR            10    current connect user            */
/*  &5       *DTS                   convert to YYYYMMDDHHMISS       */
/*  &6       *CHAR            10    subsystem                       */
/*  &7       *CHAR            10    subsystem library               */
/*  &8       *CHAR           255    client ip                       */
/*                                                                  */
/* STRWCH SSNID(WCHCPIAD09) WCHPGM(QGPL/WCHCPIAD09)                 */
/*        WCHMSG((CPIAD09))                                         */
/*        WCHMSGQ((*HSTLOG))                                        */
/*                                                                  */
/* ================================================================ */

     Pgm        Parm(&Type &Session &Error &Data)
     Dcl        Var(&Type)      Type(*Char) Len(10)
     Dcl        Var(&Session)   Type(*Char) Len(10)
     Dcl        Var(&Error)     Type(*Char) Len(10)
     Dcl        Var(&Data)      Type(*Char) Len(2000)

     Dcl        Var(&LenEvtDta) Type(*Int)  Len(4) +
                     Stg(*Defined) DefVar(&Data   1)
     Dcl        Var(&Job)       Type(*Char) Len(10) +
                     Stg(*Defined) DefVar(&Data 33)
     Dcl        Var(&User)      Type(*Char) Len(10) +
                     Stg(*Defined) DefVar(&Data 43)
     Dcl        Var(&Nbr )      Type(*Char) Len( 6) +
                     Stg(*Defined) DefVar(&Data 53)
     Dcl        Var(&MSGID)     Type(*Char) Len(7) +
                     Stg(*Defined) DefVar(&Data 5)
     Dcl        Var(&MsgF)      Type(*Char) Len(10) +
                     Stg(*Defined) DefVar(&Data 391)
     Dcl        Var(&MsgFLib)   Type(*Char) Len(10) +
                     Stg(*Defined) DefVar(&Data 401)
     Dcl        Var(&OffRplDta) Type(*Int)  Len(4) +
                     Stg(*Defined) DefVar(&Data 441)
     Dcl        Var(&LenRplDta) Type(*Int)  Len(4) +
                     Stg(*Defined) DefVar(&Data 445)
     Dcl        Var(&OrgLenRpl) Type(*Int)  Len(4) +
                     Stg(*Defined) DefVar(&Data 59)

     Dcl        Var(&MsgDtaPtr) Type(*Ptr)
     Dcl        Var(&MsgDta)    Type(*Char) Len(1010) +
                     Stg(*Based)   BasPtr(&MsgDtaPtr)

     /* CPIAD12 char data */
     Dcl        Var(&MsgUser  )    Type(*Char) Len(10) +
                     Stg(*Defined) DefVar(&MsgDta  1)
     Dcl        Var(&Host     ) Type(*Char) Len(255) +
                     Stg(*Defined) DefVar(&MsgDta 11)

     Dcl        Var(&MsgTxt )    Type(*Char) Len(1024)
     Dcl        Var(&Rtvm0100  ) Type(*Char) Len(1024)
     Dcl        Var(&RplDta )    Type(*Char) Len(1024)
     Dcl        Var(&MsgTxtLenC) Type(*Char) Len(4)
     Dcl        Var(&MsgTxtLen ) Type(*Dec ) Len(5 0)
     Dcl        Var(&RplDtaLenC) Type(*Char) Len(4)
     Dcl        Var(&ErrCode)    Type(*Char) Len(15) /* Error Code */

     Dcl        Var(&DQ)         Type(*Char) Len(1) VALUE('"')
     Dcl        Var(&CMD)        Type(*Char) Len(5000)
     Dcl        Var(&REDIR)      Type(*Char) Len(100)
     Dcl        Var(&MSGDTS)     Type(*Char) Len(8)
     Dcl        Var(&MSGYMD)     Type(*Char) Len(8)
     Dcl        Var(&MSGHMS)     Type(*Char) Len(6)

/* Check to make sure this is a *MSGID watch                         */
    If         Cond(&Type = '*MSGID') Then(Do)
/* Check to make sure this is for CPIAD09                            */

     If      Cond(&MsgID = 'CPIAD09') Then(Do)

             ChkObj     Obj(Qgpl/CnnLogP) ObjType(*File)
             MonMsg Cpf9801 *N Do
               CrtPf Qgpl/CnnLogP RcdLen(512)
             EndDo

             ChgVar Var(&MsgDtaPtr) Value(%Addr(&Data))
             Chgvar Var(%Offset(&MsgDtaPtr)) +
                    Value(%Offset(&MsgDtaPtr) + &OffRplDta)

             ChgVar Var(&RplDta)     Value(%sst(&MsgDta 1 &LenRplDta))

             ChgVar     Var(&Cmd) Value('print' *BCAT &DQ)

             ChgVar     Var(&ReDir) VALUE('>> /qsys.lib/' *CAT +
                          'QGPL'   *TCAT '.lib/' *CAT 'CNNLOGP' +
                          *TCAT '.file/' *CAT 'cnnlogp' *TCAT '.mbr')

             ChgVar     &MsgDts %SST(&RplDta 37 8)
             CvtDts     Dts(&MsgDts) RtnDate(&MsgYmd) RtnTime(&MsgHms)

             ChgVar     &CMD                                          +
                          (&CMD *TCAT &MsgId *TCAT %SST(&RplDta 1 36) +
                                *CAT  &MsgYmd *CAT &MsgHms            +
                                *CAT  %SST(&RplDta 45 275)            +
                                *TCAT  &Dq *BCAT &ReDir)

             StrQsh     Cmd(&CMD)
     EndDo

    EndDo /* End If &Type = *MSGID */

    ChgVar       Var(&Error) Value('          ')
    EndPgm


File  : QCLSRC

Member: WCHCPIAD12

Type  : CLP

Usage : CRTCLPGM QGPL/WCHCPIAD12

        執行 Command:
        STRWCH SSNID(WCHCPIAD12) WCHPGM(QGPL/WCHCPIAD12)          
        WCHMSG((CPIAD12))                                         
        WCHMSGQ((*JOBLOG))                                        
        WCHJOB((*ALL/*ALL/QZLSFILE))                              
OS    : V5R4

/* ================================================================ */
/*                                                                  */
/* Program    : WCHCPIAD12                                          */
/*                                                                  */
/* Description: Monitor QZLSFILE   job log msgid CPIAD12            */
/*              Log connect user, client ip, job information        */
/*              to file QGPL/CNNLOGP.                               */
/*                                                                  */
/* Date       : 2011/08/23                                          */
/*                                                                  */
/* Author     : Vengoal Chang                                       */
/* ================================================================ */
/*                                                                  */
/*                                                                  */
/* CRTCLPGM PGM(WCHCPIAD12)                                         */
/*                                                                  */
/*                                                                  */
/* QZLSFILE job only send CPIAD12 to job log.                       */
/*                                                                  */
/* STRWCH SSNID(WCHCPIAD12) WCHPGM(QGPL/WCHCPIAD12)                 */
/*        WCHMSG((CPIAD12))                                         */
/*        WCHMSGQ((*JOBLOG))                                        */
/*        WCHJOB((*ALL/*ALL/QZLSFILE))                              */
/*                                                                  */
/* ================================================================ */

     Pgm        Parm(&Type &Session &Error &Data)
     Dcl        Var(&Type)      Type(*Char) Len(10)
     Dcl        Var(&Session)   Type(*Char) Len(10)
     Dcl        Var(&Error)     Type(*Char) Len(10)
     Dcl        Var(&Data)      Type(*Char) Len(2000)

     Dcl        Var(&LenEvtDta) Type(*Int)  Len(4) +
                     Stg(*Defined) DefVar(&Data   1)
     Dcl        Var(&Job)       Type(*Char) Len(10) +
                     Stg(*Defined) DefVar(&Data 33)
     Dcl        Var(&User)      Type(*Char) Len(10) +
                     Stg(*Defined) DefVar(&Data 43)
     Dcl        Var(&Nbr )      Type(*Char) Len( 6) +
                     Stg(*Defined) DefVar(&Data 53)
     Dcl        Var(&MSGID)     Type(*Char) Len(7) +
                     Stg(*Defined) DefVar(&Data 5)
     Dcl        Var(&MsgDts)      Type(*Char) Len(8) +
                     Stg(*Defined) DefVar(&Data 379)
     Dcl        Var(&MsgF)      Type(*Char) Len(10) +
                     Stg(*Defined) DefVar(&Data 391)
     Dcl        Var(&MsgFLib)   Type(*Char) Len(10) +
                     Stg(*Defined) DefVar(&Data 401)
     Dcl        Var(&OffRplDta) Type(*Int)  Len(4) +
                     Stg(*Defined) DefVar(&Data 441)
     Dcl        Var(&LenRplDta) Type(*Int)  Len(4) +
                     Stg(*Defined) DefVar(&Data 445)
     Dcl        Var(&OrgLenRpl) Type(*Int)  Len(4) +
                     Stg(*Defined) DefVar(&Data 59)

     Dcl        Var(&MsgDtaPtr) Type(*Ptr)
     Dcl        Var(&MsgDta)    Type(*Char) Len(1010) +
                     Stg(*Based)   BasPtr(&MsgDtaPtr)

     /* CPIAD12 char data */
     Dcl        Var(&MsgUser  )    Type(*Char) Len(10) +
                     Stg(*Defined) DefVar(&MsgDta  1)
     Dcl        Var(&Host     ) Type(*Char) Len(255) +
                     Stg(*Defined) DefVar(&MsgDta 11)

     Dcl        Var(&MsgTxt )    Type(*Char) Len(1024)
     Dcl        Var(&Rtvm0100  ) Type(*Char) Len(1024)
     Dcl        Var(&RplDta )    Type(*Char) Len(1024)
     Dcl        VAR(&MsgTxtLenC) Type(*Char) Len(4)
     Dcl        VAR(&MsgTxtLen ) Type(*Dec ) Len(5 0)
     Dcl        VAR(&RplDtaLenC) Type(*Char) Len(4)
     Dcl        VAR(&ErrCode)    Type(*Char) Len(15) /* Error Code */

     Dcl        Var(&DQ)         Type(*Char) Len(1) VALUE('"')
     Dcl        Var(&CMD)        Type(*Char) Len(5000)
     Dcl        Var(&REDIR)      Type(*Char) Len(100)
     Dcl        Var(&MSGYMD)     Type(*Char) Len(8)
     Dcl        Var(&MSGHMS)     Type(*Char) Len(6)


/* Check to make sure this is a *MSGID watch                         */
    If         Cond(&Type = '*MSGID') Then(Do)
/* Check to make sure this is for CPIAD02                            */

     If      Cond(&MsgID = 'CPIAD12') Then(Do)

             ChkObj     Obj(Qgpl/CnnLogP) ObjType(*File)
             MonMsg Cpf9801 *N Do
               CrtPf Qgpl/CnnLogP RcdLen(512)
             EndDo

             ChgVar Var(&MsgDtaPtr) Value(%Addr(&Data))
             Chgvar Var(%Offset(&MsgDtaPtr)) +
                    Value(%Offset(&MsgDtaPtr) + &OffRplDta)

             ChgVar &RplDta       %sst(&MsgDta 1 &LenRplDta)

             ChgVar     %BIN(&MSGTXTLENC)        1024
         /*  ChgVar     %BIN(&RplDtaLenC)        1010 */
             ChgVar     %BIN(&RplDtaLenC)        &LenRplDta
             ChgVar     %BIN(&ErrCode     1  4)    15
             Call       QMHRTVM ( +
                                 &Rtvm0100               +
                                 &MsgTxtLenC             +
                                 'RTVM0100'              +
                                 'CPIAD12'               +
                                 'QCPFMSG   QSYS       ' +
                                 &RplDta                 +
                                 &RplDtaLenC             +
                                 '*YES      '            +
                                 '*NO       '            +
                                 &Errcode)

             ChgVar &MsgTxtLenC    %SST(&Rtvm0100  9 4)
             ChgVar &MsgTxtLen     %BIN(&MsgTxtLenC)
             ChgVar &MsgTxt (&MSGID *CAT ':' *BCAT               +
                             %SST(&Rtvm0100 25 &MsgTxtLen) *BCAT  +
                             'connected to job' *BCAT    +
                         &Nbr *CAT '/' *CAT &User *Tcat '/' *CAT &Job)
             SndPgmMsg  MsgId(CPF9898) Msgf(QCPFMSG) MsgDta(&MsgTxt) +
                          ToUsr(*SYSOPR)

             ChgVar     Var(&Cmd) Value('print' *BCAT &DQ)

             ChgVar     Var(&ReDir) VALUE('>> /qsys.lib/' *CAT +
                          'QGPL'   *TCAT '.lib/' *CAT 'CNNLOGP' +
                          *TCAT '.file/' *CAT 'cnnlogp' *TCAT '.mbr')

             ChgVar Var(&RplDta)     Value(%sst(&MsgDta 1 &LenRplDta))
             CvtDts Dts(&MsgDts) RtnDate(&MsgYmd) RtnTime(&MsgHms)

             ChgVar &MsgTxt (&MsgId *CAT &Job *CAT &User *CAT &Nbr +
                                    *CAT %SST(&RplDta 1 10)        +
                                    *CAT &MsgYmd *CAT &MsgHms      +
                                    *CAT 'QSERVER   QSYS      '    +
                                    *CAT %SST(&RplDta 11 255))

             ChgVar     &CMD                                          +
                          (&CMD *TCAT &MsgTxt                         +
                                *TCAT  &Dq *BCAT &ReDir)

             StrQsh     Cmd(&CMD)
     EndDo

    EndDo /* End If &Type = *MSGID */

    ChgVar       Var(&Error) Value('          ')
    EndPgm