PROGRAM ACCREP C+ C IDENT /3/ C Originally written by J. L. Hamilton C E-Systems C P.O. Box 1056 C Greenville, Texas 75401 C C Modified By: C James G. Downward C KMS Fusion C P.O. Box 1567 C Ann Arbor, Mich. 48106 C C C C THIS PROGRAM WILL GENERATE A STATUS ON THE USAGE OF THE C PDP-11 COMPUTER WITH THE KMS ENHANCEMENTS USING RSX11M V3.2 C OR LATER. C PARAMETER MAXTRY=5 !MAXIMUM ILLEGAL LOGIN ATTEMPTS PARAMETER TIME1=28800 !START TIME (8AM) define PARAMETER TIME2=43200 !NOON prime PARAMETER TIME3=59400 !STOP TIME (430 PM) time PARAMETER TIME4=86400 !MIDNIGHT PARAMETER SECNDA=86400 !SECONDS IN A DAY C C-------------- Modify according to system needs--------------------- C PARAMETER ACNTMX=70 ! MAX NUMBER OF ACCOUNTS <<<<<********* PARAMETER NBRTRM=20 ! MAX # OF TERMINALS IN USE <<<<<********* PARAMETER TERRAT=4.0 !TERMINAL TIME CHARGE RATE PARAMETER LOGRAT=0.35 !LOGIN CHARGE RATE PARAMETER CPURAT=1.25 !CPU USAGE CHARGE RATE PARAMETER IORAT=.26 !KILO I/O USAGE CHARGE RATE PARAMETER BLKRAT=0.0512 ! ONLY CHARGE IF OVER DISK BLOCK QUOTA C C-------------- Modify the above as required ------------------------- C C C INTEGER*2 LINE,RECTYP,ACCNT,ACNT,UACNT,HOUR,MINIT,SEC,LOACNT,HIACNT INTEGER*2 YEAR,MON,DAY,TERNUM,HELLO,BYE,UPD,START,STOP INTEGER*2 GLOBAL,DAYFLG,CPU,ATCNT,RUNCNT,INSCNT,NBLKS INTEGER*2 ABLKS,NFILE,GUIC,OUIC,FIRST,LAST INTEGER*2 DAYFYR,UIC,TERMID INTEGER DAYSON,STPDAY,STRDAY INTEGER BEGDAY,BEGMON,ENDDAY,ENDMON INTEGER NUMLOG,LOGNUM,LASTDA,LOGDA,OVER INTEGER ACNTNM,LOGS,DAYS,TOTTER INTEGER MNSTRD,MXSTPD,ALOBLK,FILSIZ,NUPD INTEGER*4 TOTRUN,TOTINS,TOTIND INTEGER*4 NULL,QIOCT,QICT,CPUTIM INTEGER*4 TIMEON,LOGTIM,TERTIM INTEGER*4 TOTTIM,WKNDTM INTEGER*4 PTIME,MTIME,ATIME,ETIME,PRETIM INTEGER*4 MORTIM,AFTTIM,EVNTIM INTEGER*4 TIMPRE,TIMMOR,TIMAFT,TIMEVN INTEGER*4 STRTIM,STPTIM,MAXSTR INTEGER*4 PRINT1 REAL PRINT2,TOTQIO,TQIO,TOTCPU LOGICAL*1 EOF,ACTIVE,STPFLG,WEKND,LANS BYTE NAME,BYT,FILE,DATLIN C C DIMENSION ALL ARRAYS C DIMENSION LINE(13),ACCNT(0:NBRTRM),STRDAY(0:NBRTRM) DIMENSION STPDAY(0:NBRTRM),CPUTIM(ACNTMX),TOTIND(ACNTMX) DIMENSION TOTRUN(ACNTMX),TOTINS(ACNTMX),NUMLOG(ACNTMX) DIMENSION LOGNUM(0:NBRTRM),LASTDA(ACNTMX),LOGDA(ACNTMX) DIMENSION OVER(ACNTMX),ALOBLK(ACNTMX),FILSIZ(ACNTMX) DIMENSION NUPD(ACNTMX),LOGTIM(ACNTMX),TERTIM(0:NBRTRM) DIMENSION TOTQIO(ACNTMX),WKNDTM(ACNTMX),PRETIM(ACNTMX) DIMENSION MORTIM(ACNTMX),AFTTIM(ACNTMX),EVNTIM(ACNTMX) DIMENSION STRTIM(0:NBRTRM),STPTIM(0:NBRTRM),ACTIVE(0:NBRTRM),NAME(25) DIMENSION BYT(2),FILE(31),DATLIN(19) C C C EQUIVALENCES C C ALL EQUALS C EQUIVALENCE (RECTYP,LINE(1)) EQUIVALENCE (HOUR,LINE(2)) EQUIVALENCE (MINIT,LINE(3)) EQUIVALENCE (SEC,LINE(4)) C C GLOBAL C EQUIVALENCE (NULL,LINE(5)) EQUIVALENCE (QICT,LINE(10)) C C HELLO,BYE C EQUIVALENCE (TERMID,LINE(5)) EQUIVALENCE (ACNT,LINE(6)) EQUIVALENCE (UIC,LINE(7)) EQUIVALENCE (BYT(1),TERMID) C C HELLO C EQUIVALENCE (NILEG,LINE(8)) C C BYE C EQUIVALENCE (CPU,LINE(8)) EQUIVALENCE (ATCNT,LINE(9)) EQUIVALENCE (QIOCT,LINE(10)) EQUIVALENCE (RUNCNT,LINE(12)) EQUIVALENCE (INSCNT,LINE(13)) C C UPDATE C EQUIVALENCE (UACNT,LINE(5)) EQUIVALENCE (NFILE,LINE(8)) EQUIVALENCE (NBLKS,LINE(9)) EQUIVALENCE (ABLKS,LINE(10)) C C INITIALIZE DATA SECTION C DATA EOF/.FALSE./ C DATA ACTIVE/.FALSE.,.FALSE.,.FALSE.,.FALSE.,.FALSE./ DATA ACTIVE/NBRTRM*.FALSE.,.FALSE./ DATA STPFLG/.FALSE./ DATA STOP/-1/ DATA DAYFLG/0/ DATA START/1/ DATA GLOBAL/2/ DATA HELLO/5/ DATA BYE/6/ DATA UPD/7/ DATA MNSTRD/365/ DATA MXSTPD/1/ DATA DATLIN/9*' ','-',9*' '/ DATA FIRST/365/ DATA LAST/1/ C C MAIN PROGRAM FOLLOWS C CALL OPN(FILE,NC) CALL GETLMT(IFIRST,ILAST) ! LIMITS LOACNT=1 ! ASSUME WE WILL REP HIACNT=ACNTMX ! ON ALL ACCOUNTS WRITE(5,10) ! BUT CHECK TO BE SURE 10 FORMAT(' Limit report to range of accounts (Y/N): ',$)! READ(5,12,END=860)LANS ! BY ASKING 12 FORMAT(1A1) ! IF(LANS.NE.'Y') GOTO 20 ! DON'T LIMIT, SKIP 13 WRITE(5,14) 14 FORMAT(' Enter Low Account #, High Account #: ',$)! READ(5,16,END=860)LOACNT,HIACNT ! get RANGE 16 FORMAT(2I5) ! 20 JDAY=1 ! ASSUME DAY IF(IFIRST.EQ.1 .AND. ! - ILAST.EQ.365) GOTO 5 ! IF NO LIMITS SET 1 CALL NEXLIN(LINE,EOF) ! GET A RECORD IF(EOF) GOTO 860! AT END OF FILE ,EXIT IF(RECTYP.NE.1 .AND. ! IF NOT START RECORD - RECTYP.NE.4 .AND. ! OR DELTA RECORD OR - RECTYP.NE.-1) GOTO 1 ! STOP RECORD, REREAD YEAR=LINE(5) ! SET YEAR MON =LINE(6) ! SET DATE DAY =LINE(7) ! JDAY=DAYFYR(YEAR,MON,DAY) ! WHAT DAY IF(JDAY.LT.IFIRST .OR. - JDAY.GT.ILAST) GOTO 1 ! ONLY DO IF IN RANGE ! FAKE EOF 5 CALL NEXLIN(LINE,EOF) IF(EOF)GO TO 700 C C TEST TO SEE IF DATE IS IN SELECT RANGE C IF(JDAY.LT.IFIRST .OR. ! ONLY PROCESS RECORDS - JDAY.GT.ILAST) GOTO 300! FIND A START RECORD C C HELLO SECTION C IF(RECTYP.NE.HELLO) GOTO 100! CHECK FOR BYE PACKET TERNUM=BYT(2) ! SET TERMINAL # ACCNT(TERNUM)=ACNT ! MAKE TERMINAL ACTIVE STRTIM(TERNUM)=SEC+60.*MINIT+60.*60.*HOUR ! IN SEC FROM MIDNIGHT STRDAY(TERNUM)=DAYFYR(YEAR,MON,DAY) ! SET DAY OF YEAR MNSTRD=MIN(MNSTRD,STRDAY(TERNUM)) ! SET <=365 IF(NILEG.GT.MAXTRY)WRITE(5,1030)ACNT,NILEG ! TOO MANY ILLEG LOG ACTIVE(TERNUM)=.TRUE. ! SHOW ACNT IS ACTIVE GO TO 5 C C BYE SECTION C 100 IF(RECTYP.NE.BYE) GOTO 200! CHECK NEXT REC TYPE TERNUM=BYT(2) ! CURRENT TERMINAL # IF(.NOT.ACTIVE(TERNUM)) GOTO 900! ERROR, ACNT NOT ACT IF(ACNT.EQ.0) GOTO 5 ! NOT VALID ACNT IF(ACNT.NE.ACCNT(TERNUM)) GOTO 901! ERROR, ACNT LOST? 101 CONTINUE ! IF(STPFLG)TERNUM=0 ! SHUTDOWN FROM TT0: 102 CONTINUE ! IF(.NOT.ACTIVE(TERNUM)) GOTO 180! SKIP IF NOT ACTIVE ACNT=ACCNT(TERNUM) IF(ACNT.EQ.0) GOTO 180! SKIP IF TI0: STPTIM(TERNUM)=SEC+MINIT*60.+HOUR*60.*60. ! STOP TIME IN SEC IF(.NOT.STPFLG) GOTO 110! SKIP IF NOT SHUTDOWN MAXSTR=0 ! MAKE SMALLEST DO 105,I=0,NBRTRM-1 ! LOOP THROUGH ALL TIs 105 MAXSTR=MAX(MAXSTR,STRTIM(I)) ! TO FIND LARGEST TIME C MAXSTR=MAX(STRTIM(0),STRTIM(1),STRTIM(3),STRTIM(4))! IF(MAXSTR.LT.STPTIM(TERNUM))STRTIM(TERNUM)=MAXSTR! 110 CONTINUE ! STPDAY(TERNUM)=DAYFYR(YEAR,MON,DAY) ! DAY OF LOGOFF MXSTPD=MAX(STPDAY(TERNUM),MXSTPD) ! MAX STOP DAY DAYSON=STPDAY(TERNUM)-STRDAY(TERNUM) ! IF LOGGEDON FOR DAYS TIMEON=STPTIM(TERNUM)-STRTIM(TERNUM)+SECNDA*FLOAT(DAYSON)! IF(TIMEON.LT.0)TIMEON=TIMEON+SECNDA*1. ! IF OVERFLOW LOGTIM(ACNT)=LOGTIM(ACNT)+TIMEON*1. ! ADD IN TIME IF(STPFLG) GOTO 115! SKIP UPDATE IF STOP IF(CPU.GT.32000.OR.CPU.LT.0)CPU=32000 ! MAX LIMIT TO CPU TIC CPUTIM(ACNT)=CPUTIM(ACNT)+CPU ! ADD IN TO ACNT TTL TERTIM(TERNUM)=TERTIM(TERNUM)+TIMEON*1. ! ADD IN CONNECT TIME TOTIND(ACNT)=TOTIND(ACNT)+ATCNT ! ADD IN # ...AT. RUNS IF(QIOCT.GT.32000.OR.QIOCT.LT.0)QIOCT=32000 ! MAX LIMIT TO QIOs TOTQIO(ACNT)=TOTQIO(ACNT)+QIOCT*1. ! ADD IN QIO COUNT TOTRUN(ACNT)=TOTRUN(ACNT)+RUNCNT ! ADD IN RUN COUNT TOTINS(ACNT)=TOTINS(ACNT)+INSCNT ! ADD IN INS COUNT C 115 CONTINUE TOTTIM=TOTTIM+TIMEON*1. !ALL TERMINAL TIME NUMLOG(ACNT)=NUMLOG(ACNT)+1 ! # LOGINS / ACNT LOGNUM(TERNUM)=LOGNUM(TERNUM)+1 ! # LOGINS / TER IF(LASTDA(ACNT).GE.STRDAY(TERNUM)) GOTO 103! LASTDA(ACNT)=STRDAY(TERNUM) ! LOGDA(ACNT)=LOGDA(ACNT)+1 ! # DAYS WITH 1+ LOGIN 103 IF(WEKND(STRDAY(TERNUM),YEAR)) GOTO 104! PTIME=MIN(TIME1,STPTIM(TERNUM))-MIN(TIME1,STRTIM(TERNUM))! PRIME TIME MTIME=MAX(MIN(STPTIM(TERNUM),TIME2),TIME1) ! MORNING TIME - -MIN(MAX(STRTIM(TERNUM),TIME1),TIME2) ! ATIME=MAX(MIN(STPTIM(TERNUM),TIME3),TIME2) ! AFTERNOON TIME - -MIN(MAX(STRTIM(TERNUM),TIME2),TIME3) ! ETIME=MAX(MIN(STPTIM(TERNUM),TIME4),TIME3) ! EVENING TIME - -MIN(MAX(STRTIM(TERNUM),TIME3),TIME4) ! IF(PTIME.LT.0)PTIME=PTIME+8.*3600. ! ? IF(MTIME.LT.0)MTIME=MTIME+4.*3600. ! ? IF(ATIME.LT.0)ATIME=ATIME+4.5*3600. ! ? IF(ETIME.LT.0)ETIME=ETIME+7.5*3600. ! ? PRETIM(ACNT)=PRETIM(ACNT)+PTIME*1. ! ADD IN ELAPSED TIMES MORTIM(ACNT)=MORTIM(ACNT)+MTIME*1. ! AFTTIM(ACNT)=AFTTIM(ACNT)+ATIME*1. ! EVNTIM(ACNT)=EVNTIM(ACNT)+ETIME*1. ! IF(STPTIM(TERNUM).LT.STRTIM(TERNUM)) ! - PRETIM(ACNT)=PRETIM(ACNT)+STPTIM(TERNUM)*1.! TIMPRE=TIMPRE+PTIME*1. ! TIMMOR=TIMMOR+MTIME*1. ! TIMAFT=TIMAFT+ATIME*1. ! TIMEVN=TIMEVN+ETIME*1. ! IF(STPTIM(TERNUM).LT.STRTIM(TERNUM)) ! - TIMPRE=TIMPRE+STPTIM(TERNUM)*1.! GOTO 180 104 WKNDTM(ACNT)=WKNDTM(ACNT)+TIMEON*1. ! 180 ACTIVE(TERNUM)=.FALSE. ! IF(.NOT.STPFLG) GOTO 190! TERNUM=TERNUM+1 ! IF(TERNUM.LT.NBRTRM+1) GOTO 102! STPFLG=.FALSE. ! 190 CONTINUE ! GOTO 5 C C UPDATE SECTION C 200 IF(RECTYP.NE.UPD) GOTO 300! IF NOT DSK UPD REC IF(NBLKS.GT.ABLKS)OVER(UACNT)=OVER(UACNT)-ABLKS+NBLKS! ALOBLK(UACNT)=ABLKS ! FILSIZ(UACNT)=FILSIZ(UACNT)+(NBLKS/NFILE) ! NUPD(UACNT)=NUPD(UACNT)+1 ! GOTO 5 ! C C START SECTION C 300 IF(RECTYP.NE.START) GOTO 400! YEAR=LINE(5) ! MON=LINE(6) ! DAY=LINE(7) ! IJ=DAYFYR(YEAR,MON,DAY) ! DAY OF YEAR JDAY=IJ ! SEARCH IN LIMITS IF(JDAY.GT.ILAST .OR. ! IF OUT OF RANGE - JDAY.LT.IFIRST) GOTO 5 ! TRY AGAIN DO 301,TERNUM=0,NBRTRM-1 ! STRTIM(TERNUM)=SEC+MINIT*60.+HOUR*60.*60. ! STRDAY(TERNUM)=DAYFYR(YEAR,MON,DAY) ! C ACTIVE(TERNUM)=.TRUE. ! 301 CONTINUE LAST=MAX(IJ,LAST) ! FIRST=MIN(IJ,FIRST) ! IF(LAST.EQ.IJ)ENCODE(8,1040,DATLIN(12))MON,DAY,YEAR ! IF(FIRST.EQ.IJ)ENCODE(8,1040,DATLIN(1))MON,DAY,YEAR ! GOTO 5 C C STOP SECTION C 400 IF(RECTYP.NE.STOP) GOTO 500! YEAR=LINE(5) ! MON=LINE(6) ! DAY=LINE(7) ! STPFLG=.TRUE. ! IJ=DAYFYR(YEAR,MON,DAY) ! JDAY=IJ ! KEEP TRACK LAST=MAX(IJ,LAST) ! FIRST=MIN(IJ,FIRST) ! IF(LAST.EQ.IJ)ENCODE(8,1040,DATLIN(12))MON,DAY,YEAR ! IF(FIRST.EQ.IJ)ENCODE(8,1040,DATLIN(1))MON,DAY,YEAR ! GOTO 101 !JMP TO BYE SEC C C GLOBAL SECTION C 500 IF(RECTYP.NE.GLOBAL) GOTO 600! TOTNUL=TOTNUL+NULL*1. ! ADD IN NULL TQIO=QICT+TQIO*1. ! AND QIOS GOTO 5 C C DAY FLAG SECTION C 600 IF(RECTYP.NE.DAYFLG) GOTO 5 ! YEAR=LINE(5) ! MON=LINE(6) ! DAY=LINE(7) ! IJ=DAYFYR(YEAR,MON,DAY) ! LAST=MAX(IJ,LAST) ! FIRST=MIN(IJ,FIRST) ! IF(LAST.EQ.IJ)ENCODE(8,1040,DATLIN(12))MON,DAY,YEAR ! IF(FIRST.EQ.IJ)ENCODE(8,1040,DATLIN(1))MON,DAY,YEAR ! GOTO 5 C C PRINT OUT SECTION C C 700 CLOSE(UNIT=1) ! LUN=1 ! Account file lun CALL CREDAT(LUN) ! Creat tmp ACNT info ! (ACCOUNTS.DAT) TOTCPU=0.0 ! DO 701,ACNT=1,ACNTMX ! 701 TOTCPU=TOTCPU+FLOAT(CPUTIM(ACNT)) ! OPEN(UNIT=6, ! OPEN OUTPUT - NAME='SY:SYSTEMUSE.LST', ! REPORT FILE - TYPE='NEW', ! - ERR =906) ! DO 750,ACNT=LOACNT,HIACNT ! IF(LOGTIM(ACNT).EQ.0) GOTO 750! WRITE(6,1000)(FILE(I),I=1,NC),(DATLIN(I),I=1,19)! 702 READ(1,1001,END=902)ACNTNM,GUIC,OUIC,NAME ! READ DATA IF(ACNTNM.NE.ACNT) GOTO 702! GET ACNT # REWIND 1 ! BACK TO STRT WRITE(6,1002)ACNT,NAME,GUIC,OUIC ! WRT OUT HDR TOTHR=LOGTIM(ACNT)/3600. ! CHGHR=TOTHR*TERRAT ! WRITE(6,1003)TERRAT,TOTHR,CHGHR ! CHGLOG=LOGRAT*NUMLOG(ACNT) ! WRITE(6,1004)LOGRAT,NUMLOG(ACNT),CHGLOG ! CPUMIN=FLOAT(CPUTIM(ACNT))/60. ! CHGCPU=CPUMIN*CPURAT ! WRITE(6,1005)CPURAT,CPUMIN,CHGCPU ! QIOKIL=TOTQIO(ACNT)/1E3 ! IF(QIOKIL.LT.1.0.AND.QIOKIL.NE.0.0)QIOKIL=1. ! CHGQIO=QIOKIL*IORAT ! WRITE(6,1006)IORAT,QIOKIL,CHGQIO ! CHGBLK=BLKRAT*OVER(ACNT) ! WRITE(6,1007)BLKRAT,OVER(ACNT),CHGBLK ! TOTCHG=CHGHR+CHGLOG+CHGCPU+CHGQIO+CHGBLK ! WRITE(6,1008)TOTCHG ! CALL INVTIM(LOGTIM(ACNT),HOUR,MINIT,SEC) ! WRITE(6,1009)HOUR,MINIT,SEC,LOGDA(ACNT) ! PRINT1=LOGTIM(ACNT)*1./LOGDA(ACNT) ! CALL INVTIM(PRINT1,HOUR,MINIT,SEC) ! WRITE(6,1010)HOUR,MINIT,SEC ! CALL INVTIM(PRETIM(ACNT),HOUR,MINIT,SEC) ! WRITE(6,1011)HOUR,MINIT,SEC ! CALL INVTIM(MORTIM(ACNT),HOUR,MINIT,SEC) ! WRITE(6,1012)HOUR,MINIT,SEC ! CALL INVTIM(AFTTIM(ACNT),HOUR,MINIT,SEC) ! WRITE(6,1013)HOUR,MINIT,SEC ! CALL INVTIM(EVNTIM(ACNT),HOUR,MINIT,SEC) ! WRITE(6,1014)HOUR,MINIT,SEC ! CALL INVTIM(WKNDTM(ACNT),HOUR,MINIT,SEC) ! WRITE(6,1015)HOUR,MINIT,SEC ! CALL INVTIM(MORTIM(ACNT)+AFTTIM(ACNT),HOUR,MINIT,SEC) WRITE(6,1021)HOUR,MINIT,SEC ! WRITE(6,1016)TOTRUN(ACNT) ! WRITE(6,1017)TOTINS(ACNT) ! WRITE(6,1018)TOTIND(ACNT) ! WRITE(6,1019)ALOBLK(ACNT) ! WRITE(6,1038)NUPD(ACNT) ! WRITE(6,1020)FILSIZ(ACNT)/NUPD(ACNT) ! PRINT2=(MORTIM(ACNT)+AFTTIM(ACNT))*100./LOGTIM(ACNT) WRITE(6,1022)PRINT2 ! PRINT2=100.*LOGTIM(ACNT)/TOTTIM ! WRITE(6,1025)PRINT2 ! PRINT2=100.*TOTQIO(ACNT)/TQIO ! IF(PRINT2.LT.0.0) GOTO 740! IF(PRINT2.LT.0.01)WRITE(6,1036) ! IF(PRINT2.GE.0.01)WRITE(6,1023)PRINT2 ! 740 DAYS=MXSTPD-MNSTRD ! ALLTIM=DAYS*SECNDA ! PRINT2=100.*FLOAT(CPUTIM(ACNT))/TOTCPU ! WRITE(6,1024)PRINT2 ! 750 CONTINUE ! CLOSE(UNIT=1) ! C C TOTAL SYSTEM SHEET FOLLOWS C 800 LOGS=0 ! WRITE(6,1000)(FILE(I),I=1,NC),(DATLIN(I),I=1,19)! DO 801,ACNT=1,ACNTMX ! 801 LOGS=LOGS+NUMLOG(ACNT) ! CALL INVTIM(TOTTIM,HOUR,MINIT,SEC) ! WRITE(6,1026)HOUR,MINIT,SEC ! PRINT1=TOTTIM/LOGS ! CALL INVTIM(PRINT1,HOUR,MINIT,SEC) ! WRITE(6,1027)HOUR,MINIT,SEC ! PRINT1=TOTTIM/DAYS ! CALL INVTIM(PRINT1,HOUR,MINIT,SEC) ! WRITE(6,1028)HOUR,MINIT,SEC ! CALL INVTIM(TIMPRE,HOUR,MINIT,SEC) ! WRITE(6,1011)HOUR,MINIT,SEC ! CALL INVTIM(TIMMOR,HOUR,MINIT,SEC) ! WRITE(6,1012)HOUR,MINIT,SEC ! CALL INVTIM(TIMAFT,HOUR,MINIT,SEC) ! WRITE(6,1013)HOUR,MINIT,SEC ! CALL INVTIM(TIMEVN,HOUR,MINIT,SEC) ! WRITE(6,1014)HOUR,MINIT,SEC ! WRITE(6,1029) ! DO 802,TERNUM=0,NBRTRM-1 ! CALL INVTIM(TERTIM(TERNUM),HOUR,MINIT,SEC) ! WRITE(6,1033)TERNUM,HOUR,MINIT,SEC,LOGNUM(TERNUM)! 802 CONTINUE ! CPUUTL=100.*TOTCPU/((TOTNUL/60.)+TOTCPU) ! TERUTL=100.*TOTTIM/(DAYS*24*3600.*NBRTRM) !( TERMINALS) PTRUTL=100.*(TIMMOR+TIMAFT)/(DAYS*8.5*3600.*NBRTRM)!( TERMS)(8-4:30) WRITE(6,1034)CPUUTL ! WRITE(6,1035)TERUTL ! WRITE(6,1037)PTRUTL ! CLOSE(UNIT=6) ! WRITE(5,850) ! 850 FORMAT(' ACCREP -- Done, SYSTEMUSE.LST is ready for printing') 860 CALL EXIT C C ERROR PROCESSING FOLLOWS C 900 CONTINUE D TYPE *,'TERMINAL NOT ACTIVE' D TYPE 2000,LINE GO TO 5 901 CONTINUE D TYPE *,'ACNTS DO NOT MATCH' D TYPE 2000,LINE GO TO 5 902 CONTINUE ! WRITE(5,9020)ACNT ! 9020 FORMAT(' ACCREP -- Account ',I3, ! - ' not found in LB:[1,2]ACCOUNTS.DAT') ! CALL EXIT 904 WRITE(5,9040) ! 9040 FORMAT(' ACCREP -- LB:[1,2]ACCOUNTS.DAT can not be opened') CALL EXIT ! 906 WRITE(5,9060) 9060 FORMAT(' ACCREP -- SY:SYSTEMUSE.LST can not be opened for output') CALL EXIT C C FORMAT STATEMENTS C 1000 FORMAT(1H1,'PDP-11/45 USAGE REPORT',T60,A1,/,1X,19A1) 1001 FORMAT(I3,1X,I3,1X,I3,1X,25A1) C1001 FORMAT(I3,I3,I3,25A1) 1002 FORMAT(1X,'ACCOUNT:',T15,I2,/,1X,'NAME:',T15,25A1,/ 1,1X,'UIC:',T15,'[',I3,',',I3,']',/) 1003 FORMAT(1X,'ITEM',T30,'RATE PER UNIT',T60,'UNITS' 1,T75,'CHARGES',/,T32,'IN DOLLARS',T58,'CONSUMED' 2,T74,'FOR ITEM',/,1X,82('_'),/,1X,'TERMINAL 3 CONNECT TIME',T30,F4.2,1X,'PER HOUR',T58,F8.2,T73,F9.2) 1004 FORMAT(1X,'LOGON',T30,F4.2,1X,'PER LOGON',T60,I3,T75,F7.2) 1005 FORMAT(1X,'CPU TIME',T30,F4.2,1X,'PER MINUTE',T58 1,F8.2,T73,F9.2) 1006 FORMAT(1X,'I/O',T30,F4.2,1X,'PER KILO I/O''S',T58 1,F8.2,T73,F9.2) 1007 FORMAT(1X,'ON LINE STORAGE',T28,F6.4,1X,'PER BLOCK',T60 1,I5,T75,F7.2) 1008 FORMAT(T73,'----------',/,T74,F8.2,/,1X,110('='),/,1X,'STATISTICS'// 1,T52,'HR MIN SEC',/) 1009 FORMAT(1X,'LOGGED ON TERMINAL TIME:',T50,I4,1X,I3,1X,I3 1,3X,'NUMBER OF DAYS LOGGED ON AT LEAST ONCE:',I3) 1010 FORMAT(1X,'AVERAGE TIME LOGGED ON PER DAY:',T50,I4,1X,I3,1X,I3) 1011 FORMAT(/,1X,'TIME LOGGED ON BEFORE 0800:',T50 1,I4,1X,I3,1X,I3) 1012 FORMAT(1X,'TIME LOGGED ON AFTER 0800 AND BEFORE NOON:',T50 1,I4,1X,I3,1X,I3) 1013 FORMAT(1X,'TIME LOGGED ON AFTER NOON AND BEFORE 1630:',T50 1,I4,1X,I3,1X,I3) 1014 FORMAT(1X,'TIME LOGGED ON AFTER 1630 AND BEFORE MIDNIGHT:',T50 1,I4,1X,I3,1X,I3) 1015 FORMAT(/,1X,'WEEKEND TERMINAL USAGE:'T50,I4,1X,I3,1X,I3) 1016 FORMAT(//,1X,'NUMBER OF RUN COMMANDS:',T40,I6) 1017 FORMAT(1X,'NUMBER OF INSTALL COMMANDS:',T40,I6) 1018 FORMAT(1X,'NUMBER OF INDIRECT COMMAND FILES:',T40,I6) 1019 FORMAT(1X,'NUMBER OF ALLOCATED BLOCKS:',T40,I6) 1020 FORMAT(1X,'AVERAGE FILSIZ:',T40,I6) 1021 FORMAT(1X,'PRIME TIME USED:',T50,I4,1X,I3,1X,I3) 1022 FORMAT(/,1X,'PERCENT OF LOGON TIME DURING PRIME HOURS:' 1,T50,F6.2) 1023 FORMAT(1X,'PERCENT OF TOTAL SYSTEM I/O:',T49,F8.3) 1024 FORMAT(1X,'PERCENT OF TOTAL CPU USAGE:',T49,F8.3) 1025 FORMAT(1X,'PERCENT OF TOTAL SYSTEM TERMINAL TIME:',T50,F6.2) 1026 FORMAT(/,1X,'TOTAL SYSTEM TERMINAL TIME:',T49 1,I4,1X,I3,1X,I3) 1027 FORMAT(1X,'AVERAGE TERMINAL TIME PER LOGON:',T50 1,I3,1X,I3,1X,I3) 1028 FORMAT(1X,'AVERAGE TERMINAL LOGON TIME PER DAY:',T50 1,I3,1X,I3,1X,I3) 1029 FORMAT(//) 1030 FORMAT(1X,'ACCREP -- WARNING!! Account ',I3,' has had ',I3, 1 ' ILLEGAL login attempts!') 1033 FORMAT(1X,'TIME LOGGED ON TERMINAL ',I2,1X,T50 1,I4,1X,I3,1X,I3,' NUMBER OF LOGONS:',3X,I4) 1034 FORMAT(/,1X,'TOTAL CPU UTILIZATION:',F6.2,' %') 1035 FORMAT(1X,'TOTAL TERMINAL TIME UTILIZATION:',F6.2,' %') 1036 FORMAT(1X,'PERCENT OF TOTAL SYSTEM I/O:',T50,'< .01') 1037 FORMAT(1X,'PRIME TIME TERMINAL UTILAZATION:',F6.2,' %') 1038 FORMAT(1X,'NUMBER OF FILE USAGE UPDATES:',T40,I6) 1040 FORMAT(I2,'/',I2,'/',I2) 2000 FORMAT(1X,13(I5,3X)) END C C SUBROUTINES FOLLOW C SUBROUTINE OPN(FILE,NC) C C Open a KMS Fusion Accounting file for Shared, Readonly Access C File is opened on UNIT=1 C BYTE FILE(31) ! For filename WRITE(5,20) ! Prompt for name 20 FORMAT(' File: ',$) ! READ(5,30,END=9940)NC,(FILE(I),I=1,NC) ! Read input 30 FORMAT(Q,30A1) ! IF(NC.EQ.0) GOTO 60 ! Use Default filename FILE(NC+1)=0 ! Terminate with null OPEN(UNIT=1,NAME=FILE, ! - TYPE='OLD', ! - READONLY, ! - FORM='UNFORMATTED', ! - SHARED, ! - ERR=9900) ! GOTO 100 ! Success 60 OPEN(UNIT=1,NAME='LB:[1,4]SYSLOG.DAT', ! Open default file - TYPE='OLD', ! - READONLY, ! - SHARED, ! - FORM='UNFORMATTED', ! - ERR=9920) ! NC=1 ! Return status FILE(1)=' ' ! info for mainline 100 RETURN ! all done 9900 WRITE(5,9910)(FILE(I),I=1,NC) ! Can't open file 9910 FORMAT(' ACCREP -- Error opening file: ',30A1) ! GOTO 9999 ! 9920 WRITE(5,9930) ! 9930 FORMAT(' ACCREP -- Error opening LB:[1,4]SYSLOG.DAT') GOTO 9999 ! 9940 WRITE(5,9950) ! 9950 FORMAT(' ACCREP -- EXIT') ! 9999 CALL EXIT ! END SUBROUTINE CREDAT(LUNDAT) C C CREATE THE ACCOUNTS.DAT TEMPORARY FILE C DIMENSION IBUF(256) LOGICAL*1 LBUF(512) LOGICAL*1 LGROUP(3),LMEMBR(3),LACNT(3),LNAME(14) EQUIVALENCE (IBUF(1),LBUF(1)) LUN=2 ! ACCOUNT FILE LUN OPEN(UNIT=LUN,NAME='LB:[0,0]RSX11.SYS', ! Open account file - READONLY, ! - SHARED, ! - TYPE='OLD', ! Open existing file - CARRIAGECONTROL='NONE', - RECORDSIZE=512, - RECORDTYPE='FIXED', - BUFFERCOUNT=-1, ! Open for block I/O - ERR=9900) OPEN(UNIT=LUNDAT,NAME='ACCOUNTS.DAT;1', ! Open ACCOUNTS.DAT - TYPE='SCRATCH', ! for use by the - FORM='FORMATTED', ! ACCREP mainline - ACCESS='SEQUENTIAL', ! - CARRIAGECONTROL='LIST', ! - ERR=9920) ! IBLOCK=1 ! START WITH 1ST BLOCK 100 CONTINUE ! Read file block CALL REDACN(LUN,IBLOCK,IBUF,IER) ! DO 200, J=0,384,128 ! Each blk has 4 acnts DO 120 K=1,3 ! Get LGROUP(K)=LBUF(J+K) ! Group code LMEMBR(K)=LBUF(J+K+3) ! Member code 120 IF(LGROUP(1).EQ.0) GOTO 300! Exit if blank rec DO 130, K=1,14 ! Now set in last name LNAME(K)=LBUF(J+K+12) ! of user from file IF(LNAME(K).EQ.0) GOTO 135! Stop filling on null 130 CONTINUE ! K=J/2 ! Word offset in file 135 IACNT=IBUF(K+37) ! Get acnt # ENCODE(3,140,LACNT)IACNT ! Make it a string 140 FORMAT(I3) ! DO 150,K=1,3 ! Cnvert blanks to '0' 150 IF(LACNT(K).EQ.' ') LACNT(K)='0' ! to make pretty WRITE(LUNDAT,160)LACNT,LGROUP,LMEMBR,LNAME ! 160 FORMAT(3A1,',',3A1,',',3A1,',',14A1) ! 200 CONTINUE IBLOCK=IBLOCK+1 ! Look at next block IF(IER.EQ.1) GOTO 100! Re-read till EOF 300 CLOSE(UNIT=LUN) ! Close account file REWIND (LUNDAT) ! Point to file start RETURN ! Back to mainline 9900 WRITE(5,9910) 9910 FORMAT(' ACCREP -- Error opening LB:[0,0]RSX11.SYS') GOTO 9999 9920 WRITE(5,9930) 9930 FORMAT(' ACCREP -- Error opening SY:ACCOUNTS.DAT') 9999 CALL EXIT END SUBROUTINE REDACN(LUN,IBLOCK,IBUF,IER) C+ C This subroutine will read 1 block of [0,0]RSX11.SYS C The calling task must be privileged (/PR:0) to use this C routine. RSX11.SYS must already be open on LUN. IBUF C must be 512 bytes in size. IER is the returned value C of IOSB(1) and equals 1 if the read successful. C The proper way of opening [0,0]RSX11.SYS from F4P is C C OPEN(UNIT=LUN,NAME='[0,0]RSX11.SYS;1', ! Open account file C - READONLY, ! Must be readonly C - TYPE='OLD', ! Open existing file C - CARRIAGECONTROL='NONE', ! No carriage control C - RECORDSIZE=512, ! Sequential fixed C - RECORDTYPE='FIXED', ! length(512) file C - BUFFERCOUNT=-1) ! Open for block I/O C C- DIMENSION IPARAM(6),IOSB(2) INTEGER*2 IBUF(256) IER=1 ! Assume no error IREAD="10400 ! Read virtual block IEFN1=1 ! Event flag for read CALL GETADR(IPARAM(1),IBUF(1)) IPARAM(2)=512 ! Byte count IPARAM(3)=0 ! Set 0 for disk QIO IPARAM(4)=0 ! Hi Block =0 for virt ! read of disk. IPARAM(5)=IBLOCK ! Set starting block CALL WTQIO(IREAD,LUN,IEFN1,,IOSB,IPARAM,IDSW) ! Read it 1 block ! at a time IER=IOSB(1) ! Show I/O status 300 RETURN ! Back to mainline END SUBROUTINE NEXLIN(LINE,EOF) LOGICAL*1 EOF INTEGER LINE(13) EOF=.FALSE. READ(1,END=101)(LINE(I),I=1,13) D TYPE 110,LINE 110 FORMAT(1X,13(I5,1X)) RETURN 101 EOF=.TRUE. RETURN END SUBROUTINE INVTIM(I,H,M,S) INTEGER*4 I INTEGER H,M,S H=I/3600. A=((I/3600.)-H)*60. M=A A=(A-M)*60. S=A RETURN END C C FUNCTIONS FOLLOW C INTEGER*2 FUNCTION DAYFYR(Y,M,D) INTEGER A(12),Y,M,D DATA A/31,28,31,30,31,30,31,31,30,31,30,31/ IF(4.*INT(Y/4.).EQ.Y)A(2)=29 D IF(M.GT.12)TYPE *,'MONTH=',M D IF(D.GT.31)TYPE *,'DAY=',D D IF(Y.NE.80)TYPE *,'YEAR=',Y DAYFYR=0 IF(M.EQ.1)GO TO 20 DO 10,I=1,M-1 10 DAYFYR=DAYFYR+A(I) 20 DAYFYR=DAYFYR+D RETURN END LOGICAL*1 FUNCTION WEKND(DAYFYR,IYEAR) INTEGER DANMN(12),YEAR,MON,DAY,DAOFWK,DAYFYR DATA DANMN/31,29,31,30,31,30,31,31,30,31,30,31/ C YEAR=80 YEAR=IYEAR WEKND=.FALSE. DAY=DAYFYR MON=1 10 CONTINUE IF(DAY.LT.DANMN(MON))GO TO 20 DAY=DAY-DANMN(MON) MON=MON+1 GO TO 10 20 K=DAOFWK(MON,DAY,YEAR) IF(K.EQ.1.OR.K.EQ.7)WEKND=.TRUE. RETURN END SUBROUTINE GETLMT(IFIRST,ILAST) INTEGER BEGDAY,BEGMON,ENDDAY,ENDMON INTEGER*2 DAYFYR LOGICAL*1 LANS ! FOR Y/N ANSWER IFIRST=1 ! ASSUME WHOLE YEAR ILAST=365 ! CALL IDATE(IMON,IDAY,IYEAR) ! GET TODAY'S DATE WRITE(5,10) ! 10 FORMAT(' Limit the report to a date interval (Y/N): ',$) READ(5,20,END=999)LANS 20 FORMAT(1A1) ! IF(LANS.NE.'Y') GOTO 100! JUST RETURN WRITE(5,25) ! 25 FORMAT(' Date should be entered as TWO integers, M,D', - /,' with M = 1-12, D = 1-31') ! 27 WRITE(5,30) ! 30 FORMAT(' Enter Starting Month, Starting Day (M,D): ',$) READ(5,40,END=999,ERR=27)BEGMON,BEGDAY ! 40 FORMAT(2I2) ! IF(BEGMON.LT.1 .OR. ! CHECK VALIDITY - BEGMON.GT.12 .OR. ! - BEGDAY.LT.1 .OR. ! - BEGDAY.GT.31) GOTO 27 ! REPROMPT 45 WRITE(5,50) 50 FORMAT(' Enter Ending Month, Ending Day (M,D): ',$) READ(5,40,END=999,ERR=45)ENDMON,ENDDAY ! IF(ENDMON.LT.1 .OR. !CHECK VALIDITY - ENDMON.GT.12 .OR. ! - BEGDAY.LT.1 .OR. ! - BEGDAY.GT.31) GOTO 45 ! REPROMPT IFIRST=DAYFYR(IYEAR,BEGMON,BEGDAY) ! CALC DAY OF YEAR ILAST =DAYFYR(IYEAR,ENDMON,ENDDAY) ! FOR 1ST AND LAST IF(ILAST.LT.IFIRST) GOTO 27 ! IF NOT>, REPROMPT 100 RETURN 999 CALL EXIT ! TRAP ^Z END