Tools

65. PC サーバーの BACKUP をライブラリーに復元する RSTUSRLIB

RSTUSRLIB コマンドは先に紹介した SAVUSRLIB コマンドの逆として
別の PC サーバーに保管しておいたライブラリー・ファイル( xxx.SAV )から
元のライブラリーを復元するコマンドである。
別のライブラリーからは SpoolライターVer5.0 の Ftp コマンド: SNDFTP を
使って受信する。
SNDFTP は Ftp 送信だけでなく受信も行うことができる。

RSTUSRLIB コマンドは SAVUSRLIB コマンドで *ALL でまとめて保管しておいた
ライブラリーを個別に名前を指定して復元することもできる。

RSTUSRLIB コマンドの実行の様子は次のとおりである。

                   ユーザー・ライブラリーの復元  (RSTUSRLIB)                   
                                                                               
 選択項目を入力して,実行キーを押してください。                                
                                                                               
 ライブラリー  . . . . . . . . . > QTRFIL         文字値 , *ALL                
                値の続きは+                                                   
 入力オプション  . . . . . . . . > *RECV         *NONE, *RECV, *PRINT          
 ホスト IP アドレス  . . . . . .   '*DFT'                                      
 相手先 IP アドレス  . . . . . .   '192.168.1.8'                               
 相手先ファイル DIR  . . . . . .   '/TEST/'                                    
                                                                               
                                                                               
 遠隔ユーザー ID . . . . . . . .   QUATTRO                                     
 遠隔パスワード  . . . . . . . .                  文字値 , *NONE               
 ログ表示  . . . . . . . . . . .   *NO           *YES, *NO                     
                                                                               
【 コマンド: RSTUSRLIB 】
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 *RECV *PRINT) +            
0007.00                           PROMPT(' 入力オプション ')                         
0008.00  RECV:       PMTCTL     CTL(OPTION) COND((*EQ *RECV))                        
0009.00              PARM       KWD(FRMADDRESS) TYPE(*CHAR) LEN(15) +                
0010.00                           DFT('*DFT') PMTCTL(RECV) +                         
0011.00                           PROMPT(' ホスト IP アドレス ')                     
0012.00              PARM       KWD(TOADDRESS) TYPE(*CHAR) LEN(15) +                 
0013.00                           DFT('192.168.1.8') PMTCTL(RECV) +                  
0014.00                           PROMPT(' 相手先 IP アドレス ')                     
0015.00              PARM       KWD(TODIR) TYPE(*CHAR) LEN(128) +                    
0016.00                           DFT('/TEST/') CASE(*MIXED) +                       
0017.00                           PMTCTL(RECV) PROMPT(' 相手先ファイル DIR')         
0018.00              PARM       KWD(USER) TYPE(*CHAR) LEN(13) DFT(QUATTRO) +         
0019.00                           SPCVAL((*NONE)) CASE(*MIXED) PMTCTL(RECV) +        
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(RECV) +                       
0024.00                           INLPMTLEN(*PWD) PROMPT(' 遠隔パスワード ') 
0025.00              PARM       KWD(LOG) TYPE(*CHAR) LEN(4) RSTD(*YES) +     
0026.00                           DFT(*YES) VALUES(*YES *NO) PMTCTL(RECV) +  
0027.00                           PROMPT(' ログ表示 ')                       
0028.00  PRINT:      PMTCTL     CTL(OPTION) COND((*EQ *PRINT))               
【 コマンド: RSTUSRLIBC 】
0001.00              PGM        PARM(&LIBR &OPTION &FROMIP &TOIP &TODIR +        
0002.00                           &USER &PASSWRD &LOG)                           
0003.00 /*-------------------------------------------------------------------*/  
0004.00 /*   RSTUSRLIBC :  ユーザー・ライブラリーの復元                      */  
0005.00 /*                                                                   */  
0006.00 /*   2018/09/21  作成                                                */  
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(&TOMBR) TYPE(*CHAR) LEN(128)                   
0031.00              DCL        VAR(&FROMSTMF) 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 '*RECV ') 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  NXTRST:                                                                
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) 相手先より SNDFTP で受信する        */              
0282.00              /*******************************************/              
0283.00              IF         COND(&OPTION *EQ '*RECV ') THEN(DO) /* +        
0284.00                            受信  */                                     
0285.00              CHGVAR     VAR(&STSMSG) VALUE(' ライブラリー ' *CAT +      
0286.00                           &LIB *TCAT ' を FTP で転送中です。 ')         
0287.00              SNDPGMMSG  MSGID(CPF9897) MSGF(QCPFMSG) MSGDTA(&STSMSG) +  
0288.00                           TOPGMQ(*EXT) MSGTYPE(*STATUS)                   
0289.00              CHGVAR     VAR(&TOMBR) VALUE('/QSYS.LIB/QTEMP.LIB/' +        
0290.00                           *CAT &LIB *TCAT '.FILE')                        
0291.00              CHGVAR     VAR(&FROMSTMF) VALUE('/TEST/' *CAT &LIB +         
0292.00                           *TCAT '.FILE')                                  
0293.00              CHGVAR     VAR(&TOPASS) VALUE(&FROMSTMF)                     
0294.00              CHGVAR     VAR(&FROMPASS) VALUE(&TODIR *TCAT &LIB *TCAT +    
0295.00                           '.SAV')                                         
0296.00              SPOOLWTR/SNDFTP FRMADDRESS(&FROMIP) FROMFILE(&FROMPASS) +    
0297.00                           TOADDRESS(&TOIP) TOFILE(&TOPASS) +              
0298.00                           USER(&USER) PASSWORD(&PASSWRD) CMD(GET) +       
0299.00                           CONVERT(*NO) LOG(&LOG)                          
0300.00              CPYFRMSTMF FROMSTMF(&TOPASS) TOMBR(&TOMBR) +                 
0301.00                           MBROPT(*REPLACE)                                
0302.00              ENDDO      /*  受信  */                                      
0303.00              /*********************************************/              
0304.00              /* (2) QTEMP/SAVF からライブラリーを復元する */              
0305.00              /*********************************************/              
0306.00              CHGVAR     VAR(&STSMSG) VALUE(' ライブラリー ' *CAT +        
0307.00                           &LIB *TCAT ' を保管中です。 ')                  
0308.00              SNDPGMMSG  MSGID(CPF9897) MSGF(QCPFMSG) MSGDTA(&STSMSG) +    
0309.00                           TOPGMQ(*EXT) MSGTYPE(*STATUS)                   
0310.00              RSTLIB     SAVLIB(&LIB) DEV(*SAVF) SAVF(QTEMP/&LIB) +        
0311.00                           MBROPT(*ALL) ALWOBJDIF(*ALL)                    
0312.00              CHGVAR     VAR(&KOSU) VALUE(&KOSU + 1)                       
0313.00              /*******************************************/                
0314.00              /* (3) IFS の作業ファイルを削除しておく    */                
0315.00              /*******************************************/                
0316.00              IF         COND(&OPTION *EQ '*RECV ') THEN(DO) /* +          
0317.00                            受信  */                                       
0318.00              CHGVAR     VAR(&STSMSG) VALUE(&FROMSTMF *TCAT +              
0319.00                           ' を削除中。 ')                                 
0320.00              SNDPGMMSG  MSGID(CPF9897) MSGF(QCPFMSG) MSGDTA(&STSMSG) +    
0321.00                           TOPGMQ(*EXT) MSGTYPE(*STATUS)                   
0322.00              RMVLNK     OBJLNK(&FROMSTMF)                                 
0323.00              ENDDO      /*  受信  */                                      
0324.00              /*( 処理の終了 )*/                                           
0325.00  PASS:       IF         COND(&N < &SAVSU) THEN(DO)                        
0326.00              CHGVAR     VAR(&N) VALUE(&N + 1)                             
0327.00              IF         COND(&INZLIB *EQ '*ALL      ') THEN(DO) /* +      
0328.00                           *ALL */                                         
0329.00              CHGVAR     VAR(&DEC08)  VALUE(%BIN(&STRPOS))                 
0330.00              CHGVAR     VAR(&DEC08) VALUE(&DEC08 + &ADDLEN)               
0331.00              CHGVAR     VAR(%BIN(&STRPOS)) VALUE(&DEC08)                  
0332.00              ENDDO      /* *ALL */                                        
0333.00              ELSE       CMD(DO) /*  ライブラリー指定  */                  
0334.00              CHGVAR     VAR(&POS) VALUE(&POS + 10)                        
0335.00              ENDDO      /*  ライブラリー指定  */                          
0336.00              GOTO       NXTRST                                           
0337.00              ENDDO                                                       
0338.00  REDEND:     CHGVAR     VAR(&KOSUD) VALUE(&KOSU)                         
0339.00  ZEROS:      IF         COND(%SST(&KOSUD 1 1) *EQ '0') THEN(DO)          
0340.00              CHGVAR     VAR(&KOSUD) VALUE(%SST(&KOSUD 2 3) *CAT ' ')     
0341.00              GOTO       ZEROS                                            
0342.00              ENDDO                                                       
0343.00                                                                          
0344.00              CHGVAR     VAR(&MSG) VALUE(&KOSUD *TCAT +                   
0345.00                           ' 個のライブラリーを復元しました。 ')          
0346.00              CHGVAR     VAR(&MSGTYPE) VALUE('*DIAG     ')                
0347.00              GOTO       SNDMSG                                           
0348.00              RETURN                                                      
0349.00                                                                          
0350.00  APIERR:                                                                 
0351.00              CHGVAR     VAR(&MSGID) VALUE(%SST(&APIERR 9 7))             
0352.00              CHGVAR     VAR(&MSGDTA) VALUE(%SST(&APIERR 17 100))         
0353.00              CHGVAR     VAR(&MSGF) VALUE('QCPFMSG   ')                   
0354.00              CHGVAR     VAR(&MSGFLIB) VALUE('QSYS      ')                
0355.00              GOTO       SNDMSG                                           
0356.00                                                                          
0357.00  ERROR:      RCVMSG     MSGTYPE(*LAST) RMV(*NO) MSG(&MSG) +              
0358.00                           MSGDTA(&MSGDTA) MSGID(&MSGID) MSGF(&MSGF) +    
0359.00                           MSGFLIB(&MSGFLIB)                              
0360.00  SNDMSG:     IF         COND(&MSGID *EQ ' ') THEN(DO)                
0361.00              SNDPGMMSG  MSGID(CPF9897) MSGF(QCPFMSG) MSGDTA(&MSG) +  
0362.00                           TOMSGQ(&TOPGMQ) MSGTYPE(&MSGTYPE)          
0363.00              MONMSG     MSGID(CPF2400) EXEC(RETURN)                  
0364.00              ENDDO                                                   
0365.00              ELSE       CMD(DO)                                      
0366.00              SNDPGMMSG  MSGID(&MSGID) MSGF(&MSGFLIB/&MSGF) +         
0367.00                           MSGDTA(&MSGDTA) TOMSGQ(&TOPGMQ) +          
0368.00                           MSGTYPE(&MSGTYPE)                          
0369.00              MONMSG     MSGID(CPF2400) EXEC(RETURN)                  
0370.00              ENDDO                                                   
0371.00              ENDPGM                                                  
【 解説 】

*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 でクリヤーしている。

次に

0289.00              CHGVAR     VAR(&TOMBR) VALUE('/QSYS.LIB/QTEMP.LIB/' +        
0290.00                           *CAT &LIB *TCAT '.FILE')                        
0291.00              CHGVAR     VAR(&FROMSTMF) VALUE('/TEST/' *CAT &LIB +         
0292.00                           *TCAT '.FILE')                                  
0293.00              CHGVAR     VAR(&TOPASS) VALUE(&FROMSTMF)                     
0294.00              CHGVAR     VAR(&FROMPASS) VALUE(&TODIR *TCAT &LIB *TCAT +    
0295.00                           '.SAV')                                         
0296.00              SPOOLWTR/SNDFTP FRMADDRESS(&FROMIP) FROMFILE(&FROMPASS) +    
0297.00                           TOADDRESS(&TOIP) TOFILE(&TOPASS) +              
0298.00                           USER(&USER) PASSWORD(&PASSWRD) CMD(GET) +       
0299.00                           CONVERT(*NO) LOG(&LOG)

によって Ftp で PC サーバーよりファイルを IFS に受信している。

さらに

0300.00              CPYFRMSTMF FROMSTMF(&TOPASS) TOMBR(&TOMBR) +                 
0301.00                           MBROPT(*REPLACE)

で QTEMP/*SAVF に IFS から復元データをコピーしている。

最後に

0310.00              RSTLIB     SAVLIB(&LIB) DEV(*SAVF) SAVF(QTEMP/&LIB) +        
0311.00                           MBROPT(*ALL) ALWOBJDIF(*ALL) 

でライブラリーを復元している。

SAVUSRLIB と RSTUSRLIB の2つが揃って初めて安心できる BACKUP 体制が
整ったと言える。
無人で夜間に BACKUP することができるので無介入で人手は不要である。