]> njoseph.me Git - babashka-scripts.git/blobdiff - scripts/debian.clj
Shift from standalone scripts to babashka tasks
[babashka-scripts.git] / scripts / debian.clj
diff --git a/scripts/debian.clj b/scripts/debian.clj
new file mode 100644 (file)
index 0000000..6c07149
--- /dev/null
@@ -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))))