/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}" \
79
 
        "${DESTDIR}${PLUGINHELPERDIR}"
 
77
        "${DESTDIR}${MANDOSDIR}"
80
78
install --owner=${mandos_user} --group=${mandos_group} --directory \
81
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
 
    fi
190
 
elif dpkg --compare-versions "$libgpgme11_version" ge 1.4.1-0.1; then
191
 
    gpg=/usr/bin/gpg2
192
 
fi
193
 
if [ ! -e "${DESTDIR}$gpg" ]; then
194
 
    copy_exec "$gpg"
195
 
fi
196
 
unset gpg
197
 
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
198
116
 
199
117
# Config files
200
 
for file in /etc/mandos/plugin-runner.conf; do
 
118
for file in /etc/mandos/*; do
201
119
    if [ -d "$file" ]; then
202
120
        continue
203
121
    fi
205
123
done
206
124
 
207
125
if [ ${mandos_user} != 65534 ]; then
208
 
    sed --in-place --expression="1i--userid=${mandos_user}" \
209
 
        "${DESTDIR}${CONFDIR}/plugin-runner.conf"
 
126
    PLUGINRUNNERCONF="${DESTDIR}${CONFDIR}/plugin-runner.conf"
 
127
    echo "--userid=${mandos_user}" >> "$PLUGINRUNNERCONF"
210
128
fi
211
129
 
212
130
if [ ${mandos_group} != 65534 ]; then
213
 
    sed --in-place --expression="1i--groupid=${mandos_group}" \
214
 
        "${DESTDIR}${CONFDIR}/plugin-runner.conf"
 
131
    PLUGINRUNNERCONF="${DESTDIR}${CONFDIR}/plugin-runner.conf"
 
132
    echo "--groupid=${mandos_group}" >> "$PLUGINRUNNERCONF"
215
133
fi
216
134
 
217
 
# Key files
218
 
for file in "$keydir"/*; do
 
135
# Key files 
 
136
for file in  "$keydir"/*; do
219
137
    if [ -d "$file" ]; then
220
138
        continue
221
139
    fi
222
 
    case "$file" in
223
 
        *~|.*|\#*\#|*.dpkg-old|*.dpkg-bak|*.dpkg-new|*.dpkg-divert)
224
 
            : ;;
225
 
        "*") : ;;
226
 
        *)
227
 
            cp --archive --sparse=always "$file" \
228
 
               "${DESTDIR}${CONFDIR}"
229
 
            chown ${mandos_user}:${mandos_group} \
230
 
                  "${DESTDIR}${CONFDIR}/`basename \"$file\"`"
231
 
            ;;
232
 
    esac
 
140
    cp --archive --sparse=always "$file" "${DESTDIR}${CONFDIR}"
 
141
    chown ${mandos_user}:${mandos_group} \
 
142
        "${DESTDIR}${CONFDIR}/`basename \"$file\"`"
233
143
done
234
 
# Use Diffie-Hellman parameters file if available
235
 
if [ -e "${DESTDIR}${CONFDIR}"/dhparams.pem ]; then
236
 
    sed --in-place \
237
 
        --expression="1i--options-for=mandos-client:--dh-params=${CONFDIR}/dhparams.pem" \
238
 
        "${DESTDIR}/${CONFDIR}/plugin-runner.conf"
239
 
fi
240
144
 
241
145
# /lib/mandos/plugin-runner will drop priviliges, but needs access to
242
146
# its plugin directory and its config file.  However, since almost all
264
168
        chmod a+rX "${DESTDIR}$dir"
265
169
    fi
266
170
done
267
 
for dir in "${DESTDIR}"/lib* "${DESTDIR}"/usr/lib*; do
268
 
    if [ -d "$dir" ]; then
269
 
        find "$dir" \! -perm -u+rw,g+r -prune -or \! -type l -print0 \
270
 
            | xargs --null --no-run-if-empty chmod a+rX --
271
 
    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
272
174
done