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