ここで紹介する SAVUSRLIB コマンドはユーザー・ライブラリーだけを
BACKUP して別の PC サーバーに転送するコマンドである。
テープ装置ではなく PC サーバーへの FTP での転送であるので
テープ装置も必要なく媒体の劣化を気にする必要もない。
当然、テープ装置への BACKUP に比べると速度も速くて時間も短くて済む。
SAVUSRLIB は日常的にすぐ約に立つ非常に有益なコマンドであるので
ぜひ活用して頂きたい。
i5/OS を含むフル・バックアップはテープ装置へバックアップするのであるが
これはバックアップ漏れのないように人での監視のもとで行う。
しかし日常、活動しているライブラリーに関しては毎日、深夜に
無人で漏れなく行うことが必要である。
このときテープ装置へのバックアップであると毎日のことなので
繰り返しているとテープ装置の劣化や損傷を招くことがある。
Ftp 転送であれば PC サーバーなどへのハード・ディスクへのコピーなので
繰り返していてもその心配はない。
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 の進行状況を示すためのログを表示するかどうかを指定する。
最初のテストのころはログを表示するようにして実行し、
テストも成功すればバッチ処理はログなしで投入することがよいだろう。
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 JOB(SAVUSRLIB) CMD(QUATTRO/SAVUSRLIB OPTION(*SEND) PASSWORD(1111) LOG(*NO)) FRQ(*WEEKLY) SCDTIME(220000)
※この例では夜間 10:00 に SAVUSRLIB を使うバックアップを開始している。
弊社では 128 個のライブラリーをバックアップするのに 15 分以下でバックアップは完了している。
テープ装置へのバックアップに比べると驚異的な速さである。
ADDJOBSCDE した計画ジョブは WRKJOBSCDE によって管理することができる。