/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: 2018-08-15 09:26:02 UTC
  • Revision ID: teddy@recompile.se-20180815092602-xoyb5s6gf8376i7u
mandos-client: Set system clock if necessary

* plugins.d/mandos-client.c (init_gpgme/import_key): If the system
  clock is not set, or set to january 1970, set the system clock to
  the more plausible value that is the mtime of the key file.  This is
  required by GnuPG to be able to import the keys.  (We can't pass the
  --ignore-time-conflict or the --ignore-valid-from options though
  GPGME.)

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 the
 
6
# happens when a new 'linux-image' package is installed, or when an
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 /usr/local; do
33
 
    if [ -d "$d"/lib/mandos ]; then
34
 
        prefix="$d"
 
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"
35
37
        break
36
38
    fi
37
39
done
38
 
if [ -z "$prefix" ]; then
 
40
if [ -z "$libdir" ]; then
39
41
    # Mandos not found
40
42
    exit 1
41
43
fi
68
70
CONFDIR="/conf/conf.d/mandos"
69
71
MANDOSDIR="/lib/mandos"
70
72
PLUGINDIR="${MANDOSDIR}/plugins.d"
 
73
PLUGINHELPERDIR="${MANDOSDIR}/plugin-helpers"
 
74
HOOKDIR="${MANDOSDIR}/network-hooks.d"
71
75
 
72
76
# Make directories
73
77
install --directory --mode=u=rwx,go=rx "${DESTDIR}${CONFDIR}" \
74
 
        "${DESTDIR}${MANDOSDIR}"
 
78
        "${DESTDIR}${MANDOSDIR}" "${DESTDIR}${HOOKDIR}"
75
79
install --owner=${mandos_user} --group=${mandos_group} --directory \
76
 
    --mode=u=rwx "${DESTDIR}${PLUGINDIR}"
 
80
        --mode=u=rwx "${DESTDIR}${PLUGINDIR}" \
 
81
        "${DESTDIR}${PLUGINHELPERDIR}"
77
82
 
78
83
# Copy the Mandos plugin runner
79
 
copy_exec "$prefix"/lib/mandos/plugin-runner "${MANDOSDIR}"
 
84
copy_exec "$libdir"/mandos/plugin-runner "${MANDOSDIR}"
80
85
 
81
86
# Copy the plugins
82
87
 
83
88
# Copy the packaged plugins
84
 
for file in "$prefix"/lib/mandos/plugins.d/*; do
 
89
for file in "$libdir"/mandos/plugins.d/*; do
85
90
    base="`basename \"$file\"`"
86
91
    # Is this plugin overridden?
87
92
    if [ -e "/etc/mandos/plugins.d/$base" ]; then
95
100
    esac
96
101
done
97
102
 
 
103
# Copy the packaged plugin helpers
 
104
for file in "$libdir"/mandos/plugin-helpers/*; do
 
105
    base="`basename \"$file\"`"
 
106
    # Is this plugin overridden?
 
107
    if [ -e "/etc/mandos/plugin-helpers/$base" ]; then
 
108
        continue
 
109
    fi
 
110
    case "$base" in
 
111
        *~|.*|\#*\#|*.dpkg-old|*.dpkg-bak|*.dpkg-new|*.dpkg-divert)
 
112
            : ;;
 
113
        "*") : ;;
 
114
        *) copy_exec "$file" "${PLUGINHELPERDIR}" ;;
 
115
    esac
 
116
done
 
117
 
98
118
# Copy any user-supplied plugins
99
119
for file in /etc/mandos/plugins.d/*; do
100
120
    base="`basename \"$file\"`"
106
126
    esac
107
127
done
108
128
 
109
 
# GPGME needs /usr/bin/gpg
110
 
if [ ! -e "${DESTDIR}/usr/bin/gpg" \
111
 
    -a -n "`ls \"${DESTDIR}\"/usr/lib/libgpgme.so* \
112
 
                2>/dev/null`" ]; then
113
 
    copy_exec /usr/bin/gpg
114
 
fi
 
129
# Copy any user-supplied plugin helpers
 
130
for file in /etc/mandos/plugin-helpers/*; do
 
131
    base="`basename \"$file\"`"
 
132
    case "$base" in
 
133
        *~|.*|\#*\#|*.dpkg-old|*.dpkg-bak|*.dpkg-new|*.dpkg-divert)
 
134
            : ;;
 
135
        "*") : ;;
 
136
        *) copy_exec "$file" "${PLUGINHELPERDIR}" ;;
 
137
    esac
 
138
done
 
139
 
 
140
# Get DEVICE from initramfs.conf and other files
 
141
. /etc/initramfs-tools/initramfs.conf
 
142
for conf in /etc/initramfs-tools/conf.d/*; do
 
143
    if [ -n `basename \"$conf\" | grep '^[[:alnum:]][[:alnum:]\._-]*$' \
 
144
        | grep -v '\.dpkg-.*$'` ]; then
 
145
        [ -f "${conf}" ] && . "${conf}"
 
146
    fi
 
147
done
 
148
export DEVICE
 
149
 
 
150
# Copy network hooks
 
151
for hook in /etc/mandos/network-hooks.d/*; do
 
152
    case "`basename \"$hook\"`" in
 
153
        "*") continue ;;
 
154
        *[!A-Za-z0-9_.-]*) continue ;;
 
155
        *) test -d "$hook" || copy_exec "$hook" "${HOOKDIR}" ;;
 
156
    esac
 
157
    if [ -x "$hook" ]; then
 
158
        # Copy any files needed by the network hook
 
159
        MANDOSNETHOOKDIR=/etc/mandos/network-hooks.d MODE=files \
 
160
            VERBOSITY=0 "$hook" files | while read -r file target; do
 
161
            if [ ! -e "${file}" ]; then
 
162
                echo "WARNING: file ${file} not found, requested by Mandos network hook '${hook##*/}'" >&2
 
163
            fi
 
164
            if [ -z "${target}" ]; then
 
165
                copy_exec "$file"
 
166
            else
 
167
                copy_exec "$file" "$target"
 
168
            fi
 
169
        done
 
170
        # Copy and load any modules needed by the network hook
 
171
        MANDOSNETHOOKDIR=/etc/mandos/network-hooks.d MODE=modules \
 
172
            VERBOSITY=0 "$hook" modules | while read -r module; do
 
173
            force_load "$module"
 
174
        done
 
175
    fi
 
176
done
 
177
 
 
178
# GPGME needs GnuPG
 
179
gpg=/usr/bin/gpg
 
180
libgpgme11_version="`dpkg-query --showformat='${Version}' --show libgpgme11`"
 
181
if dpkg --compare-versions "$libgpgme11_version" ge 1.5.0-0.1; then
 
182
    if [ -e /usr/bin/gpgconf ]; then
 
183
        if [ ! -e "${DESTDIR}/usr/bin/gpgconf" ]; then
 
184
            copy_exec /usr/bin/gpgconf
 
185
        fi
 
186
        gpg="`/usr/bin/gpgconf|sed --quiet --expression='s/^gpg:[^:]*://p'`"
 
187
        gpgagent="`/usr/bin/gpgconf|sed --quiet --expression='s/^gpg-agent:[^:]*://p'`"
 
188
        # Newer versions of GnuPG 2 requires the gpg-agent binary
 
189
        if [ -e "$gpgagent" ] && [ ! -e "${DESTDIR}$gpgagent" ]; then
 
190
            copy_exec "$gpgagent"
 
191
        fi
 
192
    fi
 
193
elif dpkg --compare-versions "$libgpgme11_version" ge 1.4.1-0.1; then
 
194
    gpg=/usr/bin/gpg2
 
195
fi
 
196
if [ ! -e "${DESTDIR}$gpg" ]; then
 
197
    copy_exec "$gpg"
 
198
fi
 
199
unset gpg
 
200
unset libgpgme11_version
115
201
 
116
202
# Config files
117
 
for file in /etc/mandos/*; do
 
203
for file in /etc/mandos/plugin-runner.conf; do
118
204
    if [ -d "$file" ]; then
119
205
        continue
120
206
    fi
131
217
        "${DESTDIR}${CONFDIR}/plugin-runner.conf"
132
218
fi
133
219
 
134
 
# Key files 
 
220
# Key files
135
221
for file in "$keydir"/*; do
136
222
    if [ -d "$file" ]; then
137
223
        continue
138
224
    fi
139
 
    cp --archive --sparse=always "$file" "${DESTDIR}${CONFDIR}"
140
 
    chown ${mandos_user}:${mandos_group} \
141
 
        "${DESTDIR}${CONFDIR}/`basename \"$file\"`"
 
225
    case "$file" in
 
226
        *~|.*|\#*\#|*.dpkg-old|*.dpkg-bak|*.dpkg-new|*.dpkg-divert)
 
227
            : ;;
 
228
        "*") : ;;
 
229
        *)
 
230
            cp --archive --sparse=always "$file" \
 
231
               "${DESTDIR}${CONFDIR}"
 
232
            chown ${mandos_user}:${mandos_group} \
 
233
                  "${DESTDIR}${CONFDIR}/`basename \"$file\"`"
 
234
            ;;
 
235
    esac
142
236
done
 
237
# Use Diffie-Hellman parameters file if available
 
238
if [ -e "${DESTDIR}${CONFDIR}"/dhparams.pem ]; then
 
239
    sed --in-place \
 
240
        --expression="1i--options-for=mandos-client:--dh-params=${CONFDIR}/dhparams.pem" \
 
241
        "${DESTDIR}/${CONFDIR}/plugin-runner.conf"
 
242
fi
143
243
 
144
244
# /lib/mandos/plugin-runner will drop priviliges, but needs access to
145
245
# its plugin directory and its config file.  However, since almost all
169
269
done
170
270
for dir in "${DESTDIR}"/lib* "${DESTDIR}"/usr/lib*; do
171
271
    if [ -d "$dir" ]; then
172
 
        find "$dir" \! -perm -u+rw,g+r -prune -or -print0 \
173
 
            | xargs --null --no-run-if-empty chmod a+rX
 
272
        find "$dir" \! -perm -u+rw,g+r -prune -or \! -type l -print0 \
 
273
            | xargs --null --no-run-if-empty chmod a+rX --
174
274
    fi
175
275
done