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;
363 trigger
= UNIT_TRIGGER(UNIT(t
));
365 log_unit_error(UNIT(t
), "Unit to trigger vanished.");
366 timer_enter_dead(t
, TIMER_FAILURE_RESOURCES
);
370 triple_timestamp_get(&ts
);
371 t
->next_elapse_monotonic_or_boottime
= t
->next_elapse_realtime
= 0;
373 LIST_FOREACH(value
, v
, t
->values
) {
377 if (v
->base
== TIMER_CALENDAR
) {
380 /* If we know the last time this was
381 * triggered, schedule the job based relative
382 * to that. If we don't, just start from
383 * the activation time. */
385 if (t
->last_trigger
.realtime
> 0)
386 b
= t
->last_trigger
.realtime
;
388 if (state_translation_table
[t
->state
] == UNIT_ACTIVE
)
389 b
= UNIT(t
)->inactive_exit_timestamp
.realtime
;
394 r
= calendar_spec_next_usec(v
->calendar_spec
, b
, &v
->next_elapse
);
399 t
->next_elapse_realtime
= v
->next_elapse
;
401 t
->next_elapse_realtime
= MIN(t
->next_elapse_realtime
, v
->next_elapse
);
403 found_realtime
= true;
411 if (state_translation_table
[t
->state
] == UNIT_ACTIVE
)
412 base
= UNIT(t
)->inactive_exit_timestamp
.monotonic
;
418 if (detect_container() <= 0) {
419 /* CLOCK_MONOTONIC equals the uptime on Linux */
423 /* In a container we don't want to include the time the host
424 * was already up when the container started, so count from
425 * our own startup. */
428 base
= UNIT(t
)->manager
->timestamps
[MANAGER_TIMESTAMP_USERSPACE
].monotonic
;
431 case TIMER_UNIT_ACTIVE
:
433 base
= trigger
->inactive_exit_timestamp
.monotonic
;
436 base
= t
->last_trigger
.monotonic
;
440 base
= MAX(base
, t
->last_trigger
.monotonic
);
444 case TIMER_UNIT_INACTIVE
:
446 base
= trigger
->inactive_enter_timestamp
.monotonic
;
449 base
= t
->last_trigger
.monotonic
;
453 base
= MAX(base
, t
->last_trigger
.monotonic
);
458 assert_not_reached("Unknown timer base");
461 v
->next_elapse
= usec_add(usec_shift_clock(base
, CLOCK_MONOTONIC
, TIMER_MONOTONIC_CLOCK(t
)), v
->value
);
464 v
->next_elapse
< triple_timestamp_by_clock(&ts
, TIMER_MONOTONIC_CLOCK(t
)) &&
465 IN_SET(v
->base
, TIMER_ACTIVE
, TIMER_BOOT
, TIMER_STARTUP
)) {
466 /* This is a one time trigger, disable it now */
471 if (!found_monotonic
)
472 t
->next_elapse_monotonic_or_boottime
= v
->next_elapse
;
474 t
->next_elapse_monotonic_or_boottime
= MIN(t
->next_elapse_monotonic_or_boottime
, v
->next_elapse
);
476 found_monotonic
= true;
480 if (!found_monotonic
&& !found_realtime
) {
481 log_unit_debug(UNIT(t
), "Timer is elapsed.");
482 timer_enter_elapsed(t
, leave_around
);
486 if (found_monotonic
) {
487 char buf
[FORMAT_TIMESPAN_MAX
];
490 add_random(t
, &t
->next_elapse_monotonic_or_boottime
);
492 left
= usec_sub_unsigned(t
->next_elapse_monotonic_or_boottime
, triple_timestamp_by_clock(&ts
, TIMER_MONOTONIC_CLOCK(t
)));
493 log_unit_debug(UNIT(t
), "Monotonic timer elapses in %s.", format_timespan(buf
, sizeof(buf
), left
, 0));
495 if (t
->monotonic_event_source
) {
496 r
= sd_event_source_set_time(t
->monotonic_event_source
, t
->next_elapse_monotonic_or_boottime
);
500 r
= sd_event_source_set_enabled(t
->monotonic_event_source
, SD_EVENT_ONESHOT
);
505 r
= sd_event_add_time(
506 UNIT(t
)->manager
->event
,
507 &t
->monotonic_event_source
,
508 t
->wake_system
? CLOCK_BOOTTIME_ALARM
: CLOCK_MONOTONIC
,
509 t
->next_elapse_monotonic_or_boottime
, t
->accuracy_usec
,
514 (void) sd_event_source_set_description(t
->monotonic_event_source
, "timer-monotonic");
517 } else if (t
->monotonic_event_source
) {
519 r
= sd_event_source_set_enabled(t
->monotonic_event_source
, SD_EVENT_OFF
);
524 if (found_realtime
) {
525 char buf
[FORMAT_TIMESTAMP_MAX
];
527 add_random(t
, &t
->next_elapse_realtime
);
529 log_unit_debug(UNIT(t
), "Realtime timer elapses at %s.", format_timestamp(buf
, sizeof(buf
), t
->next_elapse_realtime
));
531 if (t
->realtime_event_source
) {
532 r
= sd_event_source_set_time(t
->realtime_event_source
, t
->next_elapse_realtime
);
536 r
= sd_event_source_set_enabled(t
->realtime_event_source
, SD_EVENT_ONESHOT
);
540 r
= sd_event_add_time(
541 UNIT(t
)->manager
->event
,
542 &t
->realtime_event_source
,
543 t
->wake_system
? CLOCK_REALTIME_ALARM
: CLOCK_REALTIME
,
544 t
->next_elapse_realtime
, t
->accuracy_usec
,
549 (void) sd_event_source_set_description(t
->realtime_event_source
, "timer-realtime");
552 } else if (t
->realtime_event_source
) {
554 r
= sd_event_source_set_enabled(t
->realtime_event_source
, SD_EVENT_OFF
);
559 timer_set_state(t
, TIMER_WAITING
);
563 log_unit_warning_errno(UNIT(t
), r
, "Failed to enter waiting state: %m");
564 timer_enter_dead(t
, TIMER_FAILURE_RESOURCES
);
567 static void timer_enter_running(Timer
*t
) {
568 _cleanup_(sd_bus_error_free
) sd_bus_error error
= SD_BUS_ERROR_NULL
;
574 /* Don't start job if we are supposed to go down */
575 if (unit_stop_pending(UNIT(t
)))
578 trigger
= UNIT_TRIGGER(UNIT(t
));
580 log_unit_error(UNIT(t
), "Unit to trigger vanished.");
581 timer_enter_dead(t
, TIMER_FAILURE_RESOURCES
);
585 r
= manager_add_job(UNIT(t
)->manager
, JOB_START
, trigger
, JOB_REPLACE
, &error
, NULL
);
589 dual_timestamp_get(&t
->last_trigger
);
592 touch_file(t
->stamp_path
, true, t
->last_trigger
.realtime
, UID_INVALID
, GID_INVALID
, MODE_INVALID
);
594 timer_set_state(t
, TIMER_RUNNING
);
598 log_unit_warning(UNIT(t
), "Failed to queue unit startup job: %s", bus_error_message(&error
, r
));
599 timer_enter_dead(t
, TIMER_FAILURE_RESOURCES
);
602 static int timer_start(Unit
*u
) {
609 assert(IN_SET(t
->state
, TIMER_DEAD
, TIMER_FAILED
));
611 trigger
= UNIT_TRIGGER(u
);
612 if (!trigger
|| trigger
->load_state
!= UNIT_LOADED
) {
613 log_unit_error(u
, "Refusing to start, unit to trigger not loaded.");
617 r
= unit_start_limit_test(u
);
619 timer_enter_dead(t
, TIMER_FAILURE_START_LIMIT_HIT
);
623 r
= unit_acquire_invocation_id(u
);
627 t
->last_trigger
= DUAL_TIMESTAMP_NULL
;
629 /* Reenable all timers that depend on unit activation time */
630 LIST_FOREACH(value
, v
, t
->values
)
631 if (v
->base
== TIMER_ACTIVE
)
637 if (stat(t
->stamp_path
, &st
) >= 0) {
640 /* Load the file timestamp, but only if it is actually in the past. If it is in the future,
641 * something is wrong with the system clock. */
643 ft
= timespec_load(&st
.st_mtim
);
644 if (ft
< now(CLOCK_REALTIME
))
645 t
->last_trigger
.realtime
= ft
;
647 char z
[FORMAT_TIMESTAMP_MAX
];
649 log_unit_warning(u
, "Not using persistent file timestamp %s as it is in the future.",
650 format_timestamp(z
, sizeof(z
), ft
));
653 } else if (errno
== ENOENT
)
654 /* The timer has never run before,
655 * make sure a stamp file exists.
657 (void) touch_file(t
->stamp_path
, true, USEC_INFINITY
, UID_INVALID
, GID_INVALID
, MODE_INVALID
);
660 t
->result
= TIMER_SUCCESS
;
661 timer_enter_waiting(t
, true);
665 static int timer_stop(Unit
*u
) {
669 assert(IN_SET(t
->state
, TIMER_WAITING
, TIMER_RUNNING
, TIMER_ELAPSED
));
671 timer_enter_dead(t
, TIMER_SUCCESS
);
675 static int timer_serialize(Unit
*u
, FILE *f
, FDSet
*fds
) {
682 unit_serialize_item(u
, f
, "state", timer_state_to_string(t
->state
));
683 unit_serialize_item(u
, f
, "result", timer_result_to_string(t
->result
));
685 if (t
->last_trigger
.realtime
> 0)
686 unit_serialize_item_format(u
, f
, "last-trigger-realtime", "%" PRIu64
, t
->last_trigger
.realtime
);
688 if (t
->last_trigger
.monotonic
> 0)
689 unit_serialize_item_format(u
, f
, "last-trigger-monotonic", "%" PRIu64
, t
->last_trigger
.monotonic
);
694 static int timer_deserialize_item(Unit
*u
, const char *key
, const char *value
, FDSet
*fds
) {
703 if (streq(key
, "state")) {
706 state
= timer_state_from_string(value
);
708 log_unit_debug(u
, "Failed to parse state value: %s", value
);
710 t
->deserialized_state
= state
;
711 } else if (streq(key
, "result")) {
714 f
= timer_result_from_string(value
);
716 log_unit_debug(u
, "Failed to parse result value: %s", value
);
717 else if (f
!= TIMER_SUCCESS
)
719 } else if (streq(key
, "last-trigger-realtime")) {
721 r
= safe_atou64(value
, &t
->last_trigger
.realtime
);
723 log_unit_debug(u
, "Failed to parse last-trigger-realtime value: %s", value
);
725 } else if (streq(key
, "last-trigger-monotonic")) {
727 r
= safe_atou64(value
, &t
->last_trigger
.monotonic
);
729 log_unit_debug(u
, "Failed to parse last-trigger-monotonic value: %s", value
);
732 log_unit_debug(u
, "Unknown serialization key: %s", key
);
737 _pure_
static UnitActiveState
timer_active_state(Unit
*u
) {
740 return state_translation_table
[TIMER(u
)->state
];
743 _pure_
static const char *timer_sub_state_to_string(Unit
*u
) {
746 return timer_state_to_string(TIMER(u
)->state
);
749 static int timer_dispatch(sd_event_source
*s
, uint64_t usec
, void *userdata
) {
750 Timer
*t
= TIMER(userdata
);
754 if (t
->state
!= TIMER_WAITING
)
757 log_unit_debug(UNIT(t
), "Timer elapsed.");
758 timer_enter_running(t
);
762 static void timer_trigger_notify(Unit
*u
, Unit
*other
) {
769 if (other
->load_state
!= UNIT_LOADED
)
772 /* Reenable all timers that depend on unit state */
773 LIST_FOREACH(value
, v
, t
->values
)
774 if (IN_SET(v
->base
, TIMER_UNIT_ACTIVE
, TIMER_UNIT_INACTIVE
))
782 /* Recalculate sleep time */
783 timer_enter_waiting(t
, false);
788 if (UNIT_IS_INACTIVE_OR_FAILED(unit_active_state(other
))) {
789 log_unit_debug(UNIT(t
), "Got notified about unit deactivation.");
790 timer_enter_waiting(t
, false);
799 assert_not_reached("Unknown timer state");
803 static void timer_reset_failed(Unit
*u
) {
808 if (t
->state
== TIMER_FAILED
)
809 timer_set_state(t
, TIMER_DEAD
);
811 t
->result
= TIMER_SUCCESS
;
814 static void timer_time_change(Unit
*u
) {
820 if (t
->state
!= TIMER_WAITING
)
823 /* If we appear to have triggered in the future, the system clock must
824 * have been set backwards. So let's rewind our own clock and allow
825 * the future trigger(s) to happen again :). Exactly the same as when
826 * you start a timer unit with Persistent=yes. */
827 ts
= now(CLOCK_REALTIME
);
828 if (t
->last_trigger
.realtime
> ts
)
829 t
->last_trigger
.realtime
= ts
;
831 log_unit_debug(u
, "Time change, recalculating next elapse.");
832 timer_enter_waiting(t
, false);
835 static const char* const timer_base_table
[_TIMER_BASE_MAX
] = {
836 [TIMER_ACTIVE
] = "OnActiveSec",
837 [TIMER_BOOT
] = "OnBootSec",
838 [TIMER_STARTUP
] = "OnStartupSec",
839 [TIMER_UNIT_ACTIVE
] = "OnUnitActiveSec",
840 [TIMER_UNIT_INACTIVE
] = "OnUnitInactiveSec",
841 [TIMER_CALENDAR
] = "OnCalendar"
844 DEFINE_STRING_TABLE_LOOKUP(timer_base
, TimerBase
);
846 static const char* const timer_result_table
[_TIMER_RESULT_MAX
] = {
847 [TIMER_SUCCESS
] = "success",
848 [TIMER_FAILURE_RESOURCES
] = "resources",
849 [TIMER_FAILURE_START_LIMIT_HIT
] = "start-limit-hit",
852 DEFINE_STRING_TABLE_LOOKUP(timer_result
, TimerResult
);
854 const UnitVTable timer_vtable
= {
855 .object_size
= sizeof(Timer
),
861 .private_section
= "Timer",
867 .coldplug
= timer_coldplug
,
871 .start
= timer_start
,
874 .serialize
= timer_serialize
,
875 .deserialize_item
= timer_deserialize_item
,
877 .active_state
= timer_active_state
,
878 .sub_state_to_string
= timer_sub_state_to_string
,
880 .trigger_notify
= timer_trigger_notify
,
882 .reset_failed
= timer_reset_failed
,
883 .time_change
= timer_time_change
,
885 .bus_vtable
= bus_timer_vtable
,
886 .bus_set_property
= bus_timer_set_property
,
888 .can_transient
= true,