diff --git a/src/core/varlink.c b/src/core/varlink.c index 8c6b95e31d..17f5ac4fad 100644 --- a/src/core/varlink.c +++ b/src/core/varlink.c @@ -69,16 +69,18 @@ static int build_managed_oom_json_array_element(Unit *u, const char *property, s SD_JSON_BUILD_PAIR_CONDITION(use_duration, "duration", SD_JSON_BUILD_UNSIGNED(c->moom_mem_pressure_duration_usec))); } -static int build_managed_oom_cgroups_json(Manager *m, sd_json_variant **ret) { - _cleanup_(sd_json_variant_unrefp) sd_json_variant *v = NULL, *arr = NULL; +static int build_managed_oom_cgroups_json(Manager *m, bool allow_empty, sd_json_variant **ret) { + _cleanup_(sd_json_variant_unrefp) sd_json_variant *arr = NULL; int r; assert(m); assert(ret); - r = sd_json_build(&arr, SD_JSON_BUILD_EMPTY_ARRAY); - if (r < 0) - return r; + if (allow_empty) { + r = sd_json_build(&arr, SD_JSON_BUILD_EMPTY_ARRAY); + if (r < 0) + return r; + } for (UnitType t = 0; t < _UNIT_TYPE_MAX; t++) { @@ -95,6 +97,10 @@ static int build_managed_oom_cgroups_json(Manager *m, sd_json_variant **ret) { if (!c) continue; + CGroupRuntime *crt = unit_get_cgroup_runtime(u); + if (!crt || !crt->cgroup_path) + continue; + FOREACH_ELEMENT(i, managed_oom_mode_properties) { _cleanup_(sd_json_variant_unrefp) sd_json_variant *e = NULL; @@ -115,12 +121,17 @@ static int build_managed_oom_cgroups_json(Manager *m, sd_json_variant **ret) { } } - r = sd_json_buildo(&v, SD_JSON_BUILD_PAIR("cgroups", SD_JSON_BUILD_VARIANT(arr))); + if (!arr) { + assert(!allow_empty); + *ret = NULL; + return 0; + } + + r = sd_json_buildo(ret, SD_JSON_BUILD_PAIR("cgroups", SD_JSON_BUILD_VARIANT(arr))); if (r < 0) return r; - *ret = TAKE_PTR(v); - return 0; + return 1; } static int manager_varlink_send_managed_oom_initial(Manager *m) { @@ -137,8 +148,8 @@ static int manager_varlink_send_managed_oom_initial(Manager *m) { assert(m->managed_oom_varlink); - r = build_managed_oom_cgroups_json(m, &v); - if (r < 0) + r = build_managed_oom_cgroups_json(m, /* allow_empty = */ false, &v); + if (r <= 0) return r; return sd_varlink_send(m->managed_oom_varlink, "io.systemd.oom.ReportManagedOOMCGroups", v); @@ -247,9 +258,11 @@ int manager_varlink_send_managed_oom_update(Unit *u) { if (!c) return 0; - r = sd_json_build(&arr, SD_JSON_BUILD_EMPTY_ARRAY); - if (r < 0) - return r; + if (MANAGER_IS_SYSTEM(u->manager)) { + r = sd_json_build(&arr, SD_JSON_BUILD_EMPTY_ARRAY); + if (r < 0) + return r; + } FOREACH_ELEMENT(i, managed_oom_mode_properties) { _cleanup_(sd_json_variant_unrefp) sd_json_variant *e = NULL; @@ -263,6 +276,12 @@ int manager_varlink_send_managed_oom_update(Unit *u) { return r; } + if (!arr) { + /* There is nothing updated. Skip calling method. */ + assert(!MANAGER_IS_SYSTEM(u->manager)); + return 0; + } + r = sd_json_buildo(&v, SD_JSON_BUILD_PAIR("cgroups", SD_JSON_BUILD_VARIANT(arr))); if (r < 0) return r; @@ -316,7 +335,7 @@ static int vl_method_subscribe_managed_oom_cgroups( _cleanup_(sd_json_variant_unrefp) sd_json_variant *v = NULL; - r = build_managed_oom_cgroups_json(m, &v); + r = build_managed_oom_cgroups_json(m, /* allow_empty = */ true, &v); if (r < 0) return r; diff --git a/src/network/networkd-serialize.c b/src/network/networkd-serialize.c index 93ae377679..8fd978bf09 100644 --- a/src/network/networkd-serialize.c +++ b/src/network/networkd-serialize.c @@ -64,6 +64,7 @@ int manager_serialize(Manager *manager) { if (!v) { log_debug("There is nothing to serialize."); + (void) notify_remove_fd_warn("manager-serialization"); return 0; } diff --git a/src/shared/varlink-io.systemd.BootControl.c b/src/shared/varlink-io.systemd.BootControl.c index 364fa8470e..eeaef291e4 100644 --- a/src/shared/varlink-io.systemd.BootControl.c +++ b/src/shared/varlink-io.systemd.BootControl.c @@ -13,9 +13,27 @@ static SD_VARLINK_DEFINE_ENUM_TYPE( SD_VARLINK_FIELD_COMMENT("Automatically generated entries"), SD_VARLINK_DEFINE_ENUM_VALUE(auto)); +static SD_VARLINK_DEFINE_ENUM_TYPE( + BootEntrySource, + SD_VARLINK_FIELD_COMMENT("Boot entry found in EFI system partition (ESP)"), + SD_VARLINK_DEFINE_ENUM_VALUE(esp), + SD_VARLINK_FIELD_COMMENT("Boot entry found in XBOOTLDR partition"), + SD_VARLINK_DEFINE_ENUM_VALUE(xbootldr)); + +static SD_VARLINK_DEFINE_STRUCT_TYPE( + BootEntryAddon, + SD_VARLINK_FIELD_COMMENT("The location of the global addon."), + SD_VARLINK_DEFINE_FIELD(globalAddon, SD_VARLINK_STRING, SD_VARLINK_NULLABLE), + SD_VARLINK_FIELD_COMMENT("The location of the local addon."), + SD_VARLINK_DEFINE_FIELD(localAddon, SD_VARLINK_STRING, SD_VARLINK_NULLABLE), + SD_VARLINK_FIELD_COMMENT("The command line options by the addon."), + SD_VARLINK_DEFINE_FIELD(options, SD_VARLINK_STRING, 0)); + static SD_VARLINK_DEFINE_STRUCT_TYPE( BootEntry, SD_VARLINK_DEFINE_FIELD_BY_TYPE(type, BootEntryType, 0), + SD_VARLINK_FIELD_COMMENT("The source of the entry"), + SD_VARLINK_DEFINE_FIELD_BY_TYPE(source, BootEntrySource, 0), SD_VARLINK_FIELD_COMMENT("The string identifier of the entry"), SD_VARLINK_DEFINE_FIELD(id, SD_VARLINK_STRING, SD_VARLINK_NULLABLE), SD_VARLINK_DEFINE_FIELD(path, SD_VARLINK_STRING, SD_VARLINK_NULLABLE), @@ -41,7 +59,11 @@ static SD_VARLINK_DEFINE_STRUCT_TYPE( SD_VARLINK_FIELD_COMMENT("Indicates whether this entry is the default entry."), SD_VARLINK_DEFINE_FIELD(isDefault, SD_VARLINK_BOOL, SD_VARLINK_NULLABLE), SD_VARLINK_FIELD_COMMENT("Indicates whether this entry has been booted."), - SD_VARLINK_DEFINE_FIELD(isSelected, SD_VARLINK_BOOL, SD_VARLINK_NULLABLE)); + SD_VARLINK_DEFINE_FIELD(isSelected, SD_VARLINK_BOOL, SD_VARLINK_NULLABLE), + SD_VARLINK_FIELD_COMMENT("Addon images of the entry."), + SD_VARLINK_DEFINE_FIELD_BY_TYPE(addons, BootEntryAddon, SD_VARLINK_NULLABLE|SD_VARLINK_ARRAY), + SD_VARLINK_FIELD_COMMENT("Command line options of the entry."), + SD_VARLINK_DEFINE_FIELD(cmdline, SD_VARLINK_STRING, SD_VARLINK_NULLABLE)); static SD_VARLINK_DEFINE_METHOD_FULL( ListBootEntries, @@ -71,6 +93,10 @@ SD_VARLINK_DEFINE_INTERFACE( SD_VARLINK_INTERFACE_COMMENT("Boot Loader control APIs"), SD_VARLINK_SYMBOL_COMMENT("The type of a boot entry"), &vl_type_BootEntryType, + SD_VARLINK_SYMBOL_COMMENT("The source of a boot entry"), + &vl_type_BootEntrySource, + SD_VARLINK_SYMBOL_COMMENT("A structure encapsulating an addon of a boot entry"), + &vl_type_BootEntryAddon, SD_VARLINK_SYMBOL_COMMENT("A structure encapsulating a boot entry"), &vl_type_BootEntry, SD_VARLINK_SYMBOL_COMMENT("Enumerates boot entries. Method call must be called with 'more' flag set. Each response returns one entry. If no entries are defined returns the NoSuchBootEntry error."), diff --git a/src/shared/varlink-io.systemd.Hostname.c b/src/shared/varlink-io.systemd.Hostname.c index 556a7920d4..fb265b7511 100644 --- a/src/shared/varlink-io.systemd.Hostname.c +++ b/src/shared/varlink-io.systemd.Hostname.c @@ -13,6 +13,8 @@ static SD_VARLINK_DEFINE_METHOD( SD_VARLINK_DEFINE_OUTPUT(HostnameSource, SD_VARLINK_STRING, 0), SD_VARLINK_DEFINE_OUTPUT(IconName, SD_VARLINK_STRING, SD_VARLINK_NULLABLE), SD_VARLINK_DEFINE_OUTPUT(Chassis, SD_VARLINK_STRING, SD_VARLINK_NULLABLE), + SD_VARLINK_FIELD_COMMENT("An unique identifier of the system chassis."), + SD_VARLINK_DEFINE_OUTPUT(ChassisAssetTag, SD_VARLINK_STRING, SD_VARLINK_NULLABLE), SD_VARLINK_DEFINE_OUTPUT(Deployment, SD_VARLINK_STRING, SD_VARLINK_NULLABLE), SD_VARLINK_DEFINE_OUTPUT(Location, SD_VARLINK_STRING, SD_VARLINK_NULLABLE), SD_VARLINK_DEFINE_OUTPUT(KernelName, SD_VARLINK_STRING, 0), @@ -23,6 +25,8 @@ static SD_VARLINK_DEFINE_METHOD( SD_VARLINK_DEFINE_OUTPUT(OperatingSystemHomeURL, SD_VARLINK_STRING, SD_VARLINK_NULLABLE), SD_VARLINK_DEFINE_OUTPUT(OperatingSystemSupportEnd, SD_VARLINK_INT, SD_VARLINK_NULLABLE), SD_VARLINK_DEFINE_OUTPUT(OperatingSystemReleaseData, SD_VARLINK_STRING, SD_VARLINK_NULLABLE|SD_VARLINK_ARRAY), + SD_VARLINK_DEFINE_OUTPUT(OperatingSystemImageID, SD_VARLINK_INT, SD_VARLINK_NULLABLE), + SD_VARLINK_DEFINE_OUTPUT(OperatingSystemImageVersion, SD_VARLINK_INT, SD_VARLINK_NULLABLE), SD_VARLINK_DEFINE_OUTPUT(MachineInformationData, SD_VARLINK_STRING, SD_VARLINK_NULLABLE|SD_VARLINK_ARRAY), SD_VARLINK_DEFINE_OUTPUT(HardwareVendor, SD_VARLINK_STRING, SD_VARLINK_NULLABLE), SD_VARLINK_DEFINE_OUTPUT(HardwareModel, SD_VARLINK_STRING, SD_VARLINK_NULLABLE), @@ -35,9 +39,7 @@ static SD_VARLINK_DEFINE_METHOD( SD_VARLINK_DEFINE_OUTPUT(MachineID, SD_VARLINK_STRING, 0), SD_VARLINK_DEFINE_OUTPUT(BootID, SD_VARLINK_STRING, 0), SD_VARLINK_DEFINE_OUTPUT(ProductUUID, SD_VARLINK_STRING, SD_VARLINK_NULLABLE), - SD_VARLINK_DEFINE_OUTPUT(VSockCID, SD_VARLINK_INT, SD_VARLINK_NULLABLE), - SD_VARLINK_FIELD_COMMENT("An unique identifier of the system chassis."), - SD_VARLINK_DEFINE_OUTPUT(ChassisAssetTag, SD_VARLINK_STRING, SD_VARLINK_NULLABLE)); + SD_VARLINK_DEFINE_OUTPUT(VSockCID, SD_VARLINK_INT, SD_VARLINK_NULLABLE)); SD_VARLINK_DEFINE_INTERFACE( io_systemd_Hostname, diff --git a/test/test.service.in b/test/test.service.in index 0d0dccdb75..7d1a5ecc99 100644 --- a/test/test.service.in +++ b/test/test.service.in @@ -8,6 +8,7 @@ After=basic.target network.target @after@ [Service] ExecStartPre=rm -f /failed /testok ExecStart=@command@ +ExecStartPost=/usr/lib/systemd/tests/testdata/units/post.sh Type=oneshot MemoryAccounting=@memory-accounting@ Environment=SYSTEMD_PAGER= @env@ diff --git a/test/units/TEST-13-NSPAWN.machined.sh b/test/units/TEST-13-NSPAWN.machined.sh index d466662f96..76db239f91 100755 --- a/test/units/TEST-13-NSPAWN.machined.sh +++ b/test/units/TEST-13-NSPAWN.machined.sh @@ -379,7 +379,7 @@ varlinkctl call /run/systemd/machine/io.systemd.Machine io.systemd.Machine.List # test io.systemd.Machine.Open -# Reducing log level here is to work-around check in end.service (end.sh). Read https://github.com/systemd/systemd/pull/34867 for more details +# Reducing log level here is to work-around check in post.sh. Read https://github.com/systemd/systemd/pull/34867 for more details systemctl service-log-level systemd-machined info (! varlinkctl call /run/systemd/machine/io.systemd.Machine io.systemd.Machine.Open '{"name": ".host"}') (! varlinkctl call /run/systemd/machine/io.systemd.Machine io.systemd.Machine.Open '{"name": ".host", "mode": ""}') diff --git a/test/units/TEST-21-DFUZZER.sh b/test/units/TEST-21-DFUZZER.sh index 449c2d8b9d..fdf0e80549 100755 --- a/test/units/TEST-21-DFUZZER.sh +++ b/test/units/TEST-21-DFUZZER.sh @@ -14,24 +14,6 @@ if [[ ! -v ASAN_OPTIONS && ! -v UBSAN_OPTIONS && "${TEST_RUN_DFUZZER:-0}" == "0" exit 77 fi -# Save the end.service state before we start fuzzing, as it might get changed -# on the fly by one of the fuzzers -systemctl list-jobs | grep -F 'end.service' && SHUTDOWN_AT_EXIT=1 || SHUTDOWN_AT_EXIT=0 - -# shellcheck disable=SC2317 -at_exit() { - set +e - # We have to call the end.service/poweroff explicitly even if it's specified on - # the kernel cmdline via systemd.wants=end.service, since dfuzzer calls - # org.freedesktop.systemd1.Manager.ClearJobs() which drops the service - # from the queue - if [[ $SHUTDOWN_AT_EXIT -ne 0 ]] && ! systemctl poweroff; then - # PID1 is down let's try to save the journal - journalctl --sync # journal can be down as well so let's ignore exit codes here - systemctl -ff poweroff # sync() and reboot(RB_POWER_OFF) - fi -} - add_suppression() { local interface="${1:?}" local suppression="${2:?}" @@ -39,8 +21,6 @@ add_suppression() { sed -i "\%\[$interface\]%a$suppression" /etc/dfuzzer.conf } -trap at_exit EXIT - systemctl log-level info # Skip calling start and stop methods on unit objects, as doing that is not only time consuming, but it also diff --git a/test/units/TEST-74-AUX-UTILS.varlinkctl.sh b/test/units/TEST-74-AUX-UTILS.varlinkctl.sh index 481dc85d6f..d00d2e65d8 100755 --- a/test/units/TEST-74-AUX-UTILS.varlinkctl.sh +++ b/test/units/TEST-74-AUX-UTILS.varlinkctl.sh @@ -167,7 +167,7 @@ done (! varlinkctl call "") (! varlinkctl call "" "") (! varlinkctl call "" "" "") -(! varlinkctl call /run/systemd/userdb/io.systemd.Multiplexer io.systemd.UserDatabase.GetUserRecord &2 "Test failed, shutting down the machine..." - systemctl poweroff -ff - fi -} - -trap at_exit EXIT - # Because this test tests soft-reboot, we have to get rid of the symlink we put at # /run/nextroot to allow rebooting into the previous snapshot if the test fails for # the duration of the test. However, let's make sure we put the symlink back in place @@ -272,7 +259,7 @@ exec -a @sleep sleep infinity EOF chmod +x "$survive_argv" # This sets DefaultDependencies=no so that they remain running until the very end, and - # IgnoreOnIsolate=yes so that they aren't stopped via the "testsuite.target" isolation we do on next boot, + # IgnoreOnIsolate=yes so that they aren't stopped via isolation on next boot, # and will be killed by the final sigterm/sigkill spree. systemd-run --collect --service-type=notify -p DefaultDependencies=no -p IgnoreOnIsolate=yes --unit=TEST-82-SOFTREBOOT-nosurvive-sigterm.service "$survive_sigterm" systemd-run --collect --service-type=exec -p DefaultDependencies=no -p IgnoreOnIsolate=yes -p SetCredential=gone:hoge --unit=TEST-82-SOFTREBOOT-nosurvive.service sleep infinity diff --git a/test/units/TEST-88-UPGRADE.sh b/test/units/TEST-88-UPGRADE.sh index 9185725b3d..603efea980 100755 --- a/test/units/TEST-88-UPGRADE.sh +++ b/test/units/TEST-88-UPGRADE.sh @@ -72,6 +72,8 @@ check_sd() { # Copy the unit in /run so systemd finds it after the downgrade cp /usr/lib/systemd/tests/testdata/units/TEST-88-UPGRADE.service /run/systemd/system +# Also backup post.sh +cp /usr/lib/systemd/tests/testdata/units/post.sh /tmp/. now=$(date +%s) after_2h=$((now + 3600 * 2)) @@ -105,4 +107,8 @@ dnf -y upgrade --disablerepo '*' "$pkgdir"/devel/*.rpm # TODO: sanity checks check_sd +# Restore post.sh +mkdir -p /usr/lib/systemd/tests/testdata/units +mv /tmp/post.sh /usr/lib/systemd/tests/testdata/units/. + touch /testok diff --git a/test/units/end.service b/test/units/end.service deleted file mode 100644 index 50a68b9dd4..0000000000 --- a/test/units/end.service +++ /dev/null @@ -1,11 +0,0 @@ -# SPDX-License-Identifier: LGPL-2.1-or-later -[Unit] -Description=End the test -After=testsuite.target -OnFailure=poweroff.target -OnFailureJobMode=replace-irreversibly - -[Service] -Type=oneshot -ExecStart=/usr/lib/systemd/tests/testdata/units/end.sh -TimeoutStartSec=5m diff --git a/test/units/end.sh b/test/units/post.sh similarity index 94% rename from test/units/end.sh rename to test/units/post.sh index cc1d7ee11e..9fd50fffaa 100755 --- a/test/units/end.sh +++ b/test/units/post.sh @@ -1,6 +1,5 @@ #!/usr/bin/env bash # SPDX-License-Identifier: LGPL-2.1-or-later - set -eux set -o pipefail @@ -12,6 +11,3 @@ set -o pipefail # Check if sd-executor doesn't complain about not being able to (de)serialize stuff (! journalctl -q -o short-monotonic --grep "[F]ailed to parse serialized line" >>/failed) (! journalctl -q -o short-monotonic --grep "[F]ailed to (de)?serialize \w+" >>/failed) - -systemctl poweroff --no-block -exit 0 diff --git a/test/units/testsuite.target b/test/units/testsuite.target deleted file mode 100644 index 6bcbfec555..0000000000 --- a/test/units/testsuite.target +++ /dev/null @@ -1,7 +0,0 @@ -# SPDX-License-Identifier: LGPL-2.1-or-later -[Unit] -Description=Testsuite target -Requires=multi-user.target -After=multi-user.target -Conflicts=rescue.target -AllowIsolate=yes