/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: 2024-09-09 01:36:41 UTC
  • Revision ID: teddy@recompile.se-20240909013641-6zu6kx2f7meu134k
Make all required directories when installing

When installing into a normal system, one can assume that target
directories, such as /usr/bin, already exists.  But when installing
into a subdirectory for the purpose of creating a package, one cannot
assume that all directories already exist.  Therefore, when
installing, we must not check if any directories exist, and must
instead always create any directories we want to install into.

* Makefile (confdir/mandos.conf, confdir/clients.conf, install-html):
  Use the "-D" option to "install" instead of creating the directory
  separately.
  (install-server): Move creation of $(CONFDIR) down to before it is
  needed.  Don't check if the $(TMPFILES) or $(SYSUSERS) directories
  exist; instead create them by using the "-D" option to "install".
  Create the $(PREFIX)/sbin directory.  Always use
  "--target-directory" if possible; i.e. if the file name is the same.
  Create the $(DBUSPOLICYDIR) and $(DESTDIR)/etc/init.d directories by
  using the "-D" option to "install".  Don't check if the $(SYSTEMD)
  directory exists; instead create it by using the "-D" option to
  "install".  Create the $(DESTDIR)/etc/default and $(MANDIR)/man8
  directories by using the "-D" option to "install".  Create the
  $(MANDIR)/man5 directories explicitly.
  (install-client-nokey): Remove unnecessary creation of the
  $(CONFDIR) directory.  Don't check if the $(SYSUSERS) directory
  exists; instead create it by using the "-D" option to "install".
  Move the "--directory" argument to be the first argument, for
  clarity.  Create the $(PREFIX)/sbin directory.  Use the "-D"
  argument to "install" when installing
  $(INITRAMFSTOOLS)/hooks/mandos,
  $(INITRAMFSTOOLS)/conf.d/mandos-conf,
  $(INITRAMFSTOOLS)/conf-hooks.d/zz-mandos,
  $(INITRAMFSTOOLS)/scripts/init-premount/mandos,
  $(INITRAMFSTOOLS)/scripts/local-premount/mandos,
  $(DRACUTMODULE)/ask-password-mandos.path, and
  $(DRACUTMODULE)/dracut-module/ask-password-mandos.service.  Create
  the $(MANDIR)/man8 directory.

Reported-By: Erich Eckner <erich@eckner.net>
Thanks: Erich Eckner <erich@eckner.net> for analysis

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/local-top/mandos" which will
10
 
# eventually be "/scripts/local-top/mandos" in the initrd.img file.
 
9
# "/usr/share/initramfs-tools/scripts/init-premount/mandos" which will
 
10
# eventually be "/scripts/init-premount/mandos" in the initrd.img
 
11
# file.
11
12
 
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=""
 
13
PREREQ="udev"
15
14
prereqs()
16
15
{
17
 
     echo "$PREREQ"
 
16
    echo "$PREREQ"
18
17
}
19
18
 
20
19
case $1 in
21
20
prereqs)
22
 
     prereqs
23
 
     exit 0
24
 
     ;;
 
21
        prereqs
 
22
        exit 0
 
23
        ;;
25
24
esac
26
25
 
 
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
 
27
52
chmod a=rwxt /tmp
28
53
 
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"
 
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
55
125
                ;;
56
126
        esac
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
 
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
76
186
fi