feat(lisp): Implement configuration loading
Adds configuration loading from a file located at either "/etc/gemma/config.lisp" or a path determined via the `GEMMA_CONFIG` environment variable. The configuration file can contain any number of deftask forms and a single config form which determines the location at which Gemma stores its data and also the port on which it should listen.
This commit is contained in:
parent
db0e74fbd0
commit
4536e65471
1 changed files with 33 additions and 18 deletions
|
@ -10,16 +10,44 @@
|
||||||
(defpackage gemma
|
(defpackage gemma
|
||||||
(:use :cl
|
(:use :cl
|
||||||
:local-time
|
:local-time
|
||||||
:cl-json))
|
:cl-json)
|
||||||
|
(:import-from :sb-posix :getenv)
|
||||||
|
(:shadowing-import-from :sb-posix :getcwd))
|
||||||
(in-package :gemma)
|
(in-package :gemma)
|
||||||
|
|
||||||
;; TODO: Store an average of how many days it was between task
|
;; TODO: Store an average of how many days it was between task
|
||||||
;; completions. Some of the current numbers are just guesses
|
;; completions. Some of the current numbers are just guesses
|
||||||
;; anyways.
|
;; anyways.
|
||||||
|
|
||||||
|
(defmacro in-case-of (x &body body)
|
||||||
|
"Evaluate BODY if X is non-nil, binding the value of X to IT."
|
||||||
|
`(let ((it ,x))
|
||||||
|
(when it ,@body)))
|
||||||
|
|
||||||
|
;; Set default configuration parameters
|
||||||
|
(defvar *gemma-port* 4242
|
||||||
|
"Port on which the Gemma web server listens.")
|
||||||
|
|
||||||
|
(defun initialise-persistence (data-dir)
|
||||||
|
(defvar *p-tasks*
|
||||||
|
(cl-prevalence:make-prevalence-system data-dir)
|
||||||
|
"All tasks registered in this Gemma instance.")
|
||||||
|
|
||||||
|
;; Initialise database ID counter
|
||||||
|
(or (> (length (cl-prevalence:find-all-objects *p-tasks* 'task)) 0)
|
||||||
|
(cl-prevalence:tx-create-id-counter *p-tasks*)))
|
||||||
|
|
||||||
|
(defun config (&key port data-dir)
|
||||||
|
"Configuration function for use in the Gemma configuration file."
|
||||||
|
|
||||||
|
(in-package :gemma)
|
||||||
|
(in-case-of port (defparameter *gemma-port* it))
|
||||||
|
(initialise-persistence (or data-dir "data/")))
|
||||||
|
|
||||||
;;
|
;;
|
||||||
;; Define task management system
|
;; Define task management system
|
||||||
;;
|
;;
|
||||||
|
|
||||||
(defclass task ()
|
(defclass task ()
|
||||||
((id :reader id
|
((id :reader id
|
||||||
:initarg :id)
|
:initarg :id)
|
||||||
|
@ -44,23 +72,6 @@
|
||||||
:initarg :done-at
|
:initarg :done-at
|
||||||
:accessor last-done-at)))
|
:accessor last-done-at)))
|
||||||
|
|
||||||
(defvar *gemma-port*
|
|
||||||
(parse-integer (or (sb-posix:getenv "GEMMA_PORT") "4242"))
|
|
||||||
"Port on which the Gemma web server should listen.")
|
|
||||||
|
|
||||||
(defvar *gemma-data-dir*
|
|
||||||
(pathname (or (sb-posix:getenv "GEMMA_DATA_DIR")
|
|
||||||
(sb-posix:getcwd)))
|
|
||||||
"Directory in which to store Gemma data.")
|
|
||||||
|
|
||||||
(defvar *p-tasks*
|
|
||||||
(cl-prevalence:make-prevalence-system *gemma-data-dir*)
|
|
||||||
"All tasks registered in this Gemma instance.")
|
|
||||||
|
|
||||||
;; Initialise database ID counter
|
|
||||||
(or (> (length (cl-prevalence:find-all-objects *p-tasks* 'task)) 0)
|
|
||||||
(cl-prevalence:tx-create-id-counter *p-tasks*))
|
|
||||||
|
|
||||||
(defmacro deftask (task-name days &optional description)
|
(defmacro deftask (task-name days &optional description)
|
||||||
(unless (get-task task-name)
|
(unless (get-task task-name)
|
||||||
`(progn (cl-prevalence:tx-create-object
|
`(progn (cl-prevalence:tx-create-object
|
||||||
|
@ -110,6 +121,10 @@ maximum interval."
|
||||||
(:remaining . ,(days-remaining task))))
|
(:remaining . ,(days-remaining task))))
|
||||||
|
|
||||||
(defun start-gemma ()
|
(defun start-gemma ()
|
||||||
|
;; Load configuration
|
||||||
|
(load (pathname (or (getenv "GEMMA_CONFIG")
|
||||||
|
"/etc/gemma/config.lisp")))
|
||||||
|
|
||||||
;; Set up web server
|
;; Set up web server
|
||||||
(hunchentoot:start (make-instance 'hunchentoot:easy-acceptor :port *gemma-port*))
|
(hunchentoot:start (make-instance 'hunchentoot:easy-acceptor :port *gemma-port*))
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue