git.fiddlerwoaroof.com
Raw Blame History
(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))