From 42ae062bd55b9d39324e75573a749b68337f0f1d Mon Sep 17 00:00:00 2001 From: Martin Whitaker Date: Tue, 15 Sep 2020 09:19:23 +0100 Subject: Support systemd sockets and timers in service manipulation routines. --- perl-install/services.pm | 31 +++++++++++++++++++++---------- 1 file changed, 21 insertions(+), 10 deletions(-) (limited to 'perl-install/services.pm') diff --git a/perl-install/services.pm b/perl-install/services.pm index 1aab437a1..95e068770 100644 --- a/perl-install/services.pm +++ b/perl-install/services.pm @@ -13,6 +13,17 @@ use run_program; use File::Basename; +sub _unit_name { + my ($service) = @_; + return $service if $service =~ /\.(service|socket|timer)$/; + "$service.service"; +} + +sub _base_name { + my ($service) = @_; + $service =~ s/\.(service|socket|timer)$//; +} + sub description { my %services = ( acpid => N_("Listen and dispatch ACPI events from the kernel"), @@ -125,11 +136,11 @@ xfs => N_("Starts the X Font Server."), xinetd => N_("Starts other deamons on demand."), ); my ($name) = @_; - my $s = $services{$name}; + my $s = $services{_base_name($name)}; if ($s) { $s = translate($s); } else { - my $file = "$::prefix/usr/lib/systemd/system/$name.service"; + my $file = "$::prefix/usr/lib/systemd/system/" . _unit_name($name); if (-e $file) { $s = cat_($file); $s = $s =~ /^Description=(.*)/mg ? $1 : ''; @@ -297,13 +308,12 @@ sub _set_service { if (member($service, @xinetd_services)) { run_program::rooted($::prefix, "chkconfig", "--no-reload", $enable ? "--add" : "--del", $service); # Probably still a bug here as xinet support in chkconfig shells out to /sbin/service.... } elsif (running_systemd() || has_systemd()) { + my $unit_name = _unit_name($service); # systemctl rejects any symlinked units. You have to enabled the real file - if (-l "/lib/systemd/system/$service.service") { - $service = basename(readlink("/lib/systemd/system/$service.service")); - } else { - $service = $service . ".service"; + if (-l "/lib/systemd/system/$unit_name") { + $unit_name = basename(readlink("/lib/systemd/system/$unit_name")); } - run_program::rooted($::prefix, "/bin/systemctl", $enable ? "enable" : "disable", "--no-reload", $service); + run_program::rooted($::prefix, "/bin/systemctl", $enable ? "enable" : "disable", "--no-reload", $unit_name); } else { my $script = "/etc/rc.d/init.d/$service"; run_program::rooted($::prefix, "chkconfig", "--no-reload", $enable ? "--add" : "--del", $service); @@ -317,7 +327,7 @@ sub _set_service { sub _run_action { my ($service, $action) = @_; if (running_systemd()) { - run_program::rooted($::prefix, '/bin/systemctl', '--no-block', $action, "$service.service"); + run_program::rooted($::prefix, '/bin/systemctl', '--no-block', $action, _unit_name($service)); } else { run_program::rooted($::prefix, "/etc/rc.d/init.d/$service", $action); } @@ -487,8 +497,9 @@ sub services() { sub systemd_unit_exists { my ($name) = @_; + my $unit_name = _unit_name($name); # we test with -l as symlinks are not valid when the system is chrooted: - -e "$::prefix/lib/systemd/system/$name.service" or -l "$::prefix/lib/systemd/system/$name.service"; + -e "$::prefix/lib/systemd/system/$unit_name" or -l "$::prefix/lib/systemd/system/$unit_name"; } sub service_exists { @@ -536,7 +547,7 @@ sub is_service_running ($) { # Exit silently if the service is not installed service_exists($service) or return 1; if (running_systemd()) { - run_program::rooted($::prefix, '/bin/systemctl', '--quiet', 'is-active', "$service.service"); + run_program::rooted($::prefix, '/bin/systemctl', '--quiet', 'is-active', _unit_name($service)); } else { run_program::rooted($::prefix, '/sbin/service', $service, 'status'); } -- cgit v1.2.1