From: Mike Yuan Date: Wed, 7 Feb 2024 14:15:05 +0000 (+0800) Subject: systemctl: support disable/mask --now with unit template X-Git-Tag: v256-rc1~918^2~1 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1baa0415ae612266c77016567390a8232a60d9db;p=thirdparty%2Fsystemd.git systemctl: support disable/mask --now with unit template Closes #15620 Replaces #28240 --- diff --git a/src/systemctl/systemctl-enable.c b/src/systemctl/systemctl-enable.c index 7d9b7c794a1..4f5e1f119e3 100644 --- a/src/systemctl/systemctl-enable.c +++ b/src/systemctl/systemctl-enable.c @@ -313,24 +313,45 @@ int verb_enable(int argc, char *argv[], void *userdata) { } if (arg_now && STR_IN_SET(argv[0], "enable", "disable", "mask")) { + _cleanup_strv_free_ char **new_args = NULL; sd_bus *bus; - size_t len, i; r = acquire_bus(BUS_MANAGER, &bus); if (r < 0) return r; - len = strv_length(names); - { - char *new_args[len + 2]; + if (strv_extend(&new_args, streq(verb, "enable") ? "start" : "stop") < 0) + return log_oom(); - new_args[0] = (char*) (streq(argv[0], "enable") ? "start" : "stop"); - for (i = 0; i < len; i++) - new_args[i + 1] = basename(names[i]); - new_args[i + 1] = NULL; + STRV_FOREACH(name, names) { + if (streq(verb, "enable")) { + char *fn; + + /* 'enable' accept path to unit files, so extract it first. Don't try to + * glob them though, as starting globbed unit seldomly makes sense and + * actually changes the semantic (we're operating on DefaultInstance= + * when enabling). */ + + r = path_extract_filename(*name, &fn); + if (r < 0) + return log_error_errno(r, "Failed to extract filename of '%s': %m", *name); + + r = strv_consume(&new_args, fn); + } else if (unit_name_is_valid(*name, UNIT_NAME_TEMPLATE)) { + char *globbed; - r = verb_start(len + 1, new_args, userdata); + r = unit_name_replace_instance_full(*name, "*", /* accept_glob = */ true, &globbed); + if (r < 0) + return log_error_errno(r, "Failed to glob unit name '%s': %m", *name); + + r = strv_consume(&new_args, globbed); + } else + r = strv_extend(&new_args, *name); + if (r < 0) + return log_oom(); } + + return verb_start(strv_length(new_args), new_args, userdata); } return 0; diff --git a/test/units/testsuite-26.sh b/test/units/testsuite-26.sh index 9f672c738a3..910e7531b1e 100755 --- a/test/units/testsuite-26.sh +++ b/test/units/testsuite-26.sh @@ -207,6 +207,24 @@ test_mask_unmask_revert() { test_mask_unmask_revert test_mask_unmask_revert --root=/ +# disable --now with template unit +cat >/run/systemd/system/test-disable@.service <