/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
 
HOOKDIR="${MANDOSDIR}/network-hooks.d"
74
 
 
75
 
# Make directories
76
 
install --directory --mode=u=rwx,go=rx "${DESTDIR}${CONFDIR}" \
77
 
        "${DESTDIR}${MANDOSDIR}" "${DESTDIR}${HOOKDIR}"
78
 
install --owner=${mandos_user} --group=${mandos_group} --directory \
79
 
    --mode=u=rwx "${DESTDIR}${PLUGINDIR}"
80
 
 
81
 
# Copy the Mandos plugin runner
82
 
copy_exec "$libdir"/mandos/plugin-runner "${MANDOSDIR}"
83
 
 
84
 
# Copy the plugins
85
 
 
86
 
# Copy the packaged plugins
87
 
for file in "$libdir"/mandos/plugins.d/*; do
88
 
    base="`basename \"$file\"`"
89
 
    # Is this plugin overridden?
90
 
    if [ -e "/etc/mandos/plugins.d/$base" ]; then
91
 
        continue
92
 
    fi
93
 
    case "$base" in
94
 
        *~|.*|\#*\#|*.dpkg-old|*.dpkg-bak|*.dpkg-new|*.dpkg-divert)
95
 
            : ;;
96
 
        "*") echo "W: Mandos client plugin directory is empty." >&2 ;;
97
 
        *) copy_exec "$file" "${PLUGINDIR}" ;;
98
 
    esac
99
 
done
100
 
 
101
 
# Copy any user-supplied plugins
102
 
for file in /etc/mandos/plugins.d/*; do
103
 
    base="`basename \"$file\"`"
104
 
    case "$base" in
105
 
        *~|.*|\#*\#|*.dpkg-old|*.dpkg-bak|*.dpkg-new|*.dpkg-divert)
106
 
            : ;;
107
 
        "*") : ;;
108
 
        *) copy_exec "$file" "${PLUGINDIR}" ;;
109
 
    esac
110
 
done
111
 
 
112
 
# Get DEVICE from initramfs.conf and other files
113
 
. /etc/initramfs-tools/initramfs.conf
114
 
for conf in /etc/initramfs-tools/conf.d/*; do
115
 
    if [ -n `basename \"$conf\" | grep '^[[:alnum:]][[:alnum:]\._-]*$' \
116
 
        | grep -v '\.dpkg-.*$'` ]; then
117
 
        [ -f ${conf} ] && . ${conf}
118
 
    fi
119
 
done
120
 
export DEVICE
121
 
 
122
 
# Copy network hooks
123
 
for hook in /etc/mandos/network-hooks.d/*; do
124
 
    case "`basename \"$hook\"`" in
125
 
        "*") continue ;;
126
 
        *[!A-Za-z0-9_.-]*) continue ;;
127
 
        *) test -d "$hook" || copy_exec "$hook" "${HOOKDIR}" ;;
128
 
    esac
129
 
    if [ -x "$hook" ]; then
130
 
        # Copy any files needed by the network hook
131
 
        MANDOSNETHOOKDIR=/etc/mandos/network-hooks.d MODE=files \
132
 
            VERBOSITY=0 "$hook" files | while read file target; do
133
 
            if [ ! -e "${file}" ]; then
134
 
                echo "WARNING: file ${file} not found, requested by Mandos network hook '${hook##*/}'" >&2
135
 
            fi
136
 
            if [ -z "${target}" ]; then
137
 
                copy_exec "$file"
138
 
            else
139
 
                copy_exec "$file" "$target"
140
 
            fi
141
 
        done
142
 
        # Copy and load any modules needed by the network hook
143
 
        MANDOSNETHOOKDIR=/etc/mandos/network-hooks.d MODE=modules \
144
 
            VERBOSITY=0 "$hook" modules | while read module; do
145
 
            if [ -z "${target}" ]; then
146
 
                force_load "$module"
147
 
            fi
148
 
        done
149
 
    fi
150
 
done
151
 
 
152
 
# GPGME needs GnuPG
153
 
gpg=/usr/bin/gpg
154
 
libgpgme11_version="`dpkg-query --showformat='${Version}' --show libgpgme11`"
155
 
if dpkg --compare-versions "$libgpgme11_version" ge 1.5.0-0.1; then
156
 
    if [ -e /usr/bin/gpgconf ]; then
157
 
        if [ ! -e "${DESTDIR}/usr/bin/gpgconf" ]; then
158
 
            copy_exec /usr/bin/gpgconf
159
 
        fi
160
 
        gpg="`/usr/bin/gpgconf|sed --quiet --expression='s/^gpg:[^:]*://p'`"
161
 
    fi
162
 
elif dpkg --compare-versions "$libgpgme11_version" ge 1.4.1-0.1; then
163
 
    gpg=/usr/bin/gpg2
164
 
fi
165
 
if [ ! -e "${DESTDIR}$gpg" ]; then
166
 
    copy_exec "$gpg"
167
 
fi
168
 
unset gpg
169
 
unset libgpgme11_version
170
 
 
171
 
# Config files
172
 
for file in /etc/mandos/plugin-runner.conf; do
173
 
    if [ -d "$file" ]; then
174
 
        continue
175
 
    fi
176
 
    cp --archive --sparse=always "$file" "${DESTDIR}${CONFDIR}"
177
 
done
178
 
 
179
 
if [ ${mandos_user} != 65534 ]; then
180
 
    sed --in-place --expression="1i--userid=${mandos_user}" \
181
 
        "${DESTDIR}${CONFDIR}/plugin-runner.conf"
182
 
fi
183
 
 
184
 
if [ ${mandos_group} != 65534 ]; then
185
 
    sed --in-place --expression="1i--groupid=${mandos_group}" \
186
 
        "${DESTDIR}${CONFDIR}/plugin-runner.conf"
187
 
fi
188
 
 
189
 
# Key files
190
 
for file in "$keydir"/*; do
191
 
    if [ -d "$file" ]; then
192
 
        continue
193
 
    fi
194
 
    cp --archive --sparse=always "$file" "${DESTDIR}${CONFDIR}"
195
 
    chown ${mandos_user}:${mandos_group} \
196
 
        "${DESTDIR}${CONFDIR}/`basename \"$file\"`"
197
 
done
198
 
 
199
 
# /lib/mandos/plugin-runner will drop priviliges, but needs access to
200
 
# its plugin directory and its config file.  However, since almost all
201
 
# files in initrd have been created with umask 027, this opening of
202
 
# permissions is needed.
203
 
204
 
# (The umask is not really intended to affect the files inside the
205
 
# initrd; it is intended to affect the initrd.img file itself, since
206
 
# it now contains secret key files.  There is, however, no other way
207
 
# to set the permission of the initrd.img file without a race
208
 
# condition.  This umask is set by "initramfs-tools-hook-conf",
209
 
# installed as "/usr/share/initramfs-tools/conf-hooks.d/mandos".)
210
 
211
 
for full in "${MANDOSDIR}" "${CONFDIR}"; do
212
 
    while [ "$full" != "/" ]; do
213
 
        chmod a+rX "${DESTDIR}$full"
214
 
        full="`dirname \"$full\"`"
215
 
    done
216
 
done
217
 
 
218
 
# Reset some other things to sane permissions which we have
219
 
# inadvertently affected with our umask setting.
220
 
for dir in / /bin /etc /keyscripts /sbin /scripts /usr /usr/bin; do
221
 
    if [ -d "${DESTDIR}$dir" ]; then
222
 
        chmod a+rX "${DESTDIR}$dir"
223
 
    fi
224
 
done
225
 
for dir in "${DESTDIR}"/lib* "${DESTDIR}"/usr/lib*; do
226
 
    if [ -d "$dir" ]; then
227
 
        find "$dir" \! -perm -u+rw,g+r -prune -or -print0 \
228
 
            | xargs --null --no-run-if-empty chmod a+rX
229
 
    fi
230
 
done