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

  • Committer: Björn Påhlsson
  • Date: 2008-07-20 02:52:20 UTC
  • Revision ID: belorn@braxen-20080720025220-r5u0388uy9iu23h6
Added following support:
Pluginbased client handler
rewritten Mandos client
       Avahi instead of udp server discovery
       openpgp encrypted key support
Passprompt stand alone application for direct console input
Added logging for Mandos server

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
#!/bin/sh
2
 
 
3
 
# This script will be run by 'mkinitramfs' when it creates the image.
4
 
# Its job is to decide which files to install, then install them into
5
 
# the staging area, where the initramfs is being created.  This
6
 
# happens when a new 'linux-image' package is installed, or when an
7
 
# administrator runs 'update-initramfs' by hand to update an initramfs
8
 
# image.
9
 
 
10
 
# The environment contains at least:
11
 
#
12
 
#  DESTDIR -- The staging directory where the image is being built.
13
 
 
14
 
# No initramfs pre-requirements
15
 
PREREQ="cryptroot"
16
 
 
17
 
prereqs()
18
 
{
19
 
        echo "$PREREQ"
20
 
}
21
 
 
22
 
case $1 in
23
 
# get pre-requisites
24
 
prereqs)
25
 
        prereqs
26
 
        exit 0
27
 
        ;;
28
 
esac
29
 
 
30
 
. /usr/share/initramfs-tools/hook-functions
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"
37
 
        break
38
 
    fi
39
 
done
40
 
if [ -z "$libdir" ]; then
41
 
    # Mandos not found
42
 
    exit 1
43
 
fi
44
 
 
45
 
for d in /etc/keys/mandos /etc/mandos/keys; do
46
 
    if [ -d "$d" ]; then
47
 
        keydir="$d"
48
 
        break
49
 
    fi
50
 
done
51
 
if [ -z "$keydir" ]; then
52
 
    # Mandos key directory not found
53
 
    exit 1
54
 
fi
55
 
 
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"
63
 
 
64
 
# The Mandos network client uses the network
65
 
auto_add_modules net
66
 
# The Mandos network client uses IPv6
67
 
force_load ipv6
68
 
 
69
 
# These are directories inside the initrd
70
 
CONFDIR="/conf/conf.d/mandos"
71
 
MANDOSDIR="/lib/mandos"
72
 
PLUGINDIR="${MANDOSDIR}/plugins.d"
73
 
PLUGINHELPERDIR="${MANDOSDIR}/plugin-helpers"
74
 
HOOKDIR="${MANDOSDIR}/network-hooks.d"
75
 
 
76
 
# Make directories
77
 
install --directory --mode=u=rwx,go=rx "${DESTDIR}${CONFDIR}" \
78
 
        "${DESTDIR}${MANDOSDIR}" "${DESTDIR}${HOOKDIR}"
79
 
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}"
84
 
 
85
 
# Copy the Mandos plugin runner
86
 
copy_exec "$libdir"/mandos/plugin-runner "${MANDOSDIR}"
87
 
 
88
 
# Copy the plugins
89
 
 
90
 
# Copy the packaged plugins
91
 
for file in "$libdir"/mandos/plugins.d/*; do
92
 
    base="`basename \"$file\"`"
93
 
    # Is this plugin overridden?
94
 
    if [ -e "/etc/mandos/plugins.d/$base" ]; then
95
 
        continue
96
 
    fi
97
 
    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}" ;;
117
 
    esac
118
 
done
119
 
 
120
 
# Copy any user-supplied plugins
121
 
for file in /etc/mandos/plugins.d/*; do
122
 
    base="`basename \"$file\"`"
123
 
    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\" | grep '^[[:alnum:]][[:alnum:]\._-]*$' \
146
 
        | grep -v '\.dpkg-.*$'` ]; then
147
 
        [ -f "${conf}" ] && . "${conf}"
148
 
    fi
149
 
done
150
 
export DEVICE
151
 
 
152
 
# Copy network hooks
153
 
for hook in /etc/mandos/network-hooks.d/*; do
154
 
    case "`basename \"$hook\"`" in
155
 
        "*") continue ;;
156
 
        *[!A-Za-z0-9_.-]*) continue ;;
157
 
        *) test -d "$hook" || copy_exec "$hook" "${HOOKDIR}" ;;
158
 
    esac
159
 
    if [ -x "$hook" ]; then
160
 
        # Copy any files needed by the network hook
161
 
        MANDOSNETHOOKDIR=/etc/mandos/network-hooks.d MODE=files \
162
 
            VERBOSITY=0 "$hook" files | while read -r file target; do
163
 
            if [ ! -e "${file}" ]; then
164
 
                echo "WARNING: file ${file} not found, requested by Mandos network hook '${hook##*/}'" >&2
165
 
            fi
166
 
            if [ -z "${target}" ]; then
167
 
                copy_exec "$file"
168
 
            else
169
 
                copy_exec "$file" "$target"
170
 
            fi
171
 
        done
172
 
        # Copy and load any modules needed by the network hook
173
 
        MANDOSNETHOOKDIR=/etc/mandos/network-hooks.d MODE=modules \
174
 
            VERBOSITY=0 "$hook" modules | while read -r module; do
175
 
            force_load "$module"
176
 
        done
177
 
    fi
178
 
done
179
 
 
180
 
# GPGME needs GnuPG
181
 
gpg=/usr/bin/gpg
182
 
libgpgme11_version="`dpkg-query --showformat='${Version}' --show libgpgme11`"
183
 
if dpkg --compare-versions "$libgpgme11_version" ge 1.5.0-0.1; then
184
 
    if [ -e /usr/bin/gpgconf ]; then
185
 
        if [ ! -e "${DESTDIR}/usr/bin/gpgconf" ]; then
186
 
            copy_exec /usr/bin/gpgconf
187
 
        fi
188
 
        gpg="`/usr/bin/gpgconf|sed --quiet --expression='s/^gpg:[^:]*://p'`"
189
 
        gpgagent="`/usr/bin/gpgconf|sed --quiet --expression='s/^gpg-agent:[^:]*://p'`"
190
 
        # Newer versions of GnuPG 2 requires the gpg-agent binary
191
 
        if [ -e "$gpgagent" ] && [ ! -e "${DESTDIR}$gpgagent" ]; then
192
 
            copy_exec "$gpgagent"
193
 
        fi
194
 
    fi
195
 
elif dpkg --compare-versions "$libgpgme11_version" ge 1.4.1-0.1; then
196
 
    gpg=/usr/bin/gpg2
197
 
fi
198
 
if [ ! -e "${DESTDIR}$gpg" ]; then
199
 
    copy_exec "$gpg"
200
 
fi
201
 
unset gpg
202
 
unset libgpgme11_version
203
 
 
204
 
# Config files
205
 
for file in /etc/mandos/plugin-runner.conf; do
206
 
    if [ -d "$file" ]; then
207
 
        continue
208
 
    fi
209
 
    cp --archive --sparse=always "$file" "${DESTDIR}${CONFDIR}"
210
 
done
211
 
 
212
 
if [ ${mandos_user} != 65534 ]; then
213
 
    sed --in-place --expression="1i--userid=${mandos_user}" \
214
 
        "${DESTDIR}${CONFDIR}/plugin-runner.conf"
215
 
fi
216
 
 
217
 
if [ ${mandos_group} != 65534 ]; then
218
 
    sed --in-place --expression="1i--groupid=${mandos_group}" \
219
 
        "${DESTDIR}${CONFDIR}/plugin-runner.conf"
220
 
fi
221
 
 
222
 
# Key files
223
 
for file in "$keydir"/*; do
224
 
    if [ -d "$file" ]; then
225
 
        continue
226
 
    fi
227
 
    case "$file" in
228
 
        *~|.*|\#*\#|*.dpkg-old|*.dpkg-bak|*.dpkg-new|*.dpkg-divert)
229
 
            : ;;
230
 
        "*") : ;;
231
 
        *)
232
 
            cp --archive --sparse=always "$file" \
233
 
               "${DESTDIR}${CONFDIR}"
234
 
            chown ${mandos_user}:${mandos_group} \
235
 
                  "${DESTDIR}${CONFDIR}/`basename \"$file\"`"
236
 
            ;;
237
 
    esac
238
 
done
239
 
# Use Diffie-Hellman parameters file if available
240
 
if [ -e "${DESTDIR}${CONFDIR}"/dhparams.pem ]; then
241
 
    sed --in-place \
242
 
        --expression="1i--options-for=mandos-client:--dh-params=${CONFDIR}/dhparams.pem" \
243
 
        "${DESTDIR}/${CONFDIR}/plugin-runner.conf"
244
 
fi
245
 
 
246
 
# /lib/mandos/plugin-runner will drop priviliges, but needs access to
247
 
# its plugin directory and its config file.  However, since almost all
248
 
# files in initrd have been created with umask 027, this opening of
249
 
# permissions is needed.
250
 
251
 
# (The umask is not really intended to affect the files inside the
252
 
# initrd; it is intended to affect the initrd.img file itself, since
253
 
# it now contains secret key files.  There is, however, no other way
254
 
# to set the permission of the initrd.img file without a race
255
 
# condition.  This umask is set by "initramfs-tools-conf", installed
256
 
# as "/usr/share/initramfs-tools/conf.d/mandos-conf".)
257
 
258
 
for full in "${MANDOSDIR}" "${CONFDIR}"; do
259
 
    while [ "$full" != "/" ]; do
260
 
        chmod a+rX "${DESTDIR}$full"
261
 
        full="`dirname \"$full\"`"
262
 
    done
263
 
done
264
 
 
265
 
# Reset some other things to sane permissions which we have
266
 
# inadvertently affected with our umask setting.
267
 
for dir in / /bin /etc /keyscripts /sbin /scripts /usr /usr/bin; do
268
 
    if [ -d "${DESTDIR}$dir" ]; then
269
 
        chmod a+rX "${DESTDIR}$dir"
270
 
    fi
271
 
done
272
 
for dir in "${DESTDIR}"/lib* "${DESTDIR}"/usr/lib*; do
273
 
    if [ -d "$dir" ]; then
274
 
        find "$dir" \! -perm -u+rw,g+r -prune -or \! -type l -print0 \
275
 
            | xargs --null --no-run-if-empty chmod a+rX --
276
 
    fi
277
 
done