FLUC-Utility

Das FLUC-Utility als Batchprogramm ermöglicht es, die Fähigkeiten des FLUC-Unterprogramms über eine einfach zu bedienende Kommandozeile in den jeweiligen Scriptsprachen/Shells (BAT, BASH, PERL, JCL, …) der verschiedenen Plattformen einbinden zu können. Es stellt somit die jeweilige plattformabhängige Ausprägung des FLUC für die Behandlung von ganzen Dateien, Streams , Tabellen oder anderen Datenquellen in Form eines Kommandozeilenprogramms für die Automatisierung von Prozessen dar. Es ist das Tool, welches primär für die Konvertierung von Datenbeständen genutzt wird, ohne dass man hierfür über eine temporäre FLAMFILE gehen muss. Der FLUC wird hierbei ab der Version 5 über die Kommandos CONV, XCNV, DIFF und INFO der Frankenstein-Limes-Command-Line (FLCL) angeboten.

 

Der Nutzen

  • Plattform- und länderübergreifende Konvertierung von Datei- und Datenformaten (Internationalisierung) mit lokalen oder remoten Zugriff
  • Unterstützt verschiedene IO-Verfahren, Codex, Verschlüsselungsmethoden, Komprimierungsverfahren, die Zeichensatzwandlung sowie die Wandlung zwischen logische Datenformaten
  • Automatische Erkennung des Komprimierungsverfahrens (GZIP, BZIP2, XZ, ...) beim Lesen von Textdaten. Damit können komprimierte Texte und nicht komprimierte Texte transparent behandelt werden.
  • Der Datenaustausch zwischen Großrechnern (SystemZ (VSE/ZOS), BS2000 (OSD), …) und der distributed Welt (WINDOWS, UNIX, …) wird hierdurch wesentlich vereinfacht oder oft erst möglich gemacht.
  • Einfache und schnelle Integration in komplexe Batchabläufe für eine maximale Automation
 

 

Das Produkt

  • Einfach zu bedienende und hoch intelligente Kommandozeile mit interaktiver Hilfe, Konfigurations- und Property-Verwaltung inklusive Multi-Mandaten-Fähigkeit
  • Byte-, block-, satz- und textorientierter IO
  • Liest und schreibt FLAM4-Files und ZIP/Zip64-Archive sowie TAR-Balls
  • Unterstützt
    • Mehrfaches Schreiben
    • Remote-Zugriff per SSH
    • HEX (BASE16), BASE32/64 und andere Codierungen
    • OpenPGP, z/OS-EF und andere Verschlüsselungen
    • GZIP, LZMA, BZIP2, LZIP, XZ und andere Komprimierungen
    • ZIP, TAR, FLAM4 und andere Archivformate
    • Zeichensatzkonvertierung zw. ASCII, EBCDIC und UNICODE inkl. Casemapping, Substitution, Transliteration, mit professionellen Reporting sowie User Defined Subsets (String.Latin), NFD/NFC Normalisierung, Eingebehilfe von Codepoints in singel-byte Zeichensatzen (UNICODE support für 3270 Anwendungen) uvm.
    • Generierung und Verifizierung von Checksummen (MD5/SHA1/SHA256/SHA512)
    • Generierung und Verifzierung von Signaturen (OpenPGP detached signatures)
    • Binäre, Text, Table, XML und weitere Formatierungen
  • auf jeder Plattform deren jeweilige Dateiorganisationen und Satzformate
  • Verfügbar auf einer großer Bandbreite von Plattformen: AIX, HP-UX, Oracle Solaris, Linux, z/OS, Windows, z/OS, VSE, BS2000, ….
 

FLINFO, FLVIEW, FLTEXT und FLVEDIT

Als Teil des FLUC bieten wir für ISPF unter z/OS verschiedene Line-Commands an:

Mit FLINFO (entspricht flcl info get.file=&DSN) kann man sich alle Dateiattribute (Dateiformat, Dateigröße, Organisation, Record-Format, Record-Länge, usw.) einer Datei anschauen. Hierzu gehören auch die Memberlisten von konkatenierten FLAM-, GZIP-, BZIP2- oder XZ-Dateien. Neben dem Dateiformat und dem ermittelten Zeichensatz zeigen wir u.a. auch die ermittelten Delimite, Padding-Zeichen und Base-Encodings an.

 flinfo_small.png

FLVIEW nutzt das CONV Kommando des FLUC (flcl conv read.file=&DSN write.record()) um eine beliebige Datei automatisiert zu lesen (XML, Text, Binary) und in klarer Form anzuzeigen, so dass man den eigentlichen Inhalt in einer wohl formatierten Form ansehen kann. Hier als Beispiel die CLIST für z/OS.

PROC 1 DSN
/*Echo off                                                      */
CONTROL NOFLUSH NOMSG /* SYMLIST LIST CONLIST */
/*Determin envars                                               */
ISPEXEC VGET (FLLOAD ZUSER)
/*Suffix for temp files                                         */
SET &SUF = &SUBSTR(4:5,&SYSTIME)&SUBSTR(7:8,&SYSTIME)
/*Temp command DD name                                          */
SET &CDD = CTMP&SUF
/*Temp command DSN                                              */
SET &CMD = &ZUSER..FLCMD.TMP&SUF
/*Temp output file name                                         */
SET &OUT = &ZUSER..FLOUT.TMP&SUF
/*Determine FLAM LOAD and CALL of FLCL                          */
IF &STR(&FLLOAD) = &Z OR &STR(&FLLOAD) = &STR(*) THEN +
    SET &FLCALL = &STR(CALL *(FLCL) )
ELSE SET &FLCALL = &STR(CALL '&FLLOAD(FLCL)' )
/*Delete command file                                           */
DEL '&CMD'
/*Allocate command dataset                                      */
ALLOC DSN('&CMD') DD(&CDD) NEW REUSE +
DSORG(PS) LRECL(256) BLKSIZE(0) RECFM(V,B) SPACE(1,1) TRACKS
/*Open command file, an write parameter string                  */
OPENFILE &CDD OUTPUT
/*Write conv command to command file                            */
SET &ODCP = &STR(FALLOC(ORGA=SEQ,RECF=VB,RECL=32760))
SET &MODE = &STR(RECM=CUT,CHRM=SUB,SYSTAB=ICONV)
SET &READ = &STR(READ.AUTO(FILE=&DSN))
SET &&CDD = &STR(&READ)
PUTFILE &CDD
SET &WRIT = &STR(WRITE.RECORD(FILE='&OUT' &ODCP &MODE))
SET &&CDD = &STR(&WRIT)
PUTFILE &CDD
SET &MESG = &STR(MESSAGE(ERROR,ERRTRACE))
SET &&CDD = &STR(&MESG)
PUTFILE &CDD
SET &LOGI = &STR(LOGGING.STREAM(FORMAT=DIALOG,IDENT='FLVIEW'))
SET &&CDD = &STR(&LOGI)
PUTFILE &CDD
SET &FLMPAR = &STR(&READ &WRIT &MESG &LOGI)
/*Close parameter file                                          */
CLOSFILE &CDD
/*Set flcl parameter of conv command to parameter file          */
SET &FLMCMD = &STR(CONV)
SET &FLMPRM = &STR(&FLMCMD=DD:&CDD)
/*Call flcl with parameter file                                 */
&STR(&FLCALL) '&FLMPRM'
/*Get last errorcode                                            */
SET &FLMERR = &LASTCC
/*Only if success browse out-file                               */
ISPEXEC CONTROL ERRORS RETURN
IF &FLMERR = 0 THEN DO
   ISPEXEC BROWSE DATASET('&OUT')
   SET &BER = &LASTCC
   IF &BER = 12 THEN DO
      SET &FLMERR = &BER
      ISPEXEC SETMSG MSG(ISPG120)
   END
   ELSE IF &BER > 0 THEN DO
      SET &FLMERR = &BER
      ISPEXEC SETMSG MSG(ISRB011)
   END
END
ELSE DO
   ISPEXEC SETMSG MSG(FLM050)
END
ISPEXEC CONTROL ERRORS CANCEL
/*Free allocation and delete temp datasets                      */
FREE DD(&CDD)
DEL '&OUT'
DEL '&CMD'
EXIT CODE(&FLMERR)

Wenn man FLVIEW zum Beispiel im ISPF 3.4 auf eine Datei verwendet, wird der klare Inhalt der Datei im Browser angezeigt. Dies gilt für normale record-orientierte Datasets, VSAM-Files oder Dateien im USS (File Manager). Neben regulären Dateien, werden auch alle Arten von binär auf die Host übertragenen Dateien von Windows/Linux/... korrekt gelesen und in Records gewandelt. Hierzu gehören Text- und XML-Dateien (pretty printed) als auch GZIP-, BZIP2- und XZ-Dateien. Des Weiteren werden FLAMFILES (undefined, stream, text or record) richtig angezeigt. Selbst wenn das FLAM-Member eine GZIP-Datei ist, wird der Inhalt (XML, Text, Binary) der GZIP-Datei richtig dargestellt. Auf UNIX- und WINDOWS-Systemen werden die Daten nicht in Records, sondern in Text oder einen binären Dump gewandelt. Auf der Host steht diese Funktionalität als FLTEXT zur Verfügung. Es arbeitet wie FLVIEW nur das binäre Inhalte wie unter Windows und UNIX als HEX Dump ausgegeben werden.

Mit der Version 5.1.5 von FLAM haben wir FLVEDIT als Line-Command ergänzt. Mit diesem Kommando ist es zum Beispiel möglich ein GZIP-File mit XML-Daten in UTF-8 mit dem ISPF-Editor unter ISPF als EBCDIC-Records zu editieren und die geänderte Datei wieder als GZIP-File in UTF-8 mit Textdelimittern auf der Host wegzuschreiben. Hierfür haben wir das CONV Kommando der FLCL um einen sogenannten INVERSE Parameter ergänzt, welcher beim Lesen mit dem CONV das korrespondierende XCNV Kommando für das Schreiben aufbaut.

#                                            
INVERSE COMMAND FILE FOR:                    
                                             
CONV.READ.AUTO(                              
CONV.READ.AUTO.FILE=d'FALK.TEST.XSMU8GZW     
CONV.READ.AUTO)                              
CONV.WRITE.RECORD(                           
CONV.WRITE.RECORD.FILE=d'FALK.FLOUT1.TMP0353
CONV.WRITE.RECORD.FALLOC(                    
CONV.WRITE.RECORD.FALLOC.ORGANIZATION=SEQ    
CONV.WRITE.RECORD.FALLOC.RECFORMAT=VB        
CONV.WRITE.RECORD.FALLOC.RECLENGTH=d 32756   
CONV.WRITE.RECORD.FALLOC)                    
CONV.WRITE.RECORD.RECMODE=CUT                
CONV.WRITE.RECORD.CHRMODE=SUBSTITUTE
CONV.WRITE.RECORD.SYSTABLE=ICONV                
CONV.WRITE.RECORD.SUPPADDING=ON                 
CONV.WRITE.RECORD.INDSIZ=d-1                    
CONV.WRITE.RECORD)                              
CONV.MESSAGE(                                   
CONV.MESSAGE.ERROR=ON                           
CONV.MESSAGE.ERRTRACE=ON                        
CONV.MESSAGE.WARNING=ON                         
CONV.MESSAGE.INFO=ON                            
CONV.MESSAGE.STATISTIC=ON                       
CONV.MESSAGE)                                   
CONV.LOGGING.FILE(                              
CONV.LOGGING.FILE.NAME=d'FALK.FLOUT2.TMP0353    
CONV.LOGGING.FILE.FORMAT=DIALOG                 
CONV.LOGGING.FILE.IDENT=d'FLVEDIT               
CONV.LOGGING.FILE)                              
CONV.INVERSE=d'FALK.FLIVR.TMP0353              
                                                                       
PLEASE USE 'FLCL XCNV=THISFILE'                                         
#                                                                       
INP(SAV.FIL(                                                            
  FIO.REC(NAME='FALK.FLOUT1.TMP0353' RECFMT=VB RECLEN=32751)            
  CNV.CHR(FROM='IBM-1141')                                              
  CNV.BLK()                                                             
  FMT.XML()                                                             
))                                                                      
                                                                        
OUT(SAV.FIL(                                                            
  FMT.XML()                                                             
  CNV.CHR(TO='UTF-8')                                                   
  CNV.GZP(CMPLEV=AUTO MBRNAM='FALK.XMIT.PDS(XMLSOAPM).xml' COMENT='created with FLUCv5.0.33.6889 (www.flam.de)')
  CNV.BAS(METHOD=BASE64)                                                
  FIO.BLK(NAME='FALK.TEST.XSMU8GZW')                                    
))                                                                     
                                                                    
LOG(                                                                 
  DEST.FILE(IDENT='FLVEDIT' FORMAT=DIALOG NAME='FALK.FLOUT2.TMP0353')
  MESSAGE( ERROR ERRTRACE WARNING STATISTIC INFO )                   
)                                                                   

Beim Speichern der geänderten Datei kann man dieses INVERSE-Kommando im ISPF-Editor noch anpassen. So kann man zum Beispiel den Zeichensatz, die Delimitter, Kommentare oder das Encoding noch vor dem Wegschreiben ändern.