/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

  • 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 the
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 /usr/local; do
33
 
    if [ -d "$d"/lib/mandos ]; then
34
 
        prefix="$d"
35
 
        break
36
 
    fi
37
 
done
38
 
if [ -z "$prefix" ]; then
39
 
    # Mandos not found
40
 
    exit 1
41
 
fi
42
 
 
43
 
for d in /etc/keys/mandos /etc/mandos/keys; do
44
 
    if [ -d "$d" ]; then
45
 
        keydir="$d"
46
 
        break
47
 
    fi
48
 
done
49
 
if [ -z "$keydir" ]; then
50
 
    # Mandos key directory not found
51
 
    exit 1
52
 
fi
53
 
 
54
 
set `{ getent passwd _mandos \
55
 
    || getent passwd nobody \
56
 
    || echo ::65534:65534:::; } \
57
 
    | cut --delimiter=: --fields=3,4 --only-delimited \
58
 
    --output-delimiter=" "`
59
 
mandos_user="$1"
60
 
mandos_group="$2"
61
 
 
62
 
# The Mandos network client uses the network
63
 
auto_add_modules net
64
 
# The Mandos network client uses IPv6
65
 
force_load ipv6
66
 
 
67
 
# These are directories inside the initrd
68
 
CONFDIR="/conf/conf.d/mandos"
69
 
MANDOSDIR="/lib/mandos"
70
 
PLUGINDIR="${MANDOSDIR}/plugins.d"
71
 
HOOKDIR="${MANDOSDIR}/network-hooks.d"
72
 
 
73
 
# Make directories
74
 
install --directory --mode=u=rwx,go=rx "${DESTDIR}${CONFDIR}" \
75
 
        "${DESTDIR}${MANDOSDIR}" "${DESTDIR}${HOOKDIR}"
76
 
install --owner=${mandos_user} --group=${mandos_group} --directory \
77
 
    --mode=u=rwx "${DESTDIR}${PLUGINDIR}"
78
 
 
79
 
# Copy the Mandos plugin runner
80
 
copy_exec "$prefix"/lib/mandos/plugin-runner "${MANDOSDIR}"
81
 
 
82
 
# Copy the plugins
83
 
 
84
 
# Copy the packaged plugins
85
 
for file in "$prefix"/lib/mandos/plugins.d/*; do
86
 
    base="`basename \"$file\"`"
87
 
    # Is this plugin overridden?
88
 
    if [ -e "/etc/mandos/plugins.d/$base" ]; then
89
 
        continue
90
 
    fi
91
 
    case "$base" in
92
 
        *~|.*|\#*\#|*.dpkg-old|*.dpkg-bak|*.dpkg-new|*.dpkg-divert)
93
 
            : ;;
94
 
        "*") echo "W: Mandos client plugin directory is empty." >&2 ;;
95
 
        *) copy_exec "$file" "${PLUGINDIR}" ;;
96
 
    esac
97
 
done
98
 
 
99
 
# Copy any user-supplied plugins
100
 
for file in /etc/mandos/plugins.d/*; do
101
 
    base="`basename \"$file\"`"
102
 
    case "$base" in
103
 
        *~|.*|\#*\#|*.dpkg-old|*.dpkg-bak|*.dpkg-new|*.dpkg-divert)
104
 
            : ;;
105
 
        "*") : ;;
106
 
        *) copy_exec "$file" "${PLUGINDIR}" ;;
107
 
    esac
108
 
done
109
 
 
110
 
# Copy network hooks
111
 
for hook in /etc/mandos/network-hooks.d/*; do
112
 
    case "`basename \"$hook\"`" in
113
 
        "*") continue ;;
114
 
        *[!A-Za-z0-9_.-]*) continue ;;
115
 
        *) test -d "$hook" || copy_exec "$hook" "${HOOKDIR}" ;;
116
 
    esac
117
 
    if [ -x "$hook" ]; then
118
 
        # Copy any files needed by the network hook
119
 
        MANDOSNETHOOKDIR=/etc/mandos/network-hooks.d MODE=files \
120
 
            VERBOSITY=0 "$hook" files | while read file target; do
121
 
            if [ ! -e "${file}" ]; then
122
 
                echo "WARNING: file ${file} not found, requested by Mandos network hook '${hook##*/}'" >&2
123
 
            fi
124
 
            if [ -z "${target}" ]; then
125
 
                copy_exec "$file"
126
 
            else
127
 
                copy_exec "$file" "$target"
128
 
            fi
129
 
        done
130
 
        # Copy and load any modules needed by the network hook
131
 
        MANDOSNETHOOKDIR=/etc/mandos/network-hooks.d MODE=modules \
132
 
            VERBOSITY=0 "$hook" modules | while read module; do
133
 
            if [ -z "${target}" ]; then
134
 
                force_load "$module"
135
 
            fi
136
 
        done
137
 
    fi
138
 
done
139
 
 
140
 
# GPGME needs /usr/bin/gpg
141
 
if [ ! -e "${DESTDIR}/usr/bin/gpg" \
142
 
    -a -n "`ls \"${DESTDIR}\"/usr/lib/libgpgme.so* \
143
 
                2>/dev/null`" ]; then
144
 
    copy_exec /usr/bin/gpg
145
 
fi
146
 
 
147
 
# Config files
148
 
for file in /etc/mandos/plugin-runner.conf; do
149
 
    if [ -d "$file" ]; then
150
 
        continue
151
 
    fi
152
 
    cp --archive --sparse=always "$file" "${DESTDIR}${CONFDIR}"
153
 
done
154
 
 
155
 
if [ ${mandos_user} != 65534 ]; then
156
 
    sed --in-place --expression="1i--userid=${mandos_user}" \
157
 
        "${DESTDIR}${CONFDIR}/plugin-runner.conf"
158
 
fi
159
 
 
160
 
if [ ${mandos_group} != 65534 ]; then
161
 
    sed --in-place --expression="1i--groupid=${mandos_group}" \
162
 
        "${DESTDIR}${CONFDIR}/plugin-runner.conf"
163
 
fi
164
 
 
165
 
# Key files
166
 
for file in "$keydir"/*; do
167
 
    if [ -d "$file" ]; then
168
 
        continue
169
 
    fi
170
 
    cp --archive --sparse=always "$file" "${DESTDIR}${CONFDIR}"
171
 
    chown ${mandos_user}:${mandos_group} \
172
 
        "${DESTDIR}${CONFDIR}/`basename \"$file\"`"
173
 
done
174
 
 
175
 
# /lib/mandos/plugin-runner will drop priviliges, but needs access to
176
 
# its plugin directory and its config file.  However, since almost all
177
 
# files in initrd have been created with umask 027, this opening of
178
 
# permissions is needed.
179
 
180
 
# (The umask is not really intended to affect the files inside the
181
 
# initrd; it is intended to affect the initrd.img file itself, since
182
 
# it now contains secret key files.  There is, however, no other way
183
 
# to set the permission of the initrd.img file without a race
184
 
# condition.  This umask is set by "initramfs-tools-hook-conf",
185
 
# installed as "/usr/share/initramfs-tools/conf-hooks.d/mandos".)
186
 
187
 
for full in "${MANDOSDIR}" "${CONFDIR}"; do
188
 
    while [ "$full" != "/" ]; do
189
 
        chmod a+rX "${DESTDIR}$full"
190
 
        full="`dirname \"$full\"`"
191
 
    done
192
 
done
193
 
 
194
 
# Reset some other things to sane permissions which we have
195
 
# inadvertently affected with our umask setting.
196
 
for dir in / /bin /etc /keyscripts /sbin /scripts /usr /usr/bin; do
197
 
    if [ -d "${DESTDIR}$dir" ]; then
198
 
        chmod a+rX "${DESTDIR}$dir"
199
 
    fi
200
 
done
201
 
for dir in "${DESTDIR}"/lib* "${DESTDIR}"/usr/lib*; do
202
 
    if [ -d "$dir" ]; then
203
 
        find "$dir" \! -perm -u+rw,g+r -prune -or -print0 \
204
 
            | xargs --null --no-run-if-empty chmod a+rX
205
 
    fi
206
 
done