summaryrefslogtreecommitdiffstats
path: root/lib/puppet/network/server.rb
blob: 941cb9df14b87d98f9a95ac7fbb266706fc5b4e8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
class Puppet::Network::Server
	attr_reader :server_type, :http_server_class, :protocols

    def initialize(args = {})
        @server_type = Puppet[:servertype] or raise "No servertype configuration found."  # e.g.,  WEBrick, Mongrel, etc.
	    @http_server_class = http_server_class_by_type(@server_type)
	    @protocols = []
	    @listening = false
	    @routes = {}
	    self.register(args[:handlers]) if args[:handlers]
    end

    def register(*indirections)
	    raise ArgumentError, "Indirection names are required." if indirections.empty?
	    indirections.flatten.each { |i| @routes[i.to_sym] = true }
    end
  
    def unregister(*indirections)
        raise "Cannot unregister indirections while server is listening." if listening?
	    indirections = @routes.keys if indirections.empty?
	    
	    indirections.flatten.each do |i|
	        raise(ArgumentError, "Indirection [%s] is unknown." % i) unless @routes[i.to_sym]
        end
        
        indirections.flatten.each do |i|
	        @routes.delete(i.to_sym)
	    end
    end

    def listening?
	    @listening
    end
  
    def listen
	    raise "Cannot listen -- already listening." if listening?
	    http_server.listen(@routes.dup)
	    @listening = true
    end
  
    def unlisten
	    raise "Cannot unlisten -- not currently listening." unless listening?
	    http_server.unlisten   
	    @listening = false
    end

  private
  
    def http_server
        @http_server ||= http_server_class.new
    end
    
    def http_server_class_by_type(kind)
        Puppet::Network::HTTP.server_class_by_type(kind)
    end
end