X-Git-Url: https://njoseph.me/gitweb/babashka-scripts.git/blobdiff_plain/746d64040956017457d38f0bf59649e96d0ab449..ec37ad05d576d79b3dc2d05b2bcae632a93e8c35:/scripts/debian.clj diff --git a/scripts/debian.clj b/scripts/debian.clj new file mode 100644 index 0000000..6c07149 --- /dev/null +++ b/scripts/debian.clj @@ -0,0 +1,48 @@ +(ns debian + (:require [clojure.string :as str] + [clojure.java.io :as io] + [cheshire.core :as json] + [org.httpkit.client :as http] + [lib :refer [download-binary run-cmd]])) + +(defn install-deb-from-url + "Install a Debian package given a direct URL to the .deb file." + [url] + (println "Downloading deb package...") + (download-binary url "package.deb") + (println "Installing...") + (println (run-cmd ["sudo" "apt" "install" "./package.deb"])) + (println "Cleaning up..") + (io/delete-file "package.deb") + (println "Done.")) + +(defn install-deb-from-GitHub + "Install a Debian package given a GitHub URL." + [url] + + (assert (.contains url "github.com")) + + (letfn [(extract-GitHub-author-project + ;; Extracts a string like author/project from URL. + [url] + (str/join "/" (subvec (str/split url #"/") 3))) + (make-api-url ;; just some string interpolation + [author-project] + (str "https://api.github.com/repos/" + author-project + "/releases/latest")) + (get-assets ;; Download list of assets from GitHub + [api-url] + (:assets (json/parse-string + (:body @(http/get api-url)) true))) + (find-url-to-deb ;; Find Debian package URL from assets + [assets] + (some #(if (str/ends-with? % "deb") %) + (map #(:browser_download_url %) assets)))] + + (let [author-project (extract-GitHub-author-project url) + api-url (make-api-url author-project) + assets (get-assets api-url) + deb-url (find-url-to-deb assets)] + ;; Download and install Debian package + (install-deb-from-url deb-url))))