This provider supports start/stop and restart of AIX services using
the
native AIX service manager, called the System Resource Controller.
Currently it will not stop and start (but only refresh) a service that
uses sockets or message queues as its communication method.  It will
run
stopsrc and then startsrc for services that use signals as their
communication method.

Improvements will include the ability to enable and disable services
by
adding or removing them to the /etc/inittab file (this is an AIXism)
using the mkitab rmitab commands.

Signed-off-by: Andrew Forgue <[email protected]>
---
 lib/puppet/provider/service/src.rb |   91 ++++++++++++++++++++++++++++
+++++
 spec/unit/provider/service/src.rb  |   97 ++++++++++++++++++++++++++++
++++++++
 2 files changed, 188 insertions(+), 0 deletions(-)
 create mode 100755 lib/puppet/provider/service/src.rb
 create mode 100755 spec/unit/provider/service/src.rb

diff --git a/lib/puppet/provider/service/src.rb b/lib/puppet/provider/
service/src.rb
new file mode 100755
index 0000000..43a59f5
--- /dev/null
+++ b/lib/puppet/provider/service/src.rb
@@ -0,0 +1,91 @@
+# AIX System Resource controller (SRC)
+Puppet::Type.type(:service).provide :src, :parent => :base do
+
+    desc "Support for AIX's System Resource controller.
+
+    Services are started/stopped based on the stopsrc and startsrc
+    commands, and some services can be refreshed with refresh
command.
+
+    * Enabling and disableing services is not supported, as it
requires
+    modifications to /etc/inittab.
+
+    * Starting and stopping groups of subsystems is not yet supported
+    "
+
+    defaultfor :operatingsystem => :aix
+    confine :operatingsystem => :aix
+
+    commands :stopsrc  => "/usr/bin/stopsrc"
+    commands :startsrc => "/usr/bin/startsrc"
+    commands :refresh  => "/usr/bin/refresh"
+    commands :lssrc    => "/usr/bin/lssrc"
+
+    has_feature :refreshable
+
+    def startcmd
+        [command(:startsrc), "-s", @resource[:name]]
+    end
+
+    def stopcmd
+        [command(:stopsrc), "-s", @resource[:name]]
+    end
+
+    def restart
+        begin
+            execute([command(:lssrc), "-Ss", @resource[:name]]).each
do |line|
+                args = line.split(":")
+
+                next unless args[0] == @resource[:name]
+
+                # Subsystems with the -K flag can get refreshed
(HUPed)
+                # While subsystems with -S (signals) must be stopped/
started
+                method = args[11]
+                do_refresh = case method
+                    when "-K" then :true
+                    when "-S" then :false
+                    else self.fail("Unknown service communication
method #{method}, defaulting to stop/start")
+                end
+
+                begin
+                    if do_refresh == :true
+                        execute([command(:refresh), "-s", @resource
[:name]])
+                    else
+                        self.stop
+                        self.start
+                    end
+                    return :true
+                rescue Puppet::ExecutionFailure => detail
+                    raise Puppet::Error.new("Unable to restart
service %s, error was: %s" % [ @resource[:name], detail ] )
+                end
+            end
+            self.fail("No such service found")
+        rescue Puppet::ExecutionFailure => detail
+            raise Puppet::Error.new("Cannot get status of %s, error
was: %s" % [ @resource[:name], detail ] )
+        end
+    end
+
+    def status
+        begin
+            execute([command(:lssrc), "-s", @resource[:name]]).each
do |line|
+                args = line.split
+
+                # This is the header line
+                next unless args[0] == @resource[:name]
+
+                # PID is the 3rd field, but inoperative subsystems
+                # skip this so split doesn't work right
+                state = case args[-1]
+                    when "active" then :running
+                    when "inoperative" then :stopped
+                end
+                Puppet.debug("Service #...@resource[:name]} is #{args
[-1]}")
+                return state
+            end
+            self.fail("No such service found")
+        rescue Puppet::ExecutionFailure => detail
+            raise Puppet::Error.new("Cannot get status of %s, error
was: %s" % [ @resource[:name], detail ] )
+        end
+    end
+
+end
+
diff --git a/spec/unit/provider/service/src.rb b/spec/unit/provider/
service/src.rb
new file mode 100755
index 0000000..76a6cf8
--- /dev/null
+++ b/spec/unit/provider/service/src.rb
@@ -0,0 +1,97 @@
+#!/usr/bin/env ruby
+#
+# Unit testing for the AIX System Resource Controller (src) provider
+#
+
+require File.dirname(__FILE__) + '/../../../spec_helper'
+
+provider_class = Puppet::Type.type(:service).provider(:src)
+
+describe provider_class do
+
+    before :each do
+        @resource = stub 'resource'
+        @resource.stubs(:[]).returns(nil)
+        @resource.stubs(:[]).with(:name).returns "myservice"
+
+        @provider = provider_class.new
+        @provider.resource = @resource
+
+        @provider.stubs(:command).with(:stopsrc).returns "/usr/bin/
stopsrc"
+        @provider.stubs(:command).with(:startsrc).returns "/usr/bin/
startsrc"
+        @provider.stubs(:command).with(:lssrc).returns "/usr/bin/
lssrc"
+        @provider.stubs(:command).with(:refresh).returns "/usr/bin/
refresh"
+
+        @provider.stubs(:stopsrc)
+        @provider.stubs(:startsrc)
+        @provider.stubs(:lssrc)
+        @provider.stubs(:refresh)
+    end
+
+    [:start, :stop, :status, :restart].each do |method|
+        it "should have a #{method} method" do
+            @provider.should respond_to(method)
+        end
+    end
+
+    it "should execute the startsrc command" do
+        @provider.expects(:execute).with(['/usr/bin/startsrc', '-s',
"myservice"], {:squelch => true, :failonfail => true})
+        @provider.start
+    end
+
+    it "should execute the stopsrc command" do
+        @provider.expects(:execute).with(['/usr/bin/stopsrc', '-s',
"myservice"], {:squelch => true, :failonfail => true})
+        @provider.stop
+    end
+
+    it "should execute status and return running if the subsystem is
active" do
+        sample_output = <<_EOF_
+Subsystem         Group            PID          Status
+myservice         tcpip            1234         active
+_EOF_
+
+        @provider.expects(:execute).with(['/usr/bin/lssrc', '-s',
"myservice"]).returns sample_output
+        @provider.status.should == :running
+    end
+
+    it "should execute status and return stopped if the subsystem is
inoperative" do
+        sample_output = <<_EOF_
+Subsystem         Group            PID          Status
+myservice         tcpip                         inoperative
+_EOF_
+
+        @provider.expects(:execute).with(['/usr/bin/lssrc', '-s',
"myservice"]).returns sample_output
+        @provider.status.should == :stopped
+    end
+
+    it "should execute status and return nil if the status is not
known" do
+        sample_output = <<_EOF_
+Subsystem         Group            PID          Status
+myservice         tcpip                         randomdata
+_EOF_
+
+        @provider.expects(:execute).with(['/usr/bin/lssrc', '-s',
"myservice"]).returns sample_output
+        @provider.status.should == nil
+    end
+
+    it "should execute restart which runs refresh" do
+        sample_output = <<_EOF_
+#subsysname:synonym:cmdargs:path:uid:auditid:standin:standout:standerr:action:multi:contact:svrkey:svrmtype:priority:signorm:sigforce:display:waittime:grpname:
+myservice:::/usr/sbin/inetd:0:0:/dev/console:/dev/console:/dev/
console:-O:-Q:-K:0:0:20:0:0:-d:20:tcpip:
+_EOF_
+        @provider.expects(:execute).with(['/usr/bin/lssrc', '-Ss',
"myservice"]).returns sample_output
+        @provider.expects(:execute).with(['/usr/bin/refresh', '-s',
"myservice"])
+        @provider.restart
+    end
+
+    it "should execute restart which runs stopsrc then startsrc" do
+        sample_output =  <<_EOF_
+#subsysname:synonym:cmdargs:path:uid:auditid:standin:standout:standerr:action:multi:contact:svrkey:svrmtype:priority:signorm:sigforce:display:waittime:grpname:
+myservice::--no-daemonize:/usr/sbin/puppetd:0:0:/dev/null:/var/log/
puppet.log:/var/log/puppet.log:-O:-Q:-S:0:0:20:15:9:-d:20::"
+_EOF_
+        @provider.expects(:execute).with(['/usr/bin/lssrc', '-Ss',
"myservice"]).returns sample_output
+        @provider.expects(:execute).with(['/usr/bin/stopsrc', '-s',
"myservice"], {:squelch => true, :failonfail => true})
+        @provider.expects(:execute).with(['/usr/bin/startsrc', '-s',
"myservice"], {:squelch => true, :failonfail => true})
+        @provider.restart
+    end
+end
--
1.6.3.3

--

You received this message because you are subscribed to the Google Groups 
"Puppet Developers" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/puppet-dev?hl=en.


Reply via email to