]>
Commit | Line | Data |
---|---|---|
1 | (ns debian | |
2 | (:require [clojure.string :as str] | |
3 | [clojure.java.io :as io] | |
4 | [cheshire.core :as json] | |
5 | [org.httpkit.client :as http] | |
6 | [lib :refer [download-binary run-cmd]])) | |
7 | ||
8 | (defn install-deb-from-url | |
9 | "Install a Debian package given a direct URL to the .deb file." | |
10 | [url] | |
11 | (println "Downloading deb package...") | |
12 | (download-binary url "package.deb") | |
13 | (println "Installing...") | |
14 | (println (run-cmd ["sudo" "apt" "install" "./package.deb"])) | |
15 | (println "Cleaning up..") | |
16 | (io/delete-file "package.deb") | |
17 | (println "Done.")) | |
18 | ||
19 | (defn install-deb-from-GitHub | |
20 | "Install a Debian package given a GitHub URL." | |
21 | [url] | |
22 | ||
23 | (assert (.contains url "github.com")) | |
24 | ||
25 | (letfn [(extract-GitHub-author-project | |
26 | ;; Extracts a string like author/project from URL. | |
27 | [url] | |
28 | (str/join "/" (subvec (str/split url #"/") 3))) | |
29 | (make-api-url ;; just some string interpolation | |
30 | [author-project] | |
31 | (str "https://api.github.com/repos/" | |
32 | author-project | |
33 | "/releases/latest")) | |
34 | (get-assets ;; Download list of assets from GitHub | |
35 | [api-url] | |
36 | (:assets (json/parse-string | |
37 | (:body @(http/get api-url)) true))) | |
38 | (find-url-to-deb ;; Find Debian package URL from assets | |
39 | [assets] | |
40 | (some #(if (str/ends-with? % "deb") %) | |
41 | (map #(:browser_download_url %) assets)))] | |
42 | ||
43 | (let [author-project (extract-GitHub-author-project url) | |
44 | api-url (make-api-url author-project) | |
45 | assets (get-assets api-url) | |
46 | deb-url (find-url-to-deb assets)] | |
47 | ;; Download and install Debian package | |
48 | (install-deb-from-url deb-url)))) |