summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2016-02-24 15:44:46 +0100
committerLennart Poettering <lennart@poettering.net>2016-04-12 13:43:29 +0200
commitf413930863ab3b98cb7bf9e761081b4e88a5d7d9 (patch)
treea4d28ddb420d31374f37b0624047be0a4c129674
parenta3c4eb07106b29f7366113764cb1c8c4d6dd5646 (diff)
core: add a new unit file state "generated"
Now that we store the generator directories in LookupPaths we can use this to intrdouce a new unit file state called "generated", for units in these directories. Fixes: #2348
-rw-r--r--man/systemctl.xml13
-rw-r--r--src/shared/install.c23
-rw-r--r--src/shared/install.h1
-rw-r--r--src/systemctl/systemctl.c7
4 files changed, 37 insertions, 7 deletions
diff --git a/man/systemctl.xml b/man/systemctl.xml
index 089fb0f5c3..0febdfd4de 100644
--- a/man/systemctl.xml
+++ b/man/systemctl.xml
@@ -1168,22 +1168,27 @@ kobject-uevent 1 systemd-udevd-kernel.socket systemd-udevd.service
</row>
<row>
<entry><literal>static</literal></entry>
- <entry>The unit file is not enabled, and has no provisions for enabling in the <literal>[Install]</literal> section.</entry>
+ <entry>The unit file is not enabled, and has no provisions for enabling in the <literal>[Install]</literal> unit file section.</entry>
<entry>0</entry>
</row>
<row>
<entry><literal>indirect</literal></entry>
- <entry>The unit file itself is not enabled, but it has a non-empty <varname>Also=</varname> setting in the <literal>[Install]</literal> section, listing other unit files that might be enabled.</entry>
+ <entry>The unit file itself is not enabled, but it has a non-empty <varname>Also=</varname> setting in the <literal>[Install]</literal> unit file section, listing other unit files that might be enabled.</entry>
<entry>0</entry>
</row>
<row>
<entry><literal>disabled</literal></entry>
- <entry>Unit file is not enabled, but contains an <literal>[Install]</literal> section with installation instructions.</entry>
+ <entry>The unit file is not enabled, but contains an <literal>[Install]</literal> section with installation instructions.</entry>
<entry>&gt; 0</entry>
</row>
<row>
+ <entry><literal>generated</literal></entry>
+ <entry>The unit file was generated dynamically via a generator tool. See <citerefentry><refentrytitle>systemd.generator</refentrytitle><manvolnum>7</manvolnum></citerefentry>. Generated unit files may not be enabled, they are enabled implicitly by their generator.</entry>
+ <entry>0</entry>
+ </row>
+ <row>
<entry><literal>bad</literal></entry>
- <entry>Unit file is invalid or another error occurred. Note that <command>is-enabled</command> will not actually return this state, but print an error message instead. However the unit file listing printed by <command>list-unit-files</command> might show it.</entry>
+ <entry>The unit file is invalid or another error occurred. Note that <command>is-enabled</command> will not actually return this state, but print an error message instead. However the unit file listing printed by <command>list-unit-files</command> might show it.</entry>
<entry>&gt; 0</entry>
</row>
</tbody>
diff --git a/src/shared/install.c b/src/shared/install.c
index e232d76dd7..202d16e129 100644
--- a/src/shared/install.c
+++ b/src/shared/install.c
@@ -82,6 +82,20 @@ static int in_search_path(const char *path, char **search) {
return false;
}
+static int unit_file_is_generated(const LookupPaths *p, const char *path) {
+ _cleanup_free_ char *parent = NULL;
+
+ assert(path);
+
+ parent = dirname_malloc(path);
+ if (!parent)
+ return -ENOMEM;
+
+ return path_equal(p->generator, parent) ||
+ path_equal(p->generator_early, parent) ||
+ path_equal(p->generator_late, parent);
+}
+
static int get_config_path(UnitFileScope scope, bool runtime, const char *root_dir, char **ret) {
char *p = NULL;
int r;
@@ -2023,6 +2037,14 @@ int unit_file_lookup_state(
break;
case UNIT_FILE_TYPE_REGULAR:
+ r = unit_file_is_generated(paths, i->path);
+ if (r < 0)
+ return r;
+ if (r > 0) {
+ state = UNIT_FILE_GENERATED;
+ break;
+ }
+
r = find_symlinks_in_scope(scope, root_dir, i->name, &state);
if (r < 0)
return r;
@@ -2453,6 +2475,7 @@ static const char* const unit_file_state_table[_UNIT_FILE_STATE_MAX] = {
[UNIT_FILE_STATIC] = "static",
[UNIT_FILE_DISABLED] = "disabled",
[UNIT_FILE_INDIRECT] = "indirect",
+ [UNIT_FILE_GENERATED] = "generated",
[UNIT_FILE_BAD] = "bad",
};
diff --git a/src/shared/install.h b/src/shared/install.h
index 82b6d425eb..18aad65d50 100644
--- a/src/shared/install.h
+++ b/src/shared/install.h
@@ -54,6 +54,7 @@ enum UnitFileState {
UNIT_FILE_STATIC,
UNIT_FILE_DISABLED,
UNIT_FILE_INDIRECT,
+ UNIT_FILE_GENERATED,
UNIT_FILE_BAD,
_UNIT_FILE_STATE_MAX,
_UNIT_FILE_STATE_INVALID = -1
diff --git a/src/systemctl/systemctl.c b/src/systemctl/systemctl.c
index 4d0b4754ae..6394b4749e 100644
--- a/src/systemctl/systemctl.c
+++ b/src/systemctl/systemctl.c
@@ -5783,7 +5783,8 @@ static int unit_is_enabled(int argc, char *argv[], void *userdata) {
UNIT_FILE_ENABLED,
UNIT_FILE_ENABLED_RUNTIME,
UNIT_FILE_STATIC,
- UNIT_FILE_INDIRECT))
+ UNIT_FILE_INDIRECT,
+ UNIT_FILE_GENERATED))
enabled = true;
if (!arg_quiet)
@@ -5818,7 +5819,7 @@ static int unit_is_enabled(int argc, char *argv[], void *userdata) {
if (r < 0)
return bus_log_parse_error(r);
- if (STR_IN_SET(s, "enabled", "enabled-runtime", "static", "indirect"))
+ if (STR_IN_SET(s, "enabled", "enabled-runtime", "static", "indirect", "generated"))
enabled = true;
if (!arg_quiet)
@@ -5826,7 +5827,7 @@ static int unit_is_enabled(int argc, char *argv[], void *userdata) {
}
}
- return !enabled;
+ return enabled ? EXIT_SUCCESS : EXIT_FAILURE;
}
static int is_system_running(int argc, char *argv[], void *userdata) {