/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
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
 
90
88
                        --variable=systemdsystemunitdir)
91
89
TMPFILES:=$(DESTDIR)$(shell $(PKG_CONFIG) systemd \
92
90
                        --variable=tmpfilesdir)
93
 
SYSUSERS:=$(DESTDIR)$(shell $(PKG_CONFIG) systemd \
94
 
                        --variable=sysusersdir)
95
91
 
96
92
GNUTLS_CFLAGS:=$(shell $(PKG_CONFIG) --cflags-only-I gnutls)
97
93
GNUTLS_LIBS:=$(shell $(PKG_CONFIG) --libs gnutls)
98
94
AVAHI_CFLAGS:=$(shell $(PKG_CONFIG) --cflags-only-I avahi-core)
99
95
AVAHI_LIBS:=$(shell $(PKG_CONFIG) --libs avahi-core)
100
 
GPGME_CFLAGS:=$(shell $(PKG_CONFIG) --cflags-only-I gpgme 2>/dev/null \
101
 
        || gpgme-config --cflags; getconf LFS_CFLAGS)
102
 
GPGME_LIBS:=$(shell $(PKG_CONFIG) --libs gpgme 2>/dev/null \
103
 
        || 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; \
104
98
        getconf LFS_LDFLAGS)
105
99
LIBNL3_CFLAGS:=$(shell $(PKG_CONFIG) --cflags-only-I libnl-route-3.0)
106
100
LIBNL3_LIBS:=$(shell $(PKG_CONFIG) --libs libnl-route-3.0)
108
102
GLIB_LIBS:=$(shell $(PKG_CONFIG) --libs glib-2.0)
109
103
 
110
104
# Do not change these two
111
 
CFLAGS+=$(WARN) $(DEBUG) $(FORTIFY) $(COVERAGE) $(OPTIMIZE) \
112
 
        $(LANGUAGE) -DVERSION='"$(version)"'
 
105
CFLAGS+=$(WARN) $(DEBUG) $(FORTIFY) $(COVERAGE) \
 
106
        $(OPTIMIZE) $(LANGUAGE) -DVERSION='"$(version)"'
113
107
LDFLAGS+=-Xlinker --as-needed $(COVERAGE) $(LINK_FORTIFY) $(strip \
114
108
        ) $(foreach flag,$(LINK_FORTIFY_LD),-Xlinker $(flag))
115
109
 
159
153
 
160
154
objects:=$(addsuffix .o,$(CPROGS))
161
155
 
162
 
.PHONY: all
163
156
all: $(PROGS) mandos.lsm
164
157
 
165
 
.PHONY: doc
166
158
doc: $(DOCS)
167
159
 
168
 
.PHONY: html
169
160
html: $(htmldocs)
170
161
 
171
162
%.5: %.xml common.ent legalnotice.xml
288
279
                $@)
289
280
 
290
281
# Need to add the GnuTLS, Avahi and GPGME libraries
291
 
plugins.d/mandos-client: CFLAGS += $(GNUTLS_CFLAGS) $(strip \
292
 
        ) $(AVAHI_CFLAGS) $(GPGME_CFLAGS)
293
 
plugins.d/mandos-client: LDLIBS += $(GNUTLS_LIBS) $(strip \
294
 
        ) $(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 $@
295
287
 
296
288
# Need to add the libnl-route library
297
 
plugin-helpers/mandos-client-iprouteadddel: CFLAGS += $(LIBNL3_CFLAGS)
298
 
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 $@
299
292
 
300
293
# Need to add the GLib and pthread libraries
301
 
dracut-module/password-agent: CFLAGS += $(GLIB_CFLAGS)
302
 
# Note: -lpthread is unnecessary with the GNU C library 2.34 or later
303
 
dracut-module/password-agent: LDLIBS += $(GLIB_LIBS) -lpthread
304
 
 
305
 
.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
 
306
304
clean:
307
305
        -rm --force $(CPROGS) $(objects) $(htmldocs) $(DOCS) core
308
306
 
309
 
.PHONY: distclean
310
307
distclean: clean
311
 
.PHONY: mostlyclean
312
308
mostlyclean: clean
313
 
.PHONY: maintainer-clean
314
309
maintainer-clean: clean
315
310
        -rm --force --recursive keydir confdir statedir
316
311
 
317
 
.PHONY: check
318
312
check: all
319
313
        ./mandos --check
320
314
        ./mandos-ctl --check
324
318
        ./dracut-module/password-agent --test
325
319
 
326
320
# Run the client with a local config and key
327
 
.PHONY: run-client
328
321
run-client: all keydir/seckey.txt keydir/pubkey.txt \
329
322
                        keydir/tls-privkey.pem keydir/tls-pubkey.pem
330
323
        @echo '######################################################'
358
351
keydir/seckey.txt keydir/pubkey.txt keydir/tls-privkey.pem keydir/tls-pubkey.pem: mandos-keygen
359
352
        install --directory keydir
360
353
        ./mandos-keygen --dir keydir --force
361
 
        if ! [ -e keydir/tls-privkey.pem ]; then \
362
 
                install --mode=u=rw /dev/null keydir/tls-privkey.pem; \
363
 
        fi
364
 
        if ! [ -e keydir/tls-pubkey.pem ]; then \
365
 
                install --mode=u=rw /dev/null keydir/tls-pubkey.pem; \
366
 
        fi
367
354
 
368
355
# Run the server with a local config
369
 
.PHONY: run-server
370
356
run-server: confdir/mandos.conf confdir/clients.conf statedir
371
357
        ./mandos --debug --no-dbus --configdir=confdir \
372
358
                --statedir=statedir $(SERVERARGS)
383
369
statedir:
384
370
        install --directory statedir
385
371
 
386
 
.PHONY: install
387
372
install: install-server install-client-nokey
388
373
 
389
 
.PHONY: install-html
390
374
install-html: html
391
375
        install --directory $(htmldir)
392
376
        install --mode=u=rw,go=r --target-directory=$(htmldir) \
393
377
                $(htmldocs)
394
378
 
395
 
.PHONY: install-server
396
379
install-server: doc
397
380
        install --directory $(CONFDIR)
398
381
        if install --directory --mode=u=rwx --owner=$(USER) \
406
389
                install --mode=u=rw,go=r tmpfiles.d-mandos.conf \
407
390
                        $(TMPFILES)/mandos.conf; \
408
391
        fi
409
 
        if [ "$(SYSUSERS)" != "$(DESTDIR)" \
410
 
                        -a -d "$(SYSUSERS)" ]; then \
411
 
                install --mode=u=rw,go=r sysusers.d-mandos.conf \
412
 
                        $(SYSUSERS)/mandos.conf; \
413
 
        fi
414
392
        install --mode=u=rwx,go=rx mandos $(PREFIX)/sbin/mandos
415
393
        install --mode=u=rwx,go=rx --target-directory=$(PREFIX)/sbin \
416
394
                mandos-ctl
445
423
        gzip --best --to-stdout intro.8mandos \
446
424
                > $(MANDIR)/man8/intro.8mandos.gz
447
425
 
448
 
.PHONY: install-client-nokey
449
426
install-client-nokey: all doc
450
427
        install --directory $(LIBDIR)/mandos $(CONFDIR)
451
428
        install --directory --mode=u=rwx $(KEYDIR) \
452
429
                $(LIBDIR)/mandos/plugins.d \
453
430
                $(LIBDIR)/mandos/plugin-helpers
454
 
        if [ "$(SYSUSERS)" != "$(DESTDIR)" \
455
 
                        -a -d "$(SYSUSERS)" ]; then \
456
 
                install --mode=u=rw,go=r sysusers.d-mandos.conf \
457
 
                        $(SYSUSERS)/mandos-client.conf; \
458
 
        fi
459
431
        if [ "$(CONFDIR)" != "$(LIBDIR)/mandos" ]; then \
460
432
                install --mode=u=rwx \
461
433
                        --directory "$(CONFDIR)/plugins.d" \
530
502
        gzip --best --to-stdout dracut-module/password-agent.8mandos \
531
503
                > $(MANDIR)/man8/password-agent.8mandos.gz
532
504
 
533
 
.PHONY: install-client
534
505
install-client: install-client-nokey
535
506
# Post-installation stuff
536
507
        -$(PREFIX)/sbin/mandos-keygen --dir "$(KEYDIR)"
546
517
        fi
547
518
        echo "Now run mandos-keygen --password --dir $(KEYDIR)"
548
519
 
549
 
.PHONY: uninstall
550
520
uninstall: uninstall-server uninstall-client
551
521
 
552
 
.PHONY: uninstall-server
553
522
uninstall-server:
554
523
        -rm --force $(PREFIX)/sbin/mandos \
555
524
                $(PREFIX)/sbin/mandos-ctl \
562
531
        update-rc.d -f mandos remove
563
532
        -rmdir $(CONFDIR)
564
533
 
565
 
.PHONY: uninstall-client
566
534
uninstall-client:
567
535
# Refuse to uninstall client if /etc/crypttab is explicitly configured
568
536
# to use it.
604
572
            done; \
605
573
        fi
606
574
 
607
 
.PHONY: purge
608
575
purge: purge-server purge-client
609
576
 
610
 
.PHONY: purge-server
611
577
purge-server: uninstall-server
612
578
        -rm --force $(CONFDIR)/mandos.conf $(CONFDIR)/clients.conf \
613
579
                $(DESTDIR)/etc/dbus-1/system.d/mandos.conf
618
584
                $(DESTDIR)/var/run/mandos.pid
619
585
        -rmdir $(CONFDIR)
620
586
 
621
 
.PHONY: purge-client
622
587
purge-client: uninstall-client
623
588
        -shred --remove $(KEYDIR)/seckey.txt $(KEYDIR)/tls-privkey.pem
624
589
        -rm --force $(CONFDIR)/plugin-runner.conf \