/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: Teddy Hogeborn
  • Date: 2008-08-02 10:48:24 UTC
  • Revision ID: teddy@fukt.bsnet.se-20080802104824-fx0miwp9o4g9r31e
* plugbasedclient.c (struct process): New fields "eof", "completed",
                                      and "status".
  (handle_sigchld): New function.
  (main): Initialize "dir" to NULL to only closedir() it if necessary.
          Move "process_list" to be a global variable to be accessible
          by "handle_sigchld".  Make "handle_sigchld" handle SIGCHLD.
          Remove redundant check for NULL "dir".  Free "filename" when
          no longer used.  Block SIGCHLD around fork()/exec().
          Restore normal signals in child.  Only loop while running
          processes exist.  Print process buffer when the process is
          done and it has emitted EOF, not when it only emits EOF.
          Remove processes from list which exit non-cleanly.  In
          cleaning up, closedir() if necessary.  Bug fix: set next
          pointer correctly when freeing process list.

* plugins.d/passprompt.c (main): Do not ignore SIGQUIT.

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
 
# Get DEVICE from initramfs.conf and other files
111
 
. /etc/initramfs-tools/initramfs.conf
112
 
for conf in /etc/initramfs-tools/conf.d/*; do
113
 
    if [ -n `basename \"$conf\" | grep '^[[:alnum:]][[:alnum:]\._-]*$' \
114
 
        | grep -v '\.dpkg-.*$'` ]; then
115
 
        [ -f ${conf} ] && . ${conf}
116
 
    fi
117
 
done
118
 
export DEVICE
119
 
 
120
 
# Copy network hooks
121
 
for hook in /etc/mandos/network-hooks.d/*; do
122
 
    case "`basename \"$hook\"`" in
123
 
        "*") continue ;;
124
 
        *[!A-Za-z0-9_.-]*) continue ;;
125
 
        *) test -d "$hook" || copy_exec "$hook" "${HOOKDIR}" ;;
126
 
    esac
127
 
    if [ -x "$hook" ]; then
128
 
        # Copy any files needed by the network hook
129
 
        MANDOSNETHOOKDIR=/etc/mandos/network-hooks.d MODE=files \
130
 
            VERBOSITY=0 "$hook" files | while read file target; do
131
 
            if [ ! -e "${file}" ]; then
132
 
                echo "WARNING: file ${file} not found, requested by Mandos network hook '${hook##*/}'" >&2
133
 
            fi
134
 
            if [ -z "${target}" ]; then
135
 
                copy_exec "$file"
136
 
            else
137
 
                copy_exec "$file" "$target"
138
 
            fi
139
 
        done
140
 
        # Copy and load any modules needed by the network hook
141
 
        MANDOSNETHOOKDIR=/etc/mandos/network-hooks.d MODE=modules \
142
 
            VERBOSITY=0 "$hook" modules | while read module; do
143
 
            if [ -z "${target}" ]; then
144
 
                force_load "$module"
145
 
            fi
146
 
        done
147
 
    fi
148
 
done
149
 
 
150
 
# GPGME needs /usr/bin/gpg
151
 
if [ ! -e "${DESTDIR}/usr/bin/gpg" \
152
 
    -a -n "`ls \"${DESTDIR}\"/usr/lib/libgpgme.so* \
153
 
                2>/dev/null`" ]; then
154
 
    copy_exec /usr/bin/gpg
155
 
fi
156
 
 
157
 
# Config files
158
 
for file in /etc/mandos/plugin-runner.conf; do
159
 
    if [ -d "$file" ]; then
160
 
        continue
161
 
    fi
162
 
    cp --archive --sparse=always "$file" "${DESTDIR}${CONFDIR}"
163
 
done
164
 
 
165
 
if [ ${mandos_user} != 65534 ]; then
166
 
    sed --in-place --expression="1i--userid=${mandos_user}" \
167
 
        "${DESTDIR}${CONFDIR}/plugin-runner.conf"
168
 
fi
169
 
 
170
 
if [ ${mandos_group} != 65534 ]; then
171
 
    sed --in-place --expression="1i--groupid=${mandos_group}" \
172
 
        "${DESTDIR}${CONFDIR}/plugin-runner.conf"
173
 
fi
174
 
 
175
 
# Key files
176
 
for file in "$keydir"/*; do
177
 
    if [ -d "$file" ]; then
178
 
        continue
179
 
    fi
180
 
    cp --archive --sparse=always "$file" "${DESTDIR}${CONFDIR}"
181
 
    chown ${mandos_user}:${mandos_group} \
182
 
        "${DESTDIR}${CONFDIR}/`basename \"$file\"`"
183
 
done
184
 
 
185
 
# /lib/mandos/plugin-runner will drop priviliges, but needs access to
186
 
# its plugin directory and its config file.  However, since almost all
187
 
# files in initrd have been created with umask 027, this opening of
188
 
# permissions is needed.
189
 
190
 
# (The umask is not really intended to affect the files inside the
191
 
# initrd; it is intended to affect the initrd.img file itself, since
192
 
# it now contains secret key files.  There is, however, no other way
193
 
# to set the permission of the initrd.img file without a race
194
 
# condition.  This umask is set by "initramfs-tools-hook-conf",
195
 
# installed as "/usr/share/initramfs-tools/conf-hooks.d/mandos".)
196
 
197
 
for full in "${MANDOSDIR}" "${CONFDIR}"; do
198
 
    while [ "$full" != "/" ]; do
199
 
        chmod a+rX "${DESTDIR}$full"
200
 
        full="`dirname \"$full\"`"
201
 
    done
202
 
done
203
 
 
204
 
# Reset some other things to sane permissions which we have
205
 
# inadvertently affected with our umask setting.
206
 
for dir in / /bin /etc /keyscripts /sbin /scripts /usr /usr/bin; do
207
 
    if [ -d "${DESTDIR}$dir" ]; then
208
 
        chmod a+rX "${DESTDIR}$dir"
209
 
    fi
210
 
done
211
 
for dir in "${DESTDIR}"/lib* "${DESTDIR}"/usr/lib*; do
212
 
    if [ -d "$dir" ]; then
213
 
        find "$dir" \! -perm -u+rw,g+r -prune -or -print0 \
214
 
            | xargs --null --no-run-if-empty chmod a+rX
215
 
    fi
216
 
done