;;; Monitoring --- Server monitoring ;;; Copyright © 2021 Masaya Tojo ;;; ;;; 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 . (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-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 "df"))) (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 (df-i) (let ((port (open-input-pipe "df -i"))) (get-line port) (let f ((line (get-line port))) (cond ((eof-object? line) (close-pipe port) '()) (else (cons (map cons '(filesystem inodes iused ifree iuse% mounted-on) (map match:substring (list-matches "[^ ]+" line))) (f (get-line port)))))))) (define-public (disk-iuse%-over? threshold) (any (lambda (x) (let ((iuse% (string->number (string-delete #\% (assoc-ref x 'iuse%))))) (and iuse% (< threshold iuse%)))) (filter (lambda (x) (let ((fs (assoc-ref x 'filesystem))) (and fs (<= 5 (string-length fs)) (string=? (substring fs 0 5) "/dev/")))) (df-i)))) (define-syntax-rule (heartbeat (p? body ...) ...) (let ((heartbeat-cancel? #f)) (when p? body ... (set! heartbeat-cancel? #t)) ... (unless heartbeat-cancel? (http-request (current-heartbeat-url))))) (export-syntax heartbeat)