10 ! [LOMASKY.SYS]SYSUAF.BAS ----- VMS V4.5 SYSUAF REPORT PROGRAM ----- ! ! ----- Last Change 05/31/88 by Brian Lomasky ----- ! ! ----- Teradyne, Inc., 179 Lincoln Street, Boston, MA 02111 ----- ! ----- (617) 482-2700, x3259 ----- ! ! ----- Requires VAX BASIC V2.4 or later ----- ! ! ----- Compile this program by typing: $BASIC/LONG SYSUAF ! ! ----- Link this program by typing: $LINK/NOTRACE SYSUAF ! OPTION TYPE = EXPLICIT ON ERROR GOTO ERROR_ROUTINE DECLARE STRING CONSTANT CLEAR_VT100_SCREEN = ESC + "[H" + ESC + "[2J" DECLARE LONG CONSTANT TRUE = (1% = 1%) DECLARE LONG CONSTANT FALSE = NOT TRUE EXTERNAL LONG CONSTANT SS$_ACCVIO ! ACCESS VIOLATION EXTERNAL LONG CONSTANT SS$_BUFFEROVF ! BUFFER OVERFLOW EXTERNAL LONG CONSTANT SS$_IVTIME ! INVALID TIME EXTERNAL LONG CONSTANT SS$_NORMAL ! NORMAL EXIT STATUS EXTERNAL LONG CONSTANT SS$_NOSUCHID ! NO IDENTIFIER FOUND DECLARE STRING ACCOUNT_SPEC ! ACCOUNT FIELD SPECIFICATION DECLARE STRING B_FORMAT ! PRINT USING FORMAT FOR B OPT B_FORMAT = " #### #### #### #### #### ####" + & " #### #### #### #### #### #### #### ####" DIM BYTE BIT_MASK(8%) MAT READ BIT_MASK DECLARE LONG CHARS_WRITTEN ! CHARS WRITTEN TO REPORT LINE DECLARE LONG COMMAND_FILE_RECORD_WRITTEN! TRUE IF WRITTEN TO CMD FILE COMMAND_FILE_RECORD_WRITTEN = FALSE DECLARE LONG CONTEXT ! CONTEXT FOR REPEATED CALLS DECLARE LONG CPUTIME_HOURS DECLARE LONG CPUTIME_MINUTES DECLARE LONG CPUTIME_SECONDS DECLARE STRING CPUTIME_STRING DECLARE STRING DEVICE_SPEC DECLARE STRING DIRECTORY_SPEC DECLARE LONG END_OF_FILE_FLAG END_OF_FILE_FLAG = FALSE ! INIT DONE-WITH-FILE FLAG DECLARE STRING ERROR_LINE ! ERROR LINE DESCRIPTION ERROR_LINE = "INIT" DECLARE LONG FLAG DIM LONG FLAG_BIT_POSITIONS(15%) MAT READ FLAG_BIT_POSITIONS DIM LONG FLAG_INDEXS(15%) MAT READ FLAG_INDEXS DECLARE LONG ID ! IDENTIFIER VALUE DECLARE WORD ID_NAME_LENGTH ! LENGTH OF ID_NAME DECLARE LONG JULIAN_DAYS ! FOR DELTA_DATES FUNCTION DECLARE STRING LGICMD_SPEC DECLARE LONG LINE_COUNTER LINE_COUNTER = 99% ! TO FORCE PAGE HEADINGS DECLARE LONG LINES_PER_PAGE DECLARE LONG LINPUT_FLAG ! TRUE WHEN LINPUTing LINPUT_FLAG = FALSE ! INIT LINPUT FLAG DECLARE LONG PAGE_COUNTER PAGE_COUNTER = 0% DECLARE STRING PRINT_STRING PRINT_STRING = "abcdefghijklmnopqrstuvwxyz1234567890+$%" DECLARE LONG PRIVILEGE_BIT DIM LONG PRIVILEGE_BIT_OFFSET(39%) ! BIT WITHIN PRIVILEGE() BYTE MAT READ PRIVILEGE_BIT_OFFSET DECLARE LONG PRIVILEGE_COUNTER DECLARE LONG PRIVILEGE_IDX DIM LONG PRIVILEGE_IDX_OFFSET(39%) ! PRIVILEGE() BYTE TO CHECK MAT READ PRIVILEGE_IDX_OFFSET DIM LONG QUICKSORT_TEMP1(16%) DIM LONG QUICKSORT_TEMP2(16%) DECLARE STRING REPORT_OUTPUT ! S=SCREEN, F=FILE OUTPUT DECLARE STRING REPORT_TYPE ! USER-SELECTED REPORT TYPE DECLARE LONG REPORT_WIDTH ! WIDTH OF REPORT (80 OR 132) DIM STRING SRT(1000%, 1%) ! ARRAY CONTAINING DATA TO SORT DECLARE LONG SRT_COUNTER ! COUNT OF ITEMS IN SRT ARRAY SRT_COUNTER = 0% ! INIT COUNTER DECLARE LONG SRT_REPORT_OFFSET ! OFFSET FOR SORT REPORT SRT_REPORT_OFFSET = 0% ! INIT SORT REPORT OFFSET DECLARE STRING STRING_TO_PRINT ! STRING TO BE PRINTED DECLARE LONG SYS_STATUS ! SYSTEM SERVICE EXIT STATUS DECLARE LONG TEMP ! TEMPORARY LONG STORAGE DECLARE LONG TEMP1 ! TEMPORARY LONG STORAGE DECLARE LONG TEMP3 ! TEMPORARY LONG STORAGE DECLARE LONG TEMP4 ! TEMPORARY LONG STORAGE DECLARE LONG TEMP5 ! TEMPORARY LONG STORAGE DECLARE STRING TEMP6 ! TEMPORARY STRING STORAGE DECLARE STRING TEMP7 ! TEMPORARY STRING STORAGE DECLARE STRING TEMP8 ! TEMPORARY STRING STORAGE DECLARE LONG TEMP9 ! TEMPORARY LONG STORAGE DECLARE STRING TEMP_STRING ! TEMPORARY STRING STORAGE DECLARE STRING THE_IDENTIFIER ! IDENTIFIER TO SEARCH FOR DECLARE LONG TODAYS_DATE ! TODAY'S JULIAN DATE DECLARE LONG UIC_GROUP DECLARE LONG UIC_MEMBER DECLARE STRING USER_DATA_STRING ! STRING STORAGE FOR USER DATA DECLARE STRING WORKING_SET_FORMAT WORKING_SET_FORMAT = "'LLLLLLLLLLLLLLLLLLLLLLLL" + & "LLLLLLL ######### ########## ###########" DECLARE STRING WORKING_SET_FORMAT_FILE WORKING_SET_FORMAT_FILE = "'LLLLLLLLLLLLLLLLLLL" + & "LLLLLLLLLLLL ######### ##########" + & " ########### ##### ##### ##### ##### #####" + & " ##### ######### #########" MAP (ASCT) WORD TIME_BUFFER(6%), ! TIME FROM $NUMTIM & LONG CLUNK_DATE(1%), ! FROM_CLUNKS DATE & LONG FIRST_BINTIM(1%), ! DATE FOR DELTA_DATES & STRING TIME_STRING = 23%! TIME FROM $ASCTIM MAP (HOLDQUAD) LONG HOLDER(1%) ! HOLDER UIC QUADWORD MAP (IDNAME) STRING ID_NAME = 32% ! IDENTIFIER NAME BUFFER ! -------------------------------------------------------------- ! ----- FOLLOWING PRIVILEGE BITS ARE TURNED ON IF ENABLED: ----- ! ----- (DEFAULT_PRIVILEGES() ARE THE SAME AS PRIVILEGES()) ----- ! ----- PRIVILEGES(0%): ----- ! ----- BIT 0 = CMKRNL (MAY CHANGE MODE TO KERNEL) ----- ! ----- BIT 1 = CMEXEC (MAY CHANGE MODE TO EXEC) ----- ! ----- BIT 2 = SYSNAM (MAY INSERT IN SYST LOG NAME TABLE) ----- ! ----- BIT 3 = GRPNAM (MAY INSERT IN GROUP LOG NAME TABL) ----- ! ----- BIT 4 = ALLSPOOL (MAY ALLOCATE SPOOLED DEVICES) ----- ! ----- BIT 5 = DETACH (MAY CREATE DETACHED PROCESSES) ----- ! ----- BIT 6 = DIAGNOSE (MAY DIAGNOSE DEVICES) ----- ! ----- BIT 7 = LOG_IO (MAY DO LOGICAL I/O) ----- ! ----- PRIVILEGES(1%): ----- ! ----- BIT 0 = GROUP (MAY AFFECT OTHER GROUP PROCESSES) ----- ! ----- BIT 1 = ACNT (MAY SUPPRESS ACCOUNTING MESSAGE) ----- ! ----- BIT 2 = PRMCEB (MAY CREATE PERM. COMM. EVNT CLSTRS) ---- ! ----- BIT 3 = PRMMBX (MAY CREATE PERMANENT MAILBOX) ----- ! ----- BIT 4 = PSWAPM (MAY CHANGE PROCESS SWAP MODE) ----- ! ----- BIT 5 = ALTPRI (MAY SET ANY PRIORITY VALUE) ----- ! ----- BIT 6 = SETPRV (MAY SET ANY PRIVILEGE BITS) ----- ! ----- BIT 7 = TMPMBX (MAY CREATE TERMPORARY MAILBOX) ----- ! ----- PRIVILEGES(2%): ----- ! ----- BIT 0 = WORLD (MAY AFFECT OTHER WORLD PROCESSES) ----- ! ----- BIT 1 = MOUNT (MAY EXECUTE MOUNT ACP FUNCTIONS) ----- ! ----- BIT 2 = OPER (OPERATOR PRIVILEGE) ----- ! ----- BIT 3 = EXQUOTA (MAY EXCEED QUOTAS) ----- ! ----- BIT 4 = NETMBX (MAY CREATE NETWORK DEVICE) ----- ! ----- BIT 5 = VOLPRO (MAY OVERRIDE VOLUME PROTECTION) ----- ! ----- BIT 6 = PHY_IO (MAY DO PHYSICAL I/O) ----- ! ----- BIT 7 = BUGCHK (MAY MAKE BUG CHECK ERROR LOG ENTRIES) -- ! ----- PRIVILEGES(3%): ----- ! ----- BIT 0 = PRMGBL (MAY CREATE PERM. GLOBAL SECTIONS) ----- ! ----- BIT 1 = SYSGBL (MAY CREATE SYSTEM GLOBAL SECTIONS) ----- ! ----- BIT 2 = PFNMAP (MAY MAP TO SECTION BY PFN) ----- ! ----- BIT 3 = SHMEM (MAY ALLOCATE STRUCTURES IN SHARED MEM) -- ! ----- BIT 4 = SYSPRV (ELIGIBLE FOR SYSTEM PROTECTION FIELD) -- ! ----- BIT 5 = BYPASS (MAY BYPASS UIC BASED PROTECTION) ----- ! ----- BIT 6 = SYSLCK (MAY CREATE SYSTEM WIDE LOCKS) ----- ! ----- BIT 7 = SHARE (MAY ASSIGN CHANNEL TO NON-SHARED DEV) --- ! ----- PRIVILEGES(4%): ----- ! ----- BIT 0 = UPGRADE (MAY UPGRADE CLASSIFICATION) ----- ! ----- BIT 1 = DOWNGRADE (MAY DOWNGRADE CLASSIFICATION) ----- ! ----- BIT 2 = GRPPRV (GROUP ACCESS BY SYSTEM PROT FIELD) ----- ! ----- BIT 3 = READALL (READ ACCESS TO EVERYTHING) ----- ! ----- BIT 4 = TMPJNL (MAY CREATE TEMPORARY JOURNALS) ----- ! ----- BIT 5 = PRMJNL (MAY CREATE PERMANENT JOURNALS) ----- ! ----- BIT 6 = SECURITY (MAY PERFORM SECURITY FUNCTIONS) ----- ! --------------------------------------------------------- ! ----- FOLLOWING FLAG BITS ARE TURNED ON IF ENABLED: ----- ! ----- FLAGS(0%): ----- ! ----- BIT 0 = DISCTLY ----- ! ----- BIT 1 = DEFCLI ----- ! ----- BIT 2 = LOCKPWD ----- ! ----- BIT 3 = CAPTIVE ----- ! ----- BIT 4 = DISACNT ----- ! ----- BIT 5 = DISWELCOME ----- ! ----- BIT 6 = DISNEWMAIL ----- ! ----- BIT 7 = DISMAIL ----- ! ----- FLAGS(1%): ----- ! ----- BIT 0 = GENPWD ----- ! ----- BIT 1 = PWD_EXPIRED ----- ! ----- BIT 2 = PWD2_EXPIRED ----- ! ----- BIT 3 = AUDIT ----- ! ----- BIT 4 = DISREPORT ----- ! ----- BIT 5 = DISRECONNECT ----- ! ----- BIT 6 = AUTOLOGIN ----- ! -------------------------------------------------------------- ! ----- PRIMARY DAY RESTRICTED HOURS ARE NOTED BY SETTING ONE OR ----- ! ----- MORE OF THE FOLLOWING BITS CORRESPONDING TO THE DESIRED ----- ! ----- HOUR(S): ----- ! ----- ! ----- NETWORK_ACCESS(0%), BATCH_ACCESS(0%), LOCAL_ACCESS(0%), ----- ! ----- DIALUP_ACCESS(0%), REMOTE_ACCESS(0%) ----- ! ----- BIT 0 = 0 ----- ! ----- BIT 1 = 1 ----- ! ----- BIT 2 = 2 ----- ! ----- BIT 3 = 3 ----- ! ----- BIT 4 = 4 ----- ! ----- BIT 5 = 5 ----- ! ----- BIT 6 = 6 ----- ! ----- BIT 7 = 7 ----- ! ----- NETWORK_ACCESS(1%), BATCH_ACCESS(1%), LOCAL_ACCESS(1%), ----- ! ----- DIALUP_ACCESS(1%), REMOTE_ACCESS(1%) ----- ! ----- BIT 0 = 8 ----- ! ----- BIT 1 = 9 ----- ! ----- BIT 2 = 10 ----- ! ----- BIT 3 = 11 ----- ! ----- BIT 4 = 12 ----- ! ----- BIT 5 = 13 ----- ! ----- BIT 6 = 14 ----- ! ----- BIT 7 = 15 ----- ! ----- NETWORK_ACCESS(2%), BATCH_ACCESS(2%), LOCAL_ACCESS(2%), ----- ! ----- DIALUP_ACCESS(2%), REMOTE_ACCESS(2%) ----- ! ----- BIT 0 = 16 ----- ! ----- BIT 1 = 17 ----- ! ----- BIT 2 = 18 ----- ! ----- BIT 3 = 19 ----- ! ----- BIT 4 = 20 ----- ! ----- BIT 5 = 21 ----- ! ----- BIT 6 = 22 ----- ! ----- BIT 7 = 23 ----- ! -------------------------------------------------------------- ! ----- SECONDARY DAY RESTRICTED HOURS ARE NOTED BY SETTING ONE OR ----- ! ----- MORE OF THE FOLLOWING BITS CORRESPONDING TO THE DESIRED ----- ! ----- HOUR(S): ----- ! ----- ! ----- NETWORK_ACCESS(3%), BATCH_ACCESS(3%), LOCAL_ACCESS(3%), ----- ! ----- DIALUP_ACCESS(3%), REMOTE_ACCESS(3%) ----- ! ----- BIT 0 = 0 ----- ! ----- BIT 1 = 1 ----- ! ----- BIT 2 = 2 ----- ! ----- BIT 3 = 3 ----- ! ----- BIT 4 = 4 ----- ! ----- BIT 5 = 5 ----- ! ----- BIT 6 = 6 ----- ! ----- BIT 7 = 7 ----- ! ----- NETWORK_ACCESS(4%), BATCH_ACCESS(4%), LOCAL_ACCESS(4%), ----- ! ----- DIALUP_ACCESS(4%), REMOTE_ACCESS(4%) ----- ! ----- BIT 0 = 8 ----- ! ----- BIT 1 = 9 ----- ! ----- BIT 2 = 10 ----- ! ----- BIT 3 = 11 ----- ! ----- BIT 4 = 12 ----- ! ----- BIT 5 = 13 ----- ! ----- BIT 6 = 14 ----- ! ----- BIT 7 = 15 ----- ! ----- NETWORK_ACCESS(5%), BATCH_ACCESS(5%), LOCAL_ACCESS(5%), ----- ! ----- DIALUP_ACCESS(5%), REMOTE_ACCESS(5%) ----- ! ----- BIT 0 = 16 ----- ! ----- BIT 1 = 17 ----- ! ----- BIT 2 = 18 ----- ! ----- BIT 3 = 19 ----- ! ----- BIT 4 = 20 ----- ! ----- BIT 5 = 21 ----- ! ----- BIT 6 = 22 ----- ! ----- BIT 7 = 23 ----- ! -------------------------------------------------------------- ! ----- PRIMARY DAYS ARE NOTED BY TURNING OFF THE DESIRED BIT(S): ----- ! ----- SECONDARY DAYS ARE NOTED BY TURNING ON THE DESIRED BIT(S): ---- ! ----- PRIMEDAYS: ----- ! ----- BIT 0 = Monday ----- ! ----- BIT 1 = Tuesday ----- ! ----- BIT 2 = Wednesday ----- ! ----- BIT 3 = Thursday ----- ! ----- BIT 4 = Friday ----- ! ----- BIT 5 = Saturday ----- ! ----- BIT 6 = Sunday ----- ! -------------------------------------------------------------- MAP (UAF) STRING UAF_REC = 1412% MAP (UAF) STRING FILL = 36%, & ! ----- UIC_IDENTIFIER IS THE ----- & ! ----- ALTERNATE KEY #2 ----- & ! ----- (DUPLICATES, CHANGES) ----- & STRING UIC_IDENTIFIER = 8% MAP (UAF) STRING FILL = 4%, & STRING USER_NAME_NO_TAG = 31%, & STRING USER_NAME_TAG = 1%, & WORD OCT_UIC_MEMBER, & WORD OCT_UIC_GROUP MAP (UAF) BYTE UAF_RECORD_TYPE, & BYTE UAF_FORMAT_VERSION, & WORD USER_DATA_LENGTH, & ! ----- USER_NAME IS THE PRIMARY KEY ----- & ! ----- (NO DUPLICATES, NO CHANGES) ----- & STRING USER_NAME = 32%, ! ALJTB & ! ----- UIC IS THE ALTERNATE KEY #1 ----- & ! ----- (DUPLICATES, CHANGES) ----- & LONG UIC, & LONG USER_SUB_IDENTIFIER, & ! ----- PARENT_ID IS THE ALTERNATE KEY #3 ----- & ! ----- (DUPLICATES, CHANGES) ----- & STRING PARENT_ID = 8%, & STRING ACCOUNT_NAME = 32%, ! ALJTB & BYTE OWNER_NAME_LENGTH, & STRING OWNER_NAME = 31%, & BYTE DEVICE_LENGTH, & STRING THE_DEVICE = 31%, & BYTE DIRECTORY_NAME_LENGTH, & STRING DIRECTORY_NAME = 63%, & BYTE LOGIN_COMMAND_FILE_LENGTH, & STRING LOGIN_COMMAND_FILE = 63%, & BYTE CLI_LENGTH, & STRING CLI = 31%, & BYTE CLI_TABLES_LENGTH, & STRING CLI_TABLES = 31%, & STRING PASSWORD = 8%, ! COUNTED? & STRING PASSWORD2 = 8%, ! COUNTED? & WORD NUMBER_OF_LOGIN_FAILURES, & WORD RANDOM_PASSWORD_SEED, & BYTE ENCRYPTION_ALGORITHM, & BYTE ENCRYPTION_ALGORITHM_PASSWORD2, & BYTE MINIMUM_PASSWORD_LENGTH, & BYTE FILL1, & LONG ACCOUNT_EXPIRATION_DATE(1%), ! CLUNKS & LONG PASSWORD_LIFETIME(1%), ! CLUNKS & LONG DATE_OF_PASSWORD_CHANGE(1%), ! CLUNKS & LONG DATE_OF_PASSWORD2_CHNGE(1%), ! CLUNKS & LONG LAST_INTER_LOGIN_DATE(1%), ! CLUNKS & LONG LAST_NINTER_LOGIN_DATE(1%), ! CLUNKS & BYTE PRIVILEGES(7%), & BYTE DEFAULT_PRIVILEGES(7%), & STRING MINIMUM_SECURITY_CLASS = 20%, ! COUNTED & STRING MAXIMUM_SECURITY_CLASS = 20%, ! COUNTED & BYTE FLAGS(3%), & BYTE NETWORK_ACCESS(5%), & BYTE BATCH_ACCESS(5%), & BYTE LOCAL_ACCESS(5%), & BYTE DIALUP_ACCESS(5%), & BYTE REMOTE_ACCESS(5%), & BYTE FILL2(5%), & BYTE FILL3(5%), & BYTE PRIMEDAYS, & BYTE FILL4, & BYTE BASE_PRIORITY, & BYTE MAX_JOB_QUEUEING_PRIORITY, & WORD MAX_JOBS_ALLOWED_FOR_UIC, ! (0=NO LIMIT) & WORD MAX_JOBS_ALLOWED_FOR_ACNT, ! (0=NO LIMIT) & WORD MAX_DETACHED_JOBS_FOR_UIC, ! (0=NO LIMIT) & WORD PRCCNT, ! SUBPROCESS CREATION LIMIT & WORD BIOLM, ! BUFFERED I/O LIMIT & WORD DIOLM, ! DIRECT I/O LIMIT & WORD TQCNT, ! TIMER QUEUE ENTRY LIMIT & WORD ASTLM, ! AST QUEUE LIMIT & WORD ENQLM, ! ENQUEUE LIMIT & WORD FILLM, ! OPEN FILE LIMIT & WORD SHRFILLM, ! SHARED FILE LIMIT & LONG WSQUOTA, ! WORKING SET QUOTA & LONG WSDEFAULT, ! DEFAULT WORKING SET SIZE & LONG WSEXTENT, ! WORKING SET EXTENT & LONG PGFLQUOTA, ! PAGE FILE QUOTA & LONG CPUTIME, ! CPU TIME QUOTA & LONG BYTLM, ! BUFFER I/O BYTE COUNT LIMIT & LONG PBYTLM, ! PAGED BUF I/O BYT COUNT LIMIT & LONG JTQUOTA, ! JOB LOGICAL NAME TABLE QUOTA & WORD PROXY_LIM, ! # OF PROXIES USER CAN GRANT & WORD PROXIES, ! # OF PROXIES GRANTED & WORD ACNT_LIM, ! # OF SUB-ACCOUNTS ALLOWED & WORD ACCOUNTS, ! # OF SUB-ACCOUNTS IN USE & STRING FILL5 = 64%, & STRING USER_DATA_AREA = 768% EXTERNAL LONG FUNCTION LIB$DAY ! RETURN JULIAN DATE EXTERNAL LONG FUNCTION SYS$ASCTIM ! CONVERT QUAD-WORD TO ASCII EXTERNAL LONG FUNCTION SYS$FIND_HELD ! FIND IDENTIFIER THAT IS HELD EXTERNAL LONG FUNCTION SYS$IDTOASC ! CONVERT IDENTIFIER TO ASCII EXTERNAL LONG FUNCTION SYS$NUMTIM ! CONVERT QUAD-WORD TO NUMERIC ! ----- LOCAL FUNCTION TO FORMAT A DD-MMM-YYYY DATE AS MM/DD/YY ----- DEF STRING MMDDYY(STRING MMDDYY_DATE) ! ----- Find Month Index, Make Date MMDDYY ----- MMDDYY_DATE = "0" + RIGHT(MMDDYY_DATE, 2%) & IF LEFT(MMDDYY_DATE, 1%) = " " MMDDYY_DATE = NUM1$((POS("JANFEBMARAPRMAYJUNJULAUG"+ & "SEPOCTNOVDEC", MID(MMDDYY_DATE, 4%, 3%), 1%) & + 2%) / 3%) + "/" + LEFT(MMDDYY_DATE, 2%) + "/" & + MID(MMDDYY_DATE, 10%, 2%) ! ----- ENSURE LENGTH OF EIGHT ----- MMDDYY_DATE = "0" + MMDDYY_DATE IF LEN(MMDDYY_DATE) < 8% MMDDYY = MMDDYY_DATE ! RETURN DATE AS MM/DD/YY END DEF ! ----- LOCAL FUNCTION TO CONVERT FROM CLUNKS TO MM/DD/YY STRING ----- DEF STRING FROM_CLUNKS SYS_STATUS = SYS$ASCTIM(, TIME_STRING, CLUNK_DATE() BY REF, ) CALL LIB$STOP(SYS_STATUS BY VALUE) & IF (SYS_STATUS AND 1%) <> SS$_NORMAL FROM_CLUNKS = TRM$(MMDDYY(TIME_STRING)) END DEF DEF STRING RJLB(LONG RJLB_INPUT, LONG RJLB_LENGTH) DECLARE STRING RJLB_STRING RJLB_STRING = NUM1$(RJLB_INPUT) IF LEN(RJLB_STRING) < RJLB_LENGTH THEN RJLB=SPACE$(RJLB_LENGTH-LEN(RJLB_STRING))+RJLB_STRING ELSE RJLB=RJLB_STRING END IF RJLB_STRING = "" END DEF DEF STRING RJL0(LONG RJL0_INPUT, LONG RJL0_LENGTH) DECLARE STRING RJL0_STRING RJL0_STRING = NUM1$(RJL0_INPUT) IF LEN(RJL0_STRING) < RJL0_LENGTH THEN RJL0 = STRING$(RJL0_LENGTH - LEN(RJL0_STRING), & 48%) + RJL0_STRING ELSE IF LEN(RJL0_STRING) = RJL0_LENGTH THEN RJL0 = RJL0_STRING ELSE RJL0 = STRING$(RJL0_LENGTH, 42%) END IF END IF RJL0_STRING = "" END DEF DEF LONG CHECK_FOR_HEADINGS ON ERROR GOTO CHECK_FOR_HEADINGS_ERROR CHECK_FOR_HEADINGS = FALSE ! ASSUME SUCCESS STATUS EXIT DEF IF LINE_COUNTER < LINES_PER_PAGE CHECK_FOR_HEADINGS = TRUE ! ASSUME ERROR STATUS PAGE_COUNTER = PAGE_COUNTER + 1% IF LINE_COUNTER <> 99% THEN IF REPORT_OUTPUT = "F" THEN ! ----- NO FORM FEED IF BUILDING A COMMAND ----- ! ----- FILE ----- SELECT REPORT_TYPE CASE "L", "M", "N", "O", "P" CASE ELSE PRINT #10%, FF END SELECT ELSE PRINT #10% PRINT #10%, TAB(21%); & "(Press the RETURN key to continue)"; LINPUT_FLAG = TRUE LINPUT #10%, TEMP_STRING LINPUT_FLAG = FALSE PRINT CLEAR_VT100_SCREEN END IF END IF IF END_OF_FILE_FLAG THEN SELECT REPORT_TYPE CASE "K" PRINT #10%, "Identifier"; & TAB(11%); "Owner"; TAB(40%); & "Identifier"; TAB(51%); "Owner"; IF REPORT_OUTPUT = "F" THEN PRINT #10%, TAB(80%); & "Identifier"; TAB(91%); "Owner" ELSE PRINT #10% END IF CASE ELSE PRINT #10%, TAB(3%); "UIC"; TAB(18%); & "Owner"; TAB(43%); "UIC"; & TAB(58%); "Owner"; IF REPORT_OUTPUT = "F" THEN PRINT #10%, TAB(83%); "UIC"; & TAB(98%); "Owner" ELSE PRINT #10% END IF END SELECT PRINT #10% LINE_COUNTER = 2% CHECK_FOR_HEADINGS = FALSE ! RETURN SUCCESS STATUS EXIT DEF END IF SELECT REPORT_TYPE CASE "A" ! OWNER, USERNAME, UIC REPORT IF REPORT_OUTPUT = "F" THEN PRINT #10%, "SYSUAF OWNER, USERNAME,"; & " UIC, DIR Report" PRINT #10% PRINT #10%, & " Owner "; & " Username "; & " UIC "; & " Default Directory" LINE_COUNTER = 3% ELSE PRINT #10%, & " Owner "; & " Username "; & " UIC" LINE_COUNTER = 1% END IF CASE "B" ! USERNAME, FLAGS REPORT IF REPORT_OUTPUT = "F" THEN PRINT #10%, "SYSUAF USERNAME, FLAGS,"; & " ACCOUNT AND PASSWORD CHANGE"; & " AND EXPIRATION DATES Report" PRINT #10% END IF PRINT #10%, & " D"; & " L C D D D D P D D A" PRINT #10%, & " I"; & " D O A I I I I G P W I I U" PRINT #10%, & " S"; & " E C P S S S S E W D A S S T" PRINT #10%, & " C"; & " F K T A W N M N D E U R R O" PRINT #10%, & " T"; & " C P I C E E A P E X D E E L" PRINT #10%, & " L"; & " L W V N L W I W X P I P C O"; PRINT #10%, TAB(64%); & " Account Password Date of Pwd"; & " Date of Pwd2 Last Interactive"; & IF REPORT_OUTPUT = "F" PRINT #10% PRINT #10%, & "Username Y"; & " I D E T C M L D P 2 T O O G"; PRINT #10%, TAB(64%); & "Expiration Lifetime Change "; & " Change Login Date"; & IF REPORT_OUTPUT = "F" PRINT #10% IF REPORT_OUTPUT = "F" THEN ! ----- PRINT 131 MINUS SIGNS ----- PRINT #10%, STRING$(131%, 45%) LINE_COUNTER = 11% ELSE ! ----- PRINT 62 MINUS SIGNS ----- PRINT #10%, STRING$(62%, 45%) LINE_COUNTER = 9% END IF PRINT #10%, & " a b"; & " c d e f g h i j k l m n o" CASE "C" ! WSDEFAULT, QUOTA, EXTENT IF REPORT_OUTPUT = "F" THEN PRINT #10%, "SYSUAF WSDEFAULT, QUOTA,"; & " EXTENT Report" PRINT #10% PRINT #10%, & "Username "; & " WSDEFAULT WSQUOTA "; & " WSEXTENT ENQLM FILLM ASTLM"; & " BIOLM DIOLM PRCCNT "; & "BYTLM PBYTLM" LINE_COUNTER = 3% ELSE PRINT #10%, & "Username "; & " WSDEFAULT WSQUOTA WSEXTENT" LINE_COUNTER = 1% END IF CASE "D" ! USERNAMES ONLY ! ----- NO HEADINGS IF JUST LIST OF USERNAMES ----- LINE_COUNTER = 0% CASE "E" ! USERNAMES WHO HAVE LOGGED IN ! ----- NO HEADINGS IF JUST LIST OF USERNAMES WHO ----- ! ----- HAVE LOGGED IN ----- LINE_COUNTER = 0% CASE "F" ! USERS WHO HAVE NEVER LOGGED IN ! ----- NO HEADINGS IF JUST LIST OF USERNAMES WHO ----- ! ----- HAVE NEVER LOGGED IN ----- LINE_COUNTER = 0% CASE "G" ! 6 MONTH NOT LOGGED IN ! ----- LIST OF USERNAMES AND DATES WHO HAVE NOT ----- ! ----- LOGGED IN WITHIN 6 MONTHS ----- PRINT #10%, " Report of all users who have"; & " not logged in within the last 6"; & " months (180 days)" PRINT #10% PRINT #10%, & " "; & "Date of Last Date of Last" PRINT #10%, & "Username Int"; & "eractive Login Non-Interactive Login" LINE_COUNTER = 4% CASE "H" ! PRIVILEGE REPORT IF REPORT_OUTPUT = "F" THEN PRINT #10%, "SYSUAF PRIVILEGE Report" PRINT #10% LINE_COUNTER = 12% ELSE LINE_COUNTER = 10% END IF PRINT #10%, & " A"; & " D D "; & " S" PRINT #10%, & " L"; & " I O E "; & " R E U" PRINT #10%, & " L"; & " A B B C C D A W X G G L N P P"; & " P P P P P E C S S S S S T T P V" PRINT #10%, & " S"; & " L U Y M M E G N Q G R R O M E F H"; & " R R R R S A U E S S Y Y Y Y M M G O W" PRINT #10%, & " A P"; & " T G P E K T N G U R P P G O T O N Y"; & " M M M M W D R T H H S S S S P P R L O" PRINT #10%, & " C O"; & " P C A X R A O R O O N P _ U M P M _"; & " C G J M A A I P A M G L N P J M A P R" PRINT #10%, & " N O"; & " R H S E N C S A T U A R I N B E A I"; & " E B N B P L T R R E B C A R N B D R L" PRINT #10%, & "Username T L"; & " I K S C L H E D A P M V O T X R P O"; & " B L L X M L Y V E M L K M V L X E O D" PRINT #10%, STRING$(110%, 45%) ! PRINT 110 MINUS SIGNS PRINT #10%, & " a b"; & " c d e f g h i j k l m n o p q r s t"; & " u v w x y z 1 2 3 4 5 6 7 8 9 0 + $ %" CASE "I" ! FILL BYTES REPORT IF REPORT_OUTPUT = "F" THEN PRINT #10%, "SYSUAF FILL BYTES Report" PRINT #10% LINE_COUNTER = 3% ELSE LINE_COUNTER = 1% END IF PRINT #10%, & "Username "; & "Byte Byte Byte Byte Byte Byte"; & " Byte Byte Byte Byte Byte Byte"; & " Byte Byte" CASE "J", "K" ! USERNAME, UIC, DEV/DIR, LGICMD IF REPORT_OUTPUT = "F" THEN SELECT REPORT_TYPE CASE "J" PRINT #10%, "SYSUAF USERNAME,"; & " UIC, DEV/DIR,"; & " LGICMD, ACCOUNT Report" CASE "K" PRINT #10%, "SYSUAF USERNAME,"; & " UIC, DEV/DIR,"; & " LGICMD, ACCOUNT"; & ", IDENTIFIER Report" END SELECT PRINT #10% PRINT #10%, & "Username UIC Devic"; & "e Directory "; & " LGICMD"; & " "; & " Account" LINE_COUNTER = 3% ELSE PRINT #10%, & "Username UIC Devic"; & "e Directory LGICMD" LINE_COUNTER = 1% END IF CASE "L" ! REVOKE/IDENTIFIER ident usern ! ----- NO HEADINGS IF REVOKE/IDENTIFIER REPORT ----- LINE_COUNTER = 0% CASE "M" ! REPORT OF MATCHING IDENTIFIER ! ----- NO HEADINGS IF MATCHING IDENTIFIER REPORT ----- LINE_COUNTER = 0% CASE "N" ! AUTHORIZE LGICMD COMMAND FILE ! ----- NO HEADINGS IF AUTHORIZE LGICMD COMMAND ----- LINE_COUNTER = 0% CASE "O" ! AUTHORIZE DEV/DIR COMMAND FILE ! ----- NO HEADINGS IF AUTHORIZE DEV/DIR COMMAND ----- LINE_COUNTER = 0% CASE "P" ! AUTHORIZE QUOTA COMMAND FILE ! ----- NO HEADINGS IF AUTHORIZE QUOTA COMMAND ----- LINE_COUNTER = 0% CASE "R" ! USER-DATA REPORT PRINT #10%, "Username User Data" LINE_COUNTER = 1% END SELECT CHECK_FOR_HEADINGS = FALSE ! RETURN SUCCESS STATUS EXIT DEF CHECK_FOR_HEADINGS_ERROR: RESUME LINPUT_ERROR IF LINPUT_FLAG ON ERROR GO BACK LINPUT_ERROR: END DEF DEF LONG OCT_TO_DEC(LONG OCT_UIC) DECLARE LONG DEC_OUTPUT DEC_OUTPUT = 0% DECLARE LONG OCT_DIV DECLARE LONG OCT_INPUT OCT_INPUT = OCT_UIC FOR TEMP = 2% TO 0% STEP -1% OCT_DIV = INT(OCT_INPUT / 8^TEMP) IF OCT_DIV > 0% THEN DEC_OUTPUT = DEC_OUTPUT + 10^TEMP * OCT_DIV OCT_INPUT = OCT_INPUT - 8^TEMP * OCT_DIV END IF NEXT TEMP OCT_TO_DEC = DEC_OUTPUT END DEF ! ----- LOCAL FUNCTION TO RETURN THE DIFFERENCE IN DATES ----- ! ----- BETWEEN A QUADWORD AND TODAY ----- DEF LONG DELTA_DATES SYS_STATUS = LIB$DAY(JULIAN_DAYS, FIRST_BINTIM() BY REF, ) CALL LIB$STOP(SYS_STATUS BY VALUE) & IF (SYS_STATUS AND 1%) <> SS$_NORMAL DELTA_DATES = ABS%(TODAYS_DATE - JULIAN_DAYS) END DEF ! ----- LOOKS UP AND DISPLAYS ALL IDENTIFIERS ASSOCIATED WITH ----- ! ----- A SPECIFIC UIC ----- DEF LONG FIND_IDENTIFIER FIND_IDENTIFIER = TRUE ! ASSUME ERROR STATUS CONTEXT = 0% HOLDER(0%) = UIC HOLDER(1%) = 0% SYS_STATUS = SS$_NORMAL WHILE SYS_STATUS = SS$_NORMAL SYS_STATUS = SYS$FIND_HELD(HOLDER() BY REF, & ID, , CONTEXT) SELECT SYS_STATUS CASE SS$_NORMAL SYS_STATUS = SYS$IDTOASC(ID BY VALUE, & ID_NAME_LENGTH, ID_NAME,,,) SELECT SYS_STATUS CASE SS$_NORMAL SELECT REPORT_TYPE CASE "K" PRINT #10%, TAB(20%); & LEFT(ID_NAME, & ID_NAME_LENGTH) ! ----- Accumulate ----- ! ----- IDENTIFIER Sort ----- ! ----- Entries ----- SRT_COUNTER = SRT_COUNTER + 1% SRT(SRT_COUNTER, 0%) = & LEFT(ID_NAME, & ID_NAME_LENGTH) & + TRM$(USER_NAME) SRT(SRT_COUNTER, 1%) = & TRM$(USER_NAME) CASE "L" PRINT #10%, "REVOKE/I"; & "DENTIFIER "; & LEFT(ID_NAME, & ID_NAME_LENGTH);& " "; TRM$(USER_NAME) COMMAND_FILE_RECORD_WRITTEN & = TRUE ITERATE CASE "M" ITERATE IF LEFT(ID_NAME,& ID_NAME_LENGTH) & <> THE_IDENTIFIER PRINT #10%, "MODIFY "; & TRM$(USER_NAME); "/" COMMAND_FILE_RECORD_WRITTEN & = TRUE ITERATE CASE ELSE PRINT #10%, TAB(20%); & LEFT(ID_NAME, & ID_NAME_LENGTH) END SELECT CASE SS$_NOSUCHID PRINT #10%, "ERROR: "; & "SS$_NOSUCHID FROM SYS$IDTOASC" CASE ELSE PRINT #10%, "ERROR: "; & "SYS_STATUS="; SYS_STATUS END SELECT LINE_COUNTER = LINE_COUNTER + 1% EXIT DEF IF CHECK_FOR_HEADINGS CASE SS$_NOSUCHID CASE ELSE PRINT #10%, "ERROR: SYS_STATUS="; SYS_STATUS LINE_COUNTER = LINE_COUNTER + 1% EXIT DEF IF CHECK_FOR_HEADINGS END SELECT NEXT SYS_STATUS = SS$_NORMAL FIND_IDENTIFIER = FALSE ! RETURN SUCCESS STATUS END DEF PRINT CLEAR_VT100_SCREEN; "SYSUAF REPORT PROGRAM V2.10" PRINT "Report Type:" PRINT "A) Owner, Username, UIC (including sort by UIC)"; & " (incl Default Dir if to a file)" PRINT "B) Username, Flags (including sort by UIC) (incl Acct"; & " and PW Dates if to a file)" PRINT "C) Wsdefault, Wsextent, and Wsquota (incl ENQLM,"; & " FILLM, ASTLM, BIOLM," PRINT " DIOLM, BYTLM, PBYTLM if to a file)" PRINT "D) Usernames only (No report headings are printed)" PRINT "E) Usernames, dates, and UICs who have ever logged in"; & " (No report headings)" PRINT "F) Usernames who have never logged in (No report"; & " headings are printed)" PRINT "G) Usernames and dates who have not logged in within"; & " the past 6 months" PRINT "H) Privileges (Default AND Authorized) (132-columns)" PRINT "I) Fill Bytes Report (to a file)" PRINT "J) Username, UIC, Default Dev/Dir, LGICMD (ACCT if"; & " file) (incl sort by UIC)" PRINT "K) Same as J) but also lists all identifiers held by"; & " each user (sorts by IDENT)" PRINT "L) Creates AUTHORIZE command file of:"; & " REVOKE/IDENTIFIER identifier username" PRINT 'M) AUTHORIZE "MODIFY username/" command file of all'; & " usernames holding a" PRINT " specific identifier" PRINT 'N) AUTHORIZE "MODIFY username/LGICMD=file-spec"'; & " command file of all usernames" PRINT 'O) AUTHORIZE "MODIFY username/DEVICE/DIRECTORY/PWDMIN"'; & ' cmd file of all users' PRINT 'P) AUTHORIZE "MODIFY xxxxusername/WSDEFAULT=value'; & "/WSQUOTA=value/WSEXTENT=value" PRINT ' /ENQLM=value/FILLM=value" command'; & " file of all usernames" PRINT 'Q) DISKQUOTA "ADD [uic]/PERM=999999/OVER=500"'; & " cmd file for all users for DUA0:" PRINT "R) Report of all accounts having any user-data" REPORT_TYPE = "XX" UNTIL POS("ABCDEFGHIJKLMNOPQR", REPORT_TYPE, 1%) > 0% AND & LEN(REPORT_TYPE) = 1% LINPUT REPORT_TYPE REPORT_TYPE = EDIT$(REPORT_TYPE, 38%) ! CONVERT TO UPPERCASE REPORT_TYPE = "XX" IF REPORT_TYPE = "" OR LEN(REPORT_TYPE) = 0% IF POS("ABCDEFGHIJKLMNOPQR", REPORT_TYPE, 1%) = 0% OR & LEN(REPORT_TYPE) <> 1% THEN PRINT PRINT "Invalid Response - Try Again"; BEL PRINT END IF NEXT PRINT PRINT REPORT_OUTPUT = "F" LINES_PER_PAGE = 60% REPORT_WIDTH = 132% SELECT REPORT_TYPE CASE "I", "L", "M", "N", "O", "P", "Q" CASE ELSE IF REPORT_TYPE = "H" THEN PRINT "Send Report to: S)creen or F)ile "; ELSE PRINT "Send Report to: S)creen or F)ile "; END IF REPORT_OUTPUT = "XX" UNTIL POS("SF", REPORT_OUTPUT, 1%) > 0% AND & LEN(REPORT_OUTPUT) = 1% INPUT REPORT_OUTPUT ! ----- CONVERT TO UPPERCASE ----- REPORT_OUTPUT = EDIT$(REPORT_OUTPUT, 38%) IF REPORT_OUTPUT = "" OR LEN(REPORT_OUTPUT) = 0% THEN IF REPORT_TYPE = "H" THEN REPORT_OUTPUT = "F" ELSE REPORT_OUTPUT = "S" END IF END IF IF POS("SF", REPORT_OUTPUT, 1%) = 0% OR & LEN(REPORT_OUTPUT) <> 1% THEN PRINT PRINT "Invalid Response - Try Again"; BEL PRINT END IF NEXT IF REPORT_OUTPUT <> "F" THEN REPORT_WIDTH = 80% LINES_PER_PAGE = 21% END IF END SELECT SELECT REPORT_TYPE CASE "M" THE_IDENTIFIER = "" UNTIL THE_IDENTIFIER <> "" INPUT "Enter IDENTIFIER to search for "; THE_IDENTIFIER ! ----- CONVERT TO UPPERCASE ----- THE_IDENTIFIER = EDIT$(THE_IDENTIFIER, 38%) IF THE_IDENTIFIER = "" THEN PRINT PRINT "Invalid Response - Try Again"; BEL PRINT END IF NEXT END SELECT PRINT PRINT CLEAR_VT100_SCREEN PRINT "Working..." IF REPORT_OUTPUT = "F" ! ----- GET TODAY'S JULIAN DATE ----- SYS_STATUS = LIB$DAY(TODAYS_DATE, , ) CALL LIB$STOP(SYS_STATUS BY VALUE) IF (SYS_STATUS AND 1%) <> SS$_NORMAL OPEN "SYS$SYSTEM:SYSUAF.DAT" FOR INPUT AS FILE #1%, & RECORDSIZE 1412%, & ACCESS READ, & ALLOW MODIFY, & INDEXED VARIABLE, & MAP UAF, & RECORDTYPE ANY IF REPORT_OUTPUT <> "F" THEN OPEN "TT" FOR OUTPUT AS FILE #10%, RECORDSIZE 80% ELSE OPEN "SYSUAF.LIS" FOR OUTPUT AS FILE #10%, & SEQUENTIAL, & RECORDSIZE 132% SELECT REPORT_TYPE CASE "L", "M", "N", "O", "P" PRINT #10%, & '$SAVE_PRIV=F$SETPRV("SYSPRV,BYPASS,CMKRNL")' PRINT #10%, "$SAVE_UIC=F$USER()" PRINT #10%, "$ON ERROR THEN GOTO DONE" PRINT #10%, "$SET UIC [SYSTEM]" PRINT #10%, "$DEFINE/USER SYSUAF SYS$SYSTEM:SYSUAF.DAT" PRINT #10%, "$DEFINE/USER NETUAF SYS$SYSTEM:NETUAF.DAT" PRINT #10%, "$RUN SYS$SYSTEM:AUTHORIZE" CASE "Q" PRINT #10%, & '$SAVE_PRIV=F$SETPRV("SYSPRV,BYPASS,CMKRNL")' PRINT #10%, "$SAVE_UIC=F$USER()" PRINT #10%, "$ON ERROR THEN GOTO DONE" PRINT #10%, "$RUN SYS$SYSTEM:DISKQUOTA" PRINT #10%, "USE DUA0:" END SELECT END IF GOTO END_PROGRAM IF CHECK_FOR_HEADINGS ! PRINT INITIAL HEADINGS WHILE TRUE 20 GET #1% CPUTIME_HOURS = INT(CPUTIME / 360000) CPUTIME = CPUTIME - CPUTIME_HOURS * 360000 CPUTIME_MINUTES = INT(CPUTIME / 6000) CPUTIME = CPUTIME - CPUTIME_MINUTES * 6000 CPUTIME_SECONDS = INT(CPUTIME / 100) CPUTIME = CPUTIME - CPUTIME_SECONDS * 100 CPUTIME_STRING = RJLB(CPUTIME_HOURS, 2%) + ":" + & RJL0(CPUTIME_MINUTES, 2%) + ":" + & RJL0(CPUTIME_SECONDS, 2%) + "." + & RJL0(CPUTIME, 2%) UIC_GROUP = OCT_TO_DEC(OCT_UIC_GROUP) UIC_MEMBER = OCT_TO_DEC(OCT_UIC_MEMBER) SELECT REPORT_TYPE CASE "A" ! OWNER, USERNAME, UIC REPORT ! ----- Accumulate UIC Sort Entries ----- SRT_COUNTER = SRT_COUNTER + 1% SRT(SRT_COUNTER, 0%) = "[" + & RJL0(UIC_GROUP, 3%) + "," + & RJL0(UIC_MEMBER, 3%) + "]" SRT(SRT_COUNTER, 1%) = TRM$(USER_NAME) IF REPORT_OUTPUT <> "F" THEN PRINT #10%, & TRM$(LEFT(OWNER_NAME, & OWNER_NAME_LENGTH)); & TAB(32%); TRM$(USER_NAME); & TAB(65%); "["; & RJL0(UIC_GROUP, 3%); & ","; RJL0(UIC_MEMBER, 3%); "]" ELSE IF DIRECTORY_NAME_LENGTH < 52% THEN TEMP = DIRECTORY_NAME_LENGTH TEMP_STRING = "" ELSE TEMP = 51% TEMP_STRING = "!" END IF PRINT #10%, & TRM$(LEFT(OWNER_NAME, & OWNER_NAME_LENGTH)); & TAB(32%); TRM$(USER_NAME); & TAB(65%); "["; & RJL0(UIC_GROUP, 3%); & ","; & RJL0(UIC_MEMBER, 3%); & "] "; & LEFT(DIRECTORY_NAME, & TEMP); & TEMP_STRING END IF LINE_COUNTER = LINE_COUNTER + 1% GOTO END_PROGRAM IF CHECK_FOR_HEADINGS CASE "B" ! USERNAME, FLAGS REPORT ! ----- Accumulate UIC Sort Entries ----- SRT_COUNTER = SRT_COUNTER + 1% SRT(SRT_COUNTER, 0%) = "[" + & RJL0(UIC_GROUP, 3%) + "," + & RJL0(UIC_MEMBER, 3%) + "]" SRT(SRT_COUNTER, 1%) = TRM$(USER_NAME) PRINT #10%, TRM$(USER_NAME); & TAB(33%); FOR FLAG = 1% TO 15% IF FLAGS(FLAG_INDEXS(FLAG)) AND & BIT_MASK(FLAG_BIT_POSITIONS(FLAG)) THEN PRINT #10%, MID(PRINT_STRING, & FLAG, 1%); " "; ELSE PRINT #10%," "; END IF NEXT FLAG IF REPORT_OUTPUT = "F" THEN CLUNK_DATE(0%) = ACCOUNT_EXPIRATION_DATE(0%) CLUNK_DATE(1%) = ACCOUNT_EXPIRATION_DATE(1%) IF CLUNK_DATE(0%) = 0% AND CLUNK_DATE(1%) = 0% THEN PRINT #10%, TAB(65%); & " (none) "; ELSE PRINT #10%, TAB(65%); & FROM_CLUNKS; " "; END IF SYS_STATUS = SYS$NUMTIM( & TIME_BUFFER() BY REF, & PASSWORD_LIFETIME() BY REF) CALL LIB$STOP(SYS_STATUS BY VALUE) & IF (SYS_STATUS AND 1%) <> SS$_NORMAL IF PASSWORD_LIFETIME(0%) = 0% AND & PASSWORD_LIFETIME(1%) = 0% THEN PRINT #10%, " (none) "; ELSE PRINT #10% USING " ##### ", & TIME_BUFFER(2%); END IF CLUNK_DATE(0%) = DATE_OF_PASSWORD_CHANGE(0%) CLUNK_DATE(1%) = DATE_OF_PASSWORD_CHANGE(1%) IF CLUNK_DATE(0%) = 0% AND CLUNK_DATE(1%) = 0% THEN PRINT #10%, " (none) "; ELSE IF CLUNK_DATE(0%) = -1% AND & CLUNK_DATE(1%) = -1% THEN PRINT #10%, " (pre-expired)"; ELSE PRINT #10%, " "; & FROM_CLUNKS; " "; END IF END IF CLUNK_DATE(0%) = DATE_OF_PASSWORD2_CHNGE(0%) CLUNK_DATE(1%) = DATE_OF_PASSWORD2_CHNGE(1%) IF CLUNK_DATE(0%) = 0% AND CLUNK_DATE(1%) = 0% THEN PRINT #10%, " (none) "; ELSE PRINT #10%, FROM_CLUNKS; " "; END IF CLUNK_DATE(0%) = LAST_INTER_LOGIN_DATE(0%) CLUNK_DATE(1%) = LAST_INTER_LOGIN_DATE(1%) IF CLUNK_DATE(0%) = 0% AND CLUNK_DATE(1%) = 0% THEN PRINT #10%, " (none)"; ELSE PRINT #10%, FROM_CLUNKS; END IF END IF PRINT #10% LINE_COUNTER = LINE_COUNTER + 1% GOTO END_PROGRAM IF CHECK_FOR_HEADINGS CASE "C" ! WSDEFAULT, QUOTA, EXTENT IF REPORT_OUTPUT = "F" THEN PRINT #10% USING & WORKING_SET_FORMAT_FILE, & USER_NAME, WSDEFAULT, WSQUOTA, & WSEXTENT, ENQLM, FILLM, ASTLM, & BIOLM, DIOLM, PRCCNT, BYTLM, PBYTLM ELSE PRINT #10% USING WORKING_SET_FORMAT, & USER_NAME, WSDEFAULT, WSQUOTA, WSEXTENT END IF LINE_COUNTER = LINE_COUNTER + 1% GOTO END_PROGRAM IF CHECK_FOR_HEADINGS CASE "D" ! USERNAMES ONLY PRINT #10%, TRM$(USER_NAME) CASE "E" ! USERNAMES WHO HAVE LOGGED IN CLUNK_DATE(0%) = LAST_INTER_LOGIN_DATE(0%) CLUNK_DATE(1%) = LAST_INTER_LOGIN_DATE(1%) ITERATE IF CLUNK_DATE(0%) = 0% AND CLUNK_DATE(1%) = 0% PRINT #10%, USER_NAME; " "; FROM_CLUNKS; & " ["; RJL0(UIC_GROUP, 6%); ","; & RJL0(UIC_MEMBER, 6%); "]" CASE "F" ! USERS WHO HAVE NEVER LOGGED IN CLUNK_DATE(0%) = LAST_INTER_LOGIN_DATE(0%) CLUNK_DATE(1%) = LAST_INTER_LOGIN_DATE(1%) ITERATE IF CLUNK_DATE(0%) <> 0% OR CLUNK_DATE(1%) <> 0% PRINT #10%, TRM$(USER_NAME) CASE "G" ! 6 MONTH NOT LOGGED IN FIRST_BINTIM(0%) = LAST_INTER_LOGIN_DATE(0%) FIRST_BINTIM(1%) = LAST_INTER_LOGIN_DATE(1%) ITERATE IF DELTA_DATES < 180% FIRST_BINTIM(0%) = LAST_NINTER_LOGIN_DATE(0%) FIRST_BINTIM(1%) = LAST_NINTER_LOGIN_DATE(1%) ITERATE IF DELTA_DATES < 180% PRINT #10%, TRM$(USER_NAME); TAB(37%); CLUNK_DATE(0%) = LAST_INTER_LOGIN_DATE(0%) CLUNK_DATE(1%) = LAST_INTER_LOGIN_DATE(1%) IF CLUNK_DATE(0%) = 0% AND CLUNK_DATE(1%) = 0% THEN PRINT #10%, " (none)"; TAB(59%); ELSE PRINT #10%, FROM_CLUNKS; TAB(59%); END IF CLUNK_DATE(0%) = LAST_NINTER_LOGIN_DATE(0%) CLUNK_DATE(1%) = LAST_NINTER_LOGIN_DATE(1%) IF CLUNK_DATE(0%) = 0% AND CLUNK_DATE(1%) = 0% THEN PRINT #10%, " (none)" ELSE PRINT #10%, FROM_CLUNKS END IF LINE_COUNTER = LINE_COUNTER + 1% GOTO END_PROGRAM IF CHECK_FOR_HEADINGS CASE "H" ! PRIVILEGE REPORT PRINT #10%, TRM$(USER_NAME); & TAB(33%); FOR PRIVILEGE_COUNTER = 1% TO 39% PRIVILEGE_BIT = & PRIVILEGE_BIT_OFFSET(PRIVILEGE_COUNTER) PRIVILEGE_IDX = & PRIVILEGE_IDX_OFFSET(PRIVILEGE_COUNTER) IF (PRIVILEGES(PRIVILEGE_IDX) OR & DEFAULT_PRIVILEGES( & PRIVILEGE_IDX)) AND & BIT_MASK(PRIVILEGE_BIT) THEN PRINT #10%, MID(PRINT_STRING, & PRIVILEGE_COUNTER, 1%); " "; ELSE PRINT #10%," "; END IF NEXT PRIVILEGE_COUNTER PRINT #10% LINE_COUNTER = LINE_COUNTER + 1% GOTO END_PROGRAM IF CHECK_FOR_HEADINGS CASE "I" ! FILL BYTES REPORT PRINT #10%, USER_NAME; PRINT #10% USING B_FORMAT, & FILL1, FILL2(0%), FILL2(1%), FILL2(2%), & FILL2(3%), FILL2(4%), FILL2(5%), & FILL3(0%), FILL3(1%), FILL3(2%), & FILL3(3%), FILL3(4%), FILL3(5%), FILL4 LINE_COUNTER = LINE_COUNTER + 1% GOTO END_PROGRAM IF CHECK_FOR_HEADINGS CASE "J", "K" ! USERNAME, UIC, DEV/DIR, LGICMD SELECT REPORT_TYPE CASE "J" ! ----- Accumulate UIC Sort Entries ----- SRT_COUNTER = SRT_COUNTER + 1% SRT(SRT_COUNTER, 0%) = "[" + & RJL0(UIC_GROUP, 3%) + "," + & RJL0(UIC_MEMBER, 3%) + "]" SRT(SRT_COUNTER, 1%) = TRM$(USER_NAME) END SELECT IF REPORT_OUTPUT = "F" THEN IF DEVICE_LENGTH < 20% THEN DEVICE_SPEC = LEFT(THE_DEVICE, & DEVICE_LENGTH) ELSE DEVICE_SPEC = LEFT(THE_DEVICE, & 18%) + "!" END IF IF DIRECTORY_NAME_LENGTH < 29% THEN DIRECTORY_SPEC = LEFT( & DIRECTORY_NAME, & DIRECTORY_NAME_LENGTH) ELSE DIRECTORY_SPEC = & LEFT(DIRECTORY_NAME, 27%) + "!" END IF IF LOGIN_COMMAND_FILE_LENGTH < 51% THEN LGICMD_SPEC = & LEFT(LOGIN_COMMAND_FILE,& LOGIN_COMMAND_FILE_LENGTH) ELSE LGICMD_SPEC = & LEFT(LOGIN_COMMAND_FILE,& 49%) + "!" END IF ACCOUNT_SPEC = TRM$(ACCOUNT_NAME) IF LEN(ACCOUNT_SPEC) > 10% THEN ACCOUNT_SPEC = & LEFT(ACCOUNT_SPEC, 9%) + "!" END IF PRINT #10%, TRM$(USER_NAME); & TAB(13%); "["; RJL0(UIC_GROUP, & 3%); ","; RJL0(UIC_MEMBER, 3%); & "] "; DEVICE_SPEC; TAB(42%); & DIRECTORY_SPEC; TAB(71%); & LGICMD_SPEC; TAB(123%); ACCOUNT_SPEC LINE_COUNTER = LINE_COUNTER + 1% GOTO END_PROGRAM IF CHECK_FOR_HEADINGS SELECT REPORT_TYPE CASE "K" GOTO END_PROGRAM IF FIND_IDENTIFIER END SELECT ELSE IF DEVICE_LENGTH < 15% THEN DEVICE_SPEC = LEFT(THE_DEVICE, & DEVICE_LENGTH) ELSE DEVICE_SPEC = LEFT(THE_DEVICE, & 13%) + "!" END IF IF DIRECTORY_NAME_LENGTH < 14% THEN DIRECTORY_SPEC = LEFT( & DIRECTORY_NAME, & DIRECTORY_NAME_LENGTH) ELSE DIRECTORY_SPEC = & LEFT(DIRECTORY_NAME, 12%) + "!" END IF IF LOGIN_COMMAND_FILE_LENGTH < 30% THEN LGICMD_SPEC = & LEFT(LOGIN_COMMAND_FILE,& LOGIN_COMMAND_FILE_LENGTH) ELSE LGICMD_SPEC = & LEFT(LOGIN_COMMAND_FILE,& 28%) + "!" END IF PRINT #10%, TRM$(USER_NAME); & TAB(13%); "["; RJL0(UIC_GROUP, & 3%); ","; RJL0(UIC_MEMBER, 3%); & "] "; DEVICE_SPEC; TAB(37%); & DIRECTORY_SPEC; TAB(51%); LGICMD_SPEC LINE_COUNTER = LINE_COUNTER + 1% GOTO END_PROGRAM IF CHECK_FOR_HEADINGS SELECT REPORT_TYPE CASE "K" GOTO END_PROGRAM IF FIND_IDENTIFIER END SELECT END IF CASE "L" ! REVOKE/IDENTIFIER ident usern GOTO END_PROGRAM IF FIND_IDENTIFIER CASE "M" ! REPORT OF SPECIFIC IDENTIFIER GOTO END_PROGRAM IF FIND_IDENTIFIER CASE "N" ! AUTHORIZE LGICMD COMMANDS IF LEFT(LOGIN_COMMAND_FILE, & LOGIN_COMMAND_FILE_LENGTH) <> " " THEN PRINT #10%, "MODIFY "; TRM$(USER_NAME); & "/LGICMD="; & LEFT(LOGIN_COMMAND_FILE, & LOGIN_COMMAND_FILE_LENGTH) COMMAND_FILE_RECORD_WRITTEN = TRUE END IF CASE "O" ! AUTHORIZE DEV/DIR COMMANDS DEVICE_SPEC = TRM$(LEFT(THE_DEVICE, DEVICE_LENGTH)) DIRECTORY_SPEC = TRM$(LEFT(DIRECTORY_NAME, & DIRECTORY_NAME_LENGTH)) IF DEVICE_SPEC <> "" THEN IF DIRECTORY_SPEC <> " " THEN PRINT #10%, "MODIFY "; & TRM$(USER_NAME); & "/DEVICE="; & DEVICE_SPEC; & "/DIRECTORY="; & DIRECTORY_SPEC; & "/PWDMINIMUM="; & NUM1$(MINIMUM_PASSWORD_LENGTH) ELSE PRINT #10%, "MODIFY "; & TRM$(USER_NAME); & "/DEVICE="; DEVICE_SPEC;& "/PWDMINIMUM="; & NUM1$(MINIMUM_PASSWORD_LENGTH) END IF ELSE IF DIRECTORY_SPEC <> "" THEN PRINT #10%, "MODIFY "; & TRM$(USER_NAME); & "/DIRECTORY="; & DIRECTORY_SPEC; & "/PWDMINIMUM="; & NUM1$(MINIMUM_PASSWORD_LENGTH) ELSE PRINT #10%, "MODIFY "; & TRM$(USER_NAME); & "/PWDMINIMUM="; & NUM1$(MINIMUM_PASSWORD_LENGTH) END IF END IF COMMAND_FILE_RECORD_WRITTEN = TRUE CASE "P" ! AUTHORIZE QUOTA COMMANDS PRINT #10%, "MODIFY "; TRM$(USER_NAME); & "/WSDEFAULT="; NUM1$(WSDEFAULT); & "/WSQUOTA="; NUM1$(WSQUOTA); & "/WSEXTENT="; NUM1$(WSEXTENT); & "/ENQLM="; NUM1$(ENQLM); & "/FILLM="; NUM1$(FILLM) COMMAND_FILE_RECORD_WRITTEN = TRUE CASE "Q" ! DISKQUOTA COMMAND FILE CMDS ! ----- SKIP "DEFAULT" ACCOUNT ----- IF TRM$(USER_NAME) <> "DEFAULT" THEN PRINT #10%, "ADD ["; RJL0(UIC_GROUP, & 7%); ","; RJL0(UIC_MEMBER, 7%); & "]/PERM=999999/OVER=500" COMMAND_FILE_RECORD_WRITTEN = TRUE END IF CASE "R" ! USER-DATA REPORT IF USER_DATA_LENGTH > 0% THEN USER_DATA_STRING = & TRM$(LEFT(USER_DATA_AREA, & USER_DATA_LENGTH)) PRINT #10%, USER_NAME; " "; CHARS_WRITTEN = 33% FOR TEMP = 1% TO USER_DATA_LENGTH TEMP_STRING = & MID(USER_DATA_STRING, TEMP, 1%) SELECT ASCII(TEMP_STRING) CASE 32% TO 126% ! PRINTABLE? STRING_TO_PRINT = TEMP_STRING CASE ELSE ! NON-PRINTABLE STRING_TO_PRINT = "<" + & NUM1$(ASCII( & TEMP_STRING)) + ">" END SELECT IF CHARS_WRITTEN + & LEN(STRING_TO_PRINT) > & REPORT_WIDTH THEN PRINT #10% CHARS_WRITTEN = 0% LINE_COUNTER = LINE_COUNTER + 1% GOTO END_PROGRAM IF & CHECK_FOR_HEADINGS END IF PRINT #10%, STRING_TO_PRINT; CHARS_WRITTEN = & CHARS_WRITTEN + & LEN(STRING_TO_PRINT) NEXT TEMP PRINT #10% ! END DETAIL LINE LINE_COUNTER = LINE_COUNTER + 1% GOTO END_PROGRAM IF CHECK_FOR_HEADINGS END IF CASE ELSE GOTO END_PROGRAM END SELECT NEXT ! ----- THE PROGRAM WILL BRANCH HERE UPON REACHING THE END OF FILE ----- ! ----- OF THE USER AUTHORIZATION FILE. ----- END_OF_FILE: ! ----- FINISH AUTHORIZE COMMAND FILE IF REQUIRED ----- SELECT REPORT_TYPE CASE "L", "M", "N", "O", "P" PRINT #10%, "$DONE: SET UIC 'SAVE_UIC'" PRINT #10%, "$SET PROC/PRIV=('SAVE_PRIV')" CASE "Q" PRINT #10%, "EXIT" PRINT #10%, "$DONE: SET UIC 'SAVE_UIC'" PRINT #10%, "$SET PROC/PRIV=('SAVE_PRIV')" END SELECT GOTO END_PROGRAM IF SRT_COUNTER = 0% ! SKIP IF NO DATA TO SORT END_OF_FILE_FLAG = TRUE ! TO INDICATE DONE WITH FILE ! ----- SORT THE SORT ARRAY BY THE ZERO-TH ELEMENT ----- TEMP9 = 1% TEMP = 1% TEMP3 = SRT_COUNTER SORT_30: GOTO SORT_60 IF TEMP >= TEMP3 SORT_40: TEMP4 = TEMP TEMP1 = INT(TEMP3 + TEMP)/2. TEMP6 = SRT(TEMP1, 0%) TEMP8 = SRT(TEMP1, 1%) IF SRT(TEMP, 0%) > TEMP6 THEN SRT(TEMP1, 0%) = SRT(TEMP, 0%) SRT(TEMP, 0%) = TEMP6 TEMP6 = SRT(TEMP1, 0%) SRT(TEMP1, 1%) = SRT(TEMP, 1%) SRT(TEMP, 1%) = TEMP8 TEMP8 = SRT(TEMP1, 1%) END IF TEMP5 = TEMP3 IF SRT(TEMP3, 0%) < TEMP6 THEN SRT(TEMP1, 0%) = SRT(TEMP3, 0%) SRT(TEMP3, 0%) = TEMP6 TEMP6 = SRT(TEMP1, 0%) SRT(TEMP1, 1%) = SRT(TEMP3, 1%) SRT(TEMP3, 1%) = TEMP8 TEMP8 = SRT(TEMP1, 1%) ELSE GOTO SORT_50 END IF IF SRT(TEMP, 0%) >= TEMP6 THEN SRT(TEMP1, 0%) = SRT(TEMP, 0%) SRT(TEMP, 0%) = TEMP6 TEMP6 = SRT(TEMP1, 0%) SRT(TEMP1, 1%) = SRT(TEMP, 1%) SRT(TEMP, 1%) = TEMP8 TEMP8 = SRT(TEMP1, 1%) END IF SORT_50: TEMP5 = TEMP5 - 1% TEMP5 = TEMP5 - 1% UNTIL SRT(TEMP5, 0%) <= TEMP6 TEMP7 = SRT(TEMP5, 0%) TEMP4 = TEMP4 + 1% TEMP4 = TEMP4 + 1% UNTIL SRT(TEMP4, 0%) >= TEMP6 IF TEMP4 < TEMP5 THEN SRT(TEMP5, 0%) = SRT(TEMP4, 0%) SRT(TEMP4, 0%) = TEMP7 TEMP8 = SRT(TEMP5, 1%) SRT(TEMP5, 1%) = SRT(TEMP4, 1%) SRT(TEMP4, 1%) = TEMP8 GOTO SORT_50 END IF IF TEMP5 - TEMP < TEMP3 - TEMP4 THEN QUICKSORT_TEMP1(TEMP9) = TEMP4 QUICKSORT_TEMP2(TEMP9) = TEMP3 TEMP3 = TEMP5 TEMP9 = TEMP9 + 1% GOTO SORT_70 END IF QUICKSORT_TEMP1(TEMP9) = TEMP QUICKSORT_TEMP2(TEMP9) = TEMP5 TEMP = TEMP4 TEMP9 = TEMP9 + 1% GOTO SORT_70 SORT_60: TEMP9 = TEMP9 - 1% GOTO END_SORT IF TEMP9 = 0% TEMP = QUICKSORT_TEMP1(TEMP9) TEMP3 = QUICKSORT_TEMP2(TEMP9) SORT_70: GOTO SORT_40 IF TEMP3 - TEMP > 1% GOTO SORT_30 IF TEMP = 1% TEMP = TEMP - 1% SORT_80: TEMP = TEMP + 1% GOTO SORT_60 IF TEMP = TEMP3 TEMP6 = SRT(TEMP + 1%, 0%) TEMP8 = SRT(TEMP + 1%, 1%) GOTO SORT_80 IF SRT(TEMP, 0%) <= TEMP6 TEMP4 = TEMP SORT_90: SRT(TEMP4 + 1%, 0%) = SRT(TEMP4, 0%) SRT(TEMP4 + 1%, 1%) = SRT(TEMP4, 1%) TEMP4 = TEMP4 - 1% GOTO SORT_90 IF TEMP6 < SRT(TEMP4, 0%) SRT(TEMP4 + 1%, 0%) = TEMP6 SRT(TEMP4 + 1%, 1%) = TEMP8 GOTO SORT_80 END_SORT: LINE_COUNTER = 100% ! SO AS TO FORCE HEADINGS GOTO END_PROGRAM IF CHECK_FOR_HEADINGS NEXT_ELEMENT_LOOP: FOR TEMP = 1% + SRT_REPORT_OFFSET TO 58% + SRT_REPORT_OFFSET GOTO END_PROGRAM IF CHECK_FOR_HEADINGS IF TEMP <= SRT_COUNTER PRINT #10%, SRT(TEMP, 0%); TAB(11%); SRT(TEMP, 1%); & IF TEMP <= SRT_COUNTER PRINT #10%, TAB(40%); SRT(TEMP + 58%, 0%); & TAB(51%); SRT(TEMP + 58%, 1%); & IF TEMP + 58% <= SRT_COUNTER PRINT #10%, TAB(80%); SRT(TEMP + 116%, 0%); & TAB(91%); SRT(TEMP + 116%, 1%); & IF TEMP + 116% <= SRT_COUNTER AND REPORT_OUTPUT = "F" IF TEMP <= SRT_COUNTER THEN PRINT #10% LINE_COUNTER = LINE_COUNTER + 1% END IF NEXT TEMP IF REPORT_OUTPUT = "F" THEN IF SRT_COUNTER > SRT_REPORT_OFFSET + 174% THEN SRT_REPORT_OFFSET = SRT_REPORT_OFFSET + 174% GOTO NEXT_ELEMENT_LOOP END IF ELSE IF SRT_COUNTER > SRT_REPORT_OFFSET + 116% THEN SRT_REPORT_OFFSET = SRT_REPORT_OFFSET + 116% GOTO NEXT_ELEMENT_LOOP END IF END IF GOTO END_PROGRAM ERROR_ROUTINE: RESUME IF ERR = 154% ! TRAP IF BUCKET IS LOCKED RESUME END_OF_FILE IF ERR = 11% IF ERROR_LINE = "KILL SYSUAF.LIS" THEN PRINT "Error - No identifiers found!"; BEL RESUME EXIT_PROGRAM END IF CLOSE #1%, 10% PRINT "Unexpected error"; ERR; " after "; ERROR_LINE ON ERROR GOTO 0 ! ----- MASK VALUES FOR TESTING BITS ----- DATA 1,2,4,8,16,32,64,-128 ! ----- BIT POSITION (1-8) WITHIN FLAGS() TO BE TESTED ----- DATA 1,2,3,4,5,6,7,8,1,2,3,4,5,6,7 ! ----- ARRAY INDEX OF FLAGS() ----- DATA 0,0,0,0,0,0,0,0,1,1,1,1,1,1,1 ! ----- BIT (1-8) WITHIN PRIVILEGE() BYTE TO CHECK ----- DATA 2,5,6,8,6,2,1,6,7,2,4,1,4,3,8,2,5,3,3,7,3,1,6,4,5,4,7,7,8,4,2,7 DATA 3,5,5,8,1,6,1 ! ----- BYTE (0-7) TO CHECK WITHIN PRIVILEGE() ARRAY ----- DATA 1,0,1,2,3,0,0,0,0,4,2,1,0,4,0,2,2,2,3,2,1,3,4,1,1,4,4,1,3,3,3,3 DATA 0,3,4,1,4,2,2 END_PROGRAM: CLOSE #1%, 10% IF REPORT_OUTPUT = "F" THEN SELECT REPORT_TYPE CASE "L", "M", "N", "O", "P", "Q" IF COMMAND_FILE_RECORD_WRITTEN THEN PRINT "Created SYSUAF.LIS"; BEL ELSE ERROR_LINE = "KILL SYSUAF.LIS" KILL "SYSUAF.LIS" ERROR_LINE = "AFTER KILL" PRINT "Error - No identifiers found!"; BEL END IF CASE ELSE PRINT "Created SYSUAF.LIS"; BEL END SELECT ELSE PRINT "Done..."; BEL END IF EXIT_PROGRAM: END