D.E.N.K. Endevor-Linux Interface ABS Goes Linux Johannes Radman 19.03.2012
Introduction AMOS Austria Software-Entwicklung ABS - Allianz Business System Client-Server/Portale Java C++ DB2/2 Host z/os PL1 C C++ DB2 Subversion Endevor 2
Introduction ABS Kunden Unternehmensgruppe Kunde seit Allianz Österreich Allianz Suisse Allianz Deutschland Mondial (Endausbau 27 Länder) Allianz SE Allianz Russland Allianz France 1995 2000 2006 2010 2010 2012 3
ABS Entwicklungsumgebungen ABS Core Allianz Österreich Allianz SE Mondial -> Linux -> Linux Allianz Russland Allianz France Inttest Fachtest Produktion E I R F V P 4
ABS Goes Linux ABS Plattformunabhängig IBM Lizenzkosten Pilot 2010 HP / Microfocus PL/I Source-Anpassungen Performance Tests HP-Hardware Red Hat Linux Microfocus Enterprise-Server Kostenreduktion Performancegewinn Destabilisierung 5
Source-Code-Umstellung Enterprise PL/I for z/os vs. Micro Focus Open PL/I..das können ein paar Schimpansen.. Umstellung tw. mittels PHP-Script (Judy) 1/3 der PL/1-Sourcen betroffen Umstellungsphase März 2011 November 2011 Compiler-Weiterentwicklung PKP Produktion: 3.Dezember 2011 6
Endevor-Umgebung unter Linux Integrationstest Fachtest Produktion /shared/endevor/ndvra/*/inttest/ /shared/endevor/ndvra/*/fachtest /shared/endevor/ndvra/*/prod Rexx Linux-Interface BPXBATCH via z/os Unix - langsam (SSH Randomizing Algorythmus Lösung: Krypto-Prozessor) -> AFT (Allianz-File-Transfer) Linux Shell-Scripts - ndvrgen.sh - ndvrmov.sh - ndvrdel.sh Perl Build Host vs. Linux 10% Endevor-Log 7
Generate-Prozessor //LINUXGEN EXEC PGM=IKJEFT01,MAXRC=8 //SYSPROC DD DSN=NDVRA.PROD.REXX,DISP=SHR //SYSPRINT DD SYSOUT=* //SYSTSPRT DD DSN=&&LINUXLST,DISP=(MOD,PASS),FREE=CLOSE //AFTIN DD DSN=&&ELMOUT,DISP=(OLD,DELETE),FREE=CLOSE //SYSTSIN DD * %NDVRLINX - &#LINUX - &C1USERID - &C1ACTION - &C1PRTYPE - &C1PRGRP - &C1ELEMENT - &PROJECT - &C1ELTYPE - &C1ST 8
Move-Prozessor //LINUXMOV EXEC PGM=IKJEFT01,MAXRC=8 //SYSPROC DD DSN=NDVRA.PROD.REXX,DISP=SHR //SYSPRINT DD SYSOUT=* //SYSTSPRT DD DSN=&&LINUXLST,DISP=(MOD,PASS),FREE=CLOSE //SYSTSIN DD * %NDVRLINX - &#LINUX - &C1USERID - &C1ACTION - &C1PRTYPE - &C1PRGRP - &C1ELEMENT - &PROJECT - &C1ELTYPE - &C1SSTAGE - &C1ST 9
Delete-Prozessor //LINUXDEL EXEC PGM=IKJEFT01,MAXRC=8 //SYSPROC DD DSN=NDVRA.PROD.REXX,DISP=SHR //SYSPRINT DD SYSOUT=* //SYSTSPRT DD DSN=&&LINUXLST,DISP=(MOD,PASS),FREE=CLOSE //SYSTSIN DD * %NDVRLINX - &#LINUX - &C1USERID - &C1ACTION - &C1PRTYPE - &C1PRGRP - &C1ELEMENT - &PROJECT - &C1ELTYPE - &C1ST 10
REXX-Interface PARSE VAR PARMS, ON_OFF USER ACTION PRCTYP PROCGRP ELE PROJECT TYP ENVNAME TOENV /* Linux-Interface mittels Endevor-Symbol #LINUX deaktivierbar */ IF ON_OFF <> 'ON' THEN RETURN 0 /* Wenn linux oder aft inaktiv sind ENDEVOR_RC von 12 auf 8 setzen */ ENDEVOR_RC = 12 /* Endevor Activity-Log */ LOGFILE='/shared/endevor/log/'PROJECT'.'ENVNAME'.'ACT'.'TYP'.'ELE'.'USER LINUX = 'AS-AE01:3335' CODEPAGE = 'IBM-1141/IBM-1252' ROOTPFAD ='/shared/endevor/' PARSE VAR PROJECT NDVR'.'SYSTEM 11
REXX-Interface TYP3 = TRANSLATE(SUBSTR(TYP,2,3)); SELECT WHEN TYP3 = 'PLI' THEN PARSE VALUE 'pl1 pli' WITH EXT DIR WHEN TYP3 = 'INC' THEN PARSE VALUE 'inc inc' WITH EXT DIR WHEN TYP3 = 'SQL' THEN PARSE VALUE 'sql sqldml' WITH EXT DIR WHEN TYP3 = 'UNL' THEN PARSE VALUE 'sql db2unl' WITH EXT DIR WHEN TYP3 = 'JCL' THEN PARSE VALUE 'jcl jcl' WITH EXT DIR WHEN TYP3 = 'HPP' THEN PARSE VALUE 'hpp hpp' WITH EXT DIR WHEN TYP3 = 'HXX' THEN PARSE VALUE 'h h' WITH EXT DIR WHEN TYP3 = 'HDB' THEN PARSE VALUE 'h h' WITH EXT DIR WHEN TYP3 = 'CXX' THEN PARSE VALUE 'c c' WITH EXT DIR WHEN TYP3 = 'CPP' THEN PARSE VALUE 'cpp cpp' WITH EXT DIR WHEN TYP = 'ADBLOAD' THEN PARSE VALUE 'sql db2load' WITH EXT DIR WHEN TYP = 'ADB2DDL' THEN PARSE VALUE 'sql db2ddl' WITH EXT DIR OTHERWISE RETURN 4 /* Typ wird nicht übertragen */ END 12
REXX-Interface WHEN PRCTYP = "GENERATE" THEN DO LISTFILE = ROOTPFAD'/'ENVNAME'/list/'ELE'.'DIR'.lst' /* Filetransfer, Codepage-Konvertierung */ QUEUE 'SEND 'LINUX 'DD:AFTIN', ROOTPFAD'/'ENVNAME'/'DIR'/'ELE'.'EXT CODEPAGE /* Generate-Interface */ QUEUE 'CMD 'LINUX '"ndvrgen.sh' ''''USER'''', ''''NDVR'''', ''''ELE'''', ''''DIR'''', ''''EXT'''', ''''TYP'''', ''''PROCGRP'''', ''''ENVNAME'''', ''''PFAD'''' ''''SYSTEM'''', ' >'''LOGFILE''' 2>&1"' END 13
REXX-Interface WHEN PRCTYP = "MOVE" THEN DO LISTFILE = ROOTPFAD'/'TOENV'/list/'ELE'.'DIR'.lst' /* Move-Interface */ QUEUE 'CMD 'LINUX '"ndvrmove.sh' ''''USER'''', ''''NDVR'''', ''''ELE'''', ''''DIR'''', ''''EXT'''', ''''TYP'''', ''''PROCGRP'''', ''''ROOTPFAD'''', ''''ENVNAME'''', ''''TOENV'''', ''''SYSTEM'''', '>'''LOGFILE''' 2>&1"' END 14
REXX-Interface WHEN PRCTYP = "DELETE" THEN DO /* Delete-Prozessor wird intern nach Move/Generate angestossen */ IF ACTION = "MOVE"! ACTION = "GENERATE" THEN LOGFILE = '/dev/null' /* Delete-Interface */ QUEUE 'CMD 'LINUX "ndvrdel.sh' ''''USER'''', ''''NDVR'''', ''''ELE'''', ''''DIR'''', ''''EXT'''', ''''ENVNAME'''', ''''PFAD'''', '>'''LOGFILE''' 2>&1"' END 15
REXX-Interface /* Log-/List-Files lesen */ IF PRCTYP <> "DELETE" THEN DO LOG = ALLOCF("32756 32760 VB 1 1 CYL LOG") LIST = ALLOCF("32756 32760 VB 5 5 CYL LIST") QUEUE 'RECEIVE 'LINUX 'DD:LOG "'LOGFILE'"' CP_STD QUEUE 'RECEIVE 'LINUX 'DD:LIST "'LISTFILE'" 'CP_STD END 16
REXX-Interface /* swap to alternate-id - C1DEFLTS RACFUID=ENDEVOR */ "ALLOC FILE(LGNT$$$I) DUMMY" "ALLOC FILE(LGNT$$$O) DUMMY" "EXECIO 0 DISKR LGNT$$$I (OPEN)" /* execute queued commands via AFT */ AFT_RC=AFTEX() /* swap to User-ID */ "EXECIO 0 DISKR LGNT$$$I (finis)" "EXECIO 0 DISKR LGNT$$$O (open)" "EXECIO 0 DISKR LGNT$$$O (finis)" "FREE FILE(LGNT$$$I)" "FREE FILE(LGNT$$$O)" 17
REXX-Interface IF AFT_RC > 4 THEN /* Abbruch Endevor Step - AFT-Error */ RETURN ENDEVOR_RC /* Returncode aus Linux-Script */ IF PRCTYP <> "DELETE" THEN DO "EXECIO * DISKR LOG (FINIS STEM LOG." LINUX_RC = '' DO I = LOG.0 TO 1 BY -1 WHILE DATATYPE(LINUX_RC) <> 'NUM' PARSE VAR LOG.I 'rc='linux_rc REST END IF LINUX_RC > 0! DATATYPE(LINUX_RC) <> 'NUM' THEN AFT_RC = 8 /* kein Prozessor-Abbruch bei Linux-Prozessor-Fehler */ RETURN AFT_RC END 18
Generate Prozessor Unix/BPXBATCH //* File übertragen */ //USSPUT EXEC PGM=IEBGENER,MAXRC=4 //SYSUT1 DD DSN=&&ELMOUT,DISP=(OLD,PASS),FREE=CLOSE //SYSUT2 DD PATH='/u/endevor/tmp/&OMVSFILE', // PATHDISP=(KEEP,KEEP),FILEDATA=TEXT, // PATHOPTS=(OWRONLY,OCREAT), // PATHMODE=(SIRWXU,SIRWXG,SIRWXO) //SYSPRINT DD SYSOUT=* //SYSIN DD * //* BPXBATCH unter alternate-id ENDEVOR */ //LINUXGEN EXEC PGM=IKJEFT01,MAXRC=0 //SYSPROC DD DSN=NDVRA.PROD.REXX,DISP=SHR //SYSPRINT DD SYSOUT=* //SYSTSPRT DD DSN=&&REXXLST,DISP=(MOD,PASS),FREE=CLOSE //STDOUT DD DSN=&&STDOUT,DISP=(MOD,PASS),FREE=CLOSE //STDERR DD DSN=&&STDERR,DISP=(MOD,PASS),FREE=CLOSE //SYSTSIN DD * %NDVRLINX... &OMVSFILE 19
Move/Delete Prozessor Unix/BPXBATCH //LINUXMOV EXEC PGM=IKJEFT01,MAXRC=0 //SYSPROC DD DSN=NDVRA.PROD.REXX,DISP=SHR //SYSPRINT DD SYSOUT=* //SYSTSPRT DD DSN=&&REXXLST,DISP=(MOD,PASS),FREE=CLOSE //STDOUT DD DSN=&&STDOUT,DISP=(MOD,PASS),FREE=CLOSE //STDERR DD DSN=&&STDERR,DISP=(MOD,PASS),FREE=CLOSE //SYSTSIN DD * %NDVRLINX... //LINUXDEL EXEC PGM=IKJEFT01,MAXRC=0 //SYSPROC DD DSN=NDVRA.PROD.REXX,DISP=SHR //SYSPRINT DD SYSOUT=* //SYSTSPRT DD DSN=&&REXXLST,DISP=(MOD,PASS),FREE=CLOSE //STDOUT DD DSN=&&STDOUT,DISP=(MOD,PASS),FREE=CLOSE //STDERR DD DSN=&&STDERR,DISP=(MOD,PASS),FREE=CLOSE //SYSTSIN DD * %NDVRLINX... 20
REXX-Interface Unix/BPXBATCH /* swap to alternate-id - C1DEFLTS RACFUID=ENDEVOR */ "ALLOC FILE(LGNT$$$I) DUMMY" "ALLOC FILE(LGNT$$$O) DUMMY" "EXECIO 0 DISKR LGNT$$$I (OPEN)" /* run BPXPATCH */ "BPXBATCH SH /u/gru2/ndvrunix.sh" parameter ZRC=RC IF ZRC > 0 THEN DO SAY "ERROR BPXBATCH RC="ZRC ZRC = 12 END /* swap to User-ID */ "EXECIO 0 DISKR LGNT$$$I (FINIS)" "EXECIO 0 DISKR LGNT$$$O (OPEN)" "EXECIO 0 DISKR LGNT$$$O (FINIS)" "FREE FILE(LGNT$$$I)" "FREE FILE(LGNT$$$O)" RETURN ZRC 21
Unix-Linux Interface case "$typ3" in PLI) ext=pl1; dir=pli;; INC) ext=inc; dir=inc;;... esac linux=endevor@as-ae01 # Zielumgebung sourcefile="/shared/endevor/$ndvr/$envname/$sys/$dir/$ele.$ext" # Linux Source if [ "$proctype" = "GENERATE" ]; then putlinuxfile "/u/endevor/tmp/$omvsfile" $sourcfile" # ICONV, SFTP ssh $linux bash -l ndvrgen.sh "$ele $dir $ext... " elif [ "$proctype" = "MOVE" ]; then ssh $linux bash -l ndvrmove.sh "$ele $dir $ext..." elif [ "$proctype" = "DELETE" ]; then ssh $linux bash -l ndvrdel.sh "$ele $dir $ext..." fi If [ "$proctype"!= "DELETE" ]; then getlinuxfile "$listfile" "/u/endevor/tmp/$omvsfile.$dir.lst" # SFTP, ICONV getlinuxfile "$logfile" "/u/endevor/tmp/$omvsfile.$dir.log" # SFTP, ICONV fi 22
Unix-Linux Interface # Codepage-Conversion, File nach Linux übertragen putlinuxfile() { iconv -f IBM-1141 -t IBM-1252 < "$1" >"$1.ascii" sftp -obatchmode=yes -b - "endevor@as-ae01"<<eof put "$1.ascii" "$2" bye EOF } # File von Linux übertragen, Codepage-Conversion, Ausgabe auf STDOUT getlinuxfile() { sftp -obatchmode=yes -b - "endevor@as-ae01" <<EOF get "$1" "$2.ascii" bye EOF [ $? -eq 0 ] && iconv -f IBM-1252 -t IBM-1141 < "$2.ascii" >"$2" [ $? -eq 0 ] && cat "$2" } 23
Linux Generate-Script # Build für Programme durchführen if [ "$ext" = pl1 ]; then mfpp... # Microfocus PL/I Preprozessor mfdb2... # Microfocus DB2 Preprozessor mfpli... # Microfocus PL/I Compiler cob... # Linker... elif [ "$ext" = "c" -o "$ext" = "cpp" ]; then db2 prep... # DB2 Preprozessor [ "$ext" = "c" ] && cc... # C Compiler [ "$ext" = "cpp" ] && g++... # C++ Compiler... else # nur Source Management fi 24
Linux Move-Script # Source und Output-Komponenten kopieren copydir="$dir list" If [[ "$dir" =~ '^(pli c cpp)$' ]]; then copydir="$copydir dbrm obj load debug" fi for i in $copydir ; do files=`find $pfad/$quellenv/$i/ -iname "$member.*" -type f` for file in $files; do cp -v $file $pfad/$zielenv/$i/ done Done 25
Linux Delete-Script # Source und Output-Komponenten löschen deldir="$dir list" If [[ "$dir" =~ '^(pli c cpp)$' ]]; then deldir="$deldir tmp dbrm obj load debug" fi for i in $deldir ; do files= `find $pfad/$i/ -iname "$member.*" -type f` for file in $files; do rm -f -v $file done done 26
Linux Logfile 27
Linux Logfile TSO NDVRLOG GRU2 -> ls -ggtc /shared/endevor/log/*.gru2 28
Linux Logfile TSO NDVRLOG LENJRAL -> ls -ggtc /shared/endevor/log/ndvrc*.lenjral.* 29
Linux Logfile KTX 30
Linux Logfile 31