/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: 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:
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
if [ -d /usr/lib/mandos ]; then
 
33
    prefix=/usr
 
34
elif [ -d /usr/local/lib/mandos ]; then
 
35
    prefix=/usr/local
 
36
else
 
37
    # Mandos not found
 
38
    exit 1
 
39
fi
 
40
 
 
41
# The Mandos network client uses the network
76
42
auto_add_modules net
77
 
# force_load tg3
 
43
# The Mandos network client uses IPv6
78
44
force_load ipv6
79
45
 
 
46
# These are directories inside the initrd
80
47
CONFDIR="/conf/conf.d/mandos"
81
 
DESTCONFDIR="${DESTDIR}${CONFDIR}"
82
 
mkdir --parents "${DESTCONFDIR}"
83
 
PLUGINDIR="${CONFDIR}/plugins.d"
 
48
MANDOSDIR="/lib/mandos"
 
49
PLUGINDIR="${MANDOSDIR}/plugins.d"
 
50
 
 
51
# Make directories
 
52
mkdir --parents "${DESTDIR}${CONFDIR}"
84
53
mkdir --parents "${DESTDIR}${PLUGINDIR}"
85
54
 
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
 
55
# Copy the Mandos plugin runner
 
56
copy_exec "$prefix"/lib/mandos/plugin-runner "${DESTDIR}${MANDOSDIR}"
 
57
 
 
58
# Copy the plugins
 
59
 
 
60
# Copy the packaged plugins
 
61
for file in "$prefix"/lib/mandos/plugins.d/*; do
91
62
    base="`basename \"$file\"`"
92
63
    # Is this plugin overridden?
93
64
    if [ -e "/etc/mandos/plugins.d/$base" ]; then
99
70
    esac
100
71
done
101
72
 
102
 
# Any user-supplied plugins
 
73
# Copy any user-supplied plugins
103
74
for file in /etc/mandos/plugins.d/*; do
104
75
    base="`basename \"$file\"`"
105
76
    case "$base" in
109
80
done
110
81
 
111
82
# GPGME needs /usr/bin/gpg
112
 
if [ -n "`ls \"${DESTDIR}\"/usr/lib/libgpgme.so* 2>/dev/null`" ]; then
 
83
if ! [ -e "${DESTDIR}/usr/bin/gpg" ] \
 
84
    && [ -n "`ls \"${DESTDIR}\"/usr/lib/libgpgme.so* 2>/dev/null`" ]; then
113
85
    copy_exec /usr/bin/gpg
114
86
fi
115
87
 
118
90
    if [ -d "$file" ]; then
119
91
        continue
120
92
    fi
121
 
    cp --archive --sparse=always "$file" "${DESTCONFDIR}"
 
93
    cp --archive --sparse=always "$file" "${DESTDIR}${CONFDIR}"
122
94
done
123
95
# Create key ring files
124
96
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"
 
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"
129
102
 
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.
 
103
# /lib/mandos/plugin-runner will drop priviliges, but needs access to
 
104
# its plugin directory and its config file.  However, since almost all
 
105
# files in initrd have been created with umask 027, this opening of
 
106
# permissions is needed.
133
107
134
108
# (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".)
 
109
# initrd; it is intended to affect the initrd.img file itself, since
 
110
# it now contains secret key files.  There is, however, no other way
 
111
# to set the permission of the initrd.img file without a race
 
112
# condition.  This umask is set by "initramfs-tools-hook-conf",
 
113
# installed as "/usr/share/initramfs-tools/conf-hooks.d/mandos".)
139
114
140
 
full="${PLUGINDIR}"
141
 
while [ "$full" != "/" ]; do
142
 
    chmod a+rX "${DESTDIR}$full"
143
 
    full="`dirname \"$full\"`"
 
115
for full in "${PLUGINDIR}" "${CONFDIR}"; do
 
116
    while [ "$full" != "/" ]; do
 
117
        chmod a+rX "${DESTDIR}$full"
 
118
        full="`dirname \"$full\"`"
 
119
    done
144
120
done
 
121
 
 
122
# Reset some other things to sane permissions which we have
 
123
# inadvertently affected with our umask setting.
145
124
for dir in / /bin /etc /keyscripts /sbin /scripts /usr /usr/bin; do
146
125
    chmod a+rX "${DESTDIR}$dir"
147
126
done