1
1
mirror of https://github.com/systemd/systemd-stable.git synced 2025-01-11 05:17:44 +03:00

timedated: always enable&start the service with highest priority

This removes a special case that was implemented before: if some service
was already enabled, we'd treat it as having higher priority.

From https://bugzilla.redhat.com/show_bug.cgi?id=1735584#c4:
> Setting ntp off and on should give the same result as just setting it
> on. There should be no stickiness (hidden state). It should behave like
> running an ansible role.
>
> The other service might have been enabled because no other was installed at
> the time. If I install a new NTP service with a higher priority, setting ntp
> on should enable and start the new service, and disable all other. Also, if
> for some reason multiple services are enabled, after setting ntp on there
> should be only one enabled to avoid systemd selecting between them randomly
> on the next boot.
This commit is contained in:
Zbigniew Jędrzejewski-Szmek 2019-08-05 12:50:11 +02:00
parent ad7fb9434c
commit 0957790b5f

View File

@ -243,20 +243,6 @@ static int context_ntp_service_is_active(Context *c) {
return count; return count;
} }
static int context_ntp_service_is_enabled(Context *c) {
UnitStatusInfo *info;
int count = 0;
assert(c);
/* Call context_update_ntp_status() to update UnitStatusInfo before calling this. */
LIST_FOREACH(units, info, c->units)
count += !STRPTR_IN_SET(info->unit_file_state, "masked", "masked-runtime", "disabled", "bad");
return count;
}
static int context_ntp_service_exists(Context *c) { static int context_ntp_service_exists(Context *c) {
UnitStatusInfo *info; UnitStatusInfo *info;
int count = 0; int count = 0;
@ -961,43 +947,38 @@ static int method_set_ntp(sd_bus_message *m, void *userdata, sd_bus_error *error
return r; return r;
} }
if (!enable) if (enable)
LIST_FOREACH(units, u, c->units) { LIST_FOREACH(units, u, c->units) {
bool enable_this_one = !selected;
if (!streq(u->load_state, "loaded")) if (!streq(u->load_state, "loaded"))
continue; continue;
q = unit_enable_or_disable(u, bus, error, enable); r = unit_enable_or_disable(u, bus, error, enable_this_one);
if (q < 0)
r = q;
q = unit_start_or_stop(u, bus, error, enable);
if (q < 0)
r = q;
}
else if (context_ntp_service_is_enabled(c) <= 0)
LIST_FOREACH(units, u, c->units) {
if (!streq(u->load_state, "loaded"))
continue;
r = unit_enable_or_disable(u, bus, error, enable);
if (r < 0) if (r < 0)
continue; /* If enablement failed, don't start this unit. */
enable_this_one = false;
r = unit_start_or_stop(u, bus, error, enable); r = unit_start_or_stop(u, bus, error, enable_this_one);
selected = u; if (r < 0)
break; log_unit_warning_errno(u, r, "Failed to %s %sd NTP unit, ignoring: %m",
enable_this_one ? "start" : "stop",
enable_disable(enable_this_one));
if (enable_this_one)
selected = u;
} }
else else
LIST_FOREACH(units, u, c->units) { LIST_FOREACH(units, u, c->units) {
if (!streq(u->load_state, "loaded") || if (!streq(u->load_state, "loaded"))
!streq(u->unit_file_state, "enabled"))
continue; continue;
r = unit_start_or_stop(u, bus, error, enable); q = unit_enable_or_disable(u, bus, error, false);
selected = u; if (q < 0)
break; r = q;
q = unit_start_or_stop(u, bus, error, false);
if (q < 0)
r = q;
} }
if (r < 0) if (r < 0)