/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-16 03:29:08 UTC
  • Revision ID: teddy@fukt.bsnet.se-20080816032908-ihw7c05r2mnyk389
Add feature to specify custom environment variables for plugins.

* plugin-runner.c (plugin): New members "environ" and "envc" to
                            contain possible custom environment.
  (getplugin): Return NULL on failure instead of doing exit(); all
               callers changed.
  (add_to_char_array): New helper function for "add_argument" and
                       "add_environment".
  (addargument): Renamed to "add_argument".  Return bool.  Call
                 "add_to_char_array" to actually do things.
  (add_environment): New; analogous to "add_argument".
  (addcustomargument): Renamed to "add_to_argv" to avoid confusion
                       with "add_argument".
  (main): New options "--global-envs" and "--envs-for" to specify
          custom environment for plugins.  Print environment for
          plugins in debug mode.  Use asprintf instead of strcpy and
          strcat.  Use execve() for plugins with custom environments.
          Free environment for plugin when freeing plugin list.

Show diffs side-by-side

added added

removed removed

Lines of Context:
3
3
# This script will be run by 'mkinitramfs' when it creates the image.
4
4
# Its job is to decide which files to install, then install them into
5
5
# the staging area, where the initramfs is being created.  This
6
 
# happens when a new 'linux-image' package is installed, or when an
 
6
# happens when a new 'linux-image' package is installed, or when the
7
7
# administrator runs 'update-initramfs' by hand to update an initramfs
8
8
# image.
9
9
 
29
29
 
30
30
. /usr/share/initramfs-tools/hook-functions
31
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
 
32
if [ -d /usr/lib/mandos ]; then
 
33
    prefix=/usr
 
34
elif [ -d /usr/local/lib/mandos ]; then
 
35
    prefix=/usr/local
 
36
else
41
37
    # Mandos not found
42
38
    exit 1
43
39
fi
44
40
 
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
41
# The Mandos network client uses the network
65
42
auto_add_modules net
66
43
# The Mandos network client uses IPv6
70
47
CONFDIR="/conf/conf.d/mandos"
71
48
MANDOSDIR="/lib/mandos"
72
49
PLUGINDIR="${MANDOSDIR}/plugins.d"
73
 
PLUGINHELPERDIR="${MANDOSDIR}/plugin-helpers"
74
 
HOOKDIR="${MANDOSDIR}/network-hooks.d"
75
50
 
76
51
# 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}"
 
52
mkdir --parents "${DESTDIR}${CONFDIR}"
 
53
mkdir --parents "${DESTDIR}${PLUGINDIR}"
84
54
 
85
55
# Copy the Mandos plugin runner
86
 
copy_exec "$libdir"/mandos/plugin-runner "${MANDOSDIR}"
 
56
copy_exec "$prefix"/lib/mandos/plugin-runner "${DESTDIR}${MANDOSDIR}"
87
57
 
88
58
# Copy the plugins
89
59
 
90
60
# Copy the packaged plugins
91
 
for file in "$libdir"/mandos/plugins.d/*; do
 
61
for file in "$prefix"/lib/mandos/plugins.d/*; do
92
62
    base="`basename \"$file\"`"
93
63
    # Is this plugin overridden?
94
64
    if [ -e "/etc/mandos/plugins.d/$base" ]; then
95
65
        continue
96
66
    fi
97
67
    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}" ;;
 
68
        *~|.*|\#*\#|*.dpkg-old|*.dpkg-new|*.dpkg-divert) : ;;
 
69
        *) copy_exec "$file" "${PLUGINDIR}";;
117
70
    esac
118
71
done
119
72
 
121
74
for file in /etc/mandos/plugins.d/*; do
122
75
    base="`basename \"$file\"`"
123
76
    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\" \
146
 
        | grep '^[[:alnum:]][[:alnum:]\._-]*$' \
147
 
        | grep -v '\.dpkg-.*$'`" ]; then
148
 
        [ -f "${conf}" ] && . "${conf}"
149
 
    fi
150
 
done
151
 
export DEVICE
152
 
 
153
 
# Copy network hooks
154
 
for hook in /etc/mandos/network-hooks.d/*; do
155
 
    case "`basename \"$hook\"`" in
156
 
        "*") continue ;;
157
 
        *[!A-Za-z0-9_.-]*) continue ;;
158
 
        *) test -d "$hook" || copy_exec "$hook" "${HOOKDIR}" ;;
159
 
    esac
160
 
    if [ -x "$hook" ]; then
161
 
        # Copy any files needed by the network hook
162
 
        MANDOSNETHOOKDIR=/etc/mandos/network-hooks.d MODE=files \
163
 
            VERBOSITY=0 "$hook" files | while read -r file target; do
164
 
            if [ ! -e "${file}" ]; then
165
 
                echo "WARNING: file ${file} not found, requested by Mandos network hook '${hook##*/}'" >&2
166
 
            fi
167
 
            if [ -z "${target}" ]; then
168
 
                copy_exec "$file"
169
 
            else
170
 
                copy_exec "$file" "$target"
171
 
            fi
172
 
        done
173
 
        # Copy and load any modules needed by the network hook
174
 
        MANDOSNETHOOKDIR=/etc/mandos/network-hooks.d MODE=modules \
175
 
            VERBOSITY=0 "$hook" modules | while read -r module; do
176
 
            force_load "$module"
177
 
        done
178
 
    fi
179
 
done
180
 
 
181
 
# GPGME needs GnuPG
182
 
gpg=/usr/bin/gpg
183
 
libgpgme11_version="`dpkg-query --showformat='${Version}\n' --show libgpgme11t64 libgpgme11 2>/dev/null | sed --quiet --expression='/./{p;q}'`"
184
 
if dpkg --compare-versions "$libgpgme11_version" ge 1.5.0-0.1; then
185
 
    if [ -e /usr/bin/gpgconf ]; then
186
 
        if [ ! -e "${DESTDIR}/usr/bin/gpgconf" ]; then
187
 
            copy_exec /usr/bin/gpgconf
188
 
        fi
189
 
        gpg="`/usr/bin/gpgconf|sed --quiet --expression='s/^gpg:[^:]*://p'`"
190
 
        gpgagent="`/usr/bin/gpgconf|sed --quiet --expression='s/^gpg-agent:[^:]*://p'`"
191
 
        # Newer versions of GnuPG 2 requires the gpg-agent binary
192
 
        if [ -e "$gpgagent" ] && [ ! -e "${DESTDIR}$gpgagent" ]; then
193
 
            copy_exec "$gpgagent"
194
 
        fi
195
 
    fi
196
 
elif dpkg --compare-versions "$libgpgme11_version" ge 1.4.1-0.1; then
197
 
    gpg=/usr/bin/gpg2
198
 
fi
199
 
if [ ! -e "${DESTDIR}$gpg" ]; then
200
 
    copy_exec "$gpg"
201
 
fi
202
 
unset gpg
203
 
unset libgpgme11_version
204
 
 
205
 
# Config files
206
 
for file in /etc/mandos/plugin-runner.conf; do
 
77
        *~|.*|*.dpkg-old|*.dpkg-new|*.dpkg-divert) : ;;
 
78
        *) copy_exec "$file" "${PLUGINDIR}";;
 
79
    esac
 
80
done
 
81
 
 
82
# GPGME needs /usr/bin/gpg
 
83
if ! [ -e "${DESTDIR}/usr/bin/gpg" ] \
 
84
    && [ -n "`ls \"${DESTDIR}\"/usr/lib/libgpgme.so* 2>/dev/null`" ]; then
 
85
    copy_exec /usr/bin/gpg
 
86
fi
 
87
 
 
88
# Key files
 
89
for file in /etc/mandos/*; do
207
90
    if [ -d "$file" ]; then
208
91
        continue
209
92
    fi
210
93
    cp --archive --sparse=always "$file" "${DESTDIR}${CONFDIR}"
211
94
done
212
 
 
213
 
if [ ${mandos_user} != 65534 ]; then
214
 
    sed --in-place --expression="1i--userid=${mandos_user}" \
215
 
        "${DESTDIR}${CONFDIR}/plugin-runner.conf"
216
 
fi
217
 
 
218
 
if [ ${mandos_group} != 65534 ]; then
219
 
    sed --in-place --expression="1i--groupid=${mandos_group}" \
220
 
        "${DESTDIR}${CONFDIR}/plugin-runner.conf"
221
 
fi
222
 
 
223
 
# Key files
224
 
for file in "$keydir"/*; do
225
 
    if [ -d "$file" ]; then
226
 
        continue
227
 
    fi
228
 
    case "$file" in
229
 
        *~|.*|\#*\#|*.dpkg-old|*.dpkg-bak|*.dpkg-new|*.dpkg-divert)
230
 
            : ;;
231
 
        "*") : ;;
232
 
        *)
233
 
            cp --archive --sparse=always "$file" \
234
 
               "${DESTDIR}${CONFDIR}"
235
 
            chown ${mandos_user}:${mandos_group} \
236
 
                  "${DESTDIR}${CONFDIR}/`basename \"$file\"`"
237
 
            ;;
238
 
    esac
239
 
done
240
 
# Use Diffie-Hellman parameters file if available
241
 
if [ -e "${DESTDIR}${CONFDIR}"/dhparams.pem ]; then
242
 
    sed --in-place \
243
 
        --expression="1i--options-for=mandos-client:--dh-params=${CONFDIR}/dhparams.pem" \
244
 
        "${DESTDIR}/${CONFDIR}/plugin-runner.conf"
245
 
fi
 
95
# Create key ring files
 
96
gpg --no-random-seed-file --quiet --batch --no-tty \
 
97
    --no-default-keyring --no-options \
 
98
    --homedir "${DESTDIR}${CONFDIR}" --no-permission-warning \
 
99
    --import-options import-minimal \
 
100
    --import "${DESTDIR}${CONFDIR}/seckey.txt"
 
101
chown nobody "${DESTDIR}${CONFDIR}/secring.gpg"
246
102
 
247
103
# /lib/mandos/plugin-runner will drop priviliges, but needs access to
248
104
# its plugin directory and its config file.  However, since almost all
253
109
# initrd; it is intended to affect the initrd.img file itself, since
254
110
# it now contains secret key files.  There is, however, no other way
255
111
# to set the permission of the initrd.img file without a race
256
 
# condition.  This umask is set by "initramfs-tools-conf", installed
257
 
# as "/usr/share/initramfs-tools/conf.d/mandos-conf".)
 
112
# condition.  This umask is set by "initramfs-tools-hook-conf",
 
113
# installed as "/usr/share/initramfs-tools/conf-hooks.d/mandos".)
258
114
259
 
for full in "${MANDOSDIR}" "${CONFDIR}"; do
 
115
for full in "${PLUGINDIR}" "${CONFDIR}"; do
260
116
    while [ "$full" != "/" ]; do
261
117
        chmod a+rX "${DESTDIR}$full"
262
118
        full="`dirname \"$full\"`"
266
122
# Reset some other things to sane permissions which we have
267
123
# inadvertently affected with our umask setting.
268
124
for dir in / /bin /etc /keyscripts /sbin /scripts /usr /usr/bin; do
269
 
    if [ -d "${DESTDIR}$dir" ]; then
270
 
        chmod a+rX "${DESTDIR}$dir"
271
 
    fi
 
125
    chmod a+rX "${DESTDIR}$dir"
272
126
done
273
 
for dir in "${DESTDIR}"/lib* "${DESTDIR}"/usr/lib*; do
274
 
    if [ -d "$dir" ]; then
275
 
        find "$dir" \! -perm -u+rw,g+r -prune -or \! -type l -print0 \
276
 
            | xargs --null --no-run-if-empty chmod a+rX --
277
 
    fi
 
127
for dir in /lib /usr/lib; do
 
128
    chmod --recursive a+rX "${DESTDIR}$dir"
278
129
done