summaryrefslogtreecommitdiff
path: root/test/TEST-01-BASIC/test.sh
blob: 06b80c2a154238232787257aa1c115651bba692b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
#!/bin/bash
# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
# ex: ts=8 sw=4 sts=4 et filetype=sh
TEST_DESCRIPTION="Basic systemd setup"

KVERSION=${KVERSION-$(uname -r)}
KERNEL_VER=$(uname -r)

# Uncomment this to debug failures
#DEBUGFAIL="systemd.unit=multi-user.target"
DEBUGTOOLS="df free ls stty cat ps ln ip route dmesg dhclient mkdir cp ping dhclient strace less grep id tty touch du sort"

run_qemu() {
    # TODO: qemu wrapper script: http://www.spinics.net/lists/kvm/msg72389.html
    qemu-kvm \
        -hda $TESTDIR/rootdisk.img \
        -m 512M -nographic \
        -net none -kernel /boot/vmlinuz-$KERNEL_VER \
        -append "root=/dev/sda1 systemd.log_level=debug raid=noautodetect loglevel=2 init=/usr/lib/systemd/systemd ro console=ttyS0,115200n81 selinux=0 $DEBUGFAIL" || return 1

    ret=1
    mkdir -p $TESTDIR/root
    mount ${LOOPDEV}p1 $TESTDIR/root
    [[ -e $TESTDIR/root/testok ]] && ret=0
    cp -a $TESTDIR/root/failed $TESTDIR
    cryptsetup luksOpen ${LOOPDEV}p2 varcrypt <$TESTDIR/keyfile
    mount /dev/mapper/varcrypt $TESTDIR/root/var
    cp -a $TESTDIR/root/var/log/journal $TESTDIR
    umount $TESTDIR/root/var
    umount $TESTDIR/root
    cryptsetup luksClose /dev/mapper/varcrypt
    cat $TESTDIR/failed
    ls -l $TESTDIR/journal/*/*.journal
    test -s $TESTDIR/failed && ret=$(($ret+1))
    return $ret
}


run_nspawn() {
    systemd-nspawn -b -D $TESTDIR/nspawn-root /usr/lib/systemd/systemd
    ret=1
    [[ -e $TESTDIR/nspawn-root/testok ]] && ret=0
    cp -a $TESTDIR/nspawn-root/var/log/journal $TESTDIR
    cp -a $TESTDIR/nspawn-root/failed $TESTDIR
    cat $TESTDIR/failed
    ls -l $TESTDIR/journal/*/*.journal
    test -s $TESTDIR/failed && ret=$(($ret+1))
    return $ret
}


test_run() {
    if check_qemu ; then
        run_qemu || return 1
    else
        dwarn "can't run qemu-kvm, skipping"
    fi
    if check_nspawn; then
        run_nspawn || return 1
    else
        dwarn "can't run systemd-nspawn, skipping"
    fi
    return 0
}

test_setup() {
    rm -f $TESTDIR/rootdisk.img
    # Create the blank file to use as a root filesystem
    dd if=/dev/null of=$TESTDIR/rootdisk.img bs=1M seek=200
    LOOPDEV=$(losetup --show -P -f $TESTDIR/rootdisk.img)
    [ -b $LOOPDEV ] || return 1
    echo "LOOPDEV=$LOOPDEV" >> $STATEFILE
    sfdisk -C 6400 -H 2 -S 32 -L $LOOPDEV <<EOF
,3200
,
EOF

    mkfs.ext3 -L systemd ${LOOPDEV}p1
    echo -n test >$TESTDIR/keyfile
    cryptsetup -q luksFormat ${LOOPDEV}p2 $TESTDIR/keyfile
    cryptsetup luksOpen ${LOOPDEV}p2 varcrypt <$TESTDIR/keyfile
    mkfs.ext3 -L var /dev/mapper/varcrypt
    mkdir -p $TESTDIR/root
    mount ${LOOPDEV}p1 $TESTDIR/root
    mkdir -p $TESTDIR/root/run
    mkdir -p $TESTDIR/root/var
    mount /dev/mapper/varcrypt $TESTDIR/root/var

    # Create what will eventually be our root filesystem onto an overlay
    (
        LOG_LEVEL=5
        initdir=$TESTDIR/root

        # create the basic filesystem layout
        setup_basic_dirs

        # install compiled files
        (cd ../..; make DESTDIR=$initdir install)

        # remove unneeded documentation
        rm -fr $initdir/usr/share/{man,doc,gtk-doc}

        # install possible missing libraries
        for i in $initdir/{sbin,bin}/* $initdir/lib/systemd/*; do
            inst_libs $i
        done

        # activate kmsg import
        echo 'ImportKernel=yes' >> $initdir/etc/systemd/journald.conf

        # make a journal directory
        mkdir -p $initdir/var/log/journal

        # install some basic config files
        inst /etc/sysconfig/init
        inst /etc/passwd
        inst /etc/shadow
        inst /etc/group
        inst /etc/shells
        inst /etc/nsswitch.conf
        inst /etc/pam.conf
        inst /etc/securetty
        inst /etc/os-release
        inst /etc/localtime
        # we want an empty environment
        > $initdir/etc/environment
        > $initdir/etc/machine-id

        # set the hostname
        echo  systemd-testsuite > $initdir/etc/hostname

        eval $(udevadm info --export --query=env --name=/dev/mapper/varcrypt)
        eval $(udevadm info --export --query=env --name=${LOOPDEV}p2)

        cat >$initdir/etc/crypttab <<EOF
$DM_NAME UUID=$ID_FS_UUID /etc/varkey
EOF
        echo -n test > $initdir/etc/varkey
        cat $initdir/etc/crypttab | ddebug

        cat >$initdir/etc/fstab <<EOF
LABEL=systemd           /       ext3    rw 0 1
/dev/mapper/varcrypt    /var    ext3    defaults 0 1
EOF

        # setup the testsuite target
        cat >$initdir/etc/systemd/system/testsuite.target <<EOF
[Unit]
Description=Testsuite target
Requires=multi-user.target
After=multi-user.target
Conflicts=rescue.target
AllowIsolate=yes
EOF

        # setup the testsuite service
        cat >$initdir/etc/systemd/system/testsuite.service <<EOF
[Unit]
Description=Testsuite service
After=multi-user.target

[Service]
ExecStart=/bin/bash -c 'set -x; systemctl --failed --no-legend --no-pager > /failed ; echo OK > /testok; while : ;do systemd-cat echo "testsuite service waiting for /var/log/journal" ; echo "testsuite service waiting for journal to move to /var/log/journal" > /dev/console ; for i in /var/log/journal/*;do [ -d "\$i" ] && echo "\$i" && break 2; done; sleep 1; done; sleep 1; exit 0;'
ExecStopPost=/usr/bin/systemctl poweroff
Type=oneshot
EOF
        mkdir -p $initdir/etc/systemd/system/testsuite.target.wants
        ln -fs ../testsuite.service $initdir/etc/systemd/system/testsuite.target.wants/testsuite.service

        # make the testsuite the default target
        ln -fs testsuite.target $initdir/etc/systemd/system/default.target
        mkdir -p $initdir/etc/rc.d
        cat >$initdir/etc/rc.d/rc.local <<EOF
#!/bin/bash
exit 0
EOF
        chmod 0755 $initdir/etc/rc.d/rc.local
        # install basic tools needed
        dracut_install sh bash setsid loadkeys setfont \
            login sushell sulogin gzip sleep echo mount umount cryptsetup
        dracut_install dmsetup modprobe

        instmods dm_crypt =crypto

        type -P dmeventd >/dev/null && dracut_install dmeventd

        inst_libdir_file "libdevmapper-event.so*"

        inst_rules 10-dm.rules 13-dm-disk.rules 95-dm-notify.rules

        # install libnss_files for login
        inst_libdir_file "libnss_files*"

        # install dbus and pam
        find \
            /etc/dbus-1 \
            /etc/pam.d \
            /etc/security \
            /lib64/security \
            /lib/security -xtype f \
            | while read file; do
            inst $file
        done

        # install dbus socket and service file
        inst /usr/lib/systemd/system/dbus.socket
        inst /usr/lib/systemd/system/dbus.service

        # install basic keyboard maps and fonts
        for i in \
            /usr/lib/kbd/consolefonts/latarcyrheb-sun16* \
            /usr/lib/kbd/keymaps/include/* \
            /usr/lib/kbd/keymaps/i386/include/* \
            /usr/lib/kbd/keymaps/i386/qwerty/us.*; do
                [[ -f $i ]] || continue
                inst $i
        done

        # some basic terminfo files
        for _terminfodir in /lib/terminfo /etc/terminfo /usr/share/terminfo; do
            [ -f ${_terminfodir}/l/linux ] && break
        done
        dracut_install -o ${_terminfodir}/l/linux

        # softlink mtab
        ln -fs /proc/self/mounts $initdir/etc/mtab

        # install any Exec's from the service files
        egrep -ho '^Exec[^ ]*=[^ ]+' $initdir/lib/systemd/system/*.service \
            | while read i; do
            i=${i##Exec*=}; i=${i##-}
            inst $i
        done

        # install plymouth, if found... else remove plymouth service files
        # if [ -x /usr/libexec/plymouth/plymouth-populate-initrd ]; then
        #     PLYMOUTH_POPULATE_SOURCE_FUNCTIONS="$TEST_BASE_DIR/test-functions" \
        #         /usr/libexec/plymouth/plymouth-populate-initrd -t $initdir
        #         dracut_install plymouth plymouthd
        # else
        rm -f $initdir/{usr/lib,etc}/systemd/system/plymouth* $initdir/{usr/lib,etc}/systemd/system/*/plymouth*
        # fi

        # some helper tools for debugging
        [[ $DEBUGTOOLS ]] && dracut_install $DEBUGTOOLS

        # install ld.so.conf* and run ldconfig
        cp -a /etc/ld.so.conf* $initdir/etc
        ldconfig -r "$initdir"
        ddebug "Strip binaeries"
        find "$initdir" -perm +111 -type f | xargs strip --strip-unneeded | ddebug

        # copy depmod files
        inst /lib/modules/$KERNEL_VER/modules.order
        inst /lib/modules/$KERNEL_VER/modules.builtin
        # generate module dependencies
        if [[ -d $initdir/lib/modules/$KERNEL_VER ]] && \
            ! depmod -a -b "$initdir" $KERNEL_VER; then
                dfatal "\"depmod -a $KERNEL_VER\" failed."
                exit 1
        fi
    )
    rm -fr $TESTDIR/nspawn-root
    ddebug "cp -ar $TESTDIR/root $TESTDIR/nspawn-root"
    cp -ar $TESTDIR/root $TESTDIR/nspawn-root
    # we don't mount in the nspawn root
    rm -fr $TESTDIR/nspawn-root/etc/fstab

    ddebug "umount $TESTDIR/root/var"
    umount $TESTDIR/root/var
    cryptsetup luksClose /dev/mapper/varcrypt
    ddebug "umount $TESTDIR/root"
    umount $TESTDIR/root
}

test_cleanup() {
    umount $TESTDIR/root/var 2>/dev/null
    [[ -b /dev/mapper/varcrypt ]] && cryptsetup luksClose /dev/mapper/varcrypt
    umount $TESTDIR/root 2>/dev/null
    [[ $LOOPDEV ]] && losetup -d $LOOPDEV
    return 0
}

. $TEST_BASE_DIR/test-functions
do_test "$@"