Esta versión es similar al post anterior de "http://diego-k.blogspot.com/2014/12/ibm-i-iseries-as400-haciendo-respaldos.html" pero es algo más simple (es un sólo CL) y según mis pruebas incluso es más veloz.
En lugar de armar un script de FTP, simplemente usa SCP para transferir archivos. Esto permite hacer una conexión sin depender de una password, la información viaja de forma segura, y el archivo es encriptado antes de ser enviado.
Necesitaremos tener instalado el 5733-SC1 (Portable Utilities) para contar con el comando SCP, un servidor que soporte SSH donde enviaremos el archivo, y la generación de la clave pública y clave privada para transferir sin necesidad de password.
El CLLE es un poco extenso, pero simple de seguir.
Los respaldos se hacen completos el primer día del mes y los lunes, e incrementales el resto de los días.
Se requiere crear la DTAARA BKP7ZPSWD con la llave de encripción. En este caso es una llave de 64 caracteres.
También necesitaremos el archivo BKPLIB que tiene la estructura de la salida de DSPOBJD pero en ODOBNM tendremos la lista de bibliotecas a respaldar.
Obviamente el servidor SSH debe ser visto desde el servidor IBM i (iSeries) donde tengamos el script.
PGM
DCL VAR(&ENCKEY) TYPE(*CHAR) LEN(64)
DCL VAR(&zipCMD) TYPE(*CHAR) LEN(256)
DCL VAR(&SSHCMD) TYPE(*CHAR) LEN(256)
DCL VAR(&SCPCMD) TYPE(*CHAR) LEN(256)
dcl var(&FECHA) type(*CHAR) LEN(8)
DCL var(&HOY) type(*CHAR) LEN(8)
DCL VAR(&DIA) TYPE(*CHAR) LEN(2)
DCL VAR(&NDIA) TYPE(*DEC) LEN(2 0)
DCL VAR(&MES) TYPE(*CHAR) LEN(2)
DCL VAR(&ANIO) TYPE(*CHAR) LEN(2)
DCL VAR(&DOW) TYPE(*CHAR) LEN(4)
DCLF FILE(MYLIB/BKPLIB)
RTVDTAARA DTAARA(MYLIB/BKP7ZPSWD *ALL) +
RTNVAR(&ENCKEY)
RTVSYSVAL SYSVAL(QDAYOFWEEK) RTNVAR(&DOW)
RTVSYSVAL SYSVAL(QDAY) RTNVAR(&DIA)
RTVSYSVAL SYSVAL(QMONTH) RTNVAR(&MES)
RTVSYSVAL SYSVAL(QYEAR) RTNVAR(&ANIO)
CHGVAR VAR(&FECHA) VALUE('01' *TCAT &MES *TCAT +
'20' *TCAT &ANIO)
CHGVAR VAR(&NDIA) VALUE(&DIA)
CHGVAR VAR(&HOY) VALUE( '20' *TCAT &ANIO *TCAT +
&MES *TCAT &DIA)
CRTLIB LIB(BACKUPSAV) TEXT('Biblioteca de Backup')
MONMSG MSGID(CPF2111)
CLRLIB LIB(BACKUPSAV)
/* Borro los archivos SAVF y 7z que hayan quedado */
QSH CMD('/QOpenSys/usr/bin/sh -c " +
rm /home/backupsav/*.7z"')
QSH CMD('/QOpenSys/usr/bin/sh -c " +
rm /home/backupsav/*.savf"')
/* Creo el archivo SAVF con perfiles de usuarios */
CRTSAVF FILE(BACKUPSAV/SAVSECDTA) TEXT('Seguridad')
SAVSECDTA DEV(*SAVF) SAVF(BACKUPSAV/SAVSECDTA) +
DTACPR(*NO) COMPACT(*NO)
/* Muevo el archivo SAVF al IFS */
QSH CMD('/QOpenSys/usr/bin/sh -c " +
mv /QSYS.LIB/BACKUPSAV.LIB/SAVSECDTA.FILE +
/home/backupsav/SAVSECDTA.savf"')
/* Comprimo el archivo SAVF */
CHGVAR VAR(&zipCMD) VALUE('/QOpenSys/usr/bin/sh -c " +
7za a -p' *tcat +
&ENCKEY *BCAT '/home/backupsav/savsecdta.7z +
/home/backupsav/savsecdta.savf"')
QSH CMD(&ZIPCMD)
/* Borro el archivo SAVF */
QSH CMD('/QOpenSys/usr/bin/sh -c " +
rm /home/backupsav/SAVSECDTA.savf"')
MONMSG MSGID(CPF0000)
/* Creo el directorio remoto con la fecha */
CHGVAR VAR(&SSHCMD) VALUE('ssh -p 443 -i +
/home/ituser1/.ssh/id_rsa +
ituser1@mysshserver.com "mkdir +
-p /mnt/USB1/BACKUP/' +
*TCAT &HOY *TCAT '"')
QSH CMD(&SSHCMD)
MONMSG MSGID(CPF0000)
/* Transfiero el archivo en background */
CHGVAR VAR(&SCPCMD) VALUE('scp -P 443 -i +
/home/ituser1/.ssh/id_rsa +
/home/backupsav/savsecdta.7z +
ituser1@mysshserver.com:/mnt/USB1/BA+
CKUP/' *TCAT &HOY *TCAT '/ &')
QSH CMD(&SCPCMD)
MONMSG MSGID(CPF0000)
LEE: RCVF
MONMSG MSGID(CPF0864) EXEC(GOTO CMDLBL(FIN))
CRTSAVF FILE(BACKUPSAV/&ODOBNM) TEXT(&ODOBTX)
MONMSG MSGID(CPF0000)
IF COND((&DOW = '*MON') *OR (&NDIA=1)) THEN( +
SAVLIB LIB(&ODOBNM) +
DEV(*SAVF) SAVF(BACKUPSAV/&ODOBNM) +
SAVACT(*LIB) ACCPTH(*YES) DTACPR(*NO) +
COMPACT(*NO) )
ELSE CMD( +
SAVCHGOBJ OBJ(*ALL) LIB(&ODOBNM) DEV(*SAVF) +
REFDATE(&FECHA) REFTIME(000000) +
SAVF(BACKUPSAV/&ODOBNM) SAVACT(*LIB) +
ACCPTH(*YES) DTACPR(*NO) COMPACT(*NO))
/* MUEVO el archivo SAVF al IFS */
CHGVAR VAR(&ZIPCMD) VALUE('/QOpenSys/usr/bin/sh -c " +
mv /QSYS.LIB/BACKUPSAV.LIB/' *TCAT &ODOBNM +
*TCAT '.FILE /home/backupsav/' *TCAT +
&ODOBNM *TCAT '.savf"')
QSH CMD(&zipCMD)
/* Comprimo con 7zip y clave el archivo SAVF */
CHGVAR VAR(&ZIPCMD) VALUE('/QOpenSys/usr/bin/sh -c " +
7za a -p' *tcat +
&ENCKEY *BCAT '/home/backupsav/' *TCAT +
&ODOBNM *TCAT '.7z /home/backupsav/' *TCAT +
&ODOBNM *TCAT '.savf"')
QSH CMD(&zipCMD)
/* Borro el archivo SAVF */
CHGVAR VAR(&ZIPCMD) VALUE('/QOpenSys/usr/bin/sh -c " +
rm /home/backupsav/' +
*tcat &ODOBNM *TCAT '.savf"')
QSH CMD(&zipCMD)
/* Transfiero el archivo en background */
CHGVAR VAR(&SCPCMD) VALUE('scp -P 443 -i +
/home/ituser1/.ssh/id_rsa +
/home/backupsav/' *TCAT &ODOBNM *TCAT '.7z +
ituser1@mysshserver.com:/mnt/USB1/BA+
CKUP/' *TCAT &HOY *TCAT '/ &')
QSH CMD(&SCPCMD)
MONMSG MSGID(CPF0000)
GOTO CMDLBL(LEE)
FIN: ENDPGM
Espero que sea de utilidad
En lugar de armar un script de FTP, simplemente usa SCP para transferir archivos. Esto permite hacer una conexión sin depender de una password, la información viaja de forma segura, y el archivo es encriptado antes de ser enviado.
Necesitaremos tener instalado el 5733-SC1 (Portable Utilities) para contar con el comando SCP, un servidor que soporte SSH donde enviaremos el archivo, y la generación de la clave pública y clave privada para transferir sin necesidad de password.
El CLLE es un poco extenso, pero simple de seguir.
Los respaldos se hacen completos el primer día del mes y los lunes, e incrementales el resto de los días.
Se requiere crear la DTAARA BKP7ZPSWD con la llave de encripción. En este caso es una llave de 64 caracteres.
También necesitaremos el archivo BKPLIB que tiene la estructura de la salida de DSPOBJD pero en ODOBNM tendremos la lista de bibliotecas a respaldar.
Obviamente el servidor SSH debe ser visto desde el servidor IBM i (iSeries) donde tengamos el script.
PGM
DCL VAR(&ENCKEY) TYPE(*CHAR) LEN(64)
DCL VAR(&zipCMD) TYPE(*CHAR) LEN(256)
DCL VAR(&SSHCMD) TYPE(*CHAR) LEN(256)
DCL VAR(&SCPCMD) TYPE(*CHAR) LEN(256)
dcl var(&FECHA) type(*CHAR) LEN(8)
DCL var(&HOY) type(*CHAR) LEN(8)
DCL VAR(&DIA) TYPE(*CHAR) LEN(2)
DCL VAR(&NDIA) TYPE(*DEC) LEN(2 0)
DCL VAR(&MES) TYPE(*CHAR) LEN(2)
DCL VAR(&ANIO) TYPE(*CHAR) LEN(2)
DCL VAR(&DOW) TYPE(*CHAR) LEN(4)
DCLF FILE(MYLIB/BKPLIB)
RTVDTAARA DTAARA(MYLIB/BKP7ZPSWD *ALL) +
RTNVAR(&ENCKEY)
RTVSYSVAL SYSVAL(QDAYOFWEEK) RTNVAR(&DOW)
RTVSYSVAL SYSVAL(QDAY) RTNVAR(&DIA)
RTVSYSVAL SYSVAL(QMONTH) RTNVAR(&MES)
RTVSYSVAL SYSVAL(QYEAR) RTNVAR(&ANIO)
CHGVAR VAR(&FECHA) VALUE('01' *TCAT &MES *TCAT +
'20' *TCAT &ANIO)
CHGVAR VAR(&NDIA) VALUE(&DIA)
CHGVAR VAR(&HOY) VALUE( '20' *TCAT &ANIO *TCAT +
&MES *TCAT &DIA)
CRTLIB LIB(BACKUPSAV) TEXT('Biblioteca de Backup')
MONMSG MSGID(CPF2111)
CLRLIB LIB(BACKUPSAV)
/* Borro los archivos SAVF y 7z que hayan quedado */
QSH CMD('/QOpenSys/usr/bin/sh -c " +
rm /home/backupsav/*.7z"')
QSH CMD('/QOpenSys/usr/bin/sh -c " +
rm /home/backupsav/*.savf"')
/* Creo el archivo SAVF con perfiles de usuarios */
CRTSAVF FILE(BACKUPSAV/SAVSECDTA) TEXT('Seguridad')
SAVSECDTA DEV(*SAVF) SAVF(BACKUPSAV/SAVSECDTA) +
DTACPR(*NO) COMPACT(*NO)
/* Muevo el archivo SAVF al IFS */
QSH CMD('/QOpenSys/usr/bin/sh -c " +
mv /QSYS.LIB/BACKUPSAV.LIB/SAVSECDTA.FILE +
/home/backupsav/SAVSECDTA.savf"')
/* Comprimo el archivo SAVF */
CHGVAR VAR(&zipCMD) VALUE('/QOpenSys/usr/bin/sh -c " +
7za a -p' *tcat +
&ENCKEY *BCAT '/home/backupsav/savsecdta.7z +
/home/backupsav/savsecdta.savf"')
QSH CMD(&ZIPCMD)
/* Borro el archivo SAVF */
QSH CMD('/QOpenSys/usr/bin/sh -c " +
rm /home/backupsav/SAVSECDTA.savf"')
MONMSG MSGID(CPF0000)
/* Creo el directorio remoto con la fecha */
CHGVAR VAR(&SSHCMD) VALUE('ssh -p 443 -i +
/home/ituser1/.ssh/id_rsa +
ituser1@mysshserver.com "mkdir +
-p /mnt/USB1/BACKUP/' +
*TCAT &HOY *TCAT '"')
QSH CMD(&SSHCMD)
MONMSG MSGID(CPF0000)
/* Transfiero el archivo en background */
CHGVAR VAR(&SCPCMD) VALUE('scp -P 443 -i +
/home/ituser1/.ssh/id_rsa +
/home/backupsav/savsecdta.7z +
ituser1@mysshserver.com:/mnt/USB1/BA+
CKUP/' *TCAT &HOY *TCAT '/ &')
QSH CMD(&SCPCMD)
MONMSG MSGID(CPF0000)
LEE: RCVF
MONMSG MSGID(CPF0864) EXEC(GOTO CMDLBL(FIN))
CRTSAVF FILE(BACKUPSAV/&ODOBNM) TEXT(&ODOBTX)
MONMSG MSGID(CPF0000)
IF COND((&DOW = '*MON') *OR (&NDIA=1)) THEN( +
SAVLIB LIB(&ODOBNM) +
DEV(*SAVF) SAVF(BACKUPSAV/&ODOBNM) +
SAVACT(*LIB) ACCPTH(*YES) DTACPR(*NO) +
COMPACT(*NO) )
ELSE CMD( +
SAVCHGOBJ OBJ(*ALL) LIB(&ODOBNM) DEV(*SAVF) +
REFDATE(&FECHA) REFTIME(000000) +
SAVF(BACKUPSAV/&ODOBNM) SAVACT(*LIB) +
ACCPTH(*YES) DTACPR(*NO) COMPACT(*NO))
/* MUEVO el archivo SAVF al IFS */
CHGVAR VAR(&ZIPCMD) VALUE('/QOpenSys/usr/bin/sh -c " +
mv /QSYS.LIB/BACKUPSAV.LIB/' *TCAT &ODOBNM +
*TCAT '.FILE /home/backupsav/' *TCAT +
&ODOBNM *TCAT '.savf"')
QSH CMD(&zipCMD)
/* Comprimo con 7zip y clave el archivo SAVF */
CHGVAR VAR(&ZIPCMD) VALUE('/QOpenSys/usr/bin/sh -c " +
7za a -p' *tcat +
&ENCKEY *BCAT '/home/backupsav/' *TCAT +
&ODOBNM *TCAT '.7z /home/backupsav/' *TCAT +
&ODOBNM *TCAT '.savf"')
QSH CMD(&zipCMD)
/* Borro el archivo SAVF */
CHGVAR VAR(&ZIPCMD) VALUE('/QOpenSys/usr/bin/sh -c " +
rm /home/backupsav/' +
*tcat &ODOBNM *TCAT '.savf"')
QSH CMD(&zipCMD)
/* Transfiero el archivo en background */
CHGVAR VAR(&SCPCMD) VALUE('scp -P 443 -i +
/home/ituser1/.ssh/id_rsa +
/home/backupsav/' *TCAT &ODOBNM *TCAT '.7z +
ituser1@mysshserver.com:/mnt/USB1/BA+
CKUP/' *TCAT &HOY *TCAT '/ &')
QSH CMD(&SCPCMD)
MONMSG MSGID(CPF0000)
GOTO CMDLBL(LEE)
FIN: ENDPGM
Espero que sea de utilidad