├── Installation.md ├── JCL ├── ASMZECS.jcl ├── CONFIG.jcl ├── CSDZECS.jcl ├── CSDZECSN.jcl ├── CSDZECSR.jcl ├── CSDZECSS.jcl ├── DEFEXPR.jcl ├── DEFZC##.jcl ├── ZC##DC.jcl └── ZC##SD.jcl ├── LICENSE ├── README.md ├── Source ├── CONFIG.txt ├── CSDZC##.rdo ├── CSDZECS.rdo ├── CSDZECSN.rdo ├── CSDZECSR.rdo ├── CSDZECSS.rdo ├── CSDZECSX.rdo ├── ECS001.cbl ├── REXXREPL.exec ├── ZC##DC.txt ├── ZC##SD.txt ├── ZCEXPIRE.idcams ├── ZECS000.cbl ├── ZECS001.cbl ├── ZECS002.asm ├── ZECS003.cbl ├── ZECSFILE.idcams ├── ZECSKEY.idcams ├── ZECSNC.asm ├── ZECSPLT.cbl ├── ZECSZFC.cpy └── ZECSZKC.cpy ├── System Requirements and Considerations.md ├── Usage.md └── _config.yml /Installation.md: -------------------------------------------------------------------------------- 1 | ## Installation 2 | 3 | ### Installation prerequisite 4 | If you plan on using the supplied assembly and link job, you will need to customize the DFHEITAL and DFHYITVL procs from 5 | the CICS SDFHPROC library. For further information regarding this proc, see... 6 | http://www.ibm.com/support/knowledgecenter/en/SSGMCP_5.3.0/com.ibm.cics.ts.applicationprogramming.doc/topics/dfhp3_installprog_cicsproc.html 7 | 8 | 9 | ### Installation planning 10 | The enterprise caching service will most likely need to be available for each part of the development lifecycle such as 11 | unit testing, QA testing, integration testing and production. One or more CICS regions may be assigned to each of these 12 | development lifecyles or environments. Each environment will have its own expiry management file. The same instance can 13 | be deployed across each of the environments. A common naming convention for the environments must be followed such as 14 | DEV, QA and PROD. The environment name cannot exceed eight characters. 15 | 16 | 17 | ### Security ### 18 | The default CICS userid will need access to run each instance of the transaction ID. It is recommended a block of 19 | transactions be reserved for the service. The supplied definitions assume the ZECS transactions will begin with "ZC" 20 | giving a range of ZC00 to ZCZZ. 21 | 22 | For those implementations using https and a TCPIPService definition with the AUTHENTICATE parameter set to BASIC, the 23 | authenticated userid will also need access to the transaction. 24 | 25 | Administrators should have access to transaction ZPLT to start the expiration process. 26 | 27 | 28 | ### Network Considerations ### 29 | The strategy used by this implementation uses a cluster of application owner regions (AORs). No webservice owning 30 | regions (WORs) are employed to route requests over to the AORs. It leverages a combination of sysplex distributor and 31 | port sharing. 32 | 33 | The port or ports reserved for this service are defined to a virtual IP address (VIPA) distribute statement (VIPADIST) 34 | and the port is defined as a shared port (SHAREP). Binding the port to the distributed VIPA is optional. With this 35 | arrangement, CICS regions are free to move around and supports more than one region on a LPAR. 36 | 37 | The preferred approach is to use a unique host name per instance which will allow a single instance to be moved without 38 | affecting any other instances. The unique host names would be assigned to the VIPA distribute address assigned to the 39 | port(s). An example of unique host name would be ecs01.enterprise-services.mycompany.com matching instance ZC01. 40 | 41 | The drawback for using a unique host name per instance is certificate handling for https implementations. Either a 42 | wildcard SSL certificate needs to be issued or the SSL certificate needs to have every host name in the subject 43 | alternate name. Using the example above, the wildcard certificate would need to match on 44 | *.enterprise-services.mycompany.com. For the latter scenario, an automated process to add the instance host name to 45 | the subject altername name would be needed to streamline the process. 46 | 47 | To provide redundancy across sysplexes a router would be needed to send requests to both sysplexes. Implementing this 48 | level of redundancy requires additional host names to be utilized. There would be the primary host name the application 49 | would use. This host name would be routed among the host names assigned to each sysplex. Using the example above, 50 | the host name supplied to the application would be ecs01.enterprise-services.mycompany.com which would be configured 51 | to be picked up by the router. The router would then choose a sysplex host name to use which could look something like 52 | ecs01.sysplex01.enterprise-services.mycompany.com and ecs01.sysplex02.enterprise-services.mycompany.com. These host 53 | names would be the ones pointing to the VIPA distribute address on their respective sysplex. 54 | 55 | 56 | ### Installation instructions 57 | 1. Download the ZECS repository to your local workstation. 58 | 59 | 1. Allocate a JCL and source library on the mainframe. Both libraries will 60 | need to have a record format of FB, a logical record length of 80 and be a dataset type of PDS or LIBRARY. 61 | 62 | 1. FTP the JCL in the JCL folder to the JCL library you have allocated. 63 | 64 | 1. FTP the source code and definitions in the source folder to the source library you have allocated. 65 | 66 | 1. Copy the ZECSZFC and ZECSZKC from the source library to a copybook library used by your own compile processes 67 | if you do not plan on using the DFHEITAL and DFHYITVL procs. 68 | 69 | 1. *In the source library, locate the CONFIG member and edit it.* This file contains a list of configuration items used 70 | to configure the JCL and source. The file itself provides a brief description of each configuration item. Comments are 71 | denoted by leading asterisk in the first word. The first word is the configuration item and the second word is its value. 72 | 73 | 1. **@auth@** is the value of the AUTHENTICATE parameter for the https TCPIPService definition. The values can be 74 | NO, ASSERTED, AUTOMATIC, AUTOREGISTER, BASIC, CERTIFICATE. 75 | 76 | 1. **@certficate@** is for CERTIFICATE parameter in the TCPIPService definition for https. Specify certificate as 77 | CERTIFICATE(server-ssl-certificate-name). 78 | 79 | 1. **@cics_csd@** is the dataset name of the CICS system definition (CSD) file. 80 | 81 | 1. **@cics_hlq@** is the high level qualifier for CICS datasets. 82 | 83 | 1. **@csd_list@** is the CSD group list name. This is the list name to use for the ZECS group. 84 | 85 | 1. **@data_class@** is the DATACLASS used by IDCAMS for defining ZECS files 86 | 87 | 1. **@doct_dd@** is the document template DDNAME defined to CICS region. 88 | 89 | 1. **@ecs_hlq@** is the high level qualifier for ZECS files. 90 | 91 | 1. **@http_port@** is the http port number to be used for ZECS. 92 | 93 | 1. **@https_port@** is the https port number to be used for ZECS. 94 | 95 | 1. **@job_parms@** are the parameters following JOB in the JOB card. Be mindful. This substitution will only 96 | handle one line worth of JOB parameters when customizing jobs. 97 | 98 | 1. **@mgt_class@** is the MANAGEMENTCLASS used by IDCAMS for defining ZECS files. 99 | 100 | 1. **@proc_lib@** (Optional) is the dataset containing the customized version of the DFHEITAL proc supplied by IBM. 101 | If you plan to use the supplied assembly job, the proc library is required. 102 | 103 | 1. **@program_lib@** (Optional) is the dataset to be used for ZECS programs. If you plan to use the supplied assembly 104 | job, the program load library is required. 105 | 106 | 1. **@rep_port@** is the replication port number. See replication. 107 | 108 | 1. **@source_lib@** is the dataset containing ZECS source code. 109 | 110 | 1. **@stg_class@** is the storage class to use for ZECS files. 111 | 112 | 1. **@tdq@** is the transient data queue (TDQ) for error messages. Must be 4 bytes. 113 | 114 | 1. Exit and save the CONFIG member in the source library. 115 | 116 | 1. In the JCL library, locate and edit the CONFIG member. This is the job that will customize the JCL and source 117 | libraries. Because this job performs the customization, it will need to be customized in order to run. The following 118 | customizations will need to be made. 119 | 120 | 1. Modify JOB card to meet your system installation standards. 121 | 122 | 1. Change all occurrences of the following. 123 | 1. **@source_lib@** to the source library dataset name. Example. C ALL @source_lib@ CICSTS.ZECS.SOURCE 124 | 1. **@jcl_lib@** to this JCL library dataset name. Example. C ALL @jcl_lib@ CICSTS.ZECS.CNTL 125 | 126 | 1. Submit the CONFIG job. It should complete with return code 0. The remaining jobs and CSD definitions have been 127 | customized. 128 | 129 | 1. Assemble the source. An assembly and link job has been provided to assemble the programs used for ZECS. You may use 130 | the supplied job or use your own job. 131 | 1. Using ASMZECS. The provided job ASMZECS utilizes the DFHEITAL and DFHYITVL procs from IBM for tranlating CICS 132 | commands. The DFHEITAL and DFHYITVL procs must be customized and available in the library specified earlier in the 133 | @proc_lib@ configuration item. Submit the ASMZECS job. It should end with return code 4 or less. 134 | 1. Using your own assembly/compile and link jobs. If you wish to use your own assembly/compile jobs, here is a list 135 | of programs and their languages. Copybooks ZECSZFC and ZECSZKC will need to be available for Cobol compiles. 136 | 1. ZECSNC *Assembler* 137 | 1. ZECSPLT *Cobol* 138 | 1. ZECS000 *Cobol* 139 | 1. ZECS001 *Cobol* 140 | 1. ZECS002 *Assembler* 141 | 1. ZECS003 *Cobol* 142 | 143 | 1. Define the CICS resource definitions for ZECS. In the JCL library, submit the CSDZECS member. This will install the 144 | minimum number of definitions for ZECS. 145 | 146 | 1. Define the http port for ZECS (optional). If you plan to use an existing http port (TCPIPService definition), you do 147 | not need to submit this job. If you would like to setup a http port specifically for ZECS. Submit the CSDZECSN member in 148 | the JCL library. 149 | 150 | 1. Define the https port for ZECS (optional). If you plan to use an existing https port (TCPIPService definition), you do 151 | not need to submit this job. If you would like to setup a https port specifically for ZECS. Submit the CSDZECSS member in 152 | the JCL library. 153 | 154 | 1. Define an expiry file for each of the environments discussed during the planning section. In the JCL library, edit 155 | DEFEXPR. Change the word behind @environment@ for the environment being defined and submit. 156 | 157 | 1. Install the ZECS CSD group. No job has been provided to install the ZECS group on the CSD. How CSD groups are 158 | installed varies from company to company. Cold starting CICS, using CICS Explorer, or using CEDA INSTALL are just 159 | some of the ways to perform this action. If cold starting, you may want to hold off until the ZECSPLT program is ready 160 | to be picked up as entry in the PLTPI in the next few steps. 161 | 162 | 1. Define program ZECSPLT as an entry to the PLTPI table in the regions destined to run the ZECS services. Refer to 163 | instructions for PLT-program list table in IBM Knowledge Center for CICS. 164 | 165 | 1. Invoke the ZECSPLT program. This can be done by restarting the CICS region or by running the ZPLT transaction in each 166 | of the CICS regions. 167 | 168 | 169 | #### Define a ZECS instance 170 | 1. Define an instance of ZECS. In the JCL library, the DEFZC## member provides the JCL to define one instance of ZECS. 171 | While some parts of the job are customized, some parameters are left untouched so the process on installing a ZECS 172 | instance is repeatable. Keep in mind, you will want some method of keeping track of your clients and which instance of 173 | ZECS you have created for them. Recording the path as well is a good idea. Edit DEFZC## in the JCL library and 174 | customize the following fields. 175 | 1. **@appname@** is the application name using this instance of ZECS. It is the fourth node of the path. 176 | 1. **@environment@** is eight character environment name such as DEV, QA, PROD discussed during planning. This 177 | setting should match the environment setting used when defining the expiry file. 178 | 1. **@grp_list@** is the CSD group list you wish this instance to be installed. 179 | 1. **@id@** is the two character ZECS instance identifier ranging from 00 to ZZ. 180 | 1. **@org@** is the organization identifier used in the path of the service. 181 | 1. **@pri_cyl@** is the primary number of cylinders for ZFAM files. 182 | 1. **scheme** is the setting for the SCHEME parameter on the URIMAP definition. Use either http or https. 183 | 1. **@sec_cyl@** is the secondary number of cylinders for ZFAM files. 184 | *Note: the path is created by the @org@ and @appname@ values; /resources/ecs/@org@/@appname@.* 185 | 186 | 1. Submit the DEFZC## job to define the instance. 187 | 188 | 1. Install the ZECS instance CSD group. The CSD group name begins with ZC and ends with the @id@ value used above. So if 189 | the @id@ was 00, the group name is ZC00. No job has been supplied to install the definitions. Install by cold starting 190 | CICS, using CICS Explorer, or using CEDA INSTALL. 191 | 192 | 1. Define a named counter for the ZECS instance and trigger the expiry process. Run transaction ZNCD in one of the CICS 193 | regions with the above group name following it. Using the example above, the transaction would be ran as follows: 194 | ZNCD,ZC00 195 | 196 | ### Securing the caching service 197 | One or more userids can be given specific privileges to a specific ZECS instance. There are three permission levels that 198 | can be granted to a userid. SELECT provides read access. UPDATE provides both write and update access. DELETE provides 199 | delete access. In the example below, USERID1 has full access, USERID2 can read, write and update but not delete and 200 | USERID3 can only read the contents. 201 | 202 | User=USERID1 ,SELECT 203 | User=USERID1 ,UPDATE 204 | User=USERID1 ,DELETE 205 | User=USERID2 ,SELECT 206 | User=USERID2 ,UPDATE 207 | User=USERID3 ,SELECT 208 | 209 | In the JCL library, edit ZC##SD. Add the userids and their permission levels to the SYSUT1 DD. Change all occurrences of 210 | "##" to the value used for @id@ when defining the instance. The job will create a document template member and define it 211 | to the instance group. Submit the job. Upon successful completion, install the document template definition. 212 | 213 | 214 | ### Replication 215 | To setup replication, an alternate environment such as another sysplex will need to have the same definitions installed. 216 | The alternate environment will have a different host name in DNS. The same ports are used with the exception of one 217 | new port to manage the replication. Both the primary and alternate environments will have the same replication port 218 | number. 219 | 220 | To define the replication port, submit CSDZECSR in the JCL library to define the ZECSREPL TCPIPService definition. After 221 | the job has completed, install the ZECSREPL definition. This should be done in both the primary and alternate environments. 222 | 223 | To enable replication for an instance of ZECS, edit ZC##DC in the JCL library and modify the SYSUT1 DD. The valid values 224 | for type are AA, AS and A1. AA is for active-active replication. AS is for active-standby and A1 is stand alone. The 225 | second line is the host name and port of the opposing environment. The primary environment will need to have the 226 | alternate's host name and port defined. And the alternate environment with to have the primary's host name and port 227 | defined. Change all occurrences of ## to the value used for @id@ when defining the instance. The job will create a 228 | document template member and define it to the instance group. Submit the job. Upon successful completion, 229 | install the document template definition. 230 | -------------------------------------------------------------------------------- /JCL/ASMZECS.jcl: -------------------------------------------------------------------------------- 1 | //ASMZECS JOB @job_parms@ 2 | //********************************************************************** 3 | //* Assemble and compile the source code 4 | //********************************************************************** 5 | //PROC JCLLIB ORDER=(@proc_lib@) 6 | //********************************************************************** 7 | //* Compile and link ZECS000 8 | //********************************************************************** 9 | //ZECS000 EXEC DFHYITVL,PROGLIB=@program_lib@, 10 | // DSCTLIB=@source_lib@ 11 | //TRN.SYSIN DD DISP=SHR,DSN=@source_lib@(ZECS000) 12 | //* 13 | //LKED.SYSIN DD * 14 | NAME ZECS000(R) 15 | /* 16 | //********************************************************************** 17 | //* Compile and link ZECS001 18 | //********************************************************************** 19 | //ZECS001 EXEC DFHYITVL,PROGLIB=@program_lib@, 20 | // DSCTLIB=@source_lib@ 21 | //TRN.SYSIN DD DISP=SHR,DSN=@source_lib@(ZECS001) 22 | //* 23 | //LKED.SYSIN DD * 24 | NAME ZECS001(R) 25 | /* 26 | //********************************************************************** 27 | //* Assemble and link ZECS002 28 | //********************************************************************** 29 | //ZECS002 EXEC DFHEITAL,PROGLIB=@program_lib@, 30 | // DSCTLIB=@source_lib@ 31 | //TRN.SYSIN DD DISP=SHR,DSN=@source_lib@(ZECS002) 32 | //* 33 | //LKED.SYSIN DD * 34 | NAME ZECS002(R) 35 | /* 36 | //********************************************************************** 37 | //* Compile and link ZECS003 38 | //********************************************************************** 39 | //ZECS003 EXEC DFHYITVL,PROGLIB=@program_lib@, 40 | // DSCTLIB=@source_lib@ 41 | //TRN.SYSIN DD DISP=SHR,DSN=@source_lib@(ZECS003) 42 | //* 43 | //LKED.SYSIN DD * 44 | NAME ZECS003(R) 45 | /* 46 | //********************************************************************** 47 | //* Assemble and link ZECSNC 48 | //********************************************************************** 49 | //ZECSNC EXEC DFHEITAL,PROGLIB=@program_lib@, 50 | // DSCTLIB=@source_lib@ 51 | //TRN.SYSIN DD DISP=SHR,DSN=@source_lib@(ZECSNC) 52 | //* 53 | //LKED.SYSIN DD * 54 | NAME ZECSNC(R) 55 | /* 56 | //********************************************************************** 57 | //* Compile and link ZECSPLT 58 | //********************************************************************** 59 | //ZECSPLT EXEC DFHYITVL,PROGLIB=@program_lib@, 60 | // DSCTLIB=@source_lib@ 61 | //TRN.SYSIN DD DISP=SHR,DSN=@source_lib@(ZECSPLT) 62 | //* 63 | //LKED.SYSIN DD * 64 | NAME ZECSPLT(R) 65 | /* -------------------------------------------------------------------------------- /JCL/CONFIG.jcl: -------------------------------------------------------------------------------- 1 | //CONFIG JOB MSGCLASS=R,NOTIFY=&SYSUID 2 | //********************************************************************** 3 | //* This job will modify the members in the .SOURCE and .CNTL libraries 4 | //* 5 | //* Steps for this job to complete successfully 6 | //* -------------------------------------------------------------------- 7 | //* 1) Modify JOB card to meet your system installation standards 8 | //* 9 | //* 2) Modify the CONFIG member in the .SOURCE dataset before submitting 10 | //* 11 | //* 3) Change all occurrences of the following: 12 | //* @source_lib@ to the source library dataset name 13 | //* @jcl_lib@ to this JCL library dataset name. 14 | //* 15 | //* 4) Submit the job 16 | //********************************************************************** 17 | //* Modify ASMZECS JCL 18 | //********************************************************************** 19 | //STEP01 EXEC PGM=IKJEFT1B,REGION=1024K 20 | //SYSPRINT DD SYSOUT=* 21 | //SYSTSPRT DD SYSOUT=* 22 | //INPUT DD DISP=SHR,DSN=@jcl_lib@(ASMZECS) 23 | //OUTPUT DD DISP=(NEW,PASS),DSN=&&OUTPUT, 24 | // UNIT=VIO,SPACE=(80,(1000,1000)), 25 | // DCB=(LRECL=80,RECFM=FB) 26 | //STRINGS DD DISP=SHR,DSN=@source_lib@(CONFIG) 27 | //SYSTSIN DD * 28 | EXEC '@source_lib@(REXXREPL)' 29 | /* 30 | //********************************************************************** 31 | //* Replace ASMZECS JCL 32 | //********************************************************************** 33 | //STEP02 EXEC PGM=IEBGENER,REGION=1024K 34 | //SYSPRINT DD SYSOUT=* 35 | //SYSUT1 DD DISP=(OLD,DELETE),DSN=&&OUTPUT 36 | //SYSUT2 DD DISP=SHR,DSN=@jcl_lib@(ASMZECS) 37 | //SYSIN DD DUMMY 38 | //********************************************************************** 39 | //* Modify CSDZECS JCL 40 | //********************************************************************** 41 | //STEP03 EXEC PGM=IKJEFT1B,REGION=1024K 42 | //SYSPRINT DD SYSOUT=* 43 | //SYSTSPRT DD SYSOUT=* 44 | //INPUT DD DISP=SHR,DSN=@jcl_lib@(CSDZECS) 45 | //OUTPUT DD DISP=(NEW,PASS),DSN=&&OUTPUT, 46 | // UNIT=VIO,SPACE=(80,(1000,1000)), 47 | // DCB=(LRECL=80,RECFM=FB) 48 | //STRINGS DD DISP=SHR,DSN=@source_lib@(CONFIG) 49 | //SYSTSIN DD * 50 | EXEC '@source_lib@(REXXREPL)' 51 | /* 52 | //********************************************************************** 53 | //* Replace CSDZECS JCL 54 | //********************************************************************** 55 | //STEP04 EXEC PGM=IEBGENER,REGION=1024K 56 | //SYSPRINT DD SYSOUT=* 57 | //SYSUT1 DD DISP=(OLD,DELETE),DSN=&&OUTPUT 58 | //SYSUT2 DD DISP=SHR,DSN=@jcl_lib@(CSDZECS) 59 | //SYSIN DD DUMMY 60 | //********************************************************************** 61 | //* Modify CSDZECSN JCL 62 | //********************************************************************** 63 | //STEP05 EXEC PGM=IKJEFT1B,REGION=1024K 64 | //SYSPRINT DD SYSOUT=* 65 | //SYSTSPRT DD SYSOUT=* 66 | //INPUT DD DISP=SHR,DSN=@jcl_lib@(CSDZECSN) 67 | //OUTPUT DD DISP=(NEW,PASS),DSN=&&OUTPUT, 68 | // UNIT=VIO,SPACE=(80,(1000,1000)), 69 | // DCB=(LRECL=80,RECFM=FB) 70 | //STRINGS DD DISP=SHR,DSN=@source_lib@(CONFIG) 71 | //SYSTSIN DD * 72 | EXEC '@source_lib@(REXXREPL)' 73 | /* 74 | //********************************************************************** 75 | //* Replace CSDZECSN JCL 76 | //********************************************************************** 77 | //STEP06 EXEC PGM=IEBGENER,REGION=1024K 78 | //SYSPRINT DD SYSOUT=* 79 | //SYSUT1 DD DISP=(OLD,DELETE),DSN=&&OUTPUT 80 | //SYSUT2 DD DISP=SHR,DSN=@jcl_lib@(CSDZECSN) 81 | //SYSIN DD DUMMY 82 | //********************************************************************** 83 | //* Modify CSDZECSR JCL 84 | //********************************************************************** 85 | //STEP07 EXEC PGM=IKJEFT1B,REGION=1024K 86 | //SYSPRINT DD SYSOUT=* 87 | //SYSTSPRT DD SYSOUT=* 88 | //INPUT DD DISP=SHR,DSN=@jcl_lib@(CSDZECSR) 89 | //OUTPUT DD DISP=(NEW,PASS),DSN=&&OUTPUT, 90 | // UNIT=VIO,SPACE=(80,(1000,1000)), 91 | // DCB=(LRECL=80,RECFM=FB) 92 | //STRINGS DD DISP=SHR,DSN=@source_lib@(CONFIG) 93 | //SYSTSIN DD * 94 | EXEC '@source_lib@(REXXREPL)' 95 | /* 96 | //********************************************************************** 97 | //* Replace CSDZECSR JCL 98 | //********************************************************************** 99 | //STEP08 EXEC PGM=IEBGENER,REGION=1024K 100 | //SYSPRINT DD SYSOUT=* 101 | //SYSUT1 DD DISP=(OLD,DELETE),DSN=&&OUTPUT 102 | //SYSUT2 DD DISP=SHR,DSN=@jcl_lib@(CSDZECSR) 103 | //SYSIN DD DUMMY 104 | //********************************************************************** 105 | //* Modify CSDZECSS JCL 106 | //********************************************************************** 107 | //STEP09 EXEC PGM=IKJEFT1B,REGION=1024K 108 | //SYSPRINT DD SYSOUT=* 109 | //SYSTSPRT DD SYSOUT=* 110 | //INPUT DD DISP=SHR,DSN=@jcl_lib@(CSDZECSS) 111 | //OUTPUT DD DISP=(NEW,PASS),DSN=&&OUTPUT, 112 | // UNIT=VIO,SPACE=(80,(1000,1000)), 113 | // DCB=(LRECL=80,RECFM=FB) 114 | //STRINGS DD DISP=SHR,DSN=@source_lib@(CONFIG) 115 | //SYSTSIN DD * 116 | EXEC '@source_lib@(REXXREPL)' 117 | /* 118 | //********************************************************************** 119 | //* Replace CSDZECSS JCL 120 | //********************************************************************** 121 | //STEP10 EXEC PGM=IEBGENER,REGION=1024K 122 | //SYSPRINT DD SYSOUT=* 123 | //SYSUT1 DD DISP=(OLD,DELETE),DSN=&&OUTPUT 124 | //SYSUT2 DD DISP=SHR,DSN=@jcl_lib@(CSDZECSS) 125 | //SYSIN DD DUMMY 126 | //********************************************************************** 127 | //* Modify DEFEXPR JCL 128 | //********************************************************************** 129 | //STEP11 EXEC PGM=IKJEFT1B,REGION=1024K 130 | //SYSPRINT DD SYSOUT=* 131 | //SYSTSPRT DD SYSOUT=* 132 | //INPUT DD DISP=SHR,DSN=@jcl_lib@(DEFEXPR) 133 | //OUTPUT DD DISP=(NEW,PASS),DSN=&&OUTPUT, 134 | // UNIT=VIO,SPACE=(80,(1000,1000)), 135 | // DCB=(LRECL=80,RECFM=FB) 136 | //STRINGS DD DISP=SHR,DSN=@source_lib@(CONFIG) 137 | //SYSTSIN DD * 138 | EXEC '@source_lib@(REXXREPL)' 139 | /* 140 | //********************************************************************** 141 | //* Replace DEFEXPR JCL 142 | //********************************************************************** 143 | //STEP12 EXEC PGM=IEBGENER,REGION=1024K 144 | //SYSPRINT DD SYSOUT=* 145 | //SYSUT1 DD DISP=(OLD,DELETE),DSN=&&OUTPUT 146 | //SYSUT2 DD DISP=SHR,DSN=@jcl_lib@(DEFEXPR) 147 | //SYSIN DD DUMMY 148 | //********************************************************************** 149 | //* Modify DEFZC## JCL 150 | //********************************************************************** 151 | //STEP13 EXEC PGM=IKJEFT1B,REGION=1024K 152 | //SYSPRINT DD SYSOUT=* 153 | //SYSTSPRT DD SYSOUT=* 154 | //INPUT DD DISP=SHR,DSN=@jcl_lib@(DEFZC##) 155 | //OUTPUT DD DISP=(NEW,PASS),DSN=&&OUTPUT, 156 | // UNIT=VIO,SPACE=(80,(1000,1000)), 157 | // DCB=(LRECL=80,RECFM=FB) 158 | //STRINGS DD DISP=SHR,DSN=@source_lib@(CONFIG) 159 | //SYSTSIN DD * 160 | EXEC '@source_lib@(REXXREPL)' 161 | /* 162 | //********************************************************************** 163 | //* Replace DEFZC## JCL 164 | //********************************************************************** 165 | //STEP14 EXEC PGM=IEBGENER,REGION=1024K 166 | //SYSPRINT DD SYSOUT=* 167 | //SYSUT1 DD DISP=(OLD,DELETE),DSN=&&OUTPUT 168 | //SYSUT2 DD DISP=SHR,DSN=@jcl_lib@(DEFZC##) 169 | //SYSIN DD DUMMY 170 | //********************************************************************** 171 | //* Modify ZC##DC JCL 172 | //********************************************************************** 173 | //STEP15 EXEC PGM=IKJEFT1B,REGION=1024K 174 | //SYSPRINT DD SYSOUT=* 175 | //SYSTSPRT DD SYSOUT=* 176 | //INPUT DD DISP=SHR,DSN=@jcl_lib@(ZC##DC) 177 | //OUTPUT DD DISP=(NEW,PASS),DSN=&&OUTPUT, 178 | // UNIT=VIO,SPACE=(80,(1000,1000)), 179 | // DCB=(LRECL=80,RECFM=FB) 180 | //STRINGS DD DISP=SHR,DSN=@source_lib@(CONFIG) 181 | //SYSTSIN DD * 182 | EXEC '@source_lib@(REXXREPL)' 183 | /* 184 | //********************************************************************** 185 | //* Replace ZC##DC JCL 186 | //********************************************************************** 187 | //STEP16 EXEC PGM=IEBGENER,REGION=1024K 188 | //SYSPRINT DD SYSOUT=* 189 | //SYSUT1 DD DISP=(OLD,DELETE),DSN=&&OUTPUT 190 | //SYSUT2 DD DISP=SHR,DSN=@jcl_lib@(ZC##DC) 191 | //SYSIN DD DUMMY 192 | //********************************************************************** 193 | //* Modify ZC##SD JCL 194 | //********************************************************************** 195 | //STEP17 EXEC PGM=IKJEFT1B,REGION=1024K 196 | //SYSPRINT DD SYSOUT=* 197 | //SYSTSPRT DD SYSOUT=* 198 | //INPUT DD DISP=SHR,DSN=@jcl_lib@(ZC##SD) 199 | //OUTPUT DD DISP=(NEW,PASS),DSN=&&OUTPUT, 200 | // UNIT=VIO,SPACE=(80,(1000,1000)), 201 | // DCB=(LRECL=80,RECFM=FB) 202 | //STRINGS DD DISP=SHR,DSN=@source_lib@(CONFIG) 203 | //SYSTSIN DD * 204 | EXEC '@source_lib@(REXXREPL)' 205 | /* 206 | //********************************************************************** 207 | //* Replace ZC##SD JCL 208 | //********************************************************************** 209 | //STEP18 EXEC PGM=IEBGENER,REGION=1024K 210 | //SYSPRINT DD SYSOUT=* 211 | //SYSUT1 DD DISP=(OLD,DELETE),DSN=&&OUTPUT 212 | //SYSUT2 DD DISP=SHR,DSN=@jcl_lib@(ZC##SD) 213 | //SYSIN DD DUMMY 214 | //********************************************************************** 215 | //* Modify CSDZC## CSD definition source 216 | //********************************************************************** 217 | //STEP19 EXEC PGM=IKJEFT1B,REGION=1024K 218 | //SYSPRINT DD SYSOUT=* 219 | //SYSTSPRT DD SYSOUT=* 220 | //INPUT DD DISP=SHR,DSN=@source_lib@(CSDZC##) 221 | //OUTPUT DD DISP=(NEW,PASS),DSN=&&OUTPUT, 222 | // UNIT=VIO,SPACE=(80,(1000,1000)), 223 | // DCB=(LRECL=80,RECFM=FB) 224 | //STRINGS DD DISP=SHR,DSN=@source_lib@(CONFIG) 225 | //SYSTSIN DD * 226 | EXEC '@source_lib@(REXXREPL)' 227 | /* 228 | //********************************************************************** 229 | //* Replace CSDZC## CSD definition source 230 | //********************************************************************** 231 | //STEP20 EXEC PGM=IEBGENER,REGION=1024K 232 | //SYSPRINT DD SYSOUT=* 233 | //SYSUT1 DD DISP=(OLD,DELETE),DSN=&&OUTPUT 234 | //SYSUT2 DD DISP=SHR,DSN=@source_lib@(CSDZC##) 235 | //SYSIN DD DUMMY 236 | //********************************************************************** 237 | //* Modify CSDZECS CSD definition source 238 | //********************************************************************** 239 | //STEP21 EXEC PGM=IKJEFT1B,REGION=1024K 240 | //SYSPRINT DD SYSOUT=* 241 | //SYSTSPRT DD SYSOUT=* 242 | //INPUT DD DISP=SHR,DSN=@source_lib@(CSDZECS) 243 | //OUTPUT DD DISP=(NEW,PASS),DSN=&&OUTPUT, 244 | // UNIT=VIO,SPACE=(80,(1000,1000)), 245 | // DCB=(LRECL=80,RECFM=FB) 246 | //STRINGS DD DISP=SHR,DSN=@source_lib@(CONFIG) 247 | //SYSTSIN DD * 248 | EXEC '@source_lib@(REXXREPL)' 249 | /* 250 | //********************************************************************** 251 | //* Replace CSDZECS CSD definition source 252 | //********************************************************************** 253 | //STEP22 EXEC PGM=IEBGENER,REGION=1024K 254 | //SYSPRINT DD SYSOUT=* 255 | //SYSUT1 DD DISP=(OLD,DELETE),DSN=&&OUTPUT 256 | //SYSUT2 DD DISP=SHR,DSN=@source_lib@(CSDZECS) 257 | //SYSIN DD DUMMY 258 | //********************************************************************** 259 | //* Modify CSDZECSN CSD definition source 260 | //********************************************************************** 261 | //STEP23 EXEC PGM=IKJEFT1B,REGION=1024K 262 | //SYSPRINT DD SYSOUT=* 263 | //SYSTSPRT DD SYSOUT=* 264 | //INPUT DD DISP=SHR,DSN=@source_lib@(CSDZECSN) 265 | //OUTPUT DD DISP=(NEW,PASS),DSN=&&OUTPUT, 266 | // UNIT=VIO,SPACE=(80,(1000,1000)), 267 | // DCB=(LRECL=80,RECFM=FB) 268 | //STRINGS DD DISP=SHR,DSN=@source_lib@(CONFIG) 269 | //SYSTSIN DD * 270 | EXEC '@source_lib@(REXXREPL)' 271 | /* 272 | //********************************************************************** 273 | //* Replace CSDZECSN CSD definition source 274 | //********************************************************************** 275 | //STEP24 EXEC PGM=IEBGENER,REGION=1024K 276 | //SYSPRINT DD SYSOUT=* 277 | //SYSUT1 DD DISP=(OLD,DELETE),DSN=&&OUTPUT 278 | //SYSUT2 DD DISP=SHR,DSN=@source_lib@(CSDZECSN) 279 | //SYSIN DD DUMMY 280 | //********************************************************************** 281 | //* Modify CSDZECSR CSD definition source 282 | //********************************************************************** 283 | //STEP25 EXEC PGM=IKJEFT1B,REGION=1024K 284 | //SYSPRINT DD SYSOUT=* 285 | //SYSTSPRT DD SYSOUT=* 286 | //INPUT DD DISP=SHR,DSN=@source_lib@(CSDZECSR) 287 | //OUTPUT DD DISP=(NEW,PASS),DSN=&&OUTPUT, 288 | // UNIT=VIO,SPACE=(80,(1000,1000)), 289 | // DCB=(LRECL=80,RECFM=FB) 290 | //STRINGS DD DISP=SHR,DSN=@source_lib@(CONFIG) 291 | //SYSTSIN DD * 292 | EXEC '@source_lib@(REXXREPL)' 293 | /* 294 | //********************************************************************** 295 | //* Replace CSDZECSR CSD definition source 296 | //********************************************************************** 297 | //STEP26 EXEC PGM=IEBGENER,REGION=1024K 298 | //SYSPRINT DD SYSOUT=* 299 | //SYSUT1 DD DISP=(OLD,DELETE),DSN=&&OUTPUT 300 | //SYSUT2 DD DISP=SHR,DSN=@source_lib@(CSDZECSR) 301 | //SYSIN DD DUMMY 302 | //********************************************************************** 303 | //* Modify CSDZECSS CSD definition source 304 | //********************************************************************** 305 | //STEP27 EXEC PGM=IKJEFT1B,REGION=1024K 306 | //SYSPRINT DD SYSOUT=* 307 | //SYSTSPRT DD SYSOUT=* 308 | //INPUT DD DISP=SHR,DSN=@source_lib@(CSDZECSS) 309 | //OUTPUT DD DISP=(NEW,PASS),DSN=&&OUTPUT, 310 | // UNIT=VIO,SPACE=(80,(1000,1000)), 311 | // DCB=(LRECL=80,RECFM=FB) 312 | //STRINGS DD DISP=SHR,DSN=@source_lib@(CONFIG) 313 | //SYSTSIN DD * 314 | EXEC '@source_lib@(REXXREPL)' 315 | /* 316 | //********************************************************************** 317 | //* Replace CSDZECSS CSD definition source 318 | //********************************************************************** 319 | //STEP28 EXEC PGM=IEBGENER,REGION=1024K 320 | //SYSPRINT DD SYSOUT=* 321 | //SYSUT1 DD DISP=(OLD,DELETE),DSN=&&OUTPUT 322 | //SYSUT2 DD DISP=SHR,DSN=@source_lib@(CSDZECSS) 323 | //SYSIN DD DUMMY 324 | //********************************************************************** 325 | //* Modify CSDZECSX CSD definition source 326 | //********************************************************************** 327 | //STEP29 EXEC PGM=IKJEFT1B,REGION=1024K 328 | //SYSPRINT DD SYSOUT=* 329 | //SYSTSPRT DD SYSOUT=* 330 | //INPUT DD DISP=SHR,DSN=@source_lib@(CSDZECSX) 331 | //OUTPUT DD DISP=(NEW,PASS),DSN=&&OUTPUT, 332 | // UNIT=VIO,SPACE=(80,(1000,1000)), 333 | // DCB=(LRECL=80,RECFM=FB) 334 | //STRINGS DD DISP=SHR,DSN=@source_lib@(CONFIG) 335 | //SYSTSIN DD * 336 | EXEC '@source_lib@(REXXREPL)' 337 | /* 338 | //********************************************************************** 339 | //* Replace CSDZECSX CSD definition source 340 | //********************************************************************** 341 | //STEP30 EXEC PGM=IEBGENER,REGION=1024K 342 | //SYSPRINT DD SYSOUT=* 343 | //SYSUT1 DD DISP=(OLD,DELETE),DSN=&&OUTPUT 344 | //SYSUT2 DD DISP=SHR,DSN=@source_lib@(CSDZECSX) 345 | //SYSIN DD DUMMY 346 | //********************************************************************** 347 | //* Modify ZC##DC CSD definition source 348 | //********************************************************************** 349 | //STEP31 EXEC PGM=IKJEFT1B,REGION=1024K 350 | //SYSPRINT DD SYSOUT=* 351 | //SYSTSPRT DD SYSOUT=* 352 | //INPUT DD DISP=SHR,DSN=@source_lib@(ZC##DC) 353 | //OUTPUT DD DISP=(NEW,PASS),DSN=&&OUTPUT, 354 | // UNIT=VIO,SPACE=(80,(1000,1000)), 355 | // DCB=(LRECL=80,RECFM=FB) 356 | //STRINGS DD DISP=SHR,DSN=@source_lib@(CONFIG) 357 | //SYSTSIN DD * 358 | EXEC '@source_lib@(REXXREPL)' 359 | /* 360 | //********************************************************************** 361 | //* Replace ZC##DC CSD definition source 362 | //********************************************************************** 363 | //STEP32 EXEC PGM=IEBGENER,REGION=1024K 364 | //SYSPRINT DD SYSOUT=* 365 | //SYSUT1 DD DISP=(OLD,DELETE),DSN=&&OUTPUT 366 | //SYSUT2 DD DISP=SHR,DSN=@source_lib@(ZC##DC) 367 | //SYSIN DD DUMMY 368 | //********************************************************************** 369 | //* Modify ZCEXPIRE IDCAMS VSAM file definition 370 | //********************************************************************** 371 | //STEP33 EXEC PGM=IKJEFT1B,REGION=1024K 372 | //SYSPRINT DD SYSOUT=* 373 | //SYSTSPRT DD SYSOUT=* 374 | //INPUT DD DISP=SHR,DSN=@source_lib@(ZCEXPIRE) 375 | //OUTPUT DD DISP=(NEW,PASS),DSN=&&OUTPUT, 376 | // UNIT=VIO,SPACE=(80,(1000,1000)), 377 | // DCB=(LRECL=80,RECFM=FB) 378 | //STRINGS DD DISP=SHR,DSN=@source_lib@(CONFIG) 379 | //SYSTSIN DD * 380 | EXEC '@source_lib@(REXXREPL)' 381 | /* 382 | //********************************************************************** 383 | //* Replace ZCEXPIRE IDCAMS VSAM file definition 384 | //********************************************************************** 385 | //STEP34 EXEC PGM=IEBGENER,REGION=1024K 386 | //SYSPRINT DD SYSOUT=* 387 | //SYSUT1 DD DISP=(OLD,DELETE),DSN=&&OUTPUT 388 | //SYSUT2 DD DISP=SHR,DSN=@source_lib@(ZCEXPIRE) 389 | //SYSIN DD DUMMY 390 | //********************************************************************** 391 | //* Modify ZECSFILE IDCAMS VSAM file definition 392 | //********************************************************************** 393 | //STEP35 EXEC PGM=IKJEFT1B,REGION=1024K 394 | //SYSPRINT DD SYSOUT=* 395 | //SYSTSPRT DD SYSOUT=* 396 | //INPUT DD DISP=SHR,DSN=@source_lib@(ZECSFILE) 397 | //OUTPUT DD DISP=(NEW,PASS),DSN=&&OUTPUT, 398 | // UNIT=VIO,SPACE=(80,(1000,1000)), 399 | // DCB=(LRECL=80,RECFM=FB) 400 | //STRINGS DD DISP=SHR,DSN=@source_lib@(CONFIG) 401 | //SYSTSIN DD * 402 | EXEC '@source_lib@(REXXREPL)' 403 | /* 404 | //********************************************************************** 405 | //* Replace ZECSFILE IDCAMS VSAM file definition 406 | //********************************************************************** 407 | //STEP36 EXEC PGM=IEBGENER,REGION=1024K 408 | //SYSPRINT DD SYSOUT=* 409 | //SYSUT1 DD DISP=(OLD,DELETE),DSN=&&OUTPUT 410 | //SYSUT2 DD DISP=SHR,DSN=@source_lib@(ZECSFILE) 411 | //SYSIN DD DUMMY 412 | //********************************************************************** 413 | //* Modify ZECSKEY IDCAMS VSAM file definition 414 | //********************************************************************** 415 | //STEP37 EXEC PGM=IKJEFT1B,REGION=1024K 416 | //SYSPRINT DD SYSOUT=* 417 | //SYSTSPRT DD SYSOUT=* 418 | //INPUT DD DISP=SHR,DSN=@source_lib@(ZECSKEY) 419 | //OUTPUT DD DISP=(NEW,PASS),DSN=&&OUTPUT, 420 | // UNIT=VIO,SPACE=(80,(1000,1000)), 421 | // DCB=(LRECL=80,RECFM=FB) 422 | //STRINGS DD DISP=SHR,DSN=@source_lib@(CONFIG) 423 | //SYSTSIN DD * 424 | EXEC '@source_lib@(REXXREPL)' 425 | /* 426 | //********************************************************************** 427 | //* Replace ZECSKEY IDCAMS VSAM file definition 428 | //********************************************************************** 429 | //STEP38 EXEC PGM=IEBGENER,REGION=1024K 430 | //SYSPRINT DD SYSOUT=* 431 | //SYSUT1 DD DISP=(OLD,DELETE),DSN=&&OUTPUT 432 | //SYSUT2 DD DISP=SHR,DSN=@source_lib@(ZECSKEY) 433 | //SYSIN DD DUMMY 434 | //********************************************************************** 435 | //* Modify ZECS000 program source 436 | //********************************************************************** 437 | //STEP39 EXEC PGM=IKJEFT1B,REGION=1024K 438 | //SYSPRINT DD SYSOUT=* 439 | //SYSTSPRT DD SYSOUT=* 440 | //INPUT DD DISP=SHR,DSN=@source_lib@(ZECS000) 441 | //OUTPUT DD DISP=(NEW,PASS),DSN=&&OUTPUT, 442 | // UNIT=VIO,SPACE=(80,(1000,1000)), 443 | // DCB=(LRECL=80,RECFM=FB) 444 | //STRINGS DD DISP=SHR,DSN=@source_lib@(CONFIG) 445 | //SYSTSIN DD * 446 | EXEC '@source_lib@(REXXREPL)' 447 | /* 448 | //********************************************************************** 449 | //* Replace ZECS000 program source 450 | //********************************************************************** 451 | //STEP40 EXEC PGM=IEBGENER,REGION=1024K 452 | //SYSPRINT DD SYSOUT=* 453 | //SYSUT1 DD DISP=(OLD,DELETE),DSN=&&OUTPUT 454 | //SYSUT2 DD DISP=SHR,DSN=@source_lib@(ZECS000) 455 | //SYSIN DD DUMMY 456 | //********************************************************************** 457 | //* Modify ZECS001 program source 458 | //********************************************************************** 459 | //STEP41 EXEC PGM=IKJEFT1B,REGION=1024K 460 | //SYSPRINT DD SYSOUT=* 461 | //SYSTSPRT DD SYSOUT=* 462 | //INPUT DD DISP=SHR,DSN=@source_lib@(ZECS001) 463 | //OUTPUT DD DISP=(NEW,PASS),DSN=&&OUTPUT, 464 | // UNIT=VIO,SPACE=(80,(1000,1000)), 465 | // DCB=(LRECL=80,RECFM=FB) 466 | //STRINGS DD DISP=SHR,DSN=@source_lib@(CONFIG) 467 | //SYSTSIN DD * 468 | EXEC '@source_lib@(REXXREPL)' 469 | /* 470 | //********************************************************************** 471 | //* Replace ZECS001 program source 472 | //********************************************************************** 473 | //STEP42 EXEC PGM=IEBGENER,REGION=1024K 474 | //SYSPRINT DD SYSOUT=* 475 | //SYSUT1 DD DISP=(OLD,DELETE),DSN=&&OUTPUT 476 | //SYSUT2 DD DISP=SHR,DSN=@source_lib@(ZECS001) 477 | //SYSIN DD DUMMY 478 | //********************************************************************** 479 | //* Modify ZECS002 program source 480 | //********************************************************************** 481 | //STEP43 EXEC PGM=IKJEFT1B,REGION=1024K 482 | //SYSPRINT DD SYSOUT=* 483 | //SYSTSPRT DD SYSOUT=* 484 | //INPUT DD DISP=SHR,DSN=@source_lib@(ZECS002) 485 | //OUTPUT DD DISP=(NEW,PASS),DSN=&&OUTPUT, 486 | // UNIT=VIO,SPACE=(80,(1000,1000)), 487 | // DCB=(LRECL=80,RECFM=FB) 488 | //STRINGS DD DISP=SHR,DSN=@source_lib@(CONFIG) 489 | //SYSTSIN DD * 490 | EXEC '@source_lib@(REXXREPL)' 491 | /* 492 | //********************************************************************** 493 | //* Replace ZECS002 program source 494 | //********************************************************************** 495 | //STEP44 EXEC PGM=IEBGENER,REGION=1024K 496 | //SYSPRINT DD SYSOUT=* 497 | //SYSUT1 DD DISP=(OLD,DELETE),DSN=&&OUTPUT 498 | //SYSUT2 DD DISP=SHR,DSN=@source_lib@(ZECS002) 499 | //SYSIN DD DUMMY 500 | //********************************************************************** 501 | //* Modify ZECS003 program source 502 | //********************************************************************** 503 | //STEP45 EXEC PGM=IKJEFT1B,REGION=1024K 504 | //SYSPRINT DD SYSOUT=* 505 | //SYSTSPRT DD SYSOUT=* 506 | //INPUT DD DISP=SHR,DSN=@source_lib@(ZECS003) 507 | //OUTPUT DD DISP=(NEW,PASS),DSN=&&OUTPUT, 508 | // UNIT=VIO,SPACE=(80,(1000,1000)), 509 | // DCB=(LRECL=80,RECFM=FB) 510 | //STRINGS DD DISP=SHR,DSN=@source_lib@(CONFIG) 511 | //SYSTSIN DD * 512 | EXEC '@source_lib@(REXXREPL)' 513 | /* 514 | //********************************************************************** 515 | //* Replace ZECS003 program source 516 | //********************************************************************** 517 | //STEP46 EXEC PGM=IEBGENER,REGION=1024K 518 | //SYSPRINT DD SYSOUT=* 519 | //SYSUT1 DD DISP=(OLD,DELETE),DSN=&&OUTPUT 520 | //SYSUT2 DD DISP=SHR,DSN=@source_lib@(ZECS003) 521 | //SYSIN DD DUMMY 522 | //********************************************************************** 523 | //* Modify ZECSNC program source 524 | //********************************************************************** 525 | //STEP47 EXEC PGM=IKJEFT1B,REGION=1024K 526 | //SYSPRINT DD SYSOUT=* 527 | //SYSTSPRT DD SYSOUT=* 528 | //INPUT DD DISP=SHR,DSN=@source_lib@(ZECSNC) 529 | //OUTPUT DD DISP=(NEW,PASS),DSN=&&OUTPUT, 530 | // UNIT=VIO,SPACE=(80,(1000,1000)), 531 | // DCB=(LRECL=80,RECFM=FB) 532 | //STRINGS DD DISP=SHR,DSN=@source_lib@(CONFIG) 533 | //SYSTSIN DD * 534 | EXEC '@source_lib@(REXXREPL)' 535 | /* 536 | //********************************************************************** 537 | //* Replace ZECSNC program source 538 | //********************************************************************** 539 | //STEP48 EXEC PGM=IEBGENER,REGION=1024K 540 | //SYSPRINT DD SYSOUT=* 541 | //SYSUT1 DD DISP=(OLD,DELETE),DSN=&&OUTPUT 542 | //SYSUT2 DD DISP=SHR,DSN=@source_lib@(ZECSNC) 543 | //SYSIN DD DUMMY 544 | //********************************************************************** 545 | //* Modify ZECSPLT program source 546 | //********************************************************************** 547 | //STEP49 EXEC PGM=IKJEFT1B,REGION=1024K 548 | //SYSPRINT DD SYSOUT=* 549 | //SYSTSPRT DD SYSOUT=* 550 | //INPUT DD DISP=SHR,DSN=@source_lib@(ZECSPLT) 551 | //OUTPUT DD DISP=(NEW,PASS),DSN=&&OUTPUT, 552 | // UNIT=VIO,SPACE=(80,(1000,1000)), 553 | // DCB=(LRECL=80,RECFM=FB) 554 | //STRINGS DD DISP=SHR,DSN=@source_lib@(CONFIG) 555 | //SYSTSIN DD * 556 | EXEC '@source_lib@(REXXREPL)' 557 | /* 558 | //********************************************************************** 559 | //* Replace ZECSPLT program source 560 | //********************************************************************** 561 | //STEP50 EXEC PGM=IEBGENER,REGION=1024K 562 | //SYSPRINT DD SYSOUT=* 563 | //SYSUT1 DD DISP=(OLD,DELETE),DSN=&&OUTPUT 564 | //SYSUT2 DD DISP=SHR,DSN=@source_lib@(ZECSPLT) 565 | //SYSIN DD DUMMY 566 | //* 567 | // -------------------------------------------------------------------------------- /JCL/CSDZECS.jcl: -------------------------------------------------------------------------------- 1 | //CSDZECS JOB @job_parms@ 2 | //********************************************************************** 3 | //* Define CSD definitions for ZECS 4 | //********************************************************************** 5 | //ZECSGRP EXEC PGM=DFHCSDUP 6 | //STEPLIB DD DISP=SHR,DSN=@cics_hlq@.SDFHLOAD 7 | //DFHCSD DD DISP=SHR,DSN=@cics_csd@ 8 | //SYSPRINT DD SYSOUT=*,DCB=(BLKSIZE=133) 9 | //SYSIN DD DISP=SHR,DSN=@source_lib@(CSDZECS) 10 | // -------------------------------------------------------------------------------- /JCL/CSDZECSN.jcl: -------------------------------------------------------------------------------- 1 | //CSDZECSN JOB @job_parms@ 2 | //********************************************************************** 3 | //* Define http support for ZECS 4 | //********************************************************************** 5 | //STEP01 EXEC PGM=DFHCSDUP 6 | //STEPLIB DD DISP=SHR,DSN=@cics_hlq@.SDFHLOAD 7 | //DFHCSD DD DISP=SHR,DSN=@cics_csd@ 8 | //SYSPRINT DD SYSOUT=*,DCB=(BLKSIZE=133) 9 | //SYSIN DD DISP=SHR,DSN=@source_lib@(CSDZECSN) 10 | // -------------------------------------------------------------------------------- /JCL/CSDZECSR.jcl: -------------------------------------------------------------------------------- 1 | //CSDZECSR JOB @job_parms@ 2 | //********************************************************************** 3 | //* Define replication TCPIPService for ZECS 4 | //********************************************************************** 5 | //STEP01 EXEC PGM=DFHCSDUP 6 | //STEPLIB DD DISP=SHR,DSN=@cics_hlq@.SDFHLOAD 7 | //DFHCSD DD DISP=SHR,DSN=@cics_csd@ 8 | //SYSPRINT DD SYSOUT=*,DCB=(BLKSIZE=133) 9 | //SYSIN DD DISP=SHR,DSN=@source_lib@(CSDZECSR) 10 | // -------------------------------------------------------------------------------- /JCL/CSDZECSS.jcl: -------------------------------------------------------------------------------- 1 | //CSDZECSS JOB @job_parms@ 2 | //********************************************************************** 3 | //* Define https support for ZECS 4 | //********************************************************************** 5 | //STEP01 EXEC PGM=DFHCSDUP 6 | //STEPLIB DD DISP=SHR,DSN=@cics_hlq@.SDFHLOAD 7 | //DFHCSD DD DISP=SHR,DSN=@cics_csd@ 8 | //SYSPRINT DD SYSOUT=*,DCB=(BLKSIZE=133) 9 | //SYSIN DD DISP=SHR,DSN=@source_lib@(CSDZECSS) 10 | // -------------------------------------------------------------------------------- /JCL/DEFEXPR.jcl: -------------------------------------------------------------------------------- 1 | //DEFEXPR JOB @job_parms@ 2 | //********************************************************************** 3 | //* Customize expiry file for each enterprise caching environment 4 | //********************************************************************** 5 | //* Create config file for following steps 6 | //********************************************************************** 7 | //CONFIG EXEC PGM=IEBGENER,REGION=1024K 8 | //SYSPRINT DD SYSOUT=* 9 | //SYSUT1 DD * 10 | @environment@ DEV 11 | /* 12 | //SYSUT2 DD DISP=(NEW,PASS),DSN=&&STRINGS, 13 | // UNIT=VIO,SPACE=(80,(1000,1000)), 14 | // DCB=(LRECL=80,RECFM=FB) 15 | //SYSIN DD DUMMY 16 | //********************************************************************** 17 | //* Customize the DFHCSDUP DEFINE statements and pass to next step 18 | //********************************************************************** 19 | //CUSTOMIZ EXEC PGM=IKJEFT1B 20 | //SYSPRINT DD SYSOUT=* 21 | //SYSTSPRT DD SYSOUT=* 22 | //INPUT DD DISP=SHR,DSN=@source_lib@(CSDZECSX) 23 | //OUTPUT DD DISP=(NEW,PASS),DSN=&&CSDCMDS, 24 | // UNIT=VIO,SPACE=(80,(1000,1000)), 25 | // DCB=(LRECL=80,RECFM=FB) 26 | //STRINGS DD DISP=(OLD,PASS),DSN=&&STRINGS 27 | //SYSTSIN DD * 28 | EXEC '@source_lib@(REXXREPL)' 29 | /* 30 | //********************************************************************** 31 | //* Define the CSD definition for the ZCEXPIRE file 32 | //********************************************************************** 33 | //DEFINE EXEC PGM=DFHCSDUP 34 | //STEPLIB DD DISP=SHR,DSN=@cics_hlq@.SDFHLOAD 35 | //DFHCSD DD DISP=SHR,DSN=@cics_csd@ 36 | //SYSPRINT DD SYSOUT=*,DCB=(BLKSIZE=133) 37 | //SYSIN DD DISP=SHR,DSN=&&CSDCMDS 38 | //********************************************************************** 39 | //* Customize the ZCEXPIRE IDCAMS statements and pass to next step 40 | //********************************************************************** 41 | //ECSFILEC EXEC PGM=IKJEFT1B 42 | //SYSPRINT DD SYSOUT=* 43 | //SYSTSPRT DD SYSOUT=* 44 | //INPUT DD DISP=SHR,DSN=@source_lib@(ZCEXPIRE) 45 | //OUTPUT DD DISP=(NEW,PASS),DSN=&&ZCEXPIRE, 46 | // UNIT=VIO,SPACE=(80,(1000,1000)), 47 | // DCB=(LRECL=80,RECFM=FB) 48 | //STRINGS DD DISP=(OLD,PASS),DSN=&&STRINGS 49 | //SYSTSIN DD * 50 | EXEC '@source_lib@(REXXREPL)' 51 | /* 52 | //********************************************************************** 53 | //* Define the ZCEXPIRE for one enterprise caching environment 54 | //********************************************************************** 55 | //ECSFILED EXEC PGM=IDCAMS 56 | //SYSPRINT DD SYSOUT=*,DCB=(BLKSIZE=133) 57 | //SYSIN DD DISP=SHR,DSN=&&ZCEXPIRE 58 | //* 59 | // -------------------------------------------------------------------------------- /JCL/DEFZC##.jcl: -------------------------------------------------------------------------------- 1 | //DEFZC## JOB @job_parms@ 2 | //********************************************************************** 3 | //* Customize and define one instance of zECS 4 | //********************************************************************** 5 | //* Copy configuration to a temporary file 6 | //********************************************************************** 7 | //CONFIG EXEC PGM=IEBGENER,REGION=1024K 8 | //SYSPRINT DD SYSOUT=* 9 | //SYSUT1 DD * 10 | * Path is created as follows /resources/ecs/@org@/@appname@ 11 | @appname@ sessionData 12 | @environment@ DEV 13 | @grp_list@ @csd_list@ 14 | @id@ 00 15 | @org@ devops 16 | @pri_cyl@ 100 17 | @scheme@ http 18 | @sec_cyl@ 10 19 | /* 20 | //SYSUT2 DD DISP=(NEW,PASS),DSN=&&STRINGS, 21 | // UNIT=VIO,SPACE=(80,(1000,1000)), 22 | // DCB=(LRECL=80,RECFM=FB) 23 | //SYSIN DD DUMMY 24 | //********************************************************************** 25 | //* Customize the DFHCSDUP DEFINE statements and pass to next step 26 | //********************************************************************** 27 | //CUSTOMIZ EXEC PGM=IKJEFT1B 28 | //SYSPRINT DD SYSOUT=* 29 | //SYSTSPRT DD SYSOUT=* 30 | //INPUT DD DISP=SHR,DSN=@source_lib@(CSDZC##) 31 | //OUTPUT DD DISP=(NEW,PASS),DSN=&&CSDCMDS, 32 | // UNIT=VIO,SPACE=(80,(1000,1000)), 33 | // DCB=(LRECL=80,RECFM=FB) 34 | //STRINGS DD DISP=(OLD,PASS),DSN=&&STRINGS 35 | //SYSTSIN DD * 36 | EXEC '@source_lib@(REXXREPL)' 37 | /* 38 | //********************************************************************** 39 | //* Define the CSD definitions for one instance of zECS 40 | //********************************************************************** 41 | //DEFINE EXEC PGM=DFHCSDUP 42 | //STEPLIB DD DISP=SHR,DSN=@cics_hlq@.SDFHLOAD 43 | //DFHCSD DD DISP=SHR,DSN=@cics_csd@ 44 | //SYSPRINT DD SYSOUT=*,DCB=(BLKSIZE=133) 45 | //SYSIN DD DISP=SHR,DSN=&&CSDCMDS 46 | //********************************************************************** 47 | //* Customize the ECSFILE IDCAMS statements and pass to next step 48 | //********************************************************************** 49 | //ECSFILEC EXEC PGM=IKJEFT1B 50 | //SYSPRINT DD SYSOUT=* 51 | //SYSTSPRT DD SYSOUT=* 52 | //INPUT DD DISP=SHR,DSN=@source_lib@(ZECSFILE) 53 | //OUTPUT DD DISP=(NEW,PASS),DSN=&&ZECSFILE, 54 | // UNIT=VIO,SPACE=(80,(1000,1000)), 55 | // DCB=(LRECL=80,RECFM=FB) 56 | //STRINGS DD DISP=(OLD,PASS),DSN=&&STRINGS 57 | //SYSTSIN DD * 58 | EXEC '@source_lib@(REXXREPL)' 59 | /* 60 | //********************************************************************** 61 | //* Define the ECSFILE for one instance of zECS 62 | //********************************************************************** 63 | //ECSFILED EXEC PGM=IDCAMS 64 | //SYSPRINT DD SYSOUT=*,DCB=(BLKSIZE=133) 65 | //SYSIN DD DISP=SHR,DSN=&&ZECSFILE 66 | //********************************************************************** 67 | //* Customize the ECSKEY IDCAMS statements and pass to next step 68 | //********************************************************************** 69 | //ECSKEYC EXEC PGM=IKJEFT1B 70 | //SYSPRINT DD SYSOUT=* 71 | //SYSTSPRT DD SYSOUT=* 72 | //INPUT DD DISP=SHR,DSN=@source_lib@(ZECSKEY) 73 | //OUTPUT DD DISP=(NEW,PASS),DSN=&&ZECSKEY, 74 | // UNIT=VIO,SPACE=(80,(1000,1000)), 75 | // DCB=(LRECL=80,RECFM=FB) 76 | //STRINGS DD DISP=(OLD,PASS),DSN=&&STRINGS 77 | //SYSTSIN DD * 78 | EXEC '@source_lib@(REXXREPL)' 79 | /* 80 | //********************************************************************** 81 | //* Define the ECSKEY for one instance of zECS 82 | //********************************************************************** 83 | //ECSKEYD EXEC PGM=IDCAMS 84 | //SYSPRINT DD SYSOUT=*,DCB=(BLKSIZE=133) 85 | //SYSIN DD DISP=SHR,DSN=&&ZECSKEY 86 | //* 87 | // -------------------------------------------------------------------------------- /JCL/ZC##DC.jcl: -------------------------------------------------------------------------------- 1 | //ZC##DC JOB @job_parms@ 2 | //********************************************************************** 3 | //* Customize and define replication for one instance of zECS 4 | //********************************************************************** 5 | //* To use this job repeatedly 6 | //* Change ## to the @id@ value, example: C ## 01 ALL 7 | //* Customize replication parameters 8 | //* Note: the scheme used below must match @scheme@ in DEFZC## 9 | //* Submit 10 | //* Enter CANCEL on the command line to cancel changes and exit edit 11 | //********************************************************************** 12 | //* Create ZC##DC document template member 13 | //********************************************************************** 14 | //CREATE EXEC PGM=IEBGENER,REGION=1024K 15 | //SYSPRINT DD SYSOUT=* 16 | //SYSUT1 DD * 17 | type: AS 18 | http://sysplex01-ecs.mycompany.com:@rep_port@ 19 | /* 20 | //SYSUT2 DD DISP=SHR,DSN=@doct_lib@(ZC##DC) 21 | //SYSIN DD DUMMY 22 | //********************************************************************** 23 | //* Define ZC##DC document template definition 24 | //********************************************************************** 25 | //DEFDOCT EXEC PGM=DFHCSDUP 26 | //STEPLIB DD DISP=SHR,DSN=@cics_hlq@.SDFHLOAD 27 | //DFHCSD DD DISP=SHR,DSN=@cics_csd@ 28 | //SYSPRINT DD SYSOUT=*,DCB=(BLKSIZE=133) 29 | //SYSIN DD * 30 | DEFINE DOCTEMPLATE(ZC##DC) GROUP(ZC##) 31 | TEMPLATENAME(ZC##DC) DDNAME(@doct_dd@) MEMBERNAME(ZC##DC) 32 | APPENDCRLF(YES) TYPE(EBCDIC) 33 | /* 34 | // -------------------------------------------------------------------------------- /JCL/ZC##SD.jcl: -------------------------------------------------------------------------------- 1 | //ZC##SD JOB @job_parms@ 2 | //********************************************************************** 3 | //* Customize and define security definition for one instance of zECS 4 | //********************************************************************** 5 | //* To use this job repeatedly 6 | //* Change ## to the @id@ value, example: C ## 01 ALL 7 | //* Customize SYSUT1 with the USERIDs and their access levels 8 | //* Submit 9 | //* Enter CANCEL on the command line to cancel changes and exit edit 10 | //********************************************************************** 11 | //* Create ZC##SD document template definition 12 | //********************************************************************** 13 | //CREATE EXEC PGM=IEBGENER,REGION=1024K 14 | //SYSPRINT DD SYSOUT=* 15 | //SYSUT1 DD * 16 | User=USERID ,SELECT 17 | User=USERID ,UPDATE 18 | User=USERID ,DELETE 19 | /* 20 | //SYSUT2 DD DISP=SHR,DSN=@doct_lib@(ZC##SD) 21 | //SYSIN DD DUMMY 22 | //********************************************************************** 23 | //* Define ZC##SD document template definition 24 | //********************************************************************** 25 | //DEFDOCT EXEC PGM=DFHCSDUP 26 | //STEPLIB DD DISP=SHR,DSN=@cics_hlq@.SDFHLOAD 27 | //DFHCSD DD DISP=SHR,DSN=@cics_csd@ 28 | //SYSPRINT DD SYSOUT=*,DCB=(BLKSIZE=133) 29 | //SYSIN DD * 30 | DEFINE DOCTEMPLATE(ZC##SD) GROUP(ZC##) 31 | TEMPLATENAME(ZC##SD) DDNAME(@doct_dd@) MEMBERNAME(ZC##SD) 32 | APPENDCRLF(YES) TYPE(EBCDIC) 33 | /* 34 | // -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "{}" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright {yyyy} {name of copyright owner} 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Synopsis 2 | 3 | Enterprise Caching System (zECS) is a cloud enabled distributed key/value pair caching service in the z/OS environment. Very high performing and high available system used to store text or binary content. Single instances can be shared by multiple clients or unique instances can be defined for each individual client. 4 | 5 | - L2 Distributed write thru cache to persistent disk 6 | - Key/Value structure 7 | - Key can be from 1 to 255 bytes 8 | - Key names are case sensitive, "Rangers" is different than "rangers". 9 | - Key cannot contain embedded spaces. 10 | - Value can be from 1 byte to 3.2 Megabytes 11 | - Both text and binary data values are accepted. 12 | - HTTP/HTTPS transmission depending on if data is needing to be secured in transit 13 | - Transactional based system (geared for high volume I/O) 14 | - Basic authentication access (RACF security) for CRUD operations 15 | - ACID compliant (Atomic, Consistent, Isolation, Durable) 16 | - RESTful service supporting: 17 | - GET: Retrieve key/value 18 | - POST: Writes key/value to instance, creates new keys and updates existing key values. 19 | - PUT: Writes key/value to instance, creates new keys and updates existing key values. 20 | - DELETE: Delete a key/value from the instance 21 | - Built-in expiration process. 22 | - Clear entire cache instance with single request 23 | - Six Sigma Availablility: 24 | - Active/Single (High Availability at a single data center) 25 | - Active/Standby (High Availability across multiple data centers) 26 | - Active/Active (Continuous Availability across multiple data centers) 27 | 28 | As part of the product there is a built-in expiration process that runs automatically in the background. Refer to the installation instructions on setting up zECS instances. Expiration process continually scans the zECS data looking for keys that have expired and removes them. There are no additional web service calls required to initiate or trigger this component. Based on max time to live values, keys will never live more than 24 hours. 29 | 30 | ## About this project 31 | 32 | Please refer to the following locations for additional info regarding this project: 33 | 34 | - [System Requirements and Considerations.md](./System%20Requirements%20and%20Considerations.md) for minimum software version requirements and key environment configuration considerations 35 | - [Installation.md](./Installation.md) for instructions on installing and setting up this service 36 | - [Usage.md](./Usage.md) for API descriptions, sample code snippets for consuming the service, other usage related details 37 | 38 | ### Contributors 39 | 40 | - **_Randy Frerking_**, Walmart Technology 41 | - **_Rich Jackson_**, Walmart Technology 42 | - **_Michael Karagines_**, Walmart Technology 43 | - **_Trey Vanderpool_**, Walmart Technology 44 | 45 | -------------------------------------------------------------------------------- /Source/CONFIG.txt: -------------------------------------------------------------------------------- 1 | * @auth@ is the value of the AUTHENTICATE parameter for 2 | * the https definition 3 | * @certficate@ is for the CERTIFICATE parameter in the 4 | * TCPIPService definition. Specify certificate as 5 | * CERTIFICATE(server-ssl-certificate-name) 6 | * @cics_csd@ is the dataset name of the CICS CSD 7 | * @cics_hlq@ is the high level qualifier for CICS datasets 8 | * @csd_list@ is the CSD group list name 9 | * @data_class@ is the data class to use for ZECS files 10 | * @doct_dd@ is the document template DDNAME defined to CICS region 11 | * @doct_lib@ is the document template dataset name defined to CICS 12 | * @ecs_hlq@ is the high level qualifier for ZECS files 13 | * @http_port@ is the http port number for the enterprise caching service 14 | * @https_port@ is the https port number for the enterprise caching service 15 | * @job_parms@ are the parms following JOB in the JOB card 16 | * @mgt_class@ is the management class to use for ZECS files 17 | * @proc_lib@ is the dataset containing the customized version 18 | * of the DFHEITAL proc supplied by IBM 19 | * @program_lib@ is the dataset to be used for ZECS programs 20 | * @rep_port@ is the replication port number 21 | * @source_lib@ is the dataset containing ZECS source code. This lib. 22 | * @stg_class@ is the storage class to use for ZECS files 23 | * @tdq@ is the TDQ for messages. Must be 4 bytes 24 | ********************************************************************** 25 | @auth@ NO 26 | @certficate@ 27 | @cics_csd@ CICSTS52.CICS.DFHCSD 28 | @cics_hlq@ CICSTS52.CICS 29 | @csd_list@ DEFAULT 30 | @data_class@ DATACLAS 31 | @doct_dd@ DOCTDD 32 | @doct_lib@ CICSTS.DOCTEMP 33 | @ecs_hlq@ CICSTS.ZECS 34 | @http_port@ 50100 35 | @https_port@ 50101 36 | @job_parms@ MSGCLASS=R,NOTIFY=&SYSUID 37 | @mgt_class@ MGTCLASS 38 | @proc_lib@ CICSTS.CICS.PROCLIB 39 | @program_lib@ CICSTS.CICS.LINKLIB 40 | @rep_port@ 50102 41 | @source_lib@ CICSTS.ZECS.SOURCE 42 | @stg_class@ STGCLASS 43 | @tdq@ CSSL -------------------------------------------------------------------------------- /Source/CSDZC##.rdo: -------------------------------------------------------------------------------- 1 | DEFINE FILE(ZC@id@FILE) GROUP(ZC@id@) 2 | DSNAME(@ecs_hlq@.ZC@id@FILE.@environment@) 3 | RLSACCESS(YES) LSRPOOLNUM(1) 4 | READINTEG(UNCOMMITTED) DSNSHARING(ALLREQS) STRINGS(255) 5 | STATUS(ENABLED) OPENTIME(FIRSTREF) DISPOSITION(SHARE) 6 | DATABUFFERS(256) INDEXBUFFERS(255) TABLE(NO) MAXNUMRECS(NOLIMIT) 7 | UPDATEMODEL(LOCKING) LOAD(NO) RECORDFORMAT(V) ADD(YES) 8 | BROWSE(YES) DELETE(YES) READ(YES) UPDATE(YES) JOURNAL(NO) 9 | JNLREAD(NONE) JNLSYNCREAD(NO) JNLUPDATE(NO) JNLADD(NONE) 10 | JNLSYNCWRITE(NO) RECOVERY(NONE) FWDRECOVLOG(NO) 11 | BACKUPTYPE(STATIC) 12 | DEFINE FILE(ZC@id@KEY) GROUP(ZC@id@) 13 | DSNAME(@ecs_hlq@.ZC@id@KEY.@environment@) 14 | RLSACCESS(YES) LSRPOOLNUM(1) 15 | READINTEG(UNCOMMITTED) DSNSHARING(ALLREQS) STRINGS(255) 16 | STATUS(ENABLED) OPENTIME(FIRSTREF) DISPOSITION(SHARE) 17 | DATABUFFERS(256) INDEXBUFFERS(255) TABLE(NO) MAXNUMRECS(NOLIMIT) 18 | UPDATEMODEL(LOCKING) LOAD(NO) RECORDFORMAT(V) ADD(YES) 19 | BROWSE(YES) DELETE(YES) READ(YES) UPDATE(YES) JOURNAL(NO) 20 | JNLREAD(NONE) JNLSYNCREAD(NO) JNLUPDATE(NO) JNLADD(NONE) 21 | JNLSYNCWRITE(NO) RECOVERY(NONE) FWDRECOVLOG(NO) 22 | BACKUPTYPE(STATIC) 23 | DEFINE TRANCLASS(TCLZC@id@) GROUP(ZC@id@) 24 | MAXACTIVE(100) PURGETHRESH(10) 25 | DEFINE TRANCLASS(TCLZD@id@) GROUP(ZC@id@) 26 | MAXACTIVE(100) PURGETHRESH(NO) 27 | DEFINE TRANCLASS(TCLZR@id@) GROUP(ZC@id@) 28 | MAXACTIVE(100) PURGETHRESH(NO) 29 | DEFINE TRANCLASS(TCLZX@id@) GROUP(ZC@id@) 30 | MAXACTIVE(100) PURGETHRESH(NO) 31 | DEFINE TRANSACTION(ZC@id@) GROUP(ZC@id@) 32 | PROGRAM(ZECS001) TWASIZE(0) PROFILE(DFHCICST) STATUS(ENABLED) 33 | TASKDATALOC(ANY) TASKDATAKEY(USER) STORAGECLEAR(NO) 34 | RUNAWAY(SYSTEM) SHUTDOWN(DISABLED) ISOLATE(YES) DYNAMIC(NO) 35 | ROUTABLE(NO) PRIORITY(1) TRANCLASS(TCLZC@id@) DTIMOUT(NO) 36 | RESTART(NO) SPURGE(NO) TPURGE(NO) DUMP(YES) TRACE(YES) 37 | CONFDATA(NO) OTSTIMEOUT(NO) ACTION(BACKOUT) WAIT(YES) 38 | WAITTIME(0,0,0) RESSEC(NO) CMDSEC(NO) 39 | DEFINE TRANSACTION(ZD@id@) GROUP(ZC@id@) 40 | PROGRAM(ZECS001) TWASIZE(0) PROFILE(DFHCICST) STATUS(ENABLED) 41 | TASKDATALOC(ANY) TASKDATAKEY(USER) STORAGECLEAR(NO) 42 | RUNAWAY(SYSTEM) SHUTDOWN(DISABLED) ISOLATE(YES) DYNAMIC(NO) 43 | ROUTABLE(NO) PRIORITY(1) TRANCLASS(TCLZD@id@) DTIMOUT(NO) 44 | RESTART(NO) SPURGE(NO) TPURGE(NO) DUMP(YES) TRACE(YES) 45 | CONFDATA(NO) OTSTIMEOUT(NO) ACTION(BACKOUT) WAIT(YES) 46 | WAITTIME(0,0,0) RESSEC(NO) CMDSEC(NO) 47 | DEFINE TRANSACTION(ZR@id@) GROUP(ZC@id@) 48 | PROGRAM(ZECS001) TWASIZE(0) PROFILE(DFHCICST) STATUS(ENABLED) 49 | TASKDATALOC(ANY) TASKDATAKEY(USER) STORAGECLEAR(NO) 50 | RUNAWAY(SYSTEM) SHUTDOWN(DISABLED) ISOLATE(YES) DYNAMIC(NO) 51 | ROUTABLE(NO) PRIORITY(1) TRANCLASS(TCLZR@id@) DTIMOUT(NO) 52 | RESTART(NO) SPURGE(NO) TPURGE(NO) DUMP(YES) TRACE(YES) 53 | CONFDATA(NO) OTSTIMEOUT(NO) ACTION(BACKOUT) WAIT(YES) 54 | WAITTIME(0,0,0) RESSEC(NO) CMDSEC(NO) 55 | DEFINE TRANSACTION(ZX@id@) GROUP(ZC@id@) 56 | PROGRAM(ZECS000) TWASIZE(0) PROFILE(DFHCICST) STATUS(ENABLED) 57 | TASKDATALOC(ANY) TASKDATAKEY(USER) STORAGECLEAR(NO) 58 | RUNAWAY(SYSTEM) SHUTDOWN(DISABLED) ISOLATE(YES) DYNAMIC(NO) 59 | ROUTABLE(NO) PRIORITY(1) TRANCLASS(TCLZX@id@) DTIMOUT(NO) 60 | RESTART(NO) SPURGE(NO) TPURGE(NO) DUMP(YES) TRACE(YES) 61 | CONFDATA(NO) OTSTIMEOUT(NO) ACTION(BACKOUT) WAIT(YES) 62 | WAITTIME(0,0,0) RESSEC(NO) CMDSEC(NO) 63 | DEFINE URIMAP(ZC@id@) GROUP(ZC@id@) 64 | STATUS(ENABLED) USAGE(SERVER) SCHEME(@scheme@) PORT(NO) HOST(*) 65 | PATH(/resources/ecs/@org@/@appname@*) ANALYZER(YES) 66 | TRANSACTION(ZC@id@) PROGRAM(ZECS001) REDIRECTTYPE(NONE) 67 | DEFINE URIMAP(ZC@id@D) GROUP(ZC@id@) 68 | STATUS(ENABLED) USAGE(SERVER) SCHEME(@scheme@) PORT(NO) HOST(*) 69 | PATH(/deplicate/ecs/@org@/@appname@*) ANALYZER(YES) 70 | TRANSACTION(ZD@id@) PROGRAM(ZECS001) REDIRECTTYPE(NONE) 71 | DEFINE URIMAP(ZC@id@R) GROUP(ZC@id@) 72 | STATUS(ENABLED) USAGE(SERVER) SCHEME(@scheme@) PORT(NO) HOST(*) 73 | PATH(/replicate/ecs/@org@/@appname@*) ANALYZER(YES) 74 | TRANSACTION(ZR@id@) PROGRAM(ZECS001) REDIRECTTYPE(NONE) 75 | ADD GROUP(ZC@id@) LIST(@grp_list@) -------------------------------------------------------------------------------- /Source/CSDZECS.rdo: -------------------------------------------------------------------------------- 1 | DEFINE PROGRAM(ZECS000) GROUP(ZECS) 2 | LANGUAGE(COBOL) RELOAD(NO) RESIDENT(NO) USAGE(NORMAL) 3 | USELPACOPY(NO) STATUS(ENABLED) CEDF(YES) DATALOCATION(ANY) 4 | EXECKEY(CICS) CONCURRENCY(THREADSAFE) API(OPENAPI) DYNAMIC(NO) 5 | EXECUTIONSET(FULLAPI) JVM(NO) 6 | DEFINE PROGRAM(ZECS0001) GROUP(ZECS) 7 | LANGUAGE(COBOL) RELOAD(NO) RESIDENT(NO) USAGE(NORMAL) 8 | USELPACOPY(NO) STATUS(ENABLED) CEDF(YES) DATALOCATION(ANY) 9 | EXECKEY(CICS) CONCURRENCY(THREADSAFE) API(OPENAPI) DYNAMIC(NO) 10 | EXECUTIONSET(FULLAPI) JVM(NO) 11 | DEFINE PROGRAM(ZECS002) GROUP(ZECS) 12 | LANGUAGE(ASSEMBLER) RELOAD(NO) RESIDENT(NO) USAGE(NORMAL) 13 | USELPACOPY(NO) STATUS(ENABLED) CEDF(YES) DATALOCATION(ANY) 14 | EXECKEY(CICS) CONCURRENCY(THREADSAFE) API(OPENAPI) DYNAMIC(NO) 15 | EXECUTIONSET(FULLAPI) JVM(NO) 16 | DEFINE PROGRAM(ZECS003) GROUP(ZECS) 17 | LANGUAGE(ASSEMBLER) RELOAD(NO) RESIDENT(NO) USAGE(NORMAL) 18 | USELPACOPY(NO) STATUS(ENABLED) CEDF(YES) DATALOCATION(ANY) 19 | EXECKEY(CICS) CONCURRENCY(THREADSAFE) API(OPENAPI) DYNAMIC(NO) 20 | EXECUTIONSET(FULLAPI) JVM(NO) 21 | DEFINE PROGRAM(ZECSPLT) GROUP(ZECS) 22 | LANGUAGE(COBOL) RELOAD(NO) RESIDENT(NO) USAGE(NORMAL) 23 | USELPACOPY(NO) STATUS(ENABLED) CEDF(YES) DATALOCATION(ANY) 24 | EXECKEY(CICS) CONCURRENCY(THREADSAFE) API(OPENAPI) DYNAMIC(NO) 25 | EXECUTIONSET(FULLAPI) JVM(NO) 26 | DEFINE TRANSACTION(ZNCD) GROUP(ZECS) 27 | PROGRAM(ZECSNC) TWASIZE(0) PROFILE(DFHCICST) STATUS(ENABLED) 28 | TASKDATALOC(ANY) TASKDATAKEY(USER) STORAGECLEAR(NO) 29 | RUNAWAY(SYSTEM) SHUTDOWN(DISABLED) ISOLATE(YES) DYNAMIC(NO) 30 | ROUTABLE(NO) PRIORITY(50) TRANCLASS(DFHTCL00) DTIMOUT(NO) 31 | RESTART(NO) SPURGE(YES) TPURGE(YES) DUMP(YES) TRACE(YES) 32 | CONFDATA(NO) OTSTIMEOUT(NO) ACTION(BACKOUT) WAIT(NO) 33 | WAITTIME(0,0,0) RESSEC(NO) CMDSEC(NO) 34 | DEFINE TRANSACTION(ZPLT) GROUP(ZECS) 35 | PROGRAM(ZECSPLT) TWASIZE(0) PROFILE(DFHCICST) STATUS(ENABLED) 36 | TASKDATALOC(ANY) TASKDATAKEY(USER) STORAGECLEAR(NO) 37 | RUNAWAY(SYSTEM) SHUTDOWN(DISABLED) ISOLATE(YES) DYNAMIC(NO) 38 | ROUTABLE(NO) PRIORITY(50) TRANCLASS(DFHTCL00) DTIMOUT(NO) 39 | RESTART(NO) SPURGE(YES) TPURGE(YES) DUMP(YES) TRACE(YES) 40 | CONFDATA(NO) OTSTIMEOUT(NO) ACTION(BACKOUT) WAIT(NO) 41 | WAITTIME(0,0,0) RESSEC(NO) CMDSEC(NO) 42 | ADD GROUP(ZECS) LIST(@csd_list@) -------------------------------------------------------------------------------- /Source/CSDZECSN.rdo: -------------------------------------------------------------------------------- 1 | DEFINE TCPIPSERVICE(ZECSNSSL) GROUP(ZECS) 2 | DESCRIPTION(ZECS HTTP PORT) 3 | URM(DFHWBADX) PORTNUMBER(@http_port@) STATUS(OPEN) PROTOCOL(HTTP) 4 | TRANSACTION(CWXN) BACKLOG(50) HOST(ANY) IPADDRESS(ANY) 5 | SOCKETCLOSE(5) MAXPERSIST(NO) MAXDATALEN(32768) SSL(NO) 6 | AUTHENTICATE(NO) -------------------------------------------------------------------------------- /Source/CSDZECSR.rdo: -------------------------------------------------------------------------------- 1 | DEFINE TCPIPSERVICE(ZECSREPL) GROUP(ZECS) 2 | DESCRIPTION(ZECS REPLICATION PORT) 3 | URM(DFHWBADX) PORTNUMBER(@rep_port@) STATUS(OPEN) PROTOCOL(HTTP) 4 | TRANSACTION(CWXN) BACKLOG(50) HOST(ANY) IPADDRESS(ANY) 5 | SOCKETCLOSE(5) MAXPERSIST(NO) MAXDATALEN(32768) SSL(NO) 6 | AUTHENTICATE(NO) -------------------------------------------------------------------------------- /Source/CSDZECSS.rdo: -------------------------------------------------------------------------------- 1 | DEFINE TCPIPSERVICE(ZECSSSL) GROUP(ZECS) 2 | DESCRIPTION(ZECS HTTPS PORT) 3 | URM(DFHWBADX) PORTNUMBER(@https_port@) STATUS(OPEN) PROTOCOL(HTTP) 4 | TRANSACTION(CWXN) BACKLOG(50) HOST(ANY) IPADDRESS(ANY) 5 | SOCKETCLOSE(5) MAXPERSIST(NO) MAXDATALEN(32768) SSL(YES) 6 | CIPHERS(3538392F32330A16131512) AUTHENTICATE(@auth@) 7 | @certficate@ -------------------------------------------------------------------------------- /Source/CSDZECSX.rdo: -------------------------------------------------------------------------------- 1 | DEFINE FILE(ZCEXPIRE) GROUP(ZECS) 2 | DSNAME(@ecs_hlq@.ZCEXPIRE.@environment@) 3 | RLSACCESS(YES) 4 | LSRPOOLNUM(1) READINTEG(UNCOMMITTED) DSNSHARING(ALLREQS) 5 | STRINGS(255) STATUS(ENABLED) OPENTIME(STARTUP) 6 | DISPOSITION(SHARE) DATABUFFERS(256) INDEXBUFFERS(255) TABLE(NO) 7 | MAXNUMRECS(NOLIMIT) UPDATEMODEL(LOCKING) LOAD(NO) 8 | RECORDFORMAT(V) ADD(YES) BROWSE(YES) DELETE(YES) READ(YES) 9 | UPDATE(YES) JOURNAL(NO) JNLREAD(NONE) JNLSYNCREAD(NO) 10 | JNLUPDATE(NO) JNLADD(NONE) JNLSYNCWRITE(NO) RECOVERY(NONE) 11 | FWDRECOVLOG(NO) BACKUPTYPE(STATIC) -------------------------------------------------------------------------------- /Source/ECS001.cbl: -------------------------------------------------------------------------------- 1 | CBL CICS(SP) 2 | IDENTIFICATION DIVISION. 3 | PROGRAM-ID. ECS001. 4 | ****************************************************************** 5 | ** Sample CICS program initiated via a terminal. ** 6 | ** Program accepts 3 commands from the terminal, ** 7 | ** GET,PUT,DEL to execute on the zECS service. ** 8 | ** GET - Retrieve a key/value pair ** 9 | ** PUT - Put a key/value pair in the instance. ** 10 | ** DEL - Delete a key/value pair from the instance. ** 11 | ** The data for the PUT command is accepted from the line ** 12 | ** following the tran id and command up to 23 lines on the ** 13 | ** screen. ** 14 | ** --- MAKE SURE LINES ARE PADDED WITH SPACES. --- ** 15 | ** --- MAKE SURE LINES ARE PADDED WITH SPACES. --- ** 16 | ** --- MAKE SURE LINES ARE PADDED WITH SPACES. --- ** 17 | ** Example PUT command ** 18 | ** TRAN PUT {key_name} ** 19 | ** { "name" : "Los Angeles Dodgers", ** 20 | ** "players" : 26, ** 21 | ** "salaries" : 248606156, ** 22 | ** "won_world_series" : true } ** 23 | ** Example GET command, output returned to screen. ** 24 | ** TRAN GET {key_name} ** 25 | ** Example DELETE command ** 26 | ** TRAN DEL {key_name} ** 27 | ****************************************************************** 28 | ENVIRONMENT DIVISION. 29 | CONFIGURATION SECTION. 30 | INPUT-OUTPUT SECTION. 31 | DATA DIVISION. 32 | FILE SECTION. 33 | 34 | *---------------------------------------------------------------- 35 | WORKING-STORAGE SECTION. 36 | *---------------------------------------------------------------- 37 | 01 URIMAP-NAME PIC X(08) VALUE 'ECS001'. 38 | 01 SESSION-TOKEN PIC X(08). 39 | 01 ECS-KEY PIC X(80). 40 | 01 ECS-KEY-LEN PIC 9(09) COMP. 41 | 01 TERM-DATA-LEN PIC 9(04) COMP. 42 | 01 BODY-DATA PIC X(3000). 43 | 01 BODY-DATA-LEN PIC 9(09) COMP. 44 | 01 ECS-DATA PIC X(3000). 45 | 01 ECS-DATA-LEN PIC 9(09) COMP. 46 | 01 PATH-NAME PIC X(400). 47 | 01 PATH-NAME-LEN PIC 9(09) COMP. 48 | 01 HTTP-STATUS-CODE PIC 9(04) COMP. 49 | 01 HTTP-STATUS-LEN PIC 9(09) COMP. 50 | 01 HTTP-STATUS-TEXT PIC X(100). 51 | 01 METHOD-CDVA PIC 9(09) COMP. 52 | 01 I PIC 9(04) COMP. 53 | 01 MEDIA-TYPE PIC X(56) VALUE 54 | 'text/plain'. 55 | 01 INPUT-PARMS. 56 | 05 INPUT-PARM1 PIC X(80). 57 | 05 INPUT-PARM2 PIC X(80). 58 | 59 | 01 TERM-DATA. 60 | 05 TERM-LINES OCCURS 24 TIMES 61 | INDEXED BY TERM-IDX 62 | PIC X(80) VALUE SPACES. 63 | 64 | 01 CICS-MSG. 65 | 05 CICS-MSG-TEXT PIC X(34). 66 | 05 FILLER PIC X(09) VALUE ' EIBRESP='. 67 | 05 CICS-MSG-RESP PIC 9(04). 68 | 05 FILLER PIC X(10) VALUE ' EIBRESP2='. 69 | 05 CICS-MSG-RESP2 PIC 9(04). 70 | 71 | 01 CICS-MSG2. 72 | 05 CICS-MSG-HTTP PIC X(20). 73 | 05 FILLER PIC X(06) VALUE ' HTTP='. 74 | 05 CICS-MSG-CODE PIC 9(03). 75 | 05 FILLER PIC X(01) VALUE ':'. 76 | 05 CICS-MSG-STATUS PIC X(31). 77 | 78 | *---------------------------------------------------------- 79 | PROCEDURE DIVISION. 80 | *---------------------------------------------------------- 81 | 82 | PERFORM A1000-GET-INPUT-REQUEST THRU A1000-EXIT. 83 | PERFORM A2000-SETUP-ECS-REQUEST THRU A2000-EXIT. 84 | PERFORM A3000-OPEN-CONNECTION THRU A3000-EXIT. 85 | PERFORM A4000-EXECUTE-SERVICE THRU A4000-EXIT. 86 | PERFORM A5000-CLOSE-CONNECTION THRU A5000-EXIT. 87 | PERFORM A6000-DISPLAY-RESULTS THRU A6000-EXIT. 88 | 89 | PERFORM Z1000-EXIT-PROGRAM THRU Z1000-EXIT. 90 | 91 | ****************************************************************** 92 | * Use a URIMAP defintion to execute the service. * 93 | ****************************************************************** 94 | 95 | A1000-GET-INPUT-REQUEST. 96 | 97 | MOVE LENGTH OF TERM-DATA TO TERM-DATA-LEN. 98 | 99 | EXEC CICS RECEIVE 100 | INTO ( TERM-DATA ) 101 | LENGTH ( TERM-DATA-LEN ) 102 | MAXLENGTH ( TERM-DATA-LEN ) 103 | NOHANDLE 104 | END-EXEC. 105 | 106 | IF EIBRESP = DFHRESP(NORMAL) OR 6 107 | GO TO A1000-EXIT 108 | END-IF. 109 | 110 | * *--------------------------------------------------------* 111 | * * Handle your error condition. * 112 | * *--------------------------------------------------------* 113 | MOVE SPACES TO TERM-DATA. 114 | MOVE EIBRESP TO CICS-MSG-RESP. 115 | MOVE EIBRESP2 TO CICS-MSG-RESP2. 116 | MOVE 'A1000: RECEIVE ERROR:' TO CICS-MSG-TEXT. 117 | MOVE CICS-MSG TO TERM-LINES(1). 118 | 119 | PERFORM Z1000-EXIT-PROGRAM THRU Z1000-EXIT. 120 | 121 | A1000-EXIT. 122 | EXIT. 123 | 124 | ****************************************************************** 125 | * * 126 | ****************************************************************** 127 | 128 | A2000-SETUP-ECS-REQUEST. 129 | 130 | MOVE SPACES TO INPUT-PARMS. 131 | MOVE ZEROS TO ECS-KEY-LEN. 132 | 133 | UNSTRING TERM-LINES(1) 134 | DELIMITED BY ALL SPACES 135 | INTO INPUT-PARM1, 136 | INPUT-PARM2, 137 | ECS-KEY COUNT IN ECS-KEY-LEN 138 | END-UNSTRING. 139 | 140 | MOVE FUNCTION UPPER-CASE(INPUT-PARM2) TO INPUT-PARM2. 141 | 142 | EVALUATE INPUT-PARM2 143 | WHEN 'GET' 144 | MOVE DFHVALUE(GET) TO METHOD-CDVA 145 | WHEN 'PUT' 146 | MOVE DFHVALUE(PUT) TO METHOD-CDVA 147 | WHEN 'DEL' 148 | MOVE DFHVALUE(DELETE) TO METHOD-CDVA 149 | WHEN OTHER 150 | MOVE SPACES TO TERM-DATA 151 | MOVE 'Invalid command option, expecting GET,PUT or DEL' 152 | TO TERM-LINES(1) 153 | PERFORM Z1000-EXIT-PROGRAM THRU Z1000-EXIT 154 | END-EVALUATE. 155 | 156 | MOVE 1 TO BODY-DATA-LEN. 157 | 158 | PERFORM VARYING TERM-IDX FROM 2 BY 1 UNTIL TERM-IDX > 24 159 | IF TERM-LINES(TERM-IDX) > SPACES 160 | PERFORM VARYING I FROM LENGTH OF TERM-LINES(1) BY -1 161 | UNTIL I < 1 162 | OR TERM-LINES(TERM-IDX)(I:1) > SPACES 163 | END-PERFORM 164 | STRING TERM-LINES(TERM-IDX)(1:I) DELIMITED BY SIZE 165 | X'0D25' DELIMITED BY SIZE 166 | INTO BODY-DATA 167 | WITH POINTER BODY-DATA-LEN 168 | END-STRING 169 | END-IF 170 | END-PERFORM. 171 | 172 | SUBTRACT 1 FROM BODY-DATA-LEN. 173 | 174 | A2000-EXIT. 175 | EXIT. 176 | 177 | ****************************************************************** 178 | * Open the HTTP connection with the URIMAP name. * 179 | ****************************************************************** 180 | 181 | A3000-OPEN-CONNECTION. 182 | 183 | * *--------------------------------------------------------* 184 | * * Open the URIMAP to establish connection to service. * 185 | * * Host: _your_host_name_ (installation specific) * 186 | * * Port: 80 (can override this if needed) * 187 | * * Path: _your_path_name_ (based on installation) * 188 | * * Scheme: HTTP * 189 | * * Usage: CLIENT * 190 | * *--------------------------------------------------------* 191 | EXEC CICS WEB OPEN 192 | SESSTOKEN( SESSION-TOKEN ) 193 | URIMAP ( URIMAP-NAME ) 194 | NOHANDLE 195 | END-EXEC. 196 | 197 | IF EIBRESP = DFHRESP(NORMAL) 198 | GO TO A3000-EXIT 199 | END-IF. 200 | 201 | * *--------------------------------------------------------* 202 | * * Handle your error condition. * 203 | * *--------------------------------------------------------* 204 | MOVE SPACES TO TERM-DATA. 205 | MOVE EIBRESP TO CICS-MSG-RESP. 206 | MOVE EIBRESP2 TO CICS-MSG-RESP2. 207 | MOVE 'A3000: WEB_OPEN ERROR:' TO CICS-MSG-TEXT. 208 | MOVE CICS-MSG TO TERM-LINES(1). 209 | 210 | PERFORM Z1000-EXIT-PROGRAM THRU Z1000-EXIT. 211 | 212 | A3000-EXIT. 213 | EXIT. 214 | 215 | ****************************************************************** 216 | * Execute the zECS service with the WEB CONVERSE API. * 217 | ****************************************************************** 218 | 219 | A4000-EXECUTE-SERVICE. 220 | 221 | MOVE LENGTH OF HTTP-STATUS-TEXT TO HTTP-STATUS-LEN. 222 | MOVE LENGTH OF ECS-DATA TO ECS-DATA-LEN. 223 | MOVE LENGTH OF PATH-NAME TO PATH-NAME-LEN. 224 | MOVE SPACES TO HTTP-STATUS-TEXT, 225 | ECS-DATA, 226 | PATH-NAME. 227 | 228 | * *--------------------------------------------------------* 229 | * * The base "path" is defined on the URIMAP and we need * 230 | * * to add to it to append the {key} name. A4100 issues * 231 | * * an inquire on the URIMAP to pull in the base "path" * 232 | * * name. It also appends the {key} name to it. * 233 | * *--------------------------------------------------------* 234 | PERFORM A4100-GET-EXISTING-PATH THRU A4100-EXIT. 235 | 236 | * *--------------------------------------------------------* 237 | * * Execute the zECS service. * 238 | * * For PUT requests we need to pass the payload to * 239 | * * save for the {key}. The other GET and DELETE requests * 240 | * * do not use body payloads so there is nothing to pass. * 241 | * *--------------------------------------------------------* 242 | IF METHOD-CDVA = DFHVALUE(PUT) 243 | EXEC CICS WEB CONVERSE 244 | SESSTOKEN ( SESSION-TOKEN ) 245 | METHOD ( METHOD-CDVA ) 246 | PATH ( PATH-NAME ) 247 | PATHLENGTH ( PATH-NAME-LEN ) 248 | FROM ( BODY-DATA ) 249 | FROMLENGTH ( BODY-DATA-LEN ) 250 | MEDIATYPE ( MEDIA-TYPE ) 251 | INTO ( ECS-DATA ) 252 | TOLENGTH ( ECS-DATA-LEN ) 253 | STATUSCODE ( HTTP-STATUS-CODE ) 254 | STATUSLEN ( HTTP-STATUS-LEN ) 255 | STATUSTEXT ( HTTP-STATUS-TEXT ) 256 | NOHANDLE 257 | END-EXEC 258 | ELSE 259 | EXEC CICS WEB CONVERSE 260 | SESSTOKEN ( SESSION-TOKEN ) 261 | METHOD ( METHOD-CDVA ) 262 | PATH ( PATH-NAME ) 263 | PATHLENGTH ( PATH-NAME-LEN ) 264 | INTO ( ECS-DATA ) 265 | TOLENGTH ( ECS-DATA-LEN ) 266 | STATUSCODE ( HTTP-STATUS-CODE ) 267 | STATUSLEN ( HTTP-STATUS-LEN ) 268 | STATUSTEXT ( HTTP-STATUS-TEXT ) 269 | NOHANDLE 270 | END-EXEC 271 | END-IF. 272 | 273 | IF EIBRESP = DFHRESP(NORMAL) AND HTTP-STATUS-CODE = 200 274 | GO TO A4000-EXIT 275 | END-IF. 276 | 277 | * *--------------------------------------------------------* 278 | * * Handle your error condition. * 279 | * *--------------------------------------------------------* 280 | MOVE SPACES TO TERM-DATA. 281 | MOVE EIBRESP TO CICS-MSG-RESP. 282 | MOVE EIBRESP2 TO CICS-MSG-RESP2. 283 | MOVE 'A4000: WEB_CONVERSE ERROR:' TO CICS-MSG-TEXT. 284 | MOVE CICS-MSG TO TERM-LINES(1). 285 | 286 | IF EIBRESP = DFHRESP(NORMAL) 287 | MOVE HTTP-STATUS-CODE TO CICS-MSG-CODE 288 | MOVE HTTP-STATUS-TEXT TO CICS-MSG-STATUS 289 | MOVE 'A4000: HTTP ERROR' TO CICS-MSG-HTTP 290 | MOVE CICS-MSG2 TO TERM-LINES(1) 291 | END-IF. 292 | 293 | PERFORM Z1000-EXIT-PROGRAM THRU Z1000-EXIT. 294 | 295 | A4000-EXIT. 296 | EXIT. 297 | 298 | ****************************************************************** 299 | * * 300 | ****************************************************************** 301 | 302 | A4100-GET-EXISTING-PATH. 303 | 304 | * *--------------------------------------------------------* 305 | * * Get pass "path" name from URIMAP. * 306 | * *--------------------------------------------------------* 307 | EXEC CICS INQUIRE 308 | URIMAP ( URIMAP-NAME ) 309 | PATH ( PATH-NAME ) 310 | NOHANDLE 311 | END-EXEC. 312 | 313 | IF EIBRESP = DFHRESP(NORMAL) 314 | NEXT SENTENCE 315 | ELSE 316 | MOVE SPACES TO TERM-DATA 317 | MOVE EIBRESP TO CICS-MSG-RESP 318 | MOVE EIBRESP2 TO CICS-MSG-RESP2 319 | MOVE 'A4000: INQUIRE_URIMAP ERROR:' TO CICS-MSG-TEXT 320 | MOVE CICS-MSG TO TERM-LINES(1) 321 | PERFORM Z1000-EXIT-PROGRAM THRU Z1000-EXIT 322 | END-IF. 323 | 324 | * *--------------------------------------------------------* 325 | * * Append the {key} name to the base "path". * 326 | * *--------------------------------------------------------* 327 | PERFORM VARYING PATH-NAME-LEN FROM LENGTH OF PATH-NAME BY -1 328 | UNTIL PATH-NAME-LEN < 1 329 | OR PATH-NAME(PATH-NAME-LEN:1) > SPACES 330 | END-PERFORM. 331 | 332 | MOVE ECS-KEY TO 333 | PATH-NAME(PATH-NAME-LEN + 1:). 334 | ADD ECS-KEY-LEN TO PATH-NAME-LEN. 335 | 336 | A4100-EXIT. 337 | EXIT. 338 | 339 | ****************************************************************** 340 | * Close the open connection. * 341 | ****************************************************************** 342 | 343 | A5000-CLOSE-CONNECTION. 344 | 345 | * *--------------------------------------------------------* 346 | * * Close open connection. * 347 | * *--------------------------------------------------------* 348 | EXEC CICS WEB CLOSE 349 | SESSTOKEN( SESSION-TOKEN ) 350 | NOHANDLE 351 | END-EXEC. 352 | 353 | IF EIBRESP = DFHRESP(NORMAL) 354 | GO TO A5000-EXIT 355 | END-IF. 356 | 357 | * *--------------------------------------------------------* 358 | * * Handle your error condition. * 359 | * *--------------------------------------------------------* 360 | MOVE SPACES TO TERM-DATA. 361 | MOVE EIBRESP TO CICS-MSG-RESP. 362 | MOVE EIBRESP2 TO CICS-MSG-RESP2. 363 | MOVE 'A5000: WEB_CLOSE ERROR:' TO CICS-MSG-TEXT. 364 | MOVE CICS-MSG TO TERM-LINES(1). 365 | 366 | PERFORM Z1000-EXIT-PROGRAM THRU Z1000-EXIT. 367 | 368 | A5000-EXIT. 369 | EXIT. 370 | 371 | ****************************************************************** 372 | * * 373 | ****************************************************************** 374 | 375 | A6000-DISPLAY-RESULTS. 376 | 377 | MOVE SPACES TO TERM-DATA. 378 | MOVE 'Command successfully processed.' TO TERM-LINES(1). 379 | 380 | * *--------------------------------------------------------* 381 | * * Split the data by new lines. * 382 | * *--------------------------------------------------------* 383 | SET TERM-IDX TO 2. 384 | MOVE 1 TO I. 385 | 386 | PERFORM UNTIL TERM-IDX > 24 387 | OR I >= LENGTH OF ECS-DATA 388 | MOVE ZEROS TO BODY-DATA-LEN 389 | MOVE SPACES TO TERM-LINES(TERM-IDX) 390 | UNSTRING ECS-DATA(I:) 391 | DELIMITED BY X'0D25' 392 | INTO TERM-LINES(TERM-IDX) 393 | COUNT IN BODY-DATA-LEN 394 | END-UNSTRING 395 | ADD BODY-DATA-LEN, 2 TO I 396 | SET TERM-IDX UP BY 1 397 | END-PERFORM. 398 | 399 | A6000-EXIT. 400 | EXIT. 401 | 402 | ****************************************************************** 403 | * All done, post appropiate message to terminal and exit. * 404 | ****************************************************************** 405 | 406 | Z1000-EXIT-PROGRAM. 407 | 408 | * *--------------------------------------------------------* 409 | * * Send response to terminal. * 410 | * *--------------------------------------------------------* 411 | EXEC CICS SEND 412 | FROM ( TERM-DATA ) 413 | LENGTH( LENGTH OF TERM-DATA ) 414 | ERASE 415 | NOHANDLE 416 | END-EXEC. 417 | 418 | EXEC CICS RETURN 419 | END-EXEC. 420 | 421 | Z1000-EXIT. 422 | EXIT. -------------------------------------------------------------------------------- /Source/REXXREPL.exec: -------------------------------------------------------------------------------- 1 | /* REXX */ 2 | /***************************************************************/ 3 | /* REXXREPL will replace all occurrences of word 1 with word 2 */ 4 | /* */ 5 | /* Requirements */ 6 | /* INPUT DD is the input dataset */ 7 | /* OUTPUT DD is the output dataset */ 8 | /* STRINGS DD is the replacement strings dataset */ 9 | /***************************************************************/ 10 | 11 | "EXECIO * DISKR INPUT (STEM RECORDIN. FINIS" 12 | "EXECIO * DISKR STRINGS (STEM STRINGS. FINIS" 13 | 14 | /* Enter a loop for each record of the INPUT DD */ 15 | DO I = 1 TO RECORDIN.0 16 | /* Enter a loop for each replacement string */ 17 | DO S = 1 TO STRINGS.0 18 | /* If a comment, skip it */ 19 | IF LEFT(WORD(STRINGS.S,1),1) = '*' THEN ITERATE 20 | PREVPOS = 0 21 | OLDSTRING = WORD(STRINGS.S,1) 22 | NEWSTRING = WORD(STRINGS.S,2) 23 | /* Replace each occurrence of the replacement string */ 24 | DO FOREVER 25 | TEMPPOS = POS(OLDSTRING,RECORDIN.I) 26 | IF TEMPPOS = 0 THEN LEAVE 27 | IF PREVPOS = TEMPPOS THEN LEAVE 28 | PREVPOS = TEMPPOS 29 | TEMPPOS = TEMPPOS - 1 30 | TEMPPRE = SUBSTR(RECORDIN.I,1,TEMPPOS) 31 | TEMPPRE = TEMPPRE||NEWSTRING 32 | TEMPPOS = TEMPPOS + LENGTH(OLDSTRING) 33 | TEMPPOS = TEMPPOS + 1 34 | TEMPSUF = SUBSTR(RECORDIN.I,TEMPPOS) 35 | RECORDIN.I = TEMPPRE||TEMPSUF 36 | END 37 | END 38 | QUEUE RECORDIN.I 39 | END 40 | 41 | "EXECIO" QUEUED() "DISKW OUTPUT (FINIS" 42 | 43 | RETURN -------------------------------------------------------------------------------- /Source/ZC##DC.txt: -------------------------------------------------------------------------------- 1 | type: AS 2 | http://sysplex01-ecs.mycompany.com:@rep_port@ -------------------------------------------------------------------------------- /Source/ZC##SD.txt: -------------------------------------------------------------------------------- 1 | User=USERID1 ,SELECT 2 | User=USERID1 ,UPDATE 3 | User=USERID1 ,DELETE 4 | User=USERID2 ,SELECT 5 | User=USERID2 ,UPDATE 6 | User=USERID3 ,SELECT -------------------------------------------------------------------------------- /Source/ZCEXPIRE.idcams: -------------------------------------------------------------------------------- 1 | DELETE @ecs_hlq@.ZCEXPIRE.@environment@ CLUSTER PURGE 2 | SET MAXCC=0 3 | 4 | DEFINE CLUSTER - 5 | (NAME(@ecs_hlq@.ZCEXPIRE.@environment@) - 6 | BUFFERSPACE(7168) - 7 | DATACLAS(@data_class@) - 8 | INDEXED - 9 | KEYS(4 0) - 10 | MANAGEMENTCLASS(@mgt_class@) - 11 | LOG(UNDO) - 12 | RECORDSIZE(80 2048) - 13 | SHAREOPTIONS(2 3) - 14 | RECOVERY - 15 | STORAGECLASS(@stg_class@)) - 16 | DATA(NAME(@ecs_hlq@.ZCEXPIRE.@environment@.DATA) - 17 | CYLINDERS(10 2) - 18 | CONTROLINTERVALSIZE(2560)) - 19 | INDEX(NAME(@ecs_hlq@.ZCEXPIRE.@environment@.INDEX) - 20 | TRACKS(1 1) - 21 | CONTROLINTERVALSIZE(2048)) -------------------------------------------------------------------------------- /Source/ZECS000.cbl: -------------------------------------------------------------------------------- 1 | CBL CICS(SP) 2 | IDENTIFICATION DIVISION. 3 | PROGRAM-ID. ZECS000. 4 | AUTHOR. Randy Frerking and Rich Jackson. 5 | ***************************************************************** 6 | * * 7 | * z/OS Enterprise Caching Services * 8 | * * 9 | * This program executes as a background transaction to expire * 10 | * messages from a zECS table. * 11 | * * 12 | * There will be a task started by zECSPLT for each ZCxx * 13 | * URIMAP entry. * 14 | * * 15 | * Date UserID Description * 16 | * ----------- -------- --------------------------------------- * 17 | * * 18 | ***************************************************************** 19 | ENVIRONMENT DIVISION. 20 | DATA DIVISION. 21 | WORKING-STORAGE SECTION. 22 | 23 | ***************************************************************** 24 | * DEFINE LOCAL VARIABLES * 25 | ***************************************************************** 26 | 01 CURRENT-ABS PIC S9(15) VALUE ZEROES COMP-3. 27 | 01 RELATIVE-TIME PIC S9(15) VALUE ZEROES COMP-3. 28 | 01 TWELVE PIC S9(02) VALUE 12 COMP-3. 29 | 01 TEN PIC S9(02) VALUE 10 COMP-3. 30 | 01 ONE PIC S9(02) VALUE 1 COMP-3. 31 | 01 FIVE-HUNDRED PIC S9(04) VALUE 500 COMP-3. 32 | 01 ONE-HUNDRED PIC S9(04) VALUE 100 COMP-3. 33 | 01 RECORD-COUNT PIC S9(04) VALUE 0 COMP-3. 34 | 01 DELETE-COUNT PIC S9(04) VALUE 0 COMP-3. 35 | 01 RESET-COUNT PIC S9(04) VALUE 0 COMP-3. 36 | 01 FIVE-TWELVE PIC S9(08) VALUE 512 COMP. 37 | 01 TWO-FIFTY-SIX PIC S9(08) VALUE 256 COMP. 38 | 01 FORTY PIC S9(08) VALUE 40 COMP. 39 | 01 FIFTEEN PIC S9(08) VALUE 15 COMP. 40 | 41 | ***************************************************************** 42 | * zcEXPIRE control file resources - start * 43 | ***************************************************************** 44 | 01 ZX-FCT PIC X(08) VALUE 'ZCEXPIRE'. 45 | 01 ZX-RESP PIC S9(08) COMP VALUE ZEROES. 46 | 01 ZX-LENGTH PIC S9(04) COMP VALUE ZEROES. 47 | 48 | 01 ZX-RECORD. 49 | 02 ZX-KEY PIC X(04). 50 | 02 ZX-ABSTIME PIC S9(15) COMP-3 VALUE ZEROES. 51 | 02 ZX-INTERVAL PIC S9(07) COMP-3 VALUE 1800. 52 | 02 ZX-RESTART PIC S9(07) COMP-3 VALUE 1500. 53 | 02 ZX-DATE PIC X(10). 54 | 02 FILLER PIC X(01) VALUE SPACES. 55 | 02 ZX-TIME PIC X(08). 56 | 02 FILLER PIC X(01) VALUE SPACES. 57 | 02 ZX-APPLID PIC X(08). 58 | 02 FILLER PIC X(01) VALUE SPACES. 59 | 02 ZX-TASKID PIC 9(06). 60 | 02 FILLER PIC X(01) VALUE SPACES. 61 | 02 FILLER PIC X(14). 62 | 63 | ***************************************************************** 64 | * zcEXPIRE control file resources - end * 65 | ***************************************************************** 66 | 67 | 01 TTL-MILLISECONDS PIC S9(15) VALUE ZEROES COMP-3. 68 | 01 FILLER. 69 | 02 TTL-SEC-MS. 70 | 03 TTL-SECONDS PIC 9(06) VALUE ZEROES. 71 | 03 FILLER PIC 9(03) VALUE ZEROES. 72 | 02 FILLER REDEFINES TTL-SEC-MS. 73 | 03 TTL-TIME PIC 9(09). 74 | 75 | 01 USERID PIC X(08) VALUE SPACES. 76 | 01 APPLID PIC X(08) VALUE SPACES. 77 | 01 SYSID PIC X(04) VALUE SPACES. 78 | 01 ST-CODE PIC X(02) VALUE SPACES. 79 | 01 EOF PIC X(01) VALUE SPACES. 80 | 01 SLASH PIC X(01) VALUE '/'. 81 | 82 | 01 ZC-PARM. 83 | 02 ZC-TRANID PIC X(04) VALUE SPACES. 84 | 02 ZC-KEY PIC X(16) VALUE LOW-VALUES. 85 | 86 | 01 ZC-LENGTH PIC S9(04) COMP VALUE 20. 87 | 88 | 01 ZECS-DC. 89 | 02 DC-TRANID PIC X(04) VALUE 'ZC##'. 90 | 02 FILLER PIC X(02) VALUE 'DC'. 91 | 02 FILLER PIC X(42) VALUE SPACES. 92 | 93 | 01 ZC-EXPIRE-ENQ. 94 | 02 FILLER PIC X(08) VALUE 'CICSGRS_'. 95 | 02 FILLER PIC X(08) VALUE 'ZEXPIRE_'. 96 | 02 ZC-ENQ-TRANID PIC X(04) VALUE SPACES. 97 | 98 | 01 ZK-FCT. 99 | 02 ZK-TRANID PIC X(04) VALUE SPACES. 100 | 02 FILLER PIC X(04) VALUE 'KEY '. 101 | 102 | 01 ZF-FCT. 103 | 02 ZF-TRANID PIC X(04) VALUE SPACES. 104 | 02 FILLER PIC X(04) VALUE 'FILE'. 105 | 106 | 01 ZK-LENGTH PIC S9(04) COMP VALUE ZEROES. 107 | 01 ZF-LENGTH PIC S9(04) COMP VALUE ZEROES. 108 | 01 DELETE-LENGTH PIC S9(04) COMP VALUE 8. 109 | 110 | ***************************************************************** 111 | * zECS KEY record definition. * 112 | ***************************************************************** 113 | COPY ZECSZKC. 114 | 115 | 01 FC-READ PIC X(06) VALUE 'READ '. 116 | 01 FC-DELETE PIC X(06) VALUE 'DELETE'. 117 | 01 CSSL PIC X(04) VALUE '@tdq@'. 118 | 01 TD-LENGTH PIC S9(04) COMP VALUE ZEROES. 119 | 120 | 01 TD-RECORD. 121 | 02 TD-DATE PIC X(10). 122 | 02 FILLER PIC X(01) VALUE SPACES. 123 | 02 TD-TIME PIC X(08). 124 | 02 FILLER PIC X(01) VALUE SPACES. 125 | 02 TD-TRANID PIC X(04). 126 | 02 FILLER PIC X(01) VALUE SPACES. 127 | 02 TD-MESSAGE PIC X(90) VALUE SPACES. 128 | 129 | 01 FILE-ERROR. 130 | 02 FE-DS PIC X(08) VALUE SPACES. 131 | 02 FILLER PIC X(04) VALUE SPACES. 132 | 02 FILLER PIC X(07) VALUE 'EIBFN: '. 133 | 02 FE-FN PIC X(06) VALUE SPACES. 134 | 02 FILLER PIC X(10) VALUE ' EIBRESP: '. 135 | 02 FE-RESP PIC 9(08) VALUE ZEROES. 136 | 02 FILLER PIC X(11) VALUE ' EIBRESP2: '. 137 | 02 FE-RESP2 PIC 9(04) VALUE ZEROES. 138 | 02 FILLER PIC X(12) VALUE ' Paragraph: '. 139 | 02 FE-PARAGRAPH PIC X(08) VALUE SPACES. 140 | 02 FILLER PIC X(12) VALUE SPACES. 141 | 142 | 01 KEY-ERROR. 143 | 02 KE-DS PIC X(08) VALUE SPACES. 144 | 02 FILLER PIC X(04) VALUE SPACES. 145 | 02 FILLER PIC X(07) VALUE 'EIBFN: '. 146 | 02 KE-FN PIC X(06) VALUE SPACES. 147 | 02 FILLER PIC X(10) VALUE ' EIBRESP: '. 148 | 02 KE-RESP PIC 9(08) VALUE ZEROES. 149 | 02 FILLER PIC X(11) VALUE ' EIBRESP2: '. 150 | 02 KE-RESP2 PIC 9(04) VALUE ZEROES. 151 | 02 FILLER PIC X(12) VALUE ' Paragraph: '. 152 | 02 KE-PARAGRAPH PIC X(08) VALUE SPACES. 153 | 02 FILLER PIC X(12) VALUE SPACES. 154 | 155 | ***************************************************************** 156 | * Deplicate resources. * 157 | ***************************************************************** 158 | 159 | 01 URI-MAP PIC X(08) VALUE SPACES. 160 | 01 URI-PATH PIC X(255) VALUE SPACES. 161 | 162 | 01 RESOURCES PIC X(10) VALUE '/resources'. 163 | 01 DEPLICATE PIC X(10) VALUE '/deplicate'. 164 | 165 | 01 HTTP-STATUS-200 PIC S9(04) COMP VALUE 200. 166 | 01 HTTP-STATUS-201 PIC S9(04) COMP VALUE 201. 167 | 168 | 01 NUMBER-OF-SPACES PIC S9(08) COMP VALUE ZEROES. 169 | 01 NUMBER-OF-NULLS PIC S9(08) COMP VALUE ZEROES. 170 | 01 WEB-METHOD PIC S9(08) COMP VALUE ZEROES. 171 | 01 WEB-SCHEME PIC S9(08) COMP VALUE ZEROES. 172 | 01 WEB-HOST-LENGTH PIC S9(08) COMP VALUE 120. 173 | 01 WEB-HTTPMETHOD-LENGTH PIC S9(08) COMP VALUE 10. 174 | 01 WEB-HTTPVERSION-LENGTH PIC S9(08) COMP VALUE 15. 175 | 01 WEB-PATH-LENGTH PIC S9(08) COMP VALUE 256. 176 | 01 WEB-QUERYSTRING-LENGTH PIC S9(08) COMP VALUE 256. 177 | 01 WEB-REQUESTTYPE PIC S9(08) COMP VALUE ZEROES. 178 | 01 WEB-PORT PIC S9(08) COMP VALUE ZEROES. 179 | 01 WEB-PORT-NUMBER PIC 9(05) VALUE ZEROES. 180 | 181 | 01 WEB-HTTPMETHOD PIC X(10) VALUE SPACES. 182 | 01 WEB-HTTP-PUT PIC X(10) VALUE 'PUT'. 183 | 01 WEB-HTTP-GET PIC X(10) VALUE 'GET'. 184 | 01 WEB-HTTP-POST PIC X(10) VALUE 'POST'. 185 | 01 WEB-HTTP-DELETE PIC X(10) VALUE 'DELETE'. 186 | 187 | 01 WEB-HTTPVERSION PIC X(15) VALUE SPACES. 188 | 189 | 01 WEB-HOST PIC X(120) VALUE SPACES. 190 | 01 WEB-QUERYSTRING PIC X(256) VALUE SPACES. 191 | 192 | 01 ACTIVE-SINGLE PIC X(02) VALUE 'A1'. 193 | 01 ACTIVE-ACTIVE PIC X(02) VALUE 'AA'. 194 | 01 ACTIVE-STANDBY PIC X(02) VALUE 'AS'. 195 | 196 | 01 DC-CONTROL. 197 | 02 FILLER PIC X(06). 198 | 02 DC-TYPE PIC X(02) VALUE SPACES. 199 | 02 DC-CRLF PIC X(02). 200 | 02 THE-OTHER-DC PIC X(160) VALUE SPACES. 201 | 02 FILLER PIC X(02). 202 | 01 DC-LENGTH PIC S9(08) COMP VALUE ZEROES. 203 | 01 DC-TOKEN PIC X(16) VALUE SPACES. 204 | 205 | 01 THE-OTHER-DC-LENGTH PIC S9(08) COMP VALUE 160. 206 | 207 | 01 TWO PIC S9(08) COMP VALUE 2. 208 | 01 SESSION-TOKEN PIC 9(18) COMP VALUE ZEROES. 209 | 210 | 01 URL-SCHEME-NAME PIC X(16) VALUE SPACES. 211 | 01 URL-SCHEME PIC S9(08) COMP VALUE ZEROES. 212 | 01 URL-PORT PIC S9(08) COMP VALUE ZEROES. 213 | 01 URL-HOST-NAME PIC X(80) VALUE SPACES. 214 | 01 URL-HOST-NAME-LENGTH PIC S9(08) COMP VALUE 80. 215 | 01 WEB-STATUS-CODE PIC S9(04) COMP VALUE 00. 216 | 01 WEB-STATUS-LENGTH PIC S9(08) COMP VALUE 15. 217 | 01 WEB-STATUS-ABSTIME PIC 9(15) VALUE ZEROES. 218 | 219 | 01 WEB-PATH PIC X(512) VALUE SPACES. 220 | 221 | 01 CONVERSE-LENGTH PIC S9(08) COMP VALUE 40. 222 | 01 CONVERSE-RESPONSE PIC X(40) VALUE SPACES. 223 | 224 | ***************************************************************** 225 | * zECS FILE record definition. * 226 | ***************************************************************** 227 | COPY ZECSZFC. 228 | 229 | LINKAGE SECTION. 230 | 01 DFHCOMMAREA PIC X(01). 231 | 232 | 233 | PROCEDURE DIVISION. 234 | 235 | ***************************************************************** 236 | * Main process. * 237 | ***************************************************************** 238 | PERFORM 1000-RETRIEVE THRU 1000-EXIT. 239 | PERFORM 2000-READ-FILE THRU 2000-EXIT 240 | WITH TEST AFTER 241 | UNTIL EOF EQUAL 'Y'. 242 | PERFORM 8000-RESTART THRU 8000-EXIT. 243 | PERFORM 9000-RETURN THRU 9000-EXIT. 244 | 245 | ***************************************************************** 246 | * Retrieve information for zECS table expiration task. * 247 | ***************************************************************** 248 | 1000-RETRIEVE. 249 | EXEC CICS ASSIGN APPLID(APPLID) 250 | END-EXEC. 251 | 252 | EXEC CICS HANDLE ABEND LABEL(9100-ABEND) NOHANDLE 253 | END-EXEC. 254 | 255 | MOVE LENGTH OF ZC-PARM TO ZC-LENGTH. 256 | 257 | EXEC CICS RETRIEVE INTO(ZC-PARM) 258 | LENGTH(ZC-LENGTH) NOHANDLE 259 | END-EXEC. 260 | 261 | MOVE ZC-KEY TO ZF-KEY-16. 262 | 263 | MOVE ZC-TRANID TO ZK-TRANID 264 | ZF-TRANID 265 | DC-TRANID. 266 | 267 | MOVE EIBTRNID TO ZC-ENQ-TRANID. 268 | 269 | EXEC CICS ASKTIME ABSTIME(CURRENT-ABS) NOHANDLE 270 | END-EXEC. 271 | 272 | IF ZC-KEY EQUAL LOW-VALUES 273 | PERFORM 1100-CONTROL THRU 1100-EXIT. 274 | 275 | 1000-EXIT. 276 | EXIT. 277 | 278 | ***************************************************************** 279 | * Read zcEXPIRE control file when a 'resume' key is not * 280 | * provided on the RETRIEVE command. Issue an ENQ to serialize * 281 | * the expiration proces. * 282 | ***************************************************************** 283 | 1100-CONTROL. 284 | PERFORM 1200-ENQ THRU 1200-EXIT. 285 | 286 | MOVE EIBTRNID TO ZX-KEY. 287 | MOVE LENGTH OF ZX-RECORD TO ZX-LENGTH. 288 | 289 | EXEC CICS READ 290 | FILE (ZX-FCT) 291 | RIDFLD (ZX-KEY) 292 | INTO (ZX-RECORD) 293 | LENGTH (ZX-LENGTH) 294 | RESP (ZX-RESP) 295 | UPDATE 296 | NOHANDLE 297 | END-EXEC. 298 | 299 | IF ZX-RESP EQUAL DFHRESP(NOTFND) 300 | PERFORM 1300-WRITE THRU 1300-EXIT. 301 | 302 | IF ZX-RESP EQUAL DFHRESP(NORMAL) 303 | PERFORM 1400-UPDATE THRU 1400-EXIT. 304 | 305 | 1100-EXIT. 306 | EXIT. 307 | 308 | ***************************************************************** 309 | * Issue ENQ to serialize the expiration process. * 310 | ***************************************************************** 311 | 1200-ENQ. 312 | EXEC CICS ENQ RESOURCE(ZC-EXPIRE-ENQ) 313 | LENGTH(LENGTH OF ZC-EXPIRE-ENQ) 314 | NOHANDLE 315 | NOSUSPEND 316 | TASK 317 | END-EXEC. 318 | 319 | IF EIBRESP EQUAL DFHRESP(ENQBUSY) 320 | PERFORM 8000-RESTART THRU 8000-EXIT 321 | PERFORM 9000-RETURN THRU 9000-EXIT. 322 | 323 | 1200-EXIT. 324 | EXIT. 325 | 326 | ***************************************************************** 327 | * Issue WRITE to zcEXPIRE control file with default information.* 328 | ***************************************************************** 329 | 1300-WRITE. 330 | MOVE EIBTRNID TO ZX-KEY. 331 | MOVE LENGTH OF ZX-RECORD TO ZX-LENGTH. 332 | 333 | EXEC CICS FORMATTIME 334 | ABSTIME (CURRENT-ABS) 335 | TIME (ZX-TIME) 336 | YYYYMMDD(ZX-DATE) 337 | TIMESEP 338 | DATESEP 339 | NOHANDLE 340 | END-EXEC. 341 | 342 | MOVE CURRENT-ABS TO ZX-ABSTIME. 343 | MOVE APPLID TO ZX-APPLID. 344 | MOVE EIBTASKN TO ZX-TASKID. 345 | 346 | EXEC CICS WRITE 347 | FILE (ZX-FCT) 348 | RIDFLD (ZX-KEY) 349 | FROM (ZX-RECORD) 350 | LENGTH (ZX-LENGTH) 351 | NOHANDLE 352 | END-EXEC. 353 | 354 | IF EIBRESP EQUAL DFHRESP(DUPREC) 355 | PERFORM 8000-RESTART THRU 8000-EXIT 356 | PERFORM 9000-RETURN THRU 9000-EXIT. 357 | 358 | 1300-EXIT. 359 | EXIT. 360 | 361 | ***************************************************************** 362 | * Update zcEXPIRE control file. * 363 | ***************************************************************** 364 | 1400-UPDATE. 365 | MOVE EIBTRNID TO ZX-KEY. 366 | MOVE LENGTH OF ZX-RECORD TO ZX-LENGTH. 367 | 368 | EXEC CICS FORMATTIME 369 | ABSTIME (CURRENT-ABS) 370 | TIME (ZX-TIME) 371 | YYYYMMDD(ZX-DATE) 372 | TIMESEP 373 | DATESEP 374 | NOHANDLE 375 | END-EXEC. 376 | 377 | MOVE ZX-INTERVAL TO TTL-SECONDS. 378 | MOVE TTL-TIME TO TTL-MILLISECONDS. 379 | 380 | SUBTRACT ZX-ABSTIME FROM CURRENT-ABS GIVING RELATIVE-TIME. 381 | IF RELATIVE-TIME LESS THAN TTL-MILLISECONDS 382 | PERFORM 8000-RESTART THRU 8000-EXIT 383 | PERFORM 9000-RETURN THRU 9000-EXIT. 384 | 385 | MOVE CURRENT-ABS TO ZX-ABSTIME. 386 | MOVE APPLID TO ZX-APPLID. 387 | MOVE EIBTASKN TO ZX-TASKID. 388 | 389 | EXEC CICS REWRITE 390 | FILE (ZX-FCT) 391 | FROM (ZX-RECORD) 392 | LENGTH(ZX-LENGTH) 393 | NOHANDLE 394 | END-EXEC. 395 | 396 | 1400-EXIT. 397 | EXIT. 398 | 399 | ***************************************************************** 400 | * Read zECS file/data record. * 401 | * Since there can be multiple segments for a single cache * 402 | * record, only check the first record and make decisions * 403 | * accordingly. * 404 | * When restarting after a resume time interval, the last record * 405 | * key will be returned on the RETRIEVE command. Use this key * 406 | * to resume processing. * 407 | ***************************************************************** 408 | 2000-READ-FILE. 409 | MOVE LENGTH OF ZF-RECORD TO ZF-LENGTH. 410 | 411 | EXEC CICS READ FILE(ZF-FCT) 412 | RIDFLD(ZF-KEY-16) 413 | INTO (ZF-RECORD) 414 | LENGTH(ZF-LENGTH) 415 | GTEQ 416 | NOHANDLE 417 | END-EXEC. 418 | 419 | IF EIBRESP NOT EQUAL DFHRESP(NORMAL) 420 | MOVE 'Y' TO EOF 421 | PERFORM 8000-RESTART THRU 8000-EXIT 422 | PERFORM 9000-RETURN THRU 9000-EXIT. 423 | 424 | MOVE ZF-TTL TO TTL-SECONDS. 425 | MOVE TTL-TIME TO TTL-MILLISECONDS. 426 | 427 | SUBTRACT ZF-ABS FROM CURRENT-ABS GIVING RELATIVE-TIME. 428 | IF RELATIVE-TIME GREATER THAN TTL-MILLISECONDS 429 | PERFORM 3000-DEPLICATE THRU 3000-EXIT. 430 | 431 | ADD ONE TO ZF-ZEROES. 432 | 433 | 2000-EXIT. 434 | EXIT. 435 | 436 | ***************************************************************** 437 | * Deplicate request to the other Data Center. * 438 | * Delete *FILE and *KEY records only when eligible to expire * 439 | * at both Data Centers, otherwise update this record with the * 440 | * ABSTIME from the other Data Center. * 441 | ***************************************************************** 442 | 3000-DEPLICATE. 443 | PERFORM 7000-GET-URL THRU 7000-EXIT. 444 | 445 | IF EIBRESP EQUAL DFHRESP(NORMAL) 446 | IF DC-TYPE EQUAL ACTIVE-ACTIVE 447 | OR DC-TYPE EQUAL ACTIVE-STANDBY 448 | PERFORM 7100-WEB-OPEN THRU 7100-EXIT. 449 | 450 | IF EIBRESP EQUAL DFHRESP(NORMAL) 451 | IF DC-TYPE EQUAL ACTIVE-ACTIVE 452 | OR DC-TYPE EQUAL ACTIVE-STANDBY 453 | MOVE DFHVALUE(DELETE) TO WEB-METHOD 454 | PERFORM 7200-WEB-CONVERSE THRU 7200-EXIT. 455 | 456 | IF EIBRESP EQUAL DFHRESP(NORMAL) 457 | IF DC-TYPE EQUAL ACTIVE-ACTIVE 458 | OR DC-TYPE EQUAL ACTIVE-STANDBY 459 | PERFORM 7300-WEB-CLOSE THRU 7300-EXIT. 460 | 461 | IF EIBRESP EQUAL DFHRESP(NORMAL) 462 | OR EIBRESP EQUAL DFHRESP(LENGERR) 463 | IF WEB-STATUS-CODE EQUAL HTTP-STATUS-201 464 | AND WEB-STATUS-ABSTIME NUMERIC 465 | PERFORM 3100-UPDATE-ABS THRU 3100-EXIT 466 | ELSE 467 | PERFORM 3200-DELETE THRU 3200-EXIT. 468 | 469 | 3000-EXIT. 470 | EXIT. 471 | 472 | ***************************************************************** 473 | * Update ABS in the local cache record. * 474 | ***************************************************************** 475 | 3100-UPDATE-ABS. 476 | MOVE LENGTH OF ZF-RECORD TO ZF-LENGTH. 477 | 478 | EXEC CICS READ FILE(ZF-FCT) 479 | RIDFLD(ZF-KEY-16) 480 | INTO (ZF-RECORD) 481 | LENGTH(ZF-LENGTH) 482 | UPDATE 483 | NOHANDLE 484 | END-EXEC. 485 | 486 | IF EIBRESP EQUAL DFHRESP(NORMAL) 487 | PERFORM 3110-REWRITE THRU 3110-EXIT. 488 | 489 | 3100-EXIT. 490 | EXIT. 491 | 492 | ***************************************************************** 493 | * Issue REWRITE with ABS from partner site. * 494 | ***************************************************************** 495 | 3110-REWRITE. 496 | MOVE WEB-STATUS-ABSTIME TO ZF-ABS. 497 | 498 | EXEC CICS REWRITE FILE(ZF-FCT) 499 | FROM (ZF-RECORD) 500 | LENGTH(ZF-LENGTH) 501 | NOHANDLE 502 | END-EXEC. 503 | 504 | EXEC CICS SYNCPOINT NOHANDLE 505 | END-EXEC. 506 | 507 | ADD ONE TO RESET-COUNT. 508 | IF RESET-COUNT GREATER THAN FIVE-HUNDRED 509 | PERFORM 8100-RESTART THRU 8100-EXIT 510 | PERFORM 9000-RETURN THRU 9000-EXIT. 511 | 512 | 3110-EXIT. 513 | EXIT. 514 | 515 | ***************************************************************** 516 | * Delete the local cache record. * 517 | ***************************************************************** 518 | 3200-DELETE. 519 | PERFORM 3210-DELETE THRU 3210-EXIT 520 | WITH TEST AFTER 521 | VARYING ZF-SEGMENT FROM 1 BY 1 522 | UNTIL ZF-SEGMENT GREATER THAN ZF-SEGMENTS. 523 | 524 | 525 | EXEC CICS DELETE FILE(ZK-FCT) 526 | RIDFLD(ZF-ZK-KEY) 527 | NOHANDLE 528 | END-EXEC. 529 | 530 | ADD ONE TO RECORD-COUNT. 531 | IF RECORD-COUNT GREATER THAN TEN 532 | PERFORM 3220-SYNCPOINT THRU 3220-EXIT. 533 | 534 | ADD ONE TO DELETE-COUNT. 535 | IF DELETE-COUNT GREATER THAN FIVE-HUNDRED 536 | PERFORM 8100-RESTART THRU 8100-EXIT 537 | PERFORM 9000-RETURN THRU 9000-EXIT. 538 | 539 | 3200-EXIT. 540 | EXIT. 541 | 542 | ***************************************************************** 543 | * Issue DELETE for every segment. * 544 | ***************************************************************** 545 | 3210-DELETE. 546 | EXEC CICS DELETE FILE(ZF-FCT) 547 | RIDFLD(ZF-KEY-16) 548 | NOHANDLE 549 | END-EXEC. 550 | 551 | 3210-EXIT. 552 | EXIT. 553 | 554 | ***************************************************************** 555 | * Issue SYNCPOINT every TEN records. * 556 | ***************************************************************** 557 | 3220-SYNCPOINT. 558 | MOVE ZEROES TO RECORD-COUNT. 559 | 560 | EXEC CICS SYNCPOINT NOHANDLE 561 | END-EXEC. 562 | 563 | EXEC CICS DELAY INTERVAL(0) NOHANDLE 564 | END-EXEC. 565 | 566 | 3220-EXIT. 567 | EXIT. 568 | 569 | ***************************************************************** 570 | * Get URL for deplication process. * 571 | * URL must be in the following format: * 572 | * http://hostname:port * 573 | ***************************************************************** 574 | 7000-GET-URL. 575 | 576 | EXEC CICS DOCUMENT CREATE DOCTOKEN(DC-TOKEN) 577 | TEMPLATE(ZECS-DC) 578 | NOHANDLE 579 | END-EXEC. 580 | 581 | MOVE LENGTH OF DC-CONTROL TO DC-LENGTH. 582 | 583 | IF EIBRESP EQUAL DFHRESP(NORMAL) 584 | EXEC CICS DOCUMENT RETRIEVE DOCTOKEN(DC-TOKEN) 585 | INTO (DC-CONTROL) 586 | LENGTH (DC-LENGTH) 587 | MAXLENGTH(DC-LENGTH) 588 | DATAONLY 589 | NOHANDLE 590 | END-EXEC. 591 | 592 | IF EIBRESP EQUAL DFHRESP(NORMAL) 593 | AND DC-LENGTH GREATER THAN TEN 594 | SUBTRACT TWELVE FROM DC-LENGTH 595 | GIVING THE-OTHER-DC-LENGTH 596 | 597 | EXEC CICS WEB PARSE 598 | URL(THE-OTHER-DC) 599 | URLLENGTH(THE-OTHER-DC-LENGTH) 600 | SCHEMENAME(URL-SCHEME-NAME) 601 | HOST(URL-HOST-NAME) 602 | HOSTLENGTH(URL-HOST-NAME-LENGTH) 603 | PORTNUMBER(URL-PORT) 604 | NOHANDLE 605 | END-EXEC. 606 | 607 | IF EIBRESP NOT EQUAL DFHRESP(NORMAL) 608 | OR DC-LENGTH LESS THAN TEN 609 | OR DC-LENGTH EQUAL TEN 610 | MOVE ACTIVE-SINGLE TO DC-TYPE. 611 | 612 | 7000-EXIT. 613 | EXIT. 614 | 615 | 616 | ***************************************************************** 617 | * Open WEB connection with the partner Data Center zECS. * 618 | ***************************************************************** 619 | 7100-WEB-OPEN. 620 | IF URL-SCHEME-NAME EQUAL 'HTTPS' 621 | MOVE DFHVALUE(HTTPS) TO URL-SCHEME 622 | ELSE 623 | MOVE DFHVALUE(HTTP) TO URL-SCHEME. 624 | 625 | EXEC CICS WEB OPEN 626 | HOST(URL-HOST-NAME) 627 | HOSTLENGTH(URL-HOST-NAME-LENGTH) 628 | PORTNUMBER(URL-PORT) 629 | SCHEME(URL-SCHEME) 630 | SESSTOKEN(SESSION-TOKEN) 631 | NOHANDLE 632 | END-EXEC. 633 | 634 | 7100-EXIT. 635 | EXIT. 636 | 637 | ***************************************************************** 638 | * Converse with the partner Data Center zECS. * 639 | * The first element of the path, which for normal processing is * 640 | * /resources, must be changed to /deplicate. * 641 | ***************************************************************** 642 | 7200-WEB-CONVERSE. 643 | MOVE FIVE-TWELVE TO WEB-PATH-LENGTH. 644 | MOVE ZEROES TO NUMBER-OF-NULLS. 645 | MOVE ZEROES TO NUMBER-OF-SPACES. 646 | MOVE FORTY TO CONVERSE-LENGTH. 647 | MOVE FIFTEEN TO WEB-STATUS-LENGTH. 648 | MOVE ZC-TRANID TO URI-MAP. 649 | MOVE 'D' TO URI-MAP(5:1). 650 | 651 | EXEC CICS INQUIRE URIMAP(URI-MAP) 652 | PATH(URI-PATH) 653 | NOHANDLE 654 | END-EXEC. 655 | 656 | STRING URI-PATH 657 | SLASH 658 | ZF-ZK-KEY 659 | DELIMITED BY '*' 660 | INTO WEB-PATH. 661 | 662 | INSPECT WEB-PATH TALLYING NUMBER-OF-NULLS 663 | FOR ALL LOW-VALUES. 664 | SUBTRACT NUMBER-OF-NULLS FROM WEB-PATH-LENGTH. 665 | 666 | INSPECT WEB-PATH TALLYING NUMBER-OF-SPACES 667 | FOR ALL SPACES. 668 | SUBTRACT NUMBER-OF-SPACES FROM WEB-PATH-LENGTH. 669 | 670 | MOVE DEPLICATE TO WEB-PATH(1:10). 671 | 672 | EXEC CICS WEB CONVERSE 673 | SESSTOKEN(SESSION-TOKEN) 674 | PATH(WEB-PATH) 675 | PATHLENGTH(WEB-PATH-LENGTH) 676 | METHOD(WEB-METHOD) 677 | MEDIATYPE(ZF-MEDIA) 678 | INTO(CONVERSE-RESPONSE) 679 | TOLENGTH(CONVERSE-LENGTH) 680 | MAXLENGTH(CONVERSE-LENGTH) 681 | STATUSCODE(WEB-STATUS-CODE) 682 | STATUSLEN (WEB-STATUS-LENGTH) 683 | STATUSTEXT(WEB-STATUS-ABSTIME) 684 | NOOUTCONVERT 685 | NOHANDLE 686 | END-EXEC. 687 | 688 | 7200-EXIT. 689 | EXIT. 690 | 691 | ***************************************************************** 692 | * Close WEB connection with the partner Data Center zECS. * 693 | ***************************************************************** 694 | 7300-WEB-CLOSE. 695 | 696 | EXEC CICS WEB CLOSE 697 | SESSTOKEN(SESSION-TOKEN) 698 | NOHANDLE 699 | END-EXEC. 700 | 701 | 7300-EXIT. 702 | EXIT. 703 | 704 | ***************************************************************** 705 | * Restart (ICE chain). * 706 | * 15 minute interval for normal processing * 707 | ***************************************************************** 708 | 8000-RESTART. 709 | 710 | MOVE LENGTH OF ZC-PARM TO ZC-LENGTH. 711 | MOVE LOW-VALUES TO ZC-KEY. 712 | 713 | EXEC CICS START TRANSID(EIBTRNID) 714 | INTERVAL(1500) 715 | FROM (ZC-PARM) 716 | LENGTH (ZC-LENGTH) 717 | NOHANDLE 718 | END-EXEC. 719 | 720 | 8000-EXIT. 721 | EXIT. 722 | 723 | ***************************************************************** 724 | * Restart (ICE chain). * 725 | * 02 second interval when reset count exceeds 500 hundred. * 726 | ***************************************************************** 727 | 8100-RESTART. 728 | 729 | MOVE LENGTH OF ZC-PARM TO ZC-LENGTH. 730 | MOVE ZF-KEY-16 TO ZC-KEY. 731 | 732 | EXEC CICS START TRANSID(EIBTRNID) 733 | INTERVAL(0002) 734 | FROM (ZC-PARM) 735 | LENGTH (ZC-LENGTH) 736 | NOHANDLE 737 | END-EXEC. 738 | 739 | 8100-EXIT. 740 | EXIT. 741 | 742 | ***************************************************************** 743 | * Return to CICS * 744 | ***************************************************************** 745 | 9000-RETURN. 746 | 747 | EXEC CICS RETURN 748 | END-EXEC. 749 | 750 | 9000-EXIT. 751 | EXIT. 752 | 753 | 754 | ***************************************************************** 755 | * Task abended. Restart and Return. * 756 | ***************************************************************** 757 | 9100-ABEND. 758 | PERFORM 8000-RESTART THRU 8000-EXIT. 759 | PERFORM 9000-RETURN THRU 9000-EXIT. 760 | 761 | 9100-EXIT. 762 | EXIT. 763 | 764 | 765 | ***************************************************************** 766 | * Write TD CSSL. * 767 | ***************************************************************** 768 | 9900-WRITE-CSSL. 769 | PERFORM 9950-ABS THRU 9950-EXIT. 770 | MOVE EIBTRNID TO TD-TRANID. 771 | EXEC CICS FORMATTIME ABSTIME(CURRENT-ABS) 772 | TIME(TD-TIME) 773 | YYYYMMDD(TD-DATE) 774 | TIMESEP 775 | DATESEP 776 | NOHANDLE 777 | END-EXEC. 778 | 779 | MOVE LENGTH OF TD-RECORD TO TD-LENGTH. 780 | EXEC CICS WRITEQ TD QUEUE(CSSL) 781 | FROM(TD-RECORD) 782 | LENGTH(TD-LENGTH) 783 | NOHANDLE 784 | END-EXEC. 785 | 786 | 9900-EXIT. 787 | EXIT. 788 | 789 | ***************************************************************** 790 | * Get Absolute time. * 791 | ***************************************************************** 792 | 9950-ABS. 793 | EXEC CICS ASKTIME ABSTIME(CURRENT-ABS) NOHANDLE 794 | END-EXEC. 795 | 796 | 9950-EXIT. 797 | EXIT. 798 | 799 | 800 | 801 | ***************************************************************** 802 | * Get URL for replication process. * 803 | * URL must be in the following format: * 804 | * http://hostname:port * 805 | ***************************************************************** 806 | 9999-GET-URL. 807 | 808 | MOVE LENGTH OF THE-OTHER-DC TO THE-OTHER-DC-LENGTH. 809 | 810 | EXEC CICS DOCUMENT CREATE DOCTOKEN(DC-TOKEN) 811 | TEMPLATE(ZECS-DC) 812 | NOHANDLE 813 | END-EXEC. 814 | 815 | EXEC CICS DOCUMENT RETRIEVE DOCTOKEN(DC-TOKEN) 816 | INTO (THE-OTHER-DC) 817 | LENGTH (THE-OTHER-DC-LENGTH) 818 | MAXLENGTH(THE-OTHER-DC-LENGTH) 819 | DATAONLY 820 | NOHANDLE 821 | END-EXEC. 822 | 823 | IF EIBRESP EQUAL DFHRESP(NORMAL) AND 824 | THE-OTHER-DC-LENGTH GREATER THAN TWO 825 | SUBTRACT TWO FROM THE-OTHER-DC-LENGTH. 826 | 827 | EXEC CICS WEB PARSE 828 | URL(THE-OTHER-DC) 829 | URLLENGTH(THE-OTHER-DC-LENGTH) 830 | SCHEMENAME(URL-SCHEME-NAME) 831 | HOST(URL-HOST-NAME) 832 | HOSTLENGTH(URL-HOST-NAME-LENGTH) 833 | PORTNUMBER(URL-PORT) 834 | NOHANDLE 835 | END-EXEC. 836 | 837 | 9999-EXIT. 838 | EXIT. 839 | -------------------------------------------------------------------------------- /Source/ZECS002.asm: -------------------------------------------------------------------------------- 1 | * 2 | * PROGRAM: ZECS002 3 | * AUTHOR: Randy Frerking and Rich Jackson. 4 | * COMMENTS: z/OS Enterprise Caching Services. 5 | * 6 | * Called by zECS caching service. 7 | * Decode Base64Binary Basic Authentication 8 | * Convert results from ASCII to EBCDIC 9 | * UserID:Password 10 | * Call RACF to validate and set return code 11 | * 12 | * This program is specifically written for zECS 13 | * and is not a generic Base64Binary encode and/or 14 | * decode subroutine. 15 | * 16 | * 17 | *********************************************************************** 18 | * Dynamic Storage Area (Start) * 19 | *********************************************************************** 20 | DFHEISTG DSECT 21 | ABSTIME DS D Absolute time 22 | APPLID DS CL08 CICS/VTAM APPLID 23 | SYSID DS CL04 CICS SYSID 24 | DS 0F 25 | USERID DS CL08 UserID 26 | DS 0F 27 | PASSWORD DS CL08 Password 28 | DS 0F 29 | BAS_REG DS F Return register 30 | DS 0F 31 | WTO_LEN DS F WTO length 32 | TD_LEN DS H Transient Data message length 33 | * 34 | DS 0F 35 | TD_DATA DS 0CL68 TD/WTO output 36 | TD_DATE DS CL10 37 | DS CL01 38 | TD_TIME DS CL08 39 | DS CL01 40 | TD_TRAN DS CL04 41 | DS CL01 42 | DS CL26 43 | TD_UID DS CL08 44 | DS CL01 45 | TD_PW DS CL08 46 | TD_L EQU *-TD_DATA 47 | * 48 | *********************************************************************** 49 | * Dynamic Storage Area (End) * 50 | *********************************************************************** 51 | * 52 | *********************************************************************** 53 | * DFHCOMMAREA * 54 | *********************************************************************** 55 | DFHCA DSECT 56 | CA_RC DS CL02 Return Code 57 | DS CL02 not used (alignment) 58 | CA_USER DS CL08 UserID 59 | CA_PASS DS CL08 Password 60 | CA_ENC DS CL24 Encoded field (max 24 bytes) 61 | DS CL04 not used (alignment) 62 | CA_DEC DS CL18 Decoded field (max 18 byte) 63 | CA_L EQU *-CA_RC DFHCA length 64 | * 65 | *********************************************************************** 66 | * Control Section * 67 | *********************************************************************** 68 | ZECS002 DFHEIENT CODEREG=(R12),DATAREG=R10,EIBREG=R11 69 | ZECS002 AMODE 31 70 | ZECS002 RMODE 31 71 | B SYSDATE BRANCH AROUND LITERALS 72 | DC CL08'ZECS002 ' 73 | DC CL48' -- CICS/REST Basic Authentication ' 74 | DC CL08' ' 75 | DC CL08'&SYSDATE' 76 | DC CL08' ' 77 | DC CL08'&SYSTIME' 78 | SYSDATE DS 0H 79 | *********************************************************************** 80 | * Address DFHCOMMAREA * 81 | * ABEND if the DFHCOMMAREA length is not the same as the DSECT. * 82 | *********************************************************************** 83 | SY_0010 DS 0H 84 | * EXEC CICS ASSIGN APPLID(APPLID) SYSID(SYSID) NOHANDLE 85 | L R9,DFHEICAP Load DFHCOMMAREA address 86 | USING DFHCA,R9 ... tell assembler 87 | LA R1,CA_L Load DFHCOMMAREA length 88 | CH R1,EIBCALEN DFHCOMMAREA equal to DSECT? 89 | BC B'1000',SY_0020 ... yes, continue 90 | EXEC CICS ABEND ABCODE(AB_001) NOHANDLE 91 | *********************************************************************** 92 | * Decode Base64Binary UserID:Password * 93 | *********************************************************************** 94 | SY_0020 DS 0H 95 | MVC CA_RC,=C'00' Set default RC 96 | * BC B'1111',SY_0900 Bypass RACF VERIFY 97 | * 98 | MVC CA_DEC,ASCII_20 Initialize to ASCII spaces 99 | LA R2,6 Load Octet count 100 | LA R3,CA_ENC Address encoded field (source) 101 | LA R6,CA_DEC Address decoded field (target) 102 | * 103 | *********************************************************************** 104 | * Process six octets * 105 | * R4 and R5 are used as the even/odd pair registers for SLL and SLDL * 106 | * instructions. * 107 | *********************************************************************** 108 | SY_0030 DS 0H 109 | SR R4,R4 Clear R4 110 | SR R5,R5 Clear R5 111 | * 112 | BAS R14,SY_1000 Decode four bytes into three 113 | BCT R2,SY_0030 ... for each octet 114 | *********************************************************************** 115 | * At this point, the UserID:Password has been decoded and converted * 116 | * from ASCII to EBCDIC. * 117 | * Move decoded and converted UserID . * 118 | *********************************************************************** 119 | SY_0100 DS 0H 120 | MVC USERID,EIGHT_40 Initialize to spaces 121 | MVC PASSWORD,EIGHT_40 Initialize to spaces 122 | * 123 | LA R2,8 Set max field length 124 | LA R3,CA_DEC Address decoded field (source) 125 | LA R6,USERID Address UserID field (target) 126 | * 127 | *********************************************************************** 128 | * Move decoded/converted field until ':' has been encountered. * 129 | *********************************************************************** 130 | SY_0110 DS 0H 131 | MVC 0(1,R6),0(R3) Move byte to UserId 132 | LA R3,1(,R3) Increment source field 133 | LA R6,1(,R6) Increment target field 134 | CLI 0(R3),C':' Colon? 135 | BC B'1000',SY_0200 ... yes, process Password 136 | BCT R2,SY_0110 ... no, continue 137 | *********************************************************************** 138 | * At this point, the UserID has been moved. Now, move the Password * 139 | *********************************************************************** 140 | SY_0200 DS 0H 141 | LA R2,8 Set max field length 142 | LA R3,1(,R3) skip past ':' 143 | LA R6,PASSWORD Address Password field (target) 144 | *********************************************************************** 145 | * Move decoded/converted field until spaces or nulls are encountered. * 146 | *********************************************************************** 147 | SY_0210 DS 0H 148 | MVC 0(1,R6),0(R3) Move byte to UserId 149 | LA R3,1(,R3) Increment source field 150 | LA R6,1(,R6) Increment target field 151 | CLI 0(R3),X'00' Null? 152 | BC B'1000',SY_0300 ... yes, call RACF 153 | CLI 0(R3),X'40' Space? 154 | BC B'1000',SY_0300 ... yes, call RACF 155 | BCT R2,SY_0210 ... no, continue 156 | *********************************************************************** 157 | * At this point, the UserID and Password have been moved. * 158 | * Call RACF to verify the UserID and Password. * 159 | *********************************************************************** 160 | SY_0300 DS 0H 161 | MVC CA_RC,=C'00' Set default return code 162 | MVC CA_USER,USERID Set UserID in DFHCOMMAREA 163 | MVC CA_PASS,PASSWORD Set Password in DFHCOMMAREA 164 | EXEC CICS VERIFY USERID(USERID) PASSWORD(PASSWORD) X 165 | NOHANDLE 166 | * 167 | OC EIBRESP,EIBRESP Zero return code? 168 | BC B'0111',RC_0008 ... no, set 08 return code 169 | * 170 | *********************************************************************** 171 | * Return to CICS * 172 | *********************************************************************** 173 | SY_0900 DS 0H 174 | EXEC CICS RETURN 175 | * 176 | *********************************************************************** 177 | * Decode Base64Binary * 178 | *********************************************************************** 179 | SY_1000 DS 0H 180 | ST R14,BAS_REG Save return register 181 | * 182 | *********************************************************************** 183 | * This routine will convert the first of four encoded bytes. * 184 | *********************************************************************** 185 | SY_1010 DS 0H 186 | CLI 0(R3),X'7E' EOF (=)? 187 | BC B'1000',RC_0012 ... yes, invalid encode 188 | SR R5,R5 Clear odd register 189 | IC R5,0(R3) Load first encoded byte 190 | LA R3,1(,R3) Point to next encoded byte 191 | IC R5,B64XLT(R5) Translate from B64 alphabet 192 | SLL R5,26 Shift out the 2 Hi order bits 193 | SLDL R4,6 Merge 6 bits of R5 into R4 194 | * 195 | *********************************************************************** 196 | * This routine will convert the second of four encoded bytes. * 197 | *********************************************************************** 198 | SY_1020 DS 0H 199 | CLI 0(R3),X'7E' EOF (=)? 200 | BC B'1000',RC_0012 ... yes, invalid encode 201 | SR R5,R5 Clear odd register 202 | IC R5,0(R3) Load first encoded byte 203 | LA R3,1(,R3) Point to next encoded byte 204 | IC R5,B64XLT(R5) Translate from B64 alphabet 205 | SLL R5,26 Shift out the 2 Hi order bits 206 | SLDL R4,6 Merge 6 bits of R5 into R4 207 | *********************************************************************** 208 | * This routine will convert the third of four encoded bytes. * 209 | *********************************************************************** 210 | SY_1030 DS 0H 211 | CLI 0(R3),X'7E' EOF (=)? 212 | BC B'1000',SY_1100 ... yes, process one octet 213 | SR R5,R5 Clear odd register 214 | IC R5,0(R3) Load first encoded byte 215 | LA R3,1(,R3) Point to next encoded byte 216 | IC R5,B64XLT(R5) Translate from B64 alphabet 217 | SLL R5,26 Shift out the 2 Hi order bits 218 | SLDL R4,6 Merge 6 bits of R5 into R4 219 | *********************************************************************** 220 | * This routine will convert the fourth of four encoded bytes. * 221 | *********************************************************************** 222 | SY_1040 DS 0H 223 | CLI 0(R3),X'7E' EOF (=)? 224 | BC B'1000',SY_1200 ... yes, process two octets 225 | SR R5,R5 Clear odd register 226 | IC R5,0(R3) Load first encoded byte 227 | LA R3,1(,R3) Point to next encoded byte 228 | IC R5,B64XLT(R5) Translate from B64 alphabet 229 | SLL R5,26 Shift out the 2 Hi order bits 230 | SLDL R4,6 Merge 6 bits of R5 into R4 231 | *********************************************************************** 232 | * Process the three decoded bytes. * 233 | *********************************************************************** 234 | SY_1050 DS 0H 235 | STCM R4,7,0(R6) Save three decoded bytes 236 | TR 0(3,R6),A_TO_E Convert to EBCDIC 237 | LA R6,3(R6) Increment pointer 238 | L R14,BAS_REG Load return register 239 | BCR B'1111',R14 Return to caller 240 | *********************************************************************** 241 | * Process single octet * 242 | *********************************************************************** 243 | SY_1100 DS 0H 244 | SLL R4,12 Shift a null digit into R4 245 | STCM R4,4,0(R6) Save single octet 246 | TR 0(3,R6),A_TO_E Convert to EBCDIC 247 | LA R2,1 Set counter to end process 248 | L R14,BAS_REG Load return register 249 | BCR B'1111',R14 Return to caller 250 | *********************************************************************** 251 | * Process double octet * 252 | *********************************************************************** 253 | SY_1200 DS 0H 254 | SLL R4,6 Shift a null digit into R4 255 | STCM R4,6,0(R6) Save double octet 256 | TR 0(3,R6),A_TO_E Convert to EBCDIC 257 | LA R2,1 Set counter to end process 258 | L R14,BAS_REG Load return register 259 | BCR B'1111',R14 Return to caller 260 | *********************************************************************** 261 | * Return code 08 - RACF error * 262 | *********************************************************************** 263 | RC_0008 DS 0H 264 | MVC CA_RC,=C'08' Set return code 08 265 | XC PASSWORD,PASSWORD Clear Password before logging 266 | BAS R14,SY_9000 Log the error 267 | BC B'1111',SY_0900 Return to caller 268 | *********************************************************************** 269 | * Return code 12 - Invalid encode field provided * 270 | *********************************************************************** 271 | RC_0012 DS 0H 272 | MVC CA_RC,=C'12' Set return code 12 273 | BC B'1111',SY_0900 Return to caller 274 | * 275 | *********************************************************************** 276 | * Format time stamp * 277 | * Write TD Message * 278 | * Issue WTO * 279 | *********************************************************************** 280 | SY_9000 DS 0H 281 | ST R14,BAS_REG Save return register 282 | * 283 | MVC TD_DATA,MSG_TEXT Set message text 284 | MVC TD_TRAN,EIBTRNID Set Transaction ID 285 | MVC TD_UID,USERID Set UserID 286 | MVC TD_PW,PASSWORD Set Password 287 | * 288 | EXEC CICS ASKTIME ABSTIME(ABSTIME) NOHANDLE 289 | EXEC CICS FORMATTIME ABSTIME(ABSTIME) YYYYMMDD(TD_DATE) X 290 | TIME(TD_TIME) DATESEP('/') TIMESEP(':') NOHANDLE 291 | * 292 | LA R1,TD_L Load TD message length 293 | STH R1,TD_LEN Save TD Message length 294 | ST R1,WTO_LEN WTO length 295 | * 296 | EXEC CICS WRITEQ TD QUEUE('@tdq@') FROM(TD_DATA) X 297 | LENGTH(TD_LEN) NOHANDLE 298 | * 299 | BC B'1111',SY_9100 Bypass WTO 300 | EXEC CICS WRITE OPERATOR TEXT(TD_DATA) TEXTLENGTH(WTO_LEN) X 301 | ROUTECODES(WTO_RC) NUMROUTES(WTO_RC_L) EVENTUAL X 302 | NOHANDLE 303 | *********************************************************************** 304 | * Label to bypass WTO * 305 | *********************************************************************** 306 | SY_9100 DS 0H 307 | L R14,BAS_REG Load return register 308 | BCR B'1111',R14 Return to caller 309 | * 310 | * 311 | *********************************************************************** 312 | * Literal Pool * 313 | *********************************************************************** 314 | LTORG 315 | * 316 | DS 0F 317 | AB_001 DC CL04'Z001' 318 | DS 0F 319 | EIGHT_40 DC 08XL01'40' EBCDIC spaces 320 | ASCII_20 DC 18XL01'20' ASCII spaces 321 | * 322 | MSG_TEXT DC 0CL69 323 | DC CL25'YYYY/MM/DD HH:MM:SS tttt ' 324 | DC CL27'ZECS002 security failure - ' 325 | DC CL17'uuuuuuuu pppppppp' 326 | DS 0F 327 | WTO_RC_L DC F'02' WTO Routecode length 328 | WTO_RC DC XL02'0111' 329 | DS 0F 330 | * 331 | *********************************************************************** 332 | * Translate table * 333 | * Base64Binary alphabet and corresponding six bit representation * 334 | *********************************************************************** 335 | DS 0F 336 | B64XLT DC XL16'00000000000000000000000000000000' 00-0F 337 | DC XL16'00000000000000000000000000000000' 10-1F 338 | DC XL16'00000000000000000000000000000000' 20-2F 339 | DC XL16'00000000000000000000000000000000' 30-3F 340 | DC XL16'00000000000000000000000000003E00' 40-4F 341 | DC XL16'00000000000000000000000000000000' 50-5F 342 | DC XL16'003F0000000000000000000000000000' 60-6F 343 | DC XL16'00000000000000000000000000000000' 70-7F 344 | DC XL16'001A1B1C1D1E1F202122000000000000' 80-8F 345 | DC XL16'00232425262728292A2B000000000000' 90-9F 346 | DC XL16'00002C2D2E2F30313233000000000000' A0-AF 347 | DC XL16'00000000000000000000000000000000' B0-BF 348 | DC XL16'00000102030405060708000000000000' C0-CF 349 | DC XL16'00090A0B0C0D0E0F1011000000000000' D0-DF 350 | DC XL16'00001213141516171819000000000000' E0-EF 351 | DC XL16'3435363738393A3B3C3D000000000000' F0-FF 352 | * 353 | *********************************************************************** 354 | * Translate table * 355 | * ASCII to EBCDIC * 356 | *********************************************************************** 357 | DS 0F 358 | A_TO_E DC XL16'00000000000000000000000000000000' 00-0F 359 | DC XL16'00000000000000000000000000000000' 10-1F 360 | DC XL16'405A7F7B5B6C507D4D5D5C4E6B604B61' 20-2F 361 | DC XL16'F0F1F2F3F4F5F6F7F8F97A5E4C7E6E6F' 30-3F 362 | DC XL16'7CC1C2C3C4C5C6C7C8C9D1D2D3D4D5D6' 40-4F 363 | DC XL16'D7D8D9E2E3E4E5E6E7E8E9BAE0BB5F6D' 50-5F 364 | DC XL16'79818283848586878889919293949596' 60-6F 365 | DC XL16'979899A2A3A4A5A6A7A8A9C06AD0A107' 70-7F 366 | DC XL16'00000000000000000000000000000000' 80-8F 367 | DC XL16'00000000000000000000000000000000' 90-9F 368 | DC XL16'00000000000000000000000000000000' A0-AF 369 | DC XL16'00000000000000000000000000000000' B0-BF 370 | DC XL16'00000000000000000000000000000000' C0-CF 371 | DC XL16'00000000000000000000000000000000' D0-DF 372 | DC XL16'00000000000000000000000000000000' E0-EF 373 | DC XL16'00000000000000000000000000000000' F0-FF 374 | * 375 | DS 0F 376 | *********************************************************************** 377 | * Register assignments * 378 | *********************************************************************** 379 | DS 0F 380 | R0 EQU 0 381 | R1 EQU 1 382 | R2 EQU 2 383 | R3 EQU 3 384 | R4 EQU 4 385 | R5 EQU 5 386 | R6 EQU 6 387 | R7 EQU 7 388 | R8 EQU 8 389 | R9 EQU 9 390 | R10 EQU 10 391 | R11 EQU 11 392 | R12 EQU 12 393 | R13 EQU 13 394 | R14 EQU 14 395 | R15 EQU 15 396 | * 397 | PRINT ON 398 | *********************************************************************** 399 | * End of Program * 400 | *********************************************************************** 401 | END ZECS002 -------------------------------------------------------------------------------- /Source/ZECS003.cbl: -------------------------------------------------------------------------------- 1 | CBL CICS(SP) 2 | IDENTIFICATION DIVISION. 3 | PROGRAM-ID. ZECS003. 4 | AUTHOR. Randy Frerking and Rich Jackson. 5 | ***************************************************************** 6 | * * 7 | * z/OS Enterprise Caching Services. * 8 | * * 9 | * This program is executed when an HTTP/DELETE request has * 10 | * received a ?clear=*. All records with a timestamp greater * 11 | * than current ABS will be deleted. * 12 | * * 13 | * This program will send a response before performing both the * 14 | * delete and replicate rquests when .ADR is present in the URL * 15 | * (Asynchronous Delete Request). * 16 | * * 17 | * This program will send a response after performing both the * 18 | * delete and replicate rquests when .SDR is present in the URL * 19 | * (Synchronous Delete Request). * 20 | * * 21 | * Date UserID Description * 22 | * ---------- -------- ---------------------------------------- * 23 | * * 24 | ***************************************************************** 25 | ENVIRONMENT DIVISION. 26 | DATA DIVISION. 27 | WORKING-STORAGE SECTION. 28 | 29 | ***************************************************************** 30 | * DEFINE LOCAL VARIABLES * 31 | ***************************************************************** 32 | 01 CURRENT-ABS PIC S9(15) VALUE ZEROES COMP-3. 33 | 01 TWELVE PIC S9(08) VALUE 12 COMP. 34 | 01 TEN PIC S9(08) VALUE 10 COMP. 35 | 01 SEVEN PIC S9(08) VALUE 7 COMP. 36 | 01 TWO PIC S9(08) VALUE 2 COMP. 37 | 01 ONE PIC S9(08) VALUE 1 COMP. 38 | 01 FIVE-TWELVE PIC S9(08) VALUE 512 COMP. 39 | 40 | 01 EOF PIC X(01) VALUE SPACES. 41 | 01 SLASH PIC X(01) VALUE '/'. 42 | 43 | 01 ADR PIC X(03) VALUE 'ADR'. 44 | 01 SDR PIC X(03) VALUE 'SDR'. 45 | 46 | 01 DOT PIC X(01) VALUE '.'. 47 | 01 CLEAR-ALL PIC X(07) VALUE 'clear=*'. 48 | 49 | 01 CRLF PIC X(02) VALUE X'0D25'. 50 | 51 | 01 ZECS-DC. 52 | 02 DC-TRANID PIC X(04) VALUE 'ZC##'. 53 | 02 FILLER PIC X(02) VALUE 'DC'. 54 | 02 FILLER PIC X(42) VALUE SPACES. 55 | 56 | 01 ZK-FCT. 57 | 02 ZK-TRANID PIC X(04) VALUE 'ZC##'. 58 | 02 FILLER PIC X(04) VALUE 'KEY '. 59 | 60 | 01 ZF-FCT. 61 | 02 ZF-TRANID PIC X(04) VALUE 'ZC##'. 62 | 02 FILLER PIC X(04) VALUE 'FILE'. 63 | 64 | 01 ZK-LENGTH PIC S9(04) COMP VALUE ZEROES. 65 | 01 ZF-LENGTH PIC S9(04) COMP VALUE ZEROES. 66 | 01 DELETE-LENGTH PIC S9(04) COMP VALUE 8. 67 | 68 | ***************************************************************** 69 | * zECS KEY record definition. * 70 | ***************************************************************** 71 | COPY ZECSZKC. 72 | 73 | 01 FC-READ PIC X(06) VALUE 'READ '. 74 | 01 FC-DELETE PIC X(06) VALUE 'DELETE'. 75 | 01 CSSL PIC X(04) VALUE '@tdq@'. 76 | 01 TD-LENGTH PIC S9(04) COMP VALUE ZEROES. 77 | 78 | 01 TD-RECORD. 79 | 02 TD-DATE PIC X(10). 80 | 02 FILLER PIC X(01) VALUE SPACES. 81 | 02 TD-TIME PIC X(08). 82 | 02 FILLER PIC X(01) VALUE SPACES. 83 | 02 TD-TRANID PIC X(04). 84 | 02 FILLER PIC X(01) VALUE SPACES. 85 | 02 TD-MESSAGE PIC X(90) VALUE SPACES. 86 | 87 | 01 FILE-ERROR. 88 | 02 FILLER PIC X(12) VALUE 'FILE I/O - '. 89 | 02 FILLER PIC X(07) VALUE 'EIBFN: '. 90 | 02 FE-FN PIC X(06) VALUE SPACES. 91 | 02 FILLER PIC X(10) VALUE ' EIBRESP: '. 92 | 02 FE-RESP PIC 9(04) VALUE ZEROES. 93 | 02 FILLER PIC X(11) VALUE ' EIBRESP2: '. 94 | 02 FE-RESP2 PIC 9(04) VALUE ZEROES. 95 | 02 FILLER PIC X(12) VALUE ' Paragraph: '. 96 | 02 FE-PARAGRAPH PIC X(04) VALUE SPACES. 97 | 02 FILLER PIC X(20) VALUE SPACES. 98 | 99 | 01 KEY-ERROR. 100 | 02 FILLER PIC X(12) VALUE 'KEY I/O - '. 101 | 02 FILLER PIC X(07) VALUE 'EIBFN: '. 102 | 02 KE-FN PIC X(06) VALUE SPACES. 103 | 02 FILLER PIC X(10) VALUE ' EIBRESP: '. 104 | 02 KE-RESP PIC 9(04) VALUE ZEROES. 105 | 02 FILLER PIC X(11) VALUE ' EIBRESP2: '. 106 | 02 KE-RESP2 PIC 9(04) VALUE ZEROES. 107 | 02 FILLER PIC X(12) VALUE ' Paragraph: '. 108 | 02 KE-PARAGRAPH PIC X(04) VALUE SPACES. 109 | 02 FILLER PIC X(20) VALUE SPACES. 110 | 111 | ***************************************************************** 112 | * Replicate resources. * 113 | ***************************************************************** 114 | 115 | 01 URI-MAP PIC X(08) VALUE SPACES. 116 | 01 URI-PATH PIC X(255) VALUE SPACES. 117 | 118 | 01 RESOURCES PIC X(10) VALUE '/resources'. 119 | 01 REPLICATE PIC X(10) VALUE '/replicate'. 120 | 01 HTTP-OK PIC X(02) VALUE 'OK'. 121 | 122 | 01 HTTP-STATUS-200 PIC S9(04) COMP VALUE 200. 123 | 124 | 01 SEND-ACTION PIC S9(08) COMP VALUE ZEROES. 125 | 01 NUMBER-OF-SPACES PIC S9(08) COMP VALUE ZEROES. 126 | 01 NUMBER-OF-NULLS PIC S9(08) COMP VALUE ZEROES. 127 | 01 WEB-METHOD PIC S9(08) COMP VALUE ZEROES. 128 | 01 WEB-PATH-LENGTH PIC S9(08) COMP VALUE 256. 129 | 130 | 01 ACTIVE-SINGLE PIC X(02) VALUE 'A1'. 131 | 01 ACTIVE-ACTIVE PIC X(02) VALUE 'AA'. 132 | 01 ACTIVE-STANDBY PIC X(02) VALUE 'AS'. 133 | 134 | 01 DC-CONTROL. 135 | 02 FILLER PIC X(06). 136 | 02 DC-TYPE PIC X(02) VALUE SPACES. 137 | 02 DC-CRLF PIC X(02). 138 | 02 THE-OTHER-DC PIC X(160) VALUE SPACES. 139 | 02 FILLER PIC X(02). 140 | 01 DC-TOKEN PIC X(16) VALUE SPACES. 141 | 01 DC-LENGTH PIC S9(08) COMP VALUE ZEROES. 142 | 01 THE-OTHER-DC-LENGTH PIC S9(08) COMP VALUE 160. 143 | 144 | 01 SESSION-TOKEN PIC 9(18) COMP VALUE ZEROES. 145 | 146 | 01 URL-SCHEME-NAME PIC X(16) VALUE SPACES. 147 | 01 URL-SCHEME PIC S9(08) COMP VALUE ZEROES. 148 | 01 URL-PORT PIC S9(08) COMP VALUE ZEROES. 149 | 01 URL-HOST-NAME PIC X(80) VALUE SPACES. 150 | 01 URL-HOST-NAME-LENGTH PIC S9(08) COMP VALUE 80. 151 | 01 WEB-STATUS-CODE PIC S9(04) COMP VALUE 00. 152 | 01 WEB-STATUS-LENGTH PIC S9(08) COMP VALUE 15. 153 | 01 WEB-STATUS-ABSTIME PIC 9(15) VALUE ZEROES. 154 | 155 | 01 WEB-PATH PIC X(512) VALUE SPACES. 156 | 157 | 01 CONVERSE-LENGTH PIC S9(08) COMP VALUE 40. 158 | 01 CONVERSE-RESPONSE PIC X(40) VALUE SPACES. 159 | 160 | 01 TEXT-PLAIN PIC X(56) VALUE 'text/plain'. 161 | 162 | ***************************************************************** 163 | * zECS FILE record definition. * 164 | ***************************************************************** 165 | COPY ZECSZFC. 166 | 167 | LINKAGE SECTION. 168 | 01 DFHCOMMAREA. 169 | 02 CA-TYPE PIC X(03). 170 | 02 CA-URI-FIELD-01 PIC X(10). 171 | 172 | PROCEDURE DIVISION. 173 | 174 | ***************************************************************** 175 | * Main process. * 176 | ***************************************************************** 177 | PERFORM 1000-INITIALIZE THRU 1000-EXIT. 178 | PERFORM 2000-REPLICATE THRU 2000-EXIT. 179 | PERFORM 3000-READ-ZF THRU 3000-EXIT 180 | WITH TEST AFTER 181 | UNTIL EOF EQUAL 'Y'. 182 | PERFORM 4000-CLEAR-COMPLETE THRU 4000-EXIT. 183 | PERFORM 9000-RETURN THRU 9000-EXIT. 184 | 185 | ***************************************************************** 186 | * Initialize resources for ?clear=* (all) request. * 187 | * When .ADR is present in the URL, send the response before * 188 | * performing the delete and replication request * 189 | * (Asynchronous Delete Request). * 190 | ***************************************************************** 191 | 1000-INITIALIZE. 192 | MOVE EIBTRNID(3:2) TO ZK-TRANID(3:2) 193 | ZF-TRANID(3:2) 194 | DC-TRANID(3:2). 195 | 196 | EXEC CICS ASKTIME ABSTIME(CURRENT-ABS) NOHANDLE 197 | END-EXEC. 198 | 199 | IF CA-TYPE EQUAL ADR 200 | OR CA-URI-FIELD-01 EQUAL REPLICATE 201 | PERFORM 8000-SEND-RESPONSE THRU 8000-EXIT. 202 | 203 | 1000-EXIT. 204 | EXIT. 205 | 206 | ***************************************************************** 207 | * Replicate request to the other Data Center. * 208 | * If this is a replicate request, set document type to null, * 209 | * as this is the other Data Center. * 210 | * * 211 | * If we don't contact the other Data Center successfully, * 212 | * zECS expiration process will eventually delete the old * 213 | * records. * 214 | ***************************************************************** 215 | 2000-REPLICATE. 216 | PERFORM 7000-GET-URL THRU 7000-EXIT. 217 | 218 | IF CA-URI-FIELD-01 EQUAL REPLICATE 219 | MOVE LOW-VALUES TO DC-TYPE. 220 | 221 | IF EIBRESP EQUAL DFHRESP(NORMAL) 222 | IF DC-TYPE EQUAL ACTIVE-ACTIVE 223 | OR DC-TYPE EQUAL ACTIVE-STANDBY 224 | PERFORM 7100-WEB-OPEN THRU 7100-EXIT. 225 | 226 | IF EIBRESP EQUAL DFHRESP(NORMAL) 227 | IF DC-TYPE EQUAL ACTIVE-ACTIVE 228 | OR DC-TYPE EQUAL ACTIVE-STANDBY 229 | MOVE DFHVALUE(DELETE) TO WEB-METHOD 230 | PERFORM 7200-WEB-CONVERSE THRU 7200-EXIT. 231 | 232 | IF EIBRESP EQUAL DFHRESP(NORMAL) 233 | IF DC-TYPE EQUAL ACTIVE-ACTIVE 234 | OR DC-TYPE EQUAL ACTIVE-STANDBY 235 | PERFORM 7300-WEB-CLOSE THRU 7300-EXIT. 236 | 237 | 2000-EXIT. 238 | EXIT. 239 | 240 | ***************************************************************** 241 | * Read zECS cache record. * 242 | * Since there can be multiple segments for a single cache * 243 | * record, only check the first record and make decisions * 244 | * accordingly. * 245 | ***************************************************************** 246 | 3000-READ-ZF. 247 | MOVE LENGTH OF ZF-RECORD TO ZF-LENGTH. 248 | 249 | EXEC CICS READ FILE(ZF-FCT) 250 | RIDFLD(ZF-KEY-16) 251 | INTO (ZF-RECORD) 252 | LENGTH(ZF-LENGTH) 253 | GTEQ 254 | NOHANDLE 255 | END-EXEC. 256 | 257 | IF EIBRESP NOT EQUAL DFHRESP(NORMAL) 258 | MOVE 'Y' TO EOF 259 | ELSE 260 | IF ZF-ABS LESS THAN CURRENT-ABS 261 | PERFORM 3100-DELETE THRU 3100-EXIT. 262 | 263 | ADD ONE TO ZF-ZEROES. 264 | 265 | 3000-EXIT. 266 | EXIT. 267 | 268 | ***************************************************************** 269 | * Delete the local cache record. * 270 | ***************************************************************** 271 | 3100-DELETE. 272 | EXEC CICS DELETE FILE(ZF-FCT) 273 | RIDFLD(ZF-KEY-16) 274 | KEYLENGTH(DELETE-LENGTH) 275 | GENERIC 276 | NOHANDLE 277 | END-EXEC. 278 | 279 | EXEC CICS DELETE FILE(ZK-FCT) 280 | RIDFLD(ZF-ZK-KEY) 281 | NOHANDLE 282 | END-EXEC. 283 | 284 | 3100-EXIT. 285 | EXIT. 286 | 287 | ***************************************************************** 288 | * When .SDR is present in the URL, send the response after * 289 | * performing the delete and replication request * 290 | * (Synchronous Delete Request). * 291 | ***************************************************************** 292 | 4000-CLEAR-COMPLETE. 293 | IF CA-URI-FIELD-01 EQUAL RESOURCES 294 | AND CA-TYPE EQUAL SDR 295 | PERFORM 8000-SEND-RESPONSE THRU 8000-EXIT. 296 | 297 | 4000-EXIT. 298 | EXIT. 299 | 300 | ***************************************************************** 301 | * Get URL for replication process. * 302 | * URL must be in the following format: * 303 | * http://hostname:port * 304 | ***************************************************************** 305 | 7000-GET-URL. 306 | 307 | EXEC CICS DOCUMENT CREATE DOCTOKEN(DC-TOKEN) 308 | TEMPLATE(ZECS-DC) 309 | NOHANDLE 310 | END-EXEC. 311 | 312 | MOVE LENGTH OF DC-CONTROL TO DC-LENGTH. 313 | 314 | IF EIBRESP EQUAL DFHRESP(NORMAL) 315 | EXEC CICS DOCUMENT RETRIEVE DOCTOKEN(DC-TOKEN) 316 | INTO (DC-CONTROL) 317 | LENGTH (DC-LENGTH) 318 | MAXLENGTH(DC-LENGTH) 319 | DATAONLY 320 | NOHANDLE 321 | END-EXEC. 322 | 323 | IF EIBRESP EQUAL DFHRESP(NORMAL) 324 | AND DC-LENGTH GREATER THAN TEN 325 | SUBTRACT TWELVE FROM DC-LENGTH 326 | GIVING THE-OTHER-DC-LENGTH 327 | 328 | EXEC CICS WEB PARSE 329 | URL(THE-OTHER-DC) 330 | URLLENGTH(THE-OTHER-DC-LENGTH) 331 | SCHEMENAME(URL-SCHEME-NAME) 332 | HOST(URL-HOST-NAME) 333 | HOSTLENGTH(URL-HOST-NAME-LENGTH) 334 | PORTNUMBER(URL-PORT) 335 | NOHANDLE 336 | END-EXEC. 337 | 338 | IF EIBRESP NOT EQUAL DFHRESP(NORMAL) 339 | OR DC-LENGTH LESS THAN TEN 340 | OR DC-LENGTH EQUAL TEN 341 | MOVE ACTIVE-SINGLE TO DC-TYPE. 342 | 343 | 7000-EXIT. 344 | EXIT. 345 | 346 | ***************************************************************** 347 | * Open WEB connection with the other Data Center zECS. * 348 | ***************************************************************** 349 | 7100-WEB-OPEN. 350 | IF URL-SCHEME-NAME EQUAL 'HTTPS' 351 | MOVE DFHVALUE(HTTPS) TO URL-SCHEME 352 | ELSE 353 | MOVE DFHVALUE(HTTP) TO URL-SCHEME. 354 | 355 | EXEC CICS WEB OPEN 356 | HOST(URL-HOST-NAME) 357 | HOSTLENGTH(URL-HOST-NAME-LENGTH) 358 | PORTNUMBER(URL-PORT) 359 | SCHEME(URL-SCHEME) 360 | SESSTOKEN(SESSION-TOKEN) 361 | NOHANDLE 362 | END-EXEC. 363 | 364 | 7100-EXIT. 365 | EXIT. 366 | 367 | ***************************************************************** 368 | * Converse with the other Data Center zECS. * 369 | * The first element of the path, which for normal processing is * 370 | * /resources, must be changed to /replicate. * 371 | ***************************************************************** 372 | 7200-WEB-CONVERSE. 373 | MOVE FIVE-TWELVE TO WEB-PATH-LENGTH. 374 | MOVE ZEROES TO NUMBER-OF-NULLS. 375 | MOVE EIBTRNID TO URI-MAP. 376 | MOVE 'R' TO URI-MAP(5:1). 377 | 378 | EXEC CICS INQUIRE URIMAP(URI-MAP) 379 | PATH(URI-PATH) 380 | NOHANDLE 381 | END-EXEC. 382 | 383 | STRING URI-PATH 384 | DOT 385 | ADR 386 | SLASH 387 | DELIMITED BY '*' 388 | INTO WEB-PATH. 389 | 390 | INSPECT WEB-PATH TALLYING NUMBER-OF-NULLS 391 | FOR ALL LOW-VALUES. 392 | SUBTRACT NUMBER-OF-NULLS FROM WEB-PATH-LENGTH. 393 | 394 | INSPECT WEB-PATH TALLYING NUMBER-OF-SPACES 395 | FOR ALL SPACES. 396 | SUBTRACT NUMBER-OF-SPACES FROM WEB-PATH-LENGTH. 397 | 398 | MOVE REPLICATE TO WEB-PATH(1:10). 399 | 400 | EXEC CICS WEB CONVERSE 401 | SESSTOKEN(SESSION-TOKEN) 402 | PATH(WEB-PATH) 403 | PATHLENGTH(WEB-PATH-LENGTH) 404 | METHOD(WEB-METHOD) 405 | MEDIATYPE(ZF-MEDIA) 406 | INTO(CONVERSE-RESPONSE) 407 | TOLENGTH(CONVERSE-LENGTH) 408 | MAXLENGTH(CONVERSE-LENGTH) 409 | STATUSCODE(WEB-STATUS-CODE) 410 | STATUSLEN (WEB-STATUS-LENGTH) 411 | STATUSTEXT(WEB-STATUS-ABSTIME) 412 | QUERYSTRING(CLEAR-ALL) 413 | QUERYSTRLEN(SEVEN) 414 | NOOUTCONVERT 415 | NOHANDLE 416 | END-EXEC. 417 | 418 | 7200-EXIT. 419 | EXIT. 420 | 421 | ***************************************************************** 422 | * Close WEB connection with the other Data Center zECS. * 423 | ***************************************************************** 424 | 7300-WEB-CLOSE. 425 | 426 | EXEC CICS WEB CLOSE 427 | SESSTOKEN(SESSION-TOKEN) 428 | NOHANDLE 429 | END-EXEC. 430 | 431 | 7300-EXIT. 432 | EXIT. 433 | 434 | ***************************************************************** 435 | * Send response to client * 436 | ***************************************************************** 437 | 8000-SEND-RESPONSE. 438 | MOVE DFHVALUE(IMMEDIATE) TO SEND-ACTION. 439 | 440 | EXEC CICS WEB SEND 441 | FROM (CRLF) 442 | FROMLENGTH (TWO) 443 | MEDIATYPE (TEXT-PLAIN) 444 | ACTION (SEND-ACTION) 445 | STATUSCODE (HTTP-STATUS-200) 446 | STATUSTEXT (HTTP-OK) 447 | SRVCONVERT 448 | NOHANDLE 449 | END-EXEC. 450 | 451 | 8000-EXIT. 452 | EXIT. 453 | 454 | ***************************************************************** 455 | * Return to CICS * 456 | ***************************************************************** 457 | 9000-RETURN. 458 | 459 | EXEC CICS RETURN 460 | END-EXEC. 461 | 462 | 9000-EXIT. 463 | EXIT. 464 | -------------------------------------------------------------------------------- /Source/ZECSFILE.idcams: -------------------------------------------------------------------------------- 1 | DELETE @ecs_hlq@.ZC@id@FILE.@environment@ CLUSTER PURGE 2 | SET MAXCC=0 3 | 4 | DEFINE CLUSTER - 5 | (NAME(@ecs_hlq@.ZC@id@FILE.@environment@) - 6 | BUFFERSPACE(67584) - 7 | DATACLAS(@data_class@) - 8 | INDEXED - 9 | KEYS(16 0) - 10 | MANAGEMENTCLASS(@mgt_class@) - 11 | LOG(UNDO) - 12 | RECORDSIZE(100 32700) - 13 | SHAREOPTIONS(2 3) - 14 | RECOVERY - 15 | STORAGECLASS(@stg_class@)) - 16 | DATA(NAME(@ecs_hlq@.ZC@id@FILE.@environment@.DATA) - 17 | CYLINDERS(@pri_cyl@ @sec_cyl@) - 18 | CONTROLINTERVALSIZE(32768)) - 19 | INDEX(NAME(@ecs_hlq@.ZC@id@FILE.@environment@.INDEX) - 20 | TRACKS(5 5) - 21 | CONTROLINTERVALSIZE(2048)) -------------------------------------------------------------------------------- /Source/ZECSKEY.idcams: -------------------------------------------------------------------------------- 1 | DELETE @ecs_hlq@.ZC@id@KEY.@environment@ CLUSTER PURGE 2 | SET MAXCC=0 3 | 4 | DEFINE CLUSTER - 5 | (NAME(@ecs_hlq@.ZC@id@KEY.@environment@) - 6 | BUFFERSPACE(68096) - 7 | DATACLAS(@data_class@) - 8 | INDEXED - 9 | KEYS(255 0) - 10 | MANAGEMENTCLASS(@mgt_class@) - 11 | LOG(UNDO) - 12 | RECORDSIZE(512 512) - 13 | SHAREOPTIONS(2 3) - 14 | RECOVERY - 15 | STORAGECLASS(@stg_class@)) - 16 | DATA(NAME(@ecs_hlq@.ZC@id@KEY.@environment@.DATA) - 17 | CYLINDERS(@pri_cyl@ @sec_cyl@) - 18 | CONTROLINTERVALSIZE(32768)) - 19 | INDEX(NAME(@ecs_hlq@.ZC@id@KEY.@environment@.INDEX) - 20 | TRACKS(10 5) - 21 | CONTROLINTERVALSIZE(2560)) -------------------------------------------------------------------------------- /Source/ZECSNC.asm: -------------------------------------------------------------------------------- 1 | * 2 | * PROGRAM: ZECSNC 3 | * AUTHOR: Randy Frerking and Rich Jackson. 4 | * COMMENTS: z/OS Enterprise Caching Services. 5 | * 6 | * Create zECS 'named counter' for a specific table. 7 | * The 'named counter' is used to create the internal key 8 | * for the file/data store within zECS. 9 | * 10 | * This program can be executed from another program via 11 | * LINK command for from the terminal using the following 12 | * format: 13 | * 14 | * Tran,XXXX Where 'xxxx' is the zECS transaction ID 15 | * 16 | * This program will also start the expiration task for 17 | * the zECS service, which will be started in only the 18 | * current region/server. The PLT program ZECSPLT will 19 | * start the expiration process across all servers within 20 | * a Sysplex. 21 | * 22 | *********************************************************************** 23 | * Dynamic Storage Area (Start) * 24 | *********************************************************************** 25 | DFHEISTG DSECT 26 | ABSTIME DS D Absolute time 27 | DS 0F 28 | APPLID DS CL08 CICS/VTAM APPLID 29 | DS 0F 30 | SYSID DS CL04 CICS SYSID 31 | DS 0F 32 | STCODE DS CL02 Transaction start code 33 | DS 0F 34 | USERID DS CL08 UserID 35 | DS 0F 36 | Z_EXP DS CL04 zECS Expiration TransID 37 | DS 0F 38 | Z_NC DS 0CL16 zECS Named Counter 39 | Z_TRAN DS CL04 zECS Service TransID 40 | Z_SUFFIX DS CL12 _zECS 41 | DS 0F 42 | BAS_REG DS F Return register 43 | DS 0F 44 | * 45 | TC_LEN DS H Terminal input length 46 | * 47 | DS 0F 48 | TC_DATA DS 0CL09 TC input 49 | TC_ZCNC DS CL04 CICS transaction ID 50 | DS CL01 comma 51 | TC_TRAN DS CL04 zECS transaction ID 52 | TC_L EQU *-TC_DATA 53 | * 54 | WTO_LEN DS F WTO length 55 | TD_LEN DS H Transient Data message length 56 | * 57 | DS 0F 58 | TD_DATA DS 0CL74 TD/WTO output 59 | TD_DATE DS CL10 60 | DS CL01 61 | TD_TIME DS CL08 62 | DS CL01 63 | TD_TRAN DS CL04 64 | DS CL50 65 | TD_L EQU *-TD_DATA 66 | * 67 | ER_LEN DS H Error/Invalid message length 68 | * 69 | DS 0F 70 | ER_DATA DS 0CL73 Error/Invalid message 71 | ER_TRAN DS CL04 72 | DS CL69 73 | ER_L EQU *-ER_DATA 74 | * 75 | *********************************************************************** 76 | * Dynamic Storage Area (End) * 77 | *********************************************************************** 78 | * 79 | *********************************************************************** 80 | * DFHCOMMAREA * 81 | *********************************************************************** 82 | DFHCA DSECT 83 | CA_RC DS CL02 Return Code 84 | DS CL02 not used (alignment) 85 | CA_TRAN DS CL04 zECS Transaction ID 86 | CA_L EQU *-CA_RC DFHCA length 87 | * 88 | *********************************************************************** 89 | * Control Section * 90 | *********************************************************************** 91 | ZECSNC DFHEIENT CODEREG=(R12),DATAREG=R10,EIBREG=R11 92 | ZECSNC AMODE 31 93 | ZECSNC RMODE 31 94 | B SYSDATE BRANCH AROUND LITERALS 95 | DC CL08'ZNC ' 96 | DC CL48' -- zECS Named Counter creation ' 97 | DC CL08' ' 98 | DC CL08'&SYSDATE' 99 | DC CL08' ' 100 | DC CL08'&SYSTIME' 101 | SYSDATE DS 0H 102 | *********************************************************************** 103 | * Address DFHCOMMAREA * 104 | * ABEND if the DFHCOMMAREA length is not the same as the DSECT. * 105 | *********************************************************************** 106 | SY_0010 DS 0H 107 | EXEC CICS ASSIGN APPLID(APPLID) SYSID(SYSID) X 108 | STARTCODE(STCODE) NOHANDLE 109 | * 110 | MVC Z_SUFFIX,C_SUFFIX Move zECS NC suffix 111 | * 112 | L R9,DFHEICAP Load DFHCOMMAREA address 113 | USING DFHCA,R9 ... tell assembler 114 | CLC EIBCALEN,=H'0' DFHCOMMAREA length zero? 115 | BC B'1000',SY_0030 ... yes, RECEIVE terminal input 116 | LA R1,CA_L Load DFHCOMMAREA length 117 | CH R1,EIBCALEN DFHCOMMAREA equal to DSECT? 118 | BC B'1000',SY_0020 ... yes, continue 119 | EXEC CICS ABEND ABCODE(EIBTRNID) NOHANDLE 120 | *********************************************************************** 121 | * Set xxxx_ZECS using DFHCOMMAREA * 122 | *********************************************************************** 123 | SY_0020 DS 0H 124 | MVC Z_TRAN,CA_TRAN Move NC TranID from COMMAREA 125 | BC B'1111',SY_0100 Continue process 126 | * 127 | *********************************************************************** 128 | * Set xxxx_ZECS using terminal input. * 129 | *********************************************************************** 130 | SY_0030 DS 0H 131 | LA R1,TC_L Load maximum TC length 132 | STH R1,TC_LEN Save maximum TC length 133 | * 134 | EXEC CICS RECEIVE INTO(TC_DATA) NOHANDLE 135 | * 136 | CLC TC_ZCNC,EIBTRNID TransID in first four bytes? 137 | BC B'0111',ER_0010 ... no, invalid format 138 | MVC Z_TRAN,TC_TRAN Move NC TranID from TC input 139 | BC B'1111',SY_0100 Continue process 140 | * 141 | *********************************************************************** 142 | * Create xxxx_ZECS named counter. * 143 | *********************************************************************** 144 | SY_0100 DS 0H 145 | EXEC CICS DEFINE DCOUNTER(Z_NC) X 146 | VALUE (C_VAL) X 147 | MINIMUM(C_MIN) X 148 | MAXIMUM(C_MAX) X 149 | NOHANDLE 150 | * 151 | OC EIBRESP,EIBRESP Normal response? 152 | BC B'0111',ER_0020 ... no, Duplicate Counter 153 | * 154 | BAS R14,SY_9000 WTO and WRITEQ TD 155 | *********************************************************************** 156 | * Issue START TRANSID for the new service * 157 | *********************************************************************** 158 | SY_0200 DS 0H 159 | MVC Z_EXP,C_EXP Move expiration model name 160 | MVC Z_EXP+2(2),Z_TRAN+2 Move service ID 161 | * 162 | EXEC CICS START X 163 | TRANSID(Z_EXP) X 164 | FROM (Z_TRAN) X 165 | LENGTH (4) X 166 | NOHANDLE 167 | *********************************************************************** 168 | * Send terminal response * 169 | *********************************************************************** 170 | SY_0800 DS 0H 171 | CLI STCODE,C'T' Terminal task? 172 | BC B'0111',SY_0900 ... no, bypass SEND 173 | EXEC CICS SEND FROM(TD_DATA) LENGTH(TD_LEN) X 174 | ERASE NOHANDLE 175 | *********************************************************************** 176 | * RETURN * 177 | *********************************************************************** 178 | SY_0900 DS 0H 179 | EXEC CICS RETURN 180 | *********************************************************************** 181 | * Invalid terminal input * 182 | *********************************************************************** 183 | ER_0010 DS 0H 184 | LA R1,TD_L Load TD message length 185 | STH R1,TD_LEN Save TD Message length 186 | EXEC CICS SEND FROM(MSG_0010) LENGTH(TD_LEN) X 187 | ERASE NOHANDLE 188 | BC B'1111',SY_0900 Return to caller 189 | *********************************************************************** 190 | * Named Counter already defined * 191 | *********************************************************************** 192 | ER_0020 DS 0H 193 | MVC ER_DATA,MSG_0020 Move template 194 | MVC ER_TRAN,Z_TRAN Move TransID 195 | LA R1,ER_L Load ER message length 196 | STH R1,ER_LEN Save ER Message length 197 | EXEC CICS SEND FROM(ER_DATA) LENGTH(ER_LEN) X 198 | ERASE NOHANDLE 199 | BC B'1111',SY_0900 Return to caller 200 | *********************************************************************** 201 | * Format time stamp * 202 | * Write TD Message * 203 | * Issue WTO * 204 | *********************************************************************** 205 | SY_9000 DS 0H 206 | ST R14,BAS_REG Save return register 207 | * 208 | MVC TD_DATA,MSG_TEXT Set message text 209 | MVC TD_TRAN,Z_TRAN Move NC TranID 210 | * 211 | EXEC CICS ASKTIME ABSTIME(ABSTIME) NOHANDLE 212 | EXEC CICS FORMATTIME ABSTIME(ABSTIME) YYYYMMDD(TD_DATE) X 213 | TIME(TD_TIME) DATESEP('/') TIMESEP(':') NOHANDLE 214 | * 215 | LA R1,TD_L Load TD message length 216 | STH R1,TD_LEN Save TD Message length 217 | ST R1,WTO_LEN WTO length 218 | * 219 | EXEC CICS WRITEQ TD QUEUE('@tdq@') FROM(TD_DATA) X 220 | LENGTH(TD_LEN) NOHANDLE 221 | * 222 | BC B'0000',SY_9100 Bypass WTO 223 | * 224 | EXEC CICS WRITE OPERATOR TEXT(TD_DATA) TEXTLENGTH(WTO_LEN) X 225 | ROUTECODES(WTO_RC) NUMROUTES(WTO_RC_L) EVENTUAL X 226 | NOHANDLE 227 | *********************************************************************** 228 | * Label to bypass WTO * 229 | *********************************************************************** 230 | SY_9100 DS 0H 231 | L R14,BAS_REG Load return register 232 | BCR B'1111',R14 Return to caller 233 | * 234 | * 235 | *********************************************************************** 236 | * Literal Pool * 237 | *********************************************************************** 238 | LTORG 239 | * 240 | DS 0F 241 | * 242 | DS 0F 243 | C_VAL DC XL08'1' 244 | C_MIN DC XL08'1' 245 | C_MAX DC XL08'00000000FFFFFFFF' 246 | *_MAX DC XL08'38D7EA4C67FFF' 247 | * 248 | DS 0F 249 | C_SUFFIX DC CL12'_ZECS ' 250 | DS 0F 251 | C_EXP DC CL04'ZX ' 252 | DS 0F 253 | * 254 | MSG_0010 DC 0CL74 255 | DC CL25'Invalid format. Must be ' 256 | DC CL25'TRAN,xxxx where xxxx is t' 257 | DC CL24'he zECS Transaction ID' 258 | DS 0F 259 | * 260 | MSG_0020 DC 0CL74 261 | DC CL25'xxxx_ZECS already defin' 262 | DC CL25'ed. You might want to co' 263 | DC CL24'nsider checking DFHNC* ' 264 | DS 0F 265 | * 266 | MSG_TEXT DC 0CL74 267 | DC CL25'YYYY/MM/DD HH:MM:SS tttt_' 268 | DC CL25'ZECS - zECS Named Cou' 269 | DC CL24'nter created ' 270 | DS 0F 271 | WTO_RC_L DC F'02' WTO Routecode length 272 | WTO_RC DC XL02'0111' 273 | DS 0F 274 | * 275 | *********************************************************************** 276 | * Register assignments * 277 | *********************************************************************** 278 | DS 0F 279 | R0 EQU 0 280 | R1 EQU 1 281 | R2 EQU 2 282 | R3 EQU 3 283 | R4 EQU 4 284 | R5 EQU 5 285 | R6 EQU 6 286 | R7 EQU 7 287 | R8 EQU 8 288 | R9 EQU 9 289 | R10 EQU 10 290 | R11 EQU 11 291 | R12 EQU 12 292 | R13 EQU 13 293 | R14 EQU 14 294 | R15 EQU 15 295 | * 296 | PRINT ON 297 | *********************************************************************** 298 | * End of Program * 299 | *********************************************************************** 300 | END ZECSNC -------------------------------------------------------------------------------- /Source/ZECSPLT.cbl: -------------------------------------------------------------------------------- 1 | CBL CICS(SP) 2 | IDENTIFICATION DIVISION. 3 | PROGRAM-ID. ZECSPLT. 4 | AUTHOR. Randy Frerking and Rich Jackson. 5 | ***************************************************************** 6 | * * 7 | * z/OS Enterprise Caching Services. * 8 | * * 9 | * This program executes in the PLT and performs the following: * 10 | * * 11 | * 1). Browse URIMAP * 12 | * 2). Issue START for the zECS expiration task (ZX#) for * 13 | * each zECS URIMAP. * 14 | * 3). Issue WTO for each START command. * 15 | * * 16 | * Date UserID Description * 17 | * ---------- -------- ---------------------------------------- * 18 | * * 19 | ***************************************************************** 20 | ENVIRONMENT DIVISION. 21 | DATA DIVISION. 22 | WORKING-STORAGE SECTION. 23 | 24 | ***************************************************************** 25 | * Define Constant and Define Storage. * 26 | ***************************************************************** 27 | 28 | 01 ST-CODE PIC X(02) VALUE SPACES. 29 | 01 EOF PIC X(01) VALUE SPACES. 30 | 01 ZC PIC X(02) VALUE 'ZC'. 31 | 32 | 01 URI-MAP. 33 | 02 URI-PREFIX PIC X(04) VALUE SPACES. 34 | 02 URI-SUFFIX PIC X(04) VALUE SPACES. 35 | 36 | 01 URI-TRAN PIC X(04) VALUE SPACES. 37 | 38 | 01 ZC-LENGTH PIC S9(04) COMP VALUE 4. 39 | 40 | 01 ZX-TRANID. 41 | 02 FILLER PIC X(02) VALUE 'ZX'. 42 | 02 ZX-SUFFIX PIC X(02) VALUE SPACES. 43 | 44 | 01 CSSL PIC X(04) VALUE '@tdq@'. 45 | 01 TD-LENGTH PIC S9(04) COMP VALUE ZEROES. 46 | 47 | 01 TD-RECORD. 48 | 02 FILLER PIC X(13) VALUE 'zECS start ZX'. 49 | 02 TD-SUFFIX PIC X(02) VALUE SPACES. 50 | 02 FILLER PIC X(01) VALUE SPACES. 51 | 02 FILLER PIC X(04) VALUE 'for '. 52 | 02 TD-TRAN PIC X(04) VALUE SPACES. 53 | 02 FILLER PIC X(01) VALUE SPACES. 54 | 02 TD-PATH PIC X(80) VALUE SPACES. 55 | 56 | 01 URI-PATH PIC X(256) VALUE SPACES. 57 | 58 | LINKAGE SECTION. 59 | 01 DFHCOMMAREA PIC X(01). 60 | 61 | PROCEDURE DIVISION. 62 | 63 | ***************************************************************** 64 | * Main process. * 65 | ***************************************************************** 66 | PERFORM 1000-INQUIRE-START THRU 1000-EXIT. 67 | PERFORM 2000-INQUIRE-NEXT THRU 2000-EXIT 68 | WITH TEST AFTER 69 | UNTIL EOF EQUAL 'Y'. 70 | PERFORM 3000-INQUIRE-END THRU 3000-EXIT. 71 | PERFORM 9000-RETURN THRU 9000-EXIT. 72 | 73 | ***************************************************************** 74 | * Inquire URIMAP START. * 75 | ***************************************************************** 76 | 1000-INQUIRE-START. 77 | EXEC CICS INQUIRE URIMAP START 78 | NOHANDLE 79 | END-EXEC. 80 | 81 | 1000-EXIT. 82 | EXIT. 83 | 84 | ***************************************************************** 85 | * Inquire URIMAP NEXT. * 86 | ***************************************************************** 87 | 2000-INQUIRE-NEXT. 88 | EXEC CICS INQUIRE URIMAP(URI-MAP) 89 | PATH(URI-PATH) 90 | TRANSACTION(URI-TRAN) 91 | NEXT 92 | NOHANDLE 93 | END-EXEC. 94 | 95 | IF EIBRESP NOT EQUAL DFHRESP(NORMAL) 96 | MOVE 'Y' TO EOF. 97 | 98 | IF EIBRESP EQUAL DFHRESP(NORMAL) 99 | PERFORM 2100-CHECK-URIMAP THRU 2100-EXIT. 100 | 101 | 2000-EXIT. 102 | EXIT. 103 | 104 | ***************************************************************** 105 | * Check URIMAP for ZC* entries * 106 | ***************************************************************** 107 | 2100-CHECK-URIMAP. 108 | IF URI-PREFIX(1:2) EQUAL ZC 109 | AND URI-SUFFIX EQUAL SPACES 110 | PERFORM 2200-START THRU 2200-EXIT. 111 | 112 | 2100-EXIT. 113 | EXIT. 114 | 115 | ***************************************************************** 116 | * Issue START command for zECS exiration for each table * 117 | * Issue WRITEQ TD QUEUE(CSSL) * 118 | * Issue WTO * 119 | ***************************************************************** 120 | 2200-START. 121 | MOVE URI-PREFIX(3:2) TO ZX-SUFFIX 122 | TD-SUFFIX. 123 | 124 | MOVE LENGTH OF TD-RECORD TO TD-LENGTH. 125 | 126 | EXEC CICS START TRANSID(ZX-TRANID) 127 | FROM(URI-TRAN) 128 | LENGTH(4) 129 | NOHANDLE 130 | END-EXEC. 131 | 132 | MOVE URI-TRAN TO TD-TRAN. 133 | MOVE URI-PATH TO TD-PATH. 134 | 135 | EXEC CICS WRITEQ TD QUEUE(CSSL) 136 | FROM (TD-RECORD) 137 | LENGTH(TD-LENGTH) 138 | NOHANDLE 139 | END-EXEC. 140 | 141 | EXEC CICS WRITE OPERATOR 142 | TEXT(TD-RECORD) 143 | NOHANDLE 144 | END-EXEC. 145 | 146 | 2200-EXIT. 147 | EXIT. 148 | 149 | ***************************************************************** 150 | * Inquire URIMAP END. * 151 | ***************************************************************** 152 | 3000-INQUIRE-END. 153 | EXEC CICS INQUIRE URIMAP END 154 | NOHANDLE 155 | END-EXEC. 156 | 157 | 3000-EXIT. 158 | EXIT. 159 | 160 | ***************************************************************** 161 | * Return to CICS * 162 | ***************************************************************** 163 | 9000-RETURN. 164 | 165 | EXEC CICS RETURN 166 | END-EXEC. 167 | 168 | 9000-EXIT. 169 | EXIT. 170 | -------------------------------------------------------------------------------- /Source/ZECSZFC.cpy: -------------------------------------------------------------------------------- 1 | ***************************************************************** 2 | * zECS FILE record definition. * 3 | ***************************************************************** 4 | 01 ZF-PREFIX PIC S9(08) VALUE 356 COMP. 5 | 6 | 01 ZF-RECORD. 7 | 02 ZF-KEY-16. 8 | 05 ZF-KEY. 9 | 10 ZF-KEY-IDN PIC X(06) VALUE LOW-VALUES. 10 | 10 ZF-KEY-NC PIC X(02) VALUE LOW-VALUES. 11 | 05 ZF-SEGMENT PIC 9(04) VALUE ZEROES COMP. 12 | 05 ZF-SUFFIX PIC 9(04) VALUE ZEROES COMP. 13 | 05 ZF-ZEROES PIC 9(08) VALUE ZEROES COMP. 14 | 02 ZF-ABS PIC S9(15) VALUE ZEROES COMP-3. 15 | 02 ZF-TTL PIC S9(07) VALUE ZEROES COMP-3. 16 | 02 ZF-SEGMENTS PIC 9(04) VALUE ZEROES COMP. 17 | 02 ZF-EXTRA PIC X(15). 18 | 02 ZF-ZK-KEY PIC X(255). 19 | 02 ZF-MEDIA PIC X(56). 20 | 02 ZF-DATA PIC X(32000). 21 | 02 FILLER PIC X(344). 22 | -------------------------------------------------------------------------------- /Source/ZECSZKC.cpy: -------------------------------------------------------------------------------- 1 | ***************************************************************** 2 | * zECS KEYx record definition. * 3 | ***************************************************************** 4 | 01 ZK-RECORD. 5 | 02 ZK-KEY PIC X(255) VALUE LOW-VALUES. 6 | 02 FILLER PIC X(01) VALUE LOW-VALUES. 7 | 02 ZK-ZF-KEY. 8 | 05 ZK-ZF-IDN PIC X(06) VALUE LOW-VALUES. 9 | 05 ZK-ZF-NC PIC X(02) VALUE LOW-VALUES. 10 | 02 ZK-SEGMENTS PIC X(01) VALUE SPACES. 11 | 02 FILLER PIC X(247) VALUE SPACES. 12 | -------------------------------------------------------------------------------- /System Requirements and Considerations.md: -------------------------------------------------------------------------------- 1 | # System Requirements and Considerations 2 | 3 | The following information covers the basic requirements and configuration items that must be considered for hosting this service. Specific configuration values will vary from user ot user, so many of these items reflect areas of focus and general guidelines for implementation. 4 | 5 | ## Minimum Requirements 6 | 7 | The following items represent the barest minimum of requirements to run this service. 8 | 9 | - z/OS 1.12 10 | - REXX 11 | - HLASM 5 12 | - COBOL 4.2 13 | - CICS/TS 4.2 14 | - z/OS Parallel Sysplex (CF for CICS Named Counter Server) 15 | 16 | ## Recommended Requirements 17 | 18 | In order to get the most out of this service, we strongly recommend setting up your hosting environment to be elastic and highly-available. This includes: 19 | 20 | - Setting up clusters of CICS regions (with multi-tenant hosting) 21 | - Enable WLM-managed Dynamic Sysplex Distribution 22 | - Define Shared Ports for your CICS region clusters 23 | - Employ DNS CNAME records to abstract consumer-view URIs from the DNS A records assigned to the DVIPA 24 | - VSAM RLS for data sharing 25 | 26 | ## Configuration Items 27 | 28 | Particular configuration values that need to be reviewed and adjusted for your expected usage include the following items. These settings are complementary, and must be considered in unison. 29 | 30 | ### CICS 31 | 32 | - MAXOPENTCBS - Specified in CICS Resource Definitions, controls the maximum number of open TCBs for threadsafe applications 33 | - MAXSSLTCBS - Specified in CICS Resource Definitions, controls the maximum number of TCBs for SSL and TLS handshake processing 34 | 35 | ### z/OS 36 | 37 | - MAXPROCSYS - Specified in BPXPMRxx, controls the maximum number of processes per system or LPAR 38 | - MAXPROCUSER - Specified in BPXPRMxx, controls the maximum number of processes per user ID, or region ID in this case 39 | 40 | ### VSAM RLS 41 | 42 | - RLS_MaxCFFeatureLevel - In IGDSMSxx, controls the size of data placed in CF cache structures 43 | - RLS_MAX_POOL_SIZE - In IGDSMSxx, limits the size of the RLS local buffer pool 44 | - CF RLS Lock Structure size - Via CFRM policy, general guidance is (10MB * Number of Systems * Lock Entry Size) 45 | - CF RLS Cache Structure Size - Via CFRM policy, general guidance is (RLS_Max_Pool_Size * Number of Systems) 46 | - RLS CF CACHE - In Data Class, controls which VSAM components are eligible for caching 47 | - DFSMS CF Cache Sets - In SMS CDS set up, defines how cache assignments are handled 48 | 49 | ## Additional Considerations 50 | 51 | In addition to the previous settings, these items should be reviewed for applicability: 52 | 53 | ### WLM 54 | - LPAR Weighting 55 | - Service Classes 56 | - ASID Weights 57 | 58 | ### Other 59 | - Capacity Planning 60 | - Monitoring 61 | - Coordination with other components (.e.g. DNS changes) 62 | 63 | 64 | ## Additional Info 65 | 66 | Most of these configuration considerations are covered in a bit more detail in a couple of Redbooks published by IBM in collaboration with the Walmart SMEs. Please refer to these publications for additional information: 67 | 68 | #### Creating IBM z/OS Cloud Services 69 | http://www.redbooks.ibm.com/redbooks/pdfs/sg248324.pdf 70 | 71 | #### How Walmart Became a Cloud Services Provider with IBM CICS 72 | http://www.redbooks.ibm.com/redbooks/pdfs/sg248347.pdf 73 | -------------------------------------------------------------------------------- /Usage.md: -------------------------------------------------------------------------------- 1 | # Usage 2 | 3 | ## Code Examples 4 | 5 | Variables used in these examples: 6 | - **_hostname:port_** values are all site specific 7 | - **_@path@_** is defined by the team that sets up the zUID service 8 | - **_@key@_** is 1 to 255 character value that represents the key 9 | 10 | ### curl: 11 | - Retrieve a value from the zECS instance. 12 | ```curl -X GET "http://hostname:port@path@@key@"``` 13 | 14 | - Put a new key value onto the zECS instance. 15 | ```curl -X POST "http://hostname:port@path@@key@" (value...)``` 16 | 17 | - Delete a key from the instance. 18 | ```curl -X DELETE "http://hostname:port@path@@key@"``` 19 | 20 | ### COBOL CICS: 21 | - Refer to [readme_COBOL_ex1](./readme_COBOL_ex1.md). Shows an insert, retrieve and delete for a key. 22 | 23 | ### Standard browser (Chrome, IE, Safari): 24 | - Can only submit GET requests from the browser. Will need other tools like ARC (Advanced REST Client), DCH REST Client, SOAP-UI or Postman to execute additional requests with POST/PUT/DELETE. 25 | 26 | Retrieve the value for specified key: 27 | http://hostname:port@path@/@key@ 28 | 29 | ### JavaScript: 30 | 31 | - This small snippet of code will show how to write, read and delete a key/value pair to the zECS instance. 32 | 33 | ```javascript 34 | var svc = new XMLHttpRequest(); 35 | var url = "http://hostname:port@path@"; 36 | var key_name = "mlb_dodgers" 37 | var ecs_value = "{ \"name\":\"Los Angeles Dodgers\", \"players\":26, \"salaries\":248606156, \"won_world_series\" : true }"; 38 | // Put a key value onto the zECS instance 39 | svc.open( "POST", url + key_name, false ); 40 | svc.setRequestHeader("Content-type", "text/plain"); 41 | svc.send( ecs_value ); 42 | alert("POST Dodgers to zECS: " + "Status=" + svc.status + ":" + svc.statusText + "\nResponse=" + svc.responseText ); 43 | // On return we get HTTP status:200 with status text:Ok 44 | 45 | // Retrieve the mlb_dodgers key from the zECS instance 46 | svc.open( "GET", url + key_name, false ); 47 | svc.send( null ); 48 | alert("GET Dodgers from zECS: " + "Status=" + svc.status + ":" + svc.statusText + "\nResponse=" + svc.responseText ); 49 | // On return we get HTTP status:200 with status text:Ok 50 | // Return key value:{ "name":"Los Angeles Dodgers", "players":26, "salaries":248606156, "won_world_series" : true } 51 | 52 | // Delete the dodgers from the zECS instance. 53 | svc.open( "DELETE", url + key_name, false ); 54 | svc.send( ecs_value ); 55 | alert("DELETE Dodgers from zECS: " + "Status=" + svc.status + ":" + svc.statusText + "\nResponse=" + svc.responseText ); 56 | // On return we get HTTP status:200 with status text:Ok 57 | ``` 58 | 59 | ## HTTP Status Codes 60 | - 200 - Success 61 | - 204 - Record not found 62 | - 400 - WEB RECEIVE error 63 | - 400 - Invalid URI format 64 | - 400 - Key exceeds maximum 255 bytes 65 | - 400 - Key must be greater than 0 bytes 66 | - 401 - Basic Authentication failed 67 | - 409 - Duplicate key 68 | - 507 - ZCxxKEY error 69 | - 507 - ZCxxFILE error 70 | 71 | 72 | ## Installation 73 | 74 | Refer to the [installation instructions](./Installation.md) for complete setup in the z/OS environment. 75 | 76 | 77 | 78 | ## API Reference 79 | 80 | ### Query string parameters: 81 | - ttl=99999 82 | This is only valid with the PUT/POST methods and specifies time to live in seconds for each key. It's a numeric value between 300 (5 minutes) and 86400 (24 hours) seconds. If not specified it defaults to 30 minutes or 1800 seconds. The built-in background expiration process automatically cleans up expired keys. 83 | - clear=* 84 | This is a request to clear all the keys from the zECS instance and only valid with the DELETE method. 85 | 86 | ### Example URL calls: 87 | - GET - http://hostname:port@path@{up_to_255_byte_key} 88 | No body. 89 | 90 | - POST - http://hostname:port@path@{up_to_255_byte_key} 91 | Requires a body containing the data to save under specified key. 92 | 93 | - PUT - http://hostname:port@path@{up_to_255_byte_key} 94 | Requires a body containing the data to save under specified key. 95 | 96 | - DELETE - http://hostname:port@path@{up_to_255_byte_key} 97 | No body. The key is removed from the instance. 98 | 99 | 100 | ### HTTP Headers 101 | - None 102 | -------------------------------------------------------------------------------- /_config.yml: -------------------------------------------------------------------------------- 1 | theme: jekyll-theme-midnight --------------------------------------------------------------------------------