oversip 1.1.0.beta2 → 1.1.0.beta3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/bin/oversip +8 -5
- data/etc/oversip.conf +2 -2
- data/etc/server.rb +146 -151
- data/lib/oversip/default_server.rb +1 -1
- data/lib/oversip/errors.rb +1 -1
- data/lib/oversip/launcher.rb +1 -1
- data/lib/oversip/logger.rb +28 -24
- data/lib/oversip/posix_mq.rb +1 -1
- data/lib/oversip/sip/listeners/tcp_reactor.rb +0 -1
- data/lib/oversip/sip/listeners/tls_tunnel_reactor.rb +0 -1
- data/lib/oversip/sip/listeners/tls_tunnel_server.rb +1 -1
- data/lib/oversip/sip/listeners/udp_reactor.rb +0 -1
- data/lib/oversip/sip/message.rb +8 -0
- data/lib/oversip/sip/message_processor.rb +3 -3
- data/lib/oversip/sip/modules/core.rb +0 -11
- data/lib/oversip/sip/modules/registrar_without_path.rb +2 -2
- data/lib/oversip/sip/modules/user_assertion.rb +2 -2
- data/lib/oversip/sip/proxy.rb +27 -21
- data/lib/oversip/syslog.rb +58 -0
- data/lib/oversip/syslogger_process.rb +7 -44
- data/lib/oversip/version.rb +1 -1
- data/lib/oversip/websocket/listeners/tcp_server.rb +2 -1
- data/lib/oversip/websocket/ws_app.rb +1 -0
- data/lib/oversip/websocket/ws_framing.rb +14 -8
- data/lib/oversip.rb +2 -0
- metadata +19 -18
data/bin/oversip
CHANGED
@@ -5,6 +5,8 @@ unless RUBY_VERSION >= "1.9.2"
|
|
5
5
|
raise ::LoadError, "OverSIP requires Ruby version >= 1.9.2 (current version is #{RUBY_VERSION})"
|
6
6
|
end
|
7
7
|
|
8
|
+
$LOAD_PATH.insert 0, File.expand_path(File.join(File.dirname(__FILE__), "../", "lib"))
|
9
|
+
|
8
10
|
# When OverSIP is executed automaticaly via the system init (i.e. after booting the host)
|
9
11
|
# the Encoding.default_external is US_ASCII which causes fails when reading daat from
|
10
12
|
# some files (i.e. the cacert.pem file which contains no valid US_ASCII symbols). So
|
@@ -23,12 +25,13 @@ require "oversip"
|
|
23
25
|
module OverSIP
|
24
26
|
|
25
27
|
class Executable
|
28
|
+
extend ::OverSIP::Logger
|
26
29
|
|
27
30
|
@log_id = "executable"
|
28
31
|
|
29
32
|
def self.run
|
33
|
+
$0 = ::File.basename(__FILE__)
|
30
34
|
::OverSIP::Logger.load_methods
|
31
|
-
extend ::OverSIP::Logger
|
32
35
|
|
33
36
|
# Options by default.
|
34
37
|
options = {
|
@@ -48,6 +51,8 @@ module OverSIP
|
|
48
51
|
|
49
52
|
opts.on("-p", "--process-name NAME", "Change the running process name, also affects to syslogger process and Posix Message Queue name (default 'oversip')") do |value|
|
50
53
|
options[:process_name] = value
|
54
|
+
$0 = options[:process_name]
|
55
|
+
::OverSIP::Logger.load_methods
|
51
56
|
end
|
52
57
|
|
53
58
|
opts.on("--config-dir DIR", "Absolute path to the directory with user configuration files (default '/etc/oversip/')") do |value|
|
@@ -166,13 +171,11 @@ module OverSIP
|
|
166
171
|
|
167
172
|
# Set the command name (as it appears in "ps" output) to given --process_name option (-p)
|
168
173
|
# or to the script filename otherwise.
|
169
|
-
|
170
|
-
|
171
|
-
::OverSIP.master_name = $0
|
174
|
+
::OverSIP.master_name = options[:process_name] || ::File.basename(__FILE__)
|
175
|
+
$0 = ::OverSIP.master_name
|
172
176
|
log_system_info "master process name: #{::OverSIP.master_name}"
|
173
177
|
|
174
178
|
::OverSIP::Config.load options[:config_dir], options[:config_file]
|
175
|
-
log_system_info "applied configuration:"
|
176
179
|
::OverSIP::Config.print options[:colorize]
|
177
180
|
|
178
181
|
log_system_info "creating Posix Message Queue for communicating master and syslogger processes"
|
data/etc/oversip.conf
CHANGED
@@ -22,9 +22,9 @@ core:
|
|
22
22
|
nameservers: null
|
23
23
|
|
24
24
|
# Syslog facility. Can be "user", "local0"..."local7".
|
25
|
-
# By default "
|
25
|
+
# By default "daemon".
|
26
26
|
#
|
27
|
-
syslog_facility:
|
27
|
+
syslog_facility: daemon
|
28
28
|
|
29
29
|
# Syslog level. Can be "debug", "info", "notice", "warn", "error", "crit".
|
30
30
|
# By default "info".
|
data/etc/server.rb
CHANGED
@@ -31,213 +31,208 @@ end
|
|
31
31
|
|
32
32
|
|
33
33
|
|
34
|
-
### OverSIP Events:
|
34
|
+
### OverSIP System Events:
|
35
35
|
|
36
36
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
# This method is called once the OverSIP reactor has been started.
|
43
|
-
#
|
44
|
-
# def SystemEvents.on_started
|
45
|
-
# [...]
|
46
|
-
# end
|
37
|
+
# This method is called once the OverSIP reactor has been started.
|
38
|
+
#
|
39
|
+
# def (OverSIP::SystemEvents).on_started
|
40
|
+
# [...]
|
41
|
+
# end
|
47
42
|
|
48
43
|
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
44
|
+
# This method is called when a USR1 signal is received by OverSIP main
|
45
|
+
# process and allows the user to set custom code to be executed
|
46
|
+
# or reloaded.
|
47
|
+
#
|
48
|
+
# def (OverSIP::SystemEvents).on_user_reload
|
49
|
+
# [...]
|
50
|
+
# end
|
56
51
|
|
57
52
|
|
58
53
|
|
59
54
|
|
60
|
-
|
55
|
+
### OverSIP SIP Events:
|
61
56
|
|
62
57
|
|
63
|
-
|
64
|
-
|
65
|
-
|
58
|
+
# This method is called when a SIP request is received.
|
59
|
+
#
|
60
|
+
def (OverSIP::SipEvents).on_request request
|
66
61
|
|
67
|
-
|
62
|
+
log_info "#{request.sip_method} from #{request.from.uri} (UA: #{request.header("User-Agent")}) to #{request.ruri} via #{request.transport.upcase} #{request.source_ip} : #{request.source_port}"
|
68
63
|
|
69
|
-
|
70
|
-
|
64
|
+
# Check Max-Forwards value (max 10).
|
65
|
+
return unless request.check_max_forwards 10
|
71
66
|
|
72
|
-
|
73
|
-
|
74
|
-
|
67
|
+
# Assume all the traffic is from clients and help them with NAT issues
|
68
|
+
# by forcing rport usage and Outbound mechanism.
|
69
|
+
request.fix_nat
|
75
70
|
|
76
|
-
|
77
|
-
|
78
|
-
if request.loose_route
|
79
|
-
log_debug "proxying in-dialog #{request.sip_method}"
|
80
|
-
request.proxy(:proxy_in_dialog).route
|
81
|
-
else
|
82
|
-
unless request.sip_method == :ACK
|
83
|
-
log_notice "forbidden in-dialog request without top Route pointing to us => 403"
|
84
|
-
request.reply 403, "forbidden in-dialog request without top Route pointing to us"
|
85
|
-
else
|
86
|
-
log_notice "ignoring not loose routing ACK"
|
87
|
-
end
|
88
|
-
end
|
89
|
-
return
|
90
|
-
end
|
91
|
-
|
92
|
-
# Initial requests.
|
93
|
-
|
94
|
-
# Check that the request does not contain a top Route pointing to another server.
|
71
|
+
# In-dialog requests.
|
72
|
+
if request.in_dialog?
|
95
73
|
if request.loose_route
|
74
|
+
log_debug "proxying in-dialog #{request.sip_method}"
|
75
|
+
proxy = ::OverSIP::SIP::Proxy.new :proxy_in_dialog
|
76
|
+
proxy.route request
|
77
|
+
else
|
96
78
|
unless request.sip_method == :ACK
|
97
|
-
log_notice "
|
98
|
-
request.reply 403, "
|
79
|
+
log_notice "forbidden in-dialog request without top Route pointing to us => 403"
|
80
|
+
request.reply 403, "forbidden in-dialog request without top Route pointing to us"
|
99
81
|
else
|
100
|
-
log_notice "ignoring
|
82
|
+
log_notice "ignoring not loose routing ACK"
|
101
83
|
end
|
102
|
-
return
|
103
84
|
end
|
85
|
+
return
|
86
|
+
end
|
104
87
|
|
105
|
-
|
106
|
-
# Extract the Outbound flow token from the RURI.
|
107
|
-
OverSIP::SIP::Modules::RegistrarWithoutPath.extract_outbound_from_ruri request
|
108
|
-
end
|
88
|
+
# Initial requests.
|
109
89
|
|
110
|
-
|
111
|
-
|
112
|
-
|
90
|
+
# Check that the request does not contain a top Route pointing to another server.
|
91
|
+
if request.loose_route
|
92
|
+
unless request.sip_method == :ACK
|
93
|
+
log_notice "pre-loaded Route not allowed here => 403"
|
94
|
+
request.reply 403, "Pre-loaded Route not allowed"
|
95
|
+
else
|
96
|
+
log_notice "ignoring ACK initial request"
|
97
|
+
end
|
98
|
+
return
|
99
|
+
end
|
113
100
|
|
114
|
-
|
101
|
+
if MyExampleApp::SIP_USE_MODULE_REGISTRAR_WITHOUT_PATH
|
102
|
+
# Extract the Outbound flow token from the RURI.
|
103
|
+
OverSIP::SIP::Modules::RegistrarWithoutPath.extract_outbound_from_ruri request
|
104
|
+
end
|
115
105
|
|
116
|
-
|
117
|
-
|
118
|
-
|
106
|
+
# The request goes to a client using Outbound through OverSIP.
|
107
|
+
if request.incoming_outbound_requested?
|
108
|
+
log_info "routing initial request to an Outbound client"
|
119
109
|
|
120
|
-
|
121
|
-
log_info "incoming Outbound on_failure_response: #{response.status_code} '#{response.reason_phrase}'"
|
122
|
-
end
|
110
|
+
proxy = ::OverSIP::SIP::Proxy.new :proxy_to_users
|
123
111
|
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
log_notice "incoming Outbound on_error: #{status} '#{reason}'"
|
128
|
-
end
|
112
|
+
proxy.on_success_response do |response|
|
113
|
+
log_info "incoming Outbound on_success_response: #{response.status_code} '#{response.reason_phrase}'"
|
114
|
+
end
|
129
115
|
|
130
|
-
|
131
|
-
|
132
|
-
return
|
116
|
+
proxy.on_failure_response do |response|
|
117
|
+
log_info "incoming Outbound on_failure_response: #{response.status_code} '#{response.reason_phrase}'"
|
133
118
|
end
|
134
119
|
|
135
|
-
#
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
return
|
120
|
+
# on_error() occurs when no SIP response was received fom the peer and, instead, we
|
121
|
+
# got some other internal error (timeout, connection error, DNS error....).
|
122
|
+
proxy.on_error do |status, reason|
|
123
|
+
log_notice "incoming Outbound on_error: #{status} '#{reason}'"
|
140
124
|
end
|
141
125
|
|
142
|
-
#
|
143
|
-
|
126
|
+
# Route the request and return.
|
127
|
+
proxy.route request
|
128
|
+
return
|
129
|
+
end
|
144
130
|
|
145
|
-
|
131
|
+
# An initial request with us (OverSIP) as final destination, ok, received, bye...
|
132
|
+
if request.destination_myself?
|
133
|
+
log_info "request for myself => 404"
|
134
|
+
request.reply 404, "Ok, I'm here"
|
135
|
+
return
|
136
|
+
end
|
146
137
|
|
147
|
-
|
148
|
-
|
149
|
-
end
|
138
|
+
# An outgoing initial request.
|
139
|
+
case request.sip_method
|
150
140
|
|
151
|
-
|
141
|
+
when :INVITE, :MESSAGE, :OPTIONS, :SUBSCRIBE, :PUBLISH
|
152
142
|
|
153
|
-
|
154
|
-
|
155
|
-
|
143
|
+
if MyExampleApp::SIP_USE_MODULE_USER_ASSERTION
|
144
|
+
::OverSIP::SIP::Modules::UserAssertion.add_pai request
|
145
|
+
end
|
156
146
|
|
157
|
-
|
158
|
-
log_info "on_success_response: #{response.status_code} '#{response.reason_phrase}'"
|
159
|
-
end
|
147
|
+
proxy = ::OverSIP::SIP::Proxy.new :proxy_out
|
160
148
|
|
161
|
-
|
162
|
-
|
163
|
-
|
149
|
+
proxy.on_provisional_response do |response|
|
150
|
+
log_info "on_provisional_response: #{response.status_code} '#{response.reason_phrase}'"
|
151
|
+
end
|
164
152
|
|
165
|
-
|
166
|
-
|
167
|
-
|
153
|
+
proxy.on_success_response do |response|
|
154
|
+
log_info "on_success_response: #{response.status_code} '#{response.reason_phrase}'"
|
155
|
+
end
|
168
156
|
|
169
|
-
|
170
|
-
|
157
|
+
proxy.on_failure_response do |response|
|
158
|
+
log_info "on_failure_response: #{response.status_code} '#{response.reason_phrase}'"
|
159
|
+
end
|
171
160
|
|
172
|
-
|
161
|
+
proxy.on_error do |status, reason|
|
162
|
+
log_notice "on_error: #{status} '#{reason}'"
|
163
|
+
end
|
173
164
|
|
174
|
-
|
175
|
-
|
176
|
-
::OverSIP::SIP::Modules::RegistrarWithoutPath.add_outbound_to_contact request
|
177
|
-
end
|
165
|
+
proxy.route request
|
166
|
+
return
|
178
167
|
|
179
|
-
|
168
|
+
when :REGISTER
|
180
169
|
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
::OverSIP::SIP::Modules::RegistrarWithoutPath.remove_outbound_from_contact response
|
186
|
-
end
|
170
|
+
if MyExampleApp::SIP_USE_MODULE_REGISTRAR_WITHOUT_PATH
|
171
|
+
# Contact mangling for the case in which the registrar does not support Path.
|
172
|
+
::OverSIP::SIP::Modules::RegistrarWithoutPath.add_outbound_to_contact request
|
173
|
+
end
|
187
174
|
|
188
|
-
|
189
|
-
# The registrar replies 200 after a REGISTER with credentials so let's assert
|
190
|
-
# the current SIP user to this connection.
|
191
|
-
::OverSIP::SIP::Modules::UserAssertion.assert_connection response
|
192
|
-
end
|
193
|
-
end
|
175
|
+
proxy = ::OverSIP::SIP::Proxy.new :proxy_out
|
194
176
|
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
end
|
177
|
+
proxy.on_success_response do |response|
|
178
|
+
if MyExampleApp::SIP_USE_MODULE_REGISTRAR_WITHOUT_PATH
|
179
|
+
# Undo changes done to the Contact header provided by the client, so it receives
|
180
|
+
# the same value in the 200 response from the registrar.
|
181
|
+
::OverSIP::SIP::Modules::RegistrarWithoutPath.remove_outbound_from_contact response
|
201
182
|
end
|
202
183
|
|
203
|
-
|
204
|
-
|
184
|
+
if MyExampleApp::SIP_USE_MODULE_USER_ASSERTION
|
185
|
+
# The registrar replies 200 after a REGISTER with credentials so let's assert
|
186
|
+
# the current SIP user to this connection.
|
187
|
+
::OverSIP::SIP::Modules::UserAssertion.assert_connection response
|
188
|
+
end
|
189
|
+
end
|
205
190
|
|
206
|
-
|
191
|
+
proxy.on_failure_response do |response|
|
192
|
+
if MyExampleApp::SIP_USE_MODULE_USER_ASSERTION
|
193
|
+
# We don't add PAI for re-REGISTER, so 401 will be replied, and after it let's
|
194
|
+
# revoke the current user assertion (will be re-added upon REGISTER with credentials).
|
195
|
+
::OverSIP::SIP::Modules::UserAssertion.revoke_assertion response
|
196
|
+
end
|
197
|
+
end
|
207
198
|
|
208
|
-
|
209
|
-
|
210
|
-
return
|
199
|
+
proxy.route request
|
200
|
+
return
|
211
201
|
|
212
|
-
|
213
|
-
end
|
202
|
+
else
|
214
203
|
|
204
|
+
log_info "method #{request.sip_method} not implemented => 501"
|
205
|
+
request.reply 501, "Not Implemented"
|
206
|
+
return
|
215
207
|
|
208
|
+
end
|
209
|
+
end
|
216
210
|
|
217
211
|
|
218
|
-
### WebSocket Events:
|
219
212
|
|
220
213
|
|
221
|
-
|
222
|
-
# Here you can inspect the connection and the HTTP GET request. If you
|
223
|
-
# decide not to accept this connection then call to:
|
224
|
-
#
|
225
|
-
# connection.http_reject(status_code, reason_phrase=nil, extra_headers=nil)
|
226
|
-
#
|
227
|
-
# You can also set variables for this connection via the connection.cvars
|
228
|
-
# Hash. Later you can access to this Hash in SIP request from this connection
|
229
|
-
# by accessing to request.cvars attribute.
|
230
|
-
#
|
231
|
-
# def WebSocketEvents.on_connection connection, http_request
|
232
|
-
# [...]
|
233
|
-
# end
|
214
|
+
### OverSIP WebSocket Events:
|
234
215
|
|
235
216
|
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
217
|
+
# This method is called when a new WebSocket connection is being requested.
|
218
|
+
# Here you can inspect the connection and the HTTP GET request. If you
|
219
|
+
# decide not to accept this connection then call to:
|
220
|
+
#
|
221
|
+
# connection.http_reject(status_code, reason_phrase=nil, extra_headers=nil)
|
222
|
+
#
|
223
|
+
# You can also set variables for this connection via the connection.cvars
|
224
|
+
# Hash. Later you can access to this Hash in SIP requests from this connection
|
225
|
+
# by retrieving request.cvars attribute.
|
226
|
+
#
|
227
|
+
# def (OverSIP::WebSocketEvents).on_connection connection, http_request
|
228
|
+
# [...]
|
229
|
+
# end
|
241
230
|
|
242
231
|
|
243
|
-
|
232
|
+
# This method is called when a WebSocket connection is closed. The connection
|
233
|
+
# is given as first argument along with a second argument "client_closed" which
|
234
|
+
# is _true_ in case the WebSocket connection was closed by the client.
|
235
|
+
#
|
236
|
+
# def (OverSIP::WebSocketEvents).on_connection_closed connection, client_closed
|
237
|
+
# [...]
|
238
|
+
# end
|
@@ -32,7 +32,7 @@ module OverSIP
|
|
32
32
|
log_system_notice "on_connection() event is not defined"
|
33
33
|
end
|
34
34
|
|
35
|
-
def self.on_connection_closed connection
|
35
|
+
def self.on_connection_closed connection, client_closed
|
36
36
|
log_system_notice "on_connection_closed() event is not defined"
|
37
37
|
end
|
38
38
|
|
data/lib/oversip/errors.rb
CHANGED
data/lib/oversip/launcher.rb
CHANGED
@@ -552,7 +552,7 @@ module OverSIP::Launcher
|
|
552
552
|
::OverSIP.stud_pids ||= []
|
553
553
|
::OverSIP.stud_pids << pid
|
554
554
|
|
555
|
-
log_system_info "spawned stud server (PID #{pid}) listening
|
555
|
+
log_system_info "spawned stud server (PID #{pid}) listening on #{listen_ip} : #{listen_port}"
|
556
556
|
end
|
557
557
|
|
558
558
|
|
data/lib/oversip/logger.rb
CHANGED
@@ -5,17 +5,6 @@ module OverSIP
|
|
5
5
|
# attribute.
|
6
6
|
module Logger
|
7
7
|
|
8
|
-
SYSLOG_POSIXMQ_MAPPING = {
|
9
|
-
"debug" => 0,
|
10
|
-
"info" => 1,
|
11
|
-
"notice" => 2,
|
12
|
-
"warn" => 3,
|
13
|
-
"error" => 4,
|
14
|
-
"crit" => 5,
|
15
|
-
"alert" => 6,
|
16
|
-
"emerg" => 7
|
17
|
-
}
|
18
|
-
|
19
8
|
def self.init_logger_mq group=nil
|
20
9
|
@@logger_mq = ::OverSIP::PosixMQ.create_queue({
|
21
10
|
:name => ::OverSIP.syslogger_mq_name,
|
@@ -28,8 +17,17 @@ module OverSIP
|
|
28
17
|
|
29
18
|
|
30
19
|
def self.load_methods
|
20
|
+
# When not yet daemonized, also log to syslog.
|
21
|
+
if not ::OverSIP.daemonized?
|
22
|
+
::Syslog.close if ::Syslog.opened?
|
23
|
+
|
24
|
+
syslog_options = ::Syslog::LOG_PID | ::Syslog::LOG_NDELAY
|
25
|
+
syslog_facility = ::OverSIP::Syslog::SYSLOG_FACILITY_MAPPING[::OverSIP.configuration[:core][:syslog_facility]] rescue ::Syslog::LOG_DAEMON
|
26
|
+
::Syslog.open(::OverSIP.master_name, syslog_options, syslog_facility)
|
27
|
+
end
|
28
|
+
|
31
29
|
begin
|
32
|
-
@@threshold =
|
30
|
+
@@threshold = ::OverSIP::Syslog::SYSLOG_SEVERITY_MAPPING[::OverSIP.configuration[:core][:syslog_level]]
|
33
31
|
rescue
|
34
32
|
@@threshold = 0 # debug.
|
35
33
|
end
|
@@ -38,7 +36,7 @@ module OverSIP
|
|
38
36
|
|
39
37
|
@@congested = false
|
40
38
|
|
41
|
-
|
39
|
+
::OverSIP::Syslog::SYSLOG_SEVERITY_MAPPING.each do |level, level_value|
|
42
40
|
method_str = "
|
43
41
|
def log_system_#{level}(msg)
|
44
42
|
"
|
@@ -49,27 +47,33 @@ module OverSIP
|
|
49
47
|
begin
|
50
48
|
unless @@logger_mq.trysend ::OverSIP::Logger.syslog_system_msg2str(#{level_value}, msg, log_id), 0
|
51
49
|
@@congested = true
|
52
|
-
EM.add_timer(1) do
|
50
|
+
::EM.add_timer(1) do
|
53
51
|
@@logger_mq.trysend ::OverSIP::Logger.syslog_system_msg2str(4, \"logger message queue was full, some logs have been lost\", log_id), 1
|
54
52
|
@@congested = false
|
55
53
|
end
|
56
54
|
end
|
57
|
-
rescue Errno::EMSGSIZE
|
55
|
+
rescue ::Errno::EMSGSIZE
|
58
56
|
@@logger_mq.trysend ::OverSIP::Logger.syslog_system_msg2str(4, \"too long message could not be logged\", log_id), 1 rescue nil
|
59
|
-
rescue => e
|
57
|
+
rescue ::Exception => e
|
60
58
|
@@logger_mq.trysend ::OverSIP::Logger.syslog_system_msg2str(4, \"unexpected logging error (\#{e.class}: \#{e.message})\", log_id), 1 rescue nil
|
61
59
|
end
|
62
60
|
"
|
63
61
|
end
|
64
62
|
|
65
|
-
|
63
|
+
if not ::OverSIP.daemonized?
|
66
64
|
if %w{debug info notice}.include? level
|
67
65
|
method_str << "
|
68
66
|
puts ::OverSIP::Logger.fg_system_msg2str('#{level}', msg, log_id)
|
67
|
+
if not ::OverSIP.syslogger_ready?
|
68
|
+
::OverSIP::Syslog.log ::OverSIP::Logger.syslog_system_msg2str(#{level_value}, msg, log_id)
|
69
|
+
end
|
69
70
|
"
|
70
71
|
else
|
71
72
|
method_str << "
|
72
73
|
$stderr.puts ::OverSIP::Logger.fg_system_msg2str('#{level}', msg, log_id)
|
74
|
+
if not ::OverSIP.syslogger_ready?
|
75
|
+
::OverSIP::Syslog.log ::OverSIP::Logger.syslog_system_msg2str(#{level_value}, msg, log_id)
|
76
|
+
end
|
73
77
|
"
|
74
78
|
end
|
75
79
|
end
|
@@ -80,21 +84,21 @@ module OverSIP
|
|
80
84
|
|
81
85
|
|
82
86
|
if ::OverSIP.syslogger_ready?
|
83
|
-
# User
|
87
|
+
# User logs.
|
84
88
|
method_str = "
|
85
89
|
def log_#{level}(msg)
|
86
90
|
return false if @@threshold > #{level_value} || @@congested
|
87
91
|
begin
|
88
92
|
unless @@logger_mq.trysend ::OverSIP::Logger.syslog_user_msg2str(#{level_value}, msg, log_id), 0
|
89
93
|
@@congested = true
|
90
|
-
EM.add_timer(1) do
|
94
|
+
::EM.add_timer(1) do
|
91
95
|
@@logger_mq.trysend ::OverSIP::Logger.syslog_user_msg2str(4, \"logger message queue was full, some logs have been lost\", log_id), 1
|
92
96
|
@@congested = false
|
93
97
|
end
|
94
98
|
end
|
95
|
-
rescue Errno::EMSGSIZE
|
99
|
+
rescue ::Errno::EMSGSIZE
|
96
100
|
@@logger_mq.trysend ::OverSIP::Logger.syslog_user_msg2str(4, \"too long message could not be logged\", log_id), 1 rescue nil
|
97
|
-
rescue => e
|
101
|
+
rescue ::Exception => e
|
98
102
|
@@logger_mq.trysend ::OverSIP::Logger.syslog_user_msg2str(4, \"unexpected logging error (\#{e.class}: \#{e.message})\", log_id), 1 rescue nil
|
99
103
|
end
|
100
104
|
end
|
@@ -133,11 +137,11 @@ module OverSIP
|
|
133
137
|
def self.syslog_user_msg2str(level_value, msg, log_id)
|
134
138
|
case msg
|
135
139
|
when ::String
|
136
|
-
level_value.to_s << "<" << log_id << ">
|
140
|
+
level_value.to_s << "<" << log_id << "> [user] " << msg
|
137
141
|
when ::Exception
|
138
|
-
"#{level_value}<#{log_id}>
|
142
|
+
"#{level_value}<#{log_id}> [user] #{msg.message} (#{msg.class })\n#{(msg.backtrace || [])[0..3].join("\n")}"
|
139
143
|
else
|
140
|
-
level_value.to_s << "<" << log_id << ">
|
144
|
+
level_value.to_s << "<" << log_id << "> [user] " << msg.inspect
|
141
145
|
end
|
142
146
|
end
|
143
147
|
|
data/lib/oversip/posix_mq.rb
CHANGED
@@ -110,7 +110,7 @@ module OverSIP
|
|
110
110
|
::Process::GID.change_privilege(orig_gid) if mq_group
|
111
111
|
|
112
112
|
if mq.attr.maxmsg == mq_attr.maxmsg and mq.attr.msgsize == mq_attr.msgsize
|
113
|
-
|
113
|
+
log_system_info "maxmsg=#{mq.attr.maxmsg}, msgsize=#{mq.attr.msgsize}"
|
114
114
|
else
|
115
115
|
log_system_warn "maxmsg=#{mq.attr.maxmsg}, msgsize=#{mq.attr.msgsize}, " \
|
116
116
|
"but recommended values are maxmsg=#{mq_attr.maxmsg}, msgsize=#{mq_attr.msgsize}"
|
@@ -15,7 +15,7 @@ module OverSIP::SIP
|
|
15
15
|
return
|
16
16
|
end
|
17
17
|
|
18
|
-
log_system_debug "connection from the TLS tunnel " << remote_desc
|
18
|
+
log_system_debug ("connection from the TLS tunnel " << remote_desc) if $oversip_debug
|
19
19
|
|
20
20
|
# Create an Outbound (RFC 5626) flow token for this connection.
|
21
21
|
@outbound_flow_token = ::OverSIP::SIP::TransportManager.add_outbound_connection self
|
data/lib/oversip/sip/message.rb
CHANGED
@@ -163,6 +163,14 @@ module OverSIP::SIP
|
|
163
163
|
end
|
164
164
|
end
|
165
165
|
|
166
|
+
# Close the connection from which the SIP request/response has been
|
167
|
+
# received.
|
168
|
+
def close_connection
|
169
|
+
return false if @transport == :udp
|
170
|
+
@connection.close_connection
|
171
|
+
true
|
172
|
+
end
|
173
|
+
|
166
174
|
end # class Message
|
167
175
|
|
168
176
|
end
|
@@ -73,8 +73,8 @@ module OverSIP::SIP
|
|
73
73
|
|
74
74
|
|
75
75
|
def process_request
|
76
|
-
#
|
77
|
-
# a CANCEL or an ACK for a final non-2XX response).
|
76
|
+
# Run the user provided OverSIP::SipEvents.on_request() callback (unless the request
|
77
|
+
# it's a retransmission, a CANCEL or an ACK for a final non-2XX response).
|
78
78
|
unless check_transaction
|
79
79
|
begin
|
80
80
|
# Create the antiloop identifier for this request.
|
@@ -90,7 +90,7 @@ module OverSIP::SIP
|
|
90
90
|
@msg.tvars = {}
|
91
91
|
@msg.cvars = @cvars
|
92
92
|
|
93
|
-
# Run the
|
93
|
+
# Run the callback.
|
94
94
|
::OverSIP::SipEvents.on_request @msg
|
95
95
|
rescue ::Exception => e
|
96
96
|
log_system_error "error calling OverSIP::WebSocketEvents.on_request() => 500:"
|
@@ -33,17 +33,6 @@ module OverSIP::SIP
|
|
33
33
|
end
|
34
34
|
|
35
35
|
|
36
|
-
# Returns a Proxy instance. The user MUST call route() and optionally set the callbacks
|
37
|
-
# before calling route().
|
38
|
-
def proxy proxy_name=:default_proxy
|
39
|
-
if (proxy_conf = ::OverSIP.proxies[proxy_name.to_sym])
|
40
|
-
::OverSIP::SIP::Proxy.new self, proxy_conf
|
41
|
-
else
|
42
|
-
raise ::OverSIP::LogicError, "proxy '#{proxy_name}' is not defined"
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
|
47
36
|
def loose_route
|
48
37
|
num_removes = 0
|
49
38
|
has_preloaded_route_with_ob_param = false
|
@@ -11,7 +11,7 @@ module OverSIP::SIP
|
|
11
11
|
|
12
12
|
def self.add_outbound_to_contact request
|
13
13
|
unless request.sip_method == :REGISTER
|
14
|
-
raise ::OverSIP::
|
14
|
+
raise ::OverSIP::RuntimeError, "request must be a REGISTER"
|
15
15
|
end
|
16
16
|
|
17
17
|
if request.contact and request.connection_outbound_flow_token
|
@@ -52,7 +52,7 @@ module OverSIP::SIP
|
|
52
52
|
|
53
53
|
def self.remove_outbound_from_contact message
|
54
54
|
unless message.is_a? ::OverSIP::SIP::Message
|
55
|
-
raise ::OverSIP::
|
55
|
+
raise ::OverSIP::RuntimeError, "message must be a OverSIP::SIP::Request or OverSIP::SIP::Response"
|
56
56
|
end
|
57
57
|
|
58
58
|
if (contacts = message.headers["Contact"])
|
@@ -16,7 +16,7 @@ module OverSIP::SIP
|
|
16
16
|
when ::OverSIP::SIP::Response
|
17
17
|
request = message.request
|
18
18
|
else
|
19
|
-
raise ::OverSIP::
|
19
|
+
raise ::OverSIP::RuntimeError, "message must be a OverSIP::SIP::Request or OverSIP::SIP::Response"
|
20
20
|
end
|
21
21
|
|
22
22
|
# Don't do this stuf for UDP or for outbound connections.
|
@@ -38,7 +38,7 @@ module OverSIP::SIP
|
|
38
38
|
when ::OverSIP::SIP::Response
|
39
39
|
request = message.request
|
40
40
|
else
|
41
|
-
raise ::OverSIP::
|
41
|
+
raise ::OverSIP::RuntimeError, "message must be a OverSIP::SIP::Request or OverSIP::SIP::Response"
|
42
42
|
end
|
43
43
|
|
44
44
|
request.connection.asserted_user = false
|
data/lib/oversip/sip/proxy.rb
CHANGED
@@ -4,25 +4,11 @@ module OverSIP::SIP
|
|
4
4
|
|
5
5
|
include ::OverSIP::Logger
|
6
6
|
|
7
|
-
def initialize
|
8
|
-
@
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
# Create the server transaction if it doesn't exist yet.
|
13
|
-
@server_transaction = @request.server_transaction or case @request.sip_method
|
14
|
-
# Here it can arrive an INVITE, ACK-for-2XX and any method but CANCEL.
|
15
|
-
when :INVITE
|
16
|
-
InviteServerTransaction.new @request
|
17
|
-
when :ACK
|
18
|
-
else
|
19
|
-
NonInviteServerTransaction.new @request
|
20
|
-
end
|
21
|
-
@request.server_transaction ||= @server_transaction
|
22
|
-
|
23
|
-
# Set this core layer to the server transaction.
|
24
|
-
@request.server_transaction.core = self if @request.server_transaction
|
25
|
-
end # initialize
|
7
|
+
def initialize proxy_name=:default_proxy
|
8
|
+
unless (@proxy_conf = ::OverSIP.proxies[proxy_name.to_sym])
|
9
|
+
raise ::OverSIP::RuntimeError, "proxy '#{proxy_name}' is not defined in Proxies Configuration file"
|
10
|
+
end
|
11
|
+
end
|
26
12
|
|
27
13
|
|
28
14
|
def on_provisional_response &block
|
@@ -55,7 +41,27 @@ module OverSIP::SIP
|
|
55
41
|
end
|
56
42
|
|
57
43
|
|
58
|
-
def route dst_host=nil, dst_port=nil, dst_transport=nil
|
44
|
+
def route request, dst_host=nil, dst_port=nil, dst_transport=nil
|
45
|
+
unless (@request = request).is_a? ::OverSIP::SIP::Request
|
46
|
+
raise ::OverSIP::RuntimeError, "request must be a OverSIP::SIP::Request instance"
|
47
|
+
end
|
48
|
+
|
49
|
+
@log_id = "Proxy #{@proxy_conf[:name]} #{@request.via_branch_id}"
|
50
|
+
|
51
|
+
# Create the server transaction if it doesn't exist yet.
|
52
|
+
@server_transaction = @request.server_transaction or case @request.sip_method
|
53
|
+
# Here it can arrive an INVITE, ACK-for-2XX and any method but CANCEL.
|
54
|
+
when :INVITE
|
55
|
+
InviteServerTransaction.new @request
|
56
|
+
when :ACK
|
57
|
+
else
|
58
|
+
NonInviteServerTransaction.new @request
|
59
|
+
end
|
60
|
+
@request.server_transaction ||= @server_transaction
|
61
|
+
|
62
|
+
# Set this core layer to the server transaction.
|
63
|
+
@request.server_transaction.core = self if @request.server_transaction
|
64
|
+
|
59
65
|
# NOTE: Routing can be based on incoming request for an Outbound (RFC 5626) connection
|
60
66
|
# or based on normal RFC 3263 procedures.
|
61
67
|
|
@@ -179,7 +185,7 @@ module OverSIP::SIP
|
|
179
185
|
|
180
186
|
|
181
187
|
def receive_response response
|
182
|
-
log_system_debug "received response #{response.status_code}"
|
188
|
+
log_system_debug "received response #{response.status_code}" if $oversip_debug
|
183
189
|
|
184
190
|
response.delete_header_top "Via"
|
185
191
|
|
@@ -0,0 +1,58 @@
|
|
1
|
+
module OverSIP
|
2
|
+
|
3
|
+
module Syslog
|
4
|
+
|
5
|
+
SYSLOG_FACILITY_MAPPING = {
|
6
|
+
"kern" => ::Syslog::LOG_KERN,
|
7
|
+
"user" => ::Syslog::LOG_USER,
|
8
|
+
"daemon" => ::Syslog::LOG_DAEMON,
|
9
|
+
"local0" => ::Syslog::LOG_LOCAL0,
|
10
|
+
"local1" => ::Syslog::LOG_LOCAL1,
|
11
|
+
"local2" => ::Syslog::LOG_LOCAL2,
|
12
|
+
"local3" => ::Syslog::LOG_LOCAL3,
|
13
|
+
"local4" => ::Syslog::LOG_LOCAL4,
|
14
|
+
"local5" => ::Syslog::LOG_LOCAL5,
|
15
|
+
"local6" => ::Syslog::LOG_LOCAL6,
|
16
|
+
"local7" => ::Syslog::LOG_LOCAL7
|
17
|
+
}
|
18
|
+
|
19
|
+
SYSLOG_SEVERITY_MAPPING = {
|
20
|
+
"debug" => 0,
|
21
|
+
"info" => 1,
|
22
|
+
"notice" => 2,
|
23
|
+
"warn" => 3,
|
24
|
+
"error" => 4,
|
25
|
+
"crit" => 5,
|
26
|
+
"alert" => 6,
|
27
|
+
"emerg" => 7
|
28
|
+
}
|
29
|
+
|
30
|
+
def self.log string
|
31
|
+
level = string.getbyte 0
|
32
|
+
msg = string[1..-1].gsub(/%/,"%%").gsub(/\x00/,"")
|
33
|
+
|
34
|
+
case level
|
35
|
+
when 48 # "0" =>DEBUG
|
36
|
+
::Syslog.debug sprintf("%7s %s", "DEBUG:", msg)
|
37
|
+
when 49 # "1" => INFO
|
38
|
+
::Syslog.info sprintf("%7s %s", "INFO:", msg)
|
39
|
+
when 50 # "2" => NOTICE
|
40
|
+
::Syslog.notice sprintf("%7s %s", "NOTICE:", msg)
|
41
|
+
when 51 # "3" => WARN
|
42
|
+
::Syslog.warning sprintf("%7s %s", "WARN:", msg)
|
43
|
+
when 52 # "4" => ERR
|
44
|
+
::Syslog.err sprintf("%7s %s", "ERROR:", msg)
|
45
|
+
when 53 # "5" => CRIT
|
46
|
+
::Syslog.crit sprintf("%7s %s", "CRIT:", msg)
|
47
|
+
when 54 # "6" => ALERT
|
48
|
+
::Syslog.alert sprintf("%7s %s", "ALERT:", msg)
|
49
|
+
when 55 # "7" => EMERG
|
50
|
+
::Syslog.emerg sprintf("%7s %s", "EMERG:", msg)
|
51
|
+
else # Shouldn't occur.
|
52
|
+
::Syslog.err sprintf("%7s %s", "UNKNOWN:", msg)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
@@ -1,8 +1,3 @@
|
|
1
|
-
# Ruby built-in libraries.
|
2
|
-
|
3
|
-
require "syslog"
|
4
|
-
|
5
|
-
|
6
1
|
# Ruby external gems.
|
7
2
|
|
8
3
|
gem "eventmachine-le", ">= 1.1.2"
|
@@ -21,46 +16,10 @@ module OverSIP
|
|
21
16
|
|
22
17
|
module SysLoggerProcess
|
23
18
|
|
24
|
-
SYSLOG_FACILITY_MAPPING = {
|
25
|
-
"kern" => ::Syslog::LOG_KERN,
|
26
|
-
"user" => ::Syslog::LOG_USER,
|
27
|
-
"daemon" => ::Syslog::LOG_DAEMON,
|
28
|
-
"local0" => ::Syslog::LOG_LOCAL0,
|
29
|
-
"local1" => ::Syslog::LOG_LOCAL1,
|
30
|
-
"local2" => ::Syslog::LOG_LOCAL2,
|
31
|
-
"local3" => ::Syslog::LOG_LOCAL3,
|
32
|
-
"local4" => ::Syslog::LOG_LOCAL4,
|
33
|
-
"local5" => ::Syslog::LOG_LOCAL5,
|
34
|
-
"local6" => ::Syslog::LOG_LOCAL6,
|
35
|
-
"local7" => ::Syslog::LOG_LOCAL7
|
36
|
-
}
|
37
|
-
|
38
19
|
class SysLoggerWatcher < ::EM::PosixMQ::Watcher
|
39
20
|
|
40
21
|
def receive_message string, priority
|
41
|
-
|
42
|
-
msg = string[1..-1].gsub(/%/,"%%").gsub(/\x00/,"")
|
43
|
-
|
44
|
-
case level
|
45
|
-
when 48 # "0" =>DEBUG
|
46
|
-
::Syslog.debug sprintf("%7s %s", "DEBUG:", msg)
|
47
|
-
when 49 # "1" => INFO
|
48
|
-
::Syslog.info sprintf("%7s %s", "INFO:", msg)
|
49
|
-
when 50 # "2" => NOTICE
|
50
|
-
::Syslog.notice sprintf("%7s %s", "NOTICE:", msg)
|
51
|
-
when 51 # "3" => WARN
|
52
|
-
::Syslog.warning sprintf("%7s %s", "WARN:", msg)
|
53
|
-
when 52 # "4" => ERR
|
54
|
-
::Syslog.err sprintf("%7s %s", "ERROR:", msg)
|
55
|
-
when 53 # "5" => CRIT
|
56
|
-
::Syslog.crit sprintf("%7s %s", "CRIT:", msg)
|
57
|
-
when 54 # "6" => ALERT
|
58
|
-
::Syslog.alert sprintf("%7s %s", "ALERT:", msg)
|
59
|
-
when 55 # "7" => EMERG
|
60
|
-
::Syslog.emerg sprintf("%7s %s", "EMERG:", msg)
|
61
|
-
else # Shouldn't occur.
|
62
|
-
::Syslog.err sprintf("%7s %s", "UNKNOWN:", msg)
|
63
|
-
end
|
22
|
+
::OverSIP::Syslog.log string
|
64
23
|
end
|
65
24
|
|
66
25
|
end # class SysLoggerWatcher
|
@@ -68,8 +27,12 @@ module OverSIP
|
|
68
27
|
def self.run options={}
|
69
28
|
$0 = ::OverSIP.master_name + "_syslogger"
|
70
29
|
|
30
|
+
# Close Ruby Syslog open in the main process before forking.
|
31
|
+
::Syslog.close
|
32
|
+
|
33
|
+
# Run a new Ruby Syslog.
|
71
34
|
syslog_options = ::Syslog::LOG_PID | ::Syslog::LOG_NDELAY
|
72
|
-
syslog_facility = SYSLOG_FACILITY_MAPPING[::OverSIP.configuration[:core][:syslog_facility]]
|
35
|
+
syslog_facility = ::OverSIP::Syslog::SYSLOG_FACILITY_MAPPING[::OverSIP.configuration[:core][:syslog_facility]]
|
73
36
|
::Syslog.open(::OverSIP.master_name, syslog_options, syslog_facility)
|
74
37
|
|
75
38
|
ppid = ::Process.ppid
|
@@ -87,7 +50,7 @@ module OverSIP
|
|
87
50
|
# Change process permissions if requested.
|
88
51
|
::OverSIP::Launcher.set_user_group(options[:user], options[:group])
|
89
52
|
|
90
|
-
rescue => e
|
53
|
+
rescue ::Exception => e
|
91
54
|
::Syslog.crit sprintf("%7s %s", "CRIT:", "<syslogger> #{e.class}: #{e}")
|
92
55
|
::Syslog.crit sprintf("%7s %s", "CRIT:", "<syslogger> syslogger process terminated")
|
93
56
|
exit! 1
|
data/lib/oversip/version.rb
CHANGED
@@ -20,6 +20,7 @@ module OverSIP::WebSocket
|
|
20
20
|
attr_accessor :ws_protocol, :ws_app_klass
|
21
21
|
attr_reader :connection_log_id, :remote_ip_type, :remote_ip, :remote_port
|
22
22
|
attr_reader :cvars # A Hash for storing user provided data.
|
23
|
+
attr_accessor :ws_locally_closed
|
23
24
|
|
24
25
|
|
25
26
|
def initialize
|
@@ -72,7 +73,7 @@ module OverSIP::WebSocket
|
|
72
73
|
|
73
74
|
if @ws_handshake_done
|
74
75
|
begin
|
75
|
-
::OverSIP::WebSocketEvents.on_connection_closed self
|
76
|
+
::OverSIP::WebSocketEvents.on_connection_closed self, !@ws_locally_closed
|
76
77
|
rescue ::Exception => e
|
77
78
|
log_system_error "error calling OverSIP::WebSocketEvents.on_connection_closed():"
|
78
79
|
log_system_error e
|
@@ -535,7 +535,7 @@ module OverSIP::WebSocket
|
|
535
535
|
end
|
536
536
|
|
537
537
|
unless in_reply_to_close
|
538
|
-
|
538
|
+
log_system_debug "sending close frame: status=#{status.inspect}, reason=#{reason.inspect}" if $oversip_debug
|
539
539
|
else
|
540
540
|
log_system_debug "sending reply close frame: status=#{status.inspect}, reason=#{reason.inspect}" if $oversip_debug
|
541
541
|
end
|
@@ -572,15 +572,21 @@ module OverSIP::WebSocket
|
|
572
572
|
@connection.ignore_incoming_data
|
573
573
|
@connection.send_data frame
|
574
574
|
|
575
|
-
|
575
|
+
# NOTE: Don't do it since it "seems" that the connection has been closed
|
576
|
+
# by the client.
|
577
|
+
#unless in_reply_to_close
|
576
578
|
# Let's some time for the client to send us a close frame (it will
|
577
579
|
# be ignored anyway) before closing the TCP connection.
|
578
|
-
|
579
|
-
|
580
|
-
|
581
|
-
|
582
|
-
|
583
|
-
|
580
|
+
# NOTE: Don't do it since it "seems" that the connection has been closed
|
581
|
+
# by the client.
|
582
|
+
#::EM.add_timer(0.2) do
|
583
|
+
#@connection.close_connection_after_writing
|
584
|
+
#end
|
585
|
+
#else
|
586
|
+
#@connection.close_connection_after_writing
|
587
|
+
#end
|
588
|
+
|
589
|
+
@connection.close_connection_after_writing
|
584
590
|
true
|
585
591
|
end
|
586
592
|
|
data/lib/oversip.rb
CHANGED
@@ -12,11 +12,13 @@ require "tempfile"
|
|
12
12
|
|
13
13
|
require "term/ansicolor"
|
14
14
|
require "posix_mq"
|
15
|
+
require "syslog"
|
15
16
|
|
16
17
|
|
17
18
|
# OverSIP files.
|
18
19
|
|
19
20
|
require "oversip/version.rb"
|
21
|
+
require "oversip/syslog.rb"
|
20
22
|
require "oversip/logger.rb"
|
21
23
|
require "oversip/config.rb"
|
22
24
|
require "oversip/config_validators.rb"
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: oversip
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.1.0.
|
4
|
+
version: 1.1.0.beta3
|
5
5
|
prerelease: 6
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-08-
|
12
|
+
date: 2012-08-06 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: eventmachine-le
|
16
|
-
requirement: &
|
16
|
+
requirement: &18084900 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: 1.1.2
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *18084900
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: iobuffer
|
27
|
-
requirement: &
|
27
|
+
requirement: &18084440 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: 1.1.2
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *18084440
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: em-posixmq
|
38
|
-
requirement: &
|
38
|
+
requirement: &18083980 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: 0.2.3
|
44
44
|
type: :runtime
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *18083980
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: em-udns
|
49
|
-
requirement: &
|
49
|
+
requirement: &18099900 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ! '>='
|
@@ -54,10 +54,10 @@ dependencies:
|
|
54
54
|
version: 0.3.6
|
55
55
|
type: :runtime
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *18099900
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: escape_utils
|
60
|
-
requirement: &
|
60
|
+
requirement: &18099440 !ruby/object:Gem::Requirement
|
61
61
|
none: false
|
62
62
|
requirements:
|
63
63
|
- - ! '>='
|
@@ -65,10 +65,10 @@ dependencies:
|
|
65
65
|
version: 0.2.4
|
66
66
|
type: :runtime
|
67
67
|
prerelease: false
|
68
|
-
version_requirements: *
|
68
|
+
version_requirements: *18099440
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: term-ansicolor
|
71
|
-
requirement: &
|
71
|
+
requirement: &18099060 !ruby/object:Gem::Requirement
|
72
72
|
none: false
|
73
73
|
requirements:
|
74
74
|
- - ! '>='
|
@@ -76,10 +76,10 @@ dependencies:
|
|
76
76
|
version: '0'
|
77
77
|
type: :runtime
|
78
78
|
prerelease: false
|
79
|
-
version_requirements: *
|
79
|
+
version_requirements: *18099060
|
80
80
|
- !ruby/object:Gem::Dependency
|
81
81
|
name: posix-spawn
|
82
|
-
requirement: &
|
82
|
+
requirement: &18098520 !ruby/object:Gem::Requirement
|
83
83
|
none: false
|
84
84
|
requirements:
|
85
85
|
- - ! '>='
|
@@ -87,10 +87,10 @@ dependencies:
|
|
87
87
|
version: 0.3.6
|
88
88
|
type: :runtime
|
89
89
|
prerelease: false
|
90
|
-
version_requirements: *
|
90
|
+
version_requirements: *18098520
|
91
91
|
- !ruby/object:Gem::Dependency
|
92
92
|
name: rake
|
93
|
-
requirement: &
|
93
|
+
requirement: &18098020 !ruby/object:Gem::Requirement
|
94
94
|
none: false
|
95
95
|
requirements:
|
96
96
|
- - ~>
|
@@ -98,7 +98,7 @@ dependencies:
|
|
98
98
|
version: 0.9.2
|
99
99
|
type: :development
|
100
100
|
prerelease: false
|
101
|
-
version_requirements: *
|
101
|
+
version_requirements: *18098020
|
102
102
|
description: ! "OverSIP is an async SIP server. Built on top of Ruby EventMachine\n
|
103
103
|
\ library it follows the Reactor Pattern, allowing thousands of concurrent connections
|
104
104
|
and requests\n handled by a single processor in a never-blocking fashion. It
|
@@ -120,6 +120,7 @@ files:
|
|
120
120
|
- lib/oversip/posix_mq.rb
|
121
121
|
- lib/oversip/proxies_config.rb
|
122
122
|
- lib/oversip/utils.rb
|
123
|
+
- lib/oversip/syslog.rb
|
123
124
|
- lib/oversip/errors.rb
|
124
125
|
- lib/oversip/master_process.rb
|
125
126
|
- lib/oversip/default_server.rb
|