]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
core: machine_id_setup overwrites broken machine-id
authorEvgeny Vereshchagin <evvers@ya.ru>
Tue, 13 Dec 2016 10:36:03 +0000 (10:36 +0000)
committerEvgeny Vereshchagin <evvers@ya.ru>
Tue, 13 Dec 2016 12:58:42 +0000 (12:58 +0000)
Makefile.am
src/core/machine-id-setup.c
test/TEST-14-MACHINE-ID/Makefile [new file with mode: 0644]
test/TEST-14-MACHINE-ID/test.sh [new file with mode: 0755]

index fe3ef9116dbc5249e72f12c588e47314bcf99ee4..3bd8c29dd37a81fd754735b5db475987ee902a4e 100644 (file)
@@ -6117,6 +6117,8 @@ EXTRA_DIST += \
        test/TEST-13-NSPAWN-SMOKE/Makefile \
        test/TEST-13-NSPAWN-SMOKE/create-busybox-container \
        test/TEST-13-NSPAWN-SMOKE/test.sh \
+       test/TEST-14-MACHINE-ID/Makefile \
+       test/TEST-14-MACHINE-ID/test.sh \
        test/test-functions
 
 EXTRA_DIST += \
index c83bb561c7ff0ae7f8584f9270fcf34480925c12..df3cc74b9862de2a060e973b7702c19e2ec0cd1d 100644 (file)
@@ -146,14 +146,18 @@ int machine_id_setup(const char *root, sd_id128_t machine_id, sd_id128_t *ret) {
                 r = generate_machine_id(root, &machine_id);
                 if (r < 0)
                         return r;
+        }
 
+        if (writable) {
                 if (lseek(fd, 0, SEEK_SET) == (off_t) -1)
-                        return log_error_errno(errno, "Failed to seek: %m");
-        }
+                        return log_error_errno(errno, "Failed to seek %s: %m", etc_machine_id);
+
+                if (ftruncate(fd, 0) < 0)
+                        return log_error_errno(errno, "Failed to truncate %s: %m", etc_machine_id);
 
-        if (writable)
                 if (id128_write_fd(fd, ID128_PLAIN, machine_id, true) >= 0)
                         goto finish;
+        }
 
         fd = safe_close(fd);
 
diff --git a/test/TEST-14-MACHINE-ID/Makefile b/test/TEST-14-MACHINE-ID/Makefile
new file mode 100644 (file)
index 0000000..5e89a29
--- /dev/null
@@ -0,0 +1,10 @@
+all:
+       @make -s --no-print-directory -C ../.. all
+       @basedir=../.. TEST_BASE_DIR=../ ./test.sh --all
+setup:
+       @make --no-print-directory -C ../.. all
+       @basedir=../.. TEST_BASE_DIR=../ ./test.sh --setup
+clean:
+       @basedir=../.. TEST_BASE_DIR=../ ./test.sh --clean
+run:
+       @basedir=../.. TEST_BASE_DIR=../ ./test.sh --run
diff --git a/test/TEST-14-MACHINE-ID/test.sh b/test/TEST-14-MACHINE-ID/test.sh
new file mode 100755 (executable)
index 0000000..1423bd8
--- /dev/null
@@ -0,0 +1,106 @@
+#!/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"
+SKIP_INITRD=yes
+. $TEST_BASE_DIR/test-functions
+
+check_result_qemu() {
+    ret=1
+    mkdir -p $TESTDIR/root
+    mount ${LOOPDEV}p1 $TESTDIR/root
+    [[ -e $TESTDIR/root/testok ]] && ret=0
+    [[ -f $TESTDIR/root/failed ]] && cp -a $TESTDIR/root/failed $TESTDIR
+    cp -a $TESTDIR/root/var/log/journal $TESTDIR
+    umount $TESTDIR/root
+    [[ -f $TESTDIR/failed ]] && cat $TESTDIR/failed
+    ls -l $TESTDIR/journal/*/*.journal
+    test -s $TESTDIR/failed && ret=$(($ret+1))
+    return $ret
+}
+
+test_run() {
+    if run_qemu; then
+        check_result_qemu || return 1
+    else
+        dwarn "can't run QEMU, skipping"
+    fi
+    return 0
+}
+
+test_setup() {
+    create_empty_image
+    mkdir -p $TESTDIR/root
+    mount ${LOOPDEV}p1 $TESTDIR/root
+
+    # Create what will eventually be our root filesystem onto an overlay
+    (
+        LOG_LEVEL=5
+        eval $(udevadm info --export --query=env --name=${LOOPDEV}p2)
+
+        setup_basic_environment
+        dracut_install mount cmp
+
+        # setup the testsuite service
+        cat >$initdir/etc/systemd/system/testsuite.service <<EOF
+[Unit]
+Description=Testsuite service
+After=multi-user.target
+
+[Service]
+ExecStart=/bin/sh -e -x -c '/test-machine-id-setup.sh; systemctl --state=failed --no-legend --no-pager > /failed ; echo OK > /testok'
+Type=oneshot
+EOF
+
+cat >$initdir/test-machine-id-setup.sh <<'EOF'
+#!/bin/bash
+
+set -e
+set -x
+
+function setup_root {
+    local _root="$1"
+    mkdir -p "$_root"
+    mount -t tmpfs tmpfs "$_root"
+    mkdir -p "$_root/etc" "$_root/run"
+}
+
+function check {
+    printf "Expected\n"
+    cat "$1"
+    printf "\nGot\n"
+    cat "$2"
+    cmp "$1" "$2"
+}
+
+r="$(pwd)/overwrite-broken-machine-id"
+setup_root "$r"
+systemd-machine-id-setup --print --root "$r"
+echo abc >>"$r/etc/machine-id"
+id=$(systemd-machine-id-setup --print --root "$r")
+echo $id >expected
+check expected "$r/etc/machine-id"
+EOF
+chmod +x $initdir/test-machine-id-setup.sh
+
+        setup_testsuite
+    ) || return 1
+
+    # mask some services that we do not want to run in these tests
+    ln -s /dev/null $initdir/etc/systemd/system/systemd-hwdb-update.service
+    ln -s /dev/null $initdir/etc/systemd/system/systemd-journal-catalog-update.service
+    ln -s /dev/null $initdir/etc/systemd/system/systemd-networkd.service
+    ln -s /dev/null $initdir/etc/systemd/system/systemd-networkd.socket
+    ln -s /dev/null $initdir/etc/systemd/system/systemd-resolved.service
+
+    ddebug "umount $TESTDIR/root"
+    umount $TESTDIR/root
+}
+
+test_cleanup() {
+    umount $TESTDIR/root 2>/dev/null
+    [[ $LOOPDEV ]] && losetup -d $LOOPDEV
+    return 0
+}
+
+do_test "$@"