/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: 2015-05-23 20:18:34 UTC
  • mto: This revision was merged to the branch mainline in revision 756.
  • Revision ID: teddy@recompile.se-20150523201834-e89ex4ito93yni8x
mandos: Use multiprocessing module to run checkers.

For a long time, the Mandos server has occasionally logged the message
"ERROR: Child process vanished".  This was never a fatal error, but it
has been annoying and slightly worrying, since a definite cause was
not found.  One potential cause could be the "multiprocessing" and
"subprocess" modules conflicting w.r.t. SIGCHLD.  To avoid this,
change the running of checkers from using subprocess.Popen
asynchronously to instead first create a multiprocessing.Process()
(which is asynchronous) calling a function, and have that function
then call subprocess.call() (which is synchronous).  In this way, the
only thing using any asynchronous subprocesses is the multiprocessing
module.

This makes it necessary to change one small thing in the D-Bus API,
since the subprocesses.call() function does not expose the raw wait(2)
status value.

DBUS-API (CheckerCompleted): Change the second value provided by this
                             D-Bus signal from the raw wait(2) status
                             to the actual terminating signal number.
mandos (subprocess_call_pipe): New function to be called by
                               multiprocessing.Process (starting a
                               separate process).
(Client.last_checker signal): New attribute for signal which
                              terminated last checker.  Like
                              last_checker_status, only not accessible
                              via D-Bus.
(Client.checker_callback): Take new "connection" argument and use it
                           to get returncode; set last_checker_signal.
                           Return False so gobject does not call this
                           callback again.
(Client.start_checker): Start checker using a multiprocessing.Process
                        instead of a subprocess.Popen.
(ClientDBus.checker_callback): Take new "connection" argument.        Call
                               Client.checker_callback early to have
                               it set last_checker_status and
                               last_checker_signal; use those.  Change
                               second value provided to D-Bus signal
                               CheckerCompleted to use
                               last_checker_signal if checker was
                               terminated by signal.
mandos-monitor: Update to reflect DBus API change.
(MandosClientWidget.checker_completed): Take "signal" instead of
                                        "condition" argument.  Use it
                                        accordingly.  Remove dead code
                                        (os.WCOREDUMP case).

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
WARN=-O -Wall -Wformat=2 -Winit-self -Wmissing-include-dirs \
2
 
        -Wswitch-default -Wswitch-enum -Wunused-parameter \
3
 
        -Wstrict-aliasing=1 -Wextra -Wfloat-equal -Wundef -Wshadow \
 
1
WARN=-O -Wall -Wextra -Wdouble-promotion -Wformat=2 -Winit-self \
 
2
        -Wmissing-include-dirs -Wswitch-default -Wswitch-enum \
 
3
        -Wunused -Wuninitialized -Wstrict-overflow=5 \
 
4
        -Wsuggest-attribute=pure -Wsuggest-attribute=const \
 
5
        -Wsuggest-attribute=noreturn -Wfloat-equal -Wundef -Wshadow \
4
6
        -Wunsafe-loop-optimizations -Wpointer-arith \
5
7
        -Wbad-function-cast -Wcast-qual -Wcast-align -Wwrite-strings \
6
 
        -Wconversion -Wstrict-prototypes -Wold-style-definition \
7
 
        -Wpacked -Wnested-externs -Winline -Wvolatile-register-var
8
 
#       -Wunreachable-code
 
8
        -Wconversion -Wlogical-op -Waggregate-return \
 
9
        -Wstrict-prototypes -Wold-style-definition \
 
10
        -Wmissing-format-attribute -Wnormalized=nfc -Wpacked \
 
11
        -Wredundant-decls -Wnested-externs -Winline -Wvla \
 
12
        -Wvolatile-register-var -Woverlength-strings
9
13
#DEBUG=-ggdb3
10
 
# For info about _FORTIFY_SOURCE, see
11
 
# <http://www.kernel.org/doc/man-pages/online/pages/man7/feature_test_macros.7.html>
 
14
# For info about _FORTIFY_SOURCE, see feature_test_macros(7)
12
15
# and <http://gcc.gnu.org/ml/gcc-patches/2004-09/msg02055.html>.
13
16
FORTIFY=-D_FORTIFY_SOURCE=2 -fstack-protector-all -fPIC
14
17
LINK_FORTIFY_LD=-z relro -z now
20
23
LINK_FORTIFY += -pie
21
24
endif
22
25
#COVERAGE=--coverage
23
 
OPTIMIZE=-Os
 
26
OPTIMIZE=-Os -fno-strict-aliasing
24
27
LANGUAGE=-std=gnu99
25
28
htmldir=man
26
 
version=1.4.1
 
29
version=1.6.9
27
30
SED=sed
28
31
 
 
32
USER=$(firstword $(subst :, ,$(shell getent passwd _mandos || getent passwd nobody || echo 65534)))
 
33
GROUP=$(firstword $(subst :, ,$(shell getent group _mandos || getent group nobody || echo 65534)))
 
34
 
29
35
## Use these settings for a traditional /usr/local install
30
36
# PREFIX=$(DESTDIR)/usr/local
31
37
# CONFDIR=$(DESTDIR)/etc/mandos
32
38
# KEYDIR=$(DESTDIR)/etc/mandos/keys
33
39
# MANDIR=$(PREFIX)/man
34
40
# INITRAMFSTOOLS=$(DESTDIR)/etc/initramfs-tools
 
41
# STATEDIR=$(DESTDIR)/var/lib/mandos
 
42
# LIBDIR=$(PREFIX)/lib
35
43
##
36
44
 
37
45
## These settings are for a package-type install
40
48
KEYDIR=$(DESTDIR)/etc/keys/mandos
41
49
MANDIR=$(PREFIX)/share/man
42
50
INITRAMFSTOOLS=$(DESTDIR)/usr/share/initramfs-tools
 
51
STATEDIR=$(DESTDIR)/var/lib/mandos
 
52
LIBDIR=$(shell \
 
53
        for d in \
 
54
        "/usr/lib/`dpkg-architecture -qDEB_HOST_MULTIARCH 2>/dev/null`" \
 
55
        "`rpm --eval='%{_libdir}' 2>/dev/null`" /usr/lib; do \
 
56
                if [ -d "$$d" -a "$$d" = "$${d%/}" ]; then \
 
57
                        echo "$(DESTDIR)$$d"; \
 
58
                        break; \
 
59
                fi; \
 
60
        done)
43
61
##
44
62
 
 
63
SYSTEMD=$(DESTDIR)$(shell pkg-config systemd --variable=systemdsystemunitdir)
 
64
 
45
65
GNUTLS_CFLAGS=$(shell pkg-config --cflags-only-I gnutls)
46
66
GNUTLS_LIBS=$(shell pkg-config --libs gnutls)
47
67
AVAHI_CFLAGS=$(shell pkg-config --cflags-only-I avahi-core)
51
71
        getconf LFS_LDFLAGS)
52
72
 
53
73
# Do not change these two
54
 
CFLAGS=$(WARN) $(DEBUG) $(FORTIFY) $(COVERAGE) $(OPTIMIZE) \
 
74
CFLAGS+=$(WARN) $(DEBUG) $(FORTIFY) $(COVERAGE) $(OPTIMIZE) \
55
75
        $(LANGUAGE) $(GNUTLS_CFLAGS) $(AVAHI_CFLAGS) $(GPGME_CFLAGS) \
56
76
        -DVERSION='"$(version)"'
57
 
LDFLAGS=-Xlinker --as-needed $(COVERAGE) $(LINK_FORTIFY) $(foreach flag,$(LINK_FORTIFY_LD),-Xlinker $(flag))
 
77
LDFLAGS+=-Xlinker --as-needed $(COVERAGE) $(LINK_FORTIFY) $(foreach flag,$(LINK_FORTIFY_LD),-Xlinker $(flag))
58
78
 
59
79
# Commands to format a DocBook <refentry> document into a manual page
60
80
DOCBOOKTOMAN=$(strip cd $(dir $<); xsltproc --nonet --xinclude \
63
83
        --param make.single.year.ranges         1 \
64
84
        --param man.output.quietly              1 \
65
85
        --param man.authors.section.enabled     0 \
66
 
         /usr/share/xml/docbook/stylesheet/nwalsh/manpages/docbook.xsl \
 
86
        /usr/share/xml/docbook/stylesheet/nwalsh/manpages/docbook.xsl \
67
87
        $(notdir $<); \
68
 
        $(MANPOST) $(notdir $@);\
69
 
        LANG=en_US.UTF-8 MANWIDTH=80 man --warnings --encoding=UTF-8 \
70
 
        --local-file $(notdir $@) >/dev/null)
71
 
# DocBook-to-man post-processing to fix a '\n' escape bug
72
 
MANPOST=$(SED) --in-place --expression='s,\\\\en,\\en,g;s,\\n,\\en,g'
 
88
        if locale --all 2>/dev/null | grep --regexp='^en_US\.utf8$$' \
 
89
        && type man 2>/dev/null; then LANG=en_US.UTF-8 MANWIDTH=80 \
 
90
        man --warnings --encoding=UTF-8 --local-file $(notdir $@); \
 
91
        fi >/dev/null)
73
92
 
74
93
DOCBOOKTOHTML=$(strip xsltproc --nonet --xinclude \
75
94
        --param make.year.ranges                1 \
220
239
        $(LINK.c) $^ -lrt $(GNUTLS_LIBS) $(AVAHI_LIBS) $(strip\
221
240
                ) $(GPGME_LIBS) $(LOADLIBES) $(LDLIBS) -o $@
222
241
 
223
 
.PHONY : all doc html clean distclean run-client run-server install \
224
 
        install-server install-client uninstall uninstall-server \
225
 
        uninstall-client purge purge-server purge-client
 
242
.PHONY : all doc html clean distclean mostlyclean maintainer-clean \
 
243
        check run-client run-server install install-html \
 
244
        install-server install-client-nokey install-client uninstall \
 
245
        uninstall-server uninstall-client purge purge-server \
 
246
        purge-client
226
247
 
227
248
clean:
228
249
        -rm --force $(CPROGS) $(objects) $(htmldocs) $(DOCS) core
230
251
distclean: clean
231
252
mostlyclean: clean
232
253
maintainer-clean: clean
233
 
        -rm --force --recursive keydir confdir
 
254
        -rm --force --recursive keydir confdir statedir
234
255
 
235
256
check:  all
236
257
        ./mandos --check
 
258
        ./mandos-ctl --check
237
259
 
238
260
# Run the client with a local config and key
239
261
run-client: all keydir/seckey.txt keydir/pubkey.txt
242
264
        @echo "# ignored.  The messages are caused by not running as root, but   #"
243
265
        @echo "# you should NOT run \"make run-client\" as root unless you also    #"
244
266
        @echo "# unpacked and compiled Mandos as root, which is NOT recommended. #"
245
 
        @echo "# From plugin-runner: setuid: Operation not permitted             #"
 
267
        @echo "# From plugin-runner: setgid: Operation not permitted             #"
 
268
        @echo "#                     setuid: Operation not permitted             #"
246
269
        @echo "# From askpass-fifo:  mkfifo: Permission denied                   #"
247
 
        @echo "# From mandos-client: setuid: Operation not permitted             #"
248
 
        @echo "#                     seteuid: Operation not permitted            #"
249
 
        @echo "#                     klogctl: Operation not permitted            #"
 
270
        @echo "# From mandos-client:                                             #"
 
271
        @echo "#             Failed to raise privileges: Operation not permitted #"
 
272
        @echo "#             Warning: network hook \"*\" exited with status *      #"
250
273
        @echo "###################################################################"
 
274
# We set GNOME_KEYRING_CONTROL to block pam_gnome_keyring
251
275
        ./plugin-runner --plugin-dir=plugins.d \
252
276
                --config-file=plugin-runner.conf \
253
 
                --options-for=mandos-client:--seckey=keydir/seckey.txt,--pubkey=keydir/pubkey.txt \
 
277
                --options-for=mandos-client:--seckey=keydir/seckey.txt,--pubkey=keydir/pubkey.txt,--network-hook-dir=network-hooks.d \
 
278
                --env-for=mandos-client:GNOME_KEYRING_CONTROL= \
254
279
                $(CLIENTARGS)
255
280
 
256
281
# Used by run-client
259
284
        ./mandos-keygen --dir keydir --force
260
285
 
261
286
# Run the server with a local config
262
 
run-server: confdir/mandos.conf confdir/clients.conf
263
 
        @echo "#################################################################"
264
 
        @echo "# NOTE: Please IGNORE the error about \"Could not open file      #"
265
 
        @echo "# u'/var/run/mandos.pid'\" -  it is harmless and is caused by    #"
266
 
        @echo "# the server not running as root.  Do NOT run \"make run-server\" #"
267
 
        @echo "# server as root if you didn't also unpack and compile it thus. #"
268
 
        @echo "#################################################################"
269
 
        ./mandos --debug --no-dbus --configdir=confdir $(SERVERARGS)
 
287
run-server: confdir/mandos.conf confdir/clients.conf statedir
 
288
        ./mandos --debug --no-dbus --configdir=confdir \
 
289
                --statedir=statedir $(SERVERARGS)
270
290
 
271
291
# Used by run-server
272
292
confdir/mandos.conf: mandos.conf
276
296
        install --directory confdir
277
297
        install --mode=u=rw $< $@
278
298
# Add a client password
279
 
        ./mandos-keygen --dir keydir --password >> $@
 
299
        ./mandos-keygen --dir keydir --password --no-ssh >> $@
 
300
statedir:
 
301
        install --directory statedir
280
302
 
281
303
install: install-server install-client-nokey
282
304
 
287
309
 
288
310
install-server: doc
289
311
        install --directory $(CONFDIR)
 
312
        if install --directory --mode=u=rwx --owner=$(USER) \
 
313
                --group=$(GROUP) $(STATEDIR); then \
 
314
                :; \
 
315
        elif install --directory --mode=u=rwx $(STATEDIR); then \
 
316
                chown -- $(USER):$(GROUP) $(STATEDIR) || :; \
 
317
        fi
290
318
        install --mode=u=rwx,go=rx mandos $(PREFIX)/sbin/mandos
291
319
        install --mode=u=rwx,go=rx --target-directory=$(PREFIX)/sbin \
292
320
                mandos-ctl
300
328
                $(DESTDIR)/etc/dbus-1/system.d/mandos.conf
301
329
        install --mode=u=rwx,go=rx init.d-mandos \
302
330
                $(DESTDIR)/etc/init.d/mandos
 
331
        if [ "$(SYSTEMD)" != "$(DESTDIR)" -a -d "$(SYSTEMD)" ]; then \
 
332
                install --mode=u=rw,go=r mandos.service $(SYSTEMD); \
 
333
        fi
303
334
        install --mode=u=rw,go=r default-mandos \
304
335
                $(DESTDIR)/etc/default/mandos
305
336
        if [ -z $(DESTDIR) ]; then \
315
346
                > $(MANDIR)/man5/mandos.conf.5.gz
316
347
        gzip --best --to-stdout mandos-clients.conf.5 \
317
348
                > $(MANDIR)/man5/mandos-clients.conf.5.gz
 
349
        gzip --best --to-stdout intro.8mandos \
 
350
                > $(MANDIR)/man8/intro.8mandos.gz
318
351
 
319
352
install-client-nokey: all doc
320
 
        install --directory $(PREFIX)/lib/mandos $(CONFDIR)
 
353
        install --directory $(LIBDIR)/mandos $(CONFDIR)
321
354
        install --directory --mode=u=rwx $(KEYDIR) \
322
 
                $(PREFIX)/lib/mandos/plugins.d
323
 
        if [ "$(CONFDIR)" != "$(PREFIX)/lib/mandos" ]; then \
 
355
                $(LIBDIR)/mandos/plugins.d
 
356
        if [ "$(CONFDIR)" != "$(LIBDIR)/mandos" ]; then \
324
357
                install --mode=u=rwx \
325
358
                        --directory "$(CONFDIR)/plugins.d"; \
326
359
        fi
 
360
        install --mode=u=rwx,go=rx --directory \
 
361
                "$(CONFDIR)/network-hooks.d"
327
362
        install --mode=u=rwx,go=rx \
328
 
                --target-directory=$(PREFIX)/lib/mandos plugin-runner
 
363
                --target-directory=$(LIBDIR)/mandos plugin-runner
329
364
        install --mode=u=rwx,go=rx --target-directory=$(PREFIX)/sbin \
330
365
                mandos-keygen
331
366
        install --mode=u=rwx,go=rx \
332
 
                --target-directory=$(PREFIX)/lib/mandos/plugins.d \
 
367
                --target-directory=$(LIBDIR)/mandos/plugins.d \
333
368
                plugins.d/password-prompt
334
369
        install --mode=u=rwxs,go=rx \
335
 
                --target-directory=$(PREFIX)/lib/mandos/plugins.d \
 
370
                --target-directory=$(LIBDIR)/mandos/plugins.d \
336
371
                plugins.d/mandos-client
337
372
        install --mode=u=rwxs,go=rx \
338
 
                --target-directory=$(PREFIX)/lib/mandos/plugins.d \
 
373
                --target-directory=$(LIBDIR)/mandos/plugins.d \
339
374
                plugins.d/usplash
340
375
        install --mode=u=rwxs,go=rx \
341
 
                --target-directory=$(PREFIX)/lib/mandos/plugins.d \
 
376
                --target-directory=$(LIBDIR)/mandos/plugins.d \
342
377
                plugins.d/splashy
343
378
        install --mode=u=rwxs,go=rx \
344
 
                --target-directory=$(PREFIX)/lib/mandos/plugins.d \
 
379
                --target-directory=$(LIBDIR)/mandos/plugins.d \
345
380
                plugins.d/askpass-fifo
346
381
        install --mode=u=rwxs,go=rx \
347
 
                --target-directory=$(PREFIX)/lib/mandos/plugins.d \
 
382
                --target-directory=$(LIBDIR)/mandos/plugins.d \
348
383
                plugins.d/plymouth
349
384
        install initramfs-tools-hook \
350
385
                $(INITRAMFSTOOLS)/hooks/mandos
396
431
        ! grep --regexp='^ *[^ #].*keyscript=[^,=]*/mandos/' \
397
432
                $(DESTDIR)/etc/crypttab
398
433
        -rm --force $(PREFIX)/sbin/mandos-keygen \
399
 
                $(PREFIX)/lib/mandos/plugin-runner \
400
 
                $(PREFIX)/lib/mandos/plugins.d/password-prompt \
401
 
                $(PREFIX)/lib/mandos/plugins.d/mandos-client \
402
 
                $(PREFIX)/lib/mandos/plugins.d/usplash \
403
 
                $(PREFIX)/lib/mandos/plugins.d/splashy \
404
 
                $(PREFIX)/lib/mandos/plugins.d/askpass-fifo \
405
 
                $(PREFIX)/lib/mandos/plugins.d/plymouth \
 
434
                $(LIBDIR)/mandos/plugin-runner \
 
435
                $(LIBDIR)/mandos/plugins.d/password-prompt \
 
436
                $(LIBDIR)/mandos/plugins.d/mandos-client \
 
437
                $(LIBDIR)/mandos/plugins.d/usplash \
 
438
                $(LIBDIR)/mandos/plugins.d/splashy \
 
439
                $(LIBDIR)/mandos/plugins.d/askpass-fifo \
 
440
                $(LIBDIR)/mandos/plugins.d/plymouth \
406
441
                $(INITRAMFSTOOLS)/hooks/mandos \
407
442
                $(INITRAMFSTOOLS)/conf-hooks.d/mandos \
408
443
                $(INITRAMFSTOOLS)/scripts/init-premount/mandos \
414
449
                $(MANDIR)/man8/splashy.8mandos.gz \
415
450
                $(MANDIR)/man8/askpass-fifo.8mandos.gz \
416
451
                $(MANDIR)/man8/plymouth.8mandos.gz \
417
 
        -rmdir $(PREFIX)/lib/mandos/plugins.d $(CONFDIR)/plugins.d \
418
 
                 $(PREFIX)/lib/mandos $(CONFDIR) $(KEYDIR)
 
452
        -rmdir $(LIBDIR)/mandos/plugins.d $(CONFDIR)/plugins.d \
 
453
                 $(LIBDIR)/mandos $(CONFDIR) $(KEYDIR)
419
454
        update-initramfs -k all -u
420
455
 
421
456
purge: purge-server purge-client
425
460
                $(DESTDIR)/etc/dbus-1/system.d/mandos.conf
426
461
                $(DESTDIR)/etc/default/mandos \
427
462
                $(DESTDIR)/etc/init.d/mandos \
 
463
                $(SYSTEMD)/mandos.service \
 
464
                $(DESTDIR)/run/mandos.pid \
428
465
                $(DESTDIR)/var/run/mandos.pid
429
466
        -rmdir $(CONFDIR)
430
467