Ftpの章の「23.iSeries400 から PCサーバーへファイルを転送するには?」で紹介した
SNDFTPF
コマンドである。iSeries400のライブラリー・システムのファイルをPCサーバーに
転送したいという要求は多い。サーバー側からFTPの転送を開始するのも妙に話に聞こえるが
これは定例業務の中に組み込みたいというユーザーの希望があるからであろう。
OS/400には STRTCPFTP
というコマンドが用意されていて、FTPコマンドを別のファイルに
登録しておけば、バッチで操作員の介入無しでPCサーバーへファイルを転送することができる。
しかし、FTPコマンドを登録するファイルを用意したり、CCSID=5035環境でしか使えないために
大半のユーザーが使用している日本語環境(CCSID=5026)では直ちには動作しない。そこで
気軽にいつでもいつもの日本語環境で使用可能は「SNDFTPF
」というコマンドを用意したので
ここに紹介する。
下記は SNDFTPF
コマンドを実際に使用している様子である。
0001.00 CMD PROMPT('FTP によるファイル送信 ') 0002.00 PARM KWD(FILE) TYPE(FILE) PROMPT(' ファイル ') 0003.00 FILE: QUAL TYPE(*NAME) LEN(10) MIN(1) 0004.00 QUAL TYPE(*NAME) LEN(10) DFT(*LIBL) + 0005.00 SPCVAL((*LIBL) (*CURLIB)) + 0006.00 PROMPT(' ライブラリー ') 0007.00 PARM KWD(MBR) TYPE(*NAME) LEN(10) DFT(*FIRST) + 0008.00 SPCVAL((*FIRST)) PROMPT(' メンバー ') 0009.00 PARM KWD(TOADDRESS) TYPE(*CHAR) LEN(15) + 0010.00 DFT('192.168.1.1') + 0011.00 PROMPT(' 相手先 IP アドレス ') 0012.00 PARM KWD(TOFILE) TYPE(*CHAR) LEN(128) + 0013.00 CASE(*MIXED) PROMPT(' 相手先ファイル・パス ') 0014.00 PARM KWD(USER) TYPE(*CHAR) LEN(13) DFT(*NONE) + 0015.00 SPCVAL((*NONE)) CASE(*MIXED) + 0016.00 PROMPT(' 遠隔ユーザー ID') 0017.00 PARM KWD(PASSWORD) TYPE(*CHAR) LEN(13) DFT(*NONE) + 0018.00 SPCVAL((*NONE)) CASE(*MIXED) + 0019.00 PROMPT(' 遠隔パスワード ') 0020.00 PARM KWD(CMD) TYPE(*CHAR) LEN(3) RSTD(*YES) + 0021.00 DFT(PUT) VALUES(GET PUT) + 0022.00 PROMPT(' 送信または受信 ') 0023.00 PARM KWD(LOG) TYPE(*CHAR) LEN(4) RSTD(*YES) + 0024.00 DFT(*NO) VALUES(*YES *NO) PROMPT('LOG 表示 ')
CRTCMD CMD(MYLIB/SNDFTPF) PGM(MYLIB/SNDFTPFCL) SRCFILE(MYSRCLIB/QCMDSRC) AUT(*ALL)
でコンパイルする。
0001.00 PGM PARM(&FILFILLIB &MBR &TOIPADRESS &TOPASS + 0002.00 &USER &PASSWORD &OPT &LOG) 0003.00 /*---------------------------------------------------------*/ 0004.00 /* SNDFTPF : FTP によるファイル送信 */ 0005.00 /*---------------------------------------------------------*/ 0006.00 DCL VAR(&MSG) TYPE(*CHAR) LEN(80) 0007.00 DCL VAR(&FILFILLIB) TYPE(*CHAR) LEN(20) 0008.00 DCL VAR(&FILE) TYPE(*CHAR) LEN(10) 0009.00 DCL VAR(&FILLIB) TYPE(*CHAR) LEN(10) 0010.00 DCL VAR(&MBR) TYPE(*CHAR) LEN(10) 0011.00 DCL VAR(&TOIPADRESS) TYPE(*CHAR) LEN(15) 0012.00 DCL VAR(&TOPASS) TYPE(*CHAR) LEN(128) 0013.00 DCL VAR(&USER) TYPE(*CHAR) LEN(13) 0014.00 DCL VAR(&PASSWORD) TYPE(*CHAR) LEN(13) 0015.00 DCL VAR(&OPT) TYPE(*CHAR) LEN(3) 0016.00 DCL VAR(&LOG) TYPE(*CHAR) LEN(4) 0017.00 MONMSG MSGID(CPF0000) EXEC(GOTO CMDLBL(ERROR)) 0018.00 0019.00 CHGVAR VAR(&FILE) VALUE(%SST(&FILFILLIB 01 10)) 0020.00 CHGVAR VAR(&FILLIB) VALUE(%SST(&FILFILLIB 11 10)) 0021.00 IF COND(&MBR *EQ '*FIRST ') THEN(DO) 0022.00 RTVMBRD FILE(&FILLIB/&FILE) MBR(*FIRST) RTNMBR(&MBR) 0023.00 ENDDO 0024.00 CRTSRCPF FILE(QTEMP/QFTPSRC) RCDLEN(228) IGCDTA(*YES) + 0025.00 AUT(*ALL) 0026.00 MONMSG CPF7300 0027.00 ADDPFM FILE(QTEMP/QFTPSRC) MBR(FTPCMD) 0028.00 MONMSG MSGID(CPF7300 CPF5800) 0029.00 ADDPFM FILE(QTEMP/QFTPSRC) MBR(FTPLOG) 0030.00 MONMSG MSGID(CPF7300 CPF5800) 0031.00 CLRPFM FILE(QTEMP/QFTPSRC) MBR(FTPCMD) 0032.00 CLRPFM FILE(QTEMP/QFTPSRC) MBR(FTPLOG) 0033.00 OVRDBF FILE(QFTPSRC) TOFILE(QTEMP/QFTPSRC) + 0034.00 MBR(FTPCMD) OVRSCOPE(*JOB) 0035.00 CALL PGM(QUATTRO/SNDFTPF) PARM(&USER &PASSWORD + 0036.00 &FILE &FILLIB &MBR &TOPASS &OPT) 0037.00 DLTOVR FILE(QFTPSRC) LVL(*JOB) 0038.00 /*[ SNDTCPFTP を実行 ]*/ 0039.00 CHGJOB CCSID(5035) 0040.00 OVRDBF FILE(INPUT) TOFILE(QTEMP/QFTPSRC) + 0041.00 MBR(FTPCMD) OVRSCOPE(*JOB) 0042.00 OVRDBF FILE(OUTPUT) TOFILE(QTEMP/QFTPSRC) + 0043.00 MBR(FTPLOG) OVRSCOPE(*JOB) 0044.00 STRTCPFTP RMTSYS(*INTNETADR) INTNETADR(&TOIPADRESS) 0045.00 DLTOVR FILE(INPUT OUTPUT) LVL(*JOB) 0046.00 IF COND(&LOG *EQ '*YES') THEN(DO) 0047.00 RUNQRY QRY(*NONE) QRYFILE((QTEMP/QFTPSRC FTPLOG)) + 0048.00 OUTTYPE(*DISPLAY) 0049.00 ENDDO 0050.00 CHGJOB CCSID(5026) 0051.00 CHGJOB CCSID(65535) 0052.00 0053.00 ERROR: RCVMSG RMV(*NO) MSG(&MSG) 0054.00 SNDMSG: SNDPGMMSG MSG(&MSG) TOMSGQ(*SYSOPR) 0055.00 ENDPGM
ソース中に現れる「QUATTRO」はオブジェクト・ライブラリーの名前であるので適切な
保管ライブラリーの名前に変更して頂きたい。FTPコマンドを保管するファイル
QTEMP/QFTPSRC.FTPCMD
はレコード長=228バイトで作成されている。これは
SEU
でオープン可能な最大長である。
実行したFTPコマンドは STRSEU QTEMP/QFTPSRC FTPCMD
によって確認する
ことができる。またFTP実行のログは QTEMP/QFTPSRC.FTPLOG
に保管されて
ログ表示=*YES の場合は QUERY/400
によって実行ログが表示される。 CLP の
中でも CCSID を 5035 に一時変更しているのはログ表示の文字化けを防ぐためである。
CRTCLPGM PGM(MYLIB/SNDFTPFCL) SRCFILE(MYSRCLIB/QCLSRC) AUT(*ALL)
でコンパイルする。
0001.00 H Y/ 0002.00 F********** FTP によるファイル送信 ******************************* 0003.00 FQFTPSRC O F 240 DISK 0004.00 F***************************************************************** 0005.00 E CAR 26 26 1 0006.00 E CBR 26 26 1 0007.00 E SRC 228 1 0008.00 ISRCDTA DS 0009.00 I 1 228 SRC 0010.00 I 'LTYPE C 932' C LTYPE 0011.00 +C*----------------------------------------------------+ 0012.00 C* 受取りパラメーター | 0013.00 C*----------------------------------------------------+ 0014.00 C *ENTRY PLIST | 0015.00 C PARM USER 13 | 0016.00 C PARM PASS 13 | 0017.00 C PARM FILE 10 | 0018.00 C PARM FILLIB 10 | 0019.00 C PARM MBR 10 | 0020.00 C PARM TOPASS128 | 0021.00 C PARM OPT 3 | 0022.00 C*----------------------------------------------------+ 0023.00 C*( USER & PASSWORD を CCSID=5035 モードに変更して送信 ) 0024.00 C MOVE *BLANKS SRCDTA 0025.00 C USER CAT PASS:1 SRCDTA 0026.00 C EXSR CONVRT 0027.00 C EXSR OUTPUT 0028.00 C MOVELLTYPE SRCDTA 0029.00 C EXSR OUTPUT 0030.00 C*( TOPASS : DIR 名も CCSID=5035 モードに変更 ) 0031.00 C MOVELTOPASS SRCDTA 0032.00 C EXSR CONVRT 0033.00 C MOVELSRCDTA TOPASS 0034.00 C MOVE *BLANKS SRCDTA 0035.00 C*( 転送記述 ) 0036.00 C OPT IFEQ 'PUT' 0037.00 C OPT CAT FILLIB:1 SRCDTA 0038.00 C SRCDTA CAT '/':0 SRCDTA 0039.00 C SRCDTA CAT FILE:0 SRCDTA 0040.00 C SRCDTA CAT '.':0 SRCDTA 0041.00 C SRCDTA CAT MBR:0 SRCDTA 0042.00 C SRCDTA CAT TOPASS:1 SRCDTA 0043.00 C ELSE 0044.00 C OPT CAT TOPASS:1 SRCDTA 0045.00 C SRCDTA CAT FILLIB:1 SRCDTA 0046.00 C SRCDTA CAT '/':0 SRCDTA 0047.00 C SRCDTA CAT FILE:0 SRCDTA 0048.00 C SRCDTA CAT '.':0 SRCDTA 0049.00 C SRCDTA CAT MBR:0 SRCDTA 0050.00 C END 0051.00 C EXSR OUTPUT 0052.00 C* 0053.00 C MOVEL'CLOSE' SRCDTA 0054.00 C EXSR OUTPUT 0055.00 C MOVEL'QUIT' SRCDTA 0056.00 C EXSR OUTPUT 0057.00 C SETON LR 0058.00 C****************************************************** 0059.00 C CONVRT BEGSR 0060.00 C****************************************************** 0061.00 CSR 1 DO 228 N 40 0062.00 CSR MOVE SRC,N FLD1 1 0063.00 CSR Z-ADD1 M 40 0064.00 CSR FLD1 LOKUPCAR,M 50 0065.00 CSR 50 MOVE CBR,M FLD1 0066.00 CSR 50 MOVE FLD1 SRC,N 0067.00 CSR END 0068.00 CSR ENDSR 0069.00 C****************************************************** 0070.00 C OUTPUT BEGSR 0071.00 C****************************************************** 0072.00 CSR ADD 1 SRCNO 62 0073.00 CSR MOVE UDATE SRCDAT 6 0074.00 C*----------------------------------------------------+ 0075.00 C EXCPT@ADD | 0076.00 C*----------------------------------------------------+ 0077.00 CSR MOVE *BLANKS SRCDTA 0078.00 CSR ENDSR 0079.00 OQFTPSRC E @ADD 0080.00 O SRCNO 6 0081.00 O SRCDAT 12 0082.00 O SRCDTA 240 0083.00 ** CAR 0084.00 abcdefghijklmnopqrstuvyxyz 0085.00 ** CBR 0086.00 イウエオカキクケサシスセソタチツトハミヤユヨラリルレ
サブ・ルーチン CONVRT
によって英小文字をCCSID=5035 モードに変更する。
CCSID=5035環境で実行する場合は EXSR CONVRT
を除去する。
CRTRPGPGM PGM(MYLIB/SNDFTPF) SRCFILE(MYSRCLIB/QRPGSRC)
AUT(*ALL)
によってコンパイルする。