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