#if defined(W32) || defined (LNX)
.Turnkey MVS サポート
Hercules+MVS-R38J のファイルを Downloadしlocalで編集,Upload します。
"Turnkey MVS"はPC上で動くMVSR38Jです。HerculesがS370命令をエミュレートします。
(0) 前提
#ifdef LNX
s3270を経由します。s3270の導入が必要です。
x3270を使用する場合はその導入と、xe3270.cfgでの設定が必要です。
#else
s3270.exeを経由します。s3270とcygwinの導入が必要です。
x3270を使用する場合はその導入と、xe3270.cfgでの設定が必要で
xe3270を開始する前にXサーバーを開始しておかないとコネクションが
失敗します("Pipe Closed"ないしは"TimeOut"になります)
#endif
x3270を使用するとその時点の3270画面が見れますが、Focusを取られるようなら
Minimaizeしたほうが良いでしょう。
Turnkey MVS に IND$FILE の導入が必要です。
(注意)IND$FILEバージョンに注意。
Hostファイル名を間違った時 ind$file106は "TARNS00file not opened"を
返しますが、ind$file111は応答を返さず待ちになります。
xeの対応としては事前にLISTDSコマンドで存在を確認します。
herculesがリモートにある場合はFireWallの例外設定が必要になる場合があります。
最初はs3270単体で次のように接続テストをしたほうがよいでしょう。
.MVSがあがったらs3270をオペランド無しでスタート。
.'connect hostname:3270' と入力。 hostnameのところは "localhost" など。
表示されるステータス行のインディケータが"C"(4番目の文字)に変わりましたか。
画面内容は'ascii'コマンドで確認できます。
'ascii'と入力してログイン画面が確認できますか。
.'String 'logon herc02/cul8tr\n'と入力してログオンする
.'Transfer Direction=get HostFile=xxxx(yyy) LocalFile=zzz Exist=replace'で
FTPしてみる。
(1) xe の設定。
."::xehosts"(ワークディレクトリー内のxehosts) に 接続先を定義する
例) herc01 Heaven HERC01 "" TSO=3270
h02 192.168.2.33 HERC02 password TSO=3270 HOME='herc01.test.src'
"TSO=" が3270接続識別になります。オペランドにherculesのポート番号を指定してください
"TSO=" がないと通常の tcpip:ftp を使用したリモートファイルアクセスとなります。
TSOの場合ホストID(1つ目の項目)は大文字小文字区別無しです。
パスワードはファイルを保存すると暗号化されます。
HOMEを設定するとファイル名指定でDSNを省略してメンバー名のみを指定すればよくなります。
例えば "e h01:" でPDS メンバーリストを表示し、"e h01:abc"でメンバーABCを開きます。
HOMEは省略値の現行PDSの意味ですが CD コマンドでこれを一時的に変更できます。
HOME指定を有効に戻すには "CD h02:''"のように指定してください。
よく使用するPDSをいくつか別のホストIDで登録しておくのも良いでしょう。
.xe3270.cfgの設定。
このファイルはなくても良いですがSPF情報取得/更新をするためには必要です。
ファイルの場所は /w コマンドラインオプションでDirを指定しますが、
xe から自動起動される場合はワークディレクトリになります。
SPF情報を表示/更新するにはSPF_LEVELとCMD_MEMBLISTの両方を指定します。
例。(先頭 "#"はコメントです)
#####################################################################
# xe3270.cfg
# CMD3270 :cmd to call 3270
# default is s3270
# To use x3270(-script option is required for xe)
# Windows example
# CMD3270 = "bash c:\x3270script"
# c:\x3270script contents is as following
# DISPLAY=:0.0 x3270 -script
# Linux example
# CMD3270 = "x3270 -script"
# RETRY_UPLOAD :read-check retry count when read check after put failed.
# Max:4 Min:0 Default:2
# RETRY_DOWNLOAD :read retry count when dual read unmatch
# Max:4 Min:0 Default:2
# SPF_LEVEL :process level of SPF information
# 0:CMD_MEMBLIST is not used.
# 1:SPF info is displayed on dir-list using XE4S001Z
# 2:SPF info is maintenanced using XE4S001Z
# default is 0 without CMD_MEMBLIST or 2 with CMD_MEMLIST specified
# CMD_MEMBLIST :TSO command to get PDS memberlist
# Default is TSO native "LISTDS" command
# Specify you LibraryDataSet name if you use XE4S001Z prepared by xe package.
# PS_UPLOAD :Allow DSNAME as upload target
# 1:allow 0:prohibit(default)
# "1" may accidentaly cause corruption of PDS directory.
# TIMEOUT_CONNECT:timeout to get 3270 connection by seconds
# commandline parm -C override this cfg parm
# -1:infinite, default=10
# TIMEOUT_FTP :timeout to file Send/Receive
# commandline parm -T override this cfg parm
# -1:infinite(default)
# TIMEOUT_TSOCMD :timeout to file Send/Receive
# -1:infinite, default=30
# sample
# RETRY_UPLOAD = 1
# CMD_MEMBLIST = "call 'herc01.load.asm(xe4s001z)'"
#####################################################################
#CMD3270 = s3270
#CMD3270 = "x3270 -script"
#CMD3270 = "bash g:\src\xe\x1x3270s"
RETRY_UPLOAD = 2
RETRY_DOWNLOAD = 2
SPF_LEVEL = 2
CMD_MEMBLIST = "call 'sak01.load.asm(xe4s001z)'"
PS_UPLOAD = 1
#TIMEOUT_CONNECT = 20
#TIMEOUT_FTP = 600
#TIMEOUT_TSOCMD = 60
#####################################################################
.XE4S001Zの導入。
xe3270.cfgでCMD_MEMBLISTを使用する場合は添付のXE4S001Zを
ASSEMBLEして適当なLoadModuleLibralyに置きconfigを設定してください。
PDSのメンバーリストにSPF情報(最終更新日時、ファイルサイズ、行数、
ユーザー名)が表示されメンテナンスされるようになります。
ASSEMLE の参照 MACLIB はつぎのとうりです。
// EXEC PGM=IGOX00,PARM='...,SYSPARM=NOSNAP',...
//SYSLIB DD DSN=SYS2.MACLIB,DISP=SHR
// DD DSN=SYS1.MACLIB,DISP=SHR
// DD DSN=SYS1.AMODGEN,DISP=SHR
(SYSPARM=NOSNAPはデバッグ用のマクロULSNAPをNOP化するための指定です)
添付のawsテープファイルからLoadModuleを導入するには次のようにしてください
- テープユニットをオンラインにする。
MVS コンソールから "V 480,ONLINE" と入力
- XE4S001Z.jclをサブミットする。
Turnkey-MVSのsubツールを使用するか、3270FTPで転送してTSOサブミットする。
jclは//DD2の導入先DSNを自分の環境にあわせて変更してください。
(LoadModuleはBLKSIZE=19069で作成してあります)
- マウント要求がでるので Hercules のコンソールからawsファイルをマウントする。
"devinit 480 (path)XE4S001Z.aws"
(path)のところにはPCでのXE4S001Z.awsの経路をあたえる。
(2) xe の Edit/Browse コマンドでファイル名の先頭でHost識別を指定します。
例) e h02:'herc01.source.asm(memb1)'
e herc01:source.asm(memb1)
最初のアクセス要求の時にxe3270.exeをスタートさせ名前付パイプでやり取りします。
パイプの窓口はマルチで対3270はマルチスレッドですがこれはTimeout用で
基本的にはシングルスレッド処理です。
ユーザーID毎に3270エミュレータプロセスを立ち上げるので複数xeからの
同じユーザーIDの使用が出来、一つのxeから複数のユーザーIDの使用も出来ます。
xeを終了してもxe3270.exeは残り、xeからの次のリクエストを待ちます。
xe3270.exeはDOS窓を持ち、状況が確認できます。
画面出力はオプション(xeの /F オプション)で::xe3270.logにロギングします。
xe の "TSO" コマンドでいくつかのコマンドをサポートし、障害対応に使用します。
コマンド出力画面(=6画面)を開いて TSO logonするとlistalcなどのTSOコマンドを
そのまま入力できます。TSO logoffでローカルコマンドモードに戻ります。
TSOモードのときにローカルコマンドを実行したい場合はローカルコマンドの前に
":"を付けてください。例えば ":grep ABC *.c"。
コマンドはxe3270プロセスのシェル窓からも入力できます。
xeが応答待ちでHungした時などに使用します。
(3) 障害対応
.Herculesがあがってない,MVSがあがってない
#ifdef LNX
"port 3270:Connection refused."(Heculesがあがっていない場合)
"Connection rejected,no available 3270 device"(Heculesがあがっている場合)
#else
応答無し-->TimeOut(10秒)
#endif
.3270デバイスがつながってない。
応答無し-->TimeOut(10秒)
---> MVSコンソールから INACT/ACTする。
V NET,INACT,ID=CUU0Cx,I
V NET,ACT,ID=CUU0Cx
この手順は、PF2にコマンド設定されいるとおもいます。
(MVSコンソールから"D PFK"で確認)
.セッション数が定義を超えた(xeはホスト名+USERID単位でs3270を立ち上げます)
"no available 3270 device"
--->開いている 00Cx のTSO画面をどれか閉じてxe3270から使えるようにする。
また、端末数を増やすにはsetupterm を実行する。
starttermも調整してxe用にセッションを空ける。
(SYS1.VTAMLSTには0C0から0C7までの8個が定義されている。)
.TSOがあがってない
"APPLICATION IS INACTIVE"
--->S TSO
.USERID エラー
"INPUT NOT RECOGNIZED"
--->::xehostsを修正してリトライ
.PSWD エラー
"PASSWORD NOT AUTOLIZED FOR USERID"
"REENTER -"
--->"TSO reply hostid valid-password"コマンドを入力
::xehostsのパスワードは修正しておく
あるいは "cancel" を入力してスレッドを落とし
リトライする。
現在の3270画面はxe3270.exeDOS窓から"snap"コマンドで見ることが出来ます。
.重複ログオン
"IKJ56425I LOGON REJECTED, USERID xxxx INUSE"
--->内部的にLOGOFFを発行する。
中断されたユーザーIDの場合したMVS コンソールから "C U=xxxx"と打てば
早く開放できる。
.ファイルが見つからない
IND$FILEのv106は FILE00のエラーを返すが、v111では無限Waitします。
xeはLISTDSコマンドで事前に存在確認をしますがWaitした場合
MVSコンソールでS013ABENDなどが起こってないかチェックしてください。
.タイムアウト。
接続時は10秒TimeOutを設定していますが、FTP時はTimeout無しです。
x37のABENDが起こると無限Waitになります。MVSConsoleで確認して
xe3270.exe のDOS窓からCancelしてください。
Timeout しても s3270から応答が帰るまではスレッドはふさがっているので
"now busy"のエラーになります。
障害で保存できない時は Save コマンドで一旦ローカルに保存し
CANcel で編集を終え、回復したら保存先を開いて元のファイルに戻してください。
(4) その他。
.TSOファイルを開く時省略値はCAPS ONで開きます。
そうしたくない場合はCAPコマンドで省略値を変更するか
Edit/Browseコマンドで[CAP|NOCAP]オプションを指定してください。
CAPオプションが有効な時英小文字入力ははShiftキーを使用します。
.RECFM=Fx,LRECL=80のTSO ファイルでは E/B コマンドはデフォルトでEN/BNの
扱いになります。(COBOLファイルの場合 col73-80:行番号を自動メンテするには
依然としてECNのようにNの指定が必要です)
別名コマンド機能を使うと/p1(col73-80を保護)などのオプションパラメータを
毎回指定するわずらわしさを避けることができます。
バイナリーオープン(EB,EHコマンド)するとEBCDICのままDownload/Upload
されます。(Copy/Move/App コマンドでは /B オプションで無変換転送になります)
.ファイル名の他ファイル参照形式は次の形式も使用できます。
*\ --> *. **\ --> **. ^*\ --> ^*.
例えば h01:'a.b.c(m1)' を開いている画面で "e *(m2)"と入力すると
h01:'a.b.c(m2)'を開きます。 **.d(m3) で h01:'a.b.d(m3)'。
分割画面では "^*"で他方の画面のファイル名を参照します。
例えば h01:'a.b.c(m1)' を開いているとき分割画面のもう一方から
"e ^*(m2)"で h01:'a.b.c(m2)'を開きます。 ^*.**(m4)で h01:'a.b(m4)'。
.JCLをSUBMITするにはTurnkey-MVSで提供されているsub.batを使用します。
xe の SUBコマンドでこのsub.batを呼び出します。
PATHを通して置いてください。
Turnkey-MVSのファイルを開いている画面では単に"SUB"とすればSubmitされます。
Localのファイルを開いている画面では "SUB sub *"と入力します。
これが面倒な場合、別名コマンド機能を使用すれば入力を簡略化できます。
=0.1の画面で 例えば"Alis:JCL SUB sub.bat *"としておけば
Localのファイルを開いている画面で JCL とだけ入力すればよい。
さらにはSUBをTSOサブミットとしたければiniファイルのサブミットコマンドの
コマンドIDをSUB以外に換えてAliasでSUBを定義すれば可能です。
ディレクトリーリストからSUBする場合は "#" 行コマンドを使用します。
改名欄のオペランドは指定しても無視されます。
"%" 行コマンドを使用する場合は改名欄に sub(Turnkey-MVSの提供するツール名)を
入力します。
.SPF情報について。
xe3270.cfgでXE4S001Z使用を指定した場合、RECFM=Fx,LRECL=80のPDSのメンバーについては
ディレクトリーのSPF情報(バージョン、更新日、行数など)をもしあれば
それをディレクトリーリスト画面で表示します。
F6キーで行数とファイルサイズ表示を切り替えられますが、TSOファイルの初期値は行数表示です。
USERIDを表示するにはShift+F6を使用します。
PDSのディレクトリーのユーザーデータはIND$FILEでUploadすると失われますがxeで更新情報を
復元します。
MM(更新番号)の更新は以下のようになります。
カラム73-80が全て数字の場合カラム79-80が更新番号として使用されます
読み込み時に全行の最大番号がそのメンバーのMMとなり編集終了時に
そのセッションでの更新行に+1が設定されます。
Save/Replaceコマンドで既存メンバーを置換する時もその値が設定されます。
PCファイルなど元ファイルがSPF情報がないファイルをTSOファイルに
Save/Replaceする場合とAppendコマンドの場合は宛先のMM+1を設定します。
XCOpyコマンドでは複写元の値が複写され、XAPpendコマンドでは+1になります
バージョン番号の変更はディレクトリーリストの"a"行コマンドでも可能です。
xeのTSOコマンド-SPFサブコマンドでPDS全体(ワイルドカード指定も可能)の
SPF情報を一括して設定することも出来ます。
例えば、SPF情報のないPDSの全メンバーに現在行数をカウントしてSPF情報を設定したい場合など。
(RPFでSPF情報が表示されるには作成日、更新日、ユーザー名が必要なようです)
XE4S001Zをバッチで実行する場合、パラメータの指定はXE4S001Zのソースのヘッダー部を参照してください
"NOW"を作成日、更新日時、初期行数、現在行数で指定できます。
今日の日付,時間,メンバー現在行数が設定されます。
ユーザーID以外では先頭が数字でなければ無指定とみなします。
*(2)* UPDATE SPF INFORMATION ON PDS DIRECTORY ********************* 00330030
* PARM FORMAT 00340030
* '1,DSN(MEMB),VV,MM,CDATE,UDATE,UTIME,CURLINE,INITLINE,USER' 00350035
* 00360034
* (START BY NOT NUMERIC MEANS MISSING OPERAND EXCEPT FOR USERID) 00370034
* (!!! RPF(V153) NEED CRE-DATE/UP-DATE/USERID TO DISPLY ON DIRLIST) 00380039
* 00390034
* 1:FUNCTION ID:UPDATE SPF INFO 00400030
* MEMB:REQUIRE. WILDCARD('*' or '?') IS AVAILABLE. 00410030
* VV:VERSION 00410030
* IF MISSING,KEEP CURRENT VALUE OR SET 0 IF NO PREVIOUS INFO 00420034
* +N FORMAT IS USED TO INCREMENT 00430030
* MM:MODIFICATION LEVEL 00440030
* IF MISSING,KEEP CURRENT VALUE OR SET 0 IF NO PREVIOUS INFO 00450034
* +N FORMAT IS USED TO INCREMENT 00460030
* 'NOW' IS USED TO SET TO MAX VALUE OF COLUMN 79-80 00470038
* CDATE:CREATED DATE 00480030
* IF MISSING,KEEP CURRENT VALUE OR SET 0 IF NO PREVIOUS INFO 00490039
* 'NOW' IS USED TO SET TO TODAY 00500034
* '000000' IS USED TO SET TO 0 00510039
* UDATE:LAST UPDATED DATE 00520030
* IF MISSING,KEEP CURRENT VALUE OR SET 0 IF NO PREVIOUS INFO 00530039
* 'NOW' IS USED TO SET TO TODAY 00540030
* '000000' IS USED TO SET TO 0 00550039
* UTIME:LAST UPDATED TIME 00560030
* IF MISSING,KEEP CURRENT VALUE OR SET 0 IF NO PREVIOUS INFO 00570039
* 'NOW' IS USED TO SET TO CURRENT TIME 00580031
* CURLINE:CURRENT LINE COUNT 00590031
* IF MISSING,KEEP CURRENT VALUE OR SET 0 IF NO PREVIOUS INFO 00600033
* 'NOW' IS USED TO SET CURRENT LINE COUNT BY READING MEMBER 00610034
* INITLINE:INITIAL LINE COUNT 00620035
* IF MISSING,KEEP CURRENT VALUE OR SET 0 IF NO PREVIOUS INFO. 00630035
* 'NOW' IS USED TO SET CURRENT LINE COUNT BY READING MEMBER 00640035
* USER :LAST UPDATED USER 00650031
* IF MISSING,KEEP CURRENT VALUE OR SET BLANK IF NO PREVIOUS INFO 00660031
*SAMPLE JCL TO EXECUTE BATCH * 00670031
*//GO EXEC PGM=XE4S001Z,PARM=('1','HERC01.SOURCE.ASM(MEMB),', 00680033
*// '01,21,061105,061125,2210,99,101,HERC01') 00690031
*//GO EXEC PGM=XE4S001Z,PARM=('1','HERC01.SOURCE.ASM(MEMB),', 00700033
*// 'VV,+1,CDT,NOW,NOW,CLC,NOW,HERC01') 00710035
*//GO EXEC PGM=XE4S001Z,PARM='1,HERC01.SOURCE.ASM(MEMB),DEL' 00720035
*//STEPLIB DD DISP=SHR,DSN=HERC01.LOAD.ASM 00730031
(5) 使用上の制限
!! .SPF情報の更新はPDSディレクトリを排他使用する必要があるためDISP=OLDのアロケーションで
失敗することがあります。(RESERVEは使用していません)
RPFを閉じて再度保存を実行してください。
.UploadはデフォルトではPDSのメンバーに限ります。
順次編成ファイルを更新して戻すには xe3270.cfgでの設定が必要です。
.RECFM=F(B)へUploadすると長文は分割されるようです。
バイナリーモードでDown/Upすると固定長の整数倍にNullが補填される様です。
!! .原因は不明ですがUp/Downとも転送で1画面量(24*76=1844?)程度の重複出力が
発生することがあります。
xe3270ではGet時Downloadを2回行い2回の内容が同じ時にGet成功としています。
2回の内容が異なる時リトライします。リトライ回数はxe3270.cfgで指定します。
(タイムアウトの場合はリトライしません)
リトライ回数を超えて失敗した場合一時Dir(Windowsでは TEMP環境変数のDir,Linuxでは/tmp)に
検証用のファイル残されています。
ネーミングはxe32270pc.xxxxxxxx.GETn.yy。xxxxxxxxはメンバー名。
エラーが発生したら通常は再度Getをすればよいでしょう。
PDS全体ののコピーが中断した場合などには"/y-"(同じ名前がある場合は飛ばして処理続行)
オプションを指定すると良いでしょう。
Put時は再Downloadし送信元と同じか確認します。
バイナリーモードのPutではRECFM=Fを維持するためNullが補填され
長さが変わることがあります。Nullが追加されただけの場合はxe3270の窓に
出力されます(Logオプションを指定していればLogにも残ります)が
xe上は正常保存とみなされます。
READ-CHKが失敗したらPut/Getをリトライします。リトライ回数はxe3270.cfgで指定します。
リトライ回数を超えて失敗した場合一時Dirに検証用のファイル残されています。
ファイルのネーミングはxe32270pc.xxxxxxxx.PUTGETn.yyです。xxxxxxxxはメンバー名。
編集の保存によるPutでこれが発生した場合は更新を破棄しても編集後の内容が
ワークDir\xeftpwdに残されています。ファイルのネーミングは xxxxxxxx.timestampです。
エラーが発生したら通常は再度保存すればよいでしょう。
但し、RECFM=Fxで行長がLRECLを超える場合行分割されるのでこのREAD-CHKは
何度リトライしても、転送失敗の結果になります。
(1回目と2回目のDownloadファイル内容が同じ場合はリトライは停止します)
EBCDIC<-->ASCIIの変換が可逆的でない文字が含まれる場合にも発生します。
ファイル比較ツールなどで確認してください。(xeパッケージにも
比較ツールxfcがついています)
!! .保存時に再度DownloadしてUpload時と内容が同じか確認しますが
ファイルのロックはかかっていません(RPF同士ではin use で開けない)。
RPFで開いていてもFTP Uploadは成功するようですしRPFはDownload中
であることを知らないので上書きされる可能性もあります。
必要に応じて xe の TSO コマンド Alloc/Free を利用してください。
保存時に内容がUpload時と異なる場合ワークDir\xeftpwdに
最初にDawnloadした時のと保存時にDownloadしたのと両方のファイルが
残されていますが現在の状態は自分で保存する必要があります。
保存を強行するか他ファイルに保存してください。
保存ファイル名はxxxxxxxx.timestampとxxxxxxxx.timestamp.UPDATECHKです。
#endif