iinit - reed-alert - Lightweight agentless alerting system for server Err bitreich.org 70
hgit clone git://bitreich.org/reed-alert/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/reed-alert/ URL:git://bitreich.org/reed-alert/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/reed-alert/ bitreich.org 70
1Log /scm/reed-alert/log.gph bitreich.org 70
1Files /scm/reed-alert/files.gph bitreich.org 70
1Refs /scm/reed-alert/refs.gph bitreich.org 70
1Tags /scm/reed-alert/tag bitreich.org 70
1README /scm/reed-alert/file/README.gph bitreich.org 70
1LICENSE /scm/reed-alert/file/LICENSE.gph bitreich.org 70
i--- Err bitreich.org 70
1commit 9410e05e37aefd2e1880178e655a8bd64173c645 /scm/reed-alert/commit/9410e05e37aefd2e1880178e655a8bd64173c645.gph bitreich.org 70
hAuthor: solene rapenne <solene@dataswamp.org> URL:mailto:solene@dataswamp.org bitreich.org 70
iDate: Fri, 7 Oct 2016 12:25:49 +0200 Err bitreich.org 70
i Err bitreich.org 70
iinit Err bitreich.org 70
i Err bitreich.org 70
iDiffstat: Err bitreich.org 70
i A example.lisp | 50 +++++++++++++++++++++++++++++++ Err bitreich.org 70
i A functions.lisp | 49 +++++++++++++++++++++++++++++++ Err bitreich.org 70
i A probes.lisp | 92 +++++++++++++++++++++++++++++++ Err bitreich.org 70
i Err bitreich.org 70
i3 files changed, 191 insertions(+), 0 deletions(-) Err bitreich.org 70
i--- Err bitreich.org 70
1diff --git a/example.lisp b/example.lisp /scm/reed-alert/file/example.lisp.gph bitreich.org 70
i@@ -0,0 +1,50 @@ Err bitreich.org 70
i+(defvar *alerts* Err bitreich.org 70
i+ (list Err bitreich.org 70
i+ '(dont-use-it ("REMINDER" function params date hostname description level os newline _ space result)) Err bitreich.org 70
i+ '(void nil) Err bitreich.org 70
i+ '(mail nil) Err bitreich.org 70
i+ '(sms ("echo -n '" date _ function " CRITICAL " hostname "' | curl http://somewebservice";)) Err bitreich.org 70
i+ '(mail ("echo -n '" date _ hostname " had problem on " function newline params _ " values " result newline Err bitreich.org 70
i+ description "' | mail -s '[Error] " function " - " hostname "' foo@bar.com")) Err bitreich.org 70
i+ '(with-plus ("echo -n '" + date + _ + hostname + " had problem on " + function + newline + params + newline Err bitreich.org 70
i+ + description + "' | mail -s '[Error] " + function + " - " + hostname + "' foo@bar.com")))) Err bitreich.org 70
i+ Err bitreich.org 70
i+(load "functions.lisp") Err bitreich.org 70
i+ Err bitreich.org 70
i+;; check if used percent :path partition is more than :limit Err bitreich.org 70
i+(=> mail disk-usage (:path "/" :limit 90)) Err bitreich.org 70
i+(=> mail disk-usage (:path "/usr" :limit 85)) Err bitreich.org 70
i+(=> mail disk-usage (:path "/tmp" :limit 1)) ;; failure Err bitreich.org 70
i+ Err bitreich.org 70
i+;; check if :path file exists Err bitreich.org 70
i+(=> mail file-exists (:path "/bsd.rd" :desc "OpenBSD kernel /bsd.rd")) Err bitreich.org 70
i+(=> void file-exists (:path "/non-existant-file")) ;; failure file not found Err bitreich.org 70
i+ Err bitreich.org 70
i+;; check if :path file exists and has been updated since :limit minutes Err bitreich.org 70
i+(=> void file-updated (:path "/var/log/messages" :limit 400)) Err bitreich.org 70
i+(=> mail file-updated (:path "/bsd.rd" :limit 1 :desc "OpenBSD kernel")) ;; failure Err bitreich.org 70
i+ Err bitreich.org 70
i+;; check if :path pid file process is running Err bitreich.org 70
i+(=> mail pid-running (:path "/var/run/xdm.pid" :desc "XDM pid")) Err bitreich.org 70
i+(=> mail pid-running (:path "/home/user/test.pid")) ;; failure Err bitreich.org 70
i+ Err bitreich.org 70
i+;; check if number of processes on the system is more than :limit Err bitreich.org 70
i+(=> mail number-of-processes (:limit 200)) Err bitreich.org 70
i+(=> mail number-of-processes (:limit 1)) ;; failure Err bitreich.org 70
i+ Err bitreich.org 70
i+;; check if load average on (1/5/15) minutes is more than :limit Err bitreich.org 70
i+(=> mail load-average-1 (:limit 4)) Err bitreich.org 70
i+(=> mail load-average-5 (:limit 2)) Err bitreich.org 70
i+(=> mail load-average-15 (:limit 1)) Err bitreich.org 70
i+(=> mail load-average-1 (:limit 0.2)) ;; should trigger error Err bitreich.org 70
i+ Err bitreich.org 70
i+;; check if :host host is reachable Err bitreich.org 70
i+(=> mail ping (:host "8.8.8.8" :desc "Google DNS")) Err bitreich.org 70
i+(=> void ping (:host "2.3.4.256" :desc "Not valid ipv4 address")) ;; fail error Err bitreich.org 70
i+(=> void ping (:host "127.40.30.21" :desc "Certainly not used address")) ;; fail time out Err bitreich.org 70
i+ Err bitreich.org 70
i+;; check if :command command return 0 (success) or something else (error) Err bitreich.org 70
i+(=> void command (:command "echo hello")) ;; success Err bitreich.org 70
i+(=> void command (:command "ls /non-existent-file")) ;; fail Err bitreich.org 70
i+ Err bitreich.org 70
i+(quit) Err bitreich.org 70
1diff --git a/functions.lisp b/functions.lisp /scm/reed-alert/file/functions.lisp.gph bitreich.org 70
i@@ -0,0 +1,49 @@ Err bitreich.org 70
i+(load "probes.lisp") Err bitreich.org 70
i+ Err bitreich.org 70
i+(defun color(num1 num2) Err bitreich.org 70
i+ (format nil "~a[~a;~am" #\Escape num1 num2)) Err bitreich.org 70
i+ Err bitreich.org 70
i+(defparameter *red* (color 1 31)) Err bitreich.org 70
i+(defparameter *white* (color 0 70)) Err bitreich.org 70
i+(defparameter *green* (color 1 32)) Err bitreich.org 70
i+(defparameter *yellow* (color 0 33)) Err bitreich.org 70
i+ Err bitreich.org 70
i+(defun trigger-alert(level function params result) Err bitreich.org 70
i+ (format nil "~{~a~}" Err bitreich.org 70
i+ (mapcar #'(lambda(x) Err bitreich.org 70
i+ (if (symbolp x) Err bitreich.org 70
i+ (case x Err bitreich.org 70
i+ (+ "") Err bitreich.org 70
i+ (result result) Err bitreich.org 70
i+ (hostname (machine-instance)) Err bitreich.org 70
i+ (date (multiple-value-bind Err bitreich.org 70
i+ (second minute hour day month year) Err bitreich.org 70
i+ (get-decoded-time) Err bitreich.org 70
i+ (format nil "~a/~a/~a ~a:~a:~a" year month day hour minute second))) Err bitreich.org 70
i+ (os (software-type)) Err bitreich.org 70
i+ (function function) Err bitreich.org 70
i+ (space " ") Err bitreich.org 70
i+ (_ " ") Err bitreich.org 70
i+ (params params) Err bitreich.org 70
i+ (desc (getf params :desc "")) Err bitreich.org 70
i+ (newline #\Newline) Err bitreich.org 70
i+ (level level)) Err bitreich.org 70
i+ x)) Err bitreich.org 70
i+ (cadr (assoc level *alerts*))))) Err bitreich.org 70
i+ Err bitreich.org 70
i+(defmacro stop-if-error(&body body) Err bitreich.org 70
i+ `(progn Err bitreich.org 70
i+ (and ,@body))) Err bitreich.org 70
i+ Err bitreich.org 70
i+(defmacro =>(level fonction params) Err bitreich.org 70
i+ `(progn Err bitreich.org 70
i+ (format t "[~a~a ~20A~a] ~35A" *yellow* ',level ',fonction *white* (getf ',params :desc ',params)) Err bitreich.org 70
i+ (let ((result (funcall ',fonction ',params))) Err bitreich.org 70
i+ (if (not (listp result)) Err bitreich.org 70
i+ (progn Err bitreich.org 70
i+ (format t " => ~asuccess~a~%" *green* *white*) Err bitreich.org 70
i+ t) Err bitreich.org 70
i+ (progn Err bitreich.org 70
i+ (format t " => ~aerror~a~%" *red* *white*) Err bitreich.org 70
i+ (uiop:run-program (trigger-alert ',level ',fonction ',params (cadr result)) :output t) Err bitreich.org 70
i+ nil))))) Err bitreich.org 70
1diff --git a/probes.lisp b/probes.lisp /scm/reed-alert/file/probes.lisp.gph bitreich.org 70
i@@ -0,0 +1,92 @@ Err bitreich.org 70
i+(defmacro create-probe(name &body code) Err bitreich.org 70
i+ `(progn (defun ,name(params) ,@code))) Err bitreich.org 70
i+ Err bitreich.org 70
i+(defun command-return-code(command) Err bitreich.org 70
i+ (let ((code (nth-value 2 (uiop:run-program command :ignore-error-status t)))) Err bitreich.org 70
i+ (if (= 0 code) Err bitreich.org 70
i+ t Err bitreich.org 70
i+ (list nil (format nil "return code = ~a" code))))) Err bitreich.org 70
i+ Err bitreich.org 70
i+(create-probe Err bitreich.org 70
i+ file-exists Err bitreich.org 70
i+ (let ((result (probe-file (getf params :path)))) Err bitreich.org 70
i+ (if result Err bitreich.org 70
i+ t Err bitreich.org 70
i+ (list nil "file not found")))) Err bitreich.org 70
i+ Err bitreich.org 70
i+(create-probe Err bitreich.org 70
i+ file-updated Err bitreich.org 70
i+ (if (probe-file (getf params :path)) Err bitreich.org 70
i+ (with-open-file (file (getf params :path)) Err bitreich.org 70
i+ (let* ((write-date (file-write-date file)) Err bitreich.org 70
i+ (now (get-universal-time)) Err bitreich.org 70
i+ (result (floor (- now write-date) 60))) Err bitreich.org 70
i+ (if (> (getf params :limit) result) Err bitreich.org 70
i+ t Err bitreich.org 70
i+ (list nil result)))) Err bitreich.org 70
i+ (list nil "file not found"))) Err bitreich.org 70
i+ Err bitreich.org 70
i+(create-probe Err bitreich.org 70
i+ pid-running Err bitreich.org 70
i+ (if (probe-file (getf params :path)) Err bitreich.org 70
i+ (let ((pid-number (with-open-file (stream (getf params :path)) (read-line stream)))) Err bitreich.org 70
i+ (command-return-code (list "ps" "-p" pid-number))) Err bitreich.org 70
i+ (list nil "file not found"))) Err bitreich.org 70
i+ Err bitreich.org 70
i+(create-probe Err bitreich.org 70
i+ disk-usage Err bitreich.org 70
i+ (let* ((output (uiop:run-program (list "df" (getf params :path)) :output :lines)) (line (second output))) Err bitreich.org 70
i+ (let ((percent-character-pos (position #\% line))) Err bitreich.org 70
i+ (let ((used-disk Err bitreich.org 70
i+ (parse-integer Err bitreich.org 70
i+ (subseq line Err bitreich.org 70
i+ (position #\Space line :end percent-character-pos :from-end t) Err bitreich.org 70
i+ percent-character-pos)))) Err bitreich.org 70
i+ (if (< used-disk (getf params :limit)) Err bitreich.org 70
i+ t Err bitreich.org 70
i+ (list nil "used-disk")))))) Err bitreich.org 70
i+ Err bitreich.org 70
i+(defun system-load(time) Err bitreich.org 70
i+ (read-from-string Err bitreich.org 70
i+ (let ((command (concatenate 'string Err bitreich.org 70
i+ "uptime | awk '{ print $" Err bitreich.org 70
i+ (princ-to-string time) Err bitreich.org 70
i+ " }'"))) Err bitreich.org 70
i+ (uiop:run-program command :output :string)))) Err bitreich.org 70
i+ Err bitreich.org 70
i+(create-probe Err bitreich.org 70
i+ load-average-1 Err bitreich.org 70
i+ (let ((load (system-load 10))) Err bitreich.org 70
i+ (if (< load (getf params :limit)) Err bitreich.org 70
i+ t Err bitreich.org 70
i+ (list nil load)))) Err bitreich.org 70
i+ Err bitreich.org 70
i+(create-probe Err bitreich.org 70
i+ load-average-5 Err bitreich.org 70
i+ (let ((load (system-load 11))) Err bitreich.org 70
i+ (if (< load (getf params :limit)) Err bitreich.org 70
i+ t Err bitreich.org 70
i+ (list nil load)))) Err bitreich.org 70
i+ Err bitreich.org 70
i+(create-probe Err bitreich.org 70
i+ load-average-15 Err bitreich.org 70
i+ (let ((load (system-load 12))) Err bitreich.org 70
i+ (if (< load (getf params :limit)) Err bitreich.org 70
i+ t Err bitreich.org 70
i+ (list nil load)))) Err bitreich.org 70
i+ Err bitreich.org 70
i+(create-probe Err bitreich.org 70
i+ command Err bitreich.org 70
i+ (command-return-code (getf params :command))) Err bitreich.org 70
i+ Err bitreich.org 70
i+(create-probe Err bitreich.org 70
i+ ping Err bitreich.org 70
i+ (command-return-code (list "ping" "-c2" (getf params :host)))) Err bitreich.org 70
i+ Err bitreich.org 70
i+(create-probe Err bitreich.org 70
i+ number-of-processes Err bitreich.org 70
i+ (let* ((output (uiop:run-program (list "ps" "aux") :output :lines)) Err bitreich.org 70
i+ (result (length output))) Err bitreich.org 70
i+ (if (> (getf params :limit) result) Err bitreich.org 70
i+ t Err bitreich.org 70
i+ (list nil result)))) Err bitreich.org 70
.
Response:
text/plain