]> git.netwichtig.de Git - user/henk/code/puppet/modules/s6.git/blob - lib/puppet/provider/service/s6.rb
restructure provider code
[user/henk/code/puppet/modules/s6.git] / lib / puppet / provider / service / s6.rb
1 Puppet::Type.type(:service).provide(:s6, :parent => :daemontools) do
2   desc <<~EOT
3     skarnet.org's small and secure supervision software suite
4
5     The scan directory is the first one found of:
6       * /etc/s6-scandir/
7
8     The first matching service definition found in the following directories
9     is used:
10       * /etc/s6-services/
11
12
13     This provider supports:
14
15     * start/stop
16     * enable/disable
17     * restart
18     * status
19   EOT
20
21   commands :s6_svscan    => 's6-svscan'
22   commands :s6_svscanctl => 's6-svscanctl'
23   commands :s6_svc       => 's6-svc'
24   commands :s6_svstat    => 's6-svstat'
25
26   class << self
27     def specificity
28       return 1
29     end
30
31     attr_writer :defpath
32
33     # this is necessary to autodetect a valid resource
34     # default path, since there is no standard for such directory.
35     def defpath
36       @defpath ||= ["/etc/s6-services"].find do |path|
37         Puppet::FileSystem.exist?(path) && FileTest.directory?(path)
38       end
39       @defpath
40     end
41
42     # returns all providers for all existing services in @defpath
43     # ie enabled or not
44     def instances
45       path = self.defpath
46       unless path
47         Puppet.info("#{self.name} is unsuitable because service directory is nil")
48         return
49       end
50       unless FileTest.directory?(path)
51         Puppet.notice "Service path #{path} does not exist"
52         return
53       end
54
55       # reject entries that aren't either a directory
56       # or don't contain an executable run file
57       Dir.entries(path).reject { |e|
58         fullpath = File.join(path, e)
59         e =~ /^\./ or ! FileTest.directory?(fullpath) or ! Puppet::FileSystem.executable?(File.join(fullpath,"run"))
60       }.collect do |name|
61         new(:name => name, :path => path)
62       end
63     end
64
65   end
66
67   attr_writer :servicedir
68
69   # find the service dir on this node
70   def servicedir
71     unless @servicedir
72       ["/etc/s6-scandir"].each do |path|
73         if Puppet::FileSystem.exist?(path) && FileTest.directory?(path)
74           @servicedir = path
75           break
76         end
77       end
78       raise "Could not find service scan directory" unless @servicedir
79     end
80     @servicedir
81   end
82
83   def status
84     begin
85       output = s6_svstat "-u", self.service
86       if output.chomp == 'true'
87         return :running
88       end
89     rescue Puppet::ExecutionFailure => detail
90       unless detail.message =~ /(warning: |s6-supervise not running$)/
91         raise Puppet::Error.new( "Could not get status for service #{resource.ref}: #{detail}", detail )
92       end
93     end
94     :stopped
95   end
96
97   def enabled?
98       # the service is enabled if it is linked
99     case Puppet::FileSystem.symlink?(self.service) ? :true : :false
100     when :true
101       return :true
102     when :false
103       return :false
104     else
105       raise Puppet::Error.new( "Received unknown state for #{self.service}", $!)
106     end
107   end
108
109   def enable
110     if ! FileTest.directory?(self.daemon)
111       Puppet.notice "No daemon dir, calling setupservice for #{resource[:name]}"
112     end
113     if self.daemon
114       if ! Puppet::FileSystem.symlink?(self.service)
115         Puppet.notice "Enabling #{self.service}: linking #{self.daemon} -> #{self.service}"
116         Puppet::FileSystem.symlink(self.daemon, self.service)
117       end
118     end
119     s6_svscanctl "-a", self.servicedir
120   rescue Puppet::ExecutionFailure
121     raise Puppet::Error.new( "No daemon directory found for #{self.service}", $!)
122   end
123
124   def disable
125     # unlink the daemon symlink to disable it
126     Puppet::FileSystem.unlink(self.service) if Puppet::FileSystem.symlink?(self.service)
127     s6_svscanctl "-n", self.servicedir
128   end
129
130   def restart
131     s6_svc "-r", self.service
132   end
133
134   def start
135     if enabled? != :true
136         enable
137     end
138     s6_svc "-u", self.service
139   end
140
141   def stop
142     s6_svc "-d", self.service
143   end
144 end