/mandos/release

To get this branch, use:
bzr branch http://bzr.recompile.se/loggerhead/mandos/release

« back to all changes in this revision

Viewing changes to Makefile

  • Committer: Teddy Hogeborn
  • Date: 2024-09-09 01:36:41 UTC
  • mto: This revision was merged to the branch mainline in revision 410.
  • Revision ID: teddy@recompile.se-20240909013641-6zu6kx2f7meu134k
Make all required directories when installing

When installing into a normal system, one can assume that target
directories, such as /usr/bin, already exists.  But when installing
into a subdirectory for the purpose of creating a package, one cannot
assume that all directories already exist.  Therefore, when
installing, we must not check if any directories exist, and must
instead always create any directories we want to install into.

* Makefile (confdir/mandos.conf, confdir/clients.conf, install-html):
  Use the "-D" option to "install" instead of creating the directory
  separately.
  (install-server): Move creation of $(CONFDIR) down to before it is
  needed.  Don't check if the $(TMPFILES) or $(SYSUSERS) directories
  exist; instead create them by using the "-D" option to "install".
  Create the $(PREFIX)/sbin directory.  Always use
  "--target-directory" if possible; i.e. if the file name is the same.
  Create the $(DBUSPOLICYDIR) and $(DESTDIR)/etc/init.d directories by
  using the "-D" option to "install".  Don't check if the $(SYSTEMD)
  directory exists; instead create it by using the "-D" option to
  "install".  Create the $(DESTDIR)/etc/default and $(MANDIR)/man8
  directories by using the "-D" option to "install".  Create the
  $(MANDIR)/man5 directories explicitly.
  (install-client-nokey): Remove unnecessary creation of the
  $(CONFDIR) directory.  Don't check if the $(SYSUSERS) directory
  exists; instead create it by using the "-D" option to "install".
  Move the "--directory" argument to be the first argument, for
  clarity.  Create the $(PREFIX)/sbin directory.  Use the "-D"
  argument to "install" when installing
  $(INITRAMFSTOOLS)/hooks/mandos,
  $(INITRAMFSTOOLS)/conf.d/mandos-conf,
  $(INITRAMFSTOOLS)/conf-hooks.d/zz-mandos,
  $(INITRAMFSTOOLS)/scripts/init-premount/mandos,
  $(INITRAMFSTOOLS)/scripts/local-premount/mandos,
  $(DRACUTMODULE)/ask-password-mandos.path, and
  $(DRACUTMODULE)/dracut-module/ask-password-mandos.service.  Create
  the $(MANDIR)/man8 directory.

Reported-By: Erich Eckner <erich@eckner.net>
Thanks: Erich Eckner <erich@eckner.net> for analysis

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
WARN=-O -Wall -Wextra -Wdouble-promotion -Wformat=2 -Winit-self \
 
1
WARN:=-O -Wall -Wextra -Wdouble-promotion -Wformat=2 -Winit-self \
2
2
        -Wmissing-include-dirs -Wswitch-default -Wswitch-enum \
3
3
        -Wunused -Wuninitialized -Wstrict-overflow=5 \
4
4
        -Wsuggest-attribute=pure -Wsuggest-attribute=const \
10
10
        -Wmissing-format-attribute -Wnormalized=nfc -Wpacked \
11
11
        -Wredundant-decls -Wnested-externs -Winline -Wvla \
12
12
        -Wvolatile-register-var -Woverlength-strings
13
 
#DEBUG=-ggdb3
14
 
# For info about _FORTIFY_SOURCE, see feature_test_macros(7)
15
 
# and <http://gcc.gnu.org/ml/gcc-patches/2004-09/msg02055.html>.
16
 
FORTIFY=-D_FORTIFY_SOURCE=2 -fstack-protector-all -fPIC
 
13
 
 
14
#DEBUG:=-ggdb3 -fsanitize=address $(SANITIZE)
 
15
## Check which sanitizing options can be used
 
16
#SANITIZE:=$(foreach option,$(ALL_SANITIZE_OPTIONS),$(shell \
 
17
#       echo 'int main(){}' | $(CC) --language=c $(option) \
 
18
#       /dev/stdin -o /dev/null >/dev/null 2>&1 && echo $(option)))
17
19
# <https://developerblog.redhat.com/2014/10/16/gcc-undefined-behavior-sanitizer-ubsan/>
18
 
ALL_SANITIZE_OPTIONS:=-fsanitize=address -fsanitize=undefined \
 
20
ALL_SANITIZE_OPTIONS:=-fsanitize=leak -fsanitize=undefined \
19
21
        -fsanitize=shift -fsanitize=integer-divide-by-zero \
20
22
        -fsanitize=unreachable -fsanitize=vla-bound -fsanitize=null \
21
23
        -fsanitize=return -fsanitize=signed-integer-overflow \
23
25
        -fsanitize=object-size -fsanitize=float-divide-by-zero \
24
26
        -fsanitize=float-cast-overflow -fsanitize=nonnull-attribute \
25
27
        -fsanitize=returns-nonnull-attribute -fsanitize=bool \
26
 
        -fsanitize=enum
27
 
# Check which sanitizing options can be used
28
 
SANITIZE:=$(foreach option,$(ALL_SANITIZE_OPTIONS),$(shell \
29
 
        echo 'int main(){}' | $(CC) --language=c $(option) /dev/stdin \
30
 
        -o /dev/null >/dev/null 2>&1 && echo $(option)))
31
 
LINK_FORTIFY_LD=-z relro -z now
32
 
LINK_FORTIFY=
 
28
        -fsanitize=enum -fsanitize-address-use-after-scope
 
29
 
 
30
# For info about _FORTIFY_SOURCE, see feature_test_macros(7)
 
31
# and <https://gcc.gnu.org/ml/gcc-patches/2004-09/msg02055.html>.
 
32
FORTIFY:=-fstack-protector-all -fPIC
 
33
CPPFLAGS+=-D_FORTIFY_SOURCE=3
 
34
LINK_FORTIFY_LD:=-z relro -z now
 
35
LINK_FORTIFY:=
33
36
 
34
37
# If BROKEN_PIE is set, do not build with -pie
35
38
ifndef BROKEN_PIE
37
40
LINK_FORTIFY += -pie
38
41
endif
39
42
#COVERAGE=--coverage
40
 
OPTIMIZE=-Os -fno-strict-aliasing
41
 
LANGUAGE=-std=gnu11
42
 
htmldir=man
43
 
version=1.7.3
44
 
SED=sed
45
 
 
46
 
USER=$(firstword $(subst :, ,$(shell getent passwd _mandos || getent passwd nobody || echo 65534)))
47
 
GROUP=$(firstword $(subst :, ,$(shell getent group _mandos || getent group nogroup || echo 65534)))
 
43
OPTIMIZE:=-Os -fno-strict-aliasing
 
44
LANGUAGE:=-std=gnu11
 
45
CPPFLAGS+=-D_FILE_OFFSET_BITS=64 -D_TIME_BITS=64
 
46
htmldir:=man
 
47
version:=1.8.16
 
48
SED:=sed
 
49
PKG_CONFIG?=pkg-config
 
50
 
 
51
USER:=$(firstword $(subst :, ,$(shell getent passwd _mandos \
 
52
        || getent passwd nobody || echo 65534)))
 
53
GROUP:=$(firstword $(subst :, ,$(shell getent group _mandos \
 
54
        || getent group nogroup || echo 65534)))
 
55
 
 
56
LINUXVERSION:=$(shell uname --kernel-release)
48
57
 
49
58
## Use these settings for a traditional /usr/local install
50
 
# PREFIX=$(DESTDIR)/usr/local
51
 
# CONFDIR=$(DESTDIR)/etc/mandos
52
 
# KEYDIR=$(DESTDIR)/etc/mandos/keys
53
 
# MANDIR=$(PREFIX)/man
54
 
# INITRAMFSTOOLS=$(DESTDIR)/etc/initramfs-tools
55
 
# STATEDIR=$(DESTDIR)/var/lib/mandos
56
 
# LIBDIR=$(PREFIX)/lib
 
59
# PREFIX:=$(DESTDIR)/usr/local
 
60
# CONFDIR:=$(DESTDIR)/etc/mandos
 
61
# KEYDIR:=$(DESTDIR)/etc/mandos/keys
 
62
# MANDIR:=$(PREFIX)/man
 
63
# INITRAMFSTOOLS:=$(DESTDIR)/etc/initramfs-tools
 
64
# DRACUTMODULE:=$(DESTDIR)/usr/lib/dracut/modules.d/90mandos
 
65
# STATEDIR:=$(DESTDIR)/var/lib/mandos
 
66
# LIBDIR:=$(PREFIX)/lib
 
67
# DBUSPOLICYDIR:=$(DESTDIR)/etc/dbus-1/system.d
57
68
##
58
69
 
59
70
## These settings are for a package-type install
60
 
PREFIX=$(DESTDIR)/usr
61
 
CONFDIR=$(DESTDIR)/etc/mandos
62
 
KEYDIR=$(DESTDIR)/etc/keys/mandos
63
 
MANDIR=$(PREFIX)/share/man
64
 
INITRAMFSTOOLS=$(DESTDIR)/usr/share/initramfs-tools
65
 
STATEDIR=$(DESTDIR)/var/lib/mandos
66
 
LIBDIR=$(shell \
 
71
PREFIX:=$(DESTDIR)/usr
 
72
CONFDIR:=$(DESTDIR)/etc/mandos
 
73
KEYDIR:=$(DESTDIR)/etc/keys/mandos
 
74
MANDIR:=$(PREFIX)/share/man
 
75
INITRAMFSTOOLS:=$(DESTDIR)/usr/share/initramfs-tools
 
76
DRACUTMODULE:=$(DESTDIR)/usr/lib/dracut/modules.d/90mandos
 
77
STATEDIR:=$(DESTDIR)/var/lib/mandos
 
78
LIBDIR:=$(shell \
67
79
        for d in \
68
 
        "/usr/lib/`dpkg-architecture -qDEB_HOST_MULTIARCH 2>/dev/null`" \
 
80
        "/usr/lib/`dpkg-architecture \
 
81
                        -qDEB_HOST_MULTIARCH 2>/dev/null`" \
69
82
        "`rpm --eval='%{_libdir}' 2>/dev/null`" /usr/lib; do \
70
83
                if [ -d "$$d" -a "$$d" = "$${d%/}" ]; then \
71
84
                        echo "$(DESTDIR)$$d"; \
72
85
                        break; \
73
86
                fi; \
74
87
        done)
 
88
DBUSPOLICYDIR:=$(DESTDIR)/usr/share/dbus-1/system.d
75
89
##
76
90
 
77
 
SYSTEMD=$(DESTDIR)$(shell pkg-config systemd --variable=systemdsystemunitdir)
 
91
SYSTEMD:=$(DESTDIR)$(shell $(PKG_CONFIG) systemd \
 
92
                        --variable=systemdsystemunitdir)
 
93
TMPFILES:=$(DESTDIR)$(shell $(PKG_CONFIG) systemd \
 
94
                        --variable=tmpfilesdir)
 
95
SYSUSERS:=$(DESTDIR)$(shell $(PKG_CONFIG) systemd \
 
96
                        --variable=sysusersdir)
78
97
 
79
 
GNUTLS_CFLAGS=$(shell pkg-config --cflags-only-I gnutls)
80
 
GNUTLS_LIBS=$(shell pkg-config --libs gnutls)
81
 
AVAHI_CFLAGS=$(shell pkg-config --cflags-only-I avahi-core)
82
 
AVAHI_LIBS=$(shell pkg-config --libs avahi-core)
83
 
GPGME_CFLAGS=$(shell gpgme-config --cflags; getconf LFS_CFLAGS)
84
 
GPGME_LIBS=$(shell gpgme-config --libs; getconf LFS_LIBS; \
 
98
GNUTLS_CFLAGS:=$(shell $(PKG_CONFIG) --cflags-only-I gnutls)
 
99
GNUTLS_LIBS:=$(shell $(PKG_CONFIG) --libs gnutls)
 
100
AVAHI_CFLAGS:=$(shell $(PKG_CONFIG) --cflags-only-I avahi-core)
 
101
AVAHI_LIBS:=$(shell $(PKG_CONFIG) --libs avahi-core)
 
102
GPGME_CFLAGS:=$(shell $(PKG_CONFIG) --cflags-only-I gpgme 2>/dev/null \
 
103
        || gpgme-config --cflags; getconf LFS_CFLAGS)
 
104
GPGME_LIBS:=$(shell $(PKG_CONFIG) --libs gpgme 2>/dev/null \
 
105
        || gpgme-config --libs; getconf LFS_LIBS; \
85
106
        getconf LFS_LDFLAGS)
86
 
LIBNL3_CFLAGS=$(shell pkg-config --cflags-only-I libnl-route-3.0)
87
 
LIBNL3_LIBS=$(shell pkg-config --libs libnl-route-3.0)
 
107
LIBNL3_CFLAGS:=$(shell $(PKG_CONFIG) --cflags-only-I libnl-route-3.0)
 
108
LIBNL3_LIBS:=$(shell $(PKG_CONFIG) --libs libnl-route-3.0)
 
109
GLIB_CFLAGS:=$(shell $(PKG_CONFIG) --cflags glib-2.0)
 
110
GLIB_LIBS:=$(shell $(PKG_CONFIG) --libs glib-2.0)
88
111
 
89
112
# Do not change these two
90
 
CFLAGS+=$(WARN) $(DEBUG) $(FORTIFY) $(SANITIZE) $(COVERAGE) \
91
 
        $(OPTIMIZE) $(LANGUAGE) $(GNUTLS_CFLAGS) $(AVAHI_CFLAGS) \
92
 
        $(GPGME_CFLAGS) -DVERSION='"$(version)"'
93
 
LDFLAGS+=-Xlinker --as-needed $(COVERAGE) $(LINK_FORTIFY) $(foreach flag,$(LINK_FORTIFY_LD),-Xlinker $(flag))
 
113
CFLAGS+=$(WARN) $(DEBUG) $(FORTIFY) $(COVERAGE) $(OPTIMIZE) \
 
114
        $(LANGUAGE) -DVERSION='"$(version)"'
 
115
LDFLAGS+=-Xlinker --as-needed $(COVERAGE) $(LINK_FORTIFY) $(strip \
 
116
        ) $(foreach flag,$(LINK_FORTIFY_LD),-Xlinker $(flag))
94
117
 
95
118
# Commands to format a DocBook <refentry> document into a manual page
96
119
DOCBOOKTOMAN=$(strip cd $(dir $<); xsltproc --nonet --xinclude \
102
125
        /usr/share/xml/docbook/stylesheet/nwalsh/manpages/docbook.xsl \
103
126
        $(notdir $<); \
104
127
        if locale --all 2>/dev/null | grep --regexp='^en_US\.utf8$$' \
105
 
        && type man 2>/dev/null; then LANG=en_US.UTF-8 MANWIDTH=80 \
106
 
        man --warnings --encoding=UTF-8 --local-file $(notdir $@); \
107
 
        fi >/dev/null)
 
128
        && command -v man >/dev/null; then LANG=en_US.UTF-8 \
 
129
        MANWIDTH=80 man --warnings --encoding=UTF-8 --local-file \
 
130
        $(notdir $@); fi >/dev/null)
108
131
 
109
132
DOCBOOKTOHTML=$(strip xsltproc --nonet --xinclude \
110
133
        --param make.year.ranges                1 \
116
139
        /usr/share/xml/docbook/stylesheet/nwalsh/xhtml/docbook.xsl \
117
140
        $<; $(HTMLPOST) $@)
118
141
# Fix citerefentry links
119
 
HTMLPOST=$(SED) --in-place \
 
142
HTMLPOST:=$(SED) --in-place \
120
143
        --expression='s/\(<a class="citerefentry" href="\)\("><span class="citerefentry"><span class="refentrytitle">\)\([^<]*\)\(<\/span>(\)\([^)]*\)\()<\/span><\/a>\)/\1\3.\5\2\3\4\5\6/g'
121
144
 
122
 
PLUGINS=plugins.d/password-prompt plugins.d/mandos-client \
 
145
PLUGINS:=plugins.d/password-prompt plugins.d/mandos-client \
123
146
        plugins.d/usplash plugins.d/splashy plugins.d/askpass-fifo \
124
147
        plugins.d/plymouth
125
 
PLUGIN_HELPERS=plugin-helpers/mandos-client-iprouteadddel
126
 
CPROGS=plugin-runner $(PLUGINS) $(PLUGIN_HELPERS)
127
 
PROGS=mandos mandos-keygen mandos-ctl mandos-monitor $(CPROGS)
128
 
DOCS=mandos.8 mandos-keygen.8 mandos-monitor.8 mandos-ctl.8 \
 
148
PLUGIN_HELPERS:=plugin-helpers/mandos-client-iprouteadddel
 
149
CPROGS:=plugin-runner dracut-module/password-agent $(PLUGINS) \
 
150
        $(PLUGIN_HELPERS)
 
151
PROGS:=mandos mandos-keygen mandos-ctl mandos-monitor $(CPROGS)
 
152
DOCS:=mandos.8 mandos-keygen.8 mandos-monitor.8 mandos-ctl.8 \
129
153
        mandos.conf.5 mandos-clients.conf.5 plugin-runner.8mandos \
 
154
        dracut-module/password-agent.8mandos \
130
155
        plugins.d/mandos-client.8mandos \
131
156
        plugins.d/password-prompt.8mandos plugins.d/usplash.8mandos \
132
157
        plugins.d/splashy.8mandos plugins.d/askpass-fifo.8mandos \
133
158
        plugins.d/plymouth.8mandos intro.8mandos
134
159
 
135
 
htmldocs=$(addsuffix .xhtml,$(DOCS))
136
 
 
137
 
objects=$(addsuffix .o,$(CPROGS))
138
 
 
 
160
htmldocs:=$(addsuffix .xhtml,$(DOCS))
 
161
 
 
162
objects:=$(addsuffix .o,$(CPROGS))
 
163
 
 
164
.PHONY: all
139
165
all: $(PROGS) mandos.lsm
140
166
 
 
167
.PHONY: doc
141
168
doc: $(DOCS)
142
169
 
 
170
.PHONY: html
143
171
html: $(htmldocs)
144
172
 
145
173
%.5: %.xml common.ent legalnotice.xml
204
232
                overview.xml legalnotice.xml
205
233
        $(DOCBOOKTOHTML)
206
234
 
 
235
dracut-module/password-agent.8mandos: \
 
236
                dracut-module/password-agent.xml common.ent \
 
237
                overview.xml legalnotice.xml
 
238
        $(DOCBOOKTOMAN)
 
239
dracut-module/password-agent.8mandos.xhtml: \
 
240
                dracut-module/password-agent.xml common.ent \
 
241
                overview.xml legalnotice.xml
 
242
        $(DOCBOOKTOHTML)
 
243
 
207
244
plugins.d/mandos-client.8mandos: plugins.d/mandos-client.xml \
208
245
                                        common.ent \
209
246
                                        mandos-options.xml \
252
289
                --expression='s/\(mandos_\)[0-9.]\+\(\.orig\.tar\.gz\)/\1$(version)\2/' \
253
290
                $@)
254
291
 
255
 
plugins.d/mandos-client: plugins.d/mandos-client.c
256
 
        $(LINK.c) $^ -lrt $(GNUTLS_LIBS) $(AVAHI_LIBS) $(strip\
257
 
                ) $(GPGME_LIBS) $(LOADLIBES) $(LDLIBS) -o $@
258
 
 
259
 
plugin-helpers/mandos-client-iprouteadddel: plugin-helpers/mandos-client-iprouteadddel.c
260
 
        $(LINK.c) $(LIBNL3_CFLAGS) $^ $(LIBNL3_LIBS) $(strip\
261
 
                ) $(LOADLIBES) $(LDLIBS) -o $@
262
 
 
263
 
.PHONY : all doc html clean distclean mostlyclean maintainer-clean \
264
 
        check run-client run-server install install-html \
265
 
        install-server install-client-nokey install-client uninstall \
266
 
        uninstall-server uninstall-client purge purge-server \
267
 
        purge-client
268
 
 
 
292
# Need to add the GnuTLS, Avahi and GPGME libraries
 
293
plugins.d/mandos-client: CFLAGS += $(GNUTLS_CFLAGS) $(strip \
 
294
        ) $(AVAHI_CFLAGS) $(GPGME_CFLAGS)
 
295
plugins.d/mandos-client: LDLIBS += $(GNUTLS_LIBS) $(strip \
 
296
        ) $(AVAHI_LIBS) $(GPGME_LIBS)
 
297
 
 
298
# Need to add the libnl-route library
 
299
plugin-helpers/mandos-client-iprouteadddel: CFLAGS += $(LIBNL3_CFLAGS)
 
300
plugin-helpers/mandos-client-iprouteadddel: LDLIBS += $(LIBNL3_LIBS)
 
301
 
 
302
# Need to add the GLib and pthread libraries
 
303
dracut-module/password-agent: CFLAGS += $(GLIB_CFLAGS)
 
304
# Note: -lpthread is unnecessary with the GNU C library 2.34 or later
 
305
dracut-module/password-agent: LDLIBS += $(GLIB_LIBS) -lpthread
 
306
 
 
307
.PHONY: clean
269
308
clean:
270
309
        -rm --force $(CPROGS) $(objects) $(htmldocs) $(DOCS) core
271
310
 
 
311
.PHONY: distclean
272
312
distclean: clean
 
313
.PHONY: mostlyclean
273
314
mostlyclean: clean
 
315
.PHONY: maintainer-clean
274
316
maintainer-clean: clean
275
317
        -rm --force --recursive keydir confdir statedir
276
318
 
277
 
check:  all
 
319
.PHONY: check
 
320
check: all
278
321
        ./mandos --check
279
322
        ./mandos-ctl --check
 
323
        ./mandos-keygen --version
 
324
        ./plugin-runner --version
 
325
        ./plugin-helpers/mandos-client-iprouteadddel --version
 
326
        ./dracut-module/password-agent --test
280
327
 
281
328
# Run the client with a local config and key
282
 
run-client: all keydir/seckey.txt keydir/pubkey.txt
283
 
        @echo "###################################################################"
284
 
        @echo "# The following error messages are harmless and can be safely     #"
285
 
        @echo "# ignored.  The messages are caused by not running as root, but   #"
286
 
        @echo "# you should NOT run \"make run-client\" as root unless you also    #"
287
 
        @echo "# unpacked and compiled Mandos as root, which is NOT recommended. #"
288
 
        @echo "# From plugin-runner: setgid: Operation not permitted             #"
289
 
        @echo "#                     setuid: Operation not permitted             #"
290
 
        @echo "# From askpass-fifo:  mkfifo: Permission denied                   #"
291
 
        @echo "# From mandos-client:                                             #"
292
 
        @echo "#             Failed to raise privileges: Operation not permitted #"
293
 
        @echo "#             Warning: network hook \"*\" exited with status *      #"
294
 
        @echo "###################################################################"
 
329
.PHONY: run-client
 
330
run-client: all keydir/seckey.txt keydir/pubkey.txt \
 
331
                        keydir/tls-privkey.pem keydir/tls-pubkey.pem
 
332
        @echo '######################################################'
 
333
        @echo '# The following error messages are harmless and can  #'
 
334
        @echo '#  be safely ignored:                                #'
 
335
        @echo '## From plugin-runner:                               #'
 
336
        @echo '# setgid: Operation not permitted                    #'
 
337
        @echo '# setuid: Operation not permitted                    #'
 
338
        @echo '## From askpass-fifo:                                #'
 
339
        @echo '# mkfifo: Permission denied                          #'
 
340
        @echo '## From mandos-client:                               #'
 
341
        @echo '# Failed to raise privileges: Operation not permi... #'
 
342
        @echo '# Warning: network hook "*" exited with status *     #'
 
343
        @echo '# ioctl SIOCSIFFLAGS +IFF_UP: Operation not permi... #'
 
344
        @echo '# Failed to bring up interface "*": Operation not... #'
 
345
        @echo '#                                                    #'
 
346
        @echo '# (The messages are caused by not running as root,   #'
 
347
        @echo '# but you should NOT run "make run-client" as root   #'
 
348
        @echo '# unless you also unpacked and compiled Mandos as    #'
 
349
        @echo '# root, which is also NOT recommended.)              #'
 
350
        @echo '######################################################'
295
351
# We set GNOME_KEYRING_CONTROL to block pam_gnome_keyring
296
352
        ./plugin-runner --plugin-dir=plugins.d \
297
353
                --plugin-helper-dir=plugin-helpers \
298
354
                --config-file=plugin-runner.conf \
299
 
                --options-for=mandos-client:--seckey=keydir/seckey.txt,--pubkey=keydir/pubkey.txt,--network-hook-dir=network-hooks.d \
 
355
                --options-for=mandos-client:--seckey=keydir/seckey.txt,--pubkey=keydir/pubkey.txt,--tls-privkey=keydir/tls-privkey.pem,--tls-pubkey=keydir/tls-pubkey.pem,--network-hook-dir=network-hooks.d \
300
356
                --env-for=mandos-client:GNOME_KEYRING_CONTROL= \
301
357
                $(CLIENTARGS)
302
358
 
303
359
# Used by run-client
304
 
keydir/seckey.txt keydir/pubkey.txt: mandos-keygen
 
360
keydir/seckey.txt keydir/pubkey.txt keydir/tls-privkey.pem keydir/tls-pubkey.pem: mandos-keygen
305
361
        install --directory keydir
306
362
        ./mandos-keygen --dir keydir --force
 
363
        if ! [ -e keydir/tls-privkey.pem ]; then \
 
364
                install --mode=u=rw /dev/null keydir/tls-privkey.pem; \
 
365
        fi
 
366
        if ! [ -e keydir/tls-pubkey.pem ]; then \
 
367
                install --mode=u=rw /dev/null keydir/tls-pubkey.pem; \
 
368
        fi
307
369
 
308
370
# Run the server with a local config
 
371
.PHONY: run-server
309
372
run-server: confdir/mandos.conf confdir/clients.conf statedir
310
373
        ./mandos --debug --no-dbus --configdir=confdir \
311
374
                --statedir=statedir $(SERVERARGS)
312
375
 
313
376
# Used by run-server
314
377
confdir/mandos.conf: mandos.conf
315
 
        install --directory confdir
316
 
        install --mode=u=rw,go=r $^ $@
317
 
confdir/clients.conf: clients.conf keydir/seckey.txt
318
 
        install --directory confdir
319
 
        install --mode=u=rw $< $@
 
378
        install -D --mode=u=rw,go=r $^ $@
 
379
confdir/clients.conf: clients.conf keydir/seckey.txt keydir/tls-pubkey.pem
 
380
        install -D --mode=u=rw $< $@
320
381
# Add a client password
321
382
        ./mandos-keygen --dir keydir --password --no-ssh >> $@
322
383
statedir:
323
384
        install --directory statedir
324
385
 
 
386
.PHONY: install
325
387
install: install-server install-client-nokey
326
388
 
 
389
.PHONY: install-html
327
390
install-html: html
328
 
        install --directory $(htmldir)
329
 
        install --mode=u=rw,go=r --target-directory=$(htmldir) \
 
391
        install -D --mode=u=rw,go=r --target-directory=$(htmldir) \
330
392
                $(htmldocs)
331
393
 
 
394
.PHONY: install-server
332
395
install-server: doc
333
 
        install --directory $(CONFDIR)
334
396
        if install --directory --mode=u=rwx --owner=$(USER) \
335
397
                --group=$(GROUP) $(STATEDIR); then \
336
398
                :; \
337
399
        elif install --directory --mode=u=rwx $(STATEDIR); then \
338
400
                chown -- $(USER):$(GROUP) $(STATEDIR) || :; \
339
401
        fi
340
 
        install --mode=u=rwx,go=rx mandos $(PREFIX)/sbin/mandos
 
402
        if [ "$(TMPFILES)" != "$(DESTDIR)" ]; then \
 
403
                install -D --mode=u=rw,go=r tmpfiles.d-mandos.conf \
 
404
                        $(TMPFILES)/mandos.conf; \
 
405
        fi
 
406
        if [ "$(SYSUSERS)" != "$(DESTDIR)" ]; then \
 
407
                install -D --mode=u=rw,go=r sysusers.d-mandos.conf \
 
408
                        $(SYSUSERS)/mandos.conf; \
 
409
        fi
 
410
        install --directory $(PREFIX)/sbin
 
411
        install --mode=u=rwx,go=rx --target-directory=$(PREFIX)/sbin \
 
412
                mandos
341
413
        install --mode=u=rwx,go=rx --target-directory=$(PREFIX)/sbin \
342
414
                mandos-ctl
343
415
        install --mode=u=rwx,go=rx --target-directory=$(PREFIX)/sbin \
344
416
                mandos-monitor
 
417
        install --directory $(CONFDIR)
345
418
        install --mode=u=rw,go=r --target-directory=$(CONFDIR) \
346
419
                mandos.conf
347
420
        install --mode=u=rw --target-directory=$(CONFDIR) \
348
421
                clients.conf
349
 
        install --mode=u=rw,go=r dbus-mandos.conf \
350
 
                $(DESTDIR)/etc/dbus-1/system.d/mandos.conf
351
 
        install --mode=u=rwx,go=rx init.d-mandos \
 
422
        install -D --mode=u=rw,go=r dbus-mandos.conf \
 
423
                $(DBUSPOLICYDIR)/mandos.conf
 
424
        install -D --mode=u=rwx,go=rx init.d-mandos \
352
425
                $(DESTDIR)/etc/init.d/mandos
353
 
        if [ "$(SYSTEMD)" != "$(DESTDIR)" -a -d "$(SYSTEMD)" ]; then \
354
 
                install --mode=u=rw,go=r mandos.service $(SYSTEMD); \
 
426
        if [ "$(SYSTEMD)" != "$(DESTDIR)" ]; then \
 
427
                install -D --mode=u=rw,go=r mandos.service \
 
428
                        $(SYSTEMD); \
355
429
        fi
356
 
        install --mode=u=rw,go=r default-mandos \
 
430
        install -D --mode=u=rw,go=r default-mandos \
357
431
                $(DESTDIR)/etc/default/mandos
358
432
        if [ -z $(DESTDIR) ]; then \
359
433
                update-rc.d mandos defaults 25 15;\
360
434
        fi
 
435
        install --directory $(MANDIR)/man8 $(MANDIR)/man5
361
436
        gzip --best --to-stdout mandos.8 \
362
437
                > $(MANDIR)/man8/mandos.8.gz
363
438
        gzip --best --to-stdout mandos-monitor.8 \
371
446
        gzip --best --to-stdout intro.8mandos \
372
447
                > $(MANDIR)/man8/intro.8mandos.gz
373
448
 
 
449
.PHONY: install-client-nokey
374
450
install-client-nokey: all doc
375
 
        install --directory $(LIBDIR)/mandos $(CONFDIR)
376
451
        install --directory --mode=u=rwx $(KEYDIR) \
377
452
                $(LIBDIR)/mandos/plugins.d \
378
453
                $(LIBDIR)/mandos/plugin-helpers
 
454
        if [ "$(SYSUSERS)" != "$(DESTDIR)" ]; then \
 
455
                install -D --mode=u=rw,go=r sysusers.d-mandos.conf \
 
456
                        $(SYSUSERS)/mandos-client.conf; \
 
457
        fi
379
458
        if [ "$(CONFDIR)" != "$(LIBDIR)/mandos" ]; then \
380
 
                install --mode=u=rwx \
381
 
                        --directory "$(CONFDIR)/plugins.d"; \
382
 
                install --directory "$(CONFDIR)/plugin-helpers"; \
 
459
                install --directory \
 
460
                        --mode=u=rwx "$(CONFDIR)/plugins.d" \
 
461
                        "$(CONFDIR)/plugin-helpers"; \
383
462
        fi
384
 
        install --mode=u=rwx,go=rx --directory \
 
463
        install --directory --mode=u=rwx,go=rx \
385
464
                "$(CONFDIR)/network-hooks.d"
386
465
        install --mode=u=rwx,go=rx \
387
466
                --target-directory=$(LIBDIR)/mandos plugin-runner
 
467
        install --mode=u=rwx,go=rx \
 
468
                --target-directory=$(LIBDIR)/mandos \
 
469
                mandos-to-cryptroot-unlock
 
470
        install --directory $(PREFIX)/sbin
388
471
        install --mode=u=rwx,go=rx --target-directory=$(PREFIX)/sbin \
389
472
                mandos-keygen
390
473
        install --mode=u=rwx,go=rx \
405
488
        install --mode=u=rwxs,go=rx \
406
489
                --target-directory=$(LIBDIR)/mandos/plugins.d \
407
490
                plugins.d/plymouth
408
 
        install --mode=u=rwxs,go=rx \
 
491
        install --mode=u=rwx,go=rx \
409
492
                --target-directory=$(LIBDIR)/mandos/plugin-helpers \
410
493
                plugin-helpers/mandos-client-iprouteadddel
411
 
        install initramfs-tools-hook \
 
494
        install -D initramfs-tools-hook \
412
495
                $(INITRAMFSTOOLS)/hooks/mandos
413
 
        install --mode=u=rw,go=r initramfs-tools-hook-conf \
414
 
                $(INITRAMFSTOOLS)/conf-hooks.d/mandos
415
 
        install initramfs-tools-script \
 
496
        install -D --mode=u=rw,go=r initramfs-tools-conf \
 
497
                $(INITRAMFSTOOLS)/conf.d/mandos-conf
 
498
        install -D --mode=u=rw,go=r initramfs-tools-conf-hook \
 
499
                $(INITRAMFSTOOLS)/conf-hooks.d/zz-mandos
 
500
        install -D initramfs-tools-script \
416
501
                $(INITRAMFSTOOLS)/scripts/init-premount/mandos
 
502
        install -D initramfs-tools-script-stop \
 
503
                $(INITRAMFSTOOLS)/scripts/local-premount/mandos
 
504
        install -D --mode=u=rw,go=r \
 
505
                --target-directory=$(DRACUTMODULE) \
 
506
                dracut-module/ask-password-mandos.path \
 
507
                dracut-module/ask-password-mandos.service
 
508
        install --mode=u=rwxs,go=rx \
 
509
                --target-directory=$(DRACUTMODULE) \
 
510
                dracut-module/module-setup.sh \
 
511
                dracut-module/cmdline-mandos.sh \
 
512
                dracut-module/password-agent
417
513
        install --mode=u=rw,go=r plugin-runner.conf $(CONFDIR)
 
514
        install --directory $(MANDIR)/man8
418
515
        gzip --best --to-stdout mandos-keygen.8 \
419
516
                > $(MANDIR)/man8/mandos-keygen.8.gz
420
517
        gzip --best --to-stdout plugin-runner.8mandos \
431
528
                > $(MANDIR)/man8/askpass-fifo.8mandos.gz
432
529
        gzip --best --to-stdout plugins.d/plymouth.8mandos \
433
530
                > $(MANDIR)/man8/plymouth.8mandos.gz
 
531
        gzip --best --to-stdout dracut-module/password-agent.8mandos \
 
532
                > $(MANDIR)/man8/password-agent.8mandos.gz
434
533
 
 
534
.PHONY: install-client
435
535
install-client: install-client-nokey
436
536
# Post-installation stuff
437
537
        -$(PREFIX)/sbin/mandos-keygen --dir "$(KEYDIR)"
438
 
        update-initramfs -k all -u
 
538
        if command -v update-initramfs >/dev/null; then \
 
539
            update-initramfs -k all -u; \
 
540
        elif command -v dracut >/dev/null; then \
 
541
            for initrd in $(DESTDIR)/boot/initr*-$(LINUXVERSION); do \
 
542
                if [ -w "$$initrd" ]; then \
 
543
                    chmod go-r "$$initrd"; \
 
544
                    dracut --force "$$initrd"; \
 
545
                fi; \
 
546
            done; \
 
547
        fi
439
548
        echo "Now run mandos-keygen --password --dir $(KEYDIR)"
440
549
 
 
550
.PHONY: uninstall
441
551
uninstall: uninstall-server uninstall-client
442
552
 
 
553
.PHONY: uninstall-server
443
554
uninstall-server:
444
555
        -rm --force $(PREFIX)/sbin/mandos \
445
556
                $(PREFIX)/sbin/mandos-ctl \
452
563
        update-rc.d -f mandos remove
453
564
        -rmdir $(CONFDIR)
454
565
 
 
566
.PHONY: uninstall-client
455
567
uninstall-client:
456
568
# Refuse to uninstall client if /etc/crypttab is explicitly configured
457
569
# to use it.
468
580
                $(INITRAMFSTOOLS)/hooks/mandos \
469
581
                $(INITRAMFSTOOLS)/conf-hooks.d/mandos \
470
582
                $(INITRAMFSTOOLS)/scripts/init-premount/mandos \
 
583
                $(INITRAMFSTOOLS)/scripts/local-premount/mandos \
 
584
                $(DRACUTMODULE)/ask-password-mandos.path \
 
585
                $(DRACUTMODULE)/ask-password-mandos.service \
 
586
                $(DRACUTMODULE)/module-setup.sh \
 
587
                $(DRACUTMODULE)/cmdline-mandos.sh \
 
588
                $(DRACUTMODULE)/password-agent \
471
589
                $(MANDIR)/man8/mandos-keygen.8.gz \
472
590
                $(MANDIR)/man8/plugin-runner.8mandos.gz \
473
591
                $(MANDIR)/man8/mandos-client.8mandos.gz
476
594
                $(MANDIR)/man8/splashy.8mandos.gz \
477
595
                $(MANDIR)/man8/askpass-fifo.8mandos.gz \
478
596
                $(MANDIR)/man8/plymouth.8mandos.gz \
 
597
                $(MANDIR)/man8/password-agent.8mandos.gz \
479
598
        -rmdir $(LIBDIR)/mandos/plugins.d $(CONFDIR)/plugins.d \
480
 
                 $(LIBDIR)/mandos $(CONFDIR) $(KEYDIR)
481
 
        update-initramfs -k all -u
 
599
                 $(LIBDIR)/mandos $(CONFDIR) $(KEYDIR) $(DRACUTMODULE)
 
600
        if command -v update-initramfs >/dev/null; then \
 
601
            update-initramfs -k all -u; \
 
602
        elif command -v dracut >/dev/null; then \
 
603
            for initrd in $(DESTDIR)/boot/initr*-$(LINUXVERSION); do \
 
604
                test -w "$$initrd" && dracut --force "$$initrd"; \
 
605
            done; \
 
606
        fi
482
607
 
 
608
.PHONY: purge
483
609
purge: purge-server purge-client
484
610
 
 
611
.PHONY: purge-server
485
612
purge-server: uninstall-server
486
613
        -rm --force $(CONFDIR)/mandos.conf $(CONFDIR)/clients.conf \
487
614
                $(DESTDIR)/etc/dbus-1/system.d/mandos.conf
488
615
                $(DESTDIR)/etc/default/mandos \
489
616
                $(DESTDIR)/etc/init.d/mandos \
490
 
                $(SYSTEMD)/mandos.service \
491
617
                $(DESTDIR)/run/mandos.pid \
492
618
                $(DESTDIR)/var/run/mandos.pid
 
619
        if [ "$(SYSTEMD)" != "$(DESTDIR)" -a -d "$(SYSTEMD)" ]; then \
 
620
                -rm --force -- $(SYSTEMD)/mandos.service; \
 
621
        fi
493
622
        -rmdir $(CONFDIR)
494
623
 
 
624
.PHONY: purge-client
495
625
purge-client: uninstall-client
496
 
        -shred --remove $(KEYDIR)/seckey.txt
 
626
        -shred --remove $(KEYDIR)/seckey.txt $(KEYDIR)/tls-privkey.pem
497
627
        -rm --force $(CONFDIR)/plugin-runner.conf \
498
 
                $(KEYDIR)/pubkey.txt $(KEYDIR)/seckey.txt
 
628
                $(KEYDIR)/pubkey.txt $(KEYDIR)/seckey.txt \
 
629
                $(KEYDIR)/tls-pubkey.txt $(KEYDIR)/tls-privkey.txt
499
630
        -rmdir $(KEYDIR) $(CONFDIR)/plugins.d $(CONFDIR)