Class: Relp::RelpServer
Instance Method Summary
collapse
#create_frame, #frame_read, #frame_write
Constructor Details
#initialize(port, callback, host = '0.0.0.0', tls_context = nil, logger = nil) ⇒ RelpServer
Returns a new instance of RelpServer.
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
# File 'lib/relp/server.rb', line 8
def initialize(port, callback, host = '0.0.0.0' , tls_context = nil, logger = nil)
@logger = logger
@logger = Logger.new(STDOUT) if logger.nil?
@socket_list = Array.new
@callback = callback
@required_command = 'syslog'
begin
@server = TCPServer.new host, port
if tls_context
@logger.info "Starting #{self.class} with SSL enabled on %s:%i" % @server.local_address.ip_unpack
@server = OpenSSL::SSL::SSLServer.new(@server, tls_context)
else
@logger.info "Starting #{self.class} on %s:%i" % @server.local_address.ip_unpack
end
rescue Errno::EADDRINUSE
@logger.error "ERROR Could not start relp server: Port #{port} in use"
raise Errno::EADDRINUSE
end
end
|
Instance Method Details
#ack_frame(socket, txnr) ⇒ Object
76
77
78
79
80
81
82
|
# File 'lib/relp/server.rb', line 76
def ack_frame(socket, txnr)
frame = {:txnr => txnr,
:command => 'rsp',
:message => "6 200 OK\n"
}
frame_write(socket, frame)
end
|
#return_message(message, callback) ⇒ Object
67
68
69
70
71
72
73
74
|
# File 'lib/relp/server.rb', line 67
def return_message(message, callback)
list_of_messages = message.split(/\n+/)
list_of_messages.each do |msg|
remove = msg.split(": ").first + ": "
msg.slice! remove
callback.call(msg)
end
end
|
#run ⇒ Object
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
|
# File 'lib/relp/server.rb', line 29
def run
loop do
client_socket = @server.accept
Thread.start(client_socket) do |client_socket|
begin
@socket_list.push client_socket
remote_ip = client_socket.peeraddr[3]
@logger.info "New client connection coming from ip #{remote_ip}"
@logger.debug "New client started with object id=#{client_socket.object_id}"
connection_setup(client_socket)
while Thread.current.alive? do
ready = IO.select([client_socket], nil, nil, 10)
if ready
frame = communication_processing(client_socket)
return_message(frame[:message], (@callback))
ack_frame(client_socket,frame[:txnr])
end
end
rescue Relp::ConnectionClosed
@logger.info "Connection closed"
rescue Relp::RelpProtocolError => err
@logger.warn 'Relp error: ' + err.class.to_s + ' ' + err.message
rescue OpenSSL::SSL::SSLError => ssl_error
@logger.error "SSL Error", :exception => ssl_error
rescue Exception => e
@logger.debug e
ensure
server_close_message(client_socket) rescue nil
@logger.debug "Closing client socket=#{client_socket.object_id}"
@logger.info "Client from ip #{remote_ip} closed"
end
end
end
rescue Errno::EINVAL
@logger.info "Socket close."
end
|
#server_close_message(socket) ⇒ Object
84
85
86
87
88
89
90
91
92
93
94
95
96
|
# File 'lib/relp/server.rb', line 84
def server_close_message(socket)
Hash.new frame = {:txnr => 0,
:command => 'close',
:message => '0'
}
begin
frame_write(socket,frame)
@logger.debug 'Server close message send'
socket.close
@socket_list.delete socket
rescue Relp::ConnectionClosed
end
end
|
#server_shutdown ⇒ Object
98
99
100
101
102
103
104
105
106
107
|
# File 'lib/relp/server.rb', line 98
def server_shutdown
@socket_list.each do |client_socket|
if client_socket != nil
server_close_message(client_socket)
end
end
@logger.info 'Server shutdown'
@server.shutdown
@server = nil
end
|