C C REVISION HISTORY: C C THIS PROGRAM PROCESSES THE OUTPUT OF THE 'LOG' ACCOUNTING UTILITY C C STEVEN G. DUFF FOR SANTA FE ENGINEERING SERVICES NOV-79 C C THE MACRO SOURCE FOR THE LOG UTILITY SHOULD BE CONSULTED FOR A DETAILED C EXPLANATION OF THE ACCOUNTING RECORD WRITTEN FOR TASKS. C C REVISED 26-NOV-79 (SGD): C LOGIC TO HANDLE LOG$NN PSEUDO-TASKS INCLUDED. C REVISED 12-MAY-80 (SGD): C MODIFIED ELAPSED TIME RATE FOR LOG$NN TASKS TO $5.00/HR C REVISED 28-JUL-80 (SGD): C INCORPORATED LOGIC FOR DPNN$$ TASKS (DISK ALLOCATION) C C THIS PROGRAM FORMATS THIS DATA FILE (INPUT ON SY:LOGDATA.DAT) AND C ADDS IN THE BILLING DATA (SEE THE RATES SUBROUTINE). THE FORMATTED C OUTPUT IS SENT TO SY:LOGDATA.OUT WHEREUPON A REPORT-WRITER CAN MUNCH C ON IT. C C THE FORMAT OF THE OUTPUT RECORD IS AS FOLLOWS: C RECORD DATA C POSITIONS C --------- ---- C 1..3 GROUP OF UIC (999) C 4..6 USER OF UIC (999) C 7..12 TASKNAME (XXXXXX) C 13..14 START YEAR (EG 79) C 15..16 START MONTH C 17..18 START DAY C 19..20 START HOUR C 21..22 START MINUTE C 22..23 START SECOND C 24..26 START MONTH (IN ALPHA (XXX)) C 27..30 TASK PRIORITY (9999) C 31..34 TASK MEMORY IN KBYTES (9999) C 35..42 WALL TIME OF TASK IN SECONDS (F8.1 - 999999.9) C 43..50 DISK TIME OF TASK IN SECONDS (F8.1 - 999999.9) C 51..58 LINE PRINTER TIME OF TASK IN SECS (F8.1 - 999999.9) C 59..66 CPU TIME OF TASK IN SECONDS (F8.1 - 999999.9) (ROUGHLY) C 67..74 ELAPSED TIME OF TASK (F8.1 - 999999.9) (UNSUSPENDED) C 75..82 DISK RATE MULTIPLIER (F8.5 - 99.99999) C 83..90 LP: RATE MULTIPLIER (F8.5 - 99.99999) C 91..98 CPU RATE MULTIPLIER (F8.5 - 99.99999) C 99..106 ELAPSED TIME RATE MULTIPLIER (F8.5 - 99.99999) C 107..114 RATE MULTIPLIER (F8.5 - 99.99999) (EVERYTHING) C 115..124 DOLLAR TOTAL. (F9.2 - 999999.99) C C IMPLICIT INTEGER*4 (A-Z) C C LOG RECORD DEFINITION INTEGER*2 LOGREC(24) LOGICAL*1 LRBYTE(48) EQUIVALENCE (LOGREC(1),LRBYTE(1)) C C SAMPLE FIELDS OF LOG RECORD (16 BIT UNSIGNED) INTEGER*2 TOTSMP,DIOSMP,LPOSMP,SPNSMP,WFRSMP,CKPSMP,STPSMP,CPUSMP C EQUIVALENCE (TOTSMP,LOGREC(17)),(DIOSMP,LOGREC(24)), 1 (LPOSMP,LOGREC(23)),(SPNSMP,LOGREC(18)), 2 (WFRSMP,LOGREC(19)),(CKPSMP,LOGREC(20)), 3 (STPSMP,LOGREC(21)),(CPUSMP,LOGREC(22)) C C TIME FIELDS OF LOG RECORD INTEGER*2 STYEAR,STMNTH,STDAY,STHOUR,STMIN,STSEC,STTICK, 1 TPSEC,TPSAMP EQUIVALENCE (STYEAR,LOGREC( 3)),(STMNTH,LOGREC( 4)), 1 (STDAY ,LOGREC( 5)),(STHOUR,LOGREC( 6)), 2 (STMIN ,LOGREC( 7)),(STSEC ,LOGREC( 8)), 3 (STTICK,LOGREC( 9)),(TPSEC ,LOGREC(10)), 4 (TPSAMP,LOGREC(11)) C C GENERAL TASK PARAMETERS IN LOG RECORD INTEGER*2 TNAM(2),TUIC,TPRI,TMEM EQUIVALENCE (TNAM(1),LOGREC(12)),(TUIC,LOGREC(14)), 1 (TPRI,LOGREC(15)),(TMEM,LOGREC(16)) C C CONVERTED SECONDS VARIABLES REAL*4 WLTIME,DKTIME,LPTIME,CPTIME,ETTIME C C CONVERSION ROUTINES REAL*4 SECNDS,USI2TR C C RATE MULTIPLIERS FOR TIMES REAL*4 DKRATE,LPRATE,CPRATE,ETRATE,RATFCT C C OTHER OUTPUT VARIABLES REAL*4 MOOLAH INTEGER*4 CMONTH(12) INTEGER*2 TNAMEA(3),MEMKB LOGICAL*1 GROUP,USER EQUIVALENCE (GROUP,LRBYTE(28)),(USER,LRBYTE(27)) COMMON /LOGDAT/ LOGREC DATA CMONTH/'JAN','FEB','MAR','APR','MAY','JUN','JUL', 1 'AUG','SEP','OCT','NOV','DEC'/ C C OPEN THE LOG RECORD FILE OPEN(UNIT=1,NAME='SY:[6,10]LOGDATA.DAT',READONLY, 1 FORM='FORMATTED',TYPE='OLD') C C SET UP THE OUTPUT TRANSLATED FILE OPEN(UNIT=2,NAME='SY:LOGDATA.OUT',TYPE='NEW',CARRIAGECONTROL='LIST', 1 FORM='FORMATTED') C C LOOP HERE READING THE FILE UNTIL THE END. 100 CONTINUE READ(1,8000,END=9900) LOGREC 8000 FORMAT(24A2) C C CONVERT THE RAD50 NAME IN THE RECORD TO ASCII FOR THE OUTPUT. CALL R50ASC(6,TNAM,TNAMEA) C C CONVERT MEMORY TO KB MEMKB=(USI2TR(TMEM)*64.0+512.0)/1024.0 C C CALC. WALL TIME WLTIME=SECNDS(TOTSMP) C C CALC. ELAPSED TIME ETTIME=SECNDS(TOTSMP-SPNSMP) C C CALC. DISK I/O TIME DKTIME=SECNDS(DIOSMP) C C CALC. LINE PRINTER TIME LPTIME=SECNDS(LPOSMP) C C CALC CPU TIME CPTIME=SECNDS(CPUSMP) C C FIND RATE FACTOR AND COMPUTE DOLLAR TOTAL CALL RATES(GROUP,USER,MEMKB,TPRI,TNAMEA,WLTIME,ETTIME,DKTIME, 1 CPTIME,LPTIME,ETRATE,DKRATE,LPRATE,CPRATE,RATFCT) MOOLAH=RATFCT*(ETTIME*ETRATE+DKTIME*DKRATE+CPTIME*CPRATE+ 1 LPTIME*LPRATE) C C IF NOT ENOUGH MONEY, THEN SKIP IT. IF(MOOLAH .LT. .10) GOTO 200 C C WRITE OUTPUT RECORD WRITE(2,8100) GROUP,USER,TNAMEA,STYEAR,STMNTH,STDAY, 1 STHOUR,STMIN,STSEC,CMONTH(STMNTH),TPRI,MEMKB,WLTIME,DKTIME, 2 LPTIME,CPTIME,ETTIME,DKRATE,LPRATE,CPRATE,ETRATE,RATFCT,MOOLAH 8100 FORMAT(2O3,3A2,6I2,A3,2I4,5F8.1,5F8.5,F9.2) C C BACK FOR ANOTHER RECORD 200 CONTINUE GOTO 100 C C COME HERE WHEN EOF ON INPUT TO EXIT 9900 CONTINUE CALL EXIT END SUBROUTINE RATES(GROUP,USER,MEMKB,TPRI,TNAMEA,WLTIME,ETTIME,DKTIME, 1 CPTIME,LPTIME,ETRATE,DKRATE,LPRATE,CPRATE,RATFCT) IMPLICIT INTEGER*2(A-Z) LOGICAL*1 TNAMEA(6),GROUP,USER REAL*4 WLTIME,ETTIME,DKTIME,CPTIME,LPTIME,ETRATE,DKRATE REAL*4 LPRATE,CPRATE,RATFCT C C FUNCTIONS TO COMPARE TASK NAMES LOGICAL CMPTSK,CMPINS,LOGTSK,DSKTSK C C IF UIC IS BELOW GROUP 300 THEN SKIP IT GRPI2=GROUP IF(IAND(GRPI2,"177400) .LT. 300) GOTO 200 C C IS THIS A TERMINAL SIGNON PSEUDO-TASK? IF(LOGTSK(TNAMEA)) GOTO 100 C C IS THIS DISK ALLOCATION? IF(DSKTSK(TNAMEA)) GOTO 300 C C IS THIS AN INSTANCE OF (AT.) (IF SO, NO CHARGE) IF(CMPINS(TNAMEA,'AT.')) GOTO 200 C C IS THIS TASK "NOBILL" - IF SO, NO CHARGE IF(CMPTSK(TNAMEA,'NOBILL')) GOTO 200 C C ELAPSED TIME RATE IS SCALED BY MEMORY ($.0025/64KB) ETRATE=.0025*(MEMKB/64.0) C C DEFAULT DISK I/O RATE IS FIXED DKRATE=.08 C C DEFAULT CPU RATE IS FIXED. CPRATE=.10 C C DEFAULT LINE PRINTER RATE IS FIXED: LPRATE=.0200 C C RATE MULTIPLIER IS SCALED BETWEEN .5 (AT PRI 0) AND 1.0 (AT PRI 50 OR>) RATFCT=MIN(TPRI,50)/100.0+0.5 GOTO 9999 C C GOT A PSEUDO-TASK. BILL ELAPSED TIME ONLY. 100 CONTINUE RATFCT=1.0 ETRATE=1.3889E-3 CPRATE=0.0 DKRATE=0.0 LPRATE=0.0 GOTO 9999 C C HERE FOR NO CHARGE (E.G. AT.) 200 CONTINUE RATFCT=0.0 GOTO 9999 C C HERE FOR DISK ALLOCATION PSEUDO-TASK 300 CONTINUE RATFCT=1.0 ETRATE=0.003328 DKRATE=0.0 LPRATE=0.0 CPRATE=0.0 GOTO 9999 C C MERGE HERE FROM ABOVE CASES TO EXIT 9999 CONTINUE RETURN END REAL FUNCTION SECNDS(SAMPLS) REAL*4 USI2TR INTEGER*2 SAMPLS,LOGREC(24) COMMON /LOGDAT/ LOGREC SECNDS=(USI2TR(SAMPLS)*LOGREC(11))/LOGREC(10) END REAL FUNCTION USI2TR(INT2) C C CONVERT AN UNSIGNED INTEGER*2 ARGUMENT (0 <= INT2 <= 65535) TO REAL*4 C IMPLICIT INTEGER*2(A-Z) INTEGER*4 I INTEGER*2 J(2) EQUIVALENCE (I,J(1)) J(2)=0 J(1)=INT2 USI2TR=I END LOGICAL FUNCTION CMPINS(TN,IN) C C THIS FUNCTION RETURNS TRUE IFF THE 6-CHARACTER TN (TASKNAME) IS AN C INSTANCE OF THE THREE LETTER TASK "TN" AS IN "...NAM" OR "NAMTn " OR C "NAMTnn" (PER RSX STANDARD). C LOGICAL*1 TN(6),IN(3) C C FIRST, ASSUME TRUE AND CHECK FOR "...NAM" CMPINS=.TRUE. IF(TN(1) .EQ. '.' .AND. TN(2) .EQ. '.' .AND. TN(3) .EQ. '.' 1 .AND. TN(4) .EQ. IN(1) .AND. TN(5) .EQ. IN(2) .AND. 2 TN(6) .EQ. IN(3)) RETURN C C DIDN'T WORK. ASSUME FALSE AND CHECK FIRST FOUR LETTERS FOR "NAMT" CMPINS=.FALSE. IF(TN(1) .NE. IN(1) .OR. TN(2) .NE. IN(2) .OR. TN(3) .NE. IN(3) 1 .OR. TN(4) .NE. 'T') RETURN C C "NAMT??" CHECK FOR ONE OCTAL DIGIT AT POS 5. IF(TN(5) .LT. '1' .OR. TN(5) .GT. '7') RETURN C C "NAMTN?" CHECK FOR SPACE OR OCTAL DIGIT AT POS 6. IF SO, THEN GOOD. ELSE BAD IF(TN(6) .EQ. ' ') GOTO 100 IF(TN(6) .LT. '1' .OR. TN(6) .GT. '7') RETURN C C GOT IT. RETURN WITH TRUE 100 CONTINUE CMPINS=.TRUE. RETURN END LOGICAL FUNCTION CMPTSK(TN,IN) C C THIS MODULE WILL RETURN TRUE IF THE 6-CHARACTER TN (TASKNAME) IS C EXACTLY THE SAME AS THE 6-CHARACTER IN (INSTALLED NAME) C LOGICAL*1 TN(6),IN(6) C C ASSUME TRUE AND VERIFY ASSUMPTION BY CHECKING ALL 6 LETTERS CMPTSK=.TRUE. IF(TN(1) .EQ. IN(1) .AND. TN(2) .EQ. IN(2) .AND. 1 TN(3) .EQ. IN(3) .AND. TN(4) .EQ. IN(4) .AND. 2 TN(5) .EQ. IN(5) .AND. TN(6) .EQ. IN(6)) RETURN CMPTSK=.FALSE. RETURN END LOGICAL FUNCTION LOGTSK(TN) C C THIS MODULE RETURNS TRUE IFF THE 6 CHARACTER TN IS A PSEUDO-TASK C REPRESENTING A SIGNED ON TERMINAL. THIS IS EASY TO CHECK, SINCE C IT IS THE ONLY KIND OF TASK THAT CAN HAVE A "$" AS THE FOURTH LETTER. C LOGICAL*1 TN(6) LOGTSK=.FALSE. IF(TN(4) .EQ. '$') LOGTSK=.TRUE. RETURN END LOGICAL FUNCTION DSKTSK(TN) C C THIS MODULE RETURNS TRUE IFF THE 6 CHARACTER TN IS A PSEUDO-TASK C REPRESENTING A DISK ALLOCATION. THIS IS EASY TO CHECK, SINCE IT C IS THE ONLY KIND OF TASK THAT CAN HAVE A "$" AS THE FIFTH LETTER. C LOGICAL*1 TN(6) DSKTSK=.FALSE. IF(TN(5) .EQ. '$') DSKTSK=.TRUE. RETURN END