add net option and minor code polishing
authorRalph Ronnquist <ralph.ronnquist@gmail.com>
Sat, 1 Jan 2022 11:00:52 +0000 (22:00 +1100)
committerRalph Ronnquist <ralph.ronnquist@gmail.com>
Sat, 1 Jan 2022 11:00:52 +0000 (22:00 +1100)
control-logic.lsp

index cd9a8306d9143558c7e464aeaa2e3f14782f1628..c842c06eee67d320d6270d87548e66ec80baf1b6 100644 (file)
      (date-list (+ NOW (* 60 (now 0 -2)))))
 ;(println (list YEAR MONTH DATE HOUR MINUTE SECOND DOY DOW))
 
      (date-list (+ NOW (* 60 (now 0 -2)))))
 ;(println (list YEAR MONTH DATE HOUR MINUTE SECOND DOY DOW))
 
-# Load "control.dat"
-# ( (control "file") (gap minutes) ( weekday start limit stop ) ... )
-(setf  CONTROL (read-expr (read-file "control.dat")))
-(map set '(dow MODE START LIMIT END)
-     (or (assoc DOW CONTROL) (list DOW (6 30) 120 (20 0))))
 (setf
  DAY (list YEAR MONTH DATE)
  HM (list HOUR MINUTE)
  TOTAL '()
 (setf
  DAY (list YEAR MONTH DATE)
  HM (list HOUR MINUTE)
  TOTAL '()
+ CONTROL.DAT "control.dat"
+ EXTRA.DAT "control-extra.dat"
+ USAGE.DAT "usage.dat"
+ USAGE.TMP ".usage.dat" 
+ )
+
+# Load CONTROL.DAT
+# ( (control "file") (gap minutes) ( weekday start limit stop ) ... )
+(setf CONTROL (read-expr (or (read-file CONTROL.DAT)
+                             (die "** Missing " CONTROL.DAT " ** Exiting."))
+                         ))
+(map set '(dow MODE START LIMIT END)
+     (or (assoc DOW CONTROL)
+         (assoc 'policy CONTROL)
+         (list DOW (6 30) 120 (20 0)))
+     )
+
+(setf
  GAP (or (lookup 'gap CONTROL) 15)
  CLIP (or (lookup 'clip CONTROL) 1000)
  GAP (or (lookup 'gap CONTROL) 15)
  CLIP (or (lookup 'clip CONTROL) 1000)
+ NET  (or (lookup 'net CONTROL) "10.0.0.0/8")
  )
 
  )
 
-# Load control mechanism
+# Load the configured control mechanism
 (if (lookup 'control CONTROL) (load $it)
   (die "** Unknown control mechanism. Exiting!!"))
 (unless control
 (if (lookup 'control CONTROL) (load $it)
   (die "** Unknown control mechanism. Exiting!!"))
 (unless control
-    (die "** Unknown control action. Exiting!!"))
+    (die "** Control function (control cmd reason) not defined. Exiting!!"))
 
 
+;; Apply control command with reason, then exit
 (define (do-control x r) (control x r) (exit 0))
 
 (define (do-control x r) (control x r) (exit 0))
 
-(when (file? "control-extra.dat")
-  (let ((f (file-info "control-extra.dat" 6))
-        (x (regex "([0-9]+) ([0-9]+)" (read-file "control-extra.dat") 0)))
-    (when (and f x (<= NOW (+ f (* 3600 (int $1 0 10)) (* 60 (int $2 0 10)))))
-      (setf OVERRIDE true))))
+;; Utility: Combine an (hour minutes) pair into total minutes
+(define (minutes x) (+ (* (x 0) 60) (x 1)))
+
+;; Utility: Combine hours and minutes into total seconds
+(define (seconds H M) (+ (* 3600 H) (* 60 M)))
 
 
+# Apply EXTRA.DAT. This is a pair of hours and minutes to force open,
+# relative to the modification time of the file.
+(setf OVERRIDE
+      (when (regex "([0-9]+) ([0-9]+)" (or (read-file EXTRA.DAT) "") 0)
+        (<= NOW (+ (file-info EXTRA.DAT 6) (seconds (int $1) (int $2))))))
+
+;;==== Utilities for activity data
 # Activity is lines of timestamps. Collect TOTAL as list of unique
 # time values (H M) within the start-end time span.
 # Activity is lines of timestamps. Collect TOTAL as list of unique
 # time values (H M) within the start-end time span.
-
 (define (log-name-fmt t)
   (format "%d%02d%02d-.*\\.dat" (0 3 (date-list t))))
 
 (define (log-name-fmt t)
   (format "%d%02d%02d-.*\\.dat" (0 3 (date-list t))))
 
@@ -65,6 +86,7 @@
            (on (if (regex "^[0-9]+ ([0-9]+)$" x 0) (> (int $1 0 10) CLIP) 1))
            )
       (and on (= (0 3 d) DAY) tm)))) ; (>= tm START) (< tm END) tm))))
            (on (if (regex "^[0-9]+ ([0-9]+)$" x 0) (> (int $1 0 10) CLIP) 1))
            )
       (and on (= (0 3 d) DAY) tm)))) ; (>= tm START) (< tm END) tm))))
+;; ======
 
 # Collect all mentioned minutes from the activity logs
 (setf TOTAL
 
 # Collect all mentioned minutes from the activity logs
 (setf TOTAL
@@ -75,7 +97,6 @@
 
 # Add all mentioned minutes, and fill in any time periods of less than
 # the configured GAP minutes between them.
 
 # Add all mentioned minutes, and fill in any time periods of less than
 # the configured GAP minutes between them.
-(define (minutes x) (+ (* (x 0) 60) (x 1)))
 (setf SUM 0)
 (when TOTAL
   (setf  LAST (minutes (pop TOTAL) SUM 1))
 (setf SUM 0)
 (when TOTAL
   (setf  LAST (minutes (pop TOTAL) SUM 1))
 # Rework SUM into (h m) format
 (setf SUM (letn ((h (/ SUM 60)) (m (- SUM (* 60 h)))) (list h m)))
 
 # Rework SUM into (h m) format
 (setf SUM (letn ((h (/ SUM 60)) (m (- SUM (* 60 h)))) (list h m)))
 
-(write-file ".usage.dat" (string SUM))
-(rename-file ".usage.dat" "usage.dat")
+# Write out current usage with atomic update (jic)
+(write-file USAGE.TMP (string SUM))
+(rename-file USAGE.TMP USAGE.DAT)
 
 
-# Close host outside start-end times
+# Apply current policy setting
+; ** Note that do-control exits
+(when OVERRIDE (do-control "open" "override"))
 (case MODE
   (closed (do-control "close" "closed"))
   (opened (do-control "open" "open"))
 (case MODE
   (closed (do-control "close" "closed"))
   (opened (do-control "open" "open"))
-  (timed 
-   (when OVERRIDE (do-control "open" "override"))
+  (timed ;; Close host outside start-end times
    (when (< HM START) (do-control "close" "early"))
    (when (>= HM END) (do-control "close" "late"))
    (when (> SUM LIMIT) (do-control "close" "usage"))
    (when (< HM START) (do-control "close" "early"))
    (when (>= HM END) (do-control "close" "late"))
    (when (> SUM LIMIT) (do-control "close" "usage"))