;;; -*- Mode: Lisp; Syntax: ANSI-Common-Lisp; Base: 10 -*- (declaim (optimize (speed 0) (safety 3) (debug 3))) (in-package #:dns-admin) (defmacro .base (&optional (onload-fn "goto_location('/dns')")) `(html5 `(html (head ((meta :name "viewport" :content "width=device-width, initial-scale=1")) ((meta :charset "utf-8")) ((title) ,(title *webapp*)) ,@(mapcar (lambda (css) `((link :rel "stylesheet" :href ,(getf css :href) :integrity ,(getf css :integrity) :crossorigin ,(getf css :crossorigin)))) '((:href "https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" :integrity "sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" :crossorigin "anonymous"))) ,@(mapcar (lambda (js) `((script :type "text/javascript" :src ,(getf js :src) :integrity ,(getf js :integrity) :crossorigin ,(getf js :crossorigin)))) '((:src "https://code.jquery.com/jquery-3.2.1.slim.min.js" :integrity "sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN" :crossorigin "anonymous") (:src "https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js" :integrity "sha384-ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0b4Q" :crossorigin "anonymous") (:src "https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js" :integrity "sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl" :crossorigin "anonymous"))) ((script :type "text/javascript" :src "/static/js/cljs/main.js"))) ((body :onload ,(format nil "dnsadmin.core.~a" ,onload-fn)) ((div :class "container-fluid") ((div :class "row" :style "padding: 20px") ((div :class "col") ((div :class "page-header") ((h2 :align "center") ,(title *webapp*)))))) ((div :id "location" :style "display: none")) ((div :id "authmsg")) ((div :id "errormsg")) ((div :id "message")) ((div :id "body")) ((div :id "infoblox-creds" :class "modal fade" :role "dialog") ((div :class "modal-dialog modal-lg") ((div :class "modal-content") ((div :class "modal-header") ((h5 :class "modal-title") "Infoblox - Connection Parameters") ((button :type "button" :class "close" :data-dismiss "modal") "×")) ((div :id "infoblox-creds-body" :class "modal-body" :style "height: 460px;")) ((div :class "modal-footer") ((button :type "submit" :class "btn btn-danger btn-default" :data-dismiss "modal") ((span :class "glyphicon glyphicon-remove") "Cancel")))))))))) (defmacro .location () `(handle-location location)) (defmacro .dns () `(handle-dns)) (defmacro .dns-headers () `(handle-dns-headers recordtype)) (defmacro .dns-login-get () `(handle-dns-login-get)) (defmacro .dns-login-post () `(handle-dns-login-post username pwd keypath)) (defmacro .dns-api-search-get () `(handle-dns-api-search-get recordtype)) (defmacro .dns-api-search-post () `(handle-dns-api-search-post recordtype ref name ipv4addr ipv6addr canonical ptrdname)) (defmacro .dns-api-add-get () `(handle-dns-api-add-get recordtype)) (defmacro .dns-api-add-post () `(handle-dns-api-add-post recordtype name ipv4addr ipv6addr canonical ptrdname)) (defmacro .dns-api-modify-get () `(handle-dns-api-modify-get recordtype ref name ipv4addr ipv6addr canonical ptrdname)) (defmacro .dns-api-modify-post () `(handle-dns-api-modify-post recordtype ref name ipv4addr ipv6addr canonical ptrdname)) (defmacro .dns-api-delete-post () `(handle-dns-api-delete-post recordtype ref)) (defmacro .dns-api-ttl-get () `(handle-dns-api-ttl-get recordtype ref name)) (defmacro .dns-api-ttl-post () `(handle-dns-api-ttl-post recordtype ref ttl)) ;; hunchentoot fails to differentiate between :get and :post to the ;; same URL. So we work around it in the URLs but fix it in the ;; downstream macro and function names. (define-endpoint :get "/" () .base) (define-endpoint :post "/location" ((location :parameter-type 'string)) .location) (define-endpoint :get "/dns" () .dns) (define-endpoint :post "/dns/headers" ((recordtype :parameter-type 'string)) .dns-headers) (define-endpoint :get "/dns/login" () .dns-login-get) (define-endpoint :post "/dns/login/post" ((username :parameter-type 'string) (pwd :parameter-type 'string) (keypath :parameter-type 'string)) .dns-login-post) (define-endpoint :post "/dns/api/search" ((recordtype :parameter-type 'string)) .dns-api-search-get) (define-endpoint :post "/dns/api/search/post" ((recordtype :parameter-type 'string) (ref :parameter-type 'string) (name :parameter-type 'string) (ipv4addr :parameter-type 'string) (ipv6addr :parameter-type 'string) (canonical :parameter-type 'string) (ptrdname :parameter-type 'string)) .dns-api-search-post) (define-endpoint :post "/dns/api/add" ((recordtype :parameter-type 'string)) .dns-api-add-get) (define-endpoint :post "/dns/api/add/post" ((recordtype :parameter-type 'string) (name :parameter-type 'string) (ipv4addr :parameter-type 'string) (ipv6addr :parameter-type 'string) (canonical :parameter-type 'string) (ptrdname :parameter-type 'string)) .dns-api-add-post) (define-endpoint :post "/dns/api/modify" ((recordtype :parameter-type 'string) (ref :parameter-type 'string) (name :parameter-type 'string) (ipv4addr :parameter-type 'string) (ipv6addr :parameter-type 'string) (canonical :parameter-type 'string) (ptrdname :parameter-type 'string)) .dns-api-modify-get) (define-endpoint :post "/dns/api/modify/post" ((recordtype :parameter-type 'string) (ref :parameter-type 'string) (name :parameter-type 'string) (ipv4addr :parameter-type 'string) (ipv6addr :parameter-type 'string) (canonical :parameter-type 'string) (ptrdname :parameter-type 'string)) .dns-api-modify-post) (define-endpoint :post "/dns/api/delete/post" ((recordtype :parameter-type 'string) (ref :parameter-type 'string)) .dns-api-delete-post) (define-endpoint :post "/dns/api/ttl" ((recordtype :parameter-type 'string) (ref :parameter-type 'string) (name :parameter-type 'string)) .dns-api-ttl-get) (define-endpoint :post "/dns/api/ttl/post" ((recordtype :parameter-type 'string) (ref :parameter-type 'string) (ttl :parameter-type 'string)) .dns-api-ttl-post)