MainframeSupports
tip uge 6/2013:

Hvis du er den nysgerrige type, så er denne uges tip lige noget for dig. Måske kender du allerede kommandoen TSO LD DA(<dataset>) GEN, som fortæller dig, hvilken adgang du har til <dataset>. Fordelen ved denne kommando er, at den pænt spørger RACF, hvad din adgang er i modsætning til, hvis du forsøger at åbne datasettet, hvor du i stedet får en abend. Udover en abend bliver det også logget, at du har forsøgt at få adgang uautoriseret til <dataset>. Alt dette undgår du med TSO LD DA(<dataset>) GEN.

Det er faktisk også muligt at lave et program, der udfører samme funktion som LD kommandoen. Desværre er programmeringsinterfacet til RACF kun muligt at bruge fra assembler, så derfor har jeg strikket et assembler program sammen, der udfører en LD kommando. Bemærk, at programmet ikke er reentrant. Du kan bruge det fra din TSO session eller fra et batch program, men ellers ikke.

* NAME      : AUTHLVL
* FUNCTION  : THIS SUBROUTINE FINDS YOUR RACF-ACCESS TO A DATASET.
* CALL FMT  : CALL AUTHLVL(DATASET,ACCESS)
* REMARKS   : PROGRAM IS NOT REENTRANT.
* PARAMETERS: THE TWO PARAMETERS PASSED TO THIS SUBROUTINE ARE DEFINED
*             AS FOLLOWS:
* DATASET  DS CL44  THE DATASETNAME SUPPLIED BY THE CALLER.
*                   BY THE CALLER.
* ACCESS   DS CL8   THE ACCESS LEVEL RETURNED TO THE CALLER.
*                   POSSIBLE VALUES ARE NONE, READ, UPDATE,
*                   CONTROL, ALTER OR UNKNOWN.
*                   UNKNOWN IS RETURNED WHEN REG-15 = 8 OR
*                   IF NEW VALUES ARE INTRODUCED IN RACF.
*
* REG-15 WILL CONTAIN ONE OF THE FOLLOWING RETURN CODES:
* 0: CALL TO RACF WENT OK.
* 8: CALL TO RACF FAILED.
AUTHLVL  CSECT
AUTHLVL  AMODE 31
AUTHLVL  RMODE ANY
* USE BAKR TO PRESERVE REGISTERS
         BAKR R14,0          * ESA STYLE SAVE
         BASR R12,0          * ADDRESS THIS CSECT
         USING *,R12         * AH .. ADDRESSABILITY
* HAVING REACHED HERE, WE NOW ISSUE A RACROUTE REQUEST=AUTH MACRO
* FOR THE DATASET
         LM R3,R4,0(R1)      * R3->DSNAME, R4->ACCESS
         LA R8,RACLAB        * POINT TO PARAMETER LIST IN RACF
         USING SAFP,R8       *
         RACROUTE REQUEST=AUTH,ENTITY=((3)),MF=(E,RACLAB)
         CLC SAFPRRET,F20    * OK RETURN CODE?
         BNE ERACCESS        * NO SO GIVE UNKNOWN ACCESS BACK
         CLC SAFPRREA,F00    * NO ACCESS?
         BE NOACCESS         * YES SO SET NOACCESS
         CLC SAFPRREA,F04    * READ ACCESS?
         BE RDACCESS         * YES SO SET READ
         CLC SAFPRREA,F08    * UPDATE ACCESS
         BE UPACCESS         * YES SO SET UPDATE
         CLC SAFPRREA,F12    * CONTROL ACCESS
         BE CTACCESS         * YES SO SET CONTROL
         CLC SAFPRREA,F16    * ALTER ACCESS?
         BNE UNACCESS        * NO, SO UNKNOWN REASON CODE?
         MVC 0(8,R4),ALTER
         B RETDETS
ERACCESS EQU *
         MVC 0(8,R4),UNKNOWN
         LA R15,8
         B RETURNS
NOACCESS EQU *
         MVC 0(8,R4),NONE
         B RETDETS
RDACCESS EQU *
         MVC 0(8,R4),READ
         B RETDETS
UPACCESS EQU *
         MVC 0(8,R4),UPDATE
         B RETDETS
CTACCESS EQU *
         MVC 0(8,R4),CONTROL
         B RETDETS
UNACCESS EQU *
         MVC 0(8,R4),UNKNOWN
* SET ZERO RETURN CODE AND RETURN TO CALLER
RETDETS  EQU *
         LA R15,0
RETURNS  EQU *
         PR
RACLAB   RACROUTE REQUEST=AUTH,CLASS='DATASET',STATUS=ACCESS,          X
         DSTYPE=M,WORKA=ENDPROG,RELEASE=1.9,MF=L
F00      DC F'00'
F04      DC F'04'
F08      DC F'08'
F12      DC F'12'
F16      DC F'16'
F20      DC F'20'
UNKNOWN  DC CL8'UNKNOWN'
NONE     DC CL8'NONE'
READ     DC CL8'READ'
UPDATE   DC CL8'UPDATE'
CONTROL  DC CL8'CONTROL'
ALTER    DC CL8'ALTER'
ENDPROG  DC A(HALFK)
HALFK    DS 512C
         ICHSAFP
         LTORG
         YREGS
         END

Hvis du får blod på tanden, så kan du faktisk få programmet til at virke for andet end datasets. Hvis du kender RACF CLASS navnet for den ressource, du vil spørge om adgangen til, så kan du angive CLASS navnet i RACROUTE kommandoen med label RACLAB.

Held og lykke med programmet. Husk du kan altid skrive, hvis du ikke kan få programmet til at virke. Så vil jeg forsøge at hjælpe, så godt jeg kan. Til sidst vil jeg lige gøre opmærksom på det X, der står yderst til højre i linien med label RACLAB. Det skal stå i position 72, ellers virker det ikke. Et hvilket som helst tegn forskellige fra blank i position 72 i assembler fortæller, at instruktionen fortsættes på næste linie.

Forrige danske tip        Last tip in english        Tip oversigten