diff options
Diffstat (limited to 'tojo-tokyo/monitoring.scm')
-rw-r--r-- | tojo-tokyo/monitoring.scm | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/tojo-tokyo/monitoring.scm b/tojo-tokyo/monitoring.scm new file mode 100644 index 0000000..ad5d34e --- /dev/null +++ b/tojo-tokyo/monitoring.scm @@ -0,0 +1,59 @@ +;;; Monitoring --- Server monitoring +;;; Copyright © 2021 Masaya Tojo <masaya@tojo.tokyo> +;;; +;;; This file is part of Monitoring. +;;; +;;; Monitoring is free software; you can redistribute it and/or modify it +;;; under the terms of the GNU General Public License as published by +;;; the Free Software Foundation; either version 3 of the License, or +;;; (at your option) any later version. +;;; +;;; Monitoring is distributed in the hope that it will be useful, but +;;; WITHOUT ANY WARRANTY; without even the implied warranty of +;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +;;; General Public License for more details. +;;; +;;; You should have received a copy of the GNU General Public License +;;; along with Monitoring. If not, see <http://www.gnu.org/licenses/>. + +(define-module (tojo-tokyo monitoring) + #:use-module (ice-9 popen) + #:use-module (ice-9 textual-ports) + #:use-module (ice-9 regex) + #:use-module ((srfi srfi-1) #:select (any)) + #:use-module (web client)) + +(define-public current-df-command (make-parameter "df")) +(define-public current-heartbeat-url + (make-parameter + (let ((heartbeat-file "/etc/heartbeat-url")) + (or (and (file-exists? heartbeat-file) + (call-with-input-file heartbeat-file get-line)) + "https://heartbeat.test")))) + +(define (df) + (let ((port (open-input-pipe (current-df-command)))) + (get-line port) + (let f ((line (get-line port))) + (cond ((eof-object? line) + (close-pipe port) + '()) + (else + (cons (map cons + '(filesystem 1k-blocks used available use% mounted-on) + (map match:substring (list-matches "[^ ]+" line))) + (f (get-line port)))))))) + +(define-public (disk-use%-over? threshold) + (any (lambda (x) + (let ((use% (string->number (string-delete #\% (assoc-ref x 'use%))))) + (< threshold use%))) + (filter (lambda (x) + (let ((fs (assoc-ref x 'filesystem))) + (and fs + (<= 5 (string-length fs)) + (string=? (substring fs 0 5) "/dev/")))) + (df)))) + +(define-public (heartbeat) + (http-request (current-heartbeat-url))) |