/mandos/trunk

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

« back to all changes in this revision

Viewing changes to Makefile

  • Committer: Teddy Hogeborn
  • Date: 2019-08-02 22:16:53 UTC
  • Revision ID: teddy@recompile.se-20190802221653-ic1iko9hbefzwsk7
Fix bug in server Debian package: Fails to start on first install

There has been a very long-standing bug where installation of the
server (the "mandos" Debian package) would fail to start the server
properly right after installation.  It would work on manual (re)start
after installation, or after reboot, and even after package purge and
reinstall, it would then work the first time.  The problem, it turns
out, is when the new "_mandos" user (and corresponding group) is
created, the D-Bus server is not reloaded, and is therefore not aware
of that user, and does not recognize the user and group name in the
/etc/dbus-1/system.d/mandos.conf file.  The Mandos server, when it
tries to start and access the D-Bus, is then not permitted to connect
to its D-Bus bus name, and disables D-Bus use as a fallback measure;
i.e. the server works, but it is not controllable via D-Bus commands
(via mandos-ctl or mandos-monitor).  The next time the D-Bus daemon is
reloaded for any reason, the new user & group would become visible to
the D-Bus daemon and after that, any restart of the Mandos server
would succeed and it would bind to its D-Bus name properly, and
thereby be visible and controllable by mandos-ctl & mandos-monitor.
This was mostly invisible when using sysvinit, but systemd makes the
problem visible since the systemd service file for the Mandos server
is configured to not consider the Mandos server "started" until the
D-Bus name has been bound; this makes the starting of the service wait
for 90 seconds and then fail with a timeout error.

Fixing this should also make the Debian CI autopkgtest tests work.

* debian/mandos.postinst (configure): After creating (or renaming)
                                      user & group, reload D-Bus
                                      daemon (if present).

Show diffs side-by-side

added added

removed removed

Lines of Context:
29
29
 
30
30
# For info about _FORTIFY_SOURCE, see feature_test_macros(7)
31
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
 
32
FORTIFY:=-D_FORTIFY_SOURCE=2 -fstack-protector-all -fPIC
34
33
LINK_FORTIFY_LD:=-z relro -z now
35
34
LINK_FORTIFY:=
36
35
 
42
41
#COVERAGE=--coverage
43
42
OPTIMIZE:=-Os -fno-strict-aliasing
44
43
LANGUAGE:=-std=gnu11
45
 
CPPFLAGS+=-D_FILE_OFFSET_BITS=64 -D_TIME_BITS=64
46
44
htmldir:=man
47
 
version:=1.8.16
 
45
version:=1.8.5
48
46
SED:=sed
49
47
PKG_CONFIG?=pkg-config
50
48
 
64
62
# DRACUTMODULE:=$(DESTDIR)/usr/lib/dracut/modules.d/90mandos
65
63
# STATEDIR:=$(DESTDIR)/var/lib/mandos
66
64
# LIBDIR:=$(PREFIX)/lib
67
 
# DBUSPOLICYDIR:=$(DESTDIR)/etc/dbus-1/system.d
68
65
##
69
66
 
70
67
## These settings are for a package-type install
85
82
                        break; \
86
83
                fi; \
87
84
        done)
88
 
DBUSPOLICYDIR:=$(DESTDIR)/usr/share/dbus-1/system.d
89
85
##
90
86
 
91
87
SYSTEMD:=$(DESTDIR)$(shell $(PKG_CONFIG) systemd \
92
88
                        --variable=systemdsystemunitdir)
93
89
TMPFILES:=$(DESTDIR)$(shell $(PKG_CONFIG) systemd \
94
90
                        --variable=tmpfilesdir)
95
 
SYSUSERS:=$(DESTDIR)$(shell $(PKG_CONFIG) systemd \
96
 
                        --variable=sysusersdir)
97
91
 
98
92
GNUTLS_CFLAGS:=$(shell $(PKG_CONFIG) --cflags-only-I gnutls)
99
93
GNUTLS_LIBS:=$(shell $(PKG_CONFIG) --libs gnutls)
100
94
AVAHI_CFLAGS:=$(shell $(PKG_CONFIG) --cflags-only-I avahi-core)
101
95
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; \
 
96
GPGME_CFLAGS:=$(shell gpgme-config --cflags; getconf LFS_CFLAGS)
 
97
GPGME_LIBS:=$(shell gpgme-config --libs; getconf LFS_LIBS; \
106
98
        getconf LFS_LDFLAGS)
107
99
LIBNL3_CFLAGS:=$(shell $(PKG_CONFIG) --cflags-only-I libnl-route-3.0)
108
100
LIBNL3_LIBS:=$(shell $(PKG_CONFIG) --libs libnl-route-3.0)
110
102
GLIB_LIBS:=$(shell $(PKG_CONFIG) --libs glib-2.0)
111
103
 
112
104
# Do not change these two
113
 
CFLAGS+=$(WARN) $(DEBUG) $(FORTIFY) $(COVERAGE) $(OPTIMIZE) \
114
 
        $(LANGUAGE) -DVERSION='"$(version)"'
 
105
CFLAGS+=$(WARN) $(DEBUG) $(FORTIFY) $(COVERAGE) \
 
106
        $(OPTIMIZE) $(LANGUAGE) -DVERSION='"$(version)"'
115
107
LDFLAGS+=-Xlinker --as-needed $(COVERAGE) $(LINK_FORTIFY) $(strip \
116
108
        ) $(foreach flag,$(LINK_FORTIFY_LD),-Xlinker $(flag))
117
109
 
161
153
 
162
154
objects:=$(addsuffix .o,$(CPROGS))
163
155
 
164
 
.PHONY: all
165
156
all: $(PROGS) mandos.lsm
166
157
 
167
 
.PHONY: doc
168
158
doc: $(DOCS)
169
159
 
170
 
.PHONY: html
171
160
html: $(htmldocs)
172
161
 
173
162
%.5: %.xml common.ent legalnotice.xml
290
279
                $@)
291
280
 
292
281
# 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)
 
282
plugins.d/mandos-client: plugins.d/mandos-client.c
 
283
        $(LINK.c) $^ $(GNUTLS_CFLAGS) $(AVAHI_CFLAGS) $(strip\
 
284
                ) $(GPGME_CFLAGS) $(GNUTLS_LIBS) $(strip\
 
285
                ) $(AVAHI_LIBS) $(GPGME_LIBS) $(LOADLIBES) $(strip\
 
286
                ) $(LDLIBS) -o $@
297
287
 
298
288
# 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)
 
289
plugin-helpers/mandos-client-iprouteadddel: plugin-helpers/mandos-client-iprouteadddel.c
 
290
        $(LINK.c) $(LIBNL3_CFLAGS) $^ $(LIBNL3_LIBS) $(strip\
 
291
                ) $(LOADLIBES) $(LDLIBS) -o $@
301
292
 
302
293
# 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
 
294
dracut-module/password-agent: dracut-module/password-agent.c
 
295
        $(LINK.c) $(GLIB_CFLAGS) $^ $(GLIB_LIBS) -lpthread $(strip\
 
296
                ) $(LOADLIBES) $(LDLIBS) -o $@
 
297
 
 
298
.PHONY : all doc html clean distclean mostlyclean maintainer-clean \
 
299
        check run-client run-server install install-html \
 
300
        install-server install-client-nokey install-client uninstall \
 
301
        uninstall-server uninstall-client purge purge-server \
 
302
        purge-client
 
303
 
308
304
clean:
309
305
        -rm --force $(CPROGS) $(objects) $(htmldocs) $(DOCS) core
310
306
 
311
 
.PHONY: distclean
312
307
distclean: clean
313
 
.PHONY: mostlyclean
314
308
mostlyclean: clean
315
 
.PHONY: maintainer-clean
316
309
maintainer-clean: clean
317
310
        -rm --force --recursive keydir confdir statedir
318
311
 
319
 
.PHONY: check
320
312
check: all
321
313
        ./mandos --check
322
314
        ./mandos-ctl --check
326
318
        ./dracut-module/password-agent --test
327
319
 
328
320
# Run the client with a local config and key
329
 
.PHONY: run-client
330
321
run-client: all keydir/seckey.txt keydir/pubkey.txt \
331
322
                        keydir/tls-privkey.pem keydir/tls-pubkey.pem
332
323
        @echo '######################################################'
360
351
keydir/seckey.txt keydir/pubkey.txt keydir/tls-privkey.pem keydir/tls-pubkey.pem: mandos-keygen
361
352
        install --directory keydir
362
353
        ./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
369
354
 
370
355
# Run the server with a local config
371
 
.PHONY: run-server
372
356
run-server: confdir/mandos.conf confdir/clients.conf statedir
373
357
        ./mandos --debug --no-dbus --configdir=confdir \
374
358
                --statedir=statedir $(SERVERARGS)
385
369
statedir:
386
370
        install --directory statedir
387
371
 
388
 
.PHONY: install
389
372
install: install-server install-client-nokey
390
373
 
391
 
.PHONY: install-html
392
374
install-html: html
393
375
        install --directory $(htmldir)
394
376
        install --mode=u=rw,go=r --target-directory=$(htmldir) \
395
377
                $(htmldocs)
396
378
 
397
 
.PHONY: install-server
398
379
install-server: doc
399
380
        install --directory $(CONFDIR)
400
381
        if install --directory --mode=u=rwx --owner=$(USER) \
408
389
                install --mode=u=rw,go=r tmpfiles.d-mandos.conf \
409
390
                        $(TMPFILES)/mandos.conf; \
410
391
        fi
411
 
        if [ "$(SYSUSERS)" != "$(DESTDIR)" \
412
 
                        -a -d "$(SYSUSERS)" ]; then \
413
 
                install --mode=u=rw,go=r sysusers.d-mandos.conf \
414
 
                        $(SYSUSERS)/mandos.conf; \
415
 
        fi
416
392
        install --mode=u=rwx,go=rx mandos $(PREFIX)/sbin/mandos
417
393
        install --mode=u=rwx,go=rx --target-directory=$(PREFIX)/sbin \
418
394
                mandos-ctl
423
399
        install --mode=u=rw --target-directory=$(CONFDIR) \
424
400
                clients.conf
425
401
        install --mode=u=rw,go=r dbus-mandos.conf \
426
 
                $(DBUSPOLICYDIR)/mandos.conf
 
402
                $(DESTDIR)/etc/dbus-1/system.d/mandos.conf
427
403
        install --mode=u=rwx,go=rx init.d-mandos \
428
404
                $(DESTDIR)/etc/init.d/mandos
429
405
        if [ "$(SYSTEMD)" != "$(DESTDIR)" -a -d "$(SYSTEMD)" ]; then \
447
423
        gzip --best --to-stdout intro.8mandos \
448
424
                > $(MANDIR)/man8/intro.8mandos.gz
449
425
 
450
 
.PHONY: install-client-nokey
451
426
install-client-nokey: all doc
452
427
        install --directory $(LIBDIR)/mandos $(CONFDIR)
453
428
        install --directory --mode=u=rwx $(KEYDIR) \
454
429
                $(LIBDIR)/mandos/plugins.d \
455
430
                $(LIBDIR)/mandos/plugin-helpers
456
 
        if [ "$(SYSUSERS)" != "$(DESTDIR)" \
457
 
                        -a -d "$(SYSUSERS)" ]; then \
458
 
                install --mode=u=rw,go=r sysusers.d-mandos.conf \
459
 
                        $(SYSUSERS)/mandos-client.conf; \
460
 
        fi
461
431
        if [ "$(CONFDIR)" != "$(LIBDIR)/mandos" ]; then \
462
432
                install --mode=u=rwx \
463
433
                        --directory "$(CONFDIR)/plugins.d" \
532
502
        gzip --best --to-stdout dracut-module/password-agent.8mandos \
533
503
                > $(MANDIR)/man8/password-agent.8mandos.gz
534
504
 
535
 
.PHONY: install-client
536
505
install-client: install-client-nokey
537
506
# Post-installation stuff
538
507
        -$(PREFIX)/sbin/mandos-keygen --dir "$(KEYDIR)"
548
517
        fi
549
518
        echo "Now run mandos-keygen --password --dir $(KEYDIR)"
550
519
 
551
 
.PHONY: uninstall
552
520
uninstall: uninstall-server uninstall-client
553
521
 
554
 
.PHONY: uninstall-server
555
522
uninstall-server:
556
523
        -rm --force $(PREFIX)/sbin/mandos \
557
524
                $(PREFIX)/sbin/mandos-ctl \
564
531
        update-rc.d -f mandos remove
565
532
        -rmdir $(CONFDIR)
566
533
 
567
 
.PHONY: uninstall-client
568
534
uninstall-client:
569
535
# Refuse to uninstall client if /etc/crypttab is explicitly configured
570
536
# to use it.
606
572
            done; \
607
573
        fi
608
574
 
609
 
.PHONY: purge
610
575
purge: purge-server purge-client
611
576
 
612
 
.PHONY: purge-server
613
577
purge-server: uninstall-server
614
578
        -rm --force $(CONFDIR)/mandos.conf $(CONFDIR)/clients.conf \
615
579
                $(DESTDIR)/etc/dbus-1/system.d/mandos.conf
620
584
                $(DESTDIR)/var/run/mandos.pid
621
585
        -rmdir $(CONFDIR)
622
586
 
623
 
.PHONY: purge-client
624
587
purge-client: uninstall-client
625
588
        -shred --remove $(KEYDIR)/seckey.txt $(KEYDIR)/tls-privkey.pem
626
589
        -rm --force $(CONFDIR)/plugin-runner.conf \