/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
 
HOOKDIR="${MANDOSDIR}/network-hooks.d"
74
74
 
75
75
# Make directories
76
76
install --directory --mode=u=rwx,go=rx "${DESTDIR}${CONFDIR}" \
77
 
        "${DESTDIR}${MANDOSDIR}" "${DESTDIR}${HOOKDIR}"
 
77
        "${DESTDIR}${MANDOSDIR}"
78
78
install --owner=${mandos_user} --group=${mandos_group} --directory \
79
79
    --mode=u=rwx "${DESTDIR}${PLUGINDIR}"
80
80
 
81
81
# Copy the Mandos plugin runner
82
 
copy_exec "$libdir"/mandos/plugin-runner "${MANDOSDIR}"
 
82
copy_exec "$prefix"/lib/mandos/plugin-runner "${MANDOSDIR}"
83
83
 
84
84
# Copy the plugins
85
85
 
86
86
# Copy the packaged plugins
87
 
for file in "$libdir"/mandos/plugins.d/*; do
 
87
for file in "$prefix"/lib/mandos/plugins.d/*; do
88
88
    base="`basename \"$file\"`"
89
89
    # Is this plugin overridden?
90
90
    if [ -e "/etc/mandos/plugins.d/$base" ]; then
91
91
        continue
92
92
    fi
93
93
    case "$base" in
94
 
        *~|.*|\#*\#|*.dpkg-old|*.dpkg-bak|*.dpkg-new|*.dpkg-divert)
95
 
            : ;;
96
 
        "*") echo "W: Mandos client plugin directory is empty." >&2 ;;
97
 
        *) copy_exec "$file" "${PLUGINDIR}" ;;
 
94
        *~|.*|\#*\#|*.dpkg-old|*.dpkg-bak|*.dpkg-new|*.dpkg-divert) : ;;
 
95
        "*") :;;
 
96
        *) copy_exec "$file" "${PLUGINDIR}";;
98
97
    esac
99
98
done
100
99
 
102
101
for file in /etc/mandos/plugins.d/*; do
103
102
    base="`basename \"$file\"`"
104
103
    case "$base" in
105
 
        *~|.*|\#*\#|*.dpkg-old|*.dpkg-bak|*.dpkg-new|*.dpkg-divert)
106
 
            : ;;
107
 
        "*") : ;;
108
 
        *) copy_exec "$file" "${PLUGINDIR}" ;;
109
 
    esac
110
 
done
111
 
 
112
 
# Get DEVICE from initramfs.conf and other files
113
 
. /etc/initramfs-tools/initramfs.conf
114
 
for conf in /etc/initramfs-tools/conf.d/*; do
115
 
    if [ -n `basename \"$conf\" | grep '^[[:alnum:]][[:alnum:]\._-]*$' \
116
 
        | grep -v '\.dpkg-.*$'` ]; then
117
 
        [ -f ${conf} ] && . ${conf}
118
 
    fi
119
 
done
120
 
export DEVICE
121
 
 
122
 
# Copy network hooks
123
 
for hook in /etc/mandos/network-hooks.d/*; do
124
 
    case "`basename \"$hook\"`" in
125
 
        "*") continue ;;
126
 
        *[!A-Za-z0-9_.-]*) continue ;;
127
 
        *) test -d "$hook" || copy_exec "$hook" "${HOOKDIR}" ;;
128
 
    esac
129
 
    if [ -x "$hook" ]; then
130
 
        # Copy any files needed by the network hook
131
 
        MANDOSNETHOOKDIR=/etc/mandos/network-hooks.d MODE=files \
132
 
            VERBOSITY=0 "$hook" files | while read file target; do
133
 
            if [ ! -e "${file}" ]; then
134
 
                echo "WARNING: file ${file} not found, requested by Mandos network hook '${hook##*/}'" >&2
135
 
            fi
136
 
            if [ -z "${target}" ]; then
137
 
                copy_exec "$file"
138
 
            else
139
 
                copy_exec "$file" "$target"
140
 
            fi
141
 
        done
142
 
        # Copy and load any modules needed by the network hook
143
 
        MANDOSNETHOOKDIR=/etc/mandos/network-hooks.d MODE=modules \
144
 
            VERBOSITY=0 "$hook" modules | while read module; do
145
 
            if [ -z "${target}" ]; then
146
 
                force_load "$module"
147
 
            fi
148
 
        done
149
 
    fi
150
 
done
151
 
 
152
 
# GPGME needs GnuPG
153
 
libgpgme11_version="`dpkg-query --showformat='${Version}' --show libgpgme11`"
154
 
if dpkg --compare-versions "$libgpgme11_version" ge 1.4.1-0.1; then
155
 
    gpg=/usr/bin/gpg2
156
 
else
157
 
    gpg=/usr/bin/gpg
158
 
fi
159
 
if [ ! -e "${DESTDIR}$gpg" ]; then
160
 
    copy_exec "$gpg"
161
 
fi
162
 
unset gpg
163
 
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
164
116
 
165
117
# Config files
166
 
for file in /etc/mandos/plugin-runner.conf; do
 
118
for file in /etc/mandos/*; do
167
119
    if [ -d "$file" ]; then
168
120
        continue
169
121
    fi
171
123
done
172
124
 
173
125
if [ ${mandos_user} != 65534 ]; then
174
 
    sed --in-place --expression="1i--userid=${mandos_user}" \
175
 
        "${DESTDIR}${CONFDIR}/plugin-runner.conf"
 
126
    PLUGINRUNNERCONF="${DESTDIR}${CONFDIR}/plugin-runner.conf"
 
127
    echo "--userid=${mandos_user}" >> "$PLUGINRUNNERCONF"
176
128
fi
177
129
 
178
130
if [ ${mandos_group} != 65534 ]; then
179
 
    sed --in-place --expression="1i--groupid=${mandos_group}" \
180
 
        "${DESTDIR}${CONFDIR}/plugin-runner.conf"
 
131
    PLUGINRUNNERCONF="${DESTDIR}${CONFDIR}/plugin-runner.conf"
 
132
    echo "--groupid=${mandos_group}" >> "$PLUGINRUNNERCONF"
181
133
fi
182
134
 
183
 
# Key files
184
 
for file in "$keydir"/*; do
 
135
# Key files 
 
136
for file in  "$keydir"/*; do
185
137
    if [ -d "$file" ]; then
186
138
        continue
187
139
    fi
216
168
        chmod a+rX "${DESTDIR}$dir"
217
169
    fi
218
170
done
219
 
for dir in "${DESTDIR}"/lib* "${DESTDIR}"/usr/lib*; do
220
 
    if [ -d "$dir" ]; then
221
 
        find "$dir" \! -perm -u+rw,g+r -prune -or -print0 \
222
 
            | xargs --null --no-run-if-empty chmod a+rX
223
 
    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
224
174
done