/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 debian/mandos.postinst

  • 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:
1
 
#!/bin/sh -e
 
1
#!/bin/sh
2
2
# This script can be called in the following ways:
3
3
#
4
4
# After the package was installed:
15
15
# If prerm fails during replacement due to conflict:
16
16
#       <postinst> abort-remove in-favour <new-package> <version>
17
17
 
 
18
. /usr/share/debconf/confmodule
 
19
 
 
20
set -e
 
21
 
18
22
case "$1" in
19
23
    configure)
20
24
        # Rename old "mandos" user and group
21
 
        case "`getent passwd mandos`" in
22
 
            *:Mandos\ password\ system,,,:/nonexistent:/bin/false)
23
 
                usermod --login _mandos mandos
24
 
                groupmod --new-name _mandos mandos
25
 
                ;;
26
 
        esac
 
25
        if dpkg --compare-versions "$2" lt "1.0.3-1"; then
 
26
            case "`getent passwd mandos`" in
 
27
                *:Mandos\ password\ system,,,:/nonexistent:/bin/false)
 
28
                    usermod --login _mandos mandos
 
29
                    groupmod --new-name _mandos mandos
 
30
                    ;;
 
31
            esac
 
32
        fi
27
33
        # Create new user and group
28
34
        if ! getent passwd _mandos >/dev/null; then
29
35
            adduser --system --force-badname --quiet \
30
36
                --home /nonexistent --no-create-home --group \
31
37
                --disabled-password --gecos "Mandos password system" \
32
38
                _mandos
 
39
        elif dpkg --compare-versions "$2" eq 1.7.4-1 \
 
40
                || dpkg --compare-versions "$2" eq "1.7.4-1~bpo8+1"
 
41
        then
 
42
            start=no
 
43
            if ! [ -f /var/lib/mandos/clients.pickle ]; then
 
44
                invoke-rc.d mandos stop
 
45
                start=yes
 
46
            fi
 
47
            chown _mandos:_mandos /var/lib/mandos/clients.pickle \
 
48
                  2>/dev/null || :
 
49
            if [ "$start" = yes ]; then
 
50
                invoke-rc.d mandos start
 
51
            fi
 
52
        fi
 
53
        # Reload D-Bus daemon to be aware of the _mandos user & group
 
54
        if [ -x /etc/init.d/dbus ]; then
 
55
            invoke-rc.d dbus force-reload || :
 
56
        fi
 
57
        if ! dpkg-statoverride --list "/var/lib/mandos" >/dev/null \
 
58
             2>&1; then
 
59
            chown _mandos:_mandos /var/lib/mandos
 
60
            chmod u=rwx,go= /var/lib/mandos
 
61
        fi
 
62
 
 
63
        if dpkg --compare-versions "$2" eq "1.8.0-1" \
 
64
                || dpkg --compare-versions "$2" eq "1.8.0-1~bpo9+1"; then
 
65
            if grep --quiet --regexp='^[[:space:]]*key_id[[:space:]]*=[[:space:]]*[Ee]3[Bb]0[Cc]44298[Ff][Cc]1[Cc]149[Aa][Ff][Bb][Ff]4[Cc]8996[Ff][Bb]92427[Aa][Ee]41[Ee]4649[Bb]934[Cc][Aa]495991[Bb]7852[Bb]855[[:space:]]*$' /etc/mandos/clients.conf; then
 
66
                sed --in-place \
 
67
                    --expression='/^[[:space:]]*key_id[[:space:]]*=[[:space:]]*[Ee]3[Bb]0[Cc]44298[Ff][Cc]1[Cc]149[Aa][Ff][Bb][Ff]4[Cc]8996[Ff][Bb]92427[Aa][Ee]41[Ee]4649[Bb]934[Cc][Aa]495991[Bb]7852[Bb]855[[:space:]]*$/d' \
 
68
                    /etc/mandos/clients.conf
 
69
                invoke-rc.d mandos restart
 
70
                db_version 2.0
 
71
                db_fset mandos/removed_bad_key_ids seen false
 
72
                db_reset mandos/removed_bad_key_ids
 
73
                db_input critical mandos/removed_bad_key_ids || true
 
74
                db_go
 
75
                db_stop
 
76
            fi
 
77
        fi
 
78
 
 
79
        gnutls_version=$(dpkg-query --showformat='${Version}' \
 
80
                                    --show libgnutls30 \
 
81
                                    2>/dev/null || :)
 
82
        if [ -n "$gnutls_version" ] \
 
83
               && dpkg --compare-versions $gnutls_version ge 3.6.6; then
 
84
            db_version 2.0
 
85
            db_input critical mandos/key_id || true
 
86
            db_go
 
87
            db_stop
33
88
        fi
34
89
        ;;
35
 
 
 
90
    
36
91
    abort-upgrade|abort-deconfigure|abort-remove)
37
92
        ;;
38
 
 
 
93
    
39
94
    *)
40
95
        echo "$0 called with unknown argument '$1'" 1>&2
41
96
        exit 1
42
97
        ;;
43
98
esac
44
99
 
 
100
# Avahi version 0.6.31-2 and older provides "avahi" (instead of
 
101
# "avahi-daemon") in its /etc/init.d script header.  To make
 
102
# insserv(8) happy, we edit our /etc/init.d script header to contain
 
103
# the correct string before the code added by dh_installinit calls
 
104
# update.rc-d, which calls insserv.
 
105
avahi_version="`dpkg-query --showformat='${Version}' --show avahi-daemon`"
 
106
if dpkg --compare-versions "$avahi_version" le 0.6.31-2; then
 
107
    sed --in-place --expression='/^### BEGIN INIT INFO$/,/^### END INIT INFO$/s/^\(# Required-\(Stop\|Start\):.*avahi\)-daemon\>/\1/g' /etc/init.d/mandos
 
108
fi
 
109
 
45
110
#DEBHELPER#
46
111
 
47
112
exit 0