6

我正在开发一个 Wrapper/Bridge COBOL 程序,它处理程序调用并执行横切操作,如日志记录、安全检查等。主要动机是检查消费者程序的安全访问权限,它是否有权调用生产者程序.

设桥 COBOL 程序为 B1,生产者程序 P1 和消费者(客户端)C1。

当 C1 想呼叫 P1 时,它必须呼叫 B1。然后,B1 检查可访问性。如果 C1 有权访问,则 B1 使用 C1 的数据调用 P1。

C1 -> B1 -> P1 

这里B1和P1的连接部分是相同的。程序正在使用 EXEC CICS LINK 相互调用。

COMMAREA,

COMMAREA1 (DataSet Name)

01 COMMAREA-STRUCT, 
   03 a-field
   03 another-field      
    ...

客户端;

IDENTIFICATION DIVISION.
PROGRAM-ID.  Client.
ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
COPY COMMAREA1
PROCEDURE DIVISION

 /* fill CommareaStruct with some values. */
 ....
 /* call B1 Bridge */ 
   EXEC CICS LINK PROGRAM  (B1Bridge)      NOHANDLE
     COMMAREA (COMMAREA-STRUCT) 
     LENGTH (LENGTH OF COMMAREA-STRUCT) 
    END-EXEC
 ....

桥,

IDENTIFICATION DIVISION.
PROGRAM-ID.  B1Bridge.
ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
LINKAGE SECTION.
COPY COMMAREA1
PROCEDURE DIVISION
 ...
 /* access control */
 /* logging */
 ...
 /* pass data to P1*/
    EXEC CICS LINK PROGRAM  (P1)      NOHANDLE
       COMMAREA (COMMAREA-STRUCT) 
       LENGTH (LENGTH OF COMMAREA-STRUCT) 
     END-EXEC
....

生产者;

IDENTIFICATION DIVISION.
PROGRAM-ID.  P1
ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
LINKAGE SECTION.
COPY COMMAREA1
PROCEDURE DIVISION
....

*doing some business with data in COMMAREA1 
...

当我在上面尝试时,我收到了 Bridge Program B1 的编译时警告;“引用了 COMMAREA-STRUCT 或其下属之一,但 COMMAREA-STRUCT 是一个没有可寻址性的 LINKAGE SECTION 项目。此引用在执行时不会成功解析。”

这是什么意思?我应该如何将 B1 的链接部分传递给 P1 的链接部分?

当我这样尝试时,我在运行时得到 EIBRESP:22 和 EIBRESP2:26 (逗号长度错误)。

- 编辑 -

我想我应该提供更多细节;

主要动机;实际上有两家公司,COM1 和 COM2 公司。COM2 多年来一直是 COM1 的附属公司。COM1 和 COM2 分别有 CICS1 和 CICS2。COM2 客户端程序使用 COM1 生产者程序。COM2 客户端从不直接调用 COM1 生产者。COM2 客户端将数据放入 COMMAREA-STRUCT 并远程调用通用 Cobol 程序(让它成为 GCP)。COMMAREA-STRUCT 还有“生产者程序名称”字段,GCP 可以确定要调用哪个程序。因此,GCP 从 COMMAREA-STRUCT 导出数据并映射到生产者字段。GCP 使用寻址动态地执行映射操作(对于每个生产者来说不是特别的)。生产者执行后,GCP 获取结果并通过 COMMAREA-STRUCT 传递回客户端。该系统几年前就是这样设计的。

在此处输入图像描述

现在,COM2 想从 COM1 中分离出来。所以 COM1 不想再完全访问所有 COM1 资源(生产者)。因此,COM1 想要在 CICS1 前面放置一个新的 cics,这将是一个仅在本地运行 B1 Bridge 程序的处理程序 CICS。这也与网络安全和公司政治决策有关。

在此处输入图像描述 一会儿把公司分开,客户和生产商都不会受到影响。所以,问题应该在 GCP-Bridge 层解决。

这就是为什么 B1 Bridge 对 COM2 客户端的行为应该像 GCP,应该检查可访问性(不知何故,我们应用了它),并且应该将来自客户端的所有数据不加任何修改地传递给 GCP。

目前,日志记录操作没有任何优先级。我们稍后会关注部分公司。

因此,我非常感谢您的专家意见。

*我们不能使用 CALL,因为 B1 将在另一个 CICS 上并且无法访问 COM1 的 LOADLIB1,这就是为什么 B1 应该通过 EXEC CICS LINK 远程调用 GCP。

*不是通过commarea,而是通过频道对我来说听起来不错。我们将对此进行讨论。

*顺便说一下,我会检查 LENGHT OF 上的全字半字冲突。你说的对。

*关于安全检查,我们将讨论“EXEC CICS QUERY SECURITY”。

*如上所述,我们不能修改抄本。只有我们能改变的是,

 EXEC CICS LINK PROGRAM (GCP) 

 EXEC CICS LINK PROGRAM (B1) 

通过查找和替换在客户端上。因为有成千上万的客户。我们不想改变字帖并触摸它们。

鉴于这些细节,我认为这个问题变得更容易理解了。

4

1 回答 1

9

在通过 调用的 CICS COBOL 程序EXEC CICS LINK中,链接部分必须包含名称为 的 01 级结构DFHCOMMAREA。预编译器或 COBOL 编译器的 CICS 协处理器将为USING过程部门生成适当的,因此程序对DFHCOMMAREA结构具有可寻址性。

DFHCOMMAREA将包含您在目标程序COMMAREA-STRUCT时调用的内容。LINK

处理您发现自己的情况的一种方法是修改您的字帖以删除 01 级结构名称,并要求所有客户在声明之前对自己的 01 级结构名称进行编码COPY。在桥接程序和生产者程序中,这个 01 级结构名称将是DFHCOMMAREA.

处理这种情况的另一种方法是避免LINK使用动态CALL. 您必须将其DFHEIBLK作为第一个参数包含在内CALL

处理这种情况的另一种方法是为一个或多个 CICS 容器避免使用逗号。与传递 commarea 不同,LINK您将传递一个通道,该通道将有一个或多个悬挂在其上的容器,其中包含您希望传递的数据。

需要注意的是,您正在使用LENGTH OF特殊寄存器来记录逗号长度。特殊寄存器是全字,但逗号长度参数是半字。我怀疑这会让您感到悲伤,除非 IBM 生成代码来拦截该特定习语并将特殊寄存器移动到临时半字(不太可能但可能)。

更新:

从您的附加信息来看,您的任务显然是为现有程序(GCP)编写“替代品”。

一种实用的方法可能是创建一个新的字帖,我们称之为 COMAREA2,它是 COMAREA1 的副本,但没有嵌入的 01 级别结构名称。将COPY COMAREA2语句紧跟在DFHCOMMAREAB1 程序中的 01 结构名称之后。

这并不理想,因为某处的文档必须明确说明对 COMAREA1 字帖的更改必须反映在 COMAREA2 中。像这样的手动过程当然会引入错误的可能性,但它确实可以很好地让您不必修改任何 C1 或 P1 程序。

更优雅,只要它适合你,就可以尝试......

COPY COMAREA1 REPLACING == 01 COMMAREA-STRUCT== BY ==*01 COMMAREA-STRUCT==.

...在您的 B1 课程中。这将消除对上述建议的 COMAREA2 字帖的需要。如果这可行,您只需将COPY语句放在DFHCOMMAREA01 结构级别名称之后。

于 2016-08-15T14:57:30.527 回答