View Full Version : CL Text-Datei erstellen/modifizieren
KingofKning
12-05-16, 11:57
Hallo *all,
ich greife mal wieder das Thema Sicherung per FTP auf.
Dabei stoße ich auf die Problematik den FTP variabel zu gestalten.
Zur Zeit benutze ich eine Textdatei mit folgenden Inhalt:
user xx yy
cd TRANSFER
lcd TRANSFER
QUOTE RCMD CLRSAVF FILE(TRANSFER/TRANSFER)
bin
put transfer
QUOTE RCMD CALL TRANSFER/RSTGEL
QUIT
Jetzt möchte ich z.B. Transfer durch einen Variablen Namen ersetzen.
Beim ersten Nachdenken bin ich noch auf keinen Lösungsansatz gestoßen.
Für Hinweise dankbar.
GG
Versuch es einmal damit (habe ich mal im Dezember 2005 geschrieben und ist immer noch im Einsatz):
Beispiel:
SCRFTP RMTSYS(&SERVER) USER(&USER) PASSWORD(&PWD) +
SCRIPT(&FTPPFAD ('del ' *CAT &TMPNAME) +
'namefmt 1' 'sendepsv 0' ('lcd ' *CAT +
&LCLPFAD) ('put ' *CAT &TMPNAME) ('ren ' +
*CAT &TMPNAME *BCAT &ORGNAME)) +
LOG(*OUTFILE) OUTFILE(USMOD_16/XHYDRA1) +
COMPARE('226 Transfer complete.')
MONMSG MSGID(CPF0000) EXEC(CHGVAR VAR(&ERR) +
VALUE('1'))
Kommando SCRFTP
CMD PROMPT('Srcipting FTP')
PARM KWD(RMTSYS) TYPE(*CHAR) LEN(256) +
SPCVAL((*INTNETADR *INTNETADR)) MIN(1) +
EXPR(*YES) VARY(*YES *INT2) +
PROMPT('Fernes System')
PARM KWD(USER) TYPE(*CHAR) LEN(30) MIN(1) +
EXPR(*YES) VARY(*YES *INT2) +
PROMPT('Benutzer')
PARM KWD(PASSWORD) TYPE(*CHAR) LEN(30) MIN(1) +
EXPR(*YES) VARY(*YES *INT2) +
DSPINPUT(*PROMPT) PROMPT('Kennwort')
PARM KWD(SCRIPT) TYPE(*CHAR) LEN(80) MIN(1) +
MAX(100) EXPR(*YES) INLPMTLEN(32) +
PROMPT('Auszufhrende FTP-Befehle')
PARM KWD(LOG) TYPE(*CHAR) LEN(10) RSTD(*YES) +
DFT(*PRINT) VALUES(*PRINT *OUTFILE) +
EXPR(*YES) PROMPT('Protokoll')
PARM KWD(OUTFILE) TYPE(FILE) DFT(*NONE) +
SNGVAL((*NONE)) PROMPT('Protokolldatei')
PARM KWD(COMPARE) TYPE(*CHAR) LEN(80) DFT(*NONE) +
SPCVAL((*NONE)) EXPR(*YES) VARY(*YES +
*INT2) PROMPT('Vergleichszeichenfolge')
PARM KWD(INTNETADR) TYPE(*CHAR) LEN(16) VARY(*YES +
*INT2) PMTCTL(*PMTRQS) +
PROMPT('Internet-Adresse')
PARM KWD(CCSID) TYPE(*DEC) LEN(5 0) DFT(*DFT) +
RANGE(1 65533) SPCVAL((*DFT 0)) +
PMTCTL(*PMTRQS) PROMPT(CCSID)
PARM KWD(PORT) TYPE(*DEC) LEN(5 0) DFT(*DFT) +
RANGE(1 65535) SPCVAL((*DFT 21) (*SECURE +
990)) PMTCTL(*PMTRQS) PROMPT('Port')
PARM KWD(SECCNN) TYPE(*CHAR) LEN(10) RSTD(*YES) +
DFT(*DFT) SPCVAL((*DFT) (*NONE) (*SSL) +
(*IMPLICIT)) PMTCTL(*PMTRQS) +
PROMPT('Sichere Verbindung')
PARM KWD(DTAPROT) TYPE(*CHAR) LEN(10) RSTD(*YES) +
DFT(*DFT) SPCVAL((*DFT) (*CLEAR) +
(*PRIVATE)) PMTCTL(*PMTRQS) +
PROMPT('Datenschutz')
FILE: QUAL TYPE(*NAME) LEN(10)
QUAL TYPE(*NAME) LEN(10) PROMPT('Bibliothek')
CLP für SCRFTP
PGM PARM(&RMTSYS &USER &PASSWORD &SCRIPT &LOG +
&OUTFILE &COMPARE &INTNETADR &CCSID &PORT +
&SECCNN &DTAPROT)
DCL VAR(&RMTSYS) TYPE(*CHAR) LEN(258)
DCL VAR(&USER) TYPE(*CHAR) LEN(32)
DCL VAR(&PASSWORD) TYPE(*CHAR) LEN(32)
DCL VAR(&SCRIPT) TYPE(*CHAR) LEN(2000)
DCL VAR(&LOG) TYPE(*CHAR) LEN(10)
DCL VAR(&OUTFILE) TYPE(*CHAR) LEN(20)
DCL VAR(&COMPARE) TYPE(*CHAR) LEN(82)
DCL VAR(&INTNETADR) TYPE(*CHAR) LEN(16)
DCL VAR(&CCSID) TYPE(*DEC) LEN(5)
DCL VAR(&PORT) TYPE(*DEC) LEN(5)
DCL VAR(&SECCNN) TYPE(*CHAR) LEN(10)
DCL VAR(&DTAPROT) TYPE(*CHAR) LEN(10)
DCL VAR(&MSGID) TYPE(*CHAR) LEN(7)
DCL VAR(&MSGF) TYPE(*CHAR) LEN(10)
DCL VAR(&MSGL) TYPE(*CHAR) LEN(10)
DCL VAR(&MSGDTA) TYPE(*CHAR) LEN(512)
DCL VAR(&SCRINP) TYPE(*CHAR) LEN(10) +
VALUE(SCRFTPINP)
DCL VAR(&SCROUT) TYPE(*CHAR) LEN(10) +
VALUE(SCRFTPOUT)
MONMSG MSGID(CPF0000) EXEC(GOTO CMDLBL(FEHLER))
/* BEREINIGEN INPUT-DATEI */
DLTF FILE(QTEMP/&SCRINP)
MONMSG MSGID(CPF0000) EXEC(DO)
RCVMSG MSGTYPE(*EXCP)
ENDDO
/* BEREINIGEN OUTPUT-DATEI */
DLTF FILE(QTEMP/&SCROUT)
MONMSG MSGID(CPF0000) EXEC(DO)
RCVMSG MSGTYPE(*EXCP)
ENDDO
/* ERSTELLEN DATEIEN */
CRTPF FILE(QTEMP/&SCRINP) RCDLEN(80)
CRTPF FILE(QTEMP/&SCROUT) RCDLEN(80)
/* šBERSCHREIBUNGEN SETZEN */
OVRDBF FILE(INPUT) TOFILE(QTEMP/&SCRINP) +
OVRSCOPE(*CALLLVL)
OVRDBF FILE(OUTPUT) TOFILE(QTEMP/&SCROUT) +
OVRSCOPE(*CALLLVL)
/* PROGRAMM-AUSFšHRUNG */
CALL PGM(SCRFTPX) PARM(&RMTSYS &USER &PASSWORD +
&SCRIPT &LOG &OUTFILE &COMPARE &INTNETADR +
&CCSID &PORT &SECCNN &DTAPROT)
IF COND(&LOG = '*PRINT') THEN(DO)
OVRPRTF FILE(QSYSPRT) SPLFNAME(SCRFTP) +
OPNSCOPE(*ACTGRPDFN)
CPYF FROMFILE(QTEMP/&SCROUT) TOFILE(QSYSPRT)
ENDDO
IF COND(&LOG = '*OUTFILE') THEN(DO)
CHKOBJ OBJ(%SST(&OUTFILE 11 10)/%SST(&OUTFILE 1 +
10)) OBJTYPE(*FILE) MBR(*FIRST) AUT(*USE)
MONMSG MSGID(CPF0000) EXEC(DO)
RCVMSG MSGTYPE(*EXCP)
CRTPF FILE(%SST(&OUTFILE 11 10)/%SST(&OUTFILE 1 +
10)) RCDLEN(80) TEXT('Output from SCRFTP')
ENDDO
CPYF FROMFILE(QTEMP/&SCROUT) TOFILE(%SST(&OUTFILE +
11 10)/%SST(&OUTFILE 1 10)) MBROPT(*ADD) +
FMTOPT(*NOCHK)
ENDDO
RCLRSC
IF COND(%BIN(&COMPARE 1 2) = 7 *AND +
%SST(&COMPARE 3 7) = 'CPF9898') THEN(DO)
SNDPGMMSG MSGID(CPF9898) MSGF(QCPFMSG) +
MSGDTA('Vergleichszeichenfolge nicht +
gefunden') TOPGMQ(*PRV) MSGTYPE(*ESCAPE)
ENDDO
SNDPGMMSG MSGID(CPF9897) MSGF(QCPFMSG) +
MSGDTA('FTP-Script erfolgreich +
ausgefhrt') TOPGMQ(*PRV) MSGTYPE(*COMP)
RETURN
FEHLER:
RCVMSG MSGTYPE(*EXCP) RMV(*NO) MSGDTA(&MSGDTA) +
MSGID(&MSGID) MSGF(&MSGF) MSGFLIB(&MSGL)
RCLRSC
SNDPGMMSG MSGID(&MSGID) MSGF(&MSGL/&MSGF) +
MSGDTA(&MSGDTA) TOPGMQ(*PRV) MSGTYPE(*ESCAPE)
ENDPGM
RPGLE für SCRFTPX
h
fINPUT o f 80 disk usropn
foutput if f 80 disk usropn
d RMTSYS s 256 varying
d USER s 30 varying
d PASSWORD s 30 varying
d SCRIPT ds
d AnzZl 5I 0
d ScrLin 80 dim(100)
d LOG s 10
d OUTFILE s 20
d COMPARE s 80 varying
d INTNETADR s 16 varying
d CCSID s 5p 0
d PORT s 5p 0
d SECCNN s 10
d DTAPROT s 10
d AKT s 5I 0
d WKSATZ ds 80
d QCMD s 256
d QCMDL s 15p 5 inz(256)
iOUTPUT bb
i 1 80 WKPROT
c *entry plist
c parm RMTSYS
c parm USER
c parm PASSWORD
c parm SCRIPT
c parm LOG
c parm OUTFILE
c parm COMPARE
c parm INTNETADR
c parm CCSID
c parm PORT
c parm SECCNN
c parm DTAPROT
c open INPUT
c eval WKSATZ = USER + ' ' + PASSWORD
c write INPUT WKSATZ
c do AnzZl AKT
c eval WKSATZ = ScrLin(AKT)
c write INPUT WKSATZ
c enddo
c eval WKSATZ = 'quit'
c write INPUT WKSATZ
c close INPUT
c* aufrufen FTP
c if RMTSYS <> '*INTNETADR'
c eval QCMD = 'FTP RMTSYS(''' + RMTSYS + ''')'
c else
c eval QCMD = 'FTP RMTSYS(' + RMTSYS + ')'
c + ' INTNETADR(''' + INTNETADR
c + ''')'
c endif
c if CCSID <> *zero
c eval QCMD = %trim(QCMD)
c + ' CCSID(' + %char(CCSID) + ')'
c endif
c eval QCMD = %trim(QCMD)
c + ' PORT(' + %char(PORT) + ')'
c + ' SECCNN(' + %trim(SECCNN) + ')'
c + ' DTAPROT(' + %trim(DTAPROT) + ')'
c monitor
c call 'QCMDEXC'
c parm QCMD
c parm QCMDL
c on-error *all
c eval COMPARE = 'CPF9898'
c eval *inlr = *off
c return
c endmon
c if COMPARE <> '*NONE'
c and COMPARE <> *blank
c open OUTPUT
c do *hival
c read OUTPUT
c if %eof
c leave
c endif
c if %scan(%trim(COMPARE):WKPROT) > *zero
c eval COMPARE = 'OK'
c leave
c endif
c enddo
c close OUTPUT
c if COMPARE <> 'OK'
c eval COMPARE = 'CPF9898'
c endif
c endif
c eval *inlr = *off
c return
KingofKning
12-05-16, 12:30
Danke,
werde ich mal analysieren.
GG
Wenn das Eingabeskript dynamisch sein soll, einfach die betreffende Teildatei per Programm erstellen ...
c open INPUT
c eval WKSATZ = USER + ' ' + PASSWORD
c write INPUT WKSATZ
c do AnzZl AKT
c eval WKSATZ = ScrLin(AKT)
c write INPUT WKSATZ
c enddo
c eval WKSATZ = 'quit'
c write INPUT WKSATZ
c close INPUT
Nimm einfach die 3 Quellen, erstelle die Objekte und du hast ein dynamisches SCRFTP-Kommando mit dem du bis zu 100 Befehle (du kannst natürlich auch erweitern auf 300) in einem FTP ausführen kannst.
Der Quit am Ende wird bei mir ja schon eingebaut.