Tools

8. SNDFTPF iSeries400 からPCサーバーへのFtpファイル転送

Ftpの章の「23.iSeries400 から PCサーバーへファイルを転送するには?」で紹介した
SNDFTPF コマンドである。iSeries400のライブラリー・システムのファイルをPCサーバーに
転送したいという要求は多い。サーバー側からFTPの転送を開始するのも妙に話に聞こえるが
これは定例業務の中に組み込みたいというユーザーの希望があるからであろう。

OS/400には STRTCPFTP というコマンドが用意されていて、FTPコマンドを別のファイルに
登録しておけば、バッチで操作員の介入無しでPCサーバーへファイルを転送することができる。
しかし、FTPコマンドを登録するファイルを用意したり、CCSID=5035環境でしか使えないために
大半のユーザーが使用している日本語環境(CCSID=5026)では直ちには動作しない。そこで
気軽にいつでもいつもの日本語環境で使用可能は「SNDFTPF」というコマンドを用意したので
ここに紹介する。

下記は 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)

でコンパイルする。

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

でコンパイルする。

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

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