]> git.netwichtig.de Git - user/henk/code/puppet/modules/s6.git/blob - lib/puppet/provider/service/s6.rb
puppet provider should not be the default for 'service' resources
[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     # this is necessary to autodetect a valid resource
32     # default path, since there is no standard for such directory.
33     def defpath
34       @defpath ||= ["/etc/s6-services"].find do |path|
35         Puppet::FileSystem.exist?(path) && FileTest.directory?(path)
36       end
37       @defpath
38     end
39   end
40
41   # find the service dir on this node
42   def servicedir
43     unless @servicedir
44       ["/etc/s6-scandir"].each do |path|
45         if Puppet::FileSystem.exist?(path) && FileTest.directory?(path)
46           @servicedir = path
47           break
48         end
49       end
50       raise "Could not find service scan directory" unless @servicedir
51     end
52     @servicedir
53   end
54
55   def self.instances
56     path = self.defpath
57     unless path
58       Puppet.info("#{self.name} is unsuitable because service directory is nil")
59       return
60     end
61     unless FileTest.directory?(path)
62       Puppet.notice "Service path #{path} does not exist"
63       return
64     end
65
66     # reject entries that aren't either a directory
67     # or don't contain an executable run file
68     Dir.entries(path).reject { |e|
69       fullpath = File.join(path, e)
70       e =~ /^\./ or ! FileTest.directory?(fullpath) or ! Puppet::FileSystem.executable?(File.join(fullpath,"run"))
71     }.collect do |name|
72       new(:name => name, :path => path)
73     end
74   end
75
76   def status
77     begin
78       output = s6_svstat "-u", self.service
79       return :running if output.chomp == 'true'
80     rescue Puppet::ExecutionFailure => detail
81       unless detail.message =~ /(warning: |s6-supervise not running$)/
82         raise Puppet::Error.new( "Could not get status for service #{resource.ref}: #{detail}", detail )
83       end
84     end
85     :stopped
86   end
87
88   def stop
89     s6_svc "-d", self.service
90   end
91
92   def restart
93     s6_svc "-r", self.service
94   end
95
96   def start
97     if enabled? != :true
98         enable
99     end
100     s6_svc "-u", self.service
101   end
102
103   def enable
104     if ! FileTest.directory?(self.daemon)
105       Puppet.notice "No daemon dir, calling setupservice for #{resource[:name]}"
106       self.setupservice
107     end
108     if self.daemon
109       if ! Puppet::FileSystem.symlink?(self.service)
110         Puppet.notice "Enabling #{self.service}: linking #{self.daemon} -> #{self.service}"
111         Puppet::FileSystem.symlink(self.daemon, self.service)
112       end
113     end
114     s6_svscanctl "-a", self.servicedir
115   rescue Puppet::ExecutionFailure
116     raise Puppet::Error.new( "No daemon directory found for #{self.service}", $!)
117   end
118
119   def disable
120     # unlink the daemon symlink to disable it
121     Puppet::FileSystem.unlink(self.service) if Puppet::FileSystem.symlink?(self.service)
122     s6_svscanctl "-n", self.servicedir
123   end
124 end