summaryrefslogtreecommitdiff
path: root/lib/chef/platform/service_helpers.rb
diff options
context:
space:
mode:
authorLamont Granquist <lamont@scriptkiddie.org>2014-10-24 10:45:43 -0700
committerLamont Granquist <lamont@scriptkiddie.org>2014-10-24 10:45:43 -0700
commit97aaf5bbcdfd0810722b123bdc67e883a7ca8077 (patch)
tree25663bf1d4f53664b96844251091b51273ad84c7 /lib/chef/platform/service_helpers.rb
parentcb1bcb1f08816f551f96e713624718f58da3c9b3 (diff)
downloadchef-97aaf5bbcdfd0810722b123bdc67e883a7ca8077.tar.gz
Chef-12 RC Provider Resolver
makes resource and provider class resolution more dynamic. begins deprecation of Chef::Platform static mapping.
Diffstat (limited to 'lib/chef/platform/service_helpers.rb')
-rw-r--r--lib/chef/platform/service_helpers.rb113
1 files changed, 113 insertions, 0 deletions
diff --git a/lib/chef/platform/service_helpers.rb b/lib/chef/platform/service_helpers.rb
new file mode 100644
index 0000000000..440391843e
--- /dev/null
+++ b/lib/chef/platform/service_helpers.rb
@@ -0,0 +1,113 @@
+#
+# Author:: Lamont Granquist (<lamont@chef.io>)
+# Copyright:: Copyright (c) 2014 Chef Software, Inc.
+# License:: Apache License, Version 2.0
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+# XXX: mixing shellout into a mixin into classes has to be code smell
+require 'chef/mixin/shell_out'
+
+class Chef
+ class Platform
+ class ServiceHelpers
+ class << self
+
+ include Chef::Mixin::ShellOut
+
+ # This helper is mostly used to sort out the mess of different
+ # linux mechanisms that can be used to start services. It does
+ # not necessarily need to linux-specific, but currently all our
+ # other service providers are narrowly platform-specific with no
+ # alternatives.
+ def service_resource_providers
+ service_resource_providers = []
+
+ if ::File.exist?("/usr/sbin/update-rc.d")
+ service_resource_providers << :debian
+ end
+
+ if ::File.exist?("/usr/sbin/invoke-rc.d")
+ service_resource_providers << :invokercd
+ end
+
+ if ::File.exist?("/sbin/insserv")
+ service_resource_providers << :insserv
+ end
+
+ # debian >= 6.0 has /etc/init but does not have upstart
+ if ::File.exist?("/etc/init") && ::File.exist?("/sbin/start")
+ service_resource_providers << :upstart
+ end
+
+ if ::File.exist?("/sbin/chkconfig")
+ service_resource_providers << :redhat
+ end
+
+ if ::File.exist?("/bin/systemctl")
+ # FIXME: look for systemd as init provider
+ service_resource_providers << :systemd
+ end
+
+ service_resource_providers
+ end
+
+ def config_for_service(service_name)
+ configs = []
+
+ if ::File.exist?("/etc/init.d/#{service_name}")
+ configs << :initd
+ end
+
+ if ::File.exist?("/etc/init/#{service_name}.conf")
+ configs << :upstart
+ end
+
+ if ::File.exist?("/etc/xinetd.d/#{service_name}")
+ configs << :xinetd
+ end
+
+ if ::File.exist?("/etc/rc.d/#{service_name}")
+ configs << :etc_rcd
+ end
+
+ if ::File.exist?("/usr/local/etc/rc.d/#{service_name}")
+ configs << :usr_local_etc_rcd
+ end
+
+ if ::File.exist?("/bin/systemctl") && platform_has_systemd_unit?(service_name)
+ configs << :systemd
+ end
+
+ configs
+ end
+
+ private
+
+ def extract_systemd_services(output)
+ # first line finds e.g. "sshd.service"
+ services = output.lines.split.map { |l| l.split[0] }
+ # this splits off the suffix after the last dot to return "sshd"
+ services += services.map { |s| s.sub(/(.*)\..*/, '\1') }
+ end
+
+ def platform_has_systemd_unit?(service_name)
+ services = extract_systemd_services(shell_out!("systemctl --all").stdout) +
+ extract_systemd_services(shell_out!("systemctl --list-unit-files").stdout)
+ services.include?(service_name)
+ end
+ end
+ end
+ end
+end