Skip to content

Commit

Permalink
implement aliasing for systemd-analyze verify
Browse files Browse the repository at this point in the history
  • Loading branch information
bytesuji committed Sep 29, 2021
1 parent 14bb729 commit 292ffa1
Show file tree
Hide file tree
Showing 2 changed files with 84 additions and 2 deletions.
24 changes: 23 additions & 1 deletion man/systemd-analyze.xml
Original file line number Diff line number Diff line change
Expand Up @@ -537,7 +537,8 @@ NAutoVTs=8
<title><command>systemd-analyze verify <replaceable>FILE</replaceable>...</command></title>

<para>This command will load unit files and print warnings if any errors are detected. Files specified
on the command line will be loaded, but also any other units referenced by them. The full unit search
on the command line will be loaded, but also any other units referenced by them. A unit's name on disk
can be overrided by specifying an alias after a colon; see below for an example. The full unit search
path is formed by combining the directories for all command line arguments, and the usual unit load
paths. The variable <varname>$SYSTEMD_UNIT_PATH</varname> is supported, and may be used to replace or
augment the compiled in set of unit load paths; see
Expand Down Expand Up @@ -599,6 +600,27 @@ Service a.service not loaded, a.socket cannot be started.
Service b@0.service not loaded, b.socket cannot be started.
</programlisting>
</example>

<example>
<title>Aliasing a unit</title>

<programlisting>$ cat /tmp/source
[Unit]
Description=Hostname printer

[Service]
Type=simple
ExecStart=/usr/bin/echo %H
MysteryKey=true

$ systemd-analyze verify /tmp/source
Failed to prepare filename /tmp/source: Invalid argument

$ systemd-analyze verify /tmp/source:alias.service
/tmp/systemd-analyze-XXXXXX/alias.service:7: Unknown key name 'MysteryKey' in section 'Service', ignoring.
</programlisting>
</example>

</refsect2>

<refsect2>
Expand Down
62 changes: 61 additions & 1 deletion src/analyze/analyze.c
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
#include "copy.h"
#include "def.h"
#include "exit-status.h"
#include "extract-word.h"
#include "fd-util.h"
#include "fileio.h"
#include "format-table.h"
Expand All @@ -41,6 +42,7 @@
#include "parse-util.h"
#include "path-util.h"
#include "pretty-print.h"
#include "rm-rf.h"
#if HAVE_SECCOMP
# include "seccomp-util.h"
#endif
Expand All @@ -51,6 +53,7 @@
#include "strxcpyx.h"
#include "terminal-util.h"
#include "time-util.h"
#include "tmpfile-util.h"
#include "unit-name.h"
#include "util.h"
#include "verb-log-control.h"
Expand Down Expand Up @@ -228,6 +231,51 @@ static int compare_unit_start(const UnitTimes *a, const UnitTimes *b) {
return CMP(a->activating, b->activating);
}

static int process_aliases(char *argv[], char *tempdir, char ***ret) {
int r;
char **filename;
_cleanup_strv_free_ char **filenames = NULL;

assert(argv);
assert(tempdir);
assert(ret);

STRV_FOREACH(filename, strv_skip(argv, 1)) {
_cleanup_free_ char *src = NULL, *dst = NULL, *argname = NULL;

r = extract_first_word((const char **)filename, &src, ":", 0);
if (r < 0)
return r;

if (!*filename) {
r = strv_extend(&filenames, src);
if (r < 0)
return -ENOMEM;

continue;
}

argname = strdup(*filename);
if (!argname)
return -ENOMEM;

dst = path_join(tempdir, basename(*filename));
if (!dst)
return -ENOMEM;

r = copy_file(src, dst, 0, 0644, 0, 0, COPY_REFLINK);
if (r < 0)
return r;

r = strv_consume(&filenames, TAKE_PTR(dst));
if (r < 0)
return -ENOMEM;
}

*ret = TAKE_PTR(filenames);
return 0;
}

static UnitTimes* unit_times_free_array(UnitTimes *t) {
for (UnitTimes *p = t; p && p->has_data; p++)
free(p->name);
Expand Down Expand Up @@ -2086,7 +2134,19 @@ static int do_condition(int argc, char *argv[], void *userdata) {
}

static int do_verify(int argc, char *argv[], void *userdata) {
return verify_units(strv_skip(argv, 1), arg_scope, arg_man, arg_generators, arg_recursive_errors, arg_root);
int r;
_cleanup_strv_free_ char **filenames = NULL;
_cleanup_(rm_rf_physical_and_freep) char *tempdir = NULL;

r = mkdtemp_malloc("/tmp/systemd-analyze-XXXXXX", &tempdir);
if (r < 0)
return log_error_errno(r, "Failed to setup working directory: %m");

r = process_aliases(argv, tempdir, &filenames);
if (r < 0)
return log_error_errno(r, "Couldn't process aliases: %m");

return verify_units(filenames, arg_scope, arg_man, arg_generators, arg_recursive_errors, arg_root);
}

static int do_security(int argc, char *argv[], void *userdata) {
Expand Down

0 comments on commit 292ffa1

Please sign in to comment.