2016-08-15 2 views
5

プログラムコールを処理し、ログ、セキュリティチェックなどのクロスカッティング操作を実行する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 
... 

私が上記を試してみると、ブリッジプログラムB1のコンパイル時の警告が出ました。 "COMMAREA-STRUCTまたはその従属部の1つが参照されましたが、COMMAREA-STRUCTは、アドレス可能性を持たないリンクセクション項目でしたが、この参照は実行時に完全には解決されません。

この意味は? B1のリンケージセクションをP1のリンケージセクションにどのように渡す必要がありますか?

私がこのようにしようとすると、EIBRESP:22とEIBRESP2:26(commarea length error)が実行時に取得されました。

- 編集 -

私はもっと詳しく述べるべきだと思います。

主な動機; 実際には会社COM1とCOM2の2社があります。 COM2は数年間COM1の系列会社でした。 COM1とCOM2にはそれぞれCICS1とCICS2があります。また、COM2クライアントプログラムはCOM1プロデューサプログラムを使用します。 COM2クライアントは、COM1プロデューサを直接呼び出すことはありません。 COM2クライアントはデータをCOMMAREA-STRUCTに入れ、Generic Cobol Program(GCPにする)をリモートで呼び出します。 COMMAREA-STRUCTには、GCPがどのプログラムを呼びたいのかを把握する「プロデューサプログラム名」フィールドもあります。したがって、GCPはCOMMAREA-STRUCTからデータをエクスポートし、プロデューサのフィールドにマップします。 GCPはアドレッシングを使用してマッピング操作を動的に実行します(プロデューサごとに特別なわけではありません)。プロデューサが実行すると、GCPは結果を受け取り、COMMAREA-STRUCTを介してクライアントに戻ります。 このシステムは数年前と同じように設計されました。 COM2のクライアントは何千人、COM1の何千ものプロデューサーがいます。今

enter image description here

、COM2は別にCOM1からしたいと考えています。したがって、COM1は、すべてのCOM1リソース(プロデューサ)への完全なアクセス権をこれ以上与えたくありません。したがって、COM1はCICS1の前に新しいcicsを置くことを望んでいます。これは、B1 Bridgeプログラムだけをローカルで実行するハンドラーCICSになります。これは、ネットワークのセキュリティと企業の政治的決定についても同様です。

enter image description here 少しずつ企業を分離するために、クライアントもプロデューサーも影響を受けるべきではありません。したがって、問題はGCP-Bridgeレイヤーで解決する必要があります。

これは、B1 BridgeがCOM2クライアントのGCPのように動作し、アクセシビリティをチェックして(何らかの方法で適用して)、クライアントからのすべてのデータを変更せずにGCPに渡す必要があるからです。

現在のところ、ログ操作には優先順位はありません。私たちは少しずつ企業の一部に集中します。

あなたの熟練したコメントに感謝します。

* B1は別のCICS上にあり、COM1のLOADLIB1にアクセスできないため、B1はEXEC CICS LINKによってGCPをリモートで呼び出す必要があるため、CALLを使用することはできません。

* commareaを渡すのではなく、チャンネルを渡すのは良い音です。それについて議論するつもりです。

*ところで、私はLENGHT OFでフルワード - ハーフワード競合をチェックします。あなたが正しいです。

*セキュリティチェックについては、「EXEC CICS照会セキュリティ」について説明します。

*上記のとおり、コピーブックは変更できません。唯一の我々は変更することができますが置き換え&見つけることで、クライアント上の

EXEC CICS LINK PROGRAM (B1) 

に、

EXEC CICS LINK PROGRAM (GCP) 

です。何千人ものクライアントがいるからです。コピーブックを変更して触れることは望ましくありません。

これらの詳細を照らして、私は問題がより理解しやすくなると思います。

+0

したがって、コンパイルの出力リストを見てください。 PROCEDURE DIVISIONヘッダーを見てください。 USINGを参照してください。 @cschneidが詳述しているように、あなたの01はアドレス可能性を持っていません。クライアントプログラムはどのように "ログオン"し、アクセス制御とログ記録を与えるのはなぜですか? –

+0

ログとセキュリティは面白いことがあります。セキュリティのために 'EXEC CICS QUERY SECURITY'をお勧めします(あなたのセキュリティ関係者に確認してください)。ロギング - どこに? VSAM? DB2?何をロギングしていますか? – cschneid

+0

あなたの熟練したコメントをお寄せいただきありがとうございます。私は、問題の詳細と私の回答からなる質問を編集しました。 – Tunceren

答えて

7

EXEC CICS LINKを介して呼び出されるCICS COBOLプログラムでは、リンケージ・セクションにはDFHCOMMAREAという01レベル構造が含まれている必要があります。プリコンパイラまたはCOBOLコンパイラのCICSコプロセッサは、プログラムがDFHCOMMAREA構造体へのアドレス可能性を持つように、プロシージャ・ディビジョンに対して適切なUSINGを生成します。

DFHCOMMAREAには、対象プログラムにLINKを指定したときに、COMMAREA-STRUCTと表示されている内容が含まれます。

あなた自身を見つける状況に対処する1つの方法は、01レベルの構造名を削除するようにコピーブックを修正し、COPYステートメントの直前にすべてのクライアントに01レベルの構造名をコードすることです。ブリッジとプロデューサープログラムでは、この01レベルの構造名はDFHCOMMAREAとなります。

この状況に対処する別の方法は、を避けて、動的なCALLを避けることです。 CALLの最初のパラメータとしてDFHEIBLKを含める必要があります。

この状況に対処するさらに別の方法は、1つ以上のCICSコンテナのためにcommareaを避けることです。連絡先にLINKのcommareaを渡すのではなく、チャンネルを渡すことになります。チャンネルには、渡したいデータを含む1つ以上のコンテナがあります。

コミュニケーションの長さにはLENGTH OF特別登録を使用していますので注意してください。特殊レジスタはフルワードですが、commarea lengthパラメータはハーフワードです。 IBMが特定のイディオムを傍受し、特別登録簿を一時的なハーフワード(可能性は低いものの可能性あり)に移動するコードを生成しない限り、あなたが悲しみを引き起こすと思われます。

更新:あなたの付加情報から

あなたのタスクは、既存のプログラム(GCP)のための「ドロップイン置換」を書くことで明らかです。

実用的なアプローチは、新しいコピーブックを作成することです。これはCOMAREA1のコピーであり、01レベルの構造名が埋め込まれていないコピーです。 B1プログラムのDFHCOMMAREA 01構造体名の直後にCOPY COMAREA2文を置きます。

これは理想的ではありません。これは、COMAREA1のコピーブックへの変更をCOMAREA2に反映させる必要があるためです。このような手作業によるプロセスでは、エラーの可能性がありますが、C1またはP1プログラムのいずれかを修正する必要はありません。

よりエレガントには、あなたのB1のプログラムで... ...それは試してみるだろう、あなたのために働く

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

を提供します。これは、上で提案されたCOMAREA2のコピーブックの必要性を取り除くでしょう。これが機能すれば、DFHCOMMAREA 01構造レベル名の後ろにCOPY文を置くだけです。

+2

プリ/コプロセッサは "長さ"を正しく扱います。また、LENGTHが指定されていない場合、デフォルトの長さは... COMMAREAフィールドの長さになります。 LENGTHで指定された項目は直接使用されませんが、半単語まで適切にマッサージされます。 –

+0

@BillWoodger私はこれに困難を抱いているという暗い思い出を持っているので、私はそれを言いました。どうやら、それはずっと前のことだったか、私の想起は本当に暗いです。 – cschneid

+0

データ項目を使用して長さを格納するときに、COMP(またはCOMP-4またはBINARY)にして、それを設定するときに切り捨てられた理由を疑問に思うのですが(COMP-5にする必要があります)問題はフィールドを設定することであり、フィールドを渡すことではありません。 –

関連する問題