Я работаю над программой Wrapper/Bridge COBOL, которая обрабатывает вызовы программ и выполняет сквозные операции, такие как ведение журнала, проверка безопасности и т. Д. Основная мотивация проверяется доступ к безопасности для потребительской программы, имеет ли он доступ к вызову программы-производителя или нет.Как передать данные раздела связи в раздел привязки другой программы в COBOL
Пусть программа COBOL моста будет B1 и программа-производитель P1 и потребитель (клиент) C1.
Когда C1 хочет позвонить P1, он должен позвонить в B1. Затем B1 проверяет доступность. Если C1 имеет доступ, то B1 вызывает P1 с данными C1.
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 B1; «COMMAREA-STRUCT» или один из его подчиненных был указан, но COMMAREA-STRUCT был элементом LINKAGE SECTION, который не имел адресности. Эта ссылка не будет разрешена успешно при выполнении ».
Что это значит? Как мне передать раздел связи B1 в раздел связей P1?
Когда я пытаюсь сделать это, я получил EIBRESP: 22 и EIBRESP2: 26 (ошибка длины сообщения) во время выполнения.
- Edit -
Я думаю, что я должен дать более подробную информацию;
Основная мотивация; На самом деле есть две компании, которые работают в компании 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.
Теперь, COM2 хочет, кроме COM1. Таким образом, COM1 больше не хочет предоставлять полный доступ ко всем ресурсам (производителям) COM1. Таким образом, COM1 хочет поставить новые циклы перед CICS1, который будет обработчиком CICS, который запускает только программу B1 Bridge локально.Это также касается безопасности сети и решений компании-политики.
Чтобы отделить компании друг от друга через некоторое время, ни клиенты, ни производители не должны быть затронуты. Таким образом, проблема должна быть решена в слое GCP-Bridge.
Именно поэтому мост B1 должен вести себя как GCP для клиентов COM2, должен проверять доступность (как-то, мы его применили) и передавать все данные, поступающие от клиентов на GCP, без каких-либо изменений.
В настоящее время операция регистрации не имеет приоритета. Мы немного сосредоточимся на компаниях.
Так что я очень благодарен за ваши комментарии экспертов.
* Мы не можем использовать CALL, потому что B1 будет находиться на другой CICS и не сможет получить доступ к LOADLIB1 COM1, поэтому B1 должен использовать GCP удаленно с помощью EXEC CICS LINK.
* Вместо того, чтобы проходить через запятую, прохождение канала звучит хорошо для меня. Мы поговорим об этом.
* Кстати, я проверю конфликт полслово-полуслова на LENGHT OF. Ты прав.
* Для проверки безопасности мы обсудим «ЗАВЕРШЕНИЕ СЕКЦИИ EXEC CICS QUERY».
* Как уже упоминалось выше, мы не можем изменять копии книг. Только мы можем изменить есть
EXEC CICS LINK PROGRAM (GCP)
в
EXEC CICS LINK PROGRAM (B1)
на клиентов, найти & заменить. Потому что тысячи клиентов. Мы не хотим менять книгу и прикасаться к ним.
В свете этих деталей, я думаю, проблема становится более понятной.
Итак, посмотрите на свой выходной список из компиляции. Посмотрите на заголовок PROCEDURE DIVISION. См. ИСПОЛЬЗОВАНИЕ? Вот почему ваш 01 не имеет адресности, поскольку @cschneid подробно описал. Как программа клиента «входит в систему», и почему это не дает вам контроля доступа и регистрации? –
Регистрация и безопасность могут быть интересными. 'EXEC CICS QUERY SECURITY' может быть целесообразным для обеспечения безопасности (обратитесь к вашим специалистам по безопасности). Ведение журнала - где? VSAM? DB2? Что вы регистрируете? – cschneid
Спасибо за ваши комментарии экспертов. Я редактировал вопрос, который состоит из деталей проблемы и моих ответов. – Tunceren