oversip 1.0.6.beta3 → 1.0.7.beta1

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/etc/system_events.rb CHANGED
@@ -15,4 +15,11 @@ module OverSIP::SystemEvents
15
15
  # Do something.
16
16
  end
17
17
 
18
+ # This method is called when a USR1 signal is received by the main
19
+ # process and allows the user to set custom code to be executed
20
+ # or reloaded.
21
+ def self.on_user_reload
22
+ # Do something.
23
+ end
24
+
18
25
  end
@@ -13,17 +13,17 @@ module OverSIP::WebSocket::Policy
13
13
 
14
14
  # Check the value of the Host header, by splitting it into
15
15
  # host (a String) and port (Fixnum). Both could be _nil_.
16
- def check_hostport host=nil, port=nil
16
+ def self.check_hostport host=nil, port=nil
17
17
  return true
18
18
  end
19
19
 
20
20
  # Check the value of the Origin header (a String with original value).
21
- def check_origin origin=nil
21
+ def self.check_origin origin=nil
22
22
  return true
23
23
  end
24
24
 
25
25
  # Check the request URI path (String) and query (String). Both can be _nil_.
26
- def check_request_uri path=nil, query=nil
26
+ def self.check_request_uri path=nil, query=nil
27
27
  return true
28
28
  end
29
29
 
@@ -240,7 +240,15 @@ module OverSIP
240
240
  end
241
241
 
242
242
  ::OverSIP.configuration = @configuration
243
- ::OverSIP::ProxiesConfig.load proxies_yaml
243
+
244
+ begin
245
+ ::OverSIP::ProxiesConfig.load proxies_yaml
246
+ rescue ::OverSIP::ConfigurationError => e
247
+ fatal "error loading Proxies Configuration file '#{@proxies_file}': #{e.message}"
248
+ rescue ::Exception => e
249
+ log_system_crit "error loading Proxies Configuration file '#{@proxies_file}':"
250
+ fatal e
251
+ end
244
252
  end
245
253
 
246
254
 
@@ -564,15 +572,50 @@ module OverSIP
564
572
  end
565
573
  end
566
574
 
567
- def self.reload
575
+ def self.system_reload
576
+ log_system_notice "reloading OverSIP..."
577
+
578
+ begin
579
+ ::Kernel.load @custom_lib_file
580
+ log_system_notice "Custom Library file '#{@custom_lib_file}' reloaded"
581
+ rescue ::Exception => e
582
+ log_system_crit "error reloading Custom Library file '#{@custom_lib_file}':"
583
+ log_system_crit e
584
+ end
585
+
586
+ begin
587
+ ::Kernel.load @system_events_file
588
+ log_system_notice "System Events file '#{@system_events_file}' reloaded"
589
+ rescue ::Exception => e
590
+ log_system_crit "error reloading System Events file '#{@system_events_file}':"
591
+ log_system_crit e
592
+ end
593
+
594
+ begin
595
+ ::Kernel.load @events_file
596
+ log_system_notice "Events file '#{@events_file}' reloaded"
597
+ rescue ::Exception => e
598
+ log_system_crit "error reloading Events file '#{@events_file}':"
599
+ log_system_crit e
600
+ end
601
+
602
+ begin
603
+ proxies_yaml = ::YAML.load_file @proxies_file
604
+ ::OverSIP::ProxiesConfig.load proxies_yaml, reload=true
605
+ log_system_notice "Proxies Configuration file '#{@proxies_file}' reloaded"
606
+ rescue ::OverSIP::ConfigurationError => e
607
+ log_system_crit "error reloading Proxies Configuration file '#{@proxies_file}': #{e.message}"
608
+ rescue ::Exception => e
609
+ log_system_crit "error reloading Proxies Configuration file '#{@proxies_file}':"
610
+ log_system_crit e
611
+ end
612
+
568
613
  begin
569
614
  ::Kernel.load @logic_file
570
- log_system_info "logic reloaded"
571
- true
615
+ log_system_notice "Logic file '#{@logic_file}' reloaded"
572
616
  rescue ::Exception => e
573
- log_system_crit "error reloading logic"
617
+ log_system_crit "error reloading Logic file '#{@logic_file}':"
574
618
  log_system_crit e
575
- false
576
619
  end
577
620
  end
578
621
 
@@ -1,6 +1,6 @@
1
1
  module OverSIP
2
2
 
3
- class Error < StandardError ; end
3
+ class Error < ::StandardError ; end
4
4
  class ConfigurationError < Error ; end
5
5
  class LogicError < Error ; end
6
6
 
@@ -418,7 +418,7 @@ module OverSIP::Launcher
418
418
  end
419
419
 
420
420
  # Signals that must be ignored.
421
- ignore_signals = [:ALRM, :INT, :PIPE, :POLL, :PROF, :USR1, :USR2, :VTALRM, :WINCH]
421
+ ignore_signals = [:ALRM, :INT, :PIPE, :POLL, :PROF, :USR2, :WINCH]
422
422
  ignore_signals.each do |signal|
423
423
  begin
424
424
  trap signal do
@@ -429,11 +429,26 @@ module OverSIP::Launcher
429
429
  end
430
430
  end
431
431
 
432
- # Signal HUP reloads logic.
433
- # TODO: Reload proxies (so purge DNS cache in all of them), reload websocket policy.
432
+ # Special treatment for VTALRM signal (TODO: since it occurs too much).
433
+ trap :VTALRM do
434
+ end
435
+
436
+ # Signal HUP reloads OverSIP system configuration.
434
437
  trap :HUP do
435
- log_system_info "HUP signal received, reloading"
436
- ::OverSIP::Config.reload
438
+ log_system_notice "HUP signal received, reloading configuration files..."
439
+ ::OverSIP::Config.system_reload
440
+ end
441
+
442
+ # Signal USR1 reloads custom code provided by the user.
443
+ trap :USR1 do
444
+ log_system_notice "USR1 signal received, calling user provided OverSIP::SystemEvents.on_user_reload() callback..."
445
+ # Run the user provided on_started callback.
446
+ begin
447
+ ::OverSIP::SystemEvents.on_user_reload
448
+ rescue ::Exception => e
449
+ log_system_crit "error calling user provided OverSIP::SystemEvents.on_user_reload() callback:"
450
+ log_system_crit e
451
+ end
437
452
  end
438
453
 
439
454
  # Signal CHLD is sent by syslogger process if it dies.
@@ -9,8 +9,6 @@ module OverSIP
9
9
  @log_id ||= "ProxiesConfig"
10
10
  end
11
11
 
12
- @proxies = {}
13
-
14
12
  @proxy_configuration = {
15
13
  :do_loose_routing => true,
16
14
  :use_dns => true,
@@ -45,51 +43,53 @@ module OverSIP
45
43
  :tls_validation => :boolean
46
44
  }
47
45
 
48
- def self.load proxies_yaml
49
- unless proxies_yaml.is_a? Hash
50
- fatal "invalid proxies configuration file, it is not a collection"
51
- end
52
-
46
+ def self.load proxies_yaml, reload=false
53
47
  begin
48
+ unless proxies_yaml.is_a? ::Hash
49
+ raise "invalid proxies configuration file, it is not a collection"
50
+ end
51
+
52
+ proxies = {}
53
+
54
54
  proxies_yaml.each do |proxy, conf|
55
- unless proxy.is_a? String
56
- fatal "proxy name is not a string (#{proxy.inspect})"
55
+ unless proxy.is_a? ::String
56
+ raise "proxy name is not a string (#{proxy.inspect})"
57
57
  end
58
58
 
59
- @proxies[proxy.to_sym] = @proxy_configuration.dup
60
- @proxies[proxy.to_sym].each do |parameter, default_value|
61
- @proxies[proxy.to_sym][parameter] = default_value.clone rescue default_value
59
+ proxies[proxy.to_sym] = @proxy_configuration.dup
60
+ proxies[proxy.to_sym].each do |parameter, default_value|
61
+ proxies[proxy.to_sym][parameter] = default_value.clone rescue default_value
62
62
  end
63
63
 
64
64
  PROXY_CONFIG_VALIDATIONS.each do |parameter, validations|
65
65
  values = proxies_yaml[proxy][parameter.to_s]
66
- validations = [ validations ] unless validations.is_a?(Array)
66
+ validations = [ validations ] unless validations.is_a?(::Array)
67
67
 
68
68
  if values == nil
69
69
  if validations.include? :required
70
- fatal "#{proxy}[#{parameter}] requires a value"
70
+ raise "#{proxy}[#{parameter}] requires a value"
71
71
  end
72
72
  next
73
73
  end
74
74
 
75
- if values.is_a? Array
75
+ if values.is_a? ::Array
76
76
  unless validations.include? :multi_value
77
- fatal "#{proxy}[#{parameter}] does not allow multiple values"
77
+ raise "#{proxy}[#{parameter}] does not allow multiple values"
78
78
  end
79
79
 
80
80
  if validations.include? :non_empty and values.empty?
81
- fatal "#{proxy}[#{parameter}] does not allow empty values"
81
+ raise "#{proxy}[#{parameter}] does not allow empty values"
82
82
  end
83
83
  end
84
84
 
85
- values = ( values.is_a?(Array) ? values : [ values ] )
85
+ values = ( values.is_a?(::Array) ? values : [ values ] )
86
86
 
87
87
  values.each do |value|
88
88
  validations.each do |validation|
89
89
 
90
- if validation.is_a? Symbol
90
+ if validation.is_a? ::Symbol
91
91
  args = []
92
- elsif validation.is_a? Array
92
+ elsif validation.is_a? ::Array
93
93
  args = validation[1..-1]
94
94
  validation = validation[0]
95
95
  end
@@ -97,24 +97,27 @@ module OverSIP
97
97
  next if [:required, :multi_value, :non_empty].include? validation
98
98
 
99
99
  unless send validation, value, *args
100
- fatal "#{proxy}[#{parameter}] has invalid value '#{::OverSIP::Config.humanize_value value}' (does not satisfy '#{validation}' validation requirement)"
100
+ raise "#{proxy}[#{parameter}] has invalid value '#{::OverSIP::Config.humanize_value value}' (does not satisfy '#{validation}' validation requirement)"
101
101
  end
102
102
  end
103
103
 
104
- @proxies[proxy.to_sym][parameter] = ( validations.include?(:multi_value) ? values : values[0] )
104
+ proxies[proxy.to_sym][parameter] = ( validations.include?(:multi_value) ? values : values[0] )
105
105
  end
106
106
 
107
107
  end # PROXY_CONFIG_VALIDATIONS[section].each
108
108
  end # proxies_yaml.each
109
109
 
110
- post_process
111
-
112
- rescue OverSIP::ConfigurationError => e
113
- fatal "proxies configuration error: #{e.message}"
114
- rescue => e
115
- fatal e
110
+ rescue ::Exception => e
111
+ unless reload
112
+ fatal e.message
113
+ else
114
+ raise ::OverSIP::ConfigurationError, e.message
115
+ end
116
116
  end
117
117
 
118
+ @proxies = proxies
119
+ post_process
120
+
118
121
  ::OverSIP.proxies = @proxies
119
122
  end
120
123
 
@@ -5,8 +5,8 @@ module OverSIP
5
5
  module Version
6
6
  MAJOR = 1
7
7
  MINOR = 0
8
- TINY = 6
9
- DEVEL = "beta3" # Set to nil for stable releases.
8
+ TINY = 7
9
+ DEVEL = "beta1" # Set to nil for stable releases.
10
10
  end
11
11
 
12
12
  PROGRAM_NAME = "OverSIP"
@@ -3,7 +3,6 @@ module OverSIP::WebSocket
3
3
  class TcpServer < ::EM::Connection
4
4
 
5
5
  include ::OverSIP::Logger
6
- include ::OverSIP::WebSocket::Policy
7
6
 
8
7
  # Max size (bytes) of the buffered data when receiving message headers
9
8
  # (avoid DoS attacks).
@@ -71,7 +70,7 @@ module OverSIP::WebSocket
71
70
 
72
71
  @ws_framing.tcp_closed if @ws_framing
73
72
 
74
- if @state == :websocket_frames
73
+ if @ws_handshake_done
75
74
  begin
76
75
  ::OverSIP::Events.on_websocket_connection_closed self
77
76
  rescue ::Exception => e
@@ -209,19 +208,19 @@ module OverSIP::WebSocket
209
208
 
210
209
  # Check WebSocket policy.
211
210
 
212
- unless check_hostport(@http_request.host, @http_request.port)
211
+ unless ::OverSIP::WebSocket::Policy.check_hostport(@http_request.host, @http_request.port)
213
212
  log_system_notice "host/port policy not satisfied (host=#{@http_request.host.inspect}, port=#{@http_request.port.inspect}) => 403"
214
213
  http_reject 403, "request host/port not satisfied"
215
214
  return false
216
215
  end
217
216
 
218
- unless check_origin(@http_request.hdr_origin)
217
+ unless ::OverSIP::WebSocket::Policy.check_origin(@http_request.hdr_origin)
219
218
  log_system_notice "'Origin' policy not satisfied (origin=#{@http_request.hdr_origin.inspect}) => 403"
220
219
  http_reject 403, "request 'Origin' not satisfied"
221
220
  return false
222
221
  end
223
222
 
224
- unless check_request_uri(@http_request.uri_path, @http_request.uri_query)
223
+ unless ::OverSIP::WebSocket::Policy.check_request_uri(@http_request.uri_path, @http_request.uri_query)
225
224
  log_system_notice "request URI path/query not satisfied (path=#{@http_request.uri_path.inspect}, query=#{@http_request.uri_query.inspect}) => 403"
226
225
  http_reject 403, "request URI path/query not satisfied"
227
226
  return false
@@ -242,7 +241,7 @@ module OverSIP::WebSocket
242
241
  return false
243
242
  end
244
243
 
245
- # The user provided callback could have reject the WS connection,, so
244
+ # The user provided callback could have reject the WS connection, so
246
245
  # check it not to reply a 101 after the reply sent by the user.
247
246
  if @state == :new_websocket_connection_callback
248
247
  @state = :accept_ws_handshake
@@ -276,6 +275,7 @@ module OverSIP::WebSocket
276
275
  @ws_framing = ::OverSIP::WebSocket::WsFraming.new(self, @buffer)
277
276
  @ws_framing.ws_app = @ws_app_klass.new(self, @ws_framing)
278
277
 
278
+ @ws_handshake_done = true
279
279
  @state = :websocket_frames
280
280
  true
281
281
  end
@@ -575,7 +575,7 @@ module OverSIP::WebSocket
575
575
  unless in_reply_to_close
576
576
  # Let's some time for the client to send us a close frame (it will
577
577
  # be ignored anyway) before closing the TCP connection.
578
- EM.add_timer(0.2) do
578
+ ::EM.add_timer(0.2) do
579
579
  @connection.close_connection_after_writing
580
580
  end
581
581
  else
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.0.6.beta3
4
+ version: 1.0.7.beta1
5
5
  prerelease: 6
6
6
  platform: ruby
7
7
  authors:
@@ -13,7 +13,7 @@ date: 2012-08-02 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: eventmachine-le
16
- requirement: &9845920 !ruby/object:Gem::Requirement
16
+ requirement: &19620160 !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: *9845920
24
+ version_requirements: *19620160
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: iobuffer
27
- requirement: &9845460 !ruby/object:Gem::Requirement
27
+ requirement: &19619700 !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: *9845460
35
+ version_requirements: *19619700
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: em-posixmq
38
- requirement: &9861360 !ruby/object:Gem::Requirement
38
+ requirement: &19619240 !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: *9861360
46
+ version_requirements: *19619240
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: em-udns
49
- requirement: &9860900 !ruby/object:Gem::Requirement
49
+ requirement: &19618780 !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: *9860900
57
+ version_requirements: *19618780
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: escape_utils
60
- requirement: &9860440 !ruby/object:Gem::Requirement
60
+ requirement: &19618320 !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: *9860440
68
+ version_requirements: *19618320
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: term-ansicolor
71
- requirement: &9860060 !ruby/object:Gem::Requirement
71
+ requirement: &19617940 !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: *9860060
79
+ version_requirements: *19617940
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: posix-spawn
82
- requirement: &9859520 !ruby/object:Gem::Requirement
82
+ requirement: &19617400 !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: *9859520
90
+ version_requirements: *19617400
91
91
  - !ruby/object:Gem::Dependency
92
92
  name: rake
93
- requirement: &9859020 !ruby/object:Gem::Requirement
93
+ requirement: &19616900 !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: *9859020
101
+ version_requirements: *19616900
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