blob: 84a71a6b41537b2a2c442e7db69f4ad0c60c0cc7 (
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
58
59
60
61
62
63
64
65
66
|
class Puppet::Network::Server
attr_reader :server_type
# which HTTP server subclass actually handles web requests of a certain type? (e.g., :rest => RESTServer)
def self.server_class_by_name(name)
klass = (name.to_s + 'Server').to_sym
const_get klass
end
# we will actually return an instance of the Server subclass which handles the HTTP web server, instead of
# an instance of this generic Server class. A tiny bit of sleight-of-hand is necessary to make this happen.
def self.new(args = {})
server_type = Puppet[:servertype] or raise "No servertype configuration found."
obj = self.server_class_by_name(server_type).allocate
obj.send :initialize, args.merge(:server_type => server_type)
obj
end
def initialize(args = {})
@routes = {}
@listening = false
@server_type = args[:server_type]
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)
indirections = @routes.keys if indirections.empty?
indirections.flatten.each do |i|
raise(ArgumentError, "indirection [%s] is not known" % i) unless @routes[i.to_sym]
@routes.delete(i.to_sym)
end
end
def listening?
@listening
end
def listen
raise "Cannot listen -- already listening" if listening?
start_web_server
@listening = true
end
def unlisten
raise "Cannot unlisten -- not currently listening" unless listening?
stop_web_server
@listening = false
end
private
def start_web_server
raise NotImplementedError, "this method needs to be implemented by the actual web server (sub)class"
end
def stop_web_server
raise NotImplementedError, "this method needs to be implemented by the actual web server (sub)class"
end
end
|