我正在开发一个 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)
通过查找和替换在客户端上。因为有成千上万的客户。我们不想改变字帖并触摸它们。
鉴于这些细节,我认为这个问题变得更容易理解了。