/* REXX */                                                              
/*---------------------------------------------------------------*/     
/*                                                               */     
/*                VALUE OF P WILL ROUTE THE OUTPUT TO THE        */     
/*                PRINTER.  ANYTHING ELSE WILL DEFAULT TO        */     
/*                THE SCREEN.                                    */     
/*                ¦                                              */     
/*                V                                              */     
PARSE UPPER ARG $DEST .                                                 
say ; say ; say                                                         

/*--- GET REQUIRED RACF PROFILE VALUE TO PROCESS ------------*/         
SAY ; SAY "ENTER THE PROFILE NAME TO LIST -OR-  TO EXIT"         
PULL $prof   ; $prof = strip($prof)                                     
IF $PROF = '' THEN DO                                                   
   SAY 'EXITING.....'                                                   
   EXIT                                                                 
END  /* IF $PROF = ''....  */                                           
                                                                        
/*--- GET THE RACF CLASS THE PROFILE IS IN --------------------*/       
say ; SAY 'ENTER THE RACF CLASS THE PROFILE IS IN:'                     
PULL $CLASS   ; $CLASS = STRIP($CLASS) ; UPPER $CLASS                   
   IF $CLASS = '' THEN DO                                               
      SAY 'EXITING.....'                                                
      EXIT                                                              
   END  /* IF $class = ''....  */                                       
   IF $CLASS = 'DATASET' THEN DO                                        
      SAY 'USE "TSO RPTdsn" FOR DATASET CLASS PROFILES'                 
      SAY 'EXITING.....'                                                
      EXIT                                                              
   END  /* IF $class = ''....  */                                       
SAY                                                                     
                                                                        
/*--- PROMPT TO SCREEN ASKING IF ADDITIONAL RACF GROUP --------*/       
/*--- CONNECT LISTINGS ARE WANTED                      --------*/       
$EXPLODE = 'N'                                                          
SAY 'DO YOU WANT TO EXPLODE THE GROUP CONNECT LISTING? (Y OR N)'        
SAY '  (THIS WILL RUN A LITTLE LONGER)'                                 
PULL $ANSWER  ; $answer = strip($answer) ; UPPER $ANSWER                
IF $ANSWER = 'Y' THEN $EXPLODE = 'Y'                                    
IF $ANSWER = 'y' THEN $EXPLODE = 'Y'                                    
SAY ; SAY 'WORKING. . . . . . .'                                        
                                                                        
/*---DETERMINE WHERE TO ROUTE OUTPUT -------*/                          
$PRINT_FLAG = 'N'                                                       
IF $DEST = 'P' THEN $PRINT_FLAG = 'Y'                                   
                                                                        
/*------------------------------------------------------------------*/  
/* ALLOCATE THE TEMP FILE FOR DISPLAYING THE OUTPUT DATA            */  
/*------------------------------------------------------------------*/  
OUTPUT = "L"RANDOM(99999)                                               
                                                                        
SELECT                                                                  
                                                                        
  WHEN $PRINT_FLAG = 'Y' THEN                                           
     /*--- SEND TO PRINTER --------------------------*/                 
     "ALLOC FI("OUTPUT") SYSOUT(A) DEST(U0022) FORMS(STD) ,             
          COPIES(1) RECFM(F,B) LRECL(80)"                               
                                                                        
  OTHERWISE                                                             
      /*--- SEND TO SCREEN ---------------------------*/                
      "ALLOC FI("OUTPUT") DELETE TRACK ,                                
       SPACE (5,5) LRECL(133) RECFM(F B) BLKSIZE(0) UNIT(SYSDA)"        
 END  /* SELECT */                                                      
                                                                        
/*--------  GET RACF PROFILE INFO --------------*/                      
Z = OUTTRAP('LIST.')                                                    
   "RLIST" $CLASS $PROF "AUTHUSER"                                      
Z = OUTTRAP('OFF')                                                      
                                                                        
QUEUE                                                                   
QUEUE '***************************************************'             
QUEUE '   PROFILE:' $PROF '   CLASS:' $CLASS                            
QUEUE '             AS OF:' DATE()                                      
QUEUE '***************************************************'             
QUEUE                                                                   
 'EXECIO 5 DISKW' OUTPUT                                                
                                                                        
/*----- PROCESS EACH RECORD FROM THE RACF COMMAND ISSUED --------*/     
DO $LOOP1 = 1 TO LIST.0                                                 
                                                                        
   /*--- CHECK THE FIRST TWO WORDS -----*/                              
   PARSE VAR LIST.$LOOP1 $USERID $ACCESS .                              
                                                                        
   /*--- FIND THE ACCESS LIST SECTION -------*/                         
   IF $USERID = 'USER' THEN DO                                          
                                                                        
      /*--- SECTION FOUND. SKIP SECTION HEADER RECORDS ------*/         
      $LOOP1 = $LOOP1 +2                                                
                                                                        
      /*--- GET THE USERIDS AND ACCESS LEVELS ------*/                  
      DO $LOOP2 = $LOOP1 TO LIST.0                                      
/*    DO $LOOP2 = $LOOP1 TO 120          */                             
         $GROUP_FLAG = '    '                                           
         PARSE VAR LIST.$LOOP2 $USERID $ACCESS .                        
                                                                        
         /*--- THE LAST USERID WAS JUST PROCESSED. EXIT LOOP ----*/     
         IF $USERID = '' THEN LEAVE $LOOP1                              
                                                                        
         /*--------  GET RACF USERID PROFILE INFO --------------*/      
         L = OUTTRAP('LU.',1)                                           
            "LISTUSER" $USERID                                          
            $RC = RC                                                    
         L = OUTTRAP('OFF')                                             
                                                                        
         IF $RC = 0 THEN PARSE VAR LU.1 . 'NAME=' $NAME 'OWNER=' .      
                    ELSE $NAME = ' '                                    
                                                                        
         /*--- ENTITY IN ACCESS LIST NOT A VALID USERID ----*/          
         IF $RC <> 0 THEN DO                                            
                                                                        
            /*--------  GET RACF USERID PROFILE INFO --------------*/   
            G = OUTTRAP('LG.')                                          
               "LG" $USERID                                             
               $RC = RC                                                 
            G = OUTTRAP('OFF')                                          
                                                                        
            /*--- IF A RACF GROUP THEN SET FLAG VALUE ---------*/       
            IF $RC = 0 THEN $GROUP_FLAG = '*** RACF GROUP ***'          
                       ELSE $GROUP_FLAG = '=== INVALID USERID ==='      
                                                                        
         END  /*  IF $RC <>0...  */                                     
                                                                        
         QUEUE LEFT($USERID,9) ,                                        
             LEFT($ACCESS,9) ,                                          
             $NAME ,                                                    
             $GROUP_FLAG                                                
        'EXECIO 1 DISKW' OUTPUT                                         
                                                                        
         /*--- LIST RACF USERIDS CONNECTED TO THIS RACF GROUP ----*/    
         IF $GROUP_FLAG = '*** RACF GROUP ***' & $EXPLODE = 'Y'         
               THEN CALL GET_GROUP_MEMBERS                              
                                                                        
      END  /* DO $LOOP2...  */                                          
   END  /*  IF $USER...  */                                             
END                                                                     
                                                                        
/*------------------------------------------------------------------*/  
/* CLOSE THE 'DISPLAY' FILE                                         */  
/*------------------------------------------------------------------*/  
   QUEUE ''                                                             
  "EXECIO * DISKW "OUTPUT" (FINIS"                                      
                                                                        
/*------------------------------------------------------------------*/  
/* CLEANUP                                                          */  
/*------------------------------------------------------------------*/  
  IF $PRINT_FLAG = 'N' THEN DO                                          
    /*--------------------------------------------------------------*/  
    /* DISPLAY RESULTS TO SCREEN                                    */  
    /*--------------------------------------------------------------*/  
    ADDRESS ISPEXEC "LMINIT DATAID(DATAID) DDNAME("OUTPUT")"            
    ADDRESS ISPEXEC "BROWSE DATAID("DATAID")"                           
  END /* IF PRINT_FLAG...  */                                           
                                                                        
  "FREE F("OUTPUT")"                                                    
   DROPBUF 0                                                            
EXIT                                                                    
                                                                        
                                                                        
                                                                        
/******************************************************************/    
GET_GROUP_MEMBERS:                                                      
                                                                        
 /*--- SKIP DOWN UNTIL YOU GET TO THE USERIDS --------*/                
 DO $R = 4 TO LG.0 UNTIL $USER_HEADER = 'USER(S)='                      
    $USER_HEADER = SUBSTR(LG.$R,5,8)                                    
 END      /*  $R  */                                                    
                                                                        
 /*--- GET THE USERID -------------------------------*/                 
 DO $Y = $R+1 TO LG.0                                                   
    IF SUBSTR(LG.$Y,7,1) = ' ' THEN ITERATE $Y                          
                                                                        
    $GR_USERID = SUBSTR(LG.$Y,7,8)                                      
                                                                        
    /*--- SKIP DOWN TO NEXT LINE TO GET CONNECTION STATUS  -----*/      
    $Y = $Y +1                                                          
    PARSE VAR LG.$Y . 'ATTRIBUTES=' $STATUS .                           
    IF $STATUS = 'NONE' THEN $STATUS = ' '                              
    IF $STATUS = 'REVOKED' THEN $STATUS = 'CONNECT IS REVOKED'          
                                                                        
    IF $GR_USERID <> 'IBPRODPR' & $GR_USERID <> 'IBPRODP1' THEN DO      
        /*--------  GET RACF USERID PROFILE INFO --------------*/       
        L = OUTTRAP('LU.',1)                                            
           "LISTUSER" $GR_USERID                                        
           $RC = RC                                                     
        L = OUTTRAP('OFF')                                              
                                                                        
        /*--- IF A RACF GROUP THEN SET FLAG VALUE ---------*/           
        IF $RC = 0 THEN DO                                              
            $GROUP_FLAG = '          '                                  
            PARSE VAR LU.1 . 'NAME=' $NAME 'OWNER=' .                   
        END  /* IF $RC=0...  */                                         
          ELSE DO                                                       
            $GROUP_FLAG = 'INVALID USERID'                              
            $NAME = ' '                                                 
          END  /* ELSE DO...  */                                        
                                                                        
    END  /*  IF $GR_USERID...  */                                       
     ELSE $GROUP_FLAG = 'TOO MANY IDS TO LIST INDIVIDUALLY'             
                                                                        
    /*--- WRITE OUTPUT RECORD ------------*/                            
    QUEUE '    ' LEFT($GR_USERID,9) $NAME LEFT($STATUS,20) $GROUP_FLAG  
   'EXECIO 1 DISKW' OUTPUT                                              
                                                                        
    /*--- SKIP NEXT LINE ---------------------------------------*/      
    $Y = $Y +1                                                          
 END      /*  $Y  */                                                    
                                                                        
RETURN                                                                  

    Source: geocities.com/steveneeland