/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: 2011-12-31 20:07:11 UTC
  • mfrom: (535.1.9 wireless-network-hook)
  • Revision ID: teddy@recompile.se-20111231200711-6dli3r8drftem57r
Merge new wireless network hook.  Fix bridge network hook to use
hardware addresses instead of interface names.  Implement and document
new "CONNECT" environment variable for network hooks.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
#!/bin/sh
2
2
 
3
 
#
4
 
# This is an example hook script.  It will be run by 'mkinitramfs'
5
 
# when it creates the image.  It's job is to decide which files to
6
 
# install, then install them into the staging area, where the
7
 
# initramfs is being created.  This happens when a new 'linux-image'
8
 
# package is installed, or when the administrator runs 'mkinitramfs'
9
 
# by hand to update an initramfs image.
10
 
#
11
 
# TODO: What about the case where you install something that should be
12
 
#       added to the initramfs, but the linux-image it relates to has
13
 
#       already been installed previously?  Does this happen often
14
 
#       enough that it needs to be handled?  How can it be handled?
15
 
#
16
 
#       * Think about the 'usplash'.  The initramfs will need to be
17
 
#        updated if a theme change or update is desired.  Maybe it
18
 
#        should not be totally automatic, but offered on upgrade
19
 
#        predicated on a user response to a debconf question?  That
20
 
#        issue needs to be explored and a solution specified.
21
 
#
22
 
#  * Do not assume that any needed subdirectories have been created
23
 
#       yet, but don't bail out if they are already there.
24
 
#
25
 
#  * All of the standard system tools are available, of course, since
26
 
#       this hook is running in the real system, not the initramfs.
27
 
#
28
 
#  * TODO: ... ?  Anything else to tell them in this bullet-list?
29
 
#
 
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.
30
9
 
31
 
#
32
10
# The environment contains at least:
33
11
#
34
 
#  CONFDIR -- usually /etc/mkinitramfs, can be set on mkinitramfs
35
 
#                command line.
36
 
#
37
 
#  DESTDIR -- The staging directory where we are building the image.
38
 
#
39
 
# TODO: Decide what environment variables are meaningful and defined
40
 
#       in this context, then document them as part of the interface.
41
 
#
42
 
# TODO: May need a version_compare function for comparison of VERSION?
43
 
 
44
 
 
45
 
#
46
 
# List the soft prerequisites here.  This is a space separated list of
47
 
# names, of scripts that are in the same directory as this one, that
48
 
# must be run before this one can be.
49
 
#
 
12
#  DESTDIR -- The staging directory where the image is being built.
 
13
 
 
14
# No initramfs pre-requirements
50
15
PREREQ="cryptroot"
51
16
 
52
17
prereqs()
62
27
        ;;
63
28
esac
64
29
 
65
 
 
66
 
# You can do anything you need to from here on.
67
 
#
68
 
 
69
 
# Source the optional 'hook-functions' scriptlet, if you need the
70
 
# functions defined within it.  Read it to see what is available to
71
 
# you.  It contains functions for copying dynamically linked program
72
 
# binaries, and kernel modules into the DESTDIR.
73
 
#
74
30
. /usr/share/initramfs-tools/hook-functions
75
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
76
63
auto_add_modules net
77
 
# force_load tg3
 
64
# The Mandos network client uses IPv6
78
65
force_load ipv6
79
66
 
 
67
# These are directories inside the initrd
80
68
CONFDIR="/conf/conf.d/mandos"
81
 
DESTCONFDIR="${DESTDIR}${CONFDIR}"
82
 
mkdir --parents "${DESTCONFDIR}"
83
 
PLUGINDIR="${CONFDIR}/plugins.d"
84
 
mkdir --parents "${DESTDIR}${PLUGINDIR}"
85
 
 
86
 
# We don't need to copy_exec mandos-client, hooks/cryptroot will do
87
 
# that.  That will not copy the plugins, however, so we do that here.
88
 
 
89
 
# The standard plugins
90
 
for file in /usr/lib/mandos/plugins.d/*; do
 
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
91
86
    base="`basename \"$file\"`"
92
87
    # Is this plugin overridden?
93
88
    if [ -e "/etc/mandos/plugins.d/$base" ]; then
94
89
        continue
95
90
    fi
96
91
    case "$base" in
97
 
        *~|.*|\#*\#|*.dpkg-old|*.dpkg-new|*.dpkg-divert) : ;;
98
 
        *) copy_exec "$file" "${PLUGINDIR}";;
 
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}" ;;
99
96
    esac
100
97
done
101
98
 
102
 
# Any user-supplied plugins
 
99
# Copy any user-supplied plugins
103
100
for file in /etc/mandos/plugins.d/*; do
104
101
    base="`basename \"$file\"`"
105
102
    case "$base" in
106
 
        *~|.*|*.dpkg-old|*.dpkg-new|*.dpkg-divert) : ;;
107
 
        *) copy_exec "$file" "${PLUGINDIR}";;
108
 
    esac
 
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
109
148
done
110
149
 
111
150
# GPGME needs /usr/bin/gpg
112
 
if [ -n "`ls \"${DESTDIR}\"/usr/lib/libgpgme.so* 2>/dev/null`" ]; then
 
151
if [ ! -e "${DESTDIR}/usr/bin/gpg" \
 
152
    -a -n "`ls \"${DESTDIR}\"/usr/lib/libgpgme.so* \
 
153
                2>/dev/null`" ]; then
113
154
    copy_exec /usr/bin/gpg
114
155
fi
115
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
 
116
175
# Key files
117
 
for file in /etc/mandos/*; do
 
176
for file in "$keydir"/*; do
118
177
    if [ -d "$file" ]; then
119
178
        continue
120
179
    fi
121
 
    cp --archive --sparse=always "$file" "${DESTCONFDIR}"
 
180
    cp --archive --sparse=always "$file" "${DESTDIR}${CONFDIR}"
 
181
    chown ${mandos_user}:${mandos_group} \
 
182
        "${DESTDIR}${CONFDIR}/`basename \"$file\"`"
122
183
done
123
 
# Create key ring files
124
 
gpg --no-random-seed-file --quiet --batch --no-tty \
125
 
    --no-default-keyring --no-options --homedir "${DESTCONFDIR}" \
126
 
    --no-permission-warning --import-options import-minimal \
127
 
    --import "${DESTCONFDIR}/seckey.txt"
128
 
chown nobody "${DESTCONFDIR}/secring.gpg"
129
184
 
130
 
# /keyscripts/mandos-client will drop priviliges, but needs access to
131
 
# its plugin directory.  However, since almost all files in initrd
132
 
# have been created with umask 027, this opening of permissions is needed.
 
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.
133
189
134
190
# (The umask is not really intended to affect the files inside the
135
 
# initrd, but the initrd.img file itself, since it now contains secret
136
 
# key files.  There is, however, no other way to set the permission of
137
 
# the initrd.img file without a race condition. This umask is set by
138
 
# "/usr/share/initramfs-tools/conf-hooks.d/mandos".)
 
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".)
139
196
140
 
full="${PLUGINDIR}"
141
 
while [ "$full" != "/" ]; do
142
 
    chmod a+rX "${DESTDIR}$full"
143
 
    full="`dirname \"$full\"`"
 
197
for full in "${MANDOSDIR}" "${CONFDIR}"; do
 
198
    while [ "$full" != "/" ]; do
 
199
        chmod a+rX "${DESTDIR}$full"
 
200
        full="`dirname \"$full\"`"
 
201
    done
144
202
done
 
203
 
 
204
# Reset some other things to sane permissions which we have
 
205
# inadvertently affected with our umask setting.
145
206
for dir in / /bin /etc /keyscripts /sbin /scripts /usr /usr/bin; do
146
 
    chmod a+rX "${DESTDIR}$dir"
 
207
    if [ -d "${DESTDIR}$dir" ]; then
 
208
        chmod a+rX "${DESTDIR}$dir"
 
209
    fi
147
210
done
148
 
for dir in /lib /usr/lib; do
149
 
    chmod --recursive a+rX "${DESTDIR}$dir"
 
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
150
216
done