我正在开发一个处理程序调用的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
....
The Bridge,
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(commarea长度错误)。
- 编辑 -
我想我应该提供更多细节;
主要动机; 实际上有两家公司是COM1和COM2公司。 COM2多年来一直是COM1的附属公司。 COM1和COM2分别具有CICS1和CICS2。 COM2客户端程序使用COM1生成器程序。 COM2客户端从不直接调用COM1生成器。 COM2客户端将数据放入COMMAREA-STRUCT并远程调用Generic Cobol程序(让它成为GCP)。 COMMAREA-STRUCT还有生产者计划名称" GCP确定要调用哪个程序的字段。因此,GCP从COMMAREA-STRUCT导出数据并映射到生产者的字段。 GCP通过寻址动态执行映射操作(对每个生产者都不是特殊的)。生成器执行后,GCP获取结果并通过COMMAREA-STRUCT传递回客户端。 该系统的设计与几年前类似。有成千上万的COM2客户端和成千上万的COM1生产商。
现在,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)
通过find& replace在客户端上。因为有成千上万的客户。我们不想更改副本并触摸它们。
根据这些细节,我认为问题变得更容易理解。