|
|
1abbee |
From c9a4b1688552a23867d3d9db18620501d57d33da Mon Sep 17 00:00:00 2001
|
|
|
1abbee |
From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
|
|
|
1abbee |
Date: Sat, 16 Apr 2016 19:31:53 -0400
|
|
|
1abbee |
Subject: [PATCH] systemctl/core: ignore masked units in preset-all
|
|
|
1abbee |
|
|
|
1abbee |
With any masked unit that would that would be enabled by presets, we'd get:
|
|
|
1abbee |
|
|
|
1abbee |
test@rawhide $ sudo systemctl preset-all
|
|
|
1abbee |
Failed to execute operation: Unit file is masked.
|
|
|
1abbee |
|
|
|
1abbee |
test@rawhide $ sudo systemctl --root=/ preset-all
|
|
|
1abbee |
Operation failed: Cannot send after transport endpoint shutdown
|
|
|
1abbee |
|
|
|
1abbee |
Simply ignore those units:
|
|
|
1abbee |
|
|
|
1abbee |
test@rawhide $ sudo systemctl preset-all
|
|
|
1abbee |
Unit xxx.service is masked, ignoring.
|
|
|
1abbee |
|
|
|
1abbee |
Cherry-picked from: 9a0a413a195a21888cf926be5595d0efc1eef0fe
|
|
|
1abbee |
Related: #1375097
|
|
|
1abbee |
---
|
|
|
1abbee |
src/core/dbus-manager.c | 12 +++++++-----
|
|
|
1abbee |
src/libsystemd/sd-bus/bus-util.c | 10 ++++++++--
|
|
|
1abbee |
src/shared/install.c | 4 ++++
|
|
|
1abbee |
src/shared/install.h | 5 +++++
|
|
|
1abbee |
src/systemctl/systemctl.c | 20 ++++++++++++++------
|
|
|
1abbee |
5 files changed, 38 insertions(+), 13 deletions(-)
|
|
|
1abbee |
|
|
|
1abbee |
diff --git a/src/core/dbus-manager.c b/src/core/dbus-manager.c
|
|
|
1abbee |
index 8d3758a..c2067c0 100644
|
|
|
1abbee |
--- a/src/core/dbus-manager.c
|
|
|
1abbee |
+++ b/src/core/dbus-manager.c
|
|
|
1abbee |
@@ -1598,11 +1598,13 @@ static int reply_unit_file_changes_and_free(
|
|
|
1abbee |
unsigned i;
|
|
|
1abbee |
int r;
|
|
|
1abbee |
|
|
|
1abbee |
- if (n_changes > 0) {
|
|
|
1abbee |
- r = bus_foreach_bus(m, NULL, send_unit_files_changed, NULL);
|
|
|
1abbee |
- if (r < 0)
|
|
|
1abbee |
- log_debug_errno(r, "Failed to send UnitFilesChanged signal: %m");
|
|
|
1abbee |
- }
|
|
|
1abbee |
+ for (i = 0; i < n_changes; i++)
|
|
|
1abbee |
+ if (unit_file_change_is_modification(changes[i].type)) {
|
|
|
1abbee |
+ r = bus_foreach_bus(m, NULL, send_unit_files_changed, NULL);
|
|
|
1abbee |
+ if (r < 0)
|
|
|
1abbee |
+ log_debug_errno(r, "Failed to send UnitFilesChanged signal: %m");
|
|
|
1abbee |
+ break;
|
|
|
1abbee |
+ }
|
|
|
1abbee |
|
|
|
1abbee |
r = sd_bus_message_new_method_return(message, &reply);
|
|
|
1abbee |
if (r < 0)
|
|
|
1abbee |
diff --git a/src/libsystemd/sd-bus/bus-util.c b/src/libsystemd/sd-bus/bus-util.c
|
|
|
1abbee |
index 9d70798..75d0370 100644
|
|
|
1abbee |
--- a/src/libsystemd/sd-bus/bus-util.c
|
|
|
1abbee |
+++ b/src/libsystemd/sd-bus/bus-util.c
|
|
|
1abbee |
@@ -1893,11 +1893,17 @@ int bus_deserialize_and_dump_unit_file_changes(sd_bus_message *m, bool quiet, Un
|
|
|
1abbee |
if (!quiet) {
|
|
|
1abbee |
if (streq(type, "symlink"))
|
|
|
1abbee |
log_info("Created symlink from %s to %s.", path, source);
|
|
|
1abbee |
- else
|
|
|
1abbee |
+ else if (streq(type, "unlink"))
|
|
|
1abbee |
log_info("Removed symlink %s.", path);
|
|
|
1abbee |
+ else if (streq(type, "masked"))
|
|
|
1abbee |
+ log_info("Unit %s is masked, ignoring.", path);
|
|
|
1abbee |
+ else
|
|
|
1abbee |
+ log_notice("Manager reported unknown change type \"%s\" for %s.", type, path);
|
|
|
1abbee |
}
|
|
|
1abbee |
|
|
|
1abbee |
- r = unit_file_changes_add(changes, n_changes, streq(type, "symlink") ? UNIT_FILE_SYMLINK : UNIT_FILE_UNLINK, path, source);
|
|
|
1abbee |
+ r = unit_file_changes_add(changes, n_changes,
|
|
|
1abbee |
+ unit_file_change_type_from_string(type),
|
|
|
1abbee |
+ path, source);
|
|
|
1abbee |
if (r < 0)
|
|
|
1abbee |
return r;
|
|
|
1abbee |
}
|
|
|
1abbee |
diff --git a/src/shared/install.c b/src/shared/install.c
|
|
|
1abbee |
index ab86cd1..62da52d 100644
|
|
|
1abbee |
--- a/src/shared/install.c
|
|
|
1abbee |
+++ b/src/shared/install.c
|
|
|
1abbee |
@@ -2402,6 +2402,9 @@ int unit_file_preset_all(
|
|
|
1abbee |
continue;
|
|
|
1abbee |
|
|
|
1abbee |
r = preset_prepare_one(scope, &plus, &minus, &paths, root_dir, mode, de->d_name);
|
|
|
1abbee |
+ if (r == -ESHUTDOWN)
|
|
|
1abbee |
+ r = unit_file_changes_add(changes, n_changes,
|
|
|
1abbee |
+ UNIT_FILE_IS_MASKED, de->d_name, NULL);
|
|
|
1abbee |
if (r < 0)
|
|
|
1abbee |
return r;
|
|
|
1abbee |
}
|
|
|
1abbee |
@@ -2535,6 +2538,7 @@ DEFINE_STRING_TABLE_LOOKUP(unit_file_state, UnitFileState);
|
|
|
1abbee |
static const char* const unit_file_change_type_table[_UNIT_FILE_CHANGE_TYPE_MAX] = {
|
|
|
1abbee |
[UNIT_FILE_SYMLINK] = "symlink",
|
|
|
1abbee |
[UNIT_FILE_UNLINK] = "unlink",
|
|
|
1abbee |
+ [UNIT_FILE_IS_MASKED] = "masked",
|
|
|
1abbee |
};
|
|
|
1abbee |
|
|
|
1abbee |
DEFINE_STRING_TABLE_LOOKUP(unit_file_change_type, UnitFileChangeType);
|
|
|
1abbee |
diff --git a/src/shared/install.h b/src/shared/install.h
|
|
|
1abbee |
index 87a40b6..f0e3666 100644
|
|
|
1abbee |
--- a/src/shared/install.h
|
|
|
1abbee |
+++ b/src/shared/install.h
|
|
|
1abbee |
@@ -60,10 +60,15 @@ typedef enum UnitFilePresetMode {
|
|
|
1abbee |
typedef enum UnitFileChangeType {
|
|
|
1abbee |
UNIT_FILE_SYMLINK,
|
|
|
1abbee |
UNIT_FILE_UNLINK,
|
|
|
1abbee |
+ UNIT_FILE_IS_MASKED,
|
|
|
1abbee |
_UNIT_FILE_CHANGE_TYPE_MAX,
|
|
|
1abbee |
_UNIT_FILE_CHANGE_TYPE_INVALID = -1
|
|
|
1abbee |
} UnitFileChangeType;
|
|
|
1abbee |
|
|
|
1abbee |
+static inline bool unit_file_change_is_modification(UnitFileChangeType type) {
|
|
|
1abbee |
+ return IN_SET(type, UNIT_FILE_SYMLINK, UNIT_FILE_UNLINK);
|
|
|
1abbee |
+}
|
|
|
1abbee |
+
|
|
|
1abbee |
typedef struct UnitFileChange {
|
|
|
1abbee |
UnitFileChangeType type;
|
|
|
1abbee |
char *path;
|
|
|
1abbee |
diff --git a/src/systemctl/systemctl.c b/src/systemctl/systemctl.c
|
|
|
1abbee |
index e4b404a..a688d69 100644
|
|
|
1abbee |
--- a/src/systemctl/systemctl.c
|
|
|
1abbee |
+++ b/src/systemctl/systemctl.c
|
|
|
1abbee |
@@ -1944,12 +1944,20 @@ static void dump_unit_file_changes(const UnitFileChange *changes, unsigned n_cha
|
|
|
1abbee |
|
|
|
1abbee |
assert(changes || n_changes == 0);
|
|
|
1abbee |
|
|
|
1abbee |
- for (i = 0; i < n_changes; i++) {
|
|
|
1abbee |
- if (changes[i].type == UNIT_FILE_SYMLINK)
|
|
|
1abbee |
- log_info("Created symlink from %s to %s.", changes[i].path, changes[i].source);
|
|
|
1abbee |
- else
|
|
|
1abbee |
- log_info("Removed symlink %s.", changes[i].path);
|
|
|
1abbee |
- }
|
|
|
1abbee |
+ for (i = 0; i < n_changes; i++)
|
|
|
1abbee |
+ switch(changes[i].type) {
|
|
|
1abbee |
+ case UNIT_FILE_SYMLINK:
|
|
|
1abbee |
+ log_info("Created symlink %s, pointing to %s.", changes[i].path, changes[i].source);
|
|
|
1abbee |
+ break;
|
|
|
1abbee |
+ case UNIT_FILE_UNLINK:
|
|
|
1abbee |
+ log_info("Removed %s.", changes[i].path);
|
|
|
1abbee |
+ break;
|
|
|
1abbee |
+ case UNIT_FILE_IS_MASKED:
|
|
|
1abbee |
+ log_info("Unit %s is masked, ignoring.", changes[i].path);
|
|
|
1abbee |
+ break;
|
|
|
1abbee |
+ default:
|
|
|
1abbee |
+ assert_not_reached("bad change type");
|
|
|
1abbee |
+ }
|
|
|
1abbee |
}
|
|
|
1abbee |
|
|
|
1abbee |
static int set_default(sd_bus *bus, char **args) {
|