/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:
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 an
 
6
# happens when a new 'linux-image' package is installed, or when the
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/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"
 
32
for d in /usr /usr/local; do
 
33
    if [ -d "$d"/lib/mandos ]; then
 
34
        prefix="$d"
37
35
        break
38
36
    fi
39
37
done
40
 
if [ -z "$libdir" ]; then
 
38
if [ -z "$prefix" ]; then
41
39
    # Mandos not found
42
40
    exit 1
43
41
fi
53
51
    exit 1
54
52
fi
55
53
 
56
 
set `{ getent passwd _mandos \
57
 
    || getent passwd nobody \
58
 
    || echo ::65534:65534:::; } \
59
 
    | cut --delimiter=: --fields=3,4 --only-delimited \
60
 
    --output-delimiter=" "`
61
 
mandos_user="$1"
62
 
mandos_group="$2"
 
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 }'`"
63
64
 
64
65
# The Mandos network client uses the network
65
66
auto_add_modules net
70
71
CONFDIR="/conf/conf.d/mandos"
71
72
MANDOSDIR="/lib/mandos"
72
73
PLUGINDIR="${MANDOSDIR}/plugins.d"
73
 
PLUGINHELPERDIR="${MANDOSDIR}/plugin-helpers"
74
 
HOOKDIR="${MANDOSDIR}/network-hooks.d"
75
74
 
76
75
# Make directories
77
76
install --directory --mode=u=rwx,go=rx "${DESTDIR}${CONFDIR}" \
78
 
        "${DESTDIR}${MANDOSDIR}" "${DESTDIR}${HOOKDIR}"
 
77
        "${DESTDIR}${MANDOSDIR}"
79
78
install --owner=${mandos_user} --group=${mandos_group} --directory \
80
 
        --mode=u=rwx "${DESTDIR}${PLUGINDIR}" \
81
 
        "${DESTDIR}${PLUGINHELPERDIR}"
 
79
    --mode=u=rwx "${DESTDIR}${PLUGINDIR}"
82
80
 
83
81
# Copy the Mandos plugin runner
84
 
copy_exec "$libdir"/mandos/plugin-runner "${MANDOSDIR}"
 
82
copy_exec "$prefix"/lib/mandos/plugin-runner "${MANDOSDIR}"
85
83
 
86
84
# Copy the plugins
87
85
 
88
86
# Copy the packaged plugins
89
 
for file in "$libdir"/mandos/plugins.d/*; do
 
87
for file in "$prefix"/lib/mandos/plugins.d/*; do
90
88
    base="`basename \"$file\"`"
91
89
    # Is this plugin overridden?
92
90
    if [ -e "/etc/mandos/plugins.d/$base" ]; then
93
91
        continue
94
92
    fi
95
93
    case "$base" in
96
 
        *~|.*|\#*\#|*.dpkg-old|*.dpkg-bak|*.dpkg-new|*.dpkg-divert)
97
 
            : ;;
98
 
        "*") echo "W: Mandos client plugin directory is empty." >&2 ;;
99
 
        *) copy_exec "$file" "${PLUGINDIR}" ;;
100
 
    esac
101
 
done
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}" ;;
 
94
        *~|.*|\#*\#|*.dpkg-old|*.dpkg-bak|*.dpkg-new|*.dpkg-divert) : ;;
 
95
        "*") :;;
 
96
        *) copy_exec "$file" "${PLUGINDIR}";;
115
97
    esac
116
98
done
117
99
 
119
101
for file in /etc/mandos/plugins.d/*; do
120
102
    base="`basename \"$file\"`"
121
103
    case "$base" in
122
 
        *~|.*|\#*\#|*.dpkg-old|*.dpkg-bak|*.dpkg-new|*.dpkg-divert)
123
 
            : ;;
124
 
        "*") : ;;
125
 
        *) copy_exec "$file" "${PLUGINDIR}" ;;
126
 
    esac
127
 
done
128
 
 
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 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 module; do
173
 
            if [ -z "${target}" ]; then
174
 
                force_load "$module"
175
 
            fi
176
 
        done
177
 
    fi
178
 
done
179
 
 
180
 
# GPGME needs GnuPG
181
 
gpg=/usr/bin/gpg
182
 
libgpgme11_version="`dpkg-query --showformat='${Version}' --show libgpgme11`"
183
 
if dpkg --compare-versions "$libgpgme11_version" ge 1.5.0-0.1; then
184
 
    if [ -e /usr/bin/gpgconf ]; then
185
 
        if [ ! -e "${DESTDIR}/usr/bin/gpgconf" ]; then
186
 
            copy_exec /usr/bin/gpgconf
187
 
        fi
188
 
        gpg="`/usr/bin/gpgconf|sed --quiet --expression='s/^gpg:[^:]*://p'`"
189
 
        gpgagent="`/usr/bin/gpgconf|sed --quiet --expression='s/^gpg-agent:[^:]*://p'`"
190
 
        # Newer versions of GnuPG 2 requires the gpg-agent binary
191
 
        if [ -e "$gpgagent" ] && [ ! -e "${DESTDIR}$gpgagent" ]; then
192
 
            copy_exec "$gpgagent"
193
 
        fi
194
 
    fi
195
 
elif dpkg --compare-versions "$libgpgme11_version" ge 1.4.1-0.1; then
196
 
    gpg=/usr/bin/gpg2
197
 
fi
198
 
if [ ! -e "${DESTDIR}$gpg" ]; then
199
 
    copy_exec "$gpg"
200
 
fi
201
 
unset gpg
202
 
unset libgpgme11_version
 
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
203
116
 
204
117
# Config files
205
 
for file in /etc/mandos/plugin-runner.conf; do
 
118
for file in /etc/mandos/*; do
206
119
    if [ -d "$file" ]; then
207
120
        continue
208
121
    fi
210
123
done
211
124
 
212
125
if [ ${mandos_user} != 65534 ]; then
213
 
    sed --in-place --expression="1i--userid=${mandos_user}" \
214
 
        "${DESTDIR}${CONFDIR}/plugin-runner.conf"
 
126
    PLUGINRUNNERCONF="${DESTDIR}${CONFDIR}/plugin-runner.conf"
 
127
    echo "--userid=${mandos_user}" >> "$PLUGINRUNNERCONF"
215
128
fi
216
129
 
217
130
if [ ${mandos_group} != 65534 ]; then
218
 
    sed --in-place --expression="1i--groupid=${mandos_group}" \
219
 
        "${DESTDIR}${CONFDIR}/plugin-runner.conf"
 
131
    PLUGINRUNNERCONF="${DESTDIR}${CONFDIR}/plugin-runner.conf"
 
132
    echo "--groupid=${mandos_group}" >> "$PLUGINRUNNERCONF"
220
133
fi
221
134
 
222
 
# Key files
223
 
for file in "$keydir"/*; do
 
135
# Key files 
 
136
for file in  "$keydir"/*; do
224
137
    if [ -d "$file" ]; then
225
138
        continue
226
139
    fi
227
 
    case "$file" in
228
 
        *~|.*|\#*\#|*.dpkg-old|*.dpkg-bak|*.dpkg-new|*.dpkg-divert)
229
 
            : ;;
230
 
        "*") : ;;
231
 
        *)
232
 
            cp --archive --sparse=always "$file" \
233
 
               "${DESTDIR}${CONFDIR}"
234
 
            chown ${mandos_user}:${mandos_group} \
235
 
                  "${DESTDIR}${CONFDIR}/`basename \"$file\"`"
236
 
            ;;
237
 
    esac
 
140
    cp --archive --sparse=always "$file" "${DESTDIR}${CONFDIR}"
 
141
    chown ${mandos_user}:${mandos_group} \
 
142
        "${DESTDIR}${CONFDIR}/`basename \"$file\"`"
238
143
done
239
 
# Use Diffie-Hellman parameters file if available
240
 
if [ -e "${DESTDIR}${CONFDIR}"/dhparams.pem ]; then
241
 
    sed --in-place \
242
 
        --expression="1i--options-for=mandos-client:--dh-params=${CONFDIR}/dhparams.pem" \
243
 
        "${DESTDIR}/${CONFDIR}/plugin-runner.conf"
244
 
fi
245
144
 
246
145
# /lib/mandos/plugin-runner will drop priviliges, but needs access to
247
146
# its plugin directory and its config file.  However, since almost all
269
168
        chmod a+rX "${DESTDIR}$dir"
270
169
    fi
271
170
done
272
 
for dir in "${DESTDIR}"/lib* "${DESTDIR}"/usr/lib*; do
273
 
    if [ -d "$dir" ]; then
274
 
        find "$dir" \! -perm -u+rw,g+r -prune -or \! -type l -print0 \
275
 
            | xargs --null --no-run-if-empty chmod a+rX --
276
 
    fi
 
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
277
174
done