ここで紹介する 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 によって管理することができる。