summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorSerdar Sutay <serdar@opscode.com>2014-10-21 11:14:19 -0700
committerSerdar Sutay <serdar@opscode.com>2014-10-21 11:14:19 -0700
commiteeb45770585a50d78e412682b0ae44524e29e727 (patch)
treec1d2e00403722fa111e6bd01d2f56bc0ccabe790 /lib
parentccb220a72ba07a9b2cbabba25f88edb7e7064d7b (diff)
parent09fbf4a6efacad4c635531b005dbc5832e8c03c8 (diff)
downloadchef-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.rb3
-rw-r--r--lib/chef/provider/service/aix.rb126
-rw-r--r--lib/chef/provider/service/aixinit.rb117
-rw-r--r--lib/chef/providers.rb2
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'