1 /* SPDX-License-Identifier: LGPL-2.1+ */
3 This file is part of systemd.
5 Copyright 2010 Lennart Poettering
7 systemd is free software; you can redistribute it and/or modify it
8 under the terms of the GNU Lesser General Public License as published by
9 the Free Software Foundation; either version 2.1 of the License, or
10 (at your option) any later version.
12 systemd is distributed in the hope that it will be useful, but
13 WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 Lesser General Public License for more details.
17 You should have received a copy of the GNU Lesser General Public License
18 along with systemd; If not, see <http://www.gnu.org/licenses/>.
23 #include "alloc-util.h"
24 #include "bus-error.h"
26 #include "dbus-timer.h"
28 #include "parse-util.h"
29 #include "random-util.h"
31 #include "string-table.h"
32 #include "string-util.h"
34 #include "unit-name.h"
36 #include "user-util.h"
39 static const UnitActiveState state_translation_table
[_TIMER_STATE_MAX
] = {
40 [TIMER_DEAD
] = UNIT_INACTIVE
,
41 [TIMER_WAITING
] = UNIT_ACTIVE
,
42 [TIMER_RUNNING
] = UNIT_ACTIVE
,
43 [TIMER_ELAPSED
] = UNIT_ACTIVE
,
44 [TIMER_FAILED
] = UNIT_FAILED
47 static int timer_dispatch(sd_event_source
*s
, uint64_t usec
, void *userdata
);
49 static void timer_init(Unit
*u
) {
53 assert(u
->load_state
== UNIT_STUB
);
55 t
->next_elapse_monotonic_or_boottime
= USEC_INFINITY
;
56 t
->next_elapse_realtime
= USEC_INFINITY
;
57 t
->accuracy_usec
= u
->manager
->default_timer_accuracy_usec
;
58 t
->remain_after_elapse
= true;
61 void timer_free_values(Timer
*t
) {
66 while ((v
= t
->values
)) {
67 LIST_REMOVE(value
, t
->values
, v
);
68 calendar_spec_free(v
->calendar_spec
);
73 static void timer_done(Unit
*u
) {
80 t
->monotonic_event_source
= sd_event_source_unref(t
->monotonic_event_source
);
81 t
->realtime_event_source
= sd_event_source_unref(t
->realtime_event_source
);
86 static int timer_verify(Timer
*t
) {
89 if (UNIT(t
)->load_state
!= UNIT_LOADED
)
93 log_unit_error(UNIT(t
), "Timer unit lacks value setting. Refusing.");
100 static int timer_add_default_dependencies(Timer
*t
) {
106 if (!UNIT(t
)->default_dependencies
)
109 r
= unit_add_dependency_by_name(UNIT(t
), UNIT_BEFORE
, SPECIAL_TIMERS_TARGET
, NULL
, true, UNIT_DEPENDENCY_DEFAULT
);
113 if (MANAGER_IS_SYSTEM(UNIT(t
)->manager
)) {
114 r
= unit_add_two_dependencies_by_name(UNIT(t
), UNIT_AFTER
, UNIT_REQUIRES
, SPECIAL_SYSINIT_TARGET
, NULL
, true, UNIT_DEPENDENCY_DEFAULT
);
118 LIST_FOREACH(value
, v
, t
->values
) {
119 if (v
->base
== TIMER_CALENDAR
) {
120 r
= unit_add_dependency_by_name(UNIT(t
), UNIT_AFTER
, SPECIAL_TIME_SYNC_TARGET
, NULL
, true, UNIT_DEPENDENCY_DEFAULT
);
128 return unit_add_two_dependencies_by_name(UNIT(t
), UNIT_BEFORE
, UNIT_CONFLICTS
, SPECIAL_SHUTDOWN_TARGET
, NULL
, true, UNIT_DEPENDENCY_DEFAULT
);
131 static int timer_add_trigger_dependencies(Timer
*t
) {
137 if (!hashmap_isempty(UNIT(t
)->dependencies
[UNIT_TRIGGERS
]))
140 r
= unit_load_related_unit(UNIT(t
), ".service", &x
);
144 return unit_add_two_dependencies(UNIT(t
), UNIT_BEFORE
, UNIT_TRIGGERS
, x
, true, UNIT_DEPENDENCY_IMPLICIT
);
147 static int timer_setup_persistent(Timer
*t
) {
155 if (MANAGER_IS_SYSTEM(UNIT(t
)->manager
)) {
157 r
= unit_require_mounts_for(UNIT(t
), "/var/lib/systemd/timers", UNIT_DEPENDENCY_FILE
);
161 t
->stamp_path
= strappend("/var/lib/systemd/timers/stamp-", UNIT(t
)->id
);
165 e
= getenv("XDG_DATA_HOME");
167 t
->stamp_path
= strjoin(e
, "/systemd/timers/stamp-", UNIT(t
)->id
);
170 _cleanup_free_
char *h
= NULL
;
172 r
= get_home_dir(&h
);
174 return log_unit_error_errno(UNIT(t
), r
, "Failed to determine home directory: %m");
176 t
->stamp_path
= strjoin(h
, "/.local/share/systemd/timers/stamp-", UNIT(t
)->id
);
186 static int timer_load(Unit
*u
) {
191 assert(u
->load_state
== UNIT_STUB
);
193 r
= unit_load_fragment_and_dropin(u
);
197 if (u
->load_state
== UNIT_LOADED
) {
199 r
= timer_add_trigger_dependencies(t
);
203 r
= timer_setup_persistent(t
);
207 r
= timer_add_default_dependencies(t
);
212 return timer_verify(t
);
215 static void timer_dump(Unit
*u
, FILE *f
, const char *prefix
) {
216 char buf
[FORMAT_TIMESPAN_MAX
];
221 trigger
= UNIT_TRIGGER(u
);
224 "%sTimer State: %s\n"
230 "%sRemainAfterElapse: %s\n",
231 prefix
, timer_state_to_string(t
->state
),
232 prefix
, timer_result_to_string(t
->result
),
233 prefix
, trigger
? trigger
->id
: "n/a",
234 prefix
, yes_no(t
->persistent
),
235 prefix
, yes_no(t
->wake_system
),
236 prefix
, format_timespan(buf
, sizeof(buf
), t
->accuracy_usec
, 1),
237 prefix
, yes_no(t
->remain_after_elapse
));
239 LIST_FOREACH(value
, v
, t
->values
) {
241 if (v
->base
== TIMER_CALENDAR
) {
242 _cleanup_free_
char *p
= NULL
;
244 (void) calendar_spec_to_string(v
->calendar_spec
, &p
);
249 timer_base_to_string(v
->base
),
252 char timespan1
[FORMAT_TIMESPAN_MAX
];
257 timer_base_to_string(v
->base
),
258 format_timespan(timespan1
, sizeof(timespan1
), v
->value
, 0));
263 static void timer_set_state(Timer
*t
, TimerState state
) {
264 TimerState old_state
;
267 old_state
= t
->state
;
270 if (state
!= TIMER_WAITING
) {
271 t
->monotonic_event_source
= sd_event_source_unref(t
->monotonic_event_source
);
272 t
->realtime_event_source
= sd_event_source_unref(t
->realtime_event_source
);
273 t
->next_elapse_monotonic_or_boottime
= USEC_INFINITY
;
274 t
->next_elapse_realtime
= USEC_INFINITY
;
277 if (state
!= old_state
)
278 log_unit_debug(UNIT(t
), "Changed %s -> %s", timer_state_to_string(old_state
), timer_state_to_string(state
));
280 unit_notify(UNIT(t
), state_translation_table
[old_state
], state_translation_table
[state
], true);
283 static void timer_enter_waiting(Timer
*t
, bool initial
);
285 static int timer_coldplug(Unit
*u
) {
289 assert(t
->state
== TIMER_DEAD
);
291 if (t
->deserialized_state
== t
->state
)
294 if (t
->deserialized_state
== TIMER_WAITING
)
295 timer_enter_waiting(t
, false);
297 timer_set_state(t
, t
->deserialized_state
);
302 static void timer_enter_dead(Timer
*t
, TimerResult f
) {
305 if (t
->result
== TIMER_SUCCESS
)
308 if (t
->result
!= TIMER_SUCCESS
)
309 log_unit_warning(UNIT(t
), "Failed with result '%s'.", timer_result_to_string(t
->result
));
311 timer_set_state(t
, t
->result
!= TIMER_SUCCESS
? TIMER_FAILED
: TIMER_DEAD
);
314 static void timer_enter_elapsed(Timer
*t
, bool leave_around
) {
317 /* If a unit is marked with RemainAfterElapse=yes we leave it
318 * around even after it elapsed once, so that starting it
319 * later again does not necessarily mean immediate
320 * retriggering. We unconditionally leave units with
321 * TIMER_UNIT_ACTIVE or TIMER_UNIT_INACTIVE triggers around,
322 * since they might be restarted automatically at any time
325 if (t
->remain_after_elapse
|| leave_around
)
326 timer_set_state(t
, TIMER_ELAPSED
);
328 timer_enter_dead(t
, TIMER_SUCCESS
);
331 static void add_random(Timer
*t
, usec_t
*v
) {
332 char s
[FORMAT_TIMESPAN_MAX
];
338 if (t
->random_usec
== 0)
340 if (*v
== USEC_INFINITY
)
343 add
= random_u64() % t
->random_usec
;
345 if (*v
+ add
< *v
) /* overflow */
346 *v
= (usec_t
) -2; /* Highest possible value, that is not USEC_INFINITY */
350 log_unit_debug(UNIT(t
), "Adding %s random time.", format_timespan(s
, sizeof(s
), add
, 0));
353 static void timer_enter_waiting(Timer
*t
, bool initial
) {
354 bool found_monotonic
= false, found_realtime
= false;
355 bool leave_around
= false;
364 trigger
= UNIT_TRIGGER(UNIT(t
));
366 log_unit_error(UNIT(t
), "Unit to trigger vanished.");
367 timer_enter_dead(t
, TIMER_FAILURE_RESOURCES
);
371 triple_timestamp_get(&ts
);
372 t
->next_elapse_monotonic_or_boottime
= t
->next_elapse_realtime
= 0;
374 LIST_FOREACH(value
, v
, t
->values
) {
379 if (v
->base
== TIMER_CALENDAR
) {
382 /* If we know the last time this was
383 * triggered, schedule the job based relative
384 * to that. If we don't just start from
387 b
= t
->last_trigger
.realtime
> 0 ? t
->last_trigger
.realtime
: ts
.realtime
;
389 r
= calendar_spec_next_usec(v
->calendar_spec
, b
, &v
->next_elapse
);
394 t
->next_elapse_realtime
= v
->next_elapse
;
396 t
->next_elapse_realtime
= MIN(t
->next_elapse_realtime
, v
->next_elapse
);
398 found_realtime
= true;
405 if (state_translation_table
[t
->state
] == UNIT_ACTIVE
)
406 base
= UNIT(t
)->inactive_exit_timestamp
.monotonic
;
412 if (detect_container() <= 0) {
413 /* CLOCK_MONOTONIC equals the uptime on Linux */
417 /* In a container we don't want to include the time the host
418 * was already up when the container started, so count from
419 * our own startup. */
422 base
= UNIT(t
)->manager
->userspace_timestamp
.monotonic
;
425 case TIMER_UNIT_ACTIVE
:
427 base
= trigger
->inactive_exit_timestamp
.monotonic
;
430 base
= t
->last_trigger
.monotonic
;
437 case TIMER_UNIT_INACTIVE
:
439 base
= trigger
->inactive_enter_timestamp
.monotonic
;
442 base
= t
->last_trigger
.monotonic
;
450 assert_not_reached("Unknown timer base");
453 v
->next_elapse
= usec_add(usec_shift_clock(base
, CLOCK_MONOTONIC
, TIMER_MONOTONIC_CLOCK(t
)), v
->value
);
456 v
->next_elapse
< triple_timestamp_by_clock(&ts
, TIMER_MONOTONIC_CLOCK(t
)) &&
457 IN_SET(v
->base
, TIMER_ACTIVE
, TIMER_BOOT
, TIMER_STARTUP
)) {
458 /* This is a one time trigger, disable it now */
463 if (!found_monotonic
)
464 t
->next_elapse_monotonic_or_boottime
= v
->next_elapse
;
466 t
->next_elapse_monotonic_or_boottime
= MIN(t
->next_elapse_monotonic_or_boottime
, v
->next_elapse
);
468 found_monotonic
= true;
472 if (!found_monotonic
&& !found_realtime
) {
473 log_unit_debug(UNIT(t
), "Timer is elapsed.");
474 timer_enter_elapsed(t
, leave_around
);
478 if (found_monotonic
) {
479 char buf
[FORMAT_TIMESPAN_MAX
];
482 add_random(t
, &t
->next_elapse_monotonic_or_boottime
);
484 left
= usec_sub_unsigned(t
->next_elapse_monotonic_or_boottime
, triple_timestamp_by_clock(&ts
, TIMER_MONOTONIC_CLOCK(t
)));
485 log_unit_debug(UNIT(t
), "Monotonic timer elapses in %s.", format_timespan(buf
, sizeof(buf
), left
, 0));
487 if (t
->monotonic_event_source
) {
488 r
= sd_event_source_set_time(t
->monotonic_event_source
, t
->next_elapse_monotonic_or_boottime
);
492 r
= sd_event_source_set_enabled(t
->monotonic_event_source
, SD_EVENT_ONESHOT
);
497 r
= sd_event_add_time(
498 UNIT(t
)->manager
->event
,
499 &t
->monotonic_event_source
,
500 t
->wake_system
? CLOCK_BOOTTIME_ALARM
: CLOCK_MONOTONIC
,
501 t
->next_elapse_monotonic_or_boottime
, t
->accuracy_usec
,
506 (void) sd_event_source_set_description(t
->monotonic_event_source
, "timer-monotonic");
509 } else if (t
->monotonic_event_source
) {
511 r
= sd_event_source_set_enabled(t
->monotonic_event_source
, SD_EVENT_OFF
);
516 if (found_realtime
) {
517 char buf
[FORMAT_TIMESTAMP_MAX
];
519 add_random(t
, &t
->next_elapse_realtime
);
521 log_unit_debug(UNIT(t
), "Realtime timer elapses at %s.", format_timestamp(buf
, sizeof(buf
), t
->next_elapse_realtime
));
523 if (t
->realtime_event_source
) {
524 r
= sd_event_source_set_time(t
->realtime_event_source
, t
->next_elapse_realtime
);
528 r
= sd_event_source_set_enabled(t
->realtime_event_source
, SD_EVENT_ONESHOT
);
532 r
= sd_event_add_time(
533 UNIT(t
)->manager
->event
,
534 &t
->realtime_event_source
,
535 t
->wake_system
? CLOCK_REALTIME_ALARM
: CLOCK_REALTIME
,
536 t
->next_elapse_realtime
, t
->accuracy_usec
,
541 (void) sd_event_source_set_description(t
->realtime_event_source
, "timer-realtime");
544 } else if (t
->realtime_event_source
) {
546 r
= sd_event_source_set_enabled(t
->realtime_event_source
, SD_EVENT_OFF
);
551 timer_set_state(t
, TIMER_WAITING
);
555 log_unit_warning_errno(UNIT(t
), r
, "Failed to enter waiting state: %m");
556 timer_enter_dead(t
, TIMER_FAILURE_RESOURCES
);
559 static void timer_enter_running(Timer
*t
) {
560 _cleanup_(sd_bus_error_free
) sd_bus_error error
= SD_BUS_ERROR_NULL
;
566 /* Don't start job if we are supposed to go down */
567 if (unit_stop_pending(UNIT(t
)))
570 trigger
= UNIT_TRIGGER(UNIT(t
));
572 log_unit_error(UNIT(t
), "Unit to trigger vanished.");
573 timer_enter_dead(t
, TIMER_FAILURE_RESOURCES
);
577 r
= manager_add_job(UNIT(t
)->manager
, JOB_START
, trigger
, JOB_REPLACE
, &error
, NULL
);
581 dual_timestamp_get(&t
->last_trigger
);
584 touch_file(t
->stamp_path
, true, t
->last_trigger
.realtime
, UID_INVALID
, GID_INVALID
, MODE_INVALID
);
586 timer_set_state(t
, TIMER_RUNNING
);
590 log_unit_warning(UNIT(t
), "Failed to queue unit startup job: %s", bus_error_message(&error
, r
));
591 timer_enter_dead(t
, TIMER_FAILURE_RESOURCES
);
594 static int timer_start(Unit
*u
) {
601 assert(IN_SET(t
->state
, TIMER_DEAD
, TIMER_FAILED
));
603 trigger
= UNIT_TRIGGER(u
);
604 if (!trigger
|| trigger
->load_state
!= UNIT_LOADED
) {
605 log_unit_error(u
, "Refusing to start, unit to trigger not loaded.");
609 r
= unit_start_limit_test(u
);
611 timer_enter_dead(t
, TIMER_FAILURE_START_LIMIT_HIT
);
615 r
= unit_acquire_invocation_id(u
);
619 t
->last_trigger
= DUAL_TIMESTAMP_NULL
;
621 /* Reenable all timers that depend on unit activation time */
622 LIST_FOREACH(value
, v
, t
->values
)
623 if (v
->base
== TIMER_ACTIVE
)
629 if (stat(t
->stamp_path
, &st
) >= 0) {
632 /* Load the file timestamp, but only if it is actually in the past. If it is in the future,
633 * something is wrong with the system clock. */
635 ft
= timespec_load(&st
.st_mtim
);
636 if (ft
< now(CLOCK_REALTIME
))
637 t
->last_trigger
.realtime
= ft
;
639 char z
[FORMAT_TIMESTAMP_MAX
];
641 log_unit_warning(u
, "Not using persistent file timestamp %s as it is in the future.",
642 format_timestamp(z
, sizeof(z
), ft
));
645 } else if (errno
== ENOENT
)
646 /* The timer has never run before,
647 * make sure a stamp file exists.
649 (void) touch_file(t
->stamp_path
, true, USEC_INFINITY
, UID_INVALID
, GID_INVALID
, MODE_INVALID
);
652 t
->result
= TIMER_SUCCESS
;
653 timer_enter_waiting(t
, true);
657 static int timer_stop(Unit
*u
) {
661 assert(IN_SET(t
->state
, TIMER_WAITING
, TIMER_RUNNING
, TIMER_ELAPSED
));
663 timer_enter_dead(t
, TIMER_SUCCESS
);
667 static int timer_serialize(Unit
*u
, FILE *f
, FDSet
*fds
) {
674 unit_serialize_item(u
, f
, "state", timer_state_to_string(t
->state
));
675 unit_serialize_item(u
, f
, "result", timer_result_to_string(t
->result
));
677 if (t
->last_trigger
.realtime
> 0)
678 unit_serialize_item_format(u
, f
, "last-trigger-realtime", "%" PRIu64
, t
->last_trigger
.realtime
);
680 if (t
->last_trigger
.monotonic
> 0)
681 unit_serialize_item_format(u
, f
, "last-trigger-monotonic", "%" PRIu64
, t
->last_trigger
.monotonic
);
686 static int timer_deserialize_item(Unit
*u
, const char *key
, const char *value
, FDSet
*fds
) {
695 if (streq(key
, "state")) {
698 state
= timer_state_from_string(value
);
700 log_unit_debug(u
, "Failed to parse state value: %s", value
);
702 t
->deserialized_state
= state
;
703 } else if (streq(key
, "result")) {
706 f
= timer_result_from_string(value
);
708 log_unit_debug(u
, "Failed to parse result value: %s", value
);
709 else if (f
!= TIMER_SUCCESS
)
711 } else if (streq(key
, "last-trigger-realtime")) {
713 r
= safe_atou64(value
, &t
->last_trigger
.realtime
);
715 log_unit_debug(u
, "Failed to parse last-trigger-realtime value: %s", value
);
717 } else if (streq(key
, "last-trigger-monotonic")) {
719 r
= safe_atou64(value
, &t
->last_trigger
.monotonic
);
721 log_unit_debug(u
, "Failed to parse last-trigger-monotonic value: %s", value
);
724 log_unit_debug(u
, "Unknown serialization key: %s", key
);
729 _pure_
static UnitActiveState
timer_active_state(Unit
*u
) {
732 return state_translation_table
[TIMER(u
)->state
];
735 _pure_
static const char *timer_sub_state_to_string(Unit
*u
) {
738 return timer_state_to_string(TIMER(u
)->state
);
741 static int timer_dispatch(sd_event_source
*s
, uint64_t usec
, void *userdata
) {
742 Timer
*t
= TIMER(userdata
);
746 if (t
->state
!= TIMER_WAITING
)
749 log_unit_debug(UNIT(t
), "Timer elapsed.");
750 timer_enter_running(t
);
754 static void timer_trigger_notify(Unit
*u
, Unit
*other
) {
761 if (other
->load_state
!= UNIT_LOADED
)
764 /* Reenable all timers that depend on unit state */
765 LIST_FOREACH(value
, v
, t
->values
)
766 if (IN_SET(v
->base
, TIMER_UNIT_ACTIVE
, TIMER_UNIT_INACTIVE
))
774 /* Recalculate sleep time */
775 timer_enter_waiting(t
, false);
780 if (UNIT_IS_INACTIVE_OR_FAILED(unit_active_state(other
))) {
781 log_unit_debug(UNIT(t
), "Got notified about unit deactivation.");
782 timer_enter_waiting(t
, false);
791 assert_not_reached("Unknown timer state");
795 static void timer_reset_failed(Unit
*u
) {
800 if (t
->state
== TIMER_FAILED
)
801 timer_set_state(t
, TIMER_DEAD
);
803 t
->result
= TIMER_SUCCESS
;
806 static void timer_time_change(Unit
*u
) {
811 if (t
->state
!= TIMER_WAITING
)
814 log_unit_debug(u
, "Time change, recalculating next elapse.");
815 timer_enter_waiting(t
, false);
818 static const char* const timer_base_table
[_TIMER_BASE_MAX
] = {
819 [TIMER_ACTIVE
] = "OnActiveSec",
820 [TIMER_BOOT
] = "OnBootSec",
821 [TIMER_STARTUP
] = "OnStartupSec",
822 [TIMER_UNIT_ACTIVE
] = "OnUnitActiveSec",
823 [TIMER_UNIT_INACTIVE
] = "OnUnitInactiveSec",
824 [TIMER_CALENDAR
] = "OnCalendar"
827 DEFINE_STRING_TABLE_LOOKUP(timer_base
, TimerBase
);
829 static const char* const timer_result_table
[_TIMER_RESULT_MAX
] = {
830 [TIMER_SUCCESS
] = "success",
831 [TIMER_FAILURE_RESOURCES
] = "resources",
832 [TIMER_FAILURE_START_LIMIT_HIT
] = "start-limit-hit",
835 DEFINE_STRING_TABLE_LOOKUP(timer_result
, TimerResult
);
837 const UnitVTable timer_vtable
= {
838 .object_size
= sizeof(Timer
),
844 .private_section
= "Timer",
850 .coldplug
= timer_coldplug
,
854 .start
= timer_start
,
857 .serialize
= timer_serialize
,
858 .deserialize_item
= timer_deserialize_item
,
860 .active_state
= timer_active_state
,
861 .sub_state_to_string
= timer_sub_state_to_string
,
863 .trigger_notify
= timer_trigger_notify
,
865 .reset_failed
= timer_reset_failed
,
866 .time_change
= timer_time_change
,
868 .bus_vtable
= bus_timer_vtable
,
869 .bus_set_property
= bus_timer_set_property
,
871 .can_transient
= true,