diff options
author | Tim Smith <tsmith@chef.io> | 2020-03-09 12:40:30 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-03-09 12:40:30 -0700 |
commit | 003e798e73ed645da1ee60c1a3aa6c9b79d935ba (patch) | |
tree | 9c577fec5b526a5553e53fbbf84e5c325159e475 | |
parent | 9a8c4ddc1f18cb1091d3ea6c417c9e621d0ab75f (diff) | |
parent | 54f854ba098769c98d1f2868adb0dfcc4eabcdbf (diff) | |
download | chef-003e798e73ed645da1ee60c1a3aa6c9b79d935ba.tar.gz |
Merge pull request #9453 from chef/remove_legacy_updaterc
Remove support in debian service init for old update-rc
-rw-r--r-- | lib/chef/provider/service/debian.rb | 62 | ||||
-rw-r--r-- | spec/unit/provider/service/debian_service_spec.rb | 174 |
2 files changed, 41 insertions, 195 deletions
diff --git a/lib/chef/provider/service/debian.rb b/lib/chef/provider/service/debian.rb index 76628f92ca..e6987db305 100644 --- a/lib/chef/provider/service/debian.rb +++ b/lib/chef/provider/service/debian.rb @@ -1,6 +1,6 @@ # # Author:: AJ Christensen (<aj@hjksolutions.com>) -# Copyright:: Copyright 2008-2018, Chef Software Inc. +# Copyright:: Copyright 2008-2020, Chef Software Inc. # License:: Apache License, Version 2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); @@ -173,38 +173,13 @@ class Chef end shell_out!("/usr/sbin/update-rc.d -f #{new_resource.service_name} remove") - - # Use legacy syntax if update-rc.d supports it for backward compatibility. - if use_legacy_update_rc_d? - # If no priority was given assume 20 (update-rc.d default). - start_priority = new_resource.priority.is_a?(Integer) ? new_resource.priority : 20 - # Stop processes in reverse order of start using '100 - start_priority'. - stop_priority = 100 - start_priority - - shell_out!("/usr/sbin/update-rc.d -f #{new_resource.service_name} stop #{stop_priority} 2 3 4 5 .") - else - shell_out!("/usr/sbin/update-rc.d #{new_resource.service_name} defaults") - shell_out!("/usr/sbin/update-rc.d #{new_resource.service_name} disable") - end + shell_out!("/usr/sbin/update-rc.d #{new_resource.service_name} defaults") + shell_out!("/usr/sbin/update-rc.d #{new_resource.service_name} disable") end def set_priority shell_out!("/usr/sbin/update-rc.d -f #{new_resource.service_name} remove") - # Use legacy syntax if update-rc.d supports it for backward compatibility. - if use_legacy_update_rc_d? - args = "" - new_resource.priority.each do |level, o| - action = o[0] - priority = o[1] - args += "#{action} #{priority} #{level} . " - end - shell_out!("/usr/sbin/update-rc.d #{new_resource.service_name} #{args}") - return - end - - # Use modern syntax, ignoring priorities as update-rc.d does not support it. - # # Reset priorities to default values before applying customizations. This way # the final state will always be consistent, regardless if all runlevels were # provided. @@ -215,37 +190,6 @@ class Chef shell_out!("/usr/sbin/update-rc.d #{new_resource.service_name} #{disable_or_enable} #{level}") end end - - # Ancient Debian releases used run levels and priorities to manage dependencies ordering. - # Old syntax no longer works and new syntax does not support priorities. If Chef detects - # ancient update-rc.d it will prefer legacy syntax so priorities can be set correctly in - # case the host is in fact running SysVinit. - # - # Additional context: https://lists.debian.org/debian-devel/2013/05/msg01109.html - def use_legacy_update_rc_d? - @sysv_rc_version ||= shell_out!("dpkg-query -W --showformat '${Version}' sysv-rc").stdout.strip - - # sysv-rc is not installed therefore we're on modern Debian and legacy syntax does not work - if @sysv_rc_version.empty? - logger.trace("sysv-rc package is not installed. update-rc.d will use modern syntax") - return false - end - - # sysv-rc is installed and update-rc.d is old enough to support legacy syntax and features - if @sysv_rc_version.to_f < 2.88 - logger.trace("sysv-rc #{@sysv_rc_version} detected. update-rc.d will use legacy syntax") - return true - end - - # sysv-rc 2.88dsf-42 drops the legacy syntax - if @sysv_rc_version.to_f == 2.88 && @sysv_rc_version[8..9].to_i < 42 - logger.trace("sysv-rc #{@sysv_rc_version} detected. update-rc.d will use legacy syntax") - return true - end - - # default to modern syntax - false - end end end end diff --git a/spec/unit/provider/service/debian_service_spec.rb b/spec/unit/provider/service/debian_service_spec.rb index a69909107c..60c20118bc 100644 --- a/spec/unit/provider/service/debian_service_spec.rb +++ b/spec/unit/provider/service/debian_service_spec.rb @@ -1,6 +1,6 @@ # # Author:: AJ Christensen (<aj@hjksolutions.com>) -# Copyright:: Copyright 2008-2016, HJK Solutions, LLC +# Copyright:: Copyright 2008-2020, Chef Software, Inc. # License:: Apache License, Version 2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); @@ -211,34 +211,14 @@ describe Chef::Provider::Service::Debian do @new_resource.priority(2 => [:start, 20], 3 => [:stop, 55]) end - context "when modern update-rc.d is detected" do - before do - expect(@provider).to receive(:use_legacy_update_rc_d?).and_return(false) - end - - it "calls update-rc.d remove => defaults => enable|disable <runlevel>" do - expect_commands(@provider, [ - "/usr/sbin/update-rc.d -f #{service_name} remove", - "/usr/sbin/update-rc.d #{service_name} defaults", - "/usr/sbin/update-rc.d #{service_name} enable 2", - "/usr/sbin/update-rc.d #{service_name} disable 3", - ]) - @provider.enable_service - end - end - - context "when legacy update-rc.d is detected" do - before do - expect(@provider).to receive(:use_legacy_update_rc_d?).and_return(true) - end - - it "calls update-rc.d remove => start|stop <priority> <levels> ." do - expect_commands(@provider, [ - "/usr/sbin/update-rc.d -f #{service_name} remove", - "/usr/sbin/update-rc.d #{service_name} start 20 2 . stop 55 3 . ", - ]) - @provider.disable_service - end + it "calls update-rc.d remove => defaults => enable|disable <runlevel>" do + expect_commands(@provider, [ + "/usr/sbin/update-rc.d -f #{service_name} remove", + "/usr/sbin/update-rc.d #{service_name} defaults", + "/usr/sbin/update-rc.d #{service_name} enable 2", + "/usr/sbin/update-rc.d #{service_name} disable 3", + ]) + @provider.enable_service end end end @@ -246,124 +226,46 @@ describe Chef::Provider::Service::Debian do describe "disable_service" do let(:service_name) { @new_resource.service_name } - context "when modern update-rc.d is detected" do - before do - expect(@provider).to receive(:use_legacy_update_rc_d?).and_return(false) - end - - context "when the service doesn't set a priority" do - it "calls update-rc.d remove => defaults => disable" do - expect_commands(@provider, [ - "/usr/sbin/update-rc.d -f #{service_name} remove", - "/usr/sbin/update-rc.d #{service_name} defaults", - "/usr/sbin/update-rc.d #{service_name} disable", - ]) - @provider.disable_service - end - end - - context "when the service sets a simple priority 75" do - before do - @new_resource.priority(75) - end - - it "ignores priority and calls update-rc.d remove => defaults => disable" do - expect_commands(@provider, [ - "/usr/sbin/update-rc.d -f #{service_name} remove", - "/usr/sbin/update-rc.d #{service_name} defaults", - "/usr/sbin/update-rc.d #{service_name} disable", - ]) - @provider.disable_service - end - end - - context "when the service sets complex priorities using Hash" do - before do - @new_resource.priority(2 => [:start, 20], 3 => [:stop, 55]) - end - - it "ignores priority and calls update-rc.d remove => defaults => enable|disable <runlevel>" do - expect_commands(@provider, [ - "/usr/sbin/update-rc.d -f #{service_name} remove", - "/usr/sbin/update-rc.d #{service_name} defaults", - "/usr/sbin/update-rc.d #{service_name} enable 2", - "/usr/sbin/update-rc.d #{service_name} disable 3", - ]) - @provider.disable_service - end + context "when the service doesn't set a priority" do + it "calls update-rc.d remove => defaults => disable" do + expect_commands(@provider, [ + "/usr/sbin/update-rc.d -f #{service_name} remove", + "/usr/sbin/update-rc.d #{service_name} defaults", + "/usr/sbin/update-rc.d #{service_name} disable", + ]) + @provider.disable_service end end - context "when legacy update-rc.d is detected" do + context "when the service sets a simple priority 75" do before do - expect(@provider).to receive(:use_legacy_update_rc_d?).and_return(true) + @new_resource.priority(75) end - context "when the service doesn't set a priority" do - it "assumes default priority 20 and calls update-rc.d remove => stop 80 2 3 4 5 ." do - expect_commands(@provider, [ - "/usr/sbin/update-rc.d -f #{service_name} remove", - "/usr/sbin/update-rc.d -f #{service_name} stop 80 2 3 4 5 .", - ]) - @provider.disable_service - end + it "ignores priority and calls update-rc.d remove => defaults => disable" do + expect_commands(@provider, [ + "/usr/sbin/update-rc.d -f #{service_name} remove", + "/usr/sbin/update-rc.d #{service_name} defaults", + "/usr/sbin/update-rc.d #{service_name} disable", + ]) + @provider.disable_service end + end - context "when the service sets a simple priority 75" do - before do - @new_resource.priority(75) - end - - it "reverses priority and calls update-rc.d remove => stop 25 2 3 4 5 ." do - expect_commands(@provider, [ - "/usr/sbin/update-rc.d -f #{service_name} remove", - "/usr/sbin/update-rc.d -f #{service_name} stop #{100 - @new_resource.priority} 2 3 4 5 .", - ]) - @provider.disable_service - end + context "when the service sets complex priorities using Hash" do + before do + @new_resource.priority(2 => [:start, 20], 3 => [:stop, 55]) end - context "when the service sets complex priorities using Hash" do - before do - @new_resource.priority(2 => [:start, 20], 3 => [:stop, 55]) - end - - it "calls update-rc.d remove => start|stop <priority> <levels> ." do - expect_commands(@provider, [ - "/usr/sbin/update-rc.d -f #{service_name} remove", - "/usr/sbin/update-rc.d #{service_name} start 20 2 . stop 55 3 . ", - ]) - @provider.disable_service - end + it "ignores priority and calls update-rc.d remove => defaults => enable|disable <runlevel>" do + expect_commands(@provider, [ + "/usr/sbin/update-rc.d -f #{service_name} remove", + "/usr/sbin/update-rc.d #{service_name} defaults", + "/usr/sbin/update-rc.d #{service_name} enable 2", + "/usr/sbin/update-rc.d #{service_name} disable 3", + ]) + @provider.disable_service end end end - - describe "use_legacy_update_rc_d?" do - let(:dpkg_query_cmd) { "dpkg-query -W --showformat '${Version}' sysv-rc" } - - it "is true when svsv-rc package version < 2.88 is installed" do - shellout_result = double(stdout: "2.86.ds1-34\n") - expect(@provider).to receive(:shell_out!).with(dpkg_query_cmd).and_return(shellout_result) - expect(@provider.use_legacy_update_rc_d?).to eq(true) - end - - it "is true when sysv-rc is 2.88 and patch level < ('dsf-')42" do - shellout_result = double(stdout: "2.88.dsf-41\n") - expect(@provider).to receive(:shell_out!).with(dpkg_query_cmd).and_return(shellout_result) - expect(@provider.use_legacy_update_rc_d?).to eq(true) - end - - it "is false when sysv-rc package version >= 2.88 is installed" do - shellout_result = double(stdout: "2.88dsf-59.9\n") - expect(@provider).to receive(:shell_out!).with(dpkg_query_cmd).and_return(shellout_result) - expect(@provider.use_legacy_update_rc_d?).to eq(false) - end - - it "is false when sysv-rc package is not installed" do - shellout_result = double(stdout: "\n") - expect(@provider).to receive(:shell_out!).with(dpkg_query_cmd).and_return(shellout_result) - expect(@provider.use_legacy_update_rc_d?).to eq(false) - end - end end |