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

First version of a somewhat complete D-Bus server interface.  Also
change user/group name to "_mandos".

* debian/mandos.postinst: Rename old "mandos" user and group to
                          "_mandos"; create "_mandos" user and group
                          if none exist.
* debian/mandos-client.postinst: - '' -

* initramfs-tools-hook: Try "_mandos" before "mandos" as user and
                        group name.

* mandos (_datetime_to_dbus_struct): New; was previously local.
  (Client.started): Renamed to "last_started".  All users changed.
  (Client.started): New; boolean.
  (Client.dbus_object_path): New.
  (Client.check_command): Renamed to "checker_command".  All users
                          changed.
  (Client.__init__): Set and use "self.dbus_object_path".  Set
                     "self.started".
  (Client.start): Update "self.started".  Emit "self.PropertyChanged"
                  signals for both "started" and "last_started".
  (Client.stop): Update "self.started".  Emit "self.PropertyChanged"
                 signal for "started".
  (Client.checker_callback): Take additional "command" argument.  All
                             callers changed. Emit
                             "self.PropertyChanged" signal.
  (Client.bump_timeout): Emit "self.PropertyChanged" signal for
                         "last_checked_ok".
  (Client.start_checker): Emit "self.PropertyChanged" signal for
                          "checker_running".
  (Client.stop_checker): Emit "self.PropertyChanged" signal for
                         "checker_running".
  (Client.still_valid): Bug fix: use "getattr(self, started, False)"
                        instead of "self.started" in case this client
                        object is so new that the "started" attribute
                        has not been created yet.
  (Client.IntervalChanged, Client.CheckerIsRunning, Client.GetChecker,
  Client.GetCreated, Client.GetFingerprint, Client.GetHost,
  Client.GetInterval, Client.GetName, Client.GetStarted,
  Client.GetTimeout, Client.StateChanged, Client.TimeoutChanged):
  Removed; all callers changed.
  (Client.CheckerCompleted): Add "condition" and "command" arguments.
                             All callers changed.
  (Client.GetAllProperties, Client.PropertyChanged): New.
  (Client.StillValid): Renamed to "IsStillValid".
  (Client.StartChecker): Changed to its own function to avoid the
                         return value from "Client.start_checker()".
  (Client.Stop): Changed to its own function to avoid the return value
                 from "Client.stop()".
  (main): Try "_mandos" before "mandos" as user and group name.
          Removed inner function "remove_from_clients".  New inner
          class "MandosServer".

Show diffs side-by-side

added added

removed removed

Lines of Context:
3
3
# This script will be run by 'mkinitramfs' when it creates the image.
4
4
# Its job is to decide which files to install, then install them into
5
5
# the staging area, where the initramfs is being created.  This
6
 
# happens when a new 'linux-image' package is installed, or when an
 
6
# happens when a new 'linux-image' package is installed, or when the
7
7
# administrator runs 'update-initramfs' by hand to update an initramfs
8
8
# image.
9
9
 
29
29
 
30
30
. /usr/share/initramfs-tools/hook-functions
31
31
 
32
 
for d in /usr/lib \
33
 
    "/usr/lib/`dpkg-architecture -qDEB_HOST_MULTIARCH 2>/dev/null`" \
34
 
    "`rpm --eval='%{_libdir}' 2>/dev/null`" /usr/local/lib; do
35
 
    if [ -d "$d"/mandos ]; then
36
 
        libdir="$d"
 
32
for d in /usr /usr/local; do
 
33
    if [ -d "$d"/lib/mandos ]; then
 
34
        prefix="$d"
37
35
        break
38
36
    fi
39
37
done
40
 
if [ -z "$libdir" ]; then
 
38
if [ -z "$prefix" ]; then
41
39
    # Mandos not found
42
40
    exit 1
43
41
fi
53
51
    exit 1
54
52
fi
55
53
 
56
 
set `{ getent passwd _mandos \
57
 
    || getent passwd nobody \
58
 
    || echo ::65534:65534:::; } \
59
 
    | cut --delimiter=: --fields=3,4 --only-delimited \
60
 
    --output-delimiter=" "`
61
 
mandos_user="$1"
62
 
mandos_group="$2"
 
54
mandos_user="`{ getent passwd _mandos \
 
55
                || getent passwd mandos \
 
56
                || getent passwd nobody \
 
57
                || echo ::65534::::; } \
 
58
        | awk --field-separator=: '{ print $3 }'`" 
 
59
mandos_group="`{ getent group _mandos \
 
60
                || getent group mandos \
 
61
                || getent group nogroup \
 
62
                || echo ::65534:; } \
 
63
        | awk --field-separator=: '{ print $3 }'`"
63
64
 
64
65
# The Mandos network client uses the network
65
66
auto_add_modules net
70
71
CONFDIR="/conf/conf.d/mandos"
71
72
MANDOSDIR="/lib/mandos"
72
73
PLUGINDIR="${MANDOSDIR}/plugins.d"
73
 
PLUGINHELPERDIR="${MANDOSDIR}/plugin-helpers"
74
 
HOOKDIR="${MANDOSDIR}/network-hooks.d"
75
74
 
76
75
# Make directories
77
76
install --directory --mode=u=rwx,go=rx "${DESTDIR}${CONFDIR}" \
78
 
        "${DESTDIR}${MANDOSDIR}" "${DESTDIR}${HOOKDIR}"
 
77
        "${DESTDIR}${MANDOSDIR}"
79
78
install --owner=${mandos_user} --group=${mandos_group} --directory \
80
 
        --mode=u=rwx "${DESTDIR}${PLUGINDIR}" \
81
 
        "${DESTDIR}${PLUGINHELPERDIR}"
82
 
 
83
 
copy_exec "$libdir"/mandos/mandos-to-cryptroot-unlock "${MANDOSDIR}"
 
79
    --mode=u=rwx "${DESTDIR}${PLUGINDIR}"
84
80
 
85
81
# Copy the Mandos plugin runner
86
 
copy_exec "$libdir"/mandos/plugin-runner "${MANDOSDIR}"
 
82
copy_exec "$prefix"/lib/mandos/plugin-runner "${MANDOSDIR}"
87
83
 
88
84
# Copy the plugins
89
85
 
90
86
# Copy the packaged plugins
91
 
for file in "$libdir"/mandos/plugins.d/*; do
 
87
for file in "$prefix"/lib/mandos/plugins.d/*; do
92
88
    base="`basename \"$file\"`"
93
89
    # Is this plugin overridden?
94
90
    if [ -e "/etc/mandos/plugins.d/$base" ]; then
95
91
        continue
96
92
    fi
97
93
    case "$base" in
98
 
        *~|.*|\#*\#|*.dpkg-old|*.dpkg-bak|*.dpkg-new|*.dpkg-divert)
99
 
            : ;;
100
 
        "*") echo "W: Mandos client plugin directory is empty." >&2 ;;
101
 
        *) copy_exec "$file" "${PLUGINDIR}" ;;
102
 
    esac
103
 
done
104
 
 
105
 
# Copy the packaged plugin helpers
106
 
for file in "$libdir"/mandos/plugin-helpers/*; do
107
 
    base="`basename \"$file\"`"
108
 
    # Is this plugin overridden?
109
 
    if [ -e "/etc/mandos/plugin-helpers/$base" ]; then
110
 
        continue
111
 
    fi
112
 
    case "$base" in
113
 
        *~|.*|\#*\#|*.dpkg-old|*.dpkg-bak|*.dpkg-new|*.dpkg-divert)
114
 
            : ;;
115
 
        "*") : ;;
116
 
        *) copy_exec "$file" "${PLUGINHELPERDIR}" ;;
 
94
        *~|.*|\#*\#|*.dpkg-old|*.dpkg-bak|*.dpkg-new|*.dpkg-divert) : ;;
 
95
        "*") :;;
 
96
        *) copy_exec "$file" "${PLUGINDIR}";;
117
97
    esac
118
98
done
119
99
 
121
101
for file in /etc/mandos/plugins.d/*; do
122
102
    base="`basename \"$file\"`"
123
103
    case "$base" in
124
 
        *~|.*|\#*\#|*.dpkg-old|*.dpkg-bak|*.dpkg-new|*.dpkg-divert)
125
 
            : ;;
126
 
        "*") : ;;
127
 
        *) copy_exec "$file" "${PLUGINDIR}" ;;
128
 
    esac
129
 
done
130
 
 
131
 
# Copy any user-supplied plugin helpers
132
 
for file in /etc/mandos/plugin-helpers/*; do
133
 
    base="`basename \"$file\"`"
134
 
    case "$base" in
135
 
        *~|.*|\#*\#|*.dpkg-old|*.dpkg-bak|*.dpkg-new|*.dpkg-divert)
136
 
            : ;;
137
 
        "*") : ;;
138
 
        *) copy_exec "$file" "${PLUGINHELPERDIR}" ;;
139
 
    esac
140
 
done
141
 
 
142
 
# Get DEVICE from initramfs.conf and other files
143
 
. /etc/initramfs-tools/initramfs.conf
144
 
for conf in /etc/initramfs-tools/conf.d/*; do
145
 
    if [ -n "`basename \"$conf\" \
146
 
        | grep '^[[:alnum:]][[:alnum:]\._-]*$' \
147
 
        | grep -v '\.dpkg-.*$'`" ]; then
148
 
        [ -f "${conf}" ] && . "${conf}"
149
 
    fi
150
 
done
151
 
export DEVICE
152
 
 
153
 
# Copy network hooks
154
 
for hook in /etc/mandos/network-hooks.d/*; do
155
 
    case "`basename \"$hook\"`" in
156
 
        "*") continue ;;
157
 
        *[!A-Za-z0-9_.-]*) continue ;;
158
 
        *) test -d "$hook" || copy_exec "$hook" "${HOOKDIR}" ;;
159
 
    esac
160
 
    if [ -x "$hook" ]; then
161
 
        # Copy any files needed by the network hook
162
 
        MANDOSNETHOOKDIR=/etc/mandos/network-hooks.d MODE=files \
163
 
            VERBOSITY=0 "$hook" files | while read -r file target; do
164
 
            if [ ! -e "${file}" ]; then
165
 
                echo "WARNING: file ${file} not found, requested by Mandos network hook '${hook##*/}'" >&2
166
 
            fi
167
 
            if [ -z "${target}" ]; then
168
 
                copy_exec "$file"
169
 
            else
170
 
                copy_exec "$file" "$target"
171
 
            fi
172
 
        done
173
 
        # Copy and load any modules needed by the network hook
174
 
        MANDOSNETHOOKDIR=/etc/mandos/network-hooks.d MODE=modules \
175
 
            VERBOSITY=0 "$hook" modules | while read -r module; do
176
 
            force_load "$module"
177
 
        done
178
 
    fi
179
 
done
180
 
 
181
 
# GPGME needs GnuPG
182
 
gpg=/usr/bin/gpg
183
 
libgpgme11_version="`dpkg-query --showformat='${Version}\n' --show libgpgme11t64 libgpgme11 2>/dev/null | sed --quiet --expression='/./{p;q}'`"
184
 
if dpkg --compare-versions "$libgpgme11_version" ge 1.5.0-0.1; then
185
 
    if [ -e /usr/bin/gpgconf ]; then
186
 
        if [ ! -e "${DESTDIR}/usr/bin/gpgconf" ]; then
187
 
            copy_exec /usr/bin/gpgconf
188
 
        fi
189
 
        gpg="`/usr/bin/gpgconf|sed --quiet --expression='s/^gpg:[^:]*://p'`"
190
 
        gpgagent="`/usr/bin/gpgconf|sed --quiet --expression='s/^gpg-agent:[^:]*://p'`"
191
 
        # Newer versions of GnuPG 2 requires the gpg-agent binary
192
 
        if [ -e "$gpgagent" ] && [ ! -e "${DESTDIR}$gpgagent" ]; then
193
 
            copy_exec "$gpgagent"
194
 
        fi
195
 
    fi
196
 
elif dpkg --compare-versions "$libgpgme11_version" ge 1.4.1-0.1; then
197
 
    gpg=/usr/bin/gpg2
198
 
fi
199
 
if [ ! -e "${DESTDIR}$gpg" ]; then
200
 
    copy_exec "$gpg"
201
 
fi
202
 
unset gpg
203
 
unset libgpgme11_version
 
104
        *~|.*|\#*\#|*.dpkg-old|*.dpkg-bak|*.dpkg-new|*.dpkg-divert) : ;;
 
105
        "*") :;;
 
106
        *) copy_exec "$file" "${PLUGINDIR}";;
 
107
    esac
 
108
done
 
109
 
 
110
# GPGME needs /usr/bin/gpg
 
111
if [ ! -e "${DESTDIR}/usr/bin/gpg" \
 
112
    -a -n "`ls \"${DESTDIR}\"/usr/lib/libgpgme.so* \
 
113
                2>/dev/null`" ]; then
 
114
    copy_exec /usr/bin/gpg
 
115
fi
204
116
 
205
117
# Config files
206
 
for file in /etc/mandos/plugin-runner.conf; do
 
118
for file in /etc/mandos/*; do
207
119
    if [ -d "$file" ]; then
208
120
        continue
209
121
    fi
211
123
done
212
124
 
213
125
if [ ${mandos_user} != 65534 ]; then
214
 
    sed --in-place --expression="1i--userid=${mandos_user}" \
215
 
        "${DESTDIR}${CONFDIR}/plugin-runner.conf"
 
126
    PLUGINRUNNERCONF="${DESTDIR}${CONFDIR}/plugin-runner.conf"
 
127
    echo "--userid=${mandos_user}" >> "$PLUGINRUNNERCONF"
216
128
fi
217
129
 
218
130
if [ ${mandos_group} != 65534 ]; then
219
 
    sed --in-place --expression="1i--groupid=${mandos_group}" \
220
 
        "${DESTDIR}${CONFDIR}/plugin-runner.conf"
 
131
    PLUGINRUNNERCONF="${DESTDIR}${CONFDIR}/plugin-runner.conf"
 
132
    echo "--groupid=${mandos_group}" >> "$PLUGINRUNNERCONF"
221
133
fi
222
134
 
223
 
# Key files
224
 
for file in "$keydir"/*; do
 
135
# Key files 
 
136
for file in  "$keydir"/*; do
225
137
    if [ -d "$file" ]; then
226
138
        continue
227
139
    fi
228
 
    case "$file" in
229
 
        *~|.*|\#*\#|*.dpkg-old|*.dpkg-bak|*.dpkg-new|*.dpkg-divert)
230
 
            : ;;
231
 
        "*") : ;;
232
 
        *)
233
 
            cp --archive --sparse=always "$file" \
234
 
               "${DESTDIR}${CONFDIR}"
235
 
            chown ${mandos_user}:${mandos_group} \
236
 
                  "${DESTDIR}${CONFDIR}/`basename \"$file\"`"
237
 
            ;;
238
 
    esac
 
140
    cp --archive --sparse=always "$file" "${DESTDIR}${CONFDIR}"
 
141
    chown ${mandos_user}:${mandos_group} \
 
142
        "${DESTDIR}${CONFDIR}/`basename \"$file\"`"
239
143
done
240
 
# Use Diffie-Hellman parameters file if available
241
 
if [ -e "${DESTDIR}${CONFDIR}"/dhparams.pem ]; then
242
 
    sed --in-place \
243
 
        --expression="1i--options-for=mandos-client:--dh-params=${CONFDIR}/dhparams.pem" \
244
 
        "${DESTDIR}/${CONFDIR}/plugin-runner.conf"
245
 
fi
246
144
 
247
145
# /lib/mandos/plugin-runner will drop priviliges, but needs access to
248
146
# its plugin directory and its config file.  However, since almost all
253
151
# initrd; it is intended to affect the initrd.img file itself, since
254
152
# it now contains secret key files.  There is, however, no other way
255
153
# to set the permission of the initrd.img file without a race
256
 
# condition.  This umask is set by "initramfs-tools-conf", installed
257
 
# as "/usr/share/initramfs-tools/conf.d/mandos-conf".)
 
154
# condition.  This umask is set by "initramfs-tools-hook-conf",
 
155
# installed as "/usr/share/initramfs-tools/conf-hooks.d/mandos".)
258
156
259
157
for full in "${MANDOSDIR}" "${CONFDIR}"; do
260
158
    while [ "$full" != "/" ]; do
270
168
        chmod a+rX "${DESTDIR}$dir"
271
169
    fi
272
170
done
273
 
for dir in "${DESTDIR}"/lib* "${DESTDIR}"/usr/lib*; do
274
 
    if [ -d "$dir" ]; then
275
 
        find "$dir" \! -perm -u+rw,g+r -prune -or \! -type l -print0 \
276
 
            | xargs --null --no-run-if-empty chmod a+rX --
277
 
    fi
 
171
for dir in /lib /usr/lib; do
 
172
    find "${DESTDIR}$dir" \! -perm -u+rw,g+r -prune -or -print0 \
 
173
        | xargs --null --no-run-if-empty chmod a+rX
278
174
done