diff options
author | Evgeny Vereshchagin <evvers@ya.ru> | 2016-12-13 10:36:03 +0000 |
---|---|---|
committer | Evgeny Vereshchagin <evvers@ya.ru> | 2016-12-13 12:58:42 +0000 |
commit | fcb2427055bc2e1d8f009ebf3b4d8b1b2bb14faa (patch) | |
tree | 6ea27ead454919df1ba59cd0ff553d5f6a096a38 | |
parent | 6916b164642d8bb4938878f4284f8ee5ccf3efd6 (diff) |
core: machine_id_setup overwrites broken machine-id
-rw-r--r-- | Makefile.am | 2 | ||||
-rw-r--r-- | src/core/machine-id-setup.c | 10 | ||||
-rw-r--r-- | test/TEST-14-MACHINE-ID/Makefile | 10 | ||||
-rwxr-xr-x | test/TEST-14-MACHINE-ID/test.sh | 106 |
4 files changed, 125 insertions, 3 deletions
diff --git a/Makefile.am b/Makefile.am index fe3ef9116d..3bd8c29dd3 100644 --- a/Makefile.am +++ b/Makefile.am @@ -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 += \ diff --git a/src/core/machine-id-setup.c b/src/core/machine-id-setup.c index c83bb561c7..df3cc74b98 100644 --- a/src/core/machine-id-setup.c +++ b/src/core/machine-id-setup.c @@ -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 index 0000000000..5e89a29eff --- /dev/null +++ b/test/TEST-14-MACHINE-ID/Makefile @@ -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 index 0000000000..1423bd891f --- /dev/null +++ b/test/TEST-14-MACHINE-ID/test.sh @@ -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 "$@" |