/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-script

  • Committer: Teddy Hogeborn
  • Date: 2008-12-10 01:26:02 UTC
  • mfrom: (237.1.2 mandos)
  • Revision ID: teddy@fukt.bsnet.se-20081210012602-vhz3h75xkj24t340
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:
6
6
7
7
 
8
8
# This script should be installed as
9
 
# "/usr/share/initramfs-tools/scripts/init-premount/mandos" which will
10
 
# eventually be "/scripts/init-premount/mandos" in the initrd.img
11
 
# file.
 
9
# "/usr/share/initramfs-tools/scripts/local-top/mandos" which will
 
10
# eventually be "/scripts/local-top/mandos" in the initrd.img file.
12
11
 
13
 
PREREQ="udev"
 
12
# No initramfs pre-requirements; we must instead run BEFORE cryptroot.
 
13
# This is not a problem, since cryptroot forces itself to run LAST.
 
14
PREREQ=""
14
15
prereqs()
15
16
{
16
 
    echo "$PREREQ"
 
17
     echo "$PREREQ"
17
18
}
18
19
 
19
20
case $1 in
20
21
prereqs)
21
 
        prereqs
22
 
        exit 0
23
 
        ;;
 
22
     prereqs
 
23
     exit 0
 
24
     ;;
24
25
esac
25
26
 
26
 
. /scripts/functions
27
 
 
28
 
for param in `cat /proc/cmdline`; do
29
 
    case "$param" in
30
 
        ip=*) IPOPTS="${param#ip=}" ;;
31
 
        mandos=*)
32
 
            # Split option line on commas
33
 
            old_ifs="$IFS"
34
 
            IFS="$IFS,"
35
 
            for mpar in ${param#mandos=}; do
36
 
                IFS="$old_ifs"
37
 
                case "$mpar" in
38
 
                    off) exit 0 ;;
39
 
                    connect) connect="" ;;
40
 
                    connect:*) connect="${mpar#connect:}" ;;
41
 
                    *) log_warning_msg "$0: Bad option ${mpar}" ;;
42
 
                esac
43
 
            done
44
 
            unset mpar
45
 
            IFS="$old_ifs"
46
 
            unset old_ifs
47
 
            ;;
48
 
    esac
49
 
done
50
 
unset param
51
 
 
52
27
chmod a=rwxt /tmp
53
28
 
54
 
# Get DEVICE from /conf/initramfs.conf and other files
55
 
. /conf/initramfs.conf
56
 
for conf in /conf/conf.d/*; do
57
 
    [ -f "${conf}" ] && . "${conf}"
58
 
done
59
 
if [ -e /conf/param.conf ]; then
60
 
    . /conf/param.conf
61
 
fi
62
 
 
63
 
# Override DEVICE from sixth field of ip= kernel option, if passed
64
 
case "$IPOPTS" in
65
 
    *:*:*:*:*:*)                # At least six fields
66
 
        # Remove the first five fields
67
 
        device="${IPOPTS#*:*:*:*:*:}"
68
 
        # Remove all fields except the first one
69
 
        DEVICE="${device%%:*}"
70
 
        ;;
71
 
esac
72
 
 
73
 
# Add device setting (if any) to plugin-runner.conf
74
 
if [ "${DEVICE+set}" = set ]; then
75
 
    # Did we get the device from an ip= option?
76
 
    if [ "${device+set}" = set ]; then
77
 
        # Let ip= option override local config; append:
78
 
        cat <<-EOF >>/conf/conf.d/mandos/plugin-runner.conf
79
 
        
80
 
        --options-for=mandos-client:--interface=${DEVICE}
81
 
EOF
82
 
    else
83
 
        # Prepend device setting so any later options would override:
84
 
        sed -i -e \
85
 
            '1i--options-for=mandos-client:--interface='"${DEVICE}" \
86
 
            /conf/conf.d/mandos/plugin-runner.conf
87
 
    fi
88
 
fi
89
 
unset device
90
 
 
91
 
# If we are connecting directly, run "configure_networking" (from
92
 
# /scripts/functions); it needs IPOPTS and DEVICE
93
 
if [ "${connect+set}" = set ]; then
94
 
    set +e                      # Required by library functions
95
 
    configure_networking
96
 
    set -e
97
 
    if [ -n "$connect" ]; then
98
 
        cat <<-EOF >>/conf/conf.d/mandos/plugin-runner.conf
99
 
        
100
 
        --options-for=mandos-client:--connect=${connect}
101
 
EOF
102
 
    fi
103
 
fi
104
 
 
105
 
if [ -r /conf/conf.d/cryptroot ]; then
106
 
    test -w /conf/conf.d
107
 
 
108
 
    # Do not replace cryptroot file unless we need to.
109
 
    replace_cryptroot=no
110
 
 
111
 
    # Our keyscript
112
 
    mandos=/lib/mandos/plugin-runner
113
 
    test -x "$mandos"
114
 
 
115
 
    # parse /conf/conf.d/cryptroot.  Format:
116
 
    # target=sda2_crypt,source=/dev/sda2,rootdev,key=none,keyscript=/foo/bar/baz
117
 
    # Is the root device specially marked?
118
 
    changeall=yes
119
 
    while read -r options; do
120
 
        case "$options" in
121
 
            rootdev,*|*,rootdev,*|*,rootdev)
122
 
                # If the root device is specially marked, don't change all
123
 
                # lines in crypttab by default.
124
 
                changeall=no
 
29
test -w /conf/conf.d/cryptroot
 
30
 
 
31
# Do not replace cryptroot file unless we need to.
 
32
replace_cryptroot=no
 
33
 
 
34
# Our keyscript
 
35
mandos=/lib/mandos/plugin-runner
 
36
 
 
37
# parse /conf/conf.d/cryptroot.  Format:
 
38
# target=sda2_crypt,source=/dev/sda2,key=none,keyscript=/foo/bar/baz
 
39
exec 3>/conf/conf.d/cryptroot.mandos
 
40
while read options; do
 
41
    newopts=""
 
42
    # Split option line on commas
 
43
    old_ifs="$IFS"
 
44
    IFS="$IFS,"
 
45
    for opt in $options; do
 
46
        # Find the keyscript option, if any
 
47
        case "$opt" in
 
48
            keyscript=*)
 
49
                keyscript="${opt#keyscript=}"
 
50
                newopts="$newopts,$opt"
 
51
                ;;
 
52
            "") : ;;
 
53
            *)
 
54
                newopts="$newopts,$opt"
125
55
                ;;
126
56
        esac
127
 
    done < /conf/conf.d/cryptroot
128
 
 
129
 
    exec 3>/conf/conf.d/cryptroot.mandos
130
 
    while read -r options; do
131
 
        newopts=""
132
 
        keyscript=""
133
 
        changethis="$changeall"
134
 
        # Split option line on commas
135
 
        old_ifs="$IFS"
136
 
        IFS="$IFS,"
137
 
        for opt in $options; do
138
 
            # Find the keyscript option, if any
139
 
            case "$opt" in
140
 
                keyscript=*)
141
 
                    keyscript="${opt#keyscript=}"
142
 
                    newopts="$newopts,$opt"
143
 
                    ;;
144
 
                "") : ;;
145
 
                # Always use Mandos on the root device, if marked
146
 
                rootdev)
147
 
                    changethis=yes
148
 
                    newopts="$newopts,$opt"
149
 
                    ;;
150
 
                # Don't use Mandos on resume device, if marked
151
 
                resumedev)
152
 
                    changethis=no
153
 
                    newopts="$newopts,$opt"
154
 
                    ;;
155
 
                *)
156
 
                    newopts="$newopts,$opt"
157
 
                    ;;
158
 
            esac
159
 
        done
160
 
        IFS="$old_ifs"
161
 
        unset old_ifs
162
 
        # If there was no keyscript option, add one.
163
 
        if [ "$changethis" = yes ] && [ -z "$keyscript" ]; then
164
 
            replace_cryptroot=yes
165
 
            newopts="$newopts,keyscript=$mandos"
166
 
        fi
167
 
        newopts="${newopts#,}"
168
 
        echo "$newopts" >&3
169
 
    done < /conf/conf.d/cryptroot
170
 
    exec 3>&-
171
 
 
172
 
    # If we need to, replace the old cryptroot file with the new file.
173
 
    if [ "$replace_cryptroot" = yes ]; then
174
 
        mv /conf/conf.d/cryptroot /conf/conf.d/cryptroot.mandos-old
175
 
        mv /conf/conf.d/cryptroot.mandos /conf/conf.d/cryptroot
176
 
    else
177
 
        rm -f /conf/conf.d/cryptroot.mandos
178
 
    fi
179
 
elif [ -x /usr/bin/cryptroot-unlock ]; then
180
 
    # Use setsid if available
181
 
    if command -v setsid >/dev/null 2>&1; then
182
 
        setsid /lib/mandos/mandos-to-cryptroot-unlock &
183
 
    else
184
 
        /lib/mandos/mandos-to-cryptroot-unlock &
185
 
    fi
 
57
    done
 
58
    IFS="$old_ifs"
 
59
    unset old_ifs
 
60
    # If there was no keyscript option, add one.
 
61
    if [ -z "$keyscript" ]; then
 
62
        replace_cryptroot=yes
 
63
        newopts="$newopts,keyscript=$mandos"
 
64
    fi
 
65
    newopts="${newopts#,}"
 
66
    echo "$newopts" >&3
 
67
done < /conf/conf.d/cryptroot
 
68
exec 3>&-
 
69
 
 
70
# If we need to, replace the old cryptroot file with the new file.
 
71
if [ "$replace_cryptroot" = yes ]; then
 
72
    mv /conf/conf.d/cryptroot /conf/conf.d/cryptroot.mandos-old
 
73
    mv /conf/conf.d/cryptroot.mandos /conf/conf.d/cryptroot
 
74
else
 
75
    rm /conf/conf.d/cryptroot.mandos
186
76
fi