DIRECTORY Basics USING [BITAND], BasicTime USING [GMT, nullGMT, Unpacked, Unpack, Now], Commander USING [Register, CommandProc], FS USING [Error, StreamOpen], IO, Process USING [Detach, Pause, SecondsToTicks], PupName USING [NameLookup, Error], PupStream USING [Create, StreamClosing, Timeout, waitForever], Pup USING [Address], Rope USING [Find, ROPE, Substr], RefText USING [TrustTextAsRope] ; DLSMonitor: CEDAR MONITOR IMPORTS Basics, BasicTime, Commander, FS, IO, Process, PupName, PupStream, RefText, Rope EXPORTS ~ BEGIN STREAM: TYPE ~ IO.STREAM; ROPE: TYPE ~ Rope.ROPE; running: BOOL _ FALSE; timeOut: CARDINAL _ 0; timerForked: BOOL _ FALSE; server: ROPE ~ "DLS+100000"; fileName: ROPE ~ "DLSLog.txt"; Restart: ERROR = CODE; DLSMonitorProc: PROC [] = BEGIN ForkIt: ENTRY PROC [] = TRUSTED {timerForked _ TRUE; Process.Detach[FORK TimerProcess[]]}; dlsStream: STREAM; fileStream: STREAM _ NIL; c: CHAR; txt: REF TEXT _ NEW [TEXT[1000]]; l: CARDINAL _ 0; ClearTimeout[]; IF ~ timerForked THEN ForkIt[]; SetRunning[TRUE]; fileStream _ FS.StreamOpen[fileName: fileName, accessOptions: append, keep: 10 ! FS.Error => IF error.group = lock THEN {fileStream _ FS.StreamOpen[fileName: fileName, accessOptions: create, keep: 10]; CONTINUE}]; dlsStream _ GetConnection[]; IO.PutF[fileStream, "%g $ Starting\n", IO.rope[RFC822Date[]]]; IO.Flush[fileStream]; DO ENABLE {PupStream.StreamClosing, IO.Error => BEGIN IO.PutF[fileStream, "%g $ DLS Not responding\n", IO.rope[RFC822Date[]]]; IO.Flush[fileStream]; dlsStream _ GetConnection[]; CONTINUE; END; -- of PupStream.StreamClosing Restart => BEGIN IO.PutF[fileStream, "%g $ Restarting\n", IO.rope[RFC822Date[]]]; IO.Flush[fileStream]; dlsStream _ GetConnection[]; CONTINUE; END;}; -- of ENABLE IF dlsStream = NIL THEN {IO.Close[fileStream]; ForceTimeout[]; RETURN}; BEGIN DO i: INT _ IO.CharsAvail[dlsStream]; IF i > 0 THEN EXIT; IF ~ GetRunning[] THEN {IO.Close[fileStream]; IO.Close[dlsStream]; ForceTimeout[]; RETURN}; Process.Pause[Process.SecondsToTicks[10]]; IF Timeout[] THEN {ClearTimeout[]; IO.Close[dlsStream]; ERROR Restart}; ENDLOOP; c _ IO.GetChar[dlsStream ! PupStream.Timeout => IF ~ GetRunning[] THEN EXIT ELSE RESUME; IO.EndOfStream => IF ~ GetRunning[] THEN EXIT ELSE LOOP]; c _ LOOPHOLE[Basics.BITAND[LOOPHOLE[c, CARDINAL], 177B], CHAR]; IF c = IO.CR THEN BEGIN IO.PutF[fileStream, "%g $ %g\n", IO.rope[RFC822Date[]], IO.rope[RefText.TrustTextAsRope[txt]]]; IO.Flush[fileStream]; txt.length _ 0; END ELSE IF c = '\000 THEN LOOP ELSE IF c = IO.LF THEN LOOP ELSE BEGIN txt[txt.length] _ c; txt.length _ txt.length + 1; IF txt.length >= txt.maxLength THEN txt.length _ 0; END; END; ENDLOOP; ForceTimeout[]; IO.Close[fileStream]; IO.Close[dlsStream]; END; GetConnection: PROC [] RETURNS [dlsStream: STREAM] = BEGIN dlsStream _ NIL; DO dlsStream _ EstablishConnection[server]; IF dlsStream # NIL THEN EXIT; IF ~ GetRunning[] THEN EXIT; Process.Pause[Process.SecondsToTicks[10]]; ENDLOOP; RETURN [dlsStream]; END; EstablishConnection: PROC [serverName: ROPE] RETURNS [STREAM] = BEGIN ENABLE { PupStream.StreamClosing => GOTO Exit; UNWIND => NULL; }; commPortAddress: Pup.Address _ PupName.NameLookup[serverName, [0, 0, 0, 1] ! PupName.Error => GOTO Exit]; s: STREAM _ PupStream.Create[commPortAddress, PupStream.waitForever, PupStream.waitForever]; IO.PutChar[s, 'c]; IO.Flush[s]; RETURN [s]; EXITS Exit => RETURN [NIL]; END; Timeout: ENTRY PROC [] RETURNS [BOOL] = {RETURN[timeOut > 6]}; ClearTimeout: ENTRY PROC [] = {timeOut _ 0}; IncTimeout: ENTRY PROC [] = {timeOut _ timeOut + 1}; ForceTimeout: ENTRY PROC [] = {timeOut _ 9999}; TimerProcess: PROC [] = BEGIN DO Process.Pause[Process.SecondsToTicks[30*60]]; IncTimeout[]; IF ~ GetRunning[] THEN RETURN; ENDLOOP; END; SetRunning: ENTRY PROC [val: BOOL] = {running _ val}; GetRunning: ENTRY PROC [] RETURNS [BOOL] = {RETURN [running]}; RFC822Date: PUBLIC PROC[gmt: BasicTime.GMT_ BasicTime.nullGMT] RETURNS[date: ROPE] = -- generates arpa standard time, dd mmm yy hh:mm:ss zzz BEGIN OPEN IO; upt: BasicTime.Unpacked _ BasicTime.Unpack[IF gmt = BasicTime.nullGMT THEN BasicTime.Now[] ELSE gmt]; zone: ROPE; month, tyme, year: ROPE; timeFormat: ROPE = "%02g:%02g:%02g %g"; -- "hh:mm:ss zzz" dateFormat: ROPE = "%2g %g %g %g"; -- "dd mmm yy timeFormat" arpaNeg: BOOL_ upt.zone > 0; aZone: INT_ ABS[upt.zone]; zDif: INT_ aZone / 60; zMul: INT_ zDif * 60; IF (zMul = aZone) AND arpaNeg THEN BEGIN IF upt.dst = yes THEN SELECT zDif FROM 0 => zone_ "UT"; 4 => zone_ "EDT"; 5 => zone_ "CDT"; 6 => zone_ "MDT"; 8 => zone_ "PDT"; ENDCASE ELSE SELECT zDif FROM 0 => zone_ "UT"; 5 => zone_ "EST"; 6 => zone_ "CST"; 7 => zone_ "MST"; 8 => zone_ "PST"; ENDCASE; END; IF zone = NIL THEN BEGIN mm: INT_ aZone - zMul; zone_ PutFR[IF arpaNeg THEN "-%02g%02g" ELSE "+%02g%02g", int[zDif], int[mm]]; END; SELECT upt.month FROM January => month_ "Jan"; February => month_ "Feb"; March => month_ "Mar"; April => month_ "Apr"; May => month_ "May"; June => month_ "Jun"; July => month_ "Jul"; August => month_ "Aug"; September => month_ "Sep"; October => month_ "Oct"; November => month_ "Nov"; December => month_ "Dec"; unspecified => ERROR; ENDCASE => ERROR; year_ Rope.Substr[PutFR[NIL, int[upt.year]], 2]; tyme_ PutFR[timeFormat, int[upt.hour], int[upt.minute], int[upt.second], rope[zone]]; date_ PutFR[dateFormat, int[upt.day], rope[month], rope[year], rope[tyme]]; END; DLSMonitorCommand: Commander.CommandProc ~ BEGIN op: {start, stop}; IF Rope.Find[cmd.commandLine, "start", 0, FALSE] >= 0 THEN op _ start ELSE IF Rope.Find[cmd.commandLine, "stop", 0, FALSE] >= 0 THEN op _ stop ELSE IF NOT GetRunning[] THEN op _ start ELSE op _ stop; IF op = start THEN BEGIN TRUSTED { Process.Detach[FORK DLSMonitorProc[]]}; cmd.out.PutRope["DLS Monitor Started\n"]; END ELSE BEGIN SetRunning[FALSE]; cmd.out.PutRope["DLS Monitor Stopped\n"]; END; END; Commander.Register["DLSMonitor", DLSMonitorCommand, "DLSMonitor [ start | stop ]\n"]; END... –DLSMonitor.mesa Copyright (C) 1985, 1986, Xerox Corporation. All rights reserved. Last Edited by Tim Diebert: October 31, 1986 1:56:40 pm PST Κ }˜code™K™BK•StartOfExpansion[]™;—K˜šΟk ˜ Kšœœœ˜Kšœ œœ"˜6Kšœ œ˜(Kšœœ˜Kšœ˜Kšœœ!˜.Kšœœ˜"Kšœ œ/˜>Kšœœ ˜Kšœœœ˜ Kšœœ˜K˜—K˜šœ  ˜Kšœœœ,˜XKšœ˜Kšœ˜K˜Kšœœœœ˜Kšœœœ˜Kšœ œœ˜Kšœ œ˜Kšœ œœ˜Kšœœ˜Kšœ œ˜K˜Kšœ œœ˜K˜šΟnœœ˜šžœœœ˜Kšœœœ˜:—Kšœ œ˜Kšœ œœ˜Kšœœ˜Kš œœœœœ˜!Kšœœ˜K˜Kšœœ ˜Kšœ œ˜šœ œA˜Pšœ œ˜&KšœœA˜QKšœ˜ ——Kšœ˜Kšœ%œ˜>Kšœ˜š˜š˜šœœ ˜+Kšœ/œ˜HKšœ˜Kšœ˜Kšœ˜ KšœΟc˜#—šœ ˜Kšœ'œ˜@Kšœ˜Kšœ˜Kšœ˜ KšœŸ ˜——Kš œ œœœ#œ˜Gš˜š˜Kšœœœ˜"Kšœœœ˜šœ˜Kšœœœ#œ˜D—Kšœ*˜*Kšœ œœœ ˜GKšœ˜—šœœ˜Kš œœœœœœ˜=Kš œœœœœœ˜9—Kš œœœœœ œ˜?š œœœœ˜šœ˜ Kšœœ%˜>—Kšœ˜Kšœ˜Kš˜—Kšœœ œ˜Kš œœœœœ˜šœ˜ Kšœ1˜1Kšœœ˜3Kšœ˜—Kšœ˜—Kšœ˜—Kšœ˜Kšœ˜Kšœ˜Kšœ˜—K˜š ž œœœ œ˜:Kšœ œ˜š˜Kšœ(˜(Kšœ œœœ˜Kšœœœ˜Kšœ*˜*Kšœ˜—Kšœ ˜Kšœ˜—K˜š žœœœœœ˜EKšœœœœ˜AšœJ˜JKšœœ˜—KšœœS˜\Kšœ˜Kšœ ˜ Kšœ˜ Kšœ œœ˜Kšœ˜—K˜Kš žœœœœœœ˜>K˜Kšž œœœ˜,K˜Kšž œœœ˜4K˜Kšž œœœ˜/K˜šž œœ˜š˜Kšœ-˜-K˜ Kšœœœ˜Kšœ˜—Kšœ˜—K˜Kšž œœœœ˜5K˜Kš ž œœœœœœ ˜>K˜š ž œœœœœœ˜TKšŸ8˜8Kšœœœ˜šœ˜Kšœœœœ˜K—Kšœœ˜ Kšœœ˜Kšœ œŸ˜:Kšœ œŸ˜>Kšœ œ˜Kšœœœ ˜Kšœœ ˜Kšœœ ˜šœœ ˜"šœœ˜š˜šœ˜Kšœ˜Kšœ˜Kšœ˜Kšœ˜Kšœ˜Kš˜——š˜šœ˜Kšœ˜Kšœ˜Kšœ˜Kšœ˜Kšœ˜Kšœ˜———Kšœ˜—šœœ ˜Kšœœ˜Kšœ œ œ œ"˜NKšœ˜—šœ ˜Kšœ˜Kšœ˜Kšœ˜Kšœ˜Kšœ˜Kšœ˜Kšœ˜Kšœ˜Kšœ˜Kšœ˜Kšœ˜Kšœ˜Kšœœ˜Kšœœ˜—Kšœœ˜0KšœU˜UKšœK˜KKšœ˜—K˜šžœ˜0K˜Kšœ(œœ ˜EKšœœ'œœ ˜HKšœœœœ ˜(Kšœ ˜šœ ˜ šœ˜ Kšœœ˜1Kšœ)˜)Kš˜—šœ˜ Kšœ œ˜Kšœ)˜)Kšœ˜——Kšœ˜—K˜KšœU˜UKšœ˜——…—F!Y