/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

First version of a somewhat complete D-Bus server interface.  Also
change user/group name to "_mandos".

* debian/mandos.postinst: Rename old "mandos" user and group to
                          "_mandos"; create "_mandos" user and group
                          if none exist.
* debian/mandos-client.postinst: - '' -

* initramfs-tools-hook: Try "_mandos" before "mandos" as user and
                        group name.

* mandos (_datetime_to_dbus_struct): New; was previously local.
  (Client.started): Renamed to "last_started".  All users changed.
  (Client.started): New; boolean.
  (Client.dbus_object_path): New.
  (Client.check_command): Renamed to "checker_command".  All users
                          changed.
  (Client.__init__): Set and use "self.dbus_object_path".  Set
                     "self.started".
  (Client.start): Update "self.started".  Emit "self.PropertyChanged"
                  signals for both "started" and "last_started".
  (Client.stop): Update "self.started".  Emit "self.PropertyChanged"
                 signal for "started".
  (Client.checker_callback): Take additional "command" argument.  All
                             callers changed. Emit
                             "self.PropertyChanged" signal.
  (Client.bump_timeout): Emit "self.PropertyChanged" signal for
                         "last_checked_ok".
  (Client.start_checker): Emit "self.PropertyChanged" signal for
                          "checker_running".
  (Client.stop_checker): Emit "self.PropertyChanged" signal for
                         "checker_running".
  (Client.still_valid): Bug fix: use "getattr(self, started, False)"
                        instead of "self.started" in case this client
                        object is so new that the "started" attribute
                        has not been created yet.
  (Client.IntervalChanged, Client.CheckerIsRunning, Client.GetChecker,
  Client.GetCreated, Client.GetFingerprint, Client.GetHost,
  Client.GetInterval, Client.GetName, Client.GetStarted,
  Client.GetTimeout, Client.StateChanged, Client.TimeoutChanged):
  Removed; all callers changed.
  (Client.CheckerCompleted): Add "condition" and "command" arguments.
                             All callers changed.
  (Client.GetAllProperties, Client.PropertyChanged): New.
  (Client.StillValid): Renamed to "IsStillValid".
  (Client.StartChecker): Changed to its own function to avoid the
                         return value from "Client.start_checker()".
  (Client.Stop): Changed to its own function to avoid the return value
                 from "Client.stop()".
  (main): Try "_mandos" before "mandos" as user and group name.
          Removed inner function "remove_from_clients".  New inner
          class "MandosServer".

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
    echo "--userid=${mandos_user}" >> "$PLUGINRUNNERCONF"
 
128
fi
 
129
 
 
130
if [ ${mandos_group} != 65534 ]; then
 
131
    PLUGINRUNNERCONF="${DESTDIR}${CONFDIR}/plugin-runner.conf"
 
132
    echo "--groupid=${mandos_group}" >> "$PLUGINRUNNERCONF"
 
133
fi
 
134
 
 
135
# Key files 
 
136
for file in  "$keydir"/*; do
 
137
    if [ -d "$file" ]; then
 
138
        continue
 
139
    fi
 
140
    cp --archive --sparse=always "$file" "${DESTDIR}${CONFDIR}"
 
141
    chown ${mandos_user}:${mandos_group} \
 
142
        "${DESTDIR}${CONFDIR}/`basename \"$file\"`"
 
143
done
 
144
 
 
145
# /lib/mandos/plugin-runner will drop priviliges, but needs access to
 
146
# its plugin directory and its config file.  However, since almost all
 
147
# files in initrd have been created with umask 027, this opening of
 
148
# permissions is needed.
 
149
 
150
# (The umask is not really intended to affect the files inside the
 
151
# initrd; it is intended to affect the initrd.img file itself, since
 
152
# it now contains secret key files.  There is, however, no other way
 
153
# to set the permission of the initrd.img file without a race
 
154
# condition.  This umask is set by "initramfs-tools-hook-conf",
 
155
# installed as "/usr/share/initramfs-tools/conf-hooks.d/mandos".)
 
156
 
157
for full in "${MANDOSDIR}" "${CONFDIR}"; do
 
158
    while [ "$full" != "/" ]; do
 
159
        chmod a+rX "${DESTDIR}$full"
 
160
        full="`dirname \"$full\"`"
 
161
    done
 
162
done
 
163
 
 
164
# Reset some other things to sane permissions which we have
 
165
# inadvertently affected with our umask setting.
 
166
for dir in / /bin /etc /keyscripts /sbin /scripts /usr /usr/bin; do
 
167
    if [ -d "${DESTDIR}$dir" ]; then
 
168
        chmod a+rX "${DESTDIR}$dir"
 
169
    fi
 
170
done
 
171
for dir in /lib /usr/lib; do
 
172
    find "${DESTDIR}$dir" \! -perm -u+rw,g+r -prune -or -print0 \
 
173
        | xargs --null --no-run-if-empty chmod a+rX
 
174
done