IMPLICIT INTEGER*2 (A-Z) PARAMETER NUMGIC = 32 ! MAXIMUM NUMBER OF GIC'S PARAMETER MAXGRP = 8 ! MAXIMUM NUMBER OF ACCOUNTING GROUPS PARAMETER MAXUSR = 300 ! MAXIMUM NUMBER OF USERS IN PDSUPF.DAT PARAMETER MAXBLK = 1200 ! MAXIMUM # OF BLOCKS/USER AT CHEAP RATE C COMMON CONFIG DEFINITIONS INTEGER*2 GIC(NUMGIC),GICGRP(NUMGIC),GICNAM(20,NUMGIC) COMMON/CONFIG/GIC,GICGRP,GICNAM C COMMON GROUP NAMES INTEGER*2 GRPNAM(20,MAXGRP) COMMON/NAMES/GRPNAM C REAL RATIO REAL SYSUSE ! SYS UTILIZATION IN 10^6 WORD-SEC REAL COST ! COST PER USER C GROUP TOTAL DEFINITIONS INTEGER*2 TUSERS(MAXGRP) ! TOTAL NUMBER OF USERS/CATEGORY INTEGER*2 TLOGS(MAXGRP) ! NUMBER OF LOGINS SUBTOTAL/CATEGORY INTEGER*4 TCONN(MAXGRP) ! TOTAL CONNECT MINUTES/CATEGORY REAL TUSE(MAXGRP) ! TOTAL AMT OF K-CORE TICS/CATEGORY INTEGER*4 TALLOC(MAXGRP) ! TOTAL DISK SPACE ALLOC/CATEGORY REAL TCOST(MAXGRP) ! TOTAL COST/CATEGORY C SUB-TOTAL DEFINITIONS INTEGER*2 SUSERS,SLOGS INTEGER*4 SCONN REAL SUSE INTEGER*4 SALLOC REAL SCOST COMMON/SUMARY/SUSERS,SLOGS,SCONN,SUSE,SALLOC,SCOST, 1 TUSERS,TLOGS,TCONN,TUSE,TALLOC,TCOST C GRAND TOTAL DEFINITIONS INTEGER*2 GUSERS ! TOTAL NUMBER OF USERS INTEGER*2 GLOGS ! NUMBER OF LOGINS SUBTOTAL INTEGER*4 GCONN ! TOTAL CONNECT MINUTES REAL GUSE ! TOTAL AMT OF K-CORE TICS INTEGER*4 GALLOC ! TOTAL AMT OF DISK ALLOCATED REAL GCOST ! TOTAL AMT OF COST COMMON/TOTALS/GUSERS,GLOGS,GCONN,GUSE,GALLOC,GCOST C BYTE USRNAM(12),TEMP(4),CURGIC,PREUIC BYTE IDATE(9),ITIME(10) C COMMON USRDAT DEFINITION BYTE IBUF(64,MAXUSR) INTEGER*2 IBUF2(32,MAXUSR),TEMP2(2) INTEGER*4 TEMP4 REAL TEMPR EQUIVALENCE(IBUF,IBUF2) EQUIVALENCE(TEMP,TEMP2,TEMP4) C COMMON/USRDAT/IBUF REAL PCONHR,PCPUHR,PBLOK1,PBLOK2 BYTE TITLE(50) C C GET CURRENT DATE AND TIME AND SETUP STANDARD HEADING FORMAT CALL DATE(IDATE) CALL TIME(ITIME) 900 FORMAT(1H1,//,' PDP 11/70 SYSTEM ACCOUNTING REPORT',2X,50A1, 1 9A1,2X,10A1,//) C C ASK FOR REPORT TITLE (UP TO 50 CHARS) TYPE 1 1 FORMAT(' REPORT TITLE: ',$) ACCEPT 2,TITLE 2 FORMAT(50A1) C C OPEN USER PROFILE FILE CALL ERRSET(29,.TRUE.,.FALSE.,.TRUE.,.FALSE.,1000) 5 OPEN(UNIT=1,NAME='LB0:[1,100]PDSUPF.DAT',TYPE='OLD',READONLY, 1 ACCESS='DIRECT') CALL ERRTST(29,ERROR) ! TEST FOR ERROR 29 IF (ERROR .NE. 2) GOTO 5 ! TRY AGAIN IF ERROR 29 C C READ IN USER DATA. FIRST RECORD CONTAINS FIRST AND LAST C USER RECORDS READ(1'1)(IBUF(NN,1),NN=1,64) C IBEGIN=IBUF2(1,1) ! FIRST USER PROFILE IEND=IBUF2(2,1) ! LAST USER PROFILE IX = 1 ! INTERNAL RECORD NUMBER DO 1000 I=IBEGIN,IEND READ(1'I)(IBUF(NN,IX),NN=1,64) C C IF IBUF(1) == 0, THE RECORD IS IGNORED IF (IBUF(1,IX) .NE. "000) IX = IX + 1 1000 CONTINUE NUM = IX - 1 ! NUM := NUMBER OF VALID RECORDS C C NOW CLOSE THE PROFILE FILE CLOSE(UNIT=1) C C READ USER CONFIGURATION TABLE CALL RTABLE C C SORT IBUF FILE CALL RSORT(1,NUM,5) C C OUTPUT DATA C C LOOP THRU USER DATA DO 2000 I=1,NUM C C IF FIRST TIME THRU, ZERO GROUP SUBTOTALS IF (I .NE. 1) GOTO 2005 ! NOT THE FIRST TIME C C THIS IS THE FIRST TRANSITION - FIRST ZERO GROUP TOTALS DO 1500 LL = 1,MAXGRP TUSERS(LL) = 0 ! NUMBER OF USERS IN THIS CATEGORY TCONN(LL) = 0 ! TOTAL CONNECT TIME TUSE(LL) = 0 ! TOTAL SYSTEM USE IN K-CORE TICS TLOGS(LL) = 0 ! TOTAL NUMBER OF LOGINS TALLOC(LL) = 0 ! TOTAL DISK SPACE ALLOCATED 1500 CONTINUE C C REJOIN TRANSITION LOGIC AT POINT OF ZEROING SUBTOTALS GOTO 1675 C C CHECK FOR CHANGE TO A NEW GIC 2005 CONTINUE IF (CURGIC .EQ. IBUF(10,I)) GOTO 2100 ! NO CHANGE C C NEW GROUP CODE - C CALCULATE AND OUTPUT GIC SUB-TOTALS AND UPDATE GROUP TOTALS CALL GICSUM(CURGRP) C C OUTPUT CURRENT CHARGES TEMPR = PCPUHR/10. ! SCALE DOWN CPU USAGE NUMBER WRITE(2,902)TEMPR,PCONHR,MAXBLK,PBLOK1,PBLOK2 902 FORMAT(//,' CURRENT RATES:'16X, 1 'CPU USAGE @',14X,1H$,F5.2,' PER 10^6 WD-SEC',/, 2 31X,'CONNECT TIME @',11X,1H$,F5.2,' PER HOUR',/, 3 31X,'DISK STORAGE ALLOCATED-',/, 4 36X,'FIRST ',I4,' BLOCKS @ $',F5.2,' PER BLOCK',/, 5 36X,'ADDITIONAL BLOCKS @ $',F5.2,' PER BLOCK') C C ZERO GIC SUBTOTALS 1675 CONTINUE SUSERS = 0 SLOGS = 0 SCONN = 0 SUSE = 0 SALLOC = 0 SCOST = 0 C C SET PREVIOUS UIC TO AN UNLIKELY FIRST UIC PREUIC = "377 C C GET NEXT GIC CURGIC = IBUF(10,I) ! UPDATE CURGIC C C FIND WHICH SLOT TO USE DO 2060 LL = 1,NUMGIC IF (GIC(LL) .NE. CURGIC) GOTO 2060 C C IT MATCHED CURIDX = LL ! INDEX INTO CURRENT GIC DATA CURGRP = GICGRP(LL) ! INDEX INTO CURRENT GROUP DATA GOTO 2070 2060 CONTINUE C C NOT FOUND - USE MINIMUM TITLE + SETUP TO MISC SUBTOTAL CURGRP = MAXGRP ! DEFAULT CATEGORY WRITE(2,900)TITLE,IDATE,ITIME WRITE(2,905) ! OUTPUT COLUMN HEADING 905 FORMAT(37X,'SYSTEM UTILIZATION',18X,'DISK',/, 1 17X,'DEFAULT',8X,'CPU USAGE CONNECT EFF NUMBER OF', 2 2X,'STORAGE',/,' USERNAME DEV:[GIC,UIC]',4X, 3 '10^6 WD-SEC HH:MM RATIO LOGINS ALLOC',7X,'COST',/, 3 X,8(1H-),5X,13(1H-),4X,29(1H-),4X,6(1H-),3X,5(1H-),5X,8(1H-),/) GOTO 2100 2070 CONTINUE WRITE(2,900)TITLE,IDATE,ITIME WRITE(2,910)(GICNAM(KK,CURIDX),KK=1,20), 1 (GRPNAM(JJ,CURGRP),JJ=1,20) 910 FORMAT(' DEPARTMENT TITLE: ',20A2, 1 /,' ACCOUNTING GROUP: ',20A2,//) WRITE(2,905) ! OUTPUT COLUMN HEADING C C CALCULATE AND OUTPUT INDIVIDUAL STATISTICS C 2100 CONTINUE C C CONVERT USERNAME TO ASCII CALL R50ASC(12,IBUF(1,I),USRNAM) C C CALCULATE CONNECT TIME IN HH:MM FORMAT CMIN1 = IMOD(IBUF2(18,I),10) ! CONNECT MINUTES (ONE'S) CMIN10 = IMOD(IBUF2(18,I),60)/10 ! (TEN'S) CONHR=IBUF2(18,I)/60 ! CONNECT HOURS C C CALCULATE SYSTEM UTILIZED TEMP2(1)=IBUF2(20,I) TEMP2(2)=IBUF2(19,I) C C CALCULATE UTILIZATION RATIO RATIO=0.0 IF (IBUF2(18,I) .EQ. 0) GOTO 2050 ! SKIP CALCULATION IF 0 CONNECT TEMPR = TEMP4 ! CONVERT INTEGER*4 TO REAL*4 RATIO = (TEMPR/IBUF2(18,I))*.2844444 2050 CONTINUE C C CALCULATE SYSTEM UTILIZATION IN 10^6 WORD-SEC SYSUSE = TEMP4/60000. C C GET DISK ALLOCATION STATS IF CURRENT UIC .NE. PREUIC ALLOC = 0 D PREUIC = IBUF(9,I) D ALLOC = 1000 IF(IBUF(9,I) .NE. PREUIC) CALL DISK(I,ALLOC) PREUIC = IBUF(9,I) C C CALCULATE COST TO THIS USER USING THE FOLLOWING FORMULA: C C COST = CONNECT TIME IN HOURS X COST/CONNECT HOUR C + CPU TIME IN 10^5 WD-SEC X COST/CPU HOUR C + DISK STORAGE ALLOCATED <= MAXBLK BLOCKS X BLOCK RATE 1 C + DISK STORAGE ALLOCATED > MAXBLK BLOCKS X BLOCK RATE 2 PCONHR = 8.00 ! $8.00 PER CONNECT HOUR PCPUHR = 10.00 ! $10.OO PER CPU HOUR PBLOK1 = 0.03 ! $.03 PER BLOCK ALLOCATED <= MAXBLK PBLOK2 = 0.10 ! $.10 PER BLOCK ALLOCATED > MAXBLK C COST = (IBUF2(18,I)*PCONHR/60.) + (SYSUSE*PCPUHR/10.) IF(ALLOC .LE. MAXBLK) COST = COST + ALLOC*PBLOK1 IF(ALLOC .GT. MAXBLK) 1 COST = COST + (ALLOC*PBLOK2) - (MAXBLK*(PBLOK2-PBLOK1)) C C OUTPUT USER STATS - C C IF RATIO < .01, LEAVE RATIO COLUMN BLANK IF(RATIO .LT. .01) GOTO 2052 WRITE(2,915)USRNAM,(IBUF(KK,I),KK=41,44),IBUF(10,I),IBUF(9,I), 1 SYSUSE,CONHR,CMIN10,CMIN1,RATIO,IBUF2(10,I),ALLOC,COST 915 FORMAT(X,12A1,X,4A1,1H[,O3,1H,,O3,1H],5X,F10.3,I5,1H:,2I1, 1 F10.2,4X,I4,4X,I6,4X,1H$,F8.2) GOTO 2059 C 2052 CONTINUE WRITE(2,920)USRNAM,(IBUF(KK,I),KK=41,44),IBUF(10,I),IBUF(9,I), 1 SYSUSE,CONHR,CMIN10,CMIN1,IBUF2(10,I),ALLOC,COST 920 FORMAT(X,12A1,X,4A1,1H[,O3,1H,,O3,1H],5X,F10.3,I5,1H:,2I1, 1 14X,I4,4X,I6,4X,1H$,F8.2) C C UPDATE SUBTOTALS 2059 CONTINUE SUSERS = SUSERS + 1 ! NUMBER OF USERS IN GROUP SLOGS = SLOGS + IBUF2(10,I) ! NUMBER OF LOGINS SCONN = SCONN + IBUF2(18,I) ! AMOUNT OF CONNECT TIME SUSE = SUSE + TEMP4 ! SYSTEM USE IN K-CORE TICS SALLOC = SALLOC + ALLOC ! DISK ALLOCATION SCOST = SCOST + COST ! COST 2000 CONTINUE C C OUTPUT FINAL SUBTOTAL CALL GICSUM(CURGRP) C OUTPUT CURRENT CHARGES FOR FINAL GROUP TEMPR = PCPUHR/10. ! SCALE DOWN CPU USAGE NUMBER WRITE(2,902)TEMPR,PCONHR,MAXBLK,PBLOK1,PBLOK2 C C CALCULATE GRAND TOTALS FOR USE IN % CALCULATIONS C C ZERO GRAND TOTALS GUSERS = 0 GLOGS = 0 GCONN = 0 GUSE = 0 GALLOC = 0 GCOST = 0 C C NOW SUM UP USAGE DO 2500 I = 1,MAXGRP IF (TUSERS(I) .EQ. 0) GOTO 2500 ! SKIP GROUP IF NO USERS GUSERS = GUSERS + TUSERS(I) GLOGS = GLOGS + TLOGS(I) GCONN = GCONN + TCONN(I) GUSE = GUSE + TUSE(I) GALLOC = GALLOC + TALLOC(I) GCOST = GCOST + TCOST(I) 2500 CONTINUE C C OUTPUT CATEGORY SUBTOTALS C C OUTPUT FINAL PAGE HEADING WRITE(2,900)TITLE,IDATE,ITIME WRITE(2,925) 925 FORMAT(45X,'GROUP SUMMARIES',/,45X,15(1H-),////, 1 35X,'SYSTEM UTILIZATION',28X,'DISK',/,29X,'CPU USAGE',6X, 2 'CONNECT',5X,'EFF',3X,'NUMBER OF USER',5X,'STORAGE',/, 3 ' ACCOUNTING GROUP',11X,'10^6 WD-SEC % HH:MM % RATIO', 4 X,'ACCTS % LOGINS % ALLOC %',7X,'COST %',/, 5 X,16(1H-),11X,14(1H-),2X,9(1H-),2X,5(1H-),X,8(1H-),X,8(1H-), 6 3X,8(1H-),5X,9(1H-),/) C C NOW GO THRU ALL THE GROUPS, OUTPUTING STATISTICS DO 3000 I = 1,MAXGRP C C IF THIS GROUP HAS USERS, OUTPUT DATA FOR THIS GROUP IF (TUSERS(I) .NE. 0) CALL GRPSUM(I) ! OUTPUT STATS 3000 CONTINUE C C OUTPUT GRAND TOTAL C C CALCULATE GRAND TOTAL RATIO RATIO = (GUSE/GCONN)*.2844444 C C CALCULATE SYSTEM UTILIZATION IN 10^6 WORD-SEC SYSUSE = GUSE/60000. C C CALCULATE CONNECT TIME IN HH:MM FORMAT CMIN1 = JMOD(GCONN,10) CMIN10 = JMOD(GCONN,60)/10 CONHR = GCONN/60 C C OUTPUT LAST RECORD WRITE(2,930)SYSUSE,CONHR,CMIN10,CMIN1,RATIO,GUSERS,GLOGS, 1 GALLOC,GCOST 930 FORMAT(//,6X,'GRAND TOTALS -',9X,F10.1,3X,I5,1H:,2I1,2X,F8.1, 1 I5,4X,I5,6X,I6,4X,1H$,F9.2) C C OUTPUT CURRENT CHARGES ON LAST PAGE TOO TEMPR = PCPUHR/10. ! SCALE DOWN CPU USAGE NUMBER WRITE(2,902)TEMPR,PCONHR,MAXBLK,PBLOK1,PBLOK2 C C DONE!!! CALL EXIT END SUBROUTINE DISK(PTR,ALLOC) IMPLICIT INTEGER*2 (A-Z) C C DISK FIGURES OUT HOW MANY BLOCKS OF DISK SPACE ARE C ALLOCATED IN THE CURRENT USER'S DIRECTORY. PTR IS C A POINTER INTO THE LIST OF PDSUPF.DAT INFORMATION. C # OF BLOCKS ALLOCATED IS RETURNED IN VARIABLE ALLOC. C IN CASE OF ERROR, THE SUBROUTINE OUTPUTS A WARNING TO THE C INVOKING TERMINAL AND RETURNS WITH ALLOC = 0 C PARAMETER MAXUSR = 300 ! MAXIMUM NUMBER OF USERS IN PDSUPF.DAT C COMMON USRDAT DEFINITION BYTE IBUF(64,MAXUSR) INTEGER*2 IBUF2(32,MAXUSR) EQUIVALENCE(IBUF,IBUF2) COMMON/USRDAT/IBUF C C OTHER DEFINITIONS INTEGER*2 TSKNAM(2),ESB(8),IOP(4) BYTE CMDLIN(42) BYTE INBUF(80),OBUF(10) C DATA TSKNAM/3R...,3RPIP/ IOP(3) = 101 ! TASK PRIORITY EVENT = 1 ! EVENT FLAG ALLOC = 0 ! ASSUME NO DISK USAGE C C FORM PIP COMMAND LINE ENCODE(42,10,CMDLIN)(IBUF(KK,PTR),KK=41,44),IBUF(10,PTR), 1 IBUF(9,PTR) 10 FORMAT('PIP LB0:[1,100]REPORT.TB=',4A1,1H[,O3,1H,,O3,']/TB ') C C OUTPUT PIP COMMAND LINE AS HEARTBEAT (OPTIONAL) TYPE 1234,CMDLIN 1234 FORMAT(X,42A1) C C C SPAWN PIP CALL SPAWN(TSKNAM,,EVENT,ESB,CMDLIN,41,,IDSW) IF (IDSW .LE. 0) GOTO 999 ! PIP SCREWED UP C C WAIT FOR SUCCESSFUL COMPLETION CALL WAITFR(EVENT) ! WAIT FOR PIP TO FINISH C C OPEN REPORT.TB FILE OPEN (UNIT=4,NAME='LB0:[1,100]REPORT.TB',TYPE='OLD',ERR=999) C C FIND # OF BLOCK ALLOCATED READ(4,100,END=990)INBUF ! IGNOR FIRST RECORD 100 FORMAT(80A1) READ(4,100,END=990)INBUF C C SEARCH FOR "/" DO 200 J=1,80 IF (INBUF(J) .EQ. 1H/) GOTO 250 200 CONTINUE GOTO 990 ! SLASH NOT FOUND C C GET # OF BLOCKS ALLOCATED AND CONVERT TO BINARY 250 CONTINUE BUFPTR = J + 1 ! POINTS AT # BLOCKS ALLOC I = 1 300 CONTINUE OBUF(I) = INBUF(BUFPTR) ! MOVE NUMBER INTO DECODE BUFFER I = I + 1 BUFPTR = BUFPTR + 1 IF (INBUF(BUFPTR) .NE. 1H.) GOTO 300 ! CONTINUE UNTIL PERIOD OCOUNT = I - 1 ! NUMBER OF CHARS IN OBUF DECODE(OCOUNT,110,OBUF,ERR=990)ALLOC 110 FORMAT(I5) C C CLOSE (AND DELETE) REPORT.TB FILE 990 CONTINUE CLOSE(UNIT=4,DISPOSE='DELETE') 999 CONTINUE RETURN END SUBROUTINE GICSUM(GROUP) IMPLICIT INTEGER*2 (A-Z) C C GICSUM CALCULATES GIC SUB-TOTALS, OUTPUTS THE VALUES, AND C UPDATES THE "GROUP" SUB-TOTAL PARAMETER MAXGRP = 8 PARAMETER MAXUSR = 300 ! MAXIMUM NUMBER OF USERS IN PDSUPF.DAT C GROUP TOTAL DEFINITIONS INTEGER*2 TUSERS(MAXGRP) ! TOTAL NUMBER OF USERS/CATEGORY INTEGER*2 TLOGS(MAXGRP) ! NUMBER OF LOGINS SUBTOTAL/CATEGORY INTEGER*4 TCONN(MAXGRP) ! TOTAL CONNECT MINUTES/CATEGORY REAL TUSE(MAXGRP) ! TOTAL AMT OF K-CORE TICS/CATEGORY INTEGER*4 TALLOC(MAXGRP) ! TOTAL DISK ALLOCATED/CATEGORY REAL TCOST(MAXGRP) C SUB-TOTAL DEFINITIONS INTEGER*2 SUSERS,SLOGS INTEGER*4 SCONN REAL SUSE INTEGER*4 SALLOC REAL SCOST COMMON/SUMARY/SUSERS,SLOGS,SCONN,SUSE,SALLOC,SCOST, 1 TUSERS,TLOGS,TCONN,TUSE,TALLOC,TCOST C C LOCAL VARIABLES REAL RATIO ! CONTAINS VALUE OF RATIO INTEGER*2 CONHR,CMIN10,CMIN1 ! VALUES ASSOCIATED WITH CONNECT TIME REAL SYSUSE ! SYSTEM USE IN 10^6 WORD-SEC C C CALCULATE GIC RATIO RATIO = 0.0 IF (SCONN .EQ. 0) GOTO 10 RATIO = (SUSE/SCONN)*.2844444 10 CONTINUE C C CALCULATE SYSTEM UTILIZATION IN 10^6 WORD-SEC SYSUSE = SUSE/60000. C C CALCULATE CONNECT TIME IN HH:MM FORMAT CMIN1 = JMOD(SCONN,10) CMIN10 = JMOD(SCONN,60)/10 CONHR = SCONN/60 C C OUTPUT SUBTOTAL RECORD WRITE(2,50)SYSUSE,CONHR,CMIN10,CMIN1,RATIO,SLOGS,SALLOC,SCOST 50 FORMAT(//,' GROUP SUBTOTALS -',14X,F10.3,I5,1H:,2I1, 1 F10.2,3X,I5,4X,I6,4X,1H$,F8.2) C C UPDATE GROUP STATISTICS TUSERS(GROUP) = TUSERS(GROUP) + SUSERS TLOGS(GROUP) = TLOGS(GROUP) + SLOGS TCONN(GROUP) = TCONN(GROUP) + SCONN TUSE(GROUP) = TUSE(GROUP) + SUSE TALLOC(GROUP) = TALLOC(GROUP) + SALLOC TCOST(GROUP) = TCOST(GROUP) + SCOST C RETURN END SUBROUTINE GRPSUM(GROUP) IMPLICIT INTEGER*2 (A-Z) C C GRPSUM CALCULATES AND OUTPUTS GROUP TOTALS PARAMETER MAXGRP = 8 C GROUP TOTAL DEFINITIONS INTEGER*2 TUSERS(MAXGRP) ! TOTAL NUMBER OF USERS/CATEGORY INTEGER*2 TLOGS(MAXGRP) ! NUMBER OF LOGINS SUBTOTAL/CATEGORY INTEGER*4 TCONN(MAXGRP) ! TOTAL CONNECT MINUTES/CATEGORY REAL TUSE(MAXGRP) ! TOTAL AMT OF K-CORE TICS/CATEGORY INTEGER*4 TALLOC(MAXGRP) ! TOTAL DISK ALLOCATED/CATEGORY REAL TCOST(MAXGRP) C SUB-TOTAL DEFINITIONS INTEGER*2 SUSERS,SLOGS INTEGER*4 SCONN REAL SUSE INTEGER*4 SALLOC REAL SCOST COMMON/SUMARY/SUSERS,SLOGS,SCONN,SUSE,SALLOC,SCOST, 1 TUSERS,TLOGS,TCONN,TUSE,TALLOC,TCOST C GRAND TOTAL DEFINITIONS INTEGER*2 GUSERS ! TOTAL NUMBER OF USERS INTEGER*2 GLOGS ! NUMBER OF LOGINS SUBTOTAL INTEGER*4 GCONN ! TOTAL CONNECT MINUTES REAL GUSE ! TOTAL AMT OF K-CORE TICS INTEGER*4 GALLOC ! TOTAL AMT OF DISK ALLOCATED REAL GCOST ! TOTAL COST COMMON/TOTALS/GUSERS,GLOGS,GCONN,GUSE,GALLOC,GCOST C C COMMON GROUP NAMES INTEGER*2 GRPNAM(20,MAXGRP) COMMON/NAMES/GRPNAM C C LOCAL VARIABLES REAL RATIO ! CONTAINS VALUE OF RATIO INTEGER*2 CONHR,CMIN10,CMIN1 ! VALUES ASSOCIATED WITH CONNECT TIME REAL SYSUSE ! SYSTEM USE IN 10^6 WORD-SEC INTEGER*2 PUSE ! PERCENTAGE OF TOTAL USE INTEGER*2 PCONN ! PERCENTAGE OF TOTAL CONNECT TIME INTEGER*2 PUSERS ! PERCENTAGE OF TOTAL ACCOUNTS INTEGER*2 PLOGS ! PERCENTAGE OF TOTAL LOGINS INTEGER*2 PALLOC ! PERCENTAGE OF DISK ALLOC INTEGER*2 PCOST ! PERCENTAGE OF COST C C CALCULATE GROUP RATIO RATIO = 0.0 IF (TCONN(GROUP) .EQ. 0) GOTO 10 RATIO = (TUSE(GROUP)/TCONN(GROUP))*.2844444 10 CONTINUE C C CALCULATE SYSTEM UTILIZATION IN 10^6 WORD-SEC SYSUSE = TUSE(GROUP)/60000. C C CALCULATE CONNECT TIME IN HH:MM FORMAT CMIN1 = JMOD(TCONN(GROUP),10) CMIN10 = JMOD(TCONN(GROUP),60)/10 CONHR = TCONN(GROUP)/60 C C CALCULATE PERCENTAGES OF THE TOTAL PUSE = 0. PCONN = 0. PUSERS = 0. PLOGS = 0. PALLOC = 0. PCOST = 0. C PERCENT USAGE IF(GUSE .GT. 0) PUSE = 100. * TUSE(GROUP)/GUSE C PERCENT OF CONNECT TIME IF(GCONN .GT. 0) PCONN = 100. * TCONN(GROUP)/GCONN C PERCENT OF USER ACCOUNTS IF(GUSERS .GT. 0) PUSERS = 100. * TUSERS(GROUP)/GUSERS C PERCENT OF LOGINS IF(GLOGS .GT. 0) PLOGS = 100. * TLOGS(GROUP)/GLOGS C PERCENT OF DISK STORAGE ALLOCATED IF(GALLOC .GT. 0) PALLOC = 100. * TALLOC(GROUP)/GALLOC C PERCENT OF COST IF(GCOST .GT. 0) PCOST = 100. * TCOST(GROUP)/GCOST C C OUTPUT SUBTOTAL RECORD C WRITE(2,50)(GRPNAM(NN,GROUP),NN=1,15),SYSUSE,PUSE,CONHR, 1 CMIN10,CMIN1,PCONN,RATIO,TUSERS(GROUP),PUSERS,TLOGS(GROUP), 2 PLOGS,TALLOC(GROUP),PALLOC,TCOST(GROUP),PCOST 50 FORMAT(X,15A2,F8.1,I3,I5,1H:,2I1,I3,F7.1, 1 I5,X,I3,I5,X,I3,2X,I6,I3,2X,1H$,F8.2,I3,/) C RETURN END SUBROUTINE RSORT(INDEX,NUMBER,FIELD) IMPLICIT INTEGER*2 (A-Z) PARAMETER MAXUSR = 300 ! MAXIMUM NUMBER OF USERS IN PDSUPF.DAT C BYTE IBUF(64,MAXUSR) INTEGER*2 IBUF2(32,MAXUSR) INTEGER*4 VALUE1,VALUE2 EQUIVALENCE(IBUF,IBUF2) C COMMON/USRDAT/IBUF C C RSORT PERFORMS A RIPPLE SORT ON THE PDSUPF.DAT RECORDS, C STARTING WITH RECORD # INDEX, SORTING FOR NUMBER C RECORDS. FIELD IS THE INTEGER*2 LOCATION IN BUF2 C ON WHICH THE SORT IS KEYED. C ITERS = 0 ! ZERO ITERATION COUNTER 10 CONTINUE SWAPS = 0 ! CLEAR NUMBER OF SWAPS DO 100 I=INDEX,INDEX+NUMBER-2 VALUE1 = IBUF2(FIELD,I) VALUE1 = IAND(VALUE1,"177777) VALUE2 = IBUF2(FIELD,I+1) VALUE2 = IAND(VALUE2,"177777) IF (VALUE1 .LE. VALUE2) GOTO 100 ! NO CHANGE - TRY NEXT PAIR C C SWAP RECORDS DO 50 J=1,32 ITEMP = IBUF2(J,I) IBUF2(J,I) = IBUF2(J,I+1) IBUF2(J,I+1) = ITEMP 50 CONTINUE SWAPS = SWAPS + 1 100 CONTINUE C C CHECK FOR SORT COMPLETED IF(SWAPS .EQ. 0) RETURN ITERS = ITERS + 1 C C CHECK FOR TOO MANY ITERATIONS IF(ITERS .LT. NUMBER) GOTO 10 STOP 'RSORT ERROR - TOO MANY ITERATIONS REQUIRED' END SUBROUTINE RTABLE IMPLICIT INTEGER*2 (A-Z) C C SUBROUTINE INPUTS USER CONFIGURATION TABLE. C OPENS UNIT 3 AS READONLY FILE "CONFIG.DAT". C READS UNTIL END OF FILE. C PARAMETER NUMGIC = 32 PARAMETER MAXGRP = 8 C COMMON CONFIG DEFINITIONS INTEGER*2 GIC(NUMGIC),GICGRP(NUMGIC),GICNAM(20,NUMGIC) COMMON/CONFIG/GIC,GICGRP,GICNAM C COMMON GROUP NAMES INTEGER*2 GRPNAM(20,MAXGRP) COMMON/NAMES/GRPNAM C C OTHER VARAIBLES INTEGER*2 FIELD1,FIELD2,FIELD3(20),SPACE C DATA SPACE/2H / C C FILL TABLES WITH DEFAULT VALUES DO 15 I=1,NUMGIC GIC(I) = -1 ! MARK SLOT AS UNUSED GICGRP(I) = MAXGRP ! DEFAULT LAST GRP DO 13 J=1,20 GICNAM(J,I) = SPACE ! BLANK FILL GIC NAMES 13 CONTINUE 15 CONTINUE DO 20 I=1,MAXGRP DO 18 J=1,20 GRPNAM(J,I) = SPACE ! BLANK FILL GRP NAMES 18 CONTINUE 20 CONTINUE C C DISABLE OTS LOGGING OF FILE NOT FOUND ERROR MESSAGE CALL ERRSET(29,,,.TRUE.,.FALSE.,2) C C DISABLE OTS LOGGING OF INPUT CONVERSION ERROR CALL ERRSET(64,,,.TRUE.,.FALSE.,10000) C C OPEN CONFIG.DAT OPEN(UNIT=3,NAME='LB0:[1,100]CONFIG.DAT',TYPE='OLD',READONLY,ERR=900) C C READ INPUT RECORD 100 READ(3,105,ERR=600,END=999)FIELD1,FIELD2,(FIELD3(NN),NN=1,20) 105 FORMAT(O3,I2,20A2) C C TEST FOR GIC OR GRP TYPE DATA IF (FIELD1 .NE. 0) GOTO 200 ! GIC DATA C C GRP DATA - CHECK FOR VALID GRP NUMBER ( 1 TO MAXGRP ) IF (FIELD2 .GT. 0 .AND. FIELD2 .LE. MAXGRP) GOTO 120 C C GROUP NUMBER OUT OF RANGE - INFORM THE TWIT TYPE 110,FIELD2 110 FORMAT(' WARNING - Group number ',I2, 1 ' out of range - defaults to MAXGRP') FIELD2 = MAXGRP ! DEFAULT TO MAXGRP AND FALL THRU C C DATA OK - TRANSFER FIELD3 DATA INTO GRPNAM ARRAY 120 CONTINUE DO 130 I=1,20 GRPNAM(I,FIELD2) = FIELD3(I) 130 CONTINUE GOTO 100 ! READ NEXT RECORD C C GIC DATA - CHECK FOR VALID GIC NUMBER ( 0 TO OCTAL 377) 200 CONTINUE IF (FIELD1 .GE. 0) GOTO 220 TYPE *,'WARNING - GIC syntax error - record ignored' GOTO 100 ! READ NEXT RECORD C C VALID GIC - CHECK FOR VALID GRP NUMBER 220 CONTINUE IF (FIELD2 .GT. 0 .AND. FIELD2 .LT. MAXGRP) GOTO 240 C C INVALID GROUP NUMBER - DEFAULT TO MAXGRP TYPE 230,FIELD1 230 FORMAT(' WARNING - GIC ',O3,' group number syntax error', 1 ' - record defaults to MAXGRP') FIELD2 = MAXGRP C C VALID GRP NUMBER - STORE FIELD2 IN RANGE 1 TO NUMGRP AND C STORE NAME IN GICNAM 240 CONTINUE C C CHECK TO SEE IF GIC IS ALREADY DEFINED DO 241 I=1,NUMGIC IF (GIC(I) .NE. FIELD1) GOTO 241 GIC(I) = -1 ! DELETE PREVIOUS DEFINITION 241 CONTINUE C C NOW FIND FIRST AVAILABLE SLOT IN THE GIC TABLE DO 242 I=1,NUMGIC IF (GIC(I) .EQ. -1) GOTO 243 242 CONTINUE TYPE *,'WARNING - No more room for GIC configuration data' GOTO 100 ! READ NEXT RECORD 243 CONTINUE C C A SLOT WAS FOUND - USE IT OR LOSE IT INDEX = I GIC(INDEX) = FIELD1 ! FILL IN GIC CODE GICGRP(INDEX) = FIELD2 ! FILL IN CATEGORY (GROUP) DO 250 I=1,20 GICNAM(I,INDEX) = FIELD3(I) ! FILL IN GIC TITLE 250 CONTINUE C C READ NEXT RECORD GOTO 100 C C READ ERROR - INFORM USER AND TRY NEXT RECORD 600 CONTINUE TYPE *,'WARNING - Configuration data syntax error - record ignored' GOTO 100 C C FILE OPEN ERROR - INFORM USER 900 CONTINUE TYPE *,'WARNING - No user configuration data found' GOTO 1000 ! CLOSE FILE AND RETURN C C END OF CONFIG.DAT FILE - CLOSE UNIT #1 AND RETURN 999 CONTINUE TYPE *,'Configuration completed' 1000 CONTINUE CLOSE(UNIT=3) RETURN END