-
Notifications
You must be signed in to change notification settings - Fork 515
/
fatdeb.clj
121 lines (104 loc) · 3.87 KB
/
fatdeb.clj
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
(ns leiningen.fatdeb
(:use [clojure.java.shell :only [sh]]
[clojure.java.io :only [file delete-file writer copy]]
[clojure.string :only [join capitalize trim-newline replace]]
[leiningen.uberjar :only [uberjar]])
(:import java.text.SimpleDateFormat
java.util.Date))
(defn delete-file-recursively
"Delete file f. If it's a directory, recursively delete all its contents.
Raise an exception if any deletion fails unless silently is true."
[f & [silently]]
(System/gc) ; This sometimes helps release files for deletion on windows.
(let [f (file f)]
(if (.isDirectory f)
(doseq [child (.listFiles f)]
(delete-file-recursively child silently)))
(delete-file f silently)))
(defn deb-dir
"Debian package working directory."
[project]
(file (:root project) "target/deb/riemann"))
(defn cleanup
[project]
; Delete working dir.
(when (.exists (deb-dir project))
(delete-file-recursively (deb-dir project))))
(defn reset
[project]
(cleanup project)
(sh "rm" (str (:root project) "/target/*.deb")))
(defn get-version
[project]
(let [df (SimpleDateFormat. "yyyyMMdd-HHmmss")]
(replace (:version project) #"SNAPSHOT" (.format df (Date.)))))
(defn control
"Control file"
[project]
(join "\n"
(map (fn [[k v]] (str (capitalize (name k)) ": " v))
{:package (:name project)
:version (get-version project)
:section "base"
:priority "optional"
:architecture "all"
:depends "bash"
:maintainer (:email (:maintainer project))
:description (:description project)})))
(defn write
"Write string to file, plus newline"
[file string]
(with-open [w (writer file)]
(.write w (str (trim-newline string) "\n"))))
(defn make-deb-dir
"Creates the debian package structure in a new directory."
[project]
(let [dir (deb-dir project)]
(.mkdirs dir)
; Meta
(.mkdirs (file dir "DEBIAN"))
(write (file dir "DEBIAN" "control") (control project))
(write (file dir "DEBIAN" "conffiles")
(join "\n" ["/etc/riemann/riemann.config"]))
; Postinst
; Fakeroot plays poorly with lein; have to change permissions after
; the fact. :(
(write (file dir "DEBIAN" "postinst")
"#!/bin/sh
chown -R root:root /usr/lib/riemann
chown root:root /usr/bin/riemann
chown -R root:root /etc/riemann")
(.setExecutable (file dir "DEBIAN" "postinst") true false)
; Jar
(.mkdirs (file dir "usr" "lib" "riemann"))
(copy (file (:root project) "target"
(str "riemann-" (:version project) "-standalone.jar"))
(file dir "usr" "lib" "riemann" "riemann.jar"))
; Binary
(.mkdirs (file dir "usr" "bin"))
(copy (file (:root project) "pkg" "deb" "riemann")
(file dir "usr" "bin" "riemann"))
(.setExecutable (file dir "usr" "bin" "riemann") true false)
; Config
(.mkdirs (file dir "etc" "riemann"))
(copy (file (:root project) "pkg" "riemann.config")
(file dir "etc" "riemann" "riemann.config"))
dir))
(defn dpkg
"Convert given package directory to a .deb."
[project deb-dir]
(print (:err (sh "dpkg" "--build"
(str deb-dir)
(str (file (:root project) "target")))))
(let [deb-file (file (:root project) "target" (str (:name project) "_"
(get-version project) "_"
"all" ".deb"))]
(write (str deb-file ".md5")
(:out (sh "md5sum" (str deb-file))))))
(defn fatdeb
([project] (fatdeb project true))
([project uberjar?]
(reset project)
(when uberjar? (uberjar project))
(dpkg project (make-deb-dir project))
(cleanup project)))