//MARKASM JOB (0),'MDSVC34',CLASS=A,MSGCLASS=T,MSGLEVEL=(1,1) //* //* MDSVC34: Purpose, a AC=1 module that can be liked to by //* other programs I use to issue console commands, //* so I have a common interface across all programs. //* //* Installation: //* (1) globally change MARK.LIB.LOAD.APFAUTH to one of your //* libraries in the APF dataset list //* (2) if you do not use RAKF change the &USERAKF flag from //* 1 to 0 at the start of the program; if you do use RAKF //* ensure a FACILITY class of SVC34 is created and add //* groups authorised to run this prgram //* (3) optionally, change the test steps at the end of this file //* //ASM EXEC PGM=IFOX00, // PARM='DECK,LOAD,TERM,TEST,SYSPARM((NOSP,NODEBUG)),XREF(SHORT)', // REGION=4096K,COND=(0,NE) //SYSLIB DD DISP=SHR,DSN=SYS1.MACLIB // DD DISP=SHR,DSN=MARK.PROD.LIB.MACROS.ASM //SYSUT1 DD SPACE=(CYL,(25,5)),UNIT=WORK //SYSUT2 DD SPACE=(CYL,(25,5)),UNIT=WORK //SYSUT3 DD SPACE=(CYL,(25,5)),UNIT=WORK //SYSTERM DD SYSOUT=* //SYSPRINT DD SYSOUT=* //SYSIN DD DATA,DLM=ZZ ********************************************************************** * * * MDSVC34 : ISSUE CONSOLE COMMANDS * * * * PRIMARY PURPOSE IS TO BE CALLED FROM MY OTHER PROGRAMS THAT NEED * * THIS FACILITY WHILST ALLOWING THOSE CALLERS TO REMAIN AC=0. * * * * INPUTS * * (1) THE PROGRAM PARM FIELD IS USED TO PROVIDE ONE COMMAND * * NOTE: ORIGINAL DESIGN, TO BE CALLED BY OTHER PROGRAMS * * (2) MDSVC34X DD CARD (ADDED 2016/07/13) TO ALLOW MULTIPLE * * COMMANDS TO BE ISSUED BY BATCH JOBS. I PREFER TO USE THIS * * OVER THE TK3 BSPOSCMD SO IT LOGS (WTOS) WHAT COMMANDS ARE * * BEING ISSUED. * * THE ANNOYING THING IS I HAVE FORGOTTEN WHY I NEEDED IT. * * D O N O T C H A N G E M D S V C 3 4 X TO SYSIN, * * THE PRIMARY PURPOSE OF THIS PROGRAM FOR MY USE IS STILL * * TO BE CALLED DIRECTLY VIA LINK FROM OTHER PROGRAMS, AND * * THOSE PROGRAMS MAY HAVE ALLOCATED A SYSIN TO THE JOBSTEP. * * INPUTS ARE MUTUALLY EXCLUSIVE, YOU CANNOT USE BOTH IN A PROGRAM * * INVOCATION. FOR THE DATA CARD METHOD CARDS STARTING WITH * ARE * * COMMENT CARDS. * * * * FOR EACH COMMAND PASSED BY EITHER METHOD * * (A) WTO THE COMMAND TO BE ACTIONED * * (B) ISSUE THE COMMAND * * * * ---> MAX COMMAND LENGTH IS CURRENTLY 35 BYTES (L'CMDTEXT) * * THAT IS ALL I NEED, IF YOU CHANGE IT ALSO UPDATE THE * * CONTWTO1 DATA AREA :-) !!! * * * * MUST BE IN A APF LIBRARY STORED WITH AC=1 TO USE SUPERVISOR MODE * * * * USES RAKF RULE FACILITY SVC34 TO CONTROL WHE CAN RUN THE PROGRAM * * IF YOU DO NOT HAVE A SECURITY PRODUCT INSTALLED CHANGE THE * * VARIABLE &USERAKF TO 0 * * * ********************************************************************** SPACE 2 LCLB &USERAKF &USERAKF SETB 1 EJECT MDSVC34 CSECT STM R14,R12,12(13) BALR R12,R0 USING *,R12 LA R15,SAVEAREA ST R15,8(R13) ST R13,4(R15) LR R13,R15 SPACE 2 * --- GET THE PARM FIELD PASSED --- * WE ONLY EXPECT ONE PARM SO NO NEED TO CHECK FOR MORE LTR R1,R1 BZ NOPARM LR R2,R1 ADDRESS OF ADDR LIST TO R2 L R5,0(,R2) R5 TO ADDRESS DATA FIELD * OK, SAVE THE PARM TO CMDTEXT SR R3,R3 LEN OF PARM TO R3 LH R3,0(R5) C R3,=F'0' IF IT IS ZERO, ALSO NO PARM BE NOPARM LA R4,L'CMDTEXT MAX FIELD LEN ALLOWED IN R4 CR R3,R4 WILL PARM FIT ? BNH PARMOK YES, OK LA R3,L'CMDTEXT NO, TRUNCATE TO MAX LEN PARMOK EX R3,EXPRMSAV SAVE CMD FOR LEN DETERMINED A R3,=F'4' INCLUDE 4 BYTE LENGTH SIZE STH R3,CMDLEN SAVE LENGTH OF COMMAND AREA MVI PARMPROV,C'Y' PARM PROVIDED SPACE 1 NOPARM EQU * GETJNAME DATA=JOBNAME GET JOBNAME FOR WTOS RDJFCB MDSVC34X SEE IF THERE IS A MDSVC34X DD LTR R15,R15 BNZ NOSYSIN CLI PARMPROV,C'Y' WAS THERE ALSO A PARM ? BE CONFLICT YES, FAIL OUT MVI SYSNPROV,C'Y' NO, SET SYSIN DD AVAILABLE B PROVOK NOSYSIN CLI PARMPROV,C'Y' IF NO SYSIN MUST HAVE PARM BNE NOSVCDAT SO IF NO PARM ERROR OUT PROVOK EQU * * * WE MUST BE IN AN APF AUTHORISED ENVIRONMENT TESTAUTH FCTN=1 LTR R15,R15 BZ AUTHOK MVC AUTHFAIL+17(8),JOBNAME AUTHFAIL WTO 'MID0069E ....+... NOT IN AN AUTHORISED ENVIRONMENT' B EXIT4 * AUTHOK EQU * AIF (&USERAKF EQ 0).NORAKF1 EJECT CHEKAUTH MVC AUTHCHK(LRACHECK),RACHECKL INIT RACHECK MACRO RACSVC RACHECK CLASS=RACLASS,ENTITY=RAOBJECT,MF=(E,AUTHCHK) C R15,=F'0' AUTHORISED, NOTE THAT RAKF ALSO BE CONTWTO RETURNS 0 IF NO RULE, ALTHOUGH * RAKF LOGS A MSG SAYING SO, THIS * MEANS WE DO NOT CHECK RC=4 (NORULE) * AS RAKF NEVER RETURNS THAT C R15,=F'8' EXPLICITLY DENIED BY RAKF RULES BE NOTAUTH C R15,=F'12' NO SECURITY PRODUCT INSTALLED BE NORAKF B CONTWTO SHOULD NEVER GET HERE, DEFAULT * IS TO CARRY ON NOTAUTH MVC NOTAUTH1+17(8),JOBNAME NOTAUTH1 WTO 'MID0061E ....+... ACCESS DENIED TO FACILITY SVC34' B EXIT4 NORAKF MVC NORAKF1+17(8),JOBNAME NORAKF1 WTO 'MID0062W ....+... NO SECURITY PRODUCT INSTALLED' .NORAKF1 ANOP EJECT CONTWTO CLI PARMPROV,C'Y' USING PARM DATA ? BNE USESYSIN NO, MUST BE USING SYSIN DATA SPACE 2 * A PARM WAS PASSED, AND COMMAND ALREADY STORED * IN THE SVC34 COMMAND BUFFER, JUST ISSUE THE COMMAND BAL R4,ISSUESVC B EXIT DONE WITH COMMAND VIA PARM SPACE 2 USESYSIN CNOP 0,4 OPEN (MDSVC34X,(INPUT)) OPEN MDSVC34X LA R1,L'CMDTEXT USE FULL BUFFER LENGTH A R1,=F'4' INCLUDE 4 BYTE HEADER LEN STH R1,CMDLEN AS LENGTH OF COMMAND SYSNLOOP GET MDSVC34X READ DATA CARD MVC CMDTEXT(L'CMDTEXT),0(R1) COMMAND TO SVC34 BUFFER CLI CMDTEXT,C'*' IS IT A COMMENT ? BE SYSNLOOP YES, GO GET NEXT CARD BAL R4,ISSUESVC ISSUE THE COMMAND B SYSNLOOP LOOP UNTIL END OF FILE EXITSYSN CLOSE (MDSVC34X) EXIT CNOP 0,4 L R13,4(R13) LM R14,R12,12(R13) SLR R15,R15 RC=0000 BR R14 EXIT4 L R13,4(R13) LM R14,R12,12(R13) LA R15,4 RC=0004 BR R14 EJECT * * Common routine shared between PARM and MDSVC34X input methods * - log the command being issued for audit purposes * - then issue the command ISSUESVC CNOP 0,4 MVC CONTWTO1+17(8),JOBNAME JOBNAME TO WTO MSG MVC CONTWTO1+26(L'CMDTEXT),CMDTEXT COMMAND TO WTO MSG CONTWTO1 WTO 'MID0063I : ',X DESC=(5) MODESET KEY=ZERO,MODE=SUP SR R1,R1 CLEAR R1 LA R1,CMDLEN CMDBUFF NO CMD ISSUED ? SR 0,0 INDICATE MASTER CONSOLE SVC 34 ISSUE COMMAND MODESET KEY=NZERO,MODE=PROB BR R4 RETURN TO CALLING BAL SPACE 3 * --- NO PARM OR BAD PARM PROVIDED, FATAL ERROR CONFLICT CNOP 0,4 MVC BADPARM1+17(8),JOBNAME BADPARM1 WTO 'MID0067E :MDSVC34:CANNOT PROVIDE BOTH PARM AND X MDSVC34X INPUT' B EXIT4 --- SO EXIT OUT NOSVCDAT CNOP 0,4 MVC BADPARM2+17(8),JOBNAME BADPARM2 WTO 'MID0068E :MDSVC34:MUST PROVIDE EITHER PARM OR MX DSVC34X INPUT' B EXIT4 --- SO EXIT OUT EJECT SAVEAREA DS 18F JOBNAME DC CL8' ' PARMPROV DC F'0' DEFAULT NO PARM PROVIDED SYSNPROV DC F'0' DEFAULT NO MDSVC34X DD CARD SPACE 3 * EX COMMAND DEFINITIONS EXPRMSAV MVC CMDTEXT(0),2(R5) SAVE PARM1 DATA FROM +2 FOR CMD SPACE 3 * SVC34 COMMAND AREA TO BE USED CMDBUFF DS 0F NEXT TWO ARE THE COMMAND CMDLEN DC AL2(0),AL2(0) TEXT LENGTH, FLAGS CMDTEXT DC CL35' ' COMMAND TEXT -- IF CHANGED ALSO * CHANGE WTO AREA SIZE IN CONTWTO1 * AND CONTWTO2 AIF (&USERAKF EQ 0).NORAKF2 * USED FOR RAKF AUTHORITY PRE-CHECKING RACLASS DC AL1(L'RACLASSN) RACLASSN DC C'FACILITY' RACHECKL RACHECK MF=L LRACHECK EQU *-RACHECKL AUTHCHK RACHECK MF=L RAOBJECT DC CL20'SVC34' .NORAKF2 ANOP SPACE 3 MDSVC34X DCB DDNAME=MDSVC34X,DSORG=PS,MACRF=(GL),EODAD=EXITSYSN, X LRECL=80,EXLST=EXLST DS 0F EXLST DC 0F'0',X'87',AL3(JFCB) JFCB DS CL176 EJECT R0 EQU 0 R1 EQU 1 R2 EQU 2 R3 EQU 3 R4 EQU 4 R5 EQU 5 R6 EQU 6 R7 EQU 7 R8 EQU 8 R9 EQU 9 R10 EQU 10 R11 EQU 11 R12 EQU 12 R13 EQU 13 R14 EQU 14 R15 EQU 15 * END ZZ //SYSPUNCH DD SYSOUT=* //SYSGO DD DISP=(MOD,PASS,DELETE),UNIT=SYSDA, // DSN=&&OBJLIB,SPACE=(TRK,(2,2)) //LKED1 EXEC PGM=IEWL, // PARM='XREF,LIST,LET,TEST,AC=1', // REGION=1024K,COND=(0,NE) //SYSLMOD DD DSN=MARK.LIB.LOAD.APFAUTH(MDSVC34),DISP=SHR //SYSLIN DD DSN=&&OBJLIB,DISP=(OLD,DELETE,DELETE) //SYSUT1 DD UNIT=SYSDA,SPACE=(CYL,(8,1)) //SYSPRINT DD SYSOUT=* //LKED2 EXEC PGM=IEWL, // PARM='XREF,LIST,LET,TEST,AC=1', // REGION=1024K,COND=(0,NE) //SYSLMOD DD DSN=MARK.LIB.LOAD.APFAUTH,DISP=SHR //SYSUT1 DD UNIT=SYSDA,SPACE=(CYL,(8,1)) //SYSPRINT DD SYSOUT=* //SYSLIN DD * SETCODE AC(1) INCLUDE SYSLMOD(MDSVC34) ENTRY MDSVC34 NAME MDSVC34(R) /* //* -------------------------------------------- //* //* -------------------------------------------- //* TEST0001 - Should issue the command //* RC=00 //TEST0001 EXEC PGM=MDSVC34,COND=(0,NE), // PARM='D U,TAPE,OFFLINE' //STEPLIB DD DISP=SHR,DSN=MARK.LIB.LOAD.APFAUTH //* //* TES00002 - Should issue commands frpm DD card //* MDSVC34X ignoring comment cards //* RC=00 //TEST0002 EXEC PGM=MDSVC34,COND=(0,NE) //STEPLIB DD DISP=SHR,DSN=MARK.LIB.LOAD.APFAUTH //MDSVC34X DD * * A jolly comment card D U,TAPE,OFFLINE * Another jolly comment card D U,TAPE,ONLINE /* //* TEST0003 - Should complain that PARM and DD card //* MDSVC34X cannot both be provided //* RC=04 //TEST0003 EXEC PGM=MDSVC34,COND=(0,NE), // PARM='D U,TAPE,OFFLINE' //STEPLIB DD DISP=SHR,DSN=MARK.LIB.LOAD.APFAUTH //MDSVC34X DD * D U,TAPE,OFFLINE /* //* TEST0004 - Should complain that PARM or DD card //* is required //* RC=04 //TEST0004 EXEC PGM=MDSVC34,COND=(4,NE,TEST0003) //STEPLIB DD DISP=SHR,DSN=MARK.LIB.LOAD.APFAUTH //