/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 initramfs-tools-script

  • 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:
51
51
 
52
52
chmod a=rwxt /tmp
53
53
 
54
 
test -r /conf/conf.d/cryptroot
55
 
test -w /conf/conf.d
56
 
 
57
54
# Get DEVICE from /conf/initramfs.conf and other files
58
55
. /conf/initramfs.conf
59
56
for conf in /conf/conf.d/*; do
60
 
    [ -f ${conf} ] && . ${conf}
 
57
    [ -f "${conf}" ] && . "${conf}"
61
58
done
62
59
if [ -e /conf/param.conf ]; then
63
60
    . /conf/param.conf
94
91
# If we are connecting directly, run "configure_networking" (from
95
92
# /scripts/functions); it needs IPOPTS and DEVICE
96
93
if [ "${connect+set}" = set ]; then
 
94
    set +e                      # Required by library functions
97
95
    configure_networking
 
96
    set -e
98
97
    if [ -n "$connect" ]; then
99
98
        cat <<-EOF >>/conf/conf.d/mandos/plugin-runner.conf
100
99
        
103
102
    fi
104
103
fi
105
104
 
106
 
# Do not replace cryptroot file unless we need to.
107
 
replace_cryptroot=no
108
 
 
109
 
# Our keyscript
110
 
mandos=/lib/mandos/plugin-runner
111
 
 
112
 
# parse /conf/conf.d/cryptroot.  Format:
113
 
# target=sda2_crypt,source=/dev/sda2,key=none,keyscript=/foo/bar/baz
114
 
exec 3>/conf/conf.d/cryptroot.mandos
115
 
while read options; do
116
 
    newopts=""
117
 
    # Split option line on commas
118
 
    old_ifs="$IFS"
119
 
    IFS="$IFS,"
120
 
    for opt in $options; do
121
 
        # Find the keyscript option, if any
122
 
        case "$opt" in
123
 
            keyscript=*)
124
 
                keyscript="${opt#keyscript=}"
125
 
                newopts="$newopts,$opt"
126
 
                ;;
127
 
            "") : ;;
128
 
            *)
129
 
                newopts="$newopts,$opt"
 
105
if [ -r /conf/conf.d/cryptroot ]; then
 
106
    test -w /conf/conf.d
 
107
 
 
108
    # Do not replace cryptroot file unless we need to.
 
109
    replace_cryptroot=no
 
110
 
 
111
    # Our keyscript
 
112
    mandos=/lib/mandos/plugin-runner
 
113
    test -x "$mandos"
 
114
 
 
115
    # parse /conf/conf.d/cryptroot.  Format:
 
116
    # target=sda2_crypt,source=/dev/sda2,rootdev,key=none,keyscript=/foo/bar/baz
 
117
    # Is the root device specially marked?
 
118
    changeall=yes
 
119
    while read -r options; do
 
120
        case "$options" in
 
121
            rootdev,*|*,rootdev,*|*,rootdev)
 
122
                # If the root device is specially marked, don't change all
 
123
                # lines in crypttab by default.
 
124
                changeall=no
130
125
                ;;
131
126
        esac
132
 
    done
133
 
    IFS="$old_ifs"
134
 
    unset old_ifs
135
 
    # If there was no keyscript option, add one.
136
 
    if [ -z "$keyscript" ]; then
137
 
        replace_cryptroot=yes
138
 
        newopts="$newopts,keyscript=$mandos"
 
127
    done < /conf/conf.d/cryptroot
 
128
 
 
129
    exec 3>/conf/conf.d/cryptroot.mandos
 
130
    while read -r options; do
 
131
        newopts=""
 
132
        keyscript=""
 
133
        changethis="$changeall"
 
134
        # Split option line on commas
 
135
        old_ifs="$IFS"
 
136
        IFS="$IFS,"
 
137
        for opt in $options; do
 
138
            # Find the keyscript option, if any
 
139
            case "$opt" in
 
140
                keyscript=*)
 
141
                    keyscript="${opt#keyscript=}"
 
142
                    newopts="$newopts,$opt"
 
143
                    ;;
 
144
                "") : ;;
 
145
                # Always use Mandos on the root device, if marked
 
146
                rootdev)
 
147
                    changethis=yes
 
148
                    newopts="$newopts,$opt"
 
149
                    ;;
 
150
                # Don't use Mandos on resume device, if marked
 
151
                resumedev)
 
152
                    changethis=no
 
153
                    newopts="$newopts,$opt"
 
154
                    ;;
 
155
                *)
 
156
                    newopts="$newopts,$opt"
 
157
                    ;;
 
158
            esac
 
159
        done
 
160
        IFS="$old_ifs"
 
161
        unset old_ifs
 
162
        # If there was no keyscript option, add one.
 
163
        if [ "$changethis" = yes ] && [ -z "$keyscript" ]; then
 
164
            replace_cryptroot=yes
 
165
            newopts="$newopts,keyscript=$mandos"
 
166
        fi
 
167
        newopts="${newopts#,}"
 
168
        echo "$newopts" >&3
 
169
    done < /conf/conf.d/cryptroot
 
170
    exec 3>&-
 
171
 
 
172
    # If we need to, replace the old cryptroot file with the new file.
 
173
    if [ "$replace_cryptroot" = yes ]; then
 
174
        mv /conf/conf.d/cryptroot /conf/conf.d/cryptroot.mandos-old
 
175
        mv /conf/conf.d/cryptroot.mandos /conf/conf.d/cryptroot
 
176
    else
 
177
        rm -f /conf/conf.d/cryptroot.mandos
139
178
    fi
140
 
    newopts="${newopts#,}"
141
 
    echo "$newopts" >&3
142
 
done < /conf/conf.d/cryptroot
143
 
exec 3>&-
144
 
 
145
 
# If we need to, replace the old cryptroot file with the new file.
146
 
if [ "$replace_cryptroot" = yes ]; then
147
 
    mv /conf/conf.d/cryptroot /conf/conf.d/cryptroot.mandos-old
148
 
    mv /conf/conf.d/cryptroot.mandos /conf/conf.d/cryptroot
149
 
else
150
 
    rm /conf/conf.d/cryptroot.mandos
 
179
elif [ -x /usr/bin/cryptroot-unlock ]; then
 
180
    setsid /lib/mandos/mandos-to-cryptroot-unlock &
151
181
fi