SUBROUTINE PRTLOG(KLST,KINAC,IOUT) C.. PRTLOG.FTN BOHDEN K. CMAYLO C.. C.. REPORTS ON AN ACCOUNTING FILE CREATED BY KBLOCK C.. C.. IF KLST LT 0 THEN DO NOT ZERO LOG C.. C.. LOGGER.LOG = SEQUENTIAL FILE C.. 1=UIC, 2=UIC, 3=LOGIN TT, 4=YR, 5=MO, 6=DA, 7=SEC, C.. 8=LOGOUT YR, 9=MO, 10=DA, 11=SEC, C.. 12=LOGIN FILES, 13=EOFBLOCKS, 14=ALLBLOCKS, C.. 15=LOGOUT FILES, 16=EOFBLOCKS, 17=ALLBLOCKS C.. DOUBLE PRECISION DT1,DT2,D0BLK(3),D1BLK(3),D2BLK(3),D3BLK(3) 1 ,TOTTIM,CONTOT,CONN,PREDAY,PLIDAY,PLODAY,TODAY,SECDAY DIMENSION CLOCK(24),TTCLK(65) BYTE NONAME(26) BYTE UIC(9),PASS(6),LNAME(14),FNAME(12),KDATE(12),DEV(5) DIMENSION MUIC(2),MOUIC(2),LIBLK(2,3),LOBLK(2,3),LIDAY(3) DIMENSION LODAY(3),INDATE(6),INUIC(2),LBLK(2,3) EQUIVALENCE (INUIC(1),INUIC1),(INUIC(2),INUIC2) DATA TTCLK,CLOCK,NONAME/24*0.,65*0., 18*'*','N','O','N','A','M','E',12*'*'/ C.. C.. START C.. CALL IDATE(INDATE(4),INDATE(5),INDATE(6)) C..TEST FOR NO ZERO LOG FILE LST=KLST IF(KLST.LT.0) LST=-KLST C..TEST FOR WRITE OUT ZERO LOGON ACCOUNTS INAC=KINAC IF(KINAC.LT.0) INAC=-KINAC CALL ERRSET(29,.TRUE.,.FALSE.,.TRUE.,.FALSE.,100) C..SECONDS IN A DAY SECDAY=1./(3600.*24.) C.. C.. COPY OVER FILE TO TEMP FILE C.. IF(KLST.NE.0) 1 CALL XSPAWN('PIP SY:ABC.TMP=SX:[5,10]LOGGER.LOG/SR!') C.. C.. RESET LOG FILE, IF WANTED C.. IF(KLST.EQ.0) CALL LOGRE(INAC,IOUT) IF(KLST.GT.0) CALL LOG0(IOUT) IF(KLST.EQ.0) GO TO 99 C.. C.. SPAWN A SORTED TEMP FILE FROM THE LOG TEMP FILE C.. CALL XSPAWN 1('SRT SY:ABCS.TMP=SY:ABC.TMP/FO:V:87/KE:CN1.8:CN12.17!') C.. C.. LIDAY,LODAY ORDER IS: C.. 1=YR, 2=MO, 3=DA C.. SEC=START TIME C.. C.. GET TODAYS DATE C.. CALL IDATE(LIDAY(2),LIDAY(3),LIDAY(1)) TODAY=JDATE(LIDAY) TODAY=TODAY+SECNDS(0.)*SECDAY C.. C.. OPEN SORTED LOGGER FILE FOR INFO C.. CALL ERRSET(29,.TRUE.,.FALSE.,.TRUE.,.FALSE.,100) OPEN(UNIT=IOUT,NAME='SY:ABCS.TMP',TYPE='OLD',ERR=99) C.. C.. INITIALIZE C.. IEOF=0 NOLOG=0 CONNO=0 CALL DOWORD(MOUIC,MOUIC(2),-1) INREC=-1 KNTLST=99 MAXLST=50 C.. GET LOG NAME INFO NUMB=0 C.. NUMB=0=START, RTN UIC NUMB, -=EOF CALL GETACN(INAC,NUMB,UIC,PASS,LNAME,FNAME,KDATE,LOGIN,DEV) DECODE(6,6,UIC)INUIC 6 FORMAT(2O3) C.. C.. READ IN INFO C.. INREC=INREC+1 501 INREC=INREC-1 50 READ(IOUT,1,END=55)MUIC,INTT,LIDAY,SECLI,LODAY,SECLO 1 ,LIBLK,LOBLK 1 FORMAT(2O4,O3,3I3,F8.0,3I3,F8.0,6(I4,I3)) INREC=INREC+1 C.. C.. CHECK IF SAME USER C.. IF(MUIC(1).NE.MOUIC(1).OR.MUIC(2).NE.MOUIC(2)) GO TO 100 51 CONTINUE C.. CHECK IF UIC=0, IF SO, COMBINED FILES, IGNORE RECORDS IF(MUIC(1).EQ.0) GO TO 501 C.. C.. SAME USER, COLLECT STATISTICS C.. C..GATHER UP BLOCK COUNTS IN BLOCKS*JULIAN DAY.SEC IF(IEOF.GT.0) GO TO 55 LOGONS=LOGONS+1 LIDAYS=JDATE(LIDAY) PLIDAY=LIDAYS+SECLI*SECDAY C.. GET DATE OF LOGOUT LODAYS=JDATE(LODAY) PLODAY=LODAYS+SECLO*SECDAY C.. CHECK IF GREATER THAN 1.5 DAYS (NOT LIKELY) C.. IF SO, CALCULATE TO NEAREST DAY C.. ALSO, CHECK IF NEGATIVE... MEANS TIME WAS CHANGED. C.. GET CONNECT TIME CONN=PLODAY-PLIDAY C.. SEE IF CONNECT TIME OK IF(CONN.GT.0.AND.CONN.LE.1.5) GO TO 111 C.. SEE IF CONNECT TIME GT 1.5 DAYS IF(CONN.GT.1.5) GO TO 112 IADD=-CONN CCONN=-CONN-IADD TYPE 222,MUIC,INTT,CONN,LIDAY,LODAY,CCONN 222 FORMAT(/' *** ERROR *** UIC [',O3,',',O3,'] TERMINAL',O3, 1 ', HAS NEGATIVE CONNECT TIME.'/' CONNECT=',F11.5, 2 ' DAYS, LOGIN=',3I3,', LOGOUT=',3I3,','/ 3 ' CONNECT TIME IS SET TO',F10.5,' DAYS') CONN=CCONN PLODAY=PLIDAY+CONN GO TO 111 C.. FIX IF OVER A DAY AND HALF 112 IPLO=PLODAY IPLI=PLIDAY PPLO=PLODAY-IPLO PLODAY=IPLI+PPLO IF(PLODAY.LE.PLIDAY) PLODAY=PLODAY+1. CCONN=PLODAY-PLIDAY TYPE 224,MUIC,INTT,CONN,LIDAY,LODAY,CCONN 224 FORMAT(/' *** NOTE *** UIC [',O3,',',O3,'] TERMINAL',O3, 1 ', WAS LOGGED IN OVER 1.5 DAYS.'/' CONNECT=',F11.5, 2 ' DAYS, LOGIN=',3I3,', LOGOUT=',3I3,','/ 3 ' CONNECT TIME SET TO',F10.5,' DAYS.'/) CONN=CCONN C.. CALCULATE BAR CHART FOR CONNECT TIME 111 SECCON=CONN/SECDAY CALL CONBAR(CLOCK,SECLI,SECCON) C.. GET CONNECT TIME FOR TERMINAL TTCLK(INTT+1)=TTCLK(INTT+1)+CONN*24 CONTOT=CONTOT+CONN C..GET BLOCK*DATE FROM LAST LOGIN + AVERAGE DURING CONNECT DO 10 I=1,3 DT1=LIBLK(1,I)*1000.+LIBLK(2,I) DT2=LOBLK(1,I)*1000.+LIBLK(2,I) D1BLK(I)=D1BLK(I)+DT1*(PLIDAY-PREDAY) D1BLK(I)=D1BLK(I)+(DT1+DT2)*.5*CONN C.. TEST FOR HIGH/LOW IF(D2BLK(I).LT.DT2) D2BLK(I)=DT2 IF(D3BLK(I).GT.DT2) D3BLK(I)=DT2 C.. SAVE LAST LOGOUT BLOCKS LBLK(1,I)=LOBLK(1,I) LBLK(2,I)=LOBLK(2,I) 10 CONTINUE C..ADD UP TOTAL DAYS TOTTIM=TOTTIM+PLIDAY-PREDAY+CONN C..RESET LAST DAY PREDAY=PLODAY C.. GET NEXT RECORD GO TO 50 C.. C.. NEW USER, SET UP RESULTS AND PRINT OUT C.. C.. CHECK IF FIRST TIME 100 IF(INREC.LE.0) GO TO 150 C..SEE IF SECOND TIME (FIRST VALID RECORD READ IN) IF(INREC.EQ.1) GO TO 200 C.. C.. GET LAST FIGURES, TOTAL TIME IN DAYE, TOTAL CONNECT IN HOURS C.. TOTTIM=TOTTIM+TODAY-PREDAY CONTOT=CONTOT*24. DO 101 I=1,3 D1BLK(I)= 1 (D1BLK(I)+(LBLK(1,I)*1000.+LBLK(2,I))*(TODAY-PREDAY))/TOTTIM 101 CONTINUE C.. C.. WRITE OUT INFO C.. 207 IF(KNTLST.GT.MAXLST) WRITE(LST,103)INDATE,'AV','HI','LO' 103 FORMAT('1'/ 144X,'A B C REPORT DONE FROM ',2(I2,'/'),I2,' TO ',2(I2,'/'),I2 1 //' U I C N A M E',20X,'LOGONS CONN/HR' 1 ,3(1X,A2,'-FILES BLK-USED BLK-ALLO')/) IF(KNTLST.GT.MAXLST) KNTLST=0 C.. C.. CHECK OUT ACCOUNT C.. IF(INUIC1.NE.MOUIC(1).OR.INUIC2.NE.MOUIC(2)) GO TO 210 WRITE(LST,102)MOUIC,LNAME,FNAME,LOGONS,CONTOT,D1BLK,D2BLK,D3BLK 102 FORMAT(1X,O3,',',O3,1X,14A1,',',12A1,I6,F8.3,9F9.0) IF(NUMB.GE.0) 1 CALL GETACN(INAC,NUMB,UIC,PASS,LNAME,FNAME,KDATE,LOGIN,DEV) DECODE(6,6,UIC)INUIC 209 KNTLST=KNTLST+1 C.. C.. RESET TO NEW USER C.. 200 PREDAY=P0DAY LOGONS=0 TOTTIM=0 CONTOT=0 DO 201 I=1,3 IF(I.LT.3) MOUIC(I)=MUIC(I) D1BLK(I)=0 D2BLK(I)=(LIBLK(1,I)*1000.+LIBLK(2,I)) D3BLK(I)=(LIBLK(1,I)*1000.+LIBLK(2,I)) 201 CONTINUE GO TO 51 C.. C.. READ FIRST RECORD FOR INITIAL ZERO LOG TIME C.. C.. CALCULATE FIRST DATE 150 P0DAY=JDATE(LIDAY) P0DAY=P0DAY+SECLI*SECDAY INDATE(1)=LIDAY(2) INDATE(2)=LIDAY(3) INDATE(3)=LIDAY(1) GO TO 50 C.. C.. FIGURE OUT NO SHOWS UNDER ACCOUNTS C.. 210 CONTINUE C..CHECK FOR NONAME + DO NOT GET NEXT NAME FROM ACCOUNT IF(MOUIC(1).LT.INUIC1) GO TO 205 IF(MOUIC(1).EQ.INUIC1.AND.MOUIC(2).LT.INUIC2) GO TO 205 C..NOT AT CURRENT ACNT POSITION, PRINT CURRENT POSITION IF C.. /ZA WITH ZERO ENTRIES, GET NEXT LOG ENTRY, RETURN TO CHECK ACNT IF(NUMB.LE.0) GO TO 205 IF(KINAC.GT.0) GO TO 176 188 DEV(5)=':' CALL BLOCKS(INUIC,LBLK,DEV,0) DO 202 I=1,3 D0BLK(I)=LBLK(1,I)*1000.+LBLK(2,I) 202 CONTINUE WRITE(LST,102)INUIC,LNAME,FNAME,NOLOG,CONNO,D0BLK KNTLST=KNTLST+1 176 CALL GETACN(INAC,NUMB,UIC,PASS,LNAME,FNAME,KDATE,LOGIN,DEV) DECODE(6,6,UIC)INUIC C..CHECK FOR NEXT ACNT ENTRY IF CURRENT NOT OK IF(IEOF.LE.1.AND.NUMB.GT.0) GO TO 207 C..CHECK IF NOT FINISHED WITH /ZA OPTION IF(IEOF.EQ.2.AND.NUMB.GT.0.AND.KINAC.LT.0) GO TO 188 C.. CHECK IF ALL COMPLETED IF(IEOF.GE.1.AND.NUMB.LE.0) GO TO 55 C.. NO NAME, WRITE OUT THEN CONTINUE MAINLINE 205 CONTINUE WRITE(LST,102)MOUIC,NONAME,LOGONS,CONTOT,D1BLK,D2BLK,D3BLK IF(IEOF.LE.1) GO TO 209 C.. C.. FINISHED C.. 55 CONTINUE 124 IEOF=IEOF+1 INREC=INREC+1 C.. CHECK FOR /ZA OPTION NOT FINISHED IF(NUMB.GT.0.AND.IEOF.NE.1.AND.KINAC.LT.0) GO TO 188 C.. FINISH LAST ENTRY IF(IEOF.EQ.1) GO TO 100 C.. WRITE BAR CHART FOR CONNECT TIME TOTCLK=0 DO 71 I=1,24 TOTCLK=TOTCLK+CLOCK(I) 71 CONTINUE WRITE(LST,72)INDATE,(I,I=1,3) 72 FORMAT('1'/ 144X,'A B C REPORT DONE FROM ',2(I2,'/'),I2,' TO ',2(I2,'/'),I2 1 //' TIME PERCENT USAGE CONNECT TIME' 1 //' :',3('...........................',I1,'0%')/) DO 73 I=1,24 I1=I-1 IPCT=3*(CLOCK(I)/TOTCLK*100+.5) IF(IPCT.GT.60) IPCT=60 WRITE(LST,74)I1,I,('#',I2=1,IPCT) 74 FORMAT(/1X,I2,'-',I2,' :',60A1) 73 CONTINUE C.. C.. REPORT ON TERMINAL CONNECT TIME C.. WRITE(LST,75)INDATE 75 FORMAT('1'/ 144X,'A B C REPORT DONE FROM ',2(I2,'/'),I2,' TO ',2(I2,'/'),I2 1 //44X,'TERMINAL USAGE CONNECT TIME'//) DO 76 I=1,65 IF(TTCLK(I).NE.0) MAXTT=I 76 CONTINUE MAXTT=MAXTT-1 WRITE(LST,77)(I,TTCLK(I+1),I=1,MAXTT) 77 FORMAT(8(////8(' TT',O2,':',F7.2:))) C.. DELETE TEMP FILES CALL XSPAWN('PIP SY:ABC.TMP;*/DE,SY:ABCS.TMP;*!') CALL EXIT 99 STOP 'OK' END