Для решения этой задачи потребуются следующие пакеты (благо, они уже установленные на lisper.ru)
- DRAKMA - для загрузки архива
- ZIP (http://common-lisp.net/~sionescu/files/zip-20080103.tar.bz2) - для разархивирования
- Clon - планировщик задач
;;;; Некоторые настройки
(defparameter *pcl-snapshot-url* #u"http://pcl.catap.ru/snapshot.zip")
(defparameter *pcl-snapshot-dir* #P"/var/rulisp/pcl/")
(defparameter *pcl-load-snapshot-p* t)
;;;;; Функция для загрузки и разархивирования
(defun load-pcl-snapshot ()
(when *pcl-load-snapshot-p*
(let ((snapshot-path (ensure-directories-exist (merge-pathnames (car (last (puri:uri-parsed-path *pcl-snapshot-url*)))
*pcl-snapshot-dir*)))
(snapshot (drakma:http-request *pcl-snapshot-url*
:force-binary t)))
(when snapshot
(with-open-file (out
snapshot-path
:direction :output
:element-type '(unsigned-byte 8)
:if-exists :supersede)
(write-sequence snapshot out))
(zip:unzip snapshot-path
*pcl-snapshot-dir*
:if-exists :supersede)
(setf *pcl-dir*
(merge-pathnames "var/www/pcl.catap.ru/htdocs/data/pages/pcl/"
*pcl-snapshot-dir*))
t))))
;;;; Выполняем (load-pcl-snapshot) по расписанию, скажем, один раз в час
(if *pcl-load-snapshot-p*
(clon:schedule-function 'load-pcl-snapshot
(clon:make-scheduler (clon:make-typed-cron-schedule :hour '*)
:allow-now-p t)
:thread t))
Комментариев нет:
Отправить комментарий