From 0ec0deaa30d0e68430f03fa6f32affa576481d18 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Thu, 8 Oct 2015 22:31:56 +0200 Subject: install: follow unit file symlinks in /usr, but not /etc when looking for [Install] data Some distributions use alias unit files via symlinks in /usr to cover for legacy service names. With this change we'll allow "systemctl enable" on such aliases. Previously, our rule was that symlinks are user configuration that "systemctl enable" + "systemctl disable" creates and removes, while unit files is where the instructions to do so are store. As a result of the rule we'd never read install information through symlinks, since that would mix enablement state with installation instructions. Now, the new rule is that only symlinks inside of /etc are configuration. Unit files, and symlinks in /usr are now valid for installation instructions. This patch is quite a rework of the whole install logic, and makes the following addional changes: - Adds a complete test "test-instal-root" that tests the install logic pretty comprehensively. - Never uses canonicalize_file_name(), because that's incompatible with operation relative to a specific root directory. - unit_file_get_state() is reworked to return a proper error, and returns the state in a call-by-ref parameter. This cleans up confusion between the enum type and errno-like errors. - The new logic puts a limit on how long to follow unit file symlinks: it will do so only for 64 steps at max. - The InstallContext object's fields are renamed to will_process and has_processed (will_install and has_installed) since they are also used for deinstallation and all kinds of other operations. - The root directory is always verified before use. - install.c is reordered to place the exported functions together. - Stricter rules are followed when traversing symlinks: the unit suffix must say identical, and it's not allowed to link between regular units and templated units. - Various modernizations - The "invalid" unit file state has been renamed to "bad", in order to avoid confusion between UNIT_FILE_INVALID and _UNIT_FILE_STATE_INVALID. Given that the state should normally not be seen and is not documented this should not be a problematic change. The new name is now documented however. Fixes #1375, #1718, #1706 --- man/systemctl.xml | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) (limited to 'man/systemctl.xml') diff --git a/man/systemctl.xml b/man/systemctl.xml index 173c463d12..1ce6a7b18d 100644 --- a/man/systemctl.xml +++ b/man/systemctl.xml @@ -961,10 +961,11 @@ kobject-uevent 1 systemd-udevd-kernel.socket systemd-udevd.service list-unit-files PATTERN... - List installed unit files. If one or more - PATTERNs are specified, only - units whose filename (just the last component of the path) - matches one of them are shown. + List installed unit files and their enablement state + (as reported by is-enabled). If one or + more PATTERNs are specified, + only units whose filename (just the last component of the + path) matches one of them are shown. @@ -1171,6 +1172,11 @@ kobject-uevent 1 systemd-udevd-kernel.socket systemd-udevd.service The unit file is not enabled. > 0 + + bad + Unit file is invalid or another error occured. Note that is-enabled will not actually return this state, but print an error message instead. However the unit file listing printed by list-unit-files might show it. + > 0 + -- cgit v1.2.3-54-g00ecf