]> git.ipfire.org Git - thirdparty/systemd.git/blob - src/core/job.c
Merge pull request #1180 from evverx/dot-from-to-alias-handling
[thirdparty/systemd.git] / src / core / job.c
1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
2
3 /***
4 This file is part of systemd.
5
6 Copyright 2010 Lennart Poettering
7
8 systemd is free software; you can redistribute it and/or modify it
9 under the terms of the GNU Lesser General Public License as published by
10 the Free Software Foundation; either version 2.1 of the License, or
11 (at your option) any later version.
12
13 systemd is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 Lesser General Public License for more details.
17
18 You should have received a copy of the GNU Lesser General Public License
19 along with systemd; If not, see <http://www.gnu.org/licenses/>.
20 ***/
21
22 #include <errno.h>
23
24 #include "sd-id128.h"
25 #include "sd-messages.h"
26 #include "set.h"
27 #include "unit.h"
28 #include "macro.h"
29 #include "strv.h"
30 #include "log.h"
31 #include "dbus-job.h"
32 #include "special.h"
33 #include "async.h"
34 #include "virt.h"
35 #include "dbus.h"
36 #include "terminal-util.h"
37
38 Job* job_new_raw(Unit *unit) {
39 Job *j;
40
41 /* used for deserialization */
42
43 assert(unit);
44
45 j = new0(Job, 1);
46 if (!j)
47 return NULL;
48
49 j->manager = unit->manager;
50 j->unit = unit;
51 j->type = _JOB_TYPE_INVALID;
52
53 return j;
54 }
55
56 Job* job_new(Unit *unit, JobType type) {
57 Job *j;
58
59 assert(type < _JOB_TYPE_MAX);
60
61 j = job_new_raw(unit);
62 if (!j)
63 return NULL;
64
65 j->id = j->manager->current_job_id++;
66 j->type = type;
67
68 /* We don't link it here, that's what job_dependency() is for */
69
70 return j;
71 }
72
73 void job_free(Job *j) {
74 assert(j);
75 assert(!j->installed);
76 assert(!j->transaction_prev);
77 assert(!j->transaction_next);
78 assert(!j->subject_list);
79 assert(!j->object_list);
80
81 if (j->in_run_queue)
82 LIST_REMOVE(run_queue, j->manager->run_queue, j);
83
84 if (j->in_dbus_queue)
85 LIST_REMOVE(dbus_queue, j->manager->dbus_job_queue, j);
86
87 sd_event_source_unref(j->timer_event_source);
88
89 sd_bus_track_unref(j->clients);
90 strv_free(j->deserialized_clients);
91
92 free(j);
93 }
94
95 static void job_set_state(Job *j, JobState state) {
96 assert(j);
97 assert(state >= 0);
98 assert(state < _JOB_STATE_MAX);
99
100 if (j->state == state)
101 return;
102
103 j->state = state;
104
105 if (!j->installed)
106 return;
107
108 if (j->state == JOB_RUNNING)
109 j->unit->manager->n_running_jobs++;
110 else {
111 assert(j->state == JOB_WAITING);
112 assert(j->unit->manager->n_running_jobs > 0);
113
114 j->unit->manager->n_running_jobs--;
115
116 if (j->unit->manager->n_running_jobs <= 0)
117 j->unit->manager->jobs_in_progress_event_source = sd_event_source_unref(j->unit->manager->jobs_in_progress_event_source);
118 }
119 }
120
121 void job_uninstall(Job *j) {
122 Job **pj;
123
124 assert(j->installed);
125
126 job_set_state(j, JOB_WAITING);
127
128 pj = (j->type == JOB_NOP) ? &j->unit->nop_job : &j->unit->job;
129 assert(*pj == j);
130
131 /* Detach from next 'bigger' objects */
132
133 /* daemon-reload should be transparent to job observers */
134 if (j->manager->n_reloading <= 0)
135 bus_job_send_removed_signal(j);
136
137 *pj = NULL;
138
139 unit_add_to_gc_queue(j->unit);
140
141 hashmap_remove(j->manager->jobs, UINT32_TO_PTR(j->id));
142 j->installed = false;
143 }
144
145 static bool job_type_allows_late_merge(JobType t) {
146 /* Tells whether it is OK to merge a job of type 't' with an already
147 * running job.
148 * Reloads cannot be merged this way. Think of the sequence:
149 * 1. Reload of a daemon is in progress; the daemon has already loaded
150 * its config file, but hasn't completed the reload operation yet.
151 * 2. Edit foo's config file.
152 * 3. Trigger another reload to have the daemon use the new config.
153 * Should the second reload job be merged into the first one, the daemon
154 * would not know about the new config.
155 * JOB_RESTART jobs on the other hand can be merged, because they get
156 * patched into JOB_START after stopping the unit. So if we see a
157 * JOB_RESTART running, it means the unit hasn't stopped yet and at
158 * this time the merge is still allowed. */
159 return t != JOB_RELOAD;
160 }
161
162 static void job_merge_into_installed(Job *j, Job *other) {
163 assert(j->installed);
164 assert(j->unit == other->unit);
165
166 if (j->type != JOB_NOP)
167 job_type_merge_and_collapse(&j->type, other->type, j->unit);
168 else
169 assert(other->type == JOB_NOP);
170
171 j->override = j->override || other->override;
172 j->irreversible = j->irreversible || other->irreversible;
173 j->ignore_order = j->ignore_order || other->ignore_order;
174 }
175
176 Job* job_install(Job *j) {
177 Job **pj;
178 Job *uj;
179
180 assert(!j->installed);
181 assert(j->type < _JOB_TYPE_MAX_IN_TRANSACTION);
182 assert(j->state == JOB_WAITING);
183
184 pj = (j->type == JOB_NOP) ? &j->unit->nop_job : &j->unit->job;
185 uj = *pj;
186
187 if (uj) {
188 if (job_type_is_conflicting(uj->type, j->type))
189 job_finish_and_invalidate(uj, JOB_CANCELED, false);
190 else {
191 /* not conflicting, i.e. mergeable */
192
193 if (uj->state == JOB_WAITING ||
194 (job_type_allows_late_merge(j->type) && job_type_is_superset(uj->type, j->type))) {
195 job_merge_into_installed(uj, j);
196 log_unit_debug(uj->unit,
197 "Merged into installed job %s/%s as %u",
198 uj->unit->id, job_type_to_string(uj->type), (unsigned) uj->id);
199 return uj;
200 } else {
201 /* already running and not safe to merge into */
202 /* Patch uj to become a merged job and re-run it. */
203 /* XXX It should be safer to queue j to run after uj finishes, but it is
204 * not currently possible to have more than one installed job per unit. */
205 job_merge_into_installed(uj, j);
206 log_unit_debug(uj->unit,
207 "Merged into running job, re-running: %s/%s as %u",
208 uj->unit->id, job_type_to_string(uj->type), (unsigned) uj->id);
209
210 job_set_state(uj, JOB_WAITING);
211 return uj;
212 }
213 }
214 }
215
216 /* Install the job */
217 *pj = j;
218 j->installed = true;
219
220 j->manager->n_installed_jobs ++;
221 log_unit_debug(j->unit,
222 "Installed new job %s/%s as %u",
223 j->unit->id, job_type_to_string(j->type), (unsigned) j->id);
224 return j;
225 }
226
227 int job_install_deserialized(Job *j) {
228 Job **pj;
229
230 assert(!j->installed);
231
232 if (j->type < 0 || j->type >= _JOB_TYPE_MAX_IN_TRANSACTION) {
233 log_debug("Invalid job type %s in deserialization.", strna(job_type_to_string(j->type)));
234 return -EINVAL;
235 }
236
237 pj = (j->type == JOB_NOP) ? &j->unit->nop_job : &j->unit->job;
238 if (*pj) {
239 log_unit_debug(j->unit, "Unit already has a job installed. Not installing deserialized job.");
240 return -EEXIST;
241 }
242
243 *pj = j;
244 j->installed = true;
245
246 if (j->state == JOB_RUNNING)
247 j->unit->manager->n_running_jobs++;
248
249 log_unit_debug(j->unit,
250 "Reinstalled deserialized job %s/%s as %u",
251 j->unit->id, job_type_to_string(j->type), (unsigned) j->id);
252 return 0;
253 }
254
255 JobDependency* job_dependency_new(Job *subject, Job *object, bool matters, bool conflicts) {
256 JobDependency *l;
257
258 assert(object);
259
260 /* Adds a new job link, which encodes that the 'subject' job
261 * needs the 'object' job in some way. If 'subject' is NULL
262 * this means the 'anchor' job (i.e. the one the user
263 * explicitly asked for) is the requester. */
264
265 if (!(l = new0(JobDependency, 1)))
266 return NULL;
267
268 l->subject = subject;
269 l->object = object;
270 l->matters = matters;
271 l->conflicts = conflicts;
272
273 if (subject)
274 LIST_PREPEND(subject, subject->subject_list, l);
275
276 LIST_PREPEND(object, object->object_list, l);
277
278 return l;
279 }
280
281 void job_dependency_free(JobDependency *l) {
282 assert(l);
283
284 if (l->subject)
285 LIST_REMOVE(subject, l->subject->subject_list, l);
286
287 LIST_REMOVE(object, l->object->object_list, l);
288
289 free(l);
290 }
291
292 void job_dump(Job *j, FILE*f, const char *prefix) {
293 assert(j);
294 assert(f);
295
296 if (!prefix)
297 prefix = "";
298
299 fprintf(f,
300 "%s-> Job %u:\n"
301 "%s\tAction: %s -> %s\n"
302 "%s\tState: %s\n"
303 "%s\tForced: %s\n"
304 "%s\tIrreversible: %s\n",
305 prefix, j->id,
306 prefix, j->unit->id, job_type_to_string(j->type),
307 prefix, job_state_to_string(j->state),
308 prefix, yes_no(j->override),
309 prefix, yes_no(j->irreversible));
310 }
311
312 /*
313 * Merging is commutative, so imagine the matrix as symmetric. We store only
314 * its lower triangle to avoid duplication. We don't store the main diagonal,
315 * because A merged with A is simply A.
316 *
317 * If the resulting type is collapsed immediately afterwards (to get rid of
318 * the JOB_RELOAD_OR_START, which lies outside the lookup function's domain),
319 * the following properties hold:
320 *
321 * Merging is associative! A merged with B, and then merged with C is the same
322 * as A merged with the result of B merged with C.
323 *
324 * Mergeability is transitive! If A can be merged with B and B with C then
325 * A also with C.
326 *
327 * Also, if A merged with B cannot be merged with C, then either A or B cannot
328 * be merged with C either.
329 */
330 static const JobType job_merging_table[] = {
331 /* What \ With * JOB_START JOB_VERIFY_ACTIVE JOB_STOP JOB_RELOAD */
332 /*********************************************************************************/
333 /*JOB_START */
334 /*JOB_VERIFY_ACTIVE */ JOB_START,
335 /*JOB_STOP */ -1, -1,
336 /*JOB_RELOAD */ JOB_RELOAD_OR_START, JOB_RELOAD, -1,
337 /*JOB_RESTART */ JOB_RESTART, JOB_RESTART, -1, JOB_RESTART,
338 };
339
340 JobType job_type_lookup_merge(JobType a, JobType b) {
341 assert_cc(ELEMENTSOF(job_merging_table) == _JOB_TYPE_MAX_MERGING * (_JOB_TYPE_MAX_MERGING - 1) / 2);
342 assert(a >= 0 && a < _JOB_TYPE_MAX_MERGING);
343 assert(b >= 0 && b < _JOB_TYPE_MAX_MERGING);
344
345 if (a == b)
346 return a;
347
348 if (a < b) {
349 JobType tmp = a;
350 a = b;
351 b = tmp;
352 }
353
354 return job_merging_table[(a - 1) * a / 2 + b];
355 }
356
357 bool job_type_is_redundant(JobType a, UnitActiveState b) {
358 switch (a) {
359
360 case JOB_START:
361 return
362 b == UNIT_ACTIVE ||
363 b == UNIT_RELOADING;
364
365 case JOB_STOP:
366 return
367 b == UNIT_INACTIVE ||
368 b == UNIT_FAILED;
369
370 case JOB_VERIFY_ACTIVE:
371 return
372 b == UNIT_ACTIVE ||
373 b == UNIT_RELOADING;
374
375 case JOB_RELOAD:
376 return
377 b == UNIT_RELOADING;
378
379 case JOB_RESTART:
380 return
381 b == UNIT_ACTIVATING;
382
383 case JOB_NOP:
384 return true;
385
386 default:
387 assert_not_reached("Invalid job type");
388 }
389 }
390
391 JobType job_type_collapse(JobType t, Unit *u) {
392 UnitActiveState s;
393
394 switch (t) {
395
396 case JOB_TRY_RESTART:
397 s = unit_active_state(u);
398 if (UNIT_IS_INACTIVE_OR_DEACTIVATING(s))
399 return JOB_NOP;
400
401 return JOB_RESTART;
402
403 case JOB_RELOAD_OR_START:
404 s = unit_active_state(u);
405 if (UNIT_IS_INACTIVE_OR_DEACTIVATING(s))
406 return JOB_START;
407
408 return JOB_RELOAD;
409
410 default:
411 return t;
412 }
413 }
414
415 int job_type_merge_and_collapse(JobType *a, JobType b, Unit *u) {
416 JobType t;
417
418 t = job_type_lookup_merge(*a, b);
419 if (t < 0)
420 return -EEXIST;
421
422 *a = job_type_collapse(t, u);
423 return 0;
424 }
425
426 static bool job_is_runnable(Job *j) {
427 Iterator i;
428 Unit *other;
429
430 assert(j);
431 assert(j->installed);
432
433 /* Checks whether there is any job running for the units this
434 * job needs to be running after (in the case of a 'positive'
435 * job type) or before (in the case of a 'negative' job
436 * type. */
437
438 /* Note that unit types have a say in what is runnable,
439 * too. For example, if they return -EAGAIN from
440 * unit_start() they can indicate they are not
441 * runnable yet. */
442
443 /* First check if there is an override */
444 if (j->ignore_order)
445 return true;
446
447 if (j->type == JOB_NOP)
448 return true;
449
450 if (j->type == JOB_START ||
451 j->type == JOB_VERIFY_ACTIVE ||
452 j->type == JOB_RELOAD) {
453
454 /* Immediate result is that the job is or might be
455 * started. In this case let's wait for the
456 * dependencies, regardless whether they are
457 * starting or stopping something. */
458
459 SET_FOREACH(other, j->unit->dependencies[UNIT_AFTER], i)
460 if (other->job)
461 return false;
462 }
463
464 /* Also, if something else is being stopped and we should
465 * change state after it, then let's wait. */
466
467 SET_FOREACH(other, j->unit->dependencies[UNIT_BEFORE], i)
468 if (other->job &&
469 (other->job->type == JOB_STOP ||
470 other->job->type == JOB_RESTART))
471 return false;
472
473 /* This means that for a service a and a service b where b
474 * shall be started after a:
475 *
476 * start a + start b → 1st step start a, 2nd step start b
477 * start a + stop b → 1st step stop b, 2nd step start a
478 * stop a + start b → 1st step stop a, 2nd step start b
479 * stop a + stop b → 1st step stop b, 2nd step stop a
480 *
481 * This has the side effect that restarts are properly
482 * synchronized too. */
483
484 return true;
485 }
486
487 static void job_change_type(Job *j, JobType newtype) {
488 assert(j);
489
490 log_unit_debug(j->unit,
491 "Converting job %s/%s -> %s/%s",
492 j->unit->id, job_type_to_string(j->type),
493 j->unit->id, job_type_to_string(newtype));
494
495 j->type = newtype;
496 }
497
498 static int job_perform_on_unit(Job **j) {
499 /* While we execute this operation the job might go away (for
500 * example: because it finishes immediately or is replaced by a new,
501 * conflicting job.) To make sure we don't access a freed job later on
502 * we store the id here, so that we can verify the job is still
503 * valid. */
504 Manager *m = (*j)->manager;
505 Unit *u = (*j)->unit;
506 JobType t = (*j)->type;
507 uint32_t id = (*j)->id;
508 int r;
509
510 switch (t) {
511 case JOB_START:
512 r = unit_start(u);
513 break;
514
515 case JOB_RESTART:
516 t = JOB_STOP;
517 case JOB_STOP:
518 r = unit_stop(u);
519 break;
520
521 case JOB_RELOAD:
522 r = unit_reload(u);
523 break;
524
525 default:
526 assert_not_reached("Invalid job type");
527 }
528
529 /* Log if the job still exists and the start/stop/reload function
530 * actually did something. */
531 *j = manager_get_job(m, id);
532 if (*j && r > 0)
533 unit_status_emit_starting_stopping_reloading(u, t);
534
535 return r;
536 }
537
538 int job_run_and_invalidate(Job *j) {
539 int r;
540
541 assert(j);
542 assert(j->installed);
543 assert(j->type < _JOB_TYPE_MAX_IN_TRANSACTION);
544 assert(j->in_run_queue);
545
546 LIST_REMOVE(run_queue, j->manager->run_queue, j);
547 j->in_run_queue = false;
548
549 if (j->state != JOB_WAITING)
550 return 0;
551
552 if (!job_is_runnable(j))
553 return -EAGAIN;
554
555 job_set_state(j, JOB_RUNNING);
556 job_add_to_dbus_queue(j);
557
558
559 switch (j->type) {
560
561 case JOB_VERIFY_ACTIVE: {
562 UnitActiveState t = unit_active_state(j->unit);
563 if (UNIT_IS_ACTIVE_OR_RELOADING(t))
564 r = -EALREADY;
565 else if (t == UNIT_ACTIVATING)
566 r = -EAGAIN;
567 else
568 r = -EBADR;
569 break;
570 }
571
572 case JOB_START:
573 case JOB_STOP:
574 case JOB_RESTART:
575 r = job_perform_on_unit(&j);
576
577 /* If the unit type does not support starting/stopping,
578 * then simply wait. */
579 if (r == -EBADR)
580 r = 0;
581 break;
582
583 case JOB_RELOAD:
584 r = job_perform_on_unit(&j);
585 break;
586
587 case JOB_NOP:
588 r = -EALREADY;
589 break;
590
591 default:
592 assert_not_reached("Unknown job type");
593 }
594
595 if (j) {
596 if (r == -EALREADY)
597 r = job_finish_and_invalidate(j, JOB_DONE, true);
598 else if (r == -EBADR)
599 r = job_finish_and_invalidate(j, JOB_SKIPPED, true);
600 else if (r == -ENOEXEC)
601 r = job_finish_and_invalidate(j, JOB_INVALID, true);
602 else if (r == -EPROTO)
603 r = job_finish_and_invalidate(j, JOB_ASSERT, true);
604 else if (r == -EOPNOTSUPP)
605 r = job_finish_and_invalidate(j, JOB_UNSUPPORTED, true);
606 else if (r == -EAGAIN)
607 job_set_state(j, JOB_WAITING);
608 else if (r < 0)
609 r = job_finish_and_invalidate(j, JOB_FAILED, true);
610 }
611
612 return r;
613 }
614
615 _pure_ static const char *job_get_status_message_format(Unit *u, JobType t, JobResult result) {
616 const char *format;
617 const UnitStatusMessageFormats *format_table;
618 static const char *const generic_finished_start_job[_JOB_RESULT_MAX] = {
619 [JOB_DONE] = "Started %s.",
620 [JOB_TIMEOUT] = "Timed out starting %s.",
621 [JOB_FAILED] = "Failed to start %s.",
622 [JOB_DEPENDENCY] = "Dependency failed for %s.",
623 [JOB_ASSERT] = "Assertion failed for %s.",
624 [JOB_UNSUPPORTED] = "Starting of %s not supported.",
625 };
626 static const char *const generic_finished_stop_job[_JOB_RESULT_MAX] = {
627 [JOB_DONE] = "Stopped %s.",
628 [JOB_FAILED] = "Stopped (with error) %s.",
629 [JOB_TIMEOUT] = "Timed out stoppping %s.",
630 };
631 static const char *const generic_finished_reload_job[_JOB_RESULT_MAX] = {
632 [JOB_DONE] = "Reloaded %s.",
633 [JOB_FAILED] = "Reload failed for %s.",
634 [JOB_TIMEOUT] = "Timed out reloading %s.",
635 };
636 /* When verify-active detects the unit is inactive, report it.
637 * Most likely a DEPEND warning from a requisiting unit will
638 * occur next and it's nice to see what was requisited. */
639 static const char *const generic_finished_verify_active_job[_JOB_RESULT_MAX] = {
640 [JOB_SKIPPED] = "%s is not active.",
641 };
642
643 assert(u);
644 assert(t >= 0);
645 assert(t < _JOB_TYPE_MAX);
646
647 if (t == JOB_START || t == JOB_STOP || t == JOB_RESTART) {
648 format_table = &UNIT_VTABLE(u)->status_message_formats;
649 if (format_table) {
650 format = t == JOB_START ? format_table->finished_start_job[result] :
651 format_table->finished_stop_job[result];
652 if (format)
653 return format;
654 }
655 }
656
657 /* Return generic strings */
658 if (t == JOB_START)
659 return generic_finished_start_job[result];
660 else if (t == JOB_STOP || t == JOB_RESTART)
661 return generic_finished_stop_job[result];
662 else if (t == JOB_RELOAD)
663 return generic_finished_reload_job[result];
664 else if (t == JOB_VERIFY_ACTIVE)
665 return generic_finished_verify_active_job[result];
666
667 return NULL;
668 }
669
670 static void job_print_status_message(Unit *u, JobType t, JobResult result) {
671 const char *format;
672 static const char* const job_result_status_table[_JOB_RESULT_MAX] = {
673 [JOB_DONE] = ANSI_GREEN_ON " OK " ANSI_HIGHLIGHT_OFF,
674 [JOB_TIMEOUT] = ANSI_HIGHLIGHT_RED_ON " TIME " ANSI_HIGHLIGHT_OFF,
675 [JOB_FAILED] = ANSI_HIGHLIGHT_RED_ON "FAILED" ANSI_HIGHLIGHT_OFF,
676 [JOB_DEPENDENCY] = ANSI_HIGHLIGHT_YELLOW_ON "DEPEND" ANSI_HIGHLIGHT_OFF,
677 [JOB_SKIPPED] = ANSI_HIGHLIGHT_ON " INFO " ANSI_HIGHLIGHT_OFF,
678 [JOB_ASSERT] = ANSI_HIGHLIGHT_YELLOW_ON "ASSERT" ANSI_HIGHLIGHT_OFF,
679 [JOB_UNSUPPORTED] = ANSI_HIGHLIGHT_YELLOW_ON "UNSUPP" ANSI_HIGHLIGHT_OFF,
680 };
681
682 assert(u);
683 assert(t >= 0);
684 assert(t < _JOB_TYPE_MAX);
685
686 format = job_get_status_message_format(u, t, result);
687 if (!format)
688 return;
689
690 if (result != JOB_DONE)
691 manager_flip_auto_status(u->manager, true);
692
693 DISABLE_WARNING_FORMAT_NONLITERAL;
694 unit_status_printf(u, job_result_status_table[result], format);
695 REENABLE_WARNING;
696
697 if (t == JOB_START && result == JOB_FAILED) {
698 _cleanup_free_ char *quoted = shell_maybe_quote(u->id);
699
700 manager_status_printf(u->manager, STATUS_TYPE_NORMAL, NULL,
701 "See 'systemctl status %s' for details.", strna(quoted));
702 }
703 }
704
705 static void job_log_status_message(Unit *u, JobType t, JobResult result) {
706 const char *format;
707 char buf[LINE_MAX];
708 sd_id128_t mid;
709 static const int job_result_log_level[_JOB_RESULT_MAX] = {
710 [JOB_DONE] = LOG_INFO,
711 [JOB_CANCELED] = LOG_INFO,
712 [JOB_TIMEOUT] = LOG_ERR,
713 [JOB_FAILED] = LOG_ERR,
714 [JOB_DEPENDENCY] = LOG_WARNING,
715 [JOB_SKIPPED] = LOG_NOTICE,
716 [JOB_INVALID] = LOG_INFO,
717 [JOB_ASSERT] = LOG_WARNING,
718 [JOB_UNSUPPORTED] = LOG_WARNING,
719 };
720
721 assert(u);
722 assert(t >= 0);
723 assert(t < _JOB_TYPE_MAX);
724
725 /* Skip this if it goes to the console. since we already print
726 * to the console anyway... */
727
728 if (log_on_console())
729 return;
730
731 format = job_get_status_message_format(u, t, result);
732 if (!format)
733 return;
734
735 DISABLE_WARNING_FORMAT_NONLITERAL;
736 snprintf(buf, sizeof(buf), format, unit_description(u));
737 REENABLE_WARNING;
738
739 if (t == JOB_START)
740 mid = result == JOB_DONE ? SD_MESSAGE_UNIT_STARTED : SD_MESSAGE_UNIT_FAILED;
741 else if (t == JOB_STOP || t == JOB_RESTART)
742 mid = SD_MESSAGE_UNIT_STOPPED;
743 else if (t == JOB_RELOAD)
744 mid = SD_MESSAGE_UNIT_RELOADED;
745 else {
746 log_struct(job_result_log_level[result],
747 LOG_UNIT_ID(u),
748 LOG_MESSAGE("%s", buf),
749 "RESULT=%s", job_result_to_string(result),
750 NULL);
751 return;
752 }
753
754 log_struct(job_result_log_level[result],
755 LOG_MESSAGE_ID(mid),
756 LOG_UNIT_ID(u),
757 LOG_MESSAGE("%s", buf),
758 "RESULT=%s", job_result_to_string(result),
759 NULL);
760 }
761
762 static void job_emit_status_message(Unit *u, JobType t, JobResult result) {
763
764 /* No message if the job did not actually do anything due to failed condition. */
765 if (t == JOB_START && result == JOB_DONE && !u->condition_result)
766 return;
767
768 job_log_status_message(u, t, result);
769
770 /* Reload status messages have traditionally not been printed to console. */
771 if (t != JOB_RELOAD)
772 job_print_status_message(u, t, result);
773 }
774
775 static void job_fail_dependencies(Unit *u, UnitDependency d) {
776 Unit *other;
777 Iterator i;
778
779 assert(u);
780
781 SET_FOREACH(other, u->dependencies[d], i) {
782 Job *j = other->job;
783
784 if (!j)
785 continue;
786 if (!IN_SET(j->type, JOB_START, JOB_VERIFY_ACTIVE))
787 continue;
788
789 job_finish_and_invalidate(j, JOB_DEPENDENCY, true);
790 }
791 }
792
793 int job_finish_and_invalidate(Job *j, JobResult result, bool recursive) {
794 Unit *u;
795 Unit *other;
796 JobType t;
797 Iterator i;
798
799 assert(j);
800 assert(j->installed);
801 assert(j->type < _JOB_TYPE_MAX_IN_TRANSACTION);
802
803 u = j->unit;
804 t = j->type;
805
806 j->result = result;
807
808 log_unit_debug(u, "Job %s/%s finished, result=%s", u->id, job_type_to_string(t), job_result_to_string(result));
809
810 job_emit_status_message(u, t, result);
811
812 job_add_to_dbus_queue(j);
813
814 /* Patch restart jobs so that they become normal start jobs */
815 if (result == JOB_DONE && t == JOB_RESTART) {
816
817 job_change_type(j, JOB_START);
818 job_set_state(j, JOB_WAITING);
819
820 job_add_to_run_queue(j);
821
822 goto finish;
823 }
824
825 if (result == JOB_FAILED || result == JOB_INVALID)
826 j->manager->n_failed_jobs ++;
827
828 job_uninstall(j);
829 job_free(j);
830
831 /* Fail depending jobs on failure */
832 if (result != JOB_DONE && recursive) {
833 if (IN_SET(t, JOB_START, JOB_VERIFY_ACTIVE)) {
834 job_fail_dependencies(u, UNIT_REQUIRED_BY);
835 job_fail_dependencies(u, UNIT_REQUISITE_OF);
836 job_fail_dependencies(u, UNIT_BOUND_BY);
837 job_fail_dependencies(u, UNIT_REQUIRED_BY_OVERRIDABLE);
838 job_fail_dependencies(u, UNIT_REQUISITE_OF_OVERRIDABLE);
839 } else if (t == JOB_STOP)
840 job_fail_dependencies(u, UNIT_CONFLICTED_BY);
841 }
842
843 /* Trigger OnFailure dependencies that are not generated by
844 * the unit itself. We don't treat JOB_CANCELED as failure in
845 * this context. And JOB_FAILURE is already handled by the
846 * unit itself. */
847 if (result == JOB_TIMEOUT || result == JOB_DEPENDENCY) {
848 log_struct(LOG_NOTICE,
849 "JOB_TYPE=%s", job_type_to_string(t),
850 "JOB_RESULT=%s", job_result_to_string(result),
851 LOG_UNIT_ID(u),
852 LOG_UNIT_MESSAGE(u, "Job %s/%s failed with result '%s'.",
853 u->id,
854 job_type_to_string(t),
855 job_result_to_string(result)),
856 NULL);
857
858 unit_start_on_failure(u);
859 }
860
861 unit_trigger_notify(u);
862
863 finish:
864 /* Try to start the next jobs that can be started */
865 SET_FOREACH(other, u->dependencies[UNIT_AFTER], i)
866 if (other->job)
867 job_add_to_run_queue(other->job);
868 SET_FOREACH(other, u->dependencies[UNIT_BEFORE], i)
869 if (other->job)
870 job_add_to_run_queue(other->job);
871
872 manager_check_finished(u->manager);
873
874 return 0;
875 }
876
877 static int job_dispatch_timer(sd_event_source *s, uint64_t monotonic, void *userdata) {
878 Job *j = userdata;
879 Unit *u;
880
881 assert(j);
882 assert(s == j->timer_event_source);
883
884 log_unit_warning(j->unit, "Job %s/%s timed out.", j->unit->id, job_type_to_string(j->type));
885
886 u = j->unit;
887 job_finish_and_invalidate(j, JOB_TIMEOUT, true);
888
889 failure_action(u->manager, u->job_timeout_action, u->job_timeout_reboot_arg);
890
891 return 0;
892 }
893
894 int job_start_timer(Job *j) {
895 int r;
896
897 if (j->timer_event_source)
898 return 0;
899
900 j->begin_usec = now(CLOCK_MONOTONIC);
901
902 if (j->unit->job_timeout <= 0)
903 return 0;
904
905 r = sd_event_add_time(
906 j->manager->event,
907 &j->timer_event_source,
908 CLOCK_MONOTONIC,
909 j->begin_usec + j->unit->job_timeout, 0,
910 job_dispatch_timer, j);
911 if (r < 0)
912 return r;
913
914 (void) sd_event_source_set_description(j->timer_event_source, "job-start");
915
916 return 0;
917 }
918
919 void job_add_to_run_queue(Job *j) {
920 assert(j);
921 assert(j->installed);
922
923 if (j->in_run_queue)
924 return;
925
926 if (!j->manager->run_queue)
927 sd_event_source_set_enabled(j->manager->run_queue_event_source, SD_EVENT_ONESHOT);
928
929 LIST_PREPEND(run_queue, j->manager->run_queue, j);
930 j->in_run_queue = true;
931 }
932
933 void job_add_to_dbus_queue(Job *j) {
934 assert(j);
935 assert(j->installed);
936
937 if (j->in_dbus_queue)
938 return;
939
940 /* We don't check if anybody is subscribed here, since this
941 * job might just have been created and not yet assigned to a
942 * connection/client. */
943
944 LIST_PREPEND(dbus_queue, j->manager->dbus_job_queue, j);
945 j->in_dbus_queue = true;
946 }
947
948 char *job_dbus_path(Job *j) {
949 char *p;
950
951 assert(j);
952
953 if (asprintf(&p, "/org/freedesktop/systemd1/job/%"PRIu32, j->id) < 0)
954 return NULL;
955
956 return p;
957 }
958
959 int job_serialize(Job *j, FILE *f, FDSet *fds) {
960 fprintf(f, "job-id=%u\n", j->id);
961 fprintf(f, "job-type=%s\n", job_type_to_string(j->type));
962 fprintf(f, "job-state=%s\n", job_state_to_string(j->state));
963 fprintf(f, "job-override=%s\n", yes_no(j->override));
964 fprintf(f, "job-irreversible=%s\n", yes_no(j->irreversible));
965 fprintf(f, "job-sent-dbus-new-signal=%s\n", yes_no(j->sent_dbus_new_signal));
966 fprintf(f, "job-ignore-order=%s\n", yes_no(j->ignore_order));
967
968 if (j->begin_usec > 0)
969 fprintf(f, "job-begin="USEC_FMT"\n", j->begin_usec);
970
971 bus_track_serialize(j->clients, f);
972
973 /* End marker */
974 fputc('\n', f);
975 return 0;
976 }
977
978 int job_deserialize(Job *j, FILE *f, FDSet *fds) {
979 assert(j);
980
981 for (;;) {
982 char line[LINE_MAX], *l, *v;
983 size_t k;
984
985 if (!fgets(line, sizeof(line), f)) {
986 if (feof(f))
987 return 0;
988 return -errno;
989 }
990
991 char_array_0(line);
992 l = strstrip(line);
993
994 /* End marker */
995 if (l[0] == 0)
996 return 0;
997
998 k = strcspn(l, "=");
999
1000 if (l[k] == '=') {
1001 l[k] = 0;
1002 v = l+k+1;
1003 } else
1004 v = l+k;
1005
1006 if (streq(l, "job-id")) {
1007
1008 if (safe_atou32(v, &j->id) < 0)
1009 log_debug("Failed to parse job id value %s", v);
1010
1011 } else if (streq(l, "job-type")) {
1012 JobType t;
1013
1014 t = job_type_from_string(v);
1015 if (t < 0)
1016 log_debug("Failed to parse job type %s", v);
1017 else if (t >= _JOB_TYPE_MAX_IN_TRANSACTION)
1018 log_debug("Cannot deserialize job of type %s", v);
1019 else
1020 j->type = t;
1021
1022 } else if (streq(l, "job-state")) {
1023 JobState s;
1024
1025 s = job_state_from_string(v);
1026 if (s < 0)
1027 log_debug("Failed to parse job state %s", v);
1028 else
1029 job_set_state(j, s);
1030
1031 } else if (streq(l, "job-override")) {
1032 int b;
1033
1034 b = parse_boolean(v);
1035 if (b < 0)
1036 log_debug("Failed to parse job override flag %s", v);
1037 else
1038 j->override = j->override || b;
1039
1040 } else if (streq(l, "job-irreversible")) {
1041 int b;
1042
1043 b = parse_boolean(v);
1044 if (b < 0)
1045 log_debug("Failed to parse job irreversible flag %s", v);
1046 else
1047 j->irreversible = j->irreversible || b;
1048
1049 } else if (streq(l, "job-sent-dbus-new-signal")) {
1050 int b;
1051
1052 b = parse_boolean(v);
1053 if (b < 0)
1054 log_debug("Failed to parse job sent_dbus_new_signal flag %s", v);
1055 else
1056 j->sent_dbus_new_signal = j->sent_dbus_new_signal || b;
1057
1058 } else if (streq(l, "job-ignore-order")) {
1059 int b;
1060
1061 b = parse_boolean(v);
1062 if (b < 0)
1063 log_debug("Failed to parse job ignore_order flag %s", v);
1064 else
1065 j->ignore_order = j->ignore_order || b;
1066
1067 } else if (streq(l, "job-begin")) {
1068 unsigned long long ull;
1069
1070 if (sscanf(v, "%llu", &ull) != 1)
1071 log_debug("Failed to parse job-begin value %s", v);
1072 else
1073 j->begin_usec = ull;
1074
1075 } else if (streq(l, "subscribed")) {
1076
1077 if (strv_extend(&j->deserialized_clients, v) < 0)
1078 return log_oom();
1079 }
1080 }
1081 }
1082
1083 int job_coldplug(Job *j) {
1084 int r;
1085
1086 assert(j);
1087
1088 /* After deserialization is complete and the bus connection
1089 * set up again, let's start watching our subscribers again */
1090 r = bus_track_coldplug(j->manager, &j->clients, &j->deserialized_clients);
1091 if (r < 0)
1092 return r;
1093
1094 if (j->state == JOB_WAITING)
1095 job_add_to_run_queue(j);
1096
1097 if (j->begin_usec == 0 || j->unit->job_timeout == 0)
1098 return 0;
1099
1100 if (j->timer_event_source)
1101 j->timer_event_source = sd_event_source_unref(j->timer_event_source);
1102
1103 r = sd_event_add_time(
1104 j->manager->event,
1105 &j->timer_event_source,
1106 CLOCK_MONOTONIC,
1107 j->begin_usec + j->unit->job_timeout, 0,
1108 job_dispatch_timer, j);
1109 if (r < 0)
1110 log_debug_errno(r, "Failed to restart timeout for job: %m");
1111
1112 (void) sd_event_source_set_description(j->timer_event_source, "job-timeout");
1113
1114 return r;
1115 }
1116
1117 void job_shutdown_magic(Job *j) {
1118 assert(j);
1119
1120 /* The shutdown target gets some special treatment here: we
1121 * tell the kernel to begin with flushing its disk caches, to
1122 * optimize shutdown time a bit. Ideally we wouldn't hardcode
1123 * this magic into PID 1. However all other processes aren't
1124 * options either since they'd exit much sooner than PID 1 and
1125 * asynchronous sync() would cause their exit to be
1126 * delayed. */
1127
1128 if (j->type != JOB_START)
1129 return;
1130
1131 if (j->unit->manager->running_as != MANAGER_SYSTEM)
1132 return;
1133
1134 if (!unit_has_name(j->unit, SPECIAL_SHUTDOWN_TARGET))
1135 return;
1136
1137 /* In case messages on console has been disabled on boot */
1138 j->unit->manager->no_console_output = false;
1139
1140 if (detect_container() > 0)
1141 return;
1142
1143 asynchronous_sync();
1144 }
1145
1146 int job_get_timeout(Job *j, uint64_t *timeout) {
1147 Unit *u = j->unit;
1148 uint64_t x = -1, y = -1;
1149 int r = 0, q = 0;
1150
1151 assert(u);
1152
1153 if (j->timer_event_source) {
1154 r = sd_event_source_get_time(j->timer_event_source, &x);
1155 if (r < 0)
1156 return r;
1157 r = 1;
1158 }
1159
1160 if (UNIT_VTABLE(u)->get_timeout) {
1161 q = UNIT_VTABLE(u)->get_timeout(u, &y);
1162 if (q < 0)
1163 return q;
1164 }
1165
1166 if (r == 0 && q == 0)
1167 return 0;
1168
1169 *timeout = MIN(x, y);
1170
1171 return 1;
1172 }
1173
1174 static const char* const job_state_table[_JOB_STATE_MAX] = {
1175 [JOB_WAITING] = "waiting",
1176 [JOB_RUNNING] = "running"
1177 };
1178
1179 DEFINE_STRING_TABLE_LOOKUP(job_state, JobState);
1180
1181 static const char* const job_type_table[_JOB_TYPE_MAX] = {
1182 [JOB_START] = "start",
1183 [JOB_VERIFY_ACTIVE] = "verify-active",
1184 [JOB_STOP] = "stop",
1185 [JOB_RELOAD] = "reload",
1186 [JOB_RELOAD_OR_START] = "reload-or-start",
1187 [JOB_RESTART] = "restart",
1188 [JOB_TRY_RESTART] = "try-restart",
1189 [JOB_NOP] = "nop",
1190 };
1191
1192 DEFINE_STRING_TABLE_LOOKUP(job_type, JobType);
1193
1194 static const char* const job_mode_table[_JOB_MODE_MAX] = {
1195 [JOB_FAIL] = "fail",
1196 [JOB_REPLACE] = "replace",
1197 [JOB_REPLACE_IRREVERSIBLY] = "replace-irreversibly",
1198 [JOB_ISOLATE] = "isolate",
1199 [JOB_FLUSH] = "flush",
1200 [JOB_IGNORE_DEPENDENCIES] = "ignore-dependencies",
1201 [JOB_IGNORE_REQUIREMENTS] = "ignore-requirements",
1202 };
1203
1204 DEFINE_STRING_TABLE_LOOKUP(job_mode, JobMode);
1205
1206 static const char* const job_result_table[_JOB_RESULT_MAX] = {
1207 [JOB_DONE] = "done",
1208 [JOB_CANCELED] = "canceled",
1209 [JOB_TIMEOUT] = "timeout",
1210 [JOB_FAILED] = "failed",
1211 [JOB_DEPENDENCY] = "dependency",
1212 [JOB_SKIPPED] = "skipped",
1213 [JOB_INVALID] = "invalid",
1214 [JOB_ASSERT] = "assert",
1215 [JOB_UNSUPPORTED] = "unsupported",
1216 };
1217
1218 DEFINE_STRING_TABLE_LOOKUP(job_result, JobResult);