/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:
29
29
 
30
30
. /usr/share/initramfs-tools/hook-functions
31
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
 
32
if [ -d /usr/lib/mandos ]; then
 
33
    prefix=/usr
 
34
elif [ -d /usr/local/lib/mandos ]; then
 
35
    prefix=/usr/local
 
36
else
39
37
    # Mandos not found
40
38
    exit 1
41
39
fi
42
40
 
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
41
# The Mandos network client uses the network
63
42
auto_add_modules net
64
43
# The Mandos network client uses IPv6
68
47
CONFDIR="/conf/conf.d/mandos"
69
48
MANDOSDIR="/lib/mandos"
70
49
PLUGINDIR="${MANDOSDIR}/plugins.d"
71
 
HOOKDIR="${MANDOSDIR}/network-hooks.d"
72
50
 
73
51
# 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}"
 
52
mkdir --parents "${DESTDIR}${CONFDIR}"
 
53
mkdir --parents "${DESTDIR}${PLUGINDIR}"
78
54
 
79
55
# Copy the Mandos plugin runner
80
 
copy_exec "$prefix"/lib/mandos/plugin-runner "${MANDOSDIR}"
 
56
copy_exec "$prefix"/lib/mandos/plugin-runner "${DESTDIR}${MANDOSDIR}"
81
57
 
82
58
# Copy the plugins
83
59
 
89
65
        continue
90
66
    fi
91
67
    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}" ;;
 
68
        *~|.*|\#*\#|*.dpkg-old|*.dpkg-new|*.dpkg-divert) : ;;
 
69
        *) copy_exec "$file" "${PLUGINDIR}";;
96
70
    esac
97
71
done
98
72
 
100
74
for file in /etc/mandos/plugins.d/*; do
101
75
    base="`basename \"$file\"`"
102
76
    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
 
77
        *~|.*|*.dpkg-old|*.dpkg-new|*.dpkg-divert) : ;;
 
78
        *) copy_exec "$file" "${PLUGINDIR}";;
 
79
    esac
148
80
done
149
81
 
150
82
# 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
 
83
if ! [ -e "${DESTDIR}/usr/bin/gpg" ] \
 
84
    && [ -n "`ls \"${DESTDIR}\"/usr/lib/libgpgme.so* 2>/dev/null`" ]; then
154
85
    copy_exec /usr/bin/gpg
155
86
fi
156
87
 
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
88
# Key files
176
 
for file in "$keydir"/*; do
 
89
for file in /etc/mandos/*; do
177
90
    if [ -d "$file" ]; then
178
91
        continue
179
92
    fi
180
93
    cp --archive --sparse=always "$file" "${DESTDIR}${CONFDIR}"
181
 
    chown ${mandos_user}:${mandos_group} \
182
 
        "${DESTDIR}${CONFDIR}/`basename \"$file\"`"
183
94
done
 
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"
184
102
 
185
103
# /lib/mandos/plugin-runner will drop priviliges, but needs access to
186
104
# its plugin directory and its config file.  However, since almost all
194
112
# condition.  This umask is set by "initramfs-tools-hook-conf",
195
113
# installed as "/usr/share/initramfs-tools/conf-hooks.d/mandos".)
196
114
197
 
for full in "${MANDOSDIR}" "${CONFDIR}"; do
 
115
for full in "${PLUGINDIR}" "${CONFDIR}"; do
198
116
    while [ "$full" != "/" ]; do
199
117
        chmod a+rX "${DESTDIR}$full"
200
118
        full="`dirname \"$full\"`"
204
122
# Reset some other things to sane permissions which we have
205
123
# inadvertently affected with our umask setting.
206
124
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
 
125
    chmod a+rX "${DESTDIR}$dir"
210
126
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
 
127
for dir in /lib /usr/lib; do
 
128
    chmod --recursive a+rX "${DESTDIR}$dir"
216
129
done