git.fiddlerwoaroof.com
ddns_updater.lisp
1a481a69
 (eval-when (:load-toplevel :execute)
   (format t "~&Loading dependencies...")
   (ql:quickload '(:alexandria :serapeum :fwoar.lisputils :drakma :flexi-streams :osicat :yason)))
 
 (eval-when (:load-toplevel :execute)
   (format t "~&Loading dependencies...")
   (osicat-posix:setenv "CC" "/usr/bin/gcc")
   (ql:quickload :net.didierverna.clon))
 
 (defpackage :ddclient-updater
   (:use :cl :alexandria :serapeum :fw.lu)
   (:export :update-domains))
 (in-package :ddclient-updater)
 
 (defparameter *update-url* "https://api.1984.is/1.0/freedns/?apikey=~a&domain=~a&ip=")
 
 (defvar *http-stream* nil)
 
 (defun update-domain (domain api-key)
   (let* ((url (format nil *update-url* api-key domain))
 	 (drakma:*text-content-types* (acons "application" "json" drakma:*text-content-types*)))
     ;; todo: we probably want to read the stream in, because yason isn't completely robust against early termination
     (multiple-value-bind (data _ __ ___ ____ stream) (drakma:http-request url :close nil :stream *http-stream*)
       (declare (ignore _ __ ___ ____))
       (unless *http-stream*
 	(setf *http-stream* stream))
       (with (result (yason:parse data))
 	(values result
 		(gethash "ok" result)
 		(gethash "msg" result))))))
 
 (defun update-domains (domains api-key)
   (mapcar (op (with-simple-restart (continue "Skip ~a" _1)
 		(format t "~&Updating ~a...~%" _1)
 		(prog1 (multiple-value-list (update-domain _1 api-key))
 		  (sleep 1))))
 	  domains))
 
 (defpackage :ddclient-updater.main
   (:use :cl :alexandria :serapeum :fw.lu :net.didierverna.clon :ddclient-updater))
 (in-package :ddclient-updater.main)
 (import 'ddclient-updater::*http-stream*)
 
 (defparameter *api-key* "rKOB3TrfjWfsUl6NpvN6A3vYTaQfdXgYTShDAFWI5rwHJKwFb0EyBT7Mt11YWrjV")
 (defparameter *domains* '("srv2.elangley.org" "vpn.elangley.org" "files.elangley.org" "home.elangley.org"
 			  "mycloud.elangley.org" "pbj.elangley.org" "readme.elangley.org"
 			  "wiki.elangley.org"))
 
 (defsynopsis ()
   )
 (defun main ()
   (make-context)
   (unwind-protect (update-domains *domains* *api-key*)
     (when *http-stream*
       (finish-output *http-stream*)
       (close *http-stream*))))
 
 (defun dump-image ()
   (dump "ddns-updater" main))