Tools

64. ライブラリーを別のサーバーに BACKUPする SAVUSRLIB

ここで紹介する SAVUSRLIB コマンドはユーザー・ライブラリーだけを
BACKUP して別の PC サーバーに転送するコマンドである。
テープ装置ではなく PC サーバーへの FTP での転送であるので
テープ装置も必要なく媒体の劣化を気にする必要もない。
当然、テープ装置への BACKUP に比べると速度も速くて時間も短くて済む。
SAVUSRLIB は日常的にすぐ約に立つ非常に有益なコマンドであるので
ぜひ活用して頂きたい。

i5/OS を含むフル・バックアップはテープ装置へバックアップするのであるが
これはバックアップ漏れのないように人での監視のもとで行う。
しかし日常、活動しているライブラリーに関しては毎日、深夜に
無人で漏れなく行うことが必要である。
このときテープ装置へのバックアップであると毎日のことなので
繰り返しているとテープ装置の劣化や損傷を招くことがある。
Ftp 転送であれば PC サーバーなどへのハード・ディスクへのコピーなので
繰り返していてもその心配はない。

  • バックアップは ADDJOBSCDE *WEEKLY によって
    毎日、深夜に自動実行される。
  • この SAVUSRLIB コマンドが実際に株式会社オフィスクアトロで
    運用されているものである。
  • ライブラリーは実行ジョブの QTEMP 上の *SAVF に保管したものを
    バックアップする。
  • PC サーバー側では当然、Ftp が起動されていなければならない。
  • Ftp はライブラリー・システムは読むことはできないので
    ライブラリーを IFS の FILE に CPYTOSTMF で *SAVF をコピーしたものを
    転送する。
  • SAVUSRLIB コマンドは *ALL を指定すればすべてのユーザー・ライブラリーを
    保管できるが、個別に保管ライブラリーを指定して保管することもできる。
  • SAVUSRLIB は頭文字が Q, #, @ などから始まるライブラリーは保管からは
    除去される。
    他にも TEST や _ などを名前の文字列に含むライブラリーは保管されない。
    個人用ライブラリーも保管の対象からは外される。
    BACKUP や SAVUSRLIB などの特殊な目的のためのライブラリーも除外される。
    このあたりは法人の事情によって異なるのでソースを自社の事情に合うよう
    適切な形に修正して欲しい。
  • SAVUSRLIB に対応する復元コマンド: RSTUSRLIB も後に紹介を予定している。
  • ライブラリーだけでなくすべてのユーザー IFS をバックアップしてFtp転送する
    SAVUSRIFS と復元用の RSTUSRIFS も後に公開を予定している。
【 コマンド: SAVUSRLIB 】
0001.00              CMD        PROMPT(' ユーザー・ライブラリーの保管 ')           
0002.00              PARM       KWD(SAVLIB) TYPE(*CHAR) LEN(10) DFT(*ALL) +        
0003.00                           SPCVAL((*ALL)) MAX(50) +                         
0004.00                           PROMPT(' ライブラリー ')                         
0005.00              PARM       KWD(OPTION) TYPE(*CHAR) LEN(6) RSTD(*YES) +        
0006.00                           DFT(*NONE) VALUES(*NONE *SEND *PRINT) +          
0007.00                           PROMPT(' 出力オプション ')                       
0008.00  SEND:       PMTCTL     CTL(OPTION) COND((*EQ *SEND))                      
0009.00              PARM       KWD(FRMADDRESS) TYPE(*CHAR) LEN(15) +              
0010.00                           DFT('*DFT') PMTCTL(SEND) +                       
0011.00                           PROMPT(' ホスト IP アドレス ')                   
0012.00              PARM       KWD(TOADDRESS) TYPE(*CHAR) LEN(15) +               
0013.00                           DFT('192.168.1.8') PMTCTL(SEND) +                
0014.00                           PROMPT(' 相手先 IP アドレス ')                   
0015.00              PARM       KWD(TODIR) TYPE(*CHAR) LEN(128) +                  
0016.00                           DFT('/TEST/') CASE(*MIXED) +                     
0017.00                           PMTCTL(SEND) PROMPT(' 相手先ファイル DIR')       
0018.00              PARM       KWD(USER) TYPE(*CHAR) LEN(13) DFT(QUATTRO) +       
0019.00                           SPCVAL((*NONE)) CASE(*MIXED) PMTCTL(SEND) +      
0020.00                           PROMPT(' 遠隔ユーザー ID')                       
0021.00              PARM       KWD(PASSWORD) TYPE(*CHAR) LEN(13) DFT(*NONE) +     
0022.00                           SPCVAL((*NONE)) CASE(*MIXED) +                   
0023.00                           DSPINPUT(*NO) PMTCTL(SEND) +                     
0024.00                           INLPMTLEN(*PWD) PROMPT(' 遠隔パスワード ')
0025.00              PARM       KWD(LOG) TYPE(*CHAR) LEN(4) RSTD(*YES) +    
0026.00                           DFT(*YES) VALUES(*YES *NO) PMTCTL(SEND) + 
0027.00                           PROMPT(' ログ表示 ')                      
0028.00  PRINT:      PMTCTL     CTL(OPTION) COND((*EQ *PRINT))              
【 解説 】

実行の様子は次のようになる。

                    ユーザー・ライブラリーの保管  (SAVUSRLIB)                   
                                                                                
  選択項目を入力して,実行キーを押してください。                                
                                                                                
  ライブラリー  . . . . . . . . .   *ALL           文字値 , *ALL                
                 値の続きは+                                                   
  出力オプション  . . . . . . . . > *SEND         *NONE, *SEND, *PRINT          
  ホスト IP アドレス  . . . . . .   '*DFT'                                      
  相手先 IP アドレス  . . . . . .   '192.168.1.8'                               
  相手先ファイル DIR  . . . . . .   '/TEST/'                                    
                                                                                
                                                                                
  遠隔ユーザー ID . . . . . . . .   QUATTRO                                     
  遠隔パスワード  . . . . . . . .                  文字値 , *NONE               
  ログ表示  . . . . . . . . . . .   *YES          *YES, *NO                     
【 解説 】

ホスト IP アドレス とは自分自身、つまりこの IBM i の IP アドレスであるが
*DFT のままにしておけば自動的に IP アドレスが取得される。
相手先 IP アドレスとはもちろん送信先 PC サーバーの IP アドレスである。
遠隔ユーザー ID と 遠隔パスワードは Ftp で PC サーバーにログインするための
ものであるが遠隔パスワードは入力しても表示はされない。
ログ表示とは Ftp の進行状況を示すためのログを表示するかどうかを指定する。
最初のテストのころはログを表示するようにして実行し、
テストも成功すればバッチ処理はログなしで投入することがよいだろう。

【 CLP: SAVUSRLIBC 】
0001.00              PGM        PARM(&LIBR &OPTION &FROMIP &TOIP &TODIR +              
0002.00                           &USER &PASSWRD &LOG)                                 
0003.00 /*-------------------------------------------------------------------*/        
0004.00 /*   SAVUSRLIBC :  ユーザー・ライブラリーの保管                      */        
0005.00 /*                                                                   */        
0006.00 /*   2018/09/20  作成                                                */        
0007.00 /*-------------------------------------------------------------------*/        
0008.00              DCL        VAR(&LIBR) TYPE(*CHAR) LEN(500)                        
0009.00              DCL        VAR(&OPTION) TYPE(*CHAR) LEN(6)                        
0010.00              DCL        VAR(&FLD2) TYPE(*CHAR) LEN(2)                          
0011.00              DCL        VAR(&SAVSU) TYPE(*DEC) LEN(4 0)                        
0012.00              DCL        VAR(&LIB) TYPE(*CHAR) LEN(10)                          
0013.00              DCL        VAR(&INZLIB) TYPE(*CHAR) LEN(10)                       
0014.00              DCL        VAR(&MSG) TYPE(*CHAR) LEN(132)                         
0015.00              DCL        VAR(&MSGID) TYPE(*CHAR) LEN(7)                         
0016.00              DCL        VAR(&MSGF) TYPE(*CHAR) LEN(10)                         
0017.00              DCL        VAR(&MSGFLIB) TYPE(*CHAR) LEN(10)                      
0018.00              DCL        VAR(&MSGDTA) TYPE(*CHAR) LEN(132)                      
0019.00              DCL        VAR(&TYPE) TYPE(*CHAR) LEN(1)                          
0020.00              DCL        VAR(&TOPGMQ) TYPE(*CHAR) LEN(10)                       
0021.00              DCL        VAR(&MSGTYPE) TYPE(*CHAR) LEN(10) +                    
0022.00                           VALUE('*ESCAPE   ')                                  
0023.00              DCL        VAR(&APIERR) TYPE(*CHAR) LEN(116) +                    
0024.00                           VALUE(X'000074') /* 2 進数  */                         
0025.00              DCL        VAR(&NULL4) TYPE(*CHAR) LEN(4) +                         
0026.00                           VALUE(X'00000000')                                     
0027.00              DCL        VAR(&STSMSG) TYPE(*CHAR) LEN(128)                        
0028.00              DCL        VAR(&KOSU) TYPE(*DEC) LEN(4 0) VALUE(0)                  
0029.00              DCL        VAR(&KOSUD) TYPE(*CHAR) LEN(4)                           
0030.00              DCL        VAR(&FROMMBR) TYPE(*CHAR) LEN(128)                       
0031.00              DCL        VAR(&TOSTMF) TYPE(*CHAR) LEN(128)                        
0032.00              DCL        VAR(&N) TYPE(*DEC) LEN(8 0) VALUE(1) /* WORK */          
0033.00              DCL        VAR(&POS) TYPE(*DEC) LEN(4 0)                            
0034.00              /*( QUSLOBJ のための変数 )*/                                        
0035.00              DCL        VAR(&RCVDTA) TYPE(*CHAR) LEN(256) /* +                   
0036.00                            受取データ  */                                        
0037.00              DCL        VAR(&OBJOBJLIB) TYPE(*CHAR) LEN(20) +                    
0038.00                           VALUE('オブジェクト/ライブラリー')                              
0039.00              DCL        VAR(&STRPOS) TYPE(*CHAR) LEN(4) +                        
0040.00                           VALUE(X'0000007D') /* 2 進数開始位置  : +              
0041.00                           125 */                                                 
0042.00              DCL        VAR(&LENDTA) TYPE(*CHAR) LEN(4) +                        
0043.00                           VALUE(X'00000010') /* 2 進数受取長さ  : 16 */          
0044.00              DCL        VAR(&RCVVAR) TYPE(*CHAR) LEN(16) +                       
0045.00                           VALUE(X'0000000000000000')                             
0046.00              DCL        VAR(&OFFSET) TYPE(*CHAR) LEN(4) /* +                     
0047.00                           2 進数 オフセット */                                        
0048.00              DCL        VAR(&NOENTR) TYPE(*CHAR) LEN(4) /* +            
0049.00                           2 進数項目数  */                              
0050.00              DCL        VAR(&LSTSIZ) TYPE(*CHAR) LEN(4) /* +            
0051.00                           2 進数リストサイズ  */                        
0052.00              DCL        VAR(&DEC08) TYPE(*DEC) LEN(8 0) /* WORK */      
0053.00              DCL        VAR(&ADDLEN) TYPE(*DEC) LEN(8 0) /* WORK */     
0054.00              DCL        VAR(&NOENT) TYPE(*DEC) LEN(8 0) /* WORK */      
0055.00  /*( QCLSCAN のための変数 )*/                                           
0056.00              DCL        VAR(&PATLEN1) TYPE(*DEC) LEN(3 0) VALUE(1)      
0057.00              DCL        VAR(&PATLEN3) TYPE(*DEC) LEN(3 0) VALUE(2)      
0058.00              DCL        VAR(&STRPOT) TYPE(*DEC) LEN(3 0) VALUE(1)       
0059.00              DCL        VAR(&STRLEN) TYPE(*DEC) LEN(3 0) VALUE(10)      
0060.00              DCL        VAR(&RESULT) TYPE(*DEC) LEN(3 0)                
0061.00              /*( SNDFTP 送信のための変数 )*/                            
0062.00              DCL        VAR(&FROMIP) TYPE(*CHAR) LEN(15)                
0063.00              DCL        VAR(&FROMPASS) TYPE(*CHAR) LEN(128)             
0064.00              DCL        VAR(&TOIP) TYPE(*CHAR) LEN(15)                  
0065.00              DCL        VAR(&TODIR) TYPE(*CHAR) LEN(128)                
0066.00              DCL        VAR(&TOPASS) TYPE(*CHAR) LEN(128)               
0067.00              DCL        VAR(&USER) TYPE(*CHAR) LEN(13)                  
0068.00              DCL        VAR(&PASSWRD) TYPE(*CHAR) LEN(13)               
0069.00              DCL        VAR(&LOG) TYPE(*CHAR) LEN(4)                    
0070.00              DCL        VAR(&TEXT) TYPE(*CHAR) LEN(50)                  
0071.00              MONMSG     MSGID(CPF0000) EXEC(GOTO CMDLBL(ERROR))         
0072.00                                                                             
0073.00 /*( 環境の取得 )*/                                                          
0074.00              RTVJOBA    TYPE(&TYPE)                                         
0075.00              IF         COND(&TYPE *EQ '0') THEN(DO) /*  バッチ  */         
0076.00              CHGVAR     VAR(&TOPGMQ) VALUE('*SYSOPR   ')                    
0077.00              ENDDO      /*  バッチ  */                                      
0078.00              ELSE       CMD(DO) /*  対話式  */                              
0079.00              CHGVAR     VAR(&TOPGMQ) VALUE('*TOPGMQ   ')                    
0080.00              ENDDO      /*  対話式  */                                      
0081.00                                                                             
0082.00 /*( パラメータの取得 )*/                                                    
0083.00              CHGVAR     VAR(&FLD2) VALUE(%SST(&LIBR 1 2))                   
0084.00              CHGVAR     VAR(&SAVSU) VALUE(%BIN(&FLD2))                      
0085.00              CHGVAR     VAR(&INZLIB) VALUE(%SST(&LIBR 3 10))                
0086.00              IF         COND(&OPTION *EQ '*SEND ') THEN(DO) /* +            
0087.00                            送信  */                                         
0088.00              IF         COND(%SST(&PASSWRD 1 5) *EQ '*NONE') THEN(DO)       
0089.00              CHGVAR     VAR(&MSG) +                                         
0090.00                           VALUE(' パスワードが指定されていません。 ')       
0091.00              GOTO       SNDMSG                                              
0092.00              ENDDO                                                          
0093.00              ENDDO      /*  送信  */                                        
0094.00                                                                             
0095.00 /*( 環境の設定 )*/                                                          
0096.00              IF         COND(&INZLIB *EQ '*ALL      ') THEN(DO) /* +       
0097.00                           *ALL */                                          
0098.00              CALL       PGM(QUSCRTUS) PARM('QUSLOBJ   +                    
0099.00                           QTEMP     ' 'PF        ' 1000 ' ' +              
0100.00                           '*ALL      ' 'QUSLOBJ 用ユーザー空間 ' +         
0101.00                           '*YES      ' &APIERR)                            
0102.00              MONMSG     CPF9870                                            
0103.00 /*( QUSLOBJ :  オブジェクト・リストAPI )*/                              
0104.00              CALL       PGM(QUSLOBJ) PARM('QUSLOBJ   QTEMP     ' +         
0105.00                           'OBJL0200' '*ALL      *ALL      ' '*LIB      ' + 
0106.00                           &APIERR)                                         
0107.00 /*( リストAPIで作成されたユーザー空間の検索 )*/                         
0108.00      /*( リストデータセクションのオフセットを検索 )*/                      
0109.00              CALL       PGM(QUSRTVUS) PARM('QUSLOBJ   QTEMP     ' +        
0110.00                           &STRPOS &LENDTA &RCVVAR)                         
0111.00              CHGVAR     VAR(&OFFSET) VALUE(%SST(&RCVVAR 1 4))              
0112.00              CHGVAR     VAR(&NOENTR) VALUE(%SST(&RCVVAR 9 4))              
0113.00              CHGVAR     VAR(&LSTSIZ) VALUE(%SST(&RCVVAR 13 4))             
0114.00                                                                            
0115.00          /*( RCVVAR によって OFFSET,LSTSIZ を受取った )*/                  
0116.00              CHGVAR     VAR(&STRPOS) VALUE(&OFFSET)                        
0117.00              CHGVAR     VAR(&DEC08) VALUE(%BIN(&STRPOS))                   
0118.00              CHGVAR     VAR(&DEC08) VALUE(&DEC08 + 1)                      
0119.00              CHGVAR     VAR(%BIN(&STRPOS)) VALUE(&DEC08)                   
0120.00              CHGVAR     VAR(&LENDTA) VALUE(&LSTSIZ)                         
0121.00              CHGVAR     VAR(&ADDLEN) VALUE(%BIN(&LENDTA))                   
0122.00              CHGVAR     VAR(&NOENT) VALUE(%BIN(&NOENTR))                    
0123.00              CHGVAR     VAR(&SAVSU) VALUE(&NOENT)                           
0124.00              ENDDO      /* *ALL */                                          
0125.00                                                                             
0126.00              CHGVAR     VAR(&KOSU) VALUE(0)                                 
0127.00              CHGVAR     VAR(&N) VALUE(1)                                    
0128.00              CHGVAR     VAR(&POS) VALUE(3)                                  
0129.00              CHGVAR     VAR(&KOSU) VALUE(0)                                 
0130.00              /*( 処理の開始 )*/                                             
0131.00  NXTSAV:                                                                    
0132.00              IF         COND(&INZLIB *EQ '*ALL      ') THEN(DO) /* +        
0133.00                           *ALL */                                           
0134.00              CALL       PGM(QUSRTVUS) PARM('QUSLOBJ   QTEMP     ' +         
0135.00                           &STRPOS &LENDTA &RCVDTA)                          
0136.00              CHGVAR     VAR(&LIB) VALUE(%SST(&RCVDTA  1 10))                
0137.00              /*( *ALL の場合は除外するライブラリーは除く )*/                
0138.00         /*( 保管ライブラリー SAVUSRLIB は除く )*/                           
0139.00              IF         COND(&LIB *EQ 'SAVUSRLIB ') THEN(DO)                
0140.00              GOTO       PASS                                                
0141.00              ENDDO                                                          
0142.00              IF         COND(&LIB *EQ 'BACKUP    ') THEN(DO)                
0143.00              GOTO       PASS                                                
0144.00              ENDDO                                                     
0145.00              IF         COND(&LIB *EQ 'SPOOL.MOD ') THEN(DO)           
0146.00              GOTO       PASS                                           
0147.00              ENDDO                                                     
0148.00              IF         COND(&LIB *EQ 'PANEL.MOD ') THEN(DO)           
0149.00              GOTO       PASS                                           
0150.00              ENDDO                                                     
0151.00              IF         COND(&LIB *EQ 'IFSLIB    ') THEN(DO)           
0152.00              GOTO       PASS                                           
0153.00              ENDDO                                                     
0154.00              IF         COND(&LIB *EQ 'SYSIBM    ') THEN(DO)           
0155.00              GOTO       PASS                                           
0156.00              ENDDO                                                     
0157.00         /*( 頭 SYS は除く )*/                                          
0158.00              IF         COND(%SST(&LIB 1 3) *EQ 'SYS') THEN(DO)        
0159.00              GOTO       PASS                                           
0160.00              ENDDO                                                     
0161.00         /*( 頭 # は除く )*/                                            
0162.00              IF         COND(%SST(&LIB 1 1) *EQ '#') THEN(DO)          
0163.00              GOTO       PASS                                           
0164.00              ENDDO                                                     
0165.00         /*( 頭 OOTAKE は除く )*/                                       
0166.00              IF         COND(%SST(&LIB 1 6) *EQ 'OOTAKE') THEN(DO)     
0167.00              GOTO       PASS                                           
0168.00              ENDDO                                                     
0169.00         /*( 文字 _ を含むものは除く )*/                                
0170.00              CALL       PGM(QCLSCAN) PARM(&LIB &STRLEN &STRPOT +       
0171.00                           '_' &PATLEN1 ' ' ' ' ' ' &RESULT)            
0172.00              IF         COND(&RESULT *NE 0) THEN(DO)                   
0173.00              GOTO       PASS                                           
0174.00              ENDDO                                                     
0175.00         /*( 文字 TEST を含むものは除く )*/                             
0176.00              CALL       PGM(QCLSCAN) PARM(&LIB &STRLEN &STRPOT +       
0177.00                           'TEST' &PATLEN3 ' ' ' ' ' ' &RESULT)         
0178.00              IF         COND(&RESULT *NE 0) THEN(DO)                   
0179.00              GOTO       PASS                                           
0180.00              ENDDO                                                     
0181.00         /*( 頭 @ は除く )*/                                            
0182.00              IF         COND(%SST(&LIB 1 1) *EQ '@') THEN(DO)          
0183.00              GOTO       PASS                                           
0184.00              ENDDO                                                     
0185.00         /*( 頭 DDM は除く )*/                                          
0186.00              IF         COND(%SST(&LIB 1 3) *EQ 'DDM') THEN(DO)        
0187.00              GOTO       PASS                                           
0188.00              ENDDO                                                     
0189.00         /*( 頭 LIC は除く )*/                                          
0190.00              IF         COND(%SST(&LIB 1 3) *EQ 'LIC') THEN(DO)        
0191.00              GOTO       PASS                                           
0192.00              ENDDO                                                          
0193.00         /*( 頭 PTF は除く )*/                                               
0194.00              IF         COND(%SST(&LIB 1 3) *EQ 'PTF') THEN(DO)             
0195.00              GOTO       PASS                                                
0196.00              ENDDO                                                          
0197.00         /*( 頭 SAVF は除く )*/                                              
0198.00              IF         COND(%SST(&LIB 1 4) *EQ 'SAVF') THEN(DO)            
0199.00              GOTO       PASS                                                
0200.00              ENDDO                                                          
0201.00         /*( ASNET.COM 本番用だけを保管 )*/                                  
0202.00              IF         COND(%SST(&LIB 1 9) *EQ 'ASNET.COM') THEN(DO)       
0203.00              IF         COND(&LIB *NE 'ASNET.COM ') THEN(DO)                
0204.00              GOTO       PASS                                                
0205.00              ENDDO                                                          
0206.00              ENDDO                                                          
0207.00              IF         COND(%SST(&LIB 1 8) *EQ 'ASNETCOM') THEN(DO)        
0208.00              GOTO       PASS                                                
0209.00              ENDDO                                                          
0210.00         /*( ASNET.USR 本番用だけを保管 )*/                                  
0211.00              IF         COND(%SST(&LIB 1 9) *EQ 'ASNET.USR') THEN(DO)       
0212.00              IF         COND(&LIB *NE 'ASNET.USR ') THEN(DO)                
0213.00              GOTO       PASS                                                
0214.00              ENDDO                                                          
0215.00              ENDDO                                                          
0216.00              IF         COND(%SST(&LIB 1 8) *EQ 'ASNETUSR') THEN(DO)     
0217.00              GOTO       PASS                                             
0218.00              ENDDO                                                       
0219.00         /*( SPOOLWTR  本番用だけを保管 )*/                               
0220.00              IF         COND(%SST(&LIB 1 8) *EQ 'SPOOLWTR') THEN(DO)     
0221.00              IF         COND(&LIB *NE 'SPOOLWTR  ') THEN(DO)             
0222.00              GOTO       PASS                                             
0223.00              ENDDO                                                       
0224.00              ENDDO                                                       
0225.00         /*( QTRSRC    本番用だけを保管 )*/                               
0226.00              IF         COND(%SST(&LIB 1 6) *EQ 'QTRSRC') THEN(DO)       
0227.00              IF         COND(&LIB *NE 'QTRSRC    ') THEN(DO)             
0228.00              GOTO       PASS                                             
0229.00              ENDDO                                                       
0230.00              ENDDO                                                       
0231.00         /*( QTROBJ    本番用だけを保管 )*/                               
0232.00              IF         COND(%SST(&LIB 1 6) *EQ 'QTROBJ') THEN(DO)       
0233.00              IF         COND(&LIB *NE 'QTROBJ    ') THEN(DO)             
0234.00              GOTO       PASS                                             
0235.00              ENDDO                                                       
0236.00              ENDDO                                                       
0237.00         /*( QTRFIL    本番用だけを保管 )*/                               
0238.00              IF         COND(%SST(&LIB 1 6) *EQ 'QTRFIL') THEN(DO)       
0239.00              IF         COND(&LIB *NE 'QTRFIL    ') THEN(DO)             
0240.00              GOTO       PASS                                                
0241.00              ENDDO                                                          
0242.00              ENDDO                                                          
0243.00         /*( CGIBIN    本番用だけを保管 )*/                                  
0244.00              IF         COND(%SST(&LIB 1 6) *EQ 'CGIBIN') THEN(DO)          
0245.00              IF         COND(&LIB *NE 'CGIBIN    ') THEN(DO)                
0246.00              GOTO       PASS                                                
0247.00              ENDDO                                                          
0248.00              ENDDO                                                          
0249.00         /*( 頭が Q で QTR, QUATTRO,QSROAD 以外は除く )*/                    
0250.00              IF         COND(%SST(&LIB 1 1) *EQ 'Q') THEN(DO) /* +          
0251.00                            頭が Q */                                        
0252.00              IF         COND((%SST(&LIB 1 3) *EQ 'QTR') *OR +               
0253.00                           (%SST(&LIB 1 7) *EQ 'QUATTRO') *OR +              
0254.00                           (%SST(&LIB 1 6) *EQ 'QSROAD')) THEN(DO)           
0255.00              GOTO       EXEC                                                
0256.00              ENDDO                                                          
0257.00              ELSE       CMD(DO)                                             
0258.00              GOTO       PASS                                                
0259.00              ENDDO                                                          
0260.00              ENDDO      /*  頭が Q */                                       
0261.00              ELSE       CMD(IF COND(%SST(&LIB 1 3) *NE 'PTF') THEN(DO))     
0262.00              GOTO       EXEC                                                
0263.00              ENDDO                                                          
0264.00              ENDDO      /* *ALL */                                         
0265.00              ELSE       CMD(DO) /*  ライブラリー指定  */                   
0266.00              CHGVAR     VAR(&LIB) VALUE(%SST(&LIBR &POS 10))               
0267.00              ENDDO      /*  ライブラリー指定  */                           
0268.00                                                                            
0269.00  EXEC:       RTVOBJD    OBJ(&LIB) OBJTYPE(*LIB) TEXT(&TEXT)                
0270.00              MONMSG     MSGID(CPF9800) EXEC(DO)                            
0271.00              CHGVAR     VAR(&MSG) VALUE(' ライブラリー ' *CAT +            
0272.00                           &LIB *TCAT ' が見つからない。 ')                 
0273.00              GOTO       SNDMSG                                             
0274.00              ENDDO                                                         
0275.00              CHKOBJ     OBJ(QTEMP/&LIB) OBJTYPE(*FILE)                     
0276.00              MONMSG     MSGID(CPF9800) EXEC(DO)                            
0277.00              CRTSAVF    FILE(QTEMP/&LIB) TEXT(&TEXT) AUT(*ALL)             
0278.00              ENDDO                                                         
0279.00              CLRSAVF    FILE(QTEMP/&LIB)                                   
0280.00              /*******************************************/                 
0281.00              /* (1) QTEMP/SAVF にライブラリーを保管する */                 
0282.00              /*******************************************/                 
0283.00              CHGVAR     VAR(&STSMSG) VALUE(' ライブラリー ' *CAT +         
0284.00                           &LIB *TCAT ' を保管中です。 ')                   
0285.00              SNDPGMMSG  MSGID(CPF9897) MSGF(QCPFMSG) MSGDTA(&STSMSG) +     
0286.00                           TOPGMQ(*EXT) MSGTYPE(*STATUS)                    
0287.00              SAVLIB     LIB(&LIB) DEV(*SAVF) SAVF(QTEMP/&LIB) +            
0288.00                           SAVACT(*SYSDFN) ACCPTH(*NO) SAVFDTA(*YES) +       
0289.00                           SPLFDTA(*NONE) DTACPR(*HIGH)                      
0290.00              CHGVAR     VAR(&KOSU) VALUE(&KOSU + 1)                         
0291.00              /*******************************************/                  
0292.00              /* (2) IFS に保管ファイルを転送する        */                  
0293.00              /*******************************************/                  
0294.00              IF         COND(&OPTION *EQ '*SEND ') THEN(DO) /* +            
0295.00                            送信  */                                         
0296.00              CHGVAR     VAR(&FROMMBR) VALUE('/QSYS.LIB/QTEMP.LIB/' +        
0297.00                           *CAT &LIB *TCAT '.FILE')                          
0298.00              CHGVAR     VAR(&TOSTMF) VALUE('/TEST/' *CAT &LIB +             
0299.00                           *TCAT '.FILE')                                    
0300.00              CPYTOSTMF  FROMMBR(&FROMMBR) TOSTMF(&TOSTMF) +                 
0301.00                           STMFOPT(*REPLACE)                                 
0302.00              /*******************************************/                  
0303.00              /* (3) FTP で保管ファイルを転送する        */                  
0304.00              /*******************************************/                  
0305.00              CHGVAR     VAR(&STSMSG) VALUE(' ライブラリー ' *CAT +          
0306.00                           &LIB *TCAT ' を FTP で転送中です。 ')             
0307.00              SNDPGMMSG  MSGID(CPF9897) MSGF(QCPFMSG) MSGDTA(&STSMSG) +      
0308.00                           TOPGMQ(*EXT) MSGTYPE(*STATUS)                     
0309.00              CHGVAR     VAR(&TOPASS) VALUE(&TODIR *TCAT &LIB *TCAT +        
0310.00                           '.SAV')                                           
0311.00              CHGVAR     VAR(&FROMPASS) VALUE(&TOSTMF)                       
0312.00              SPOOLWTR/SNDFTP FRMADDRESS(&FROMIP) FROMFILE(&FROMPASS) +      
0313.00                           TOADDRESS(&TOIP) TOFILE(&TOPASS) +                
0314.00                           USER(&USER) PASSWORD(&PASSWRD) +                  
0315.00                           CONVERT(*NO) LOG(&LOG)                            
0316.00              /*******************************************/                  
0317.00              /* (4) IFS の作業ファイルを削除しておく    */                  
0318.00              /*******************************************/                  
0319.00              CHGVAR     VAR(&STSMSG) VALUE(&TOSTMF *TCAT +                  
0320.00                           ' を削除中。 ')                                   
0321.00              SNDPGMMSG  MSGID(CPF9897) MSGF(QCPFMSG) MSGDTA(&STSMSG) +      
0322.00                           TOPGMQ(*EXT) MSGTYPE(*STATUS)                     
0323.00              RMVLNK     OBJLNK(&TOSTMF)                                     
0324.00              ENDDO      /*  送信  */                                        
0325.00              /*( 処理の終了 )*/                                             
0326.00  PASS:       IF         COND(&N < &SAVSU) THEN(DO)                          
0327.00              CHGVAR     VAR(&N) VALUE(&N + 1)                               
0328.00              IF         COND(&INZLIB *EQ '*ALL      ') THEN(DO) /* +        
0329.00                           *ALL */                                           
0330.00              CHGVAR     VAR(&DEC08)  VALUE(%BIN(&STRPOS))                   
0331.00              CHGVAR     VAR(&DEC08) VALUE(&DEC08 + &ADDLEN)                 
0332.00              CHGVAR     VAR(%BIN(&STRPOS)) VALUE(&DEC08)                    
0333.00              ENDDO      /* *ALL */                                          
0334.00              ELSE       CMD(DO) /*  ライブラリー指定  */                    
0335.00              CHGVAR     VAR(&POS) VALUE(&POS + 10)                          
0312.00              SPOOLWTR/SNDFTP FRMADDRESS(&FROMIP) FROMFILE(&FROMPASS) +      
0313.00                           TOADDRESS(&TOIP) TOFILE(&TOPASS) +                
0314.00                           USER(&USER) PASSWORD(&PASSWRD) +                  
0315.00                           CONVERT(*NO) LOG(&LOG)                            
0316.00              /*******************************************/                  
0317.00              /* (4) IFS の作業ファイルを削除しておく    */                  
0318.00              /*******************************************/                  
0319.00              CHGVAR     VAR(&STSMSG) VALUE(&TOSTMF *TCAT +                  
0320.00                           ' を削除中。 ')                                   
0321.00              SNDPGMMSG  MSGID(CPF9897) MSGF(QCPFMSG) MSGDTA(&STSMSG) +      
0322.00                           TOPGMQ(*EXT) MSGTYPE(*STATUS)                     
0323.00              RMVLNK     OBJLNK(&TOSTMF)                                     
0324.00              ENDDO      /*  送信  */                                        
0325.00              /*( 処理の終了 )*/                                             
0326.00  PASS:       IF         COND(&N < &SAVSU) THEN(DO)                          
0327.00              CHGVAR     VAR(&N) VALUE(&N + 1)                               
0328.00              IF         COND(&INZLIB *EQ '*ALL      ') THEN(DO) /* +        
0329.00                           *ALL */                                           
0330.00              CHGVAR     VAR(&DEC08)  VALUE(%BIN(&STRPOS))                   
0331.00              CHGVAR     VAR(&DEC08) VALUE(&DEC08 + &ADDLEN)                 
0332.00              CHGVAR     VAR(%BIN(&STRPOS)) VALUE(&DEC08)                    
0333.00              ENDDO      /* *ALL */                                          
0334.00              ELSE       CMD(DO) /*  ライブラリー指定  */                    
0335.00              CHGVAR     VAR(&POS) VALUE(&POS + 10)                          
0336.00              ENDDO      /*  ライブラリー指定  */                         
0337.00              GOTO       NXTSAV                                           
0338.00              ENDDO                                                       
0339.00  REDEND:     CHGVAR     VAR(&KOSUD) VALUE(&KOSU)                         
0340.00  ZEROS:      IF         COND(%SST(&KOSUD 1 1) *EQ '0') THEN(DO)          
0341.00              CHGVAR     VAR(&KOSUD) VALUE(%SST(&KOSUD 2 3) *CAT ' ')     
0342.00              GOTO       ZEROS                                            
0343.00              ENDDO                                                       
0344.00                                                                          
0345.00              CHGVAR     VAR(&MSG) VALUE(&KOSUD *TCAT +                   
0346.00                           ' 個のライブラリーを保管しました。 ')          
0347.00              CHGVAR     VAR(&MSGTYPE) VALUE('*DIAG     ')                
0348.00              GOTO       SNDMSG                                           
0349.00              RETURN                                                      
0350.00                                                                          
0351.00  APIERR:                                                                 
0352.00              CHGVAR     VAR(&MSGID) VALUE(%SST(&APIERR 9 7))             
0353.00              CHGVAR     VAR(&MSGDTA) VALUE(%SST(&APIERR 17 100))         
0354.00              CHGVAR     VAR(&MSGF) VALUE('QCPFMSG   ')                   
0355.00              CHGVAR     VAR(&MSGFLIB) VALUE('QSYS      ')                
0356.00              GOTO       SNDMSG                                           
0357.00                                                                          
0358.00  ERROR:      RCVMSG     MSGTYPE(*LAST) RMV(*NO) MSG(&MSG) +              
0359.00                           MSGDTA(&MSGDTA) MSGID(&MSGID) MSGF(&MSGF) +    
0360.00                           MSGFLIB(&MSGFLIB)                         
0361.00  SNDMSG:     IF         COND(&MSGID *EQ ' ') THEN(DO)               
0362.00              SNDPGMMSG  MSGID(CPF9897) MSGF(QCPFMSG) MSGDTA(&MSG) + 
0363.00                           TOMSGQ(&TOPGMQ) MSGTYPE(&MSGTYPE)         
0364.00              MONMSG     MSGID(CPF2400) EXEC(RETURN)                 
0365.00              ENDDO                                                  
0366.00              ELSE       CMD(DO)                                     
0367.00              SNDPGMMSG  MSGID(&MSGID) MSGF(&MSGFLIB/&MSGF) +        
0368.00                           MSGDTA(&MSGDTA) TOMSGQ(&TOPGMQ) +         
0369.00                           MSGTYPE(&MSGTYPE)                         
0370.00              MONMSG     MSGID(CPF2400) EXEC(RETURN)                 
0371.00              ENDDO                                                  
0372.00              ENDPGM                                                 
【 解説 】

CLP は少し長いかも知れないがこれで完結している。

*ALL が指定された場合も個別にライブラリー名で指定された場合も
この CLP でカバーしている。
*ALL が指定された場合は API : QUSLOBJ によってライブラリーの一覧を
ユーザー・スペース: QTEMP/QUSLOBJ に出力してそのユーザー・スペースを
API : QUSRTVUS で読み取ってライブラリー名を取得している。

保管の対象となったライブラリー: &LIB に対しては

0275.00              CHKOBJ     OBJ(QTEMP/&LIB) OBJTYPE(*FILE)                     
0276.00              MONMSG     MSGID(CPF9800) EXEC(DO)                            
0277.00              CRTSAVF    FILE(QTEMP/&LIB) TEXT(&TEXT) AUT(*ALL)             
0278.00              ENDDO                                                         
0279.00              CLRSAVF    FILE(QTEMP/&LIB)

によって QTEMPに *SAVF を作成して CLRSAVF でクリヤーしている。
これは QTEMP に *SAVF が存在している場合は、その中身を消しておかないと
SAVLIB で警告エラー: *SAVF にデータが入っている、
とのエラーとなるからである。

次に

0296.00              CHGVAR     VAR(&FROMMBR) VALUE('/QSYS.LIB/QTEMP.LIB/' +        
0297.00                           *CAT &LIB *TCAT '.FILE')                          
0298.00              CHGVAR     VAR(&TOSTMF) VALUE('/TEST/' *CAT &LIB +             
0299.00                           *TCAT '.FILE')                                    
0300.00              CPYTOSTMF  FROMMBR(&FROMMBR) TOSTMF(&TOSTMF) +                 
0301.00                           STMFOPT(*REPLACE)

によって CPYTOSTMF で *SAVF を IFS にコピーする。
Ftp はライブラリー・ファイルを直接、送信することはできないので
IFS のストリーム・ファイルに置き換える必要があるからである。

そして

0312.00              SPOOLWTR/SNDFTP FRMADDRESS(&FROMIP) FROMFILE(&FROMPASS) +      
0313.00                           TOADDRESS(&TOIP) TOFILE(&TOPASS) +                
0314.00                           USER(&USER) PASSWORD(&PASSWRD) +                  
0315.00                           CONVERT(*NO) LOG(&LOG)

として Spoolライターの SNDFTP コマンドを使って別の PC サーバーに
Ftp 送信する。

最後に

0323.00              RMVLNK     OBJLNK(&TOSTMF)

によって IFS のファイルを削除しておく。

ここで紹介する SAVUSRLIB コマンドはユーザー・ライブラリーだけを
BACKUP して別の PC サーバーに転送するコマンドである。
テープ装置ではなく PC サーバーへの FTP での転送であるので
テープ装置も必要なく媒体の劣化を気にする必要もない。
当然、テープ装置への BACKUP に比べると速度も速くて時間も短くて済む。
SAVUSRLIB は日常的にすぐ役に立つ非常に有益なコマンドであるので
ぜひ活用して頂きたい。

【 ADDJOBSCDEの例 】
ADDJOBSCDE JOB(SAVUSRLIB) CMD(QUATTRO/SAVUSRLIB OPTION(*SEND) PASSWORD(1111) LOG(*NO))
   FRQ(*WEEKLY) SCDTIME(220000) 

※この例では夜間 10:00 に SAVUSRLIB を使うバックアップを開始している。
弊社では 128 個のライブラリーをバックアップするのに 15 分以下でバックアップは完了している。
テープ装置へのバックアップに比べると驚異的な速さである。

ADDJOBSCDE した計画ジョブは WRKJOBSCDE によって管理することができる。