/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: Björn Påhlsson
  • Date: 2008-07-20 02:52:20 UTC
  • Revision ID: belorn@braxen-20080720025220-r5u0388uy9iu23h6
Added following support:
Pluginbased client handler
rewritten Mandos client
       Avahi instead of udp server discovery
       openpgp encrypted key support
Passprompt stand alone application for direct console input
Added logging for Mandos server

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
#!/bin/sh
2
 
 
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.
9
 
 
10
 
# The environment contains at least:
11
 
#
12
 
#  DESTDIR -- The staging directory where the image is being built.
13
 
 
14
 
# No initramfs pre-requirements
15
 
PREREQ="cryptroot"
16
 
 
17
 
prereqs()
18
 
{
19
 
        echo "$PREREQ"
20
 
}
21
 
 
22
 
case $1 in
23
 
# get pre-requisites
24
 
prereqs)
25
 
        prereqs
26
 
        exit 0
27
 
        ;;
28
 
esac
29
 
 
30
 
. /usr/share/initramfs-tools/hook-functions
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
 
mandos_user="`{ getent passwd _mandos \
55
 
                || getent passwd mandos \
56
 
                || getent passwd nobody \
57
 
                || echo ::65534::::; } \
58
 
        | awk --field-separator=: '{ print $3 }'`" 
59
 
mandos_group="`{ getent group _mandos \
60
 
                || getent group mandos \
61
 
                || getent group nogroup \
62
 
                || echo ::65534:; } \
63
 
        | awk --field-separator=: '{ print $3 }'`"
64
 
 
65
 
# The Mandos network client uses the network
66
 
auto_add_modules net
67
 
# The Mandos network client uses IPv6
68
 
force_load ipv6
69
 
 
70
 
# These are directories inside the initrd
71
 
CONFDIR="/conf/conf.d/mandos"
72
 
MANDOSDIR="/lib/mandos"
73
 
PLUGINDIR="${MANDOSDIR}/plugins.d"
74
 
 
75
 
# Make directories
76
 
install --directory --mode=u=rwx,go=rx "${DESTDIR}${CONFDIR}" \
77
 
        "${DESTDIR}${MANDOSDIR}"
78
 
install --owner=${mandos_user} --group=${mandos_group} --directory \
79
 
    --mode=u=rwx "${DESTDIR}${PLUGINDIR}"
80
 
 
81
 
# Copy the Mandos plugin runner
82
 
copy_exec "$prefix"/lib/mandos/plugin-runner "${MANDOSDIR}"
83
 
 
84
 
# Copy the plugins
85
 
 
86
 
# Copy the packaged plugins
87
 
for file in "$prefix"/lib/mandos/plugins.d/*; do
88
 
    base="`basename \"$file\"`"
89
 
    # Is this plugin overridden?
90
 
    if [ -e "/etc/mandos/plugins.d/$base" ]; then
91
 
        continue
92
 
    fi
93
 
    case "$base" in
94
 
        *~|.*|\#*\#|*.dpkg-old|*.dpkg-bak|*.dpkg-new|*.dpkg-divert) : ;;
95
 
        "*") :;;
96
 
        *) copy_exec "$file" "${PLUGINDIR}";;
97
 
    esac
98
 
done
99
 
 
100
 
# Copy any user-supplied plugins
101
 
for file in /etc/mandos/plugins.d/*; do
102
 
    base="`basename \"$file\"`"
103
 
    case "$base" in
104
 
        *~|.*|\#*\#|*.dpkg-old|*.dpkg-bak|*.dpkg-new|*.dpkg-divert) : ;;
105
 
        "*") :;;
106
 
        *) copy_exec "$file" "${PLUGINDIR}";;
107
 
    esac
108
 
done
109
 
 
110
 
# GPGME needs /usr/bin/gpg
111
 
if [ ! -e "${DESTDIR}/usr/bin/gpg" \
112
 
    -a -n "`ls \"${DESTDIR}\"/usr/lib/libgpgme.so* \
113
 
                2>/dev/null`" ]; then
114
 
    copy_exec /usr/bin/gpg
115
 
fi
116
 
 
117
 
# Config files
118
 
for file in /etc/mandos/*; do
119
 
    if [ -d "$file" ]; then
120
 
        continue
121
 
    fi
122
 
    cp --archive --sparse=always "$file" "${DESTDIR}${CONFDIR}"
123
 
done
124
 
 
125
 
if [ ${mandos_user} != 65534 ]; then
126
 
    PLUGINRUNNERCONF="${DESTDIR}${CONFDIR}/plugin-runner.conf"
127
 
    cat <<-EOF >> "$PLUGINRUNNERCONF"
128
 
        
129
 
        --userid=${mandos_user}
130
 
EOF
131
 
fi
132
 
 
133
 
if [ ${mandos_group} != 65534 ]; then
134
 
    PLUGINRUNNERCONF="${DESTDIR}${CONFDIR}/plugin-runner.conf"
135
 
    cat <<-EOF >> "$PLUGINRUNNERCONF"
136
 
        
137
 
        --groupid=${mandos_group}
138
 
EOF
139
 
fi
140
 
 
141
 
# Key files 
142
 
for file in  "$keydir"/*; do
143
 
    if [ -d "$file" ]; then
144
 
        continue
145
 
    fi
146
 
    cp --archive --sparse=always "$file" "${DESTDIR}${CONFDIR}"
147
 
    chown ${mandos_user}:${mandos_group} \
148
 
        "${DESTDIR}${CONFDIR}/`basename \"$file\"`"
149
 
done
150
 
 
151
 
# /lib/mandos/plugin-runner will drop priviliges, but needs access to
152
 
# its plugin directory and its config file.  However, since almost all
153
 
# files in initrd have been created with umask 027, this opening of
154
 
# permissions is needed.
155
 
156
 
# (The umask is not really intended to affect the files inside the
157
 
# initrd; it is intended to affect the initrd.img file itself, since
158
 
# it now contains secret key files.  There is, however, no other way
159
 
# to set the permission of the initrd.img file without a race
160
 
# condition.  This umask is set by "initramfs-tools-hook-conf",
161
 
# installed as "/usr/share/initramfs-tools/conf-hooks.d/mandos".)
162
 
163
 
for full in "${MANDOSDIR}" "${CONFDIR}"; do
164
 
    while [ "$full" != "/" ]; do
165
 
        chmod a+rX "${DESTDIR}$full"
166
 
        full="`dirname \"$full\"`"
167
 
    done
168
 
done
169
 
 
170
 
# Reset some other things to sane permissions which we have
171
 
# inadvertently affected with our umask setting.
172
 
for dir in / /bin /etc /keyscripts /sbin /scripts /usr /usr/bin; do
173
 
    if [ -d "${DESTDIR}$dir" ]; then
174
 
        chmod a+rX "${DESTDIR}$dir"
175
 
    fi
176
 
done
177
 
for dir in "${DESTDIR}"/lib* "${DESTDIR}"/usr/lib*; do
178
 
    if [ -d "$dir" ]; then
179
 
        find "$dir" \! -perm -u+rw,g+r -prune -or -print0 \
180
 
            | xargs --null --no-run-if-empty chmod a+rX
181
 
    fi
182
 
done