.TITLE AUTOLOG .IDENT /VERSION 2.0/ ; ; This program is designed to automaticly LOGOUT users of terminals ; which appear inactive after IDLE_TIME minutes. Inactivity appears as ; a result of no change in CPU time, buffered I/O, and direct I/O counts. ; Any or all of these totals will change for an active job, if they ; don't then they get logged out. ; ; This program keeps a log of usernames that it times out in ; SYS$MANAGER:AUTOLOG.LOG . ; ; This program should be run as a detached process. Do this by using: ; ; $ RUN/UIC=[1,4]/ERROR=SYS$MANAGER:[SYSMGR]AUTOLOG.ERR- ; /PRIVILEDGES=(OPER,WORLD)- ; /PROCESS_NAME=AUTOLOG SYS$SYSTEM:AUTOLOG ; ; This runs the job - Under account [1,4] - SYSTEM MANAGER. ; - with error logging put into file SYS$MANAGER:AUTOLOG.ERR. ; - with priviledges of OPER and WORLD. ; - with a process name of AUTOLOG. ; - and it runs the file SYS$SYSTEM:AUTOLOG.EXE. ; ; Written by: Steve Moores - JAN., 1982. VERSION 1.0 ; Aurora Software Developement Unit (ASDU) ; C.F.B. Greenwood, Greenwood, Nova Scotia, Canada, ; B0P 1N0. 902-765-3391 EXT. 823 . ; ; VERSION 1.1 Modified by Steve Moores ASDU - JUNE 1982. ; Allow operator to stay logged in only if MCF is running. ; modified 26 Aug 82 - removed DIACP,DIACS as MCF jobs. ; ; VERSION 1.2 Modified by Steve Moores ASDU - FEB 1983. ; Fix to allow the VMS V3.0 Spawn command and WORD-11 to ; work properly. This fix allows idle processes, which ; have subprocesses, to live. Kill the idle subprocesses ; first, then issue the idle warning message,and finally ; kill the main process. This takes IDLE_TIME minutes again, ; due to the deletion of the spawned subprocess causing the ; parent process to do an i/o to the terminal. Silly messages. ; ; VERSION 1.3 Modified by steve moores ASDU - FEB 1983. ; For some strange reason, spawned subprocesses, with ; terminals attached, seem to gain CPU time even if they are ; idle. The algorithm was modified to consider a change in ; .03 sec (30 msec) as an idle terminal. If the user wasn't ; idle, either the system is slow or he was not doing very much. ; ; VERSION 1.4 Modified by Steve Moores ASDU - APR 1983. ; We have moved terminal TTA1: and no longer have a need for ; it to be a special terminal with special users. ; ; Version 1.5. James G. Downward, KMS Fusion 26-Sept-1983 ; Modify for KMS and general use. ; 1) Remove funny process names and terminals. Make ; AUTOLOG so it is directly applicable to most systems. ; 2) Allow timeout and scan interval to be easily set in the ; code. For debugging run with short timeout count. ; 3) Timeout of 1 minute is too short for real life. Extend it. ; 4) Before IDLE_TIME occurs, have a Warning time at about the ; half way point (15 min if Idle_time is 30 min). Start ; issuing nasty reminder warning messages. Three of these ; can be set prior to issuing the final ultimatum. ; 5) Set timeout for 30 min with warnings starting every 5 ; minutes when the terminal is idle for 15 min. ; 6) Support terminals on DMF-32 lines. ; 7) I'm paranoid. Do not axe OPA0:. What if VMSUPDATE is ; underway and I do not get TU58 in before timeout?? ; Or what if operator's coffee break drags on a wee ; tad too long? Better safe than sorry. However, ; this is a nasty security hole. ; 8) Our system seems to accumulate CPU time on IDLE terminals ; at times faster than .03 sec/min. Changed the offset to ; .05 seconds and allowed that much work CPU time to occur ; each and every minute and still have the terminal declared ; idle. This means users realy must do something serious. ; ; Version 1.6 James G. Downward, KMS Fusion 10-Feb-1984 ; Changed timeout to 27 min of idle time to correspond to be ; less than the INMAC port manager timeout of 28 minutes. ; ; Version 1.7 James G. Downward, KMS Fusion 10-Apr-1984 ; When a subproces is caught being idle, issue subprocess ; appropriate messages so the poor user in the main process ; does not go crazey thinking his active session is about ; to get the axe. ; ; Version 1.8 Changed CPU time offset to .1 seconds every minute. Some users ; with big working sets seem to accumulate a lot of system time ; even when idle. ; ; Version 1.9 Changed text of 20 min warning message to reflect logout in 7 min. ; ; Version 2.0 James G. Downward, KMS Fusion 13-Feb-1985 ; Updated for V4.0 to work with virtual terminals on modem lines. ; Updated for remote terminals. ; ; ; *********************** ; DEBUG = 1 ; If defined, only log off if specified user name V1.5 ; ; and use short timeout count V1.5 ; *********************** ; .SUBTITLE DATA DEFINITION AREA .PSECT DATA NOEXE,LONG ; ; DEFINE ASCII TEXT CONSTANTS. ; EVENT_FLAG: .ASCID /EFLAG/ ; DEFINE EVENT FLAG NAME TT: .ASCII /TT/ ; Normal terminal name TX: .ASCII /TX/ ; Terminal name if a DMF-32 VT: .ASCII /VT/ ; Terminal name if virt term RT: .ASCII /RT/ ; Terminal name if remote term ; ; IF SPECIAL JOBS (MCF - CMS2P,CMS2S) ARE RUNNING THEN ; DO NOT TIME OUT TTA0:/OPA0: AND USER OPERATOR. ; AT ALL OTHER TIMES GET RID OF THOSE LAZY BUM'S. ; ; THESE SPECIAL JOBS ARE THE DETACHED SERVICE PROGRAMS CREATED ; WHEN MCF IS RUNNING. (CMS2S,CMS2P). ; CMS2P: .ASCII /CMS2P/ CMS2S: .ASCII /CMS2S/ ; MCF_RUNNING: .BYTE 0 ; MCF RUNNING FLAG ; 0=NOT RUNNING ; 1=RUNNING ; 2=RUNNING LAST TIME THROUGH LOOP ; 3=RUNNING LAST TIME AMD THIS TIME ; ; Define operator terminals and special usernames, ; just in case we don't want to kill him/her. ; OPA0: .ASCII /OPA0:/ ; OPERATOR CONSOLE TTA0: .ASCII /TTA0:/ ; OPERATOR'S TERMINAL TTA0_SIZE=.-TTA0 ; TTA0 STRING LENGTH OPERATOR: .ASCII /OPERATOR/ ; OPERATOR'S USERNAME OPER_SIZE=.-OPERATOR ; OPERATOR STRING LENGTH MANAGER: .ASCII /DOWNWARD/ ; System manager MANAGER_SIZE=.-MANAGER ; SYSTEM: .ASCII /SYSTEM/ ; SYSMGR SYSTEM_SIZE=.-SYSTEM TESTER: .ASCII /DOWNWARD/ ; The user name testing program TESTER_SIZE=.-TESTER ; ; ; ; DEFINE FIELD OFFSETS FOR PROCESS STORAGE AREA. ; S_PID=0 ; STORED PROCESS ID LOCATION S_CPU=4 ; STORED CPU TIME LOCATION S_BUFF=8 ; STORED BUFFERED I/O LOCATION S_DIRECT=12 ; STORED DIRECT I/O LOCATION S_TERM=16 ; STORED TERMINAL LOCATION S_STATUS=23 ; STATUS OF THIS PROCESS STORAGE LOCATION ; 0=EMPTY ; BIT0=1=FULL AND NOT CHECKED FOR THIS RUN ; BIT1=1=FULL AND CHECKED, STILL LOGGED IN AND STILL ACTIVE ; BIT2=1=FULL, CHECKED, ACTIVE AND WARNING MESSAGE SENT, ; TIME GOING TO EXPIRE - DELETE PROCESS NEXT TIME. S_MINUTES=24 ; NUMBER OF MINUTES OF INACTIVITY S_NEXT_PROCESS=28 ; NEXT PROCESS OFFSET STORAGE_SIZE=82 ; MAX. NUMBER OF PROCESSES ON SYSTEM ; ; PROCESS STORAGE AREA ; PROCESS_STORAGE: .BLKB S_NEXT_PROCESS*STORAGE_SIZE ; PROCESS STORAGE AREA ; S_NEXT_PROCESS=NUMBER OF BYTES IN 1 PROCESS ; STORAGE_SIZE=NUMBER OF POSSIBLE PROCESSES ; ; DEFINE PROGRAM NECESSARY TIMES AND TIMERS. ; .IF DF DEBUG IDLE_WARN_TIME1=1 ; First warning time IDLE_WARN_TIME2=2 ; Second warning time IDLE_WARN_TIME3=3 ; third warning time IDLE_TIME=4 ; NUMBER OF MINUTES IN IDLE MODE - KILL PROCESS .IF_FALSE ; if not debug but for real IDLE_WARN_TIME1=15 ; First warning time in minutes IDLE_WARN_TIME2=20 ; Second warning time IDLE_WARN_TIME3=25 ; Third warning time ;IDLE_TIME=29 ; Number of min in idle mode - kill proc V1.5 IDLE_TIME=26 ; Number of min in idle mode - kill proc V1.6 .ENDC ; .END DEBUG Scan_Interval=1 ; Check every minute ; WAKETIME: .BLKQ 1 ; DELTA TIME CONVERTED BY $BINTIM SYS SERV. ; ASCITIME: .ASCID /0 00:01:00.00/ ; WAIT FOR 1 MINUTE BETWEEN WAKE UPS. ; ; ; BIT0=1 ; DEFINE BIT MASKS BIT1=2 BIT2=4 BIT3=8 BIT4=16 BIT5=32 BIT6=64 BIT7=128 ; ; Define messages to be displayed to the idle users. Try and be friendly ; but persistant. Eventually give way to serious threats. ; ; Warning message. ; BELL=07 Warn1: .ASCII /AUTOLOG -- Your terminal has been idle for 15 minutes./<13><10> .ASCII / Please LOGOFF if you don't need to use the VAX./ Warn1_Mes: .LONG .-Warn1 .ADDRESS Warn1 Warn2: .ASCII /AUTOLOG -- Warning. Your terminal has been idle for 20 minutes./<13><10> .ASCII / You will be logged out in 7 minutes unless you use your terminal./; V1.9 Warn2_Mes: .LONG .-Warn2 .ADDRESS Warn2 Warn3: .ASCII /AUTOLOG -- Is any one there? You have not touched your terminal for 25 minutes./<13><10> .ASCII / You will be logged out in 2 minutes unless you use your terminal./ Warn3_Mes: .LONG .-Warn3 .ADDRESS Warn3 WARNMESS: .ASCII <13><10> .ASCII /AUTOLOG -- Final Warning. Your idle terminal will be logged out in 1 minute./ MESSAGE: .LONG .-WARNMESS ; SIMULATE ASCID DIRECTIVE FOR WARNMESS .ADDRESS WARNMESS ; ; TERMINATING MESSAGE. ; THIS MESSAGE MAY BE CHANGED PROVIDED THE FIRST 12 BYTES ARE RESERVED FOR ; USERNAME AND THE LAST 23 BYTES ARE RESERVED FOR DATE AND TIME OF TIME OUT. ; FINAL_MESSAGE: .ASCID /XXUSERNAMEXX timed out at XXXXXXXDATE TIMEXXXXXXX/ END_MESSAGE=.-FINAL_MESSAGE ; LENGTH OF FINAL_MESSAGE BUFFER. LOG_MESSAGE: .ASCII / from TTAN:XX/ LOG_MESS_SIZE=.-FINAL_MESSAGE-8 ; -8 FOR ASCID DIRECTIVE OVERHEAD. LOG_MESS: .LONG LOG_MESS_SIZE ; SIMULATE ASCID FOR .ADDRESS FINAL_MESSAGE+8 ; LOG_MESSAGE ; ; DEFINE BUFFER AREA FOR ASCTIM TO POINT TO, SO IT CAN PUT THE TIME INTO ; FINAL_MESSAGE. TIME_BUFFER ACTS AS AN .ASCID DIRECTIVE ON THE DATE TIME ; PORTION OF FINAL_MESSAGE BUFFER. ; TIME_BUFFER: .LONG 23 ; NUMBER OF CHARACTERS IN DATE TIME BUFFER AREA .ADDRESS FINAL_MESSAGE+END_MESSAGE-23 ; ADDRESS OF BUFFER ; ; Here we have a raft of nearly identical messages to the above. The V1.7 ; difference is that these are to be broadcast if, we catch an idle V1.7 ; subprocess rather than an idle main process. V1.7 ; ; W_Warn1:.ASCII /AUTOLOG -- Your subprocess (window) has been idle for 15 minutes./<13><10>; V1.7 .ASCII / Please delete it if is not needed./; V1.7 W_Warn1_Mes: .LONG .-W_Warn1 ; V1.7 .ADDRESS W_Warn1 ; V1.7 W_Warn2:.ASCII /AUTOLOG -- Warning. Your subprocess (window) has been idle for 20 minutes./<13><10>; V1.7 .ASCII / It will be deleted in 7 minutes unless you use it./; V1.9 W_Warn2_Mes: .LONG .-W_Warn2 ; V1.7 .ADDRESS W_Warn2 ; V1.7 W_Warn3:.ASCII /AUTOLOG -- Warning. Your subprocess (window) has been idle for 25 minutes./<13><10>; V1.7 .ASCII / It will be deleted in 2 minutes unless you use it./; V1.7 W_Warn3_Mes: .LONG .-W_Warn3 ; V1.7 .ADDRESS W_Warn3 ; V1.7 W_WARNMESS: .ASCII <13><10>; V1.7 .ASCII /AUTOLOG -- Final Warning. Your subprocess (window) will be deleted in 1 minute./; V1.7 W_MESSAGE: .LONG .-W_WARNMESS ; Simulate ASCID directive V1.7 .ADDRESS W_WARNMESS ; V1.7 W_FINAL_MESSAGE:.ASCID <13><10>/AUTOLOG -- Idle subprocess (window) deleted/; V.17 END_MESSAGE=.-W_FINAL_MESSAGE ; Length of buffer. V1.7 ; DEFINE OTHER SYSTEM SERVICE MACRO DEFINITIONS. ; $SSDEF ; SYSTEM SERVICES STATUS CODES $DELPRCDEF ; DELETE PROCESS DIFINITIONS. $BRDCSTDEF ; BROADCAST DEFINITIONS. ; .SUBTITLE OUTPUT-FILE DEFINITIONS ; ; FILE DESCRIPTION ; .ALIGN LONG .IF DF DEBUG LOGFAB: $FAB FNM=,- ; OUTPUT FILE SPEC. MRS=LOG_MESS_SIZE,- ; MAX RECORD LENGTH RFM=FIX,- ; FIXED RECORD LENGTH RAT=CR ; INSERT CR/LF ON LINE .IF_FALSE LOGFAB: $FAB FNM=,- ; OUTPUT FILE SPEC. MRS=LOG_MESS_SIZE,- ; MAX RECORD LENGTH RFM=FIX,- ; FIXED RECORD LENGTH RAT=CR ; INSERT CR/LF ON LINE .ENDC ; ; RECORD DESCRIPTION ; .ALIGN LONG LOGRAB: $RAB FAB=LOGFAB,- ; RECORD DESCRIPTOR RBF=FINAL_MESSAGE+8,- ; OUTPUT BUFFER ADDRESS RSZ=LOG_MESS_SIZE ; BUFFER SIZE ; .SUBTITLE JPI DATA DEFINITION AREA .PSECT JPI_AREA NOEXE ; THIS AREA IS THE DATA DEFINITION FOR THE $GETJPI MACRO CALL. ; ; GET JPI ITEM LIST ; $GETJPIDEF ; DEFINE $GETJPI PROCESS DIFINITIONS. $JPIDEF ; DEFINE JPI$ ITEM CODES. ; GET USER NAME GETLIST: .WORD 12 ; USERNAME BUFFER LENGTH .WORD JPI$_USERNAME ; USERNAME CODE .ADDRESS USERNAME ; USERNAME ADDRESS .ADDRESS USERNAME_SIZE ; USERNAME SIZE ; GET PROCESS ID .WORD 4 ; PROCESS ID BUFFER LENGTH .WORD JPI$_PID ; PID CODE .ADDRESS PROCESS_ID ; PID ADDRESS .ADDRESS PROCESS_ID_SIZE ; PID LENGTH ; GET TERMINAL NAME .WORD 7 ; TERMINAL BUFFER LENGTH .WORD JPI$_TERMINAL ; TERMINAL CODE .ADDRESS TERMINAL ; TERMINAL ADDRESS .ADDRESS TERMINAL_SIZE ; TERMINAL NAME LENGTH ; GET PROCESS NAME .WORD 15 ; PROCESS BUFFER LENGTH .WORD JPI$_PRCNAM ; PROCESS CODE .ADDRESS PROCESS ; PROCESS ADDRESS .ADDRESS PROCESS_SIZE ; PROCESS LENGTH ; GET CPU TIME - ACCUMULATED .WORD 4 ; CPU TIME BUFFER LENGTH .WORD JPI$_CPUTIM ; CPU TIME CODE .ADDRESS CPU_TIME ; CPU TIME ADDRESS .ADDRESS CPU_TIME_SIZE ; CPU TIME SIZE ; GET BUFFERED I/O OPERATIONS ACCUMULATED .WORD 4 ; BUF I/O BUFFER LENGTH .WORD JPI$_BUFIO ; BUF I/O CODE .ADDRESS BUFFERED_IO ; BUF I/O ADDRESS .ADDRESS BUFFERED_IO_SIZE ; BUF I/O SIZE ; GET DIRECT I/O OPERATIONS ACCUMULATED .WORD 4 ; DIRECT I/O BUFFER LENGTH .WORD JPI$_DIRIO ; DIRECT I/O CODE .ADDRESS DIRECT_IO ; DIRECT I/O ADDRESS .ADDRESS DIRECT_IO_SIZE ; DIRECT I/O SIZE ; GET NUMBER OF SUBPROCESSES RUNNING FROM THIS PROCESS V1.2 .WORD 4 ; SUBPROCESS COUNT BUFFER LENGTH V1.2 .WORD JPI$_PRCCNT ; PROCESS COUNT CODE V1.2 .ADDRESS SUBPROCESS_COUNT ; PROCESS COUNT ADDRESS V1.2 .ADDRESS SUBPROCESS_SIZE ; PROCESS COUNT SIZE V1.2 ; GET PROCESS IDENTIFICATION (PID) OF PROCESS OWNER .WORD 4 ; OWNER PID BUFFER LENGTH V1.2 .WORD JPI$_OWNER ; OWNER PID CODE V1.2 .ADDRESS PROCESS_OWNER ; OWNER PID ADDRESS V1.2 .ADDRESS PROCESS_OWNER_SIZE ; OWNER PID SIZE V1.2 ; AND END GETJPI WITH A NULL BUFFER LENGTH .LONG 0 ; NULL - END OF GETJPI ; ; ; GETJPI ITEM LIST INFORMATION AREA. ; PID: .LONG -1 ; WILDCARD PID - GET ALL PID'S IOSB: .BLKQ 1 ; COMPLETION STATUS CODE ; ; USERNAME GETJPI DATA USERNAME: .BLKB 12 ; USERNAME BUFFER USERNAME_SIZE: .BLKL 1 ; BUFFER SIZE USERNAME_ADD: .ADDRESS USERNAME ; USERNAME ADDRESS ; ; PROCESS_ID GETJPI DATA PROCESS_ID: .BLKL 1 ; BUFFER PROCESS_ID_SIZE:.BLKL 1 ; SIZE ; ; TERMINAL NAME - IF THERE IS ONE UNDERSCORE: .ASCII /_/ ; DEFINE UNDERSCORE FOR TERMINAL NAME TERMINAL: .BLKB 7 ; BUFFER TERMINAL_SIZE: .BLKL 1 ; SIZE TERMINAL_ADD: .ADDRESS TERMINAL-1 ; ADDRESS INCLUDING UNDERSCORE. ; ; PROCESS NAME PROCESS: .BLKB 15 ; BUFFER PROCESS_SIZE: .BLKL 1 ; SIZE PROCESS_ADD: .ADDRESS PROCESS ; ADDRESS ; ; CPU TIME ACCUMULATED CPU_TIME: .BLKL 1 ; BUFFER CPU_TIME_SIZE: .BLKL 1 ; SIZE ; ; BUFFERED I/O OPERATIONS PERFORMED - ACCUMULATED BUFFERED_IO: .BLKL 1 ; BUFFER BUFFERED_IO_SIZE:.BLKL 1 ; SIZE ; ; DIRECT I/O OPERATIONS PERFORMED - ACCUMULATED DIRECT_IO: .BLKL 1 ; BUFFER DIRECT_IO_SIZE: .BLKL 1 ; SIZE ; ; NUMBER OF SUBPROCESSES THIS PROCESS HAS - (STATIC VALUE) V1.2 SUBPROCESS_COUNT: .BLKL 1 ; BUFFER V1.2 SUBPROCESS_SIZE: .BLKL 1 ; SIZE V1.2 ; ; PROCESS IDENTIFICATION (PID) OF PROCESS OWNER V1.2 PROCESS_OWNER: .BLKL 1 ; BUFFER V1.2 PROCESS_OWNER_SIZE: .BLKL 1 ; SIZE V1.2 ; ; By putting the address of the ASCII strings in the long word after the size ; long word, one simulates the .ASCID directive upon completion of the GETJPI. ; This .ASCID format can be used in later system services calls with absolutely ; no work on our part, by passing NAME=NAME_SIZE. This lets the ; assembler/linker do all the unnecessary work for us, except for TERMINAL_NAME ; which has to have 1 added to the size descriptor in order to include the ; underscore in the terminal name (this prevents name translation). ; ; Thats all folks. we don't need any more info from GETJPI. ; ; .SUBTITLE GETJPI DATA TO FIND SUBPROCESS OWNER V1.2 ; ; THIS AREA IS THE DATA DEFINITION FOR $GETJPI FOR SUBPROCESS' OWNER V1.2 ; ; GETJPI ITEM LIST V1.2 ; ; GET TERMINAL NAME - STORE IN NORMAL PROCESS AREA V1.2 OWNER_GETLIST: .WORD 7 ; TERMINAL BUFFER LENGTH V1.2 .WORD JPI$_TERMINAL ; TERMINAL CODE V1.2 .ADDRESS TERMINAL ; TERMINAL ADDRESS V1.2 .ADDRESS TERMINAL_SIZE ; TERMINAL NAME LENGTH V1.2 ; GET PROCESS IDENTIFICATION (PID) OF THE PROCESS OWNER - SO WE CAN V1.2 ; EVENTUALLY GET TO THE ROOT OF MATTERS. V1.2 .WORD 4 ; OWNER PID BUFFER LENGTH V1.2 .WORD JPI$_OWNER ; OWNER PID CODE V1.2 .ADDRESS PROCESS_OWNER ; OWNER PID CODE V1.2 .ADDRESS PROCESS_OWNER_SIZE ; OWNER PID SIZE V1.2 ; END OF THE OWNER GETJPI CODE V1.2 .LONG 0 ; NULL - END OF GETJPI V1.2 ; Save_Owner: .LONG 0 ; Save Process Owner PID V1.7 ; .SUBTITLE MAIN CODE FOR AUTOLOG .PSECT CODE ; ; THIS AREA OF THE CODE NEEDS ONLY TO BE DONE THE 1ST TIME. ; .ENTRY AUTOLOG_START,^M<> ; ; CREATE EVENT FLAG - ASSOCIATE EVENT-FLAG TO CLUSTER #0. $ASCEFC_S EFN=#0,NAME=EVENT_FLAG ; ; CONVERT SPECIFIED TIME TO DELTA TIME FORMAT. $BINTIM_S TIMBUF=ASCITIME,TIMADR=WAKETIME ; ; CREATE SCHEDULE WAKE UP OF THIS PROCESS - AT WAKETIME (ASCITIME) INTERVALS. $SCHDWK_S DAYTIM=WAKETIME,REPTIM=WAKETIME ; ; CREATE AND CONNECT OUTPUT LOG FILE $CREATE FAB=LOGFAB ; CREATE LOG FILE BLBS R0,1$ ; ERROR - CAN WE CREATE FILE? BRW CR_ERROR ; GOTO ERROR CONDITION 1$: $CONNECT RAB=LOGRAB ; CONNECT TO LOGFILE BLBS R0,2$ ; ERROR - CAN WE CONNECT TO FILE? BRW CO_ERROR ; GOTO ERROR CONDITION 2$: ; ; LOOP THRU THIS CODE ONCE FOR EACH WAKEUP PERIOD - ONCE PER WAKETIME ; SLEEP: $HIBER_S ; CATCH A FEW WINKS WHILE YOU CAN ; NOTHING BETTER THAN SLEEPING ON THE JOB. ; ; LOOP THRU THIS CODE ONCE FOR EVERY PROCESS ; GET JOB PRIORITIES. ; LOOP: $GETJPI_S EFN=#1,PIDADR=PID,ITMLST=GETLIST,IOSB=IOSB BLBS R0,1$ ; IF NOT ERROR GO WAIT FOR INFO CMPW R0,#SS$_NOMOREPROC ; LAST PROCESS? BNEQ 10$ ; NO - CONTINUE - SOME OTHER ERROR BRW FINISH ; YES - NO MORE PROCESSES. 10$: CMPW R0,#SS$_SUSPENDED ; IF PROCESS SUSPENDED BEQL LOOP ; GET NEXT ONE. CMPW R0,#SS$_NOPRIV ; IF NO PRIVILEDGE TO SEE PROCESS BEQL LOOP ; GET NEXT ONE. BRB LOOP ; SOME OTHER ERROR - IGNORE IT. ; 1$: $WAITFR_S EFN=#1 ; WAIT FOR GETJPI TO RETURN MOVZWL IOSB,R0 ; COMPLETION STATUS FOR GETJPI BLBS R0,11$ ; COMPLETE O.K.? BRW ERROR ; NO - SOMEDAY WE MAY DO ERROR CHECKING 11$: MOVL PROCESS_OWNER,SAVE_OWNER; Save the Process_owner word V1.7 PUSHAL TERMINAL ; CHECK TO SEE IF THIS PROCESS PUSHAL TERMINAL_SIZE ; IS USING A TERMINAL. V1.2 CALLS #2,CHECK_TERMINAL ; IF IT IS, THEN TRY TO KILL IT. ; BLBC R0,4$ ; IF 0 THEN GET NEXT PROCESS. CALLS #0,FIND_PROCESS ; FIND THIS PROCESS IN STORAGE TABLE. ; BLBS R0,2$ ; IF PROCESS NOT FOUND THEN CALLS #0,ADD_NEW_PROCESS ; ADD THIS PROCESS TO PROCESS TABLE ; BRB 3$ ; AND GET NEXT PROCESS, ELSE 2$: MOVL R1,R6 ; SAVE THIS PROCESS STORAGE POINTER PUSHL R1 ; PASS PROCESS STORAGE BLOCK CALLS #1,CHECK_PROCESS ; CHECK AGAINST PREVIOUS PERFORMANCE. BLBC R0,35$ ; ERROR? CAN'T HAPPEN. OR CAN IT?V1.5 CMPB R1,#IDLE_TIME ; IDLE TOO LONG? BLSS 3$ ; NO - DON'T KILL PROCESS TSTL SUBPROCESS_COUNT ; IF AN IDLE PROCESS HAS ANY V1.2 BGTR 3$ ; SUBPROCESSES, DON'T KILL IT. V1.2 ; KILL THE IDLE SUBPROCESSES 1ST,V1.2 ; THEN NEXT TIME KILL THE ROOT. V1.2 PUSHL R6 ; ELSE SEE ABOUT KILLING IT BY CALLS #1,KILL_PROCESS ; PUTTING A STOP TO THIS PROCESS BRW LOOP ; and back for more V1.5 3$: CMPB R1,#IDLE_Warn_TIME1 ; Does user deserve a warning V1.5 BGEQ 6$ ; Yes start warning the him/her V1.5 BRW LOOP ; GET NEXT PROCESS V1.5 35$: JMP ERROR ; Error, set up error msg & exit V1.5 ; ; PATCH ADDED TO SEE IF ANY SPECIAL PROCESSES ARE RUNNING SO THAT THE ; USER OPERATOR DOES NOT GET TIMED OUT. ; 4$: ; CALLS #0,FIND_SPECIAL_PROCESS ; IS THIS ONE OF THE SPECIAL JOBS ; BLBC R0,5$ ; CREATED BY MCF? ; BISB2 #1,MCF_RUNNING ; SET FLAG TO 1 FOR MCF RUNNING. 5$: BRB 3$ ; FIND NEXT PROCESS. ; ; Issue warning messages as the deadline draws near ; 6$: TSTL SUBPROCESS_COUNT ; If an idle process has no V1.5 BEQL 61$ ; subprocess we may kill it V1.5 BRW 64$ ; If it has, first kill sub prc V1.5 61$: TSTL Save_Owner ; Is this a subprocess or not V1.7 BEQL 610$ ; If EQL, no V1.7 BRW 65$ ; Yes, use different messages V1.7 610$: ; V1.7 CMPB R1,#IDLE_Warn_Time1 ; First Trigger level V1.5 BNEQ 62$ ; Not this one V1.5 ADDL2 #1,TERMINAL_SIZE ; Add 1 to TT: buf len for '_' V1.5 $BRDCST_S MSGBUF=Warn1_Mes,DEVNAM=TERMINAL_SIZE ; V1.5 ; Send user nasty message V1.5 SUBL2 #1,TERMINAL_SIZE ; and take away '_' V1.5 JMP Loop ; Check some more V1.5 62$: CMPB R1,#IDLE_Warn_time2 ; Next trigger level V1.5 BNEQ 63$ ; No not this one V1.5 ADDL2 #1,TERMINAL_SIZE ; Add 1 to TT: buf len for '_' V1.5 $BRDCST_S MSGBUF=Warn2_Mes,DEVNAM=TERMINAL_SIZE ; V1.5 ; Send user nasty message V1.5 SUBL2 #1,TERMINAL_SIZE ; and take away underscore '_' V1.5 JMP Loop ; Check some more V1.5 63$: CMPB R1,#IDLE_Warn_time3 ; Last Warning time V1.5 BNEQ 64$ ; No not this one V1.5 ADDL2 #1,TERMINAL_SIZE ; Add 1 to TT: buf len for '_' V1.5 $BRDCST_S MSGBUF=Warn3_Mes,DEVNAM=TERMINAL_SIZE ; V1.5 ; Send user nasty message V1.5 SUBL2 #1,TERMINAL_SIZE ; And take away underscore '_' V1.5 64$: JMP LOOP ; Check some more V1.5 65$: CMPB R1,#IDLE_Warn_Time1 ; First Trigger level V1.7 BNEQ 66$ ; Not this one V1.7 ADDL2 #1,TERMINAL_SIZE ; Add 1 to TT: buf len for '_' V1.7 $BRDCST_S MSGBUF=W_Warn1_Mes,DEVNAM=TERMINAL_SIZE ; V1.7 ; Send user nasty message V1.7 SUBL2 #1,TERMINAL_SIZE ; and take away '_' V1.7 JMP Loop ; Check some more V1.7 66$: CMPB R1,#IDLE_Warn_time2 ; Next trigger level V1.7 BNEQ 67$ ; No not this one V1.7 ADDL2 #1,TERMINAL_SIZE ; Add 1 to TT: buf len for '_' V1.7 $BRDCST_S MSGBUF=W_Warn2_Mes,DEVNAM=TERMINAL_SIZE ; V1.7 ; Send user nasty message V1.7 SUBL2 #1,TERMINAL_SIZE ; and take away underscore '_' V1.7 JMP Loop ; Check some more V1.7 67$: CMPB R1,#IDLE_Warn_time3 ; Last Warning time V1.7 BNEQ 68$ ; No not this one V1.7 ADDL2 #1,TERMINAL_SIZE ; Add 1 to TT: buf len for '_' V1.7 $BRDCST_S MSGBUF=W_Warn3_Mes,DEVNAM=TERMINAL_SIZE ; V1.7 ; Send user nasty message V1.7 SUBL2 #1,TERMINAL_SIZE ; And take away underscore '_' V1.7 68$: JMP LOOP ; Check some more V1.7 ; .SUBTITLE FINISH AND CLEAN UP FOR NEXT RUN. ; ; ALL THE PROCESSES HAVE BEEN CHECKED AND THOSE THAT STILL EXIST HAVE BEEN ; FLAGGED. WE NOW HAVE TO SET FLAGS FOR THE NEXT TIME WE LOOP THROUGH THE ; PROCESSES. IF BIT0 STILL EQUALS 1 THEN THIS PROCESS HAS BEEN CANCELLED ; BY SOMETHING, THERE FORE WE CAN FREE UP IT'S STORAGE SPACE; ELSE WE SET ; BIT 0 TO 1 TO SEE IF IT IS STILL ACTIVE IN THE NEXT LOOP. ; FINISH: BLBC MCF_RUNNING,11$ ; MCF RUNNING THIS TIME? MOVB #2,MCF_RUNNING ; YES - SET MCF RUNNING FLAG = 2. BRB 12$ ; MOVE ON WARDS AND DOWN WARDS 11$: CLRB MCF_RUNNING ; NOT RUNNING - SET MCF RUNNING = 0. ; 12$: MOVAL PROCESS_STORAGE,R6 ; GET PROCESS STORAGE ADDRESS MOVL #STORAGE_SIZE,R8 ; AND NUMBER OF PROCESSES. ; 1$: TSTB S_STATUS(R6) ; IF ALREADY 0, BEQL 2$ ; GET NEXT STATUS WORD. BBCS #0,S_STATUS(R6),2$ ; IF BIT0 NOT 0, AND NOT EMPTY ; THEN SET BIT 0 AND GET NEXT. CLRB S_STATUS(R6) ; ELSE PROCESS NO LONGER ACTIVE. ; 2$: ADDL #S_NEXT_PROCESS,R6 ; GET NEXT STORAGE ADDRESS SOBGTR R8,1$ ; LAST PROCESS STORAGE ADDRESS END_FIN: MNEGL #1,PID ; RESET PROCESS POINTER TO 1ST PROCESS. BRW SLEEP ; FINISHED THIS TIME, GOTO SLEEP UNTIL ; THE SCHEDULER (BOSS) WAKES YOU AGAIN. ; .SUBTITLE ERROR HANDLING ROUTINE ; AN ERROR HAS OCCURRED IN THE GETJPI SYSTEM SERVICE OR IN CHECK_PROCESS ; (IMPOSSIBLE). LEAVE R0 WITH THE ERROR CODE IN IT, AND EXIT TO THE MONITOR ; AND THE ERROR MESSAGE WILL APPEAR IN THE ERROR LOG FILE. PROVIDED YOU ; SPECIFIED ONE IN THE RUN COMMAND (RUN/ERROR=filespec.ext). ; ERROR: BRW LOOP ; AN ERROR OCCURRED IN THE LAST GETJPI ; IN CHECK_PROCESS, GO GET THE NEXT PROCESS' INFO, ; IF THERE IS ONE. ; ; TOO BAD WE LEFT FROM HERE. SOMETHING IS ROTTEN IN DENMARK. ; THIS USED TO WORK FINE UNTIL I PLAYED WITH IT. ;******************************************************************* ; DID YOU REMEMBER TO GIVE THIS PROCESS OPER AND WORLD PRIVILEDGES?? ;******************************************************************* ; ; ERROR IN OPENING OR CONNECTING THE LOG FILE CO_ERROR: PUSHL R0 ; SAVE ERROR CONDITION. $CLOSE FAB=LOGFAB ; CLOSE LOG FILE POPL R0 ; RESTORE ERROR CONDITION. CR_ERROR: $EXIT_S ; SEE YOU LATER. ; .SUBTITLE CHECK FOR SPECIAL JOBS RUNNING ; ; IF A PROCESS IS NOT A TERMINAL JOB, THEN ; THIS SUBROUTINE CHECKS TO SEE IF THIS PROCESS IS ONE OF THE ; SPECIAL DETACHED PROCESS. ; IF IT IS A SPECIAL PROCESS R0=1 ON RETURN ; IF IT IS NOT A SPECIAL PROCESS R0=0 ON RETURN ; ; IF ONE OF THESE PROCESSES IS RUNNING, THEN OPERATOR IS NOT TO BE ; LOGGED OFF TTA0:, OR OPA0:. IF OPERATOR IS LOGGED INTO ONE OF THESE ; TWO TERMINALS AT ANY OTHER TIME, TOUGH BEANS, HE GETS THE AXE. ; ("HERE WE GO AXEMEN, HERE WE GO"). ; ; This code is never called in the this version since we have no V1.5 ; special processes to worry about. V1.5 ; .ENTRY FIND_SPECIAL_PROCESS,^M ; CMPL #5,PROCESS_SIZE ; IF STRING NOT 5 BYTES LONG THEN BNEQ 11$ ; NOT AN MCF JOB. MOVL #2,R7 ; LOOP 2 TIMES - 2 SPECIAL PROCESSES. MOVAL CMS2P,R6 ; GET FIRST STRING 1$: CMPC3 #5,(R6),PROCESS ; SAME PROCESS NAME? BEQL 3$ ; YES - MCF RUNNING. SOBGTR R7,2$ ; LAST PROCESS? 11$: CLRB R0 ; NOT AN MCF PROCESS R0=0 BRB 4$ ; BYE - BYE 2$: ADDL2 #5,R6 ; GET NEXT STRING BRB 1$ ; AND TEST IT. 3$: MOVB #1,R0 ; SET R0=1 - AN MCF PROCESS WAS FOUND. 4$: RET ; TTFN. ; .SUBTITLE CHECK TERMINAL STATUS ; ; Test to see if a process is an interactive job. ; It is interactive if it has a terminal name of TTan:, TXan:, VTan: V2.0 ; RTan: or OPA0: V2.0 ; Upon return - Success (a terminal job) R0=1 ; Failure (not a terminal job) R0=0 ; There are certain user-terminal(-process) combinations which are ; terminal jobs but are not to be logged off. This subroutine also determines ; if any of these combinations live. If they do, R0=0 for not a terminal job. ; Check the root of the process tree to see if the subprocesses are V1.2 ; terminal processes. if they are, treat them as such V1.2 ; There is no hiding from big brother. V1.2 ; START CHECK_TERMINAL HERE ; .ENTRY CHECK_TERMINAL,^M ; CALLS #0,CHECK_ROOT ; CHECK ROOT FOR A TERMINAL V1.2 TSTL @4(AP) ; TEST SIZE OF THE TERMINAL NAME V1.2 BEQL 5$ ; IF 0, THEN NOT A TERMINAL JOB MOVL 8(AP),R6 ; ELSE GET THE ADDRESS OF TERM BUFFER MOVAL TT,R7 ; GET THE TT COMPARE ADDRESS CMPC3 #2,(R6),(R7) ; IF LETTERS COMPARE BEQL 4$ ; THEN IT IS A TT TERMINAL MOVAL TX,R7 ; Get the TX compare address V1.5 CMPC3 #2,(R6),(R7) ; If letters compare V1.5 BEQL 4$ ; Then it is a TX terminal V1.5 MOVAL VT,R7 ; Get the VT compare address V2.0 CMPC3 #2,(R6),(R7) ; If letters compare V2.0 BEQL 4$ ; Then it is a VT terminal V2.0 MOVAL RT,R7 ; Get the RT compare address V2.0 CMPC3 #2,(R6),(R7) ; If letters compare V2.0 BEQL 4$ ; Then it is a RT terminal V2.0 MOVAL OPA0,R7 ; ELSE TEST TO SEE IF OPA0 CMPC3 #5,(R6),(R7) ; COMPARE CHARACTERS BNEQ 5$ ; NO COMPARE, NOT A TERMINAL BRB 41$ ; IT IS OPA0, SEE IF OPERATOR USER. ; ; But if it's operator and OPA0:, do not stop. ; 4$: ; Here, one has the chance to customize depending on whether certain V1.5 ; special, magic processes are active. If they are, then perchance V1.5 ; one wants to be more lenient about logging people off than at other V1.5 ; times. Anyway, the following code can be customized as to specific V1.5 ; site needs. By changing the names of the special magic processes V1.5 ; in the table at the start of this program, almost any thing can be V1.5 ; checked for with a bit of work. V1.5 ; V1.5 ; TSTB MCF_RUNNING ; IF MCF NOT RUNNING THEN YOU V1.5 ; BEQL 42$ ; STOP THE OPERATOR - DEAD. V1.5 ; CMPC3 #TTA0_SIZE,(R6),TTA0 ; IF TTA0: do not stop V1.5 ; BNEQ 42$ ; V1.5 ; BEQL 5$ ; (after all its a printer) V1.5 BRB 42$ ; Maybe should stop, check more V1.5 ; ; It would be very unfriendly to stop certain processes running on OPA0:V1.5 ; just because the operator or manager stepped out. IE, killing a 15 V1.5 ; tape backup set of an RA81 would cause severe emotional difficulties V1.5 ; with many operators. So while there are just as good reasons for V1.5 ; timing out OPA0: for either the OPERATOR or SYSTEM account (in fact V1.5 ; from a security standpoint, even better), in practice timing out theseV1.5 ; accounts running on OPA0: is a BAD IDEA, and we eill not do it. If V1.5 ; the intrepid reader of this comment feels differently, a quick pass V1.5 ; with an editor can make this work YOUR WAY. V1.5 ; ; Moreover, for our environment, timing out OPA0: for anyone might lead V1.5 ; to disaster with tape copy operations. So for now. BYPASS the user V1.5 ; timeout code on OPA0:. Never timeout on OPA0: V1.5 ; ; OK, we are on OPA0: if we are here ; 41$: BRB 5$ ; *** Never timeout OPA0: *** V1.5 CMPC3 #OPER_SIZE,USERNAME,OPERATOR ; Is this the operator BEQL 5$ ; If Yes, Do not stop this process ; No, See if SYSTEM account CMPC3 #SYSTEM_SIZE,USERNAME,SYSTEM; SYSMGR account V1.5 BEQL 5$ ; If Yes, skip timeout V1.5 BRB 49$ ; Else you may stop it. ; ; 42$: ; ; If we are here, the process in question is sitting at an ordinary V1.5 ; terminal. For testing purposes, if DEBUG is defined, only the V1.5 ; specified user will get timed out, all others will be ignored. V1.5 ; In real life, the syStem manager, or VMS Guru, or the person who V1.5 ; customized AUTOLOG for the user's VAX, may not like being logged out. V1.5 ; After all, some of us like to walk away from edits and come back to V1.5 ; them days later. Here's your chance for inserting those user names V1.5 ; which are to be considered special. V1.5 ; .IF DF DEBUG ; if debug only timeout tester V1.5 CMPC3 #TESTER_SIZE,USERNAME,TESTER ; Is it the tester V1.5 BNEQ 5$ ; If not me, don't stop V1.5 .ENDC ; ; CMPC3 #MANAGER_SIZE,USERNAME,MANAGER ; Is it the manager V1.5 ; BEQL 5$ ; If so, skip timeout V1.5 ; 49$: MOVB #1,R0 ; It may be stopped because it is BRB 6$ ; Either a TT or an OPA0 and not a ; user with a special name. ; 5$: CLRB R0 ; Not a TT or an OPA0, don't time out ; 6$: RET ; THAT'S ALL FOLKS ; .SUBTITLE CHECK ROOT FOR A TERMINAL V1.2 ; ; FIND THE ROOT OF THE SUBPROCESS TREE AND FIND OUT WHETHER THIS TREE V1.2 ; HAS A TERMINAL ASSOCIATED WITH IT. IF IT DOES THEN THE SUBPROCESS CAN V1.2 ; BE TREATED AS A TERMINAL PROCESS. IF IT DOESN'T HAVE A TERMINAL, THEN V1.2 ; RETURN AND GO TO (POOR STRUCTURED CODE) "GET THE NEXT PROCESS" V1.2 ; ; START CHECK_ROOT HERE V1.2 ; .ENTRY CHECK_ROOT,0 ; V1.2 1$: TSTL PROCESS_OWNER ; IS IT A ROOT PROCESS? V1.2 BEQL 2$ ; YES - FINISHED HERE V1.2 ; ELSE GET INFO ON PROCESS OWNER V1.2 $GETJPI_S EFN=#2,PIDADR=PROCESS_OWNER,- ; V1.2 ITMLST=OWNER_GETLIST,IOSB=IOSB ; V1.2 BLBC R0,2$ ; IF AN ERROR OCCURRED, RETURN V1.2 $WAITFR_S EFN=#2 ; WAIT FOR GETJPI TO RETURN V1.2 MOVZWL IOSB,R0 ; COMPLETION STSTUS FOR GETJPI V1.2 BLBC R0,2$ ; COMPLETE O.K.? - NO - BYE,BYE V1.2 BRB 1$ ; ARE WE AT THE ROOT OF THE TREE?V1.2 ; 2$: RET ; TTFN - TATA FOR NOW. V1.2 ; ; .SUBTITLE FIND THIS PROCESS' STORAGE AREA ; ; THIS SUBROUTINE LOCATES THE PROCESS IN THE PROCESS STORAGE TABLE, ; FOR THE PROCESS JUST RETURNED. ; UPON COMPLETION R0=0 PROCESS NOT FOUND ; R0=1 PROCESS FOUND ; R1=ADDRESS OF PROCESS IN PROCESS-STORAGE TABLE ; .ENTRY FIND_PROCESS,^M ; MOVL #STORAGE_SIZE,R8 ; MAXIMUM NUMBER OF PROCESSES. MOVAL PROCESS_STORAGE,R6 ; GET ADDRESS OF STORAGE AREAS. MOVAL PROCESS_ID,R7 ; GET ADDRESS OF PROCESS_ID 1$: CMPL S_PID(R6),(R7) ; SAME PROCESS BEQL 2$ ; YES ADDL #S_NEXT_PROCESS,R6 ; NO - GET NEXT PROCESS DECL R8 ; LAST PROCESS? BGTR 1$ ; NO CLRL R0 ; PROCESS NOT FOUND BRB 3$ ; SET ERROR FLAG ; 2$: MOVL #1,R0 ; SET R0 FOR PROCESS FOUND BISB2 #BIT1,S_STATUS(R6) ; SET STATUS TO ACTIVE PROCESS BICB2 #BIT0,S_STATUS(R6) ; CLEAR UNCHECKED BIT MOVL R6,R1 ; SAVE PROCESS ADDRESS 3$: RET ; SEE YOU LATER ; ; .SUBTITLE ADD NEW PROCESS TO PROCESS TABLE ; ; THIS SUBROUTINE ADDS A NEW PROCESS TO THE PROCESS STORAGE AREA. THIS ; CURRENT PROCESS LOGGED IN WITHIN THE LAST RUNNING OF THIS JOB. ; FIRST WE MUST FIND AN EMPTY SLOT IN THE STORAGE AREA, THEN WE MUST ; STORE THE NECESSARY DATA. ; UPON COMPLETION R0=0 NO FREE SPACE ; R0=1 FREE SPACE FOUND AND SUBROUTINE DID ITS THING. ; .ENTRY ADD_NEW_PROCESS,^M ; MOVL #STORAGE_SIZE,R8 ; MAXIMUM NUMBER OF PROCESSES. MOVAL PROCESS_STORAGE,R6 ; GET ADDRESS OF STORAGE AREA. 1$: TSTB S_STATUS(R6) ; IF THIS BUFFER IS EMPTY BEQL 2$ ; THEN FILL IT, ADDL #S_NEXT_PROCESS,R6 ; ELSE CHECK NEXT BUFFER AREA DECL R8 ; IF THERE IS ONE BGTR 1$ ; LOOP AGAIN CLRL R0 ; NO FREE SPACE FOUND SO BRB 3$ ; SET ERROR FLAG AND EXIT ELSE ; START STORING THIS PROCESS' DATA ;2$: ADDL2 #5,CPU_TIME ; ADD .05 SEC. TO CPU_TIME. V1.5 2$: ADDL2 #10,CPU_TIME ; ADD .1 SEC. TO CPU_TIME. V1.8 ; THIS ALLOWS FOR SMALL AMOUNTS OF TERMINAL "IDLE" ACTIVITY V1.3 ; IT SHOULD ALSO TAKE CARE OF SPAWNED SUBPROCESSES WHICH ATE MINUTE V1.3 ; AMOUNTS OF CPU_TIME. V1.3 MOVL PROCESS_ID,S_PID(R6) ; SAVE - PROCESS ID MOVL CPU_TIME,S_CPU(R6) ; CPU TIME MOVL BUFFERED_IO,S_BUFF(R6) ; BUFFERED I/O COUNT MOVL DIRECT_IO,S_DIRECT(R6) ; DIRECT I/O COUNT MOVC5 TERMINAL_SIZE,TERMINAL,#^A/ /,#7,S_TERM(R6) ; TERMINAL MOVB #2,S_STATUS(R6) ; CHECKED AND ACTIVE CLRB S_MINUTES(R6) ; INACTIVITY MINUTES MOVL #1,R0 ; SET SUCCESS FLAG 3$: RET ; CO'MON BACK REAL SOON, YA HEAR. ; ; .SUBTITLE CHECK THIS PROCESS STATUS ; THIS SUBROUTINE CHECKS TO SEE IF ANY OF THE THREE PROCESS VARIABLES ; HAVE CHANGED SINCE THE LAST TIME WE CHECKED THEM. THE 3 PROCESS ; VARIABLES ARE BUFFERED I/O, DIRECT I/O, AND ACCUMULATED CPU TIME. ; IF NONE OF THESE 3 HAVE CHANGED BY ANY VAST AMOUNT THEN INCREMENT ; S_MINUTES PROCESS STORAGE WORD. ; UPON COMPLETION R0=0 SUBROUTINE FAILED, HOW I DON'T KNOW. ; R0=1 PROCESS STATUS WAS CHECKED AND UPDATED. ; R1=NUMBER OF MINUTES IN IDLE, FOR THIS PROCESS. (BYTE) ; .ENTRY CHECK_PROCESS,^M ; MOVL 4(AP),R6 ; GET THIS PROCESS STORAGE AREA CMPL CPU_TIME,S_CPU(R6) ; COMPARE OLD AND NEW CPU TIME. BGTR 1$ ; PROCESS STATUS O.K.? CMPL BUFFERED_IO,S_BUFF(R6) ; NO - COMPARE BUFFERED I/O ACTIVITY BGTR 1$ ; PROCESS STATUS O.K.? CMPL DIRECT_IO,S_DIRECT(R6) ; NO - COMPARE DIRECT I/O ACTIVITY BGTR 1$ ; PROCESS STATUS O.K.? ADDB #Scan_Interval,S_Minutes(R6) ; No - Add scan time to idle min V1.4x MOVB S_MINUTES(R6),R1 ; AND PASS TO CALLER MOVL CPU_TIME,S_CPU(R6) ; Set in current elapsed CPU time V1.5 ADDL #5,S_CPU(R6) ; Add a tad to account for VMS V1.5 BRB 2$ ; THINGS DIDN'T CHANGE SO DON'T UPDATE ;1$: ADDL2 #5,CPU_TIME ; ADD .05 SEC. TO CPU_TIME. V1.5 1$: ADDL2 #10,CPU_TIME ; ADD .1 SEC. TO CPU_TIME. V1.8 ; THIS ALLOWS FOR SMALL AMOUNTS OF TERMINAL "IDLE" ACTIVITY V1.3 ; IT SHOULD ALSO TAKE CARE OF SPAWNED SUBPROCESSES WHICH ATE MINUTE V1.3 ; AMOUNTS OF CPU_TIME. V1.3 MOVL CPU_TIME,S_CPU(R6) ; UPDATE BUFFER - CPU TIME MOVL BUFFERED_IO,S_BUFF(R6) ; - BUFFERED I/O COUNT MOVL DIRECT_IO,S_DIRECT(R6) ; - DIRECT I/O COUNT CLRB S_MINUTES(R6) ; - IDLE MINUTES BICB #BIT2,S_STATUS(R6) ; CLEAR WARNING MESSAGE SENT FLAG CLRB R1 ; NO INACTIVE MINUTES 2$: MOVL #1,R0 ; S-U-C-C-E-S-S THAT'S THE WAY WE ; SPELL SUCCESS RET ; HOW DO YOU SPELL RELIEF? ; .SUBTITLE KILL THIS PROCESS WITH WARNING ; ; THIS SUBROUTINE PLAYS WITH THE CURRENT PROCESS, WHICH HAS BEEN IDLE TOO LONG. ; FIRST IT PRINTS A WARNING MESSAGE TO THAT TERMINAL AND SETS THE WARNING ; MESSAGE BIT IN S_STATUS (BIT 2) FOR THIS PROCESS. IF THE S_STATUS BIT IS ; ALREADY SET AND SINCE THERE HAS BEEN NO IMPROVEMENT IN THE PROCESSES JOB ; STATUS, YOU MAY KILL IT. ; MY WHAT FUN YOU CAN WITH POOR UNSUSPECTING USERS, BUT IT MAKES THE SYSTEM ; MORE SECURE, AND THATS WHAT ITS ALL ABOUT. BUT, IF YOU ARE SELLING COMPUTER ; TIME TO THESE POOR USERS, YOU START TO LOOSE INCOME. OH! WELL, TOO BAD! ; .ENTRY KILL_PROCESS,^M ; MOVL 4(AP),R6 ; GET THIS PROCESSES STORAGE CELL. BITB #BIT2,S_STATUS(R6) ; SEE IF MESSAGE HAS BEEN SENT BNEQ DELETE ; IF BIT 2 WAS SET THEN DELETE PROCESS ; WARNING: ; ELSE SEND WARNING MESSAGE AND SET BIT ADDL2 #1,TERMINAL_SIZE ; ADD 1 TO TERMINAL BUFFER LENGTH _ . TSTL Save_Owner ; Is this a subprocess V1.7 BNEQ 10$ ; If NEQ, yes V1.7 $BRDCST_S MSGBUF=MESSAGE,DEVNAM=TERMINAL_SIZE ; Main prc ; SEND USER NASTY MESSAGE BRW 20$ ; V1.7 10$: $BRDCST_S MSGBUF=W_MESSAGE,DEVNAM=TERMINAL_SIZE ; Subprc V1.7 20$: SUBL2 #1,TERMINAL_SIZE ; AND TAKE AWAY UNDERSCORE _ . V1.7 BISB2 #BIT2,S_STATUS(R6) ; SET WARNING FLAG. USER GOT OFF MOVL #1,R0 ; EASY THIS TIME, ONLY A WARNING TICKET RET ; FOR GOING TOO SLOW. - THATS DIFFERENT ; DELETE: ADDL2 #1,TERMINAL_SIZE ; GET TERMINAL NAME + _. TSTL Save_Owner ; Is this subprocess V1.7 BNEQ Delete_1 ; If NEQ, Yes so do slightly dif V1.7 MOVC5 USERNAME_SIZE,USERNAME,#^A/ /,#12,FINAL_MESSAGE+8 ; PUT USERNAME IN THE FINAL_MESSAGE. $ASCTIM_S TIMBUF=TIME_BUFFER ; PUT CURRENT TIME INTO FINAL_MESSAGE. $BRDCST_S MSGBUF=FINAL_MESSAGE,DEVNAM=TERMINAL_SIZE ; ; TELL USER WE GOT RID OF HIM LONG AGO. ; $DELPRC_S PIDADR=PROCESS_ID ; USER WAS IDLE TOO LONG, BYE. CLRB S_STATUS(R6) ; ONE MAY NOW REUSE THIS STORAGE SPACE. ; ; LOG THIS TIME OUT EVENT IN LOG FILE. ; BIG BROTHER IS WATCHING YOU. ; MOVC5 TERMINAL_SIZE,TERMINAL,#^A/ /,#7,LOG_MESSAGE+6 ; PUT TERMINAL NAME IN OUTPUT BUFFER $PUT RAB=LOGRAB ; LOG MESSAGE TO FILE. ; MOVL #1,R0 ; SUCCESSFULLY GOT RID OF ANOTHER BUM! RET ; THOSE DAMN LAZY OR FORGETFUL USERS! ; I WISH THEY WOULD STAY OFF 'MY' SYSTEM. ; LIFE WOULD BE MUCH EASIER. ; Delete_1: ; Tell user subprocess gone V1.7 $BRDCST_S MSGBUF=W_FINAL_MESSAGE,DEVNAM=TERMINAL_SIZE ; V1.7 $DELPRC_S PIDADR=PROCESS_ID ; Delete subprocess V1.7 CLRB S_STATUS(R6) ; reuse storage space V1.7 MOVL #1,R0 ; Show success V1.7 RET ; look for more work V1.7 .END AUTOLOG_START