Public archive for the Return to Ritherdon project. https://www.nicolaellisandritherdon.com
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

62 lines
2.7 KiB

(in-package #:cl-user)
(defpackage #:snapshot
(:use #:cl
#:utils
#:storage
#:nera)
(:export
#:take-snapshot
#:restore-from-snapshot
#:delete-snapshot
#:store-snapshot))
(in-package #:snapshot)
(defun take-snapshot ()
"Takes a Snapshot of the website's data and stores it in /snapshots.
I've not included make a SQL dump of the Meilisearch database here because the
user can repopulate that database after they have restored this website. The
'repopulate' feature is built into the website already."
(let ((snapshot-directory
(format nil "~a_~a/"
(utils:slugify
(site-settings::site-name-of (nera:get-site-settings)))
(utils:create-timestamp-text))))
(storage:ensure-raw-directory-exists
(format nil "snapshots/~a" snapshot-directory))
(storage:copy-storage-directory
(format nil "snapshots/~a/storage/" snapshot-directory))
(storage:copy-raw-directory
"db/" (format nil "snapshots/~a/db/" snapshot-directory))))
(defun restore-from-snapshot (snapshot-name)
"Deletes the data in /storage and the DB and replaces it with `SNAPSHOT-NAME'."
(storage:remove-raw-directory "storage/")
(storage:remove-raw-directory "db/")
(storage:copy-raw-directory (format nil "snapshots/~a/storage/" snapshot-name) "storage/")
(storage:copy-raw-directory (format nil "snapshots/~a/db/" snapshot-name) "db/"))
(defun delete-snapshot (snapshot-name)
"Deletes the snapshot in the /snapshots directory with `SNAPSHOT-NAME'."
(storage:remove-raw-directory (format nil "snapshots/~a/" snapshot-name)))
(defun store-snapshot (filename data)
"Unzips `SNAPSHOT-FILE' and stores it in /snapshots directory.
The .zip file is deleted after it has been un-zipped. I did think about moving
the zipped version of the file into the /storage/media directory but there is
too much second guessing going on. I found I was uploading .zip files from the
/storage/media directory and I don't know if users will be uploading .zip files
they had just downloaded from /storage/media. If that is the case, then there
is:
a.) No need to move it to /storage/madia;
b.) Extra work regarding checks for duplicate entries; and,
c.) I don't know if that is too much 'magic' for users and cause confusion.
If the user is in a paniced state -- trying to restore their website, confusion
is the thing I want to keep to a minimum for them."
(storage:store-with-raw-path (format nil "snapshots/~a" filename) data)
(zip:unzip (storage:make-raw-path (format nil"snapshots/~a" filename))
(storage:make-raw-path (format nil "snapshots/~a/"
(pathname-name filename))))
(storage:remove-file-with-raw-path (format nil "snapshots/~a" filename)))