iSeries400のライブラリー・システムのファイルをPCサーバーに転送したいという要求は
良く聞かれる。中にはこのような転送機能をソフトウェア製品として販売している
ソフトウェア・ハウスもあるが、このような汎用的な基礎技術は無償で提供してもよいであろう。
また本来、iSeries400はサーバーなのであるから、サーバー側からFTPの転送を開始するのも
妙な話に聞こえるが、これは定例業務の中に組み込みたいというユーザーの希望があるからで
あろう。
OS/400には STRTCPFTP
というコマンドが用意されていて
OVRDBF FILE(INPUT) TOFILE(QTEMP/QFTPSRC) MBR(FTPCMD) STRTCPFTP ....(略) OVRDBF INPUT
のように実行すると本来は手入力で行うべき USER, PASSWORD, PUT/GET などの
FTPコマンドを QTEMP/QFTPSRC.FTPCMD から読んで実行してくれる機能がある。
そこで ファイル : QTEMP/QFTPSRC.FTPCMD には
Administrator MyPassword LTYPE C 932 PUT MYLIB/MYFILE.MYMBR MYTEXT.txt CLOSE QUIT
を登録しておくと、ライブラリー MYLIB のファイル MYFILE のメンバー MYMBR が
MYTEXT.txt として相手側のPCサーバーへ送信されることになる。
しかし、注意しなければならないのは 「Administrator」のようにPCサーバーでは英小文字も
識別されるため、STRTCPFTP
コマンドの実行はCCSID=5035 (英小文字)の環境で
行わなければならない。
つまり、
CHGJOB CCSID(5035) OVRDBF FILE(INPUT) TOFILE(QTEMP/QFTPSRC) MBR(FTPCMD) STRTCPFTP ....(略) OVRDBF INPUT CHGJOB CCSID(5026) CHGJOB CCSID(65535)
という操作が必要になる。
これらを定例業務に組み込むとなると、結構厄介である。
そこで通常の日本語環境(CCSID=5026) で手軽に使える「SNDFTPF
」という
FTP送/受信のコマンドをご紹介しよう。
ここに紹介するSNDFTPF
コマンドは通常の日本語環境で使用でき、必要であればログも表示
してくれる。参考までにSpoolライター Ver 3.0 で提供されることになった「SNDFTP
」コマンドは
IFSのファイルを別のPCサーバーに転送する機能であるが、Spoolライターの SNDFTP
は
OS/400の STRTCPFTP
をこのように利用しているのでなく完全に独立したFtpクライアントとして
新規開発されたものである。製品としてFtp機能を組み込む場合はユーザーのFtpの設定や環境に
左右されることのないように動作保証の観点から新規開発されたFtpクライアントである。
下記は SNDFTP
の実行中の様子である。
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)
によってコンパイルする。