PROGRAM REPORT C*********************************************************************** C C PURPOSE: C CALCULATE THE NUMBER OF HOURS THAT A USER IS LOGED ONTO A C TERMINAL AND THE TOTAL NUMBERS OF HOURS A TERMINAL IS USED. C C-- REQUIREMENTS: C RUN COLOG SET /COLOG C IN STARTUP.CMD HAVE A BYE C USE PIP TO MERGE CONSOLE.LOG FILES 1 AT A TIME TO KEEP C THEM IN ORDER. C C RUN THE PROGRAM PHASE1 FIRST. C THESE TWO PROGRAMS ARE KEPT SEPERATE BECASUE YOU MAY WANT C TO RUN PHASE ONE WEEKLY BECAUSE IT WILL SAVE ON DISK SPACE. C C*********************************************************************** REAL TERMHR(21) INTEGER TERMIX(21) REAL * 4 OTCODE,INCODE INTEGER TTIN,TTOUT,TMSTOP , TNAME(21) REAL * 4 STACK(100) BYTE NAME(12),IBELL(2),FNAME(12),HUO,TODAY(9) DATA OLDTIM , DAYS / 0. , 0. / DATA JMIN / 0 / DATA TERMHR /21*0./ DATA TERMIX /21*0/ DATA TNAME /2H00,2H01,2H02,2H03,2H04,2H05,2H06,2H07,2HXX,2HXX, $2H10,2H11,2H12,2H13, 2H14,2H15,2H16,2H17, 2HXX,2HXX,2H20/ DATA XREAD /0./ C LIMIT IS THE SIZE OF STACK C STACK MUST BE AS LARGE AS THE NUMBER OF UIC'S C C TMSTOP IS THE NUMBER OF TTN: PORTS COUNTING FROM ZERO C THAT IS 2 DZ (8 PORTS) PLUS 1 DL TM STOP IS 21 C DATA LIMIT , TMSTOP /100,21/ DATA FNAME/1HC,1HO,1HN,1HS,1HO,1HL,1HE,1H. $ ,1H ,1H ,1H ,1H / IBELL(1) = "044 IBELL(2) = "007 Y1 = SECNDS(0.) OPEN(UNIT=4,TYPE='SCRATCH',NAME='TEMPSUM.DMP',DISPOSE='DELETE', $ FORM='UNFORMATTED',ACCESS='DIRECT',RECORDSIZE=6) WRITE(5,2)IBELL 2 FORMAT(2A1,' ENTER .MONTH 3 CHAR ' $) READ(5,3) (FNAME(MON),MON=9,11) 3 FORMAT(3A1) OPEN(UNIT=1,TYPE='OLD',READONLY,NAME=FNAME,RECORDSIZE=10) OPEN(UNIT=2,TYPE='SCRATCH',NAME='TEMPIN.DMP',DISPOSE='DELETE', $ FORM='UNFORMATTED',ACCESS='DIRECT',RECORDSIZE=6) OPEN(UNIT=3,TYPE='SCRATCH',NAME='TEMPOUT.DMP',DISPOSE='DELETE', $ FORM='UNFORMATTED',ACCESS='DIRECT',RECORDSIZE=6) JIN = 0 JOUT = 0 TIMEB= 0. ITOP = 1 1 CONTINUE READ(1,10,END=50) HR1,HR2,HR3,IFLAG,NAME,IGRP,IUSR,ITERM C- 15:45:54 I WILEVY 4 3 1 C- 15:48:35 O 4 3 1 C- 15:48:42 I WILEVY 4 3 1 C- 15:48:54 O 1 4 1 C- 15:49:01 I WILEVY 4 3 1 C- 16:09:59 O 1 2 1 C- 16:10:13 I WILEVY 4 3 1 C- 16:26:11 O 120 2 13 C- 16:46:45 I KNARR 100 21 13 C- 17:10:18 O 100 21 13 10 FORMAT(2X,F2.0,1X,F2.0,1X,F2.0,1A2,12A1,3X,3I5) C C CONVERT TIME TO 24.00 HOURS C TIMEA =HR1 + HR2/60. + HR3/3600. DTIME = TIMEA - TIMEB C------ CORRECTION FOR CROSSING 24.00 HRS ------ IF(DTIME .GE. 0) GO TO 21 DAYS = DAYS + 1. TIME = TIME +(24. -TIMEB) TIMEB =0. DTIME = TIMEA 21 CONTINUE TIME = TIME + DTIME TIMEB = TIMEA C SET UP ARRAY 'STACK' FOR CODEINS C C CODEIN , INCODE , OTCODE , CODE C ARE ALL PART OF THE LOGIN UIC OR LOGOUT UIC C THE LOGIN UIC GETS THE BILL BUT YOU MUST KEEP TRACK OF THE LOGOUT UIC ALSO C THE LOGOUT UIC IS TO ONLY USED FOR THE UNIVERSAL LOGOUT. C C --------- CAUTION ---------- C ---------------------------- C C THIS COMPUTATION SHOULD BE DONE HERE FOR TWO REASONS. C C SINCE CODEIN IS A REAL VARIABLE AND EXACT EQUALITY C IS TESTED FOR WHITHIN THE PROGRAM ERRORS CAN BE MADE. C THESE ERRORS ARE MADE BY THE FORMATER. THIS CAN BE C AVOIDED BYE USE OF INTERGER*4 BUT I TRIED TO MAKE THE C PROGRAM ACCEPTABLE TO THE FORTRAN COMPILER ALLONG WITH C THE F4P COMPILER. C CODEIN = IGRP*1000. + IUSR C BYPASS FOR LOGOUT IF(IFLAG .EQ. 2H O) GO TO 22 C A) CHECK STACK DO 17 I=1,ITOP IFOUND = I IF ( STACK(I) .EQ. CODEIN ) GO TO 18 17 CONTINUE C C B) INSERT INTO STACK ITOP = ITOP + 1 IF (ITOP .LE. LIMIT ) GO TO 19 C STACK OVERFLOW STOP 19 19 CONTINUE C C INSERT STACK(ITOP) = CODEIN TIMEXX = 0. WRITE(4'ITOP) NAME,CODEIN,TIMEXX C C INSERTION NOT NEEDED 18 CONTINUE IF(IFLAG .NE. 2H I) GO TO 22 JIN = JIN+1 WRITE(2'JIN) TIME,IFLAG,NAME,CODEIN,ITERM GO TO 1 22 JOUT= JOUT + 1 CHECK FOR INVALID FLAG IF(IFLAG .NE. 2H O) STOP C----------------SET FLAG FOR UNIVERSAL TIME OUT IF(CODEIN .EQ. 0. .AND. ITERM .EQ. 0) IFLAG=2HUO C---------------- C C UNIVERSAL LOGOUT SEEMS TO BE RECORDED IF BYE IS IN THE C STARTUP.CMD FILE SINCE THE SYSTEM HAS BEEN OFF OVER NIGHT OR THE C SYSTEM CRASHED DURING THE DAY IT IS UNFAIR TO USE THE STARTUP C TIME FOR THE UNIVERSAL LOGOUT. WE SHALL C COMPRIMISE. IF THE SYSTEM CRASHED IT IS ALSO POSSIBLE THAT THE C TIME WAS RECORDED WRONG. SO THE FOLLOWING C APPROXIMATION IS USED TO BE LESS UNFAIR TO THOSE C WHO DONT LOGOFF OR FOR A SYSTEM CRASH. C C C IF(OLDTIM.GT. TIME .AND. IFLAG .EQ. 2HUO) TIME =OLDTIM IF(IFLAG .EQ. 2HUO) TIME = (2. * OLDTIM + TIME)/3. C C C WRITE(3'JOUT) TIME,IFLAG,CODEIN,ITERM C --SAVE OLD TIME-- OLDTIME = TIME GO TO 1 50 CONTINUE C C----------------------END OF INPUT AND SORT/FORMATING SECTION C CLOSE (UNIT =1) OPEN(UNIT=1,TYPE='NEW',NAME='REPORT.DMP',DISPOSE='SAVE') Y=SECNDS(0.) C C C C MAIN LOOP OBJECTIVE IS TO MATCH LOGIN BY TTN: TO LOGOUT BY TTN: C YOU CANT USE UIC BECAUSE THE USER CAN CHANGE HIS UIC. C C C DO 100 I=1,JIN READ (2'I)TIMEI,NAME,IFLAG,INCODE,TTIN C-------------------------------------------------------------------- C------ C------ C------ THIS 'SPEED UP SECTION WILL ALSO IMPROVE ACCURACY C------ BECAUSE IT WILL USE THE UNIVERSAL LOGOUT TIME TO END C------ ALL LOGOUT'S THIS IS NEEDED FOR SYSTEM CRASHES. C------ AT SYSTEM CRASH LOGOUT IS NOT RECORDED. C------ C------ A DOUBLE ENDED QUE WILL IMPROVE THIS SECTION EVEN MORE C------ C------ C--------------------------------------------------------------------- C C*************************************************************************************** C C AS WRITTEN THIS PROGRAM FUNCTIONS LIKE A STACK. C STACK DELETION OCCURS WHEN C A) THE TOP ELEMENT HAS BEEN LOGED OUT C B) THE TOP ELEMENT IS A UNIVERSAL LOGOUT .AND. C THE LOGIN TIME IS AFTER THE TIME OF THE UNIVERSAL LOGOUT C*************************************************************************************** J1 = JMIN + 1 DO 70 J=J1,JOUT IF(JMIN .GE. JOUT) GO TO 78 READ (3'J)TIMEO,IFLAG,OTCODE,TTOUT C C XREAD ,Y,Y1 ARE ONLY USED TO MEASURE THE EFFECTIVE USE OF THE C STACK AND PROGRAM SPEED. C XREAD = XREAD + 1 IF(IFLAG .EQ. 2HXO) GO TO 69 C C IF DTIME IS NEGITIVE THEN READ NEXT RECORD. THIS OCCURS WHEN C A) THE LOGIN WAS LOST C .OR. C B) LOGIN IS AFTER THE TIME OF UNIVERSAL LOGOUT C DTIME = TIMEO - TIMEI IF ( DTIME .LT. 0) GO TO 69 IF ( IFLAG .EQ. 2H O) GO TO 78 C YOU CAN GO DIRECTLY TO THE LOGOUT SECTION C C-- REMEMBER THAT THE FLAGT UO CAN NEVER BE CHANGED TO A XO C IF ( IFLAG .EQ. 2HUO ) GO TO 64 C SAVE COUNTER 69 JMIN = J 70 CONTINUE 78 JMIN =MIN(JMIN,JOUT-1) IF(JMIN .LE. 0 ) JMIN = 1 C------------------FIND LOGOUT DO 75 J=JMIN,JOUT JSAVE = J READ (3'JSAVE)TIMEO,IFLAG,OTCODE,TTOUT XREAD = XREAD + 1 C C-- TEST FOR LOGOUT USED ALREADY C IF(IFLAG .EQ. 2HXO) GO TO 75 IF((TIMEO-TIMEI).LE. 0.) GO TO 75 IF( TTIN .EQ. TTOUT ) GO TO 61 C TEST FOR UNIVERSAL LOGOUT IF( IFLAG .EQ. 2HUO) GO TO 60 75 CONTINUE C 4 HRS WILL DUE C----------------------NORMAL EXIT MEANS NO LOGOUT FOUND MAKE ONE UP 911 FORMAT(' LOGOUT NOT FOUND '2F10.3,2X,12A1,2X,1A1,F10.0,I10) WRITE (1,911)TIMEI,TIMEO,NAME,IFLAG,INCODE,TTIN DTIME = 4. GO TO 64 61 IFLAG = 2HXO 60 CONTINUE C---------------------------------------------------------------- C C FLAG LOGOUT RECORD C THIS IS A SAFEGUARD FROM A LOST LOGOUT BEING USED 2X C C---------------------------------------------------------------- WRITE (3'JSAVE)TIMEO,IFLAG,OTCODE,TTOUT 63 CONTINUE DTIME = TIMEO - TIMEI 64 CONTINUE C C FIND INDEX OF USER ON DISK FILE C C IF THIS WERE SORTED A BINARY SEARCH WOULD BE NICE C C-- OR ORDER THE USERS ACCORDING TO THE NUMBER OF LOGIN THEY HAVE C-- THAT IS USE PREVIOUS KNOWLEGE. DO 65 IR=1,ITOP IREC = IR IF(STACK( IR ) .EQ. INCODE) GO TO 66 65 CONTINUE C C TYPE 1000,INCODE 1000 FORMAT(' ERR0R INCODE NOT FOUND 'F10.0) STOP 66 66 CONTINUE C C GET TERMINAL USAGE C IF ( TTIN .GT. TMSTOP) STOP IF( DTIME.GE. 16.) DTIME =16. TERMHR ( TTIN + 1 ) = TERMHR ( TTIN + 1 ) + DTIME TERMIX ( TTIN + 1 ) = TERMIX ( TTIN + 1 ) + 1 READ(4'IREC) NAME,CODEIN,XTIME XTIME = DTIME + XTIME WRITE(4'IREC) NAME,CODEIN,XTIME C C LOGOUT COMPLETED GET NEXT LOGIN C 100 CONTINUE READ(2'JIN) TIMEI ,IFLAG,NAME,CODEIN,ITERM READ(3'JOUT) TIMEO ,IFLAG,CODEIN,ITERM C-- C THE AMAX1 MAY LOOK SILLY BUT YOU DONT KNOW WHICH WAS RECORDED C LAST. REMEMBER THAT THE UNIVERSAL LOGOUT IS RECORDED BY STARTUP.CMD HRSON = AMAX1(TIMEO ,TIMEI ) CLOSE(UNIT=3) CLOSE(UNIT=2) Y = SECNDS(Y) C THERE ARE AN UNKNOWN BUT MAXIMUM NUMBER OF TERMINAL ON THE SYSTEM C FIND THIS NUMBER AND GET TOTAL LOGIN TIME FOR SYSTEM INUSE = 0 TTIME = 0. DO 105 I=1,21 IF(TERMHR(I) .LE. 0.) GO TO 105 INUSE = INUSE + 1 TTIME = TTIME + TERMHR(I) 105 CONTINUE C CALL DATE(TODAY) WRITE(1,229),(TODAY(III),III=1,9),(FNAME(MON),MON=9,11) 229 FORMAT(1H1,20X,'RUN ON ' 9A1 ,' FOR THE MONTH OF '3A1) WRITE(1,230) 230 FORMAT(12X,' USER SUMMARY '/, $5X,'HOURS'7X,'NAME',9X,'UIC', ' % ON TIME'/) DO 110 I=1,ITOP READ(4'I) NAME,CODEIN,XTIME FUSED = 100. * XTIME /TTIME WRITE(1,120) XTIME,NAME,CODEIN , FUSED 120 FORMAT(1X,F10.2,2X,12A1,2X,F10.0,2X,F10.4) 110 CONTINUE WRITE (1,235) TTIME,DAYS,HRSON 235 FORMAT(' --------------------------'/' TOTAL USERHOURS 'F10.3,/ $15X,'DAYS ON 'F10.0/15X, 'HOURS ON',F10.2//) Y1 = SECNDS(Y1) WRITE(1,200) Y,Y1,JIN,JOUT,XREAD 200 FORMAT(' PROGRAM SUMMARY' // $ ' TIME INNER LOOP='F10.3, $ /' TOTAL TIME ='F10.3, $ /' LOGIN RECORDS ='I10, $ /' LOGOUT RECORDS 'I9, $ /' NUMBER OF INNER READS ='F10.0///) WRITE(1,215) 215 FORMAT( ' SYSTEM SUMMARY' / $ ' TERM HRS % USAGE LOGINS'/) DO 210 I=1,21 IF(TERMHR(I) .LE. 0.) GO TO 210 FUSED = 100. * TERMHR(I)/TTIME WRITE(1,205) TNAME(I),TERMHR(I),FUSED,TERMIX(I) 205 FORMAT(' TT'A2,':',F10.2, F10.3,I10) 210 CONTINUE STOP END