Alert declaration easier - reed-alert - Lightweight agentless alerting system for server
HTML git clone git://bitreich.org/reed-alert/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/reed-alert/
DIR Log
DIR Files
DIR Refs
DIR Tags
DIR README
DIR LICENSE
---
DIR commit 5bcf5ae779478fbb3233740aa9ce5583a6f0e0bf
DIR parent eb64a97f9c6283cab21d9672be9c4c22ac27dcb0
HTML Author: Solene Rapenne <solene@perso.pw>
Date: Wed, 10 Jan 2018 20:16:23 +0100
Alert declaration easier
Diffstat:
M functions.lisp | 69 ++++++++++++++++++++-----------
1 file changed, 44 insertions(+), 25 deletions(-)
---
DIR diff --git a/functions.lisp b/functions.lisp
@@ -1,13 +1,29 @@
(require 'asdf)
+(defparameter *alerts* '())
+
(defun color(num1 num2)
(format nil "~a[~a;~am" #\Escape num1 num2))
-(defparameter *red* (color 1 31))
-(defparameter *white* (color 0 70))
-(defparameter *green* (color 1 32))
+(defparameter *red* (color 1 31))
+(defparameter *white* (color 0 70))
+(defparameter *green* (color 1 32))
(defparameter *yellow* (color 0 33))
+;; common-lisp don't have a split string function natively
+(defun replace-all (string part replacement &key (test #'char=))
+ (with-output-to-string (out)
+ (loop with part-length = (length part)
+ for old-pos = 0 then (+ pos part-length)
+ for pos = (search part string
+ :start2 old-pos
+ :test test)
+ do (write-string string out
+ :start old-pos
+ :end (or pos (length string)))
+ when pos do (write-string replacement out)
+ while pos)))
+
(defmacro create-probe(name &body code)
`(progn (defun ,name(params) ,@code)))
@@ -21,33 +37,36 @@
t
(list nil (format nil "return code = ~a" code)))))
-(defun trigger-alert(level function params result)
- (format nil "~{~a~}"
- (mapcar #'(lambda(x)
- (if (symbolp x)
- (case x
- (+ "")
- (result result)
- (hostname (machine-instance))
- (date (multiple-value-bind
- (second minute hour day month year)
- (get-decoded-time)
- (format nil "~a/~a/~a ~a:~a:~a" year month day hour minute second)))
- (os (software-type))
- (function function)
- (space " ")
- (_ " ")
- (params params)
- (desc (getf params :desc ""))
- (newline #\Newline)
- (level level))
- x))
- (cadr (assoc level *alerts*)))))
+(defmacro alert(name string)
+ `(progn (push (list ',name ,string)
+ *alerts*)))
+(defun trigger-alert(level function params result)
+ (let* ((notifier-command (assoc level *alerts*))
+ (command-string (cadr notifier-command)))
+ (setf command-string (replace-all command-string "%result%" (format nil "~a" result)))
+ (setf command-string (replace-all command-string "%hostname%" (machine-instance)))
+ (setf command-string (replace-all command-string "%os%" (software-type)))
+ (setf command-string (replace-all command-string "%function%" (format nil "~a" function)))
+ (setf command-string (replace-all command-string "%params%" (format nil "~a" params)))
+ (setf command-string (replace-all command-string "%desc%" (getf params :desc "")))
+ (setf command-string (replace-all command-string "%newline%" (string #\Newline)))
+ (setf command-string (replace-all command-string "%level%" level))
+ (setf command-string (replace-all command-string "%date%"
+ (multiple-value-bind
+ (second minute hour day month year)
+ (get-decoded-time)
+ (format nil "~a/~a/~a ~a:~a:~a" year month day hour minute second))))
+ command-string))
+
(defmacro stop-if-error(&body body)
`(progn
(and ,@body)))
+(defmacro escalation(&body body)
+ `(progn
+ (or ,@body)))
+
(defmacro =>(level fonction params)
`(progn
(format t "[~a~a ~20A~a] ~35A" *yellow* ',level ',fonction *white* (getf ',params :desc ',params))