diff options
author | Serdar Sutay <serdar@opscode.com> | 2014-10-21 11:14:19 -0700 |
---|---|---|
committer | Serdar Sutay <serdar@opscode.com> | 2014-10-21 11:14:19 -0700 |
commit | eeb45770585a50d78e412682b0ae44524e29e727 (patch) | |
tree | c1d2e00403722fa111e6bd01d2f56bc0ccabe790 /lib | |
parent | ccb220a72ba07a9b2cbabba25f88edb7e7064d7b (diff) | |
parent | 09fbf4a6efacad4c635531b005dbc5832e8c03c8 (diff) | |
download | chef-eeb45770585a50d78e412682b0ae44524e29e727.tar.gz |
Merge pull request #2028 from ClogenyTechnologies/kd/aix-service
aix service provider
Diffstat (limited to 'lib')
-rw-r--r-- | lib/chef/platform/provider_mapping.rb | 3 | ||||
-rw-r--r-- | lib/chef/provider/service/aix.rb | 126 | ||||
-rw-r--r-- | lib/chef/provider/service/aixinit.rb | 117 | ||||
-rw-r--r-- | lib/chef/providers.rb | 2 |
4 files changed, 247 insertions, 1 deletions
diff --git a/lib/chef/platform/provider_mapping.rb b/lib/chef/platform/provider_mapping.rb index 9e15ea5658..e6d948276c 100644 --- a/lib/chef/platform/provider_mapping.rb +++ b/lib/chef/platform/provider_mapping.rb @@ -394,7 +394,8 @@ class Chef :ifconfig => Chef::Provider::Ifconfig::Aix, :cron => Chef::Provider::Cron::Aix, :package => Chef::Provider::Package::Aix, - :user => Chef::Provider::User::Aix + :user => Chef::Provider::User::Aix, + :service => Chef::Provider::Service::Aix } }, :exherbo => { diff --git a/lib/chef/provider/service/aix.rb b/lib/chef/provider/service/aix.rb new file mode 100644 index 0000000000..6f70f797b9 --- /dev/null +++ b/lib/chef/provider/service/aix.rb @@ -0,0 +1,126 @@ +# +# Author:: kaustubh (<kaustubh@clogeny.com>) +# 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. +# + +require 'chef/provider/service' + +class Chef + class Provider + class Service + class Aix < Chef::Provider::Service + attr_reader :status_load_success + + def initialize(new_resource, run_context) + super + end + + def load_current_resource + @current_resource = Chef::Resource::Service.new(@new_resource.name) + @current_resource.service_name(@new_resource.service_name) + + @status_load_success = true + @priority_success = true + @is_resource_group = false + + determine_current_status! + + @current_resource + end + + def whyrun_supported? + true + end + + def start_service + if @is_resource_group + shell_out!("startsrc -g #{@new_resource.service_name}") + else + shell_out!("startsrc -s #{@new_resource.service_name}") + end + end + + def stop_service + if @is_resource_group + shell_out!("stopsrc -g #{@new_resource.service_name}") + else + shell_out!("stopsrc -s #{@new_resource.service_name}") + end + end + + def restart_service + stop_service + start_service + end + + def reload_service + if @is_resource_group + shell_out!("refresh -g #{@new_resource.service_name}") + else + shell_out!("refresh -s #{@new_resource.service_name}") + end + end + + def shared_resource_requirements + super + requirements.assert(:all_actions) do |a| + a.assertion { @status_load_success } + a.whyrun ["Service status not available. Assuming a prior action would have installed the service.", "Assuming status of not running."] + end + end + + def define_resource_requirements + # FIXME? need reload from service.rb + shared_resource_requirements + end + + protected + def determine_current_status! + Chef::Log.debug "#{@new_resource} using lssrc to check the status " + begin + services = shell_out!("lssrc -a | grep -w #{@new_resource.service_name}").stdout.split("\n") + is_resource_group?(services) + + if services.length == 1 && services[0].split(' ').last == "active" + @current_resource.running true + else + @current_resource.running false + end + Chef::Log.debug "#{@new_resource} running: #{@current_resource.running}" + # ShellOut sometimes throws different types of Exceptions than ShellCommandFailed. + # Temporarily catching different types of exceptions here until we get Shellout fixed. + # TODO: Remove the line before one we get the ShellOut fix. + rescue Mixlib::ShellOut::ShellCommandFailed, SystemCallError + @status_load_success = false + @current_resource.running false + nil + end + end + + def is_resource_group? (services) + if services.length > 1 + Chef::Log.debug("#{@new_resource.service_name} is a group") + @is_resource_group = true + elsif services[0].split(' ')[1] == @new_resource.service_name + Chef::Log.debug("#{@new_resource.service_name} is a group") + @is_resource_group = true + end + end + end + end + end +end + diff --git a/lib/chef/provider/service/aixinit.rb b/lib/chef/provider/service/aixinit.rb new file mode 100644 index 0000000000..ab4b8e5406 --- /dev/null +++ b/lib/chef/provider/service/aixinit.rb @@ -0,0 +1,117 @@ +# +# Author:: kaustubh (<kaustubh@clogeny.com>) +# 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. +# + +require 'chef/provider/service/init' + +class Chef + class Provider + class Service + class AixInit < Chef::Provider::Service::Init + RC_D_SCRIPT_NAME = /\/etc\/rc.d\/rc2.d\/([SK])(\d\d|)/i + + def initialize(new_resource, run_context) + super + @init_command = "/etc/rc.d/init.d/#{@new_resource.service_name}" + end + + def load_current_resource + super + @priority_success = true + @rcd_status = nil + + set_current_resource_attributes + @current_resource + end + + def action_enable + if @new_resource.priority.nil? + priority_ok = true + else + priority_ok = @current_resource.priority == @new_resource.priority + end + if @current_resource.enabled and priority_ok + Chef::Log.debug("#{@new_resource} already enabled - nothing to do") + else + converge_by("enable service #{@new_resource}") do + enable_service + Chef::Log.info("#{@new_resource} enabled") + end + end + load_new_resource_state + @new_resource.enabled(true) + end + + def enable_service + Dir.glob(["/etc/rc.d/rc2.d/[SK][0-9][0-9]#{@new_resource.service_name}", "/etc/rc.d/rc2.d/[SK]#{@new_resource.service_name}"]).each { |f| ::File.delete(f)} + + if @new_resource.priority.is_a? Integer + create_symlink(2, 'S', @new_resource.priority) + + elsif @new_resource.priority.is_a? Hash + @new_resource.priority.each do |level,o| + create_symlink(level,(o[0] == :start ? 'S' : 'K'),o[1]) + end + else + create_symlink(2, 'S', '') + end + end + + def disable_service + Dir.glob(["/etc/rc.d/rc2.d/[SK][0-9][0-9]#{@new_resource.service_name}", "/etc/rc.d/rc2.d/[SK]#{@new_resource.service_name}"]).each { |f| ::File.delete(f) } + + if @new_resource.priority.is_a? Integer + create_symlink(2, 'K',100 - @new_resource.priority) + elsif @new_resource.priority.is_a? Hash + @new_resource.priority.each do |level,o| + create_symlink(level, 'K', 100 - o[1]) if o[0] == :stop + end + else + create_symlink(2, 'K', '') + end + end + + def create_symlink(run_level, status, priority) + ::File.symlink("/etc/rc.d/init.d/#{@new_resource.service_name}", "/etc/rc.d/rc#{run_level}.d/#{status}#{priority}#{@new_resource.service_name}") + end + + def set_current_resource_attributes + # assuming run level 2 for aix + is_enabled = false + files = Dir.glob(["/etc/rc.d/rc2.d/[SK][0-9][0-9]#{@new_resource.service_name}", "/etc/rc.d/rc2.d/[SK]#{@new_resource.service_name}"]) + + priority = {} + + files.each do |file| + if (RC_D_SCRIPT_NAME =~ file) + priority[2] = [($1 == "S" ? :start : :stop), ($2.empty? ? '' : $2.to_i)] + if $1 == "S" + is_enabled = true + end + end + end + + if is_enabled && files.length == 1 + priority = priority[2][1] + end + @current_resource.enabled(is_enabled) + @current_resource.priority(priority) + end + end + end + end +end
\ No newline at end of file diff --git a/lib/chef/providers.rb b/lib/chef/providers.rb index fec00d0e63..bceb1f7106 100644 --- a/lib/chef/providers.rb +++ b/lib/chef/providers.rb @@ -88,6 +88,8 @@ require 'chef/provider/service/upstart' require 'chef/provider/service/windows' require 'chef/provider/service/solaris' require 'chef/provider/service/macosx' +require 'chef/provider/service/aixinit' +require 'chef/provider/service/aix' require 'chef/provider/user/dscl' require 'chef/provider/user/pw' |