FTP

23. iSeries400 から PCサーバーへファイルを転送するには?

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 の実行中の様子である。

【 コマンド: 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)

でコンパイルする。

【 CLP : SNDFTPFCL 】
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)

でコンパイルする。

【 RPG : SNDFTPF 】
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)

によってコンパイルする。