mirror of
https://github.com/journeyman-cc/smeagol.git
synced 2026-04-12 18:05:06 +00:00
Sanity testing on startup.
This commit is contained in:
parent
c76c821770
commit
6f22517f0c
1 changed files with 108 additions and 0 deletions
108
src/smeagol/sanity.clj
Normal file
108
src/smeagol/sanity.clj
Normal file
|
|
@ -0,0 +1,108 @@
|
|||
(ns ^{:doc "Functions related to sanity checks and error reporting in conditions where the environment may not be sane."
|
||||
:author "Simon Brooke"}
|
||||
smeagol.sanity
|
||||
(:require [clojure.java.io :as cjio]
|
||||
[clojure.string :as s]
|
||||
[compojure.response :refer [Renderable]]
|
||||
[environ.core :refer [env]]
|
||||
[hiccup.core :refer [html]]
|
||||
[ring.util.anti-forgery :refer [anti-forgery-field]]
|
||||
[ring.util.response :refer [content-type response]]
|
||||
[selmer.parser :as parser]
|
||||
[smeagol.configuration :refer [config]]
|
||||
[smeagol.util :as util]
|
||||
[taoensso.timbre :as timbre]))
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;;;;
|
||||
;;;; Smeagol: a very simple Wiki engine.
|
||||
;;;;
|
||||
;;;; This program 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 2
|
||||
;;;; of the License, or (at your option) any later version.
|
||||
;;;;
|
||||
;;;; This program 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 this program; if not, write to the Free Software
|
||||
;;;; Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
|
||||
;;;; USA.
|
||||
;;;;
|
||||
;;;; Copyright (C) 2014 Simon Brooke
|
||||
;;;;
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
(defn check-content-dir []
|
||||
(try
|
||||
(let [directory (cjio/as-file (cjio/resource util/content-dir))]
|
||||
(if
|
||||
(.isDirectory directory)
|
||||
true
|
||||
(throw (Exception. (str "Content directory '" util/content-dir "' is not a directory"))))
|
||||
(if
|
||||
(.canWrite directory)
|
||||
true
|
||||
(throw (Exception. (str "Content directory '" util/content-dir "' is not writable")))))
|
||||
(catch Exception any
|
||||
(throw (Exception. (str "Content directory '" util/content-dir "' does not exist") any))))
|
||||
(try
|
||||
(slurp (cjio/resource (str util/content-dir java.io.File/separator "_side-bar.md")))
|
||||
(timbre/info "Content directory '" util/content-dir "' check completed.")
|
||||
(catch Exception any
|
||||
(throw (Exception. (str "Content directory '" util/content-dir "' is not initialised") any)))))
|
||||
|
||||
|
||||
(defn- raw-sanity-check-installation []
|
||||
(check-content-dir)
|
||||
(config :test))
|
||||
|
||||
|
||||
(defn sanity-check-installation []
|
||||
(timbre/info "Running sanity check")
|
||||
(check-content-dir)
|
||||
(config :test)
|
||||
(timbre/info "Sanity check completed"))
|
||||
|
||||
|
||||
;;(def sanity-check-installation (memoize raw-sanity-check-installation))
|
||||
|
||||
|
||||
(defn- get-causes [any]
|
||||
(if
|
||||
(instance? Exception any)
|
||||
(cons any (get-causes (.getCause any)))
|
||||
'()))
|
||||
|
||||
|
||||
(defn show-sanity-check-error
|
||||
"Generate an error page in a way which should work even when everything else is broken.
|
||||
If no argument is passed, run the sanity check and if it fails return page contents;
|
||||
if `error` is passed, just return page content describing the error."
|
||||
([error]
|
||||
(html
|
||||
[:html
|
||||
[:head
|
||||
[:title "Smeagol is not initialised correctly"]
|
||||
[:link {:href "/content/stylesheet.css" :rel "stylesheet"}]]
|
||||
[:body
|
||||
[:header
|
||||
[:h1 "Smeagol is not initialised correctly"]]
|
||||
[:div {:id "error"}
|
||||
[:p {:class "error"} (.getMessage error)]]
|
||||
[:p "There was a problem launching Smeagol probably because of misconfiguration:"]
|
||||
(apply
|
||||
vector
|
||||
(cons :ol
|
||||
(map #(vector :li (.getMessage %))
|
||||
(get-causes error))))
|
||||
[:p "For more information please see documentation "
|
||||
[:a {:href "https://github.com/journeyman-cc/smeagol/blob/develop/resources/public/content/Deploying%20Smeagol.md"} "here"]]]]))
|
||||
([]
|
||||
(try
|
||||
(sanity-check-installation)
|
||||
nil
|
||||
(catch Exception any (show-sanity-check-error any)))))
|
||||
Loading…
Add table
Add a link
Reference in a new issue