oversip 1.1.0.beta3 → 1.1.0.beta4

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -1,5 +1,7 @@
1
1
  <a href="http://www.oversip.net"><img src="http://www-test.oversip.net/images/dev/oversip-banner.png"/></a>
2
2
 
3
+ [![Build Status](https://secure.travis-ci.org/versatica/OverSIP.png?branch=master)](http://travis-ci.org/versatica/OverSIP)
4
+
3
5
  **WEB UNDER CONSTRUCTION:** The code is stable and working. This web page and documentation is not... please wait a bit.
4
6
 
5
7
  OverSIP is an async SIP proxy/server programmable in Ruby language.
data/etc/server.rb CHANGED
@@ -50,6 +50,15 @@ end
50
50
  # end
51
51
 
52
52
 
53
+ # This method is called after OverSIP has been terminated. It's called
54
+ # with argument "error" which is _true_ in case OverSIP has died in an
55
+ # unexpected way.
56
+ #
57
+ # def (OverSIP::SystemEvents).on_terminated error
58
+ # [...]
59
+ # end
60
+
61
+
53
62
 
54
63
 
55
64
  ### OverSIP SIP Events:
@@ -642,7 +642,7 @@ static void header_param(VALUE parsed, enum header_field header_field, const cha
642
642
  TRACE();
643
643
  VALUE v;
644
644
  VALUE header_params;
645
-
645
+
646
646
  switch(header_field) {
647
647
  case header_field_via:
648
648
  if ((header_params = rb_ivar_get(parsed, id_via_params)) == Qnil) {
@@ -12,6 +12,11 @@ module OverSIP
12
12
  log_system_notice "on_user_reload() event is not defined"
13
13
  end
14
14
 
15
+ def self.on_terminated error
16
+ log_system_notice "on_terminated() event is not defined"
17
+ end
18
+
19
+
15
20
  end
16
21
 
17
22
  module SipEvents
@@ -8,6 +8,8 @@ module OverSIP::Launcher
8
8
 
9
9
 
10
10
  def self.daemonize!(options)
11
+ @log_id = "launcher (daemonize)"
12
+
11
13
  $stdin.reopen("/dev/null")
12
14
 
13
15
  # grandparent (launcher) : Reads pipe, exits when master is ready.
@@ -30,7 +32,7 @@ module OverSIP::Launcher
30
32
  # its PID.
31
33
  master_pid = nil
32
34
  begin
33
- ::Timeout::timeout(READY_PIPE_TIMEOUT/2) do
35
+ ::Timeout.timeout(READY_PIPE_TIMEOUT/2) do
34
36
  master_pid = rd.gets("\n").to_i rescue nil
35
37
  end
36
38
  rescue ::Timeout::Error
@@ -80,6 +82,8 @@ module OverSIP::Launcher
80
82
 
81
83
 
82
84
  def self.run(options)
85
+ @log_id = "launcher (run)"
86
+
83
87
  configuration = ::OverSIP.configuration
84
88
 
85
89
  # Store the master process PID.
@@ -94,7 +98,6 @@ module OverSIP::Launcher
94
98
  # I'm master process.
95
99
  if (syslogger_pid = fork) != nil
96
100
  ::OverSIP.syslogger_pid = syslogger_pid
97
- log_system_info "starting syslogger process (PID #{syslogger_pid})..."
98
101
  ::OverSIP::Logger.load_methods
99
102
 
100
103
  # Load all the libraries for the master process.
@@ -117,6 +120,8 @@ module OverSIP::Launcher
117
120
  exit
118
121
  end
119
122
 
123
+ @log_id = "launcher (master)"
124
+
120
125
  ::EM.run do
121
126
 
122
127
  log_system_info "using Ruby #{RUBY_VERSION}p#{RUBY_PATCHLEVEL} (#{RUBY_RELEASE_DATE} revision #{RUBY_REVISION}) [#{RUBY_PLATFORM}]"
@@ -402,10 +407,17 @@ module OverSIP::Launcher
402
407
 
403
408
 
404
409
  def self.trap_signals
405
- # This should never occur, but maybe if I've missed trapping a signal.
410
+ # This should never occur (unless some not trapped signal is received
411
+ # and causes Ruby to exit, or maybe the user called "exit()" within its
412
+ # custom code).
406
413
  at_exit do
407
- log_system_crit "exiting due to an unknown cause ($! = #{$!.inspect})..."
408
- terminate
414
+ if $!.is_a? ::SystemExit
415
+ log_system_notice "exiting due to SystemExit..."
416
+ terminate error=false
417
+ else
418
+ log_system_crit "exiting due to an unknown cause ($! = #{$!.inspect})..."
419
+ terminate error=true
420
+ end
409
421
  end
410
422
 
411
423
  # Signals that cause OverSIP to terminate.
@@ -413,7 +425,7 @@ module OverSIP::Launcher
413
425
  exit_signals.each do |signal|
414
426
  trap signal do
415
427
  log_system_notice "#{signal} signal received, exiting..."
416
- terminate
428
+ terminate error=false
417
429
  end
418
430
  end
419
431
 
@@ -459,22 +471,35 @@ module OverSIP::Launcher
459
471
  end
460
472
 
461
473
 
462
- def self.terminate error=false
474
+ def self.terminate error=false, fatal=false
475
+ unless fatal
476
+ # Run the user provided on_terminated callback.
477
+ log_system_info "calling OverSIP::SystemEvents.on_terminated()..."
478
+ begin
479
+ ::OverSIP::SystemEvents.on_terminated error
480
+ rescue ::Exception => e
481
+ log_system_crit "error calling OverSIP::SystemEvents.on_terminated():"
482
+ log_system_crit e
483
+ end
484
+ end
485
+
463
486
  unless error
464
487
  log_system_info "exiting, thank you for tasting #{::OverSIP::PROGRAM_NAME}"
465
488
  end
466
489
 
467
- # Kill Stud processes.
490
+ # Kill Stud processes and delete its temporal file with the full certificate.
468
491
  kill_stud_processes
492
+ ::File.delete ::OverSIP.configuration[:tls][:full_cert] rescue nil
469
493
 
470
494
  # Wait a bit so pending log messages in the Posix MQ can be queued.
471
495
  sleep 0.1
472
- delete_pid_file
473
496
  ::OverSIP::Logger.close
474
497
 
475
498
  # Fill the syslogger process.
476
499
  kill_syslogger_process
477
500
 
501
+ delete_pid_file
502
+
478
503
  # Exit by preventing any exception.
479
504
  exit!( error ? false : true )
480
505
  end
@@ -508,7 +533,7 @@ module OverSIP::Launcher
508
533
  uid = ::Etc.getpwnam(user).uid if user
509
534
  gid = ::Etc.getgrnam(group).gid if group
510
535
  if uid or gid
511
- if gid && ::Process.egid != gid
536
+ if gid and ::Process.egid != gid
512
537
  ::Process.initgroups(user, gid) if user
513
538
  ::Process::GID.change_privilege(gid)
514
539
  end
@@ -527,9 +552,10 @@ module OverSIP::Launcher
527
552
 
528
553
  bin_dir = ::File.join(::File.absolute_path(::File.dirname(__FILE__)), "../../bin/")
529
554
  stdout_file = "/tmp/stud.#{listen_ip}:#{listen_port}.out"
555
+ stderr_file = "/tmp/stud.#{listen_ip}:#{listen_port}.err"
530
556
 
531
557
  ::Dir.chdir(bin_dir) do
532
- pid = ::POSIX::Spawn.spawn "./oversip_stud #{stud_user_group} #{ssl_option} -f '#{listen_ip},#{listen_port}' -b '#{bg_ip},#{bg_port}' -n 2 -s --daemon --write-proxy #{::OverSIP.configuration[:tls][:full_cert]}", :out => stdout_file, :err => "/dev/null"
558
+ pid = ::POSIX::Spawn.spawn "./oversip_stud #{stud_user_group} #{ssl_option} -f '#{listen_ip},#{listen_port}' -b '#{bg_ip},#{bg_port}' -n 2 -s --daemon --write-proxy #{::OverSIP.configuration[:tls][:full_cert]}", :out => stdout_file, :err => stderr_file
533
559
  ::Process.waitpid(pid)
534
560
  end
535
561
 
@@ -546,8 +572,12 @@ module OverSIP::Launcher
546
572
  ::File.delete stdout_file rescue nil
547
573
 
548
574
  unless pid
549
- fatal "error spawning stud server"
575
+ stderr = ::File.read stderr_file
576
+ ::File.delete stderr_file rescue nil
577
+ log_system_crit "error spawning stud server for listening on #{listen_ip} : #{listen_port}:"
578
+ fatal stderr
550
579
  end
580
+ ::File.delete stderr_file rescue nil
551
581
 
552
582
  ::OverSIP.stud_pids ||= []
553
583
  ::OverSIP.stud_pids << pid
@@ -115,7 +115,7 @@ module OverSIP
115
115
  log_system_crit msg
116
116
  log_system_crit "exiting with error status"
117
117
 
118
- ::OverSIP::Launcher.terminate error=true
118
+ ::OverSIP::Launcher.terminate error=true, fatal=true
119
119
  end
120
120
  end
121
121
 
@@ -62,7 +62,7 @@ module OverSIP::SIP
62
62
  client_transaction.connection_failed
63
63
  end
64
64
  @pending_client_transactions.clear
65
- end
65
+ end unless $!
66
66
 
67
67
  @connected = false
68
68
  end
@@ -65,7 +65,7 @@ module OverSIP::SIP
65
65
  log_msg << ( @local_closed ? "locally closed" : "remotely closed" )
66
66
  log_msg << " (cause: #{cause.inspect})" if cause
67
67
  log_system_debug log_msg
68
- end
68
+ end unless $!
69
69
  end
70
70
 
71
71
  end
@@ -55,7 +55,7 @@ module OverSIP::SIP
55
55
  log_msg << ( @local_closed ? "locally closed" : "remotely closed" )
56
56
  log_msg << " (cause: #{cause.inspect})" if cause
57
57
  log_system_debug log_msg
58
- end
58
+ end unless $!
59
59
  end
60
60
 
61
61
  end
@@ -203,7 +203,9 @@ module OverSIP::SIP
203
203
 
204
204
 
205
205
  def unbind cause=nil
206
- log_system_crit "UDP socket closed!!! cause: #{cause.inspect}"
206
+ unless $!
207
+ log_system_crit "UDP socket closed!!! cause: #{cause.inspect}"
208
+ end
207
209
  end
208
210
 
209
211
  end # class UdpReactor
@@ -19,11 +19,11 @@ module OverSIP::SIP
19
19
 
20
20
  # Add the ;ov-ob param to the Contact URI.
21
21
  request.contact.set_param "ov-ob", request.connection_outbound_flow_token
22
+ # NOTE: request.contact_params is a String with the original Contact URI params
23
+ # so they are added at the end of the new URI with the added ;ov-ob param.
22
24
  # TODO: This should be done automatically, right?
23
25
  request.set_header "Contact", "#{request.contact.to_s}#{request.contact_params}"
24
-
25
26
  return true
26
-
27
27
  else
28
28
  return false
29
29
  end
@@ -31,9 +31,9 @@ module OverSIP::SIP
31
31
 
32
32
  def self.extract_outbound_from_ruri request
33
33
  # Do nothing if the request already contains a Route header with the Outbound flow token (so
34
- # the registrar *does* support Path.
34
+ # the registrar *does* support Path).
35
35
  unless request.incoming_outbound_requested?
36
- if ov_ob = request.ruri.del_param("ov-ob")
36
+ if (ov_ob = request.ruri.del_param("ov-ob"))
37
37
  log_system_debug "incoming Outbound flow token extracted from ;ov-ob param in RURI for #{request.log_id}" if $oversip_debug
38
38
  request.route_outbound_flow_token = ov_ob
39
39
  request.incoming_outbound_requested = true
@@ -42,7 +42,7 @@ module OverSIP::SIP
42
42
  return false
43
43
  end
44
44
 
45
- else
45
+ else
46
46
  # If the request already contains a proper Outbound Route header, then at least try to remove
47
47
  # the ;ov-ob param from the RURI.
48
48
  request.ruri.del_param("ov-ob")
@@ -57,13 +57,10 @@ module OverSIP::SIP
57
57
 
58
58
  if (contacts = message.headers["Contact"])
59
59
  log_system_debug "reverting original Contact value (removing ;ov-ob Outbound param) for response" if $oversip_debug
60
-
61
60
  contacts.each do |contact|
62
61
  contact.gsub! /;ov-ob=[_\-0-9A-Za-z]+/, ""
63
62
  end
64
-
65
63
  return true
66
-
67
64
  else
68
65
  return false
69
66
  end
@@ -1,9 +1,5 @@
1
1
  module OverSIP::SIP
2
2
 
3
- # This hash contains the proxies defined by the user. It will be filled after loading the
4
- # configuration (proxies.conf file).
5
- PROXIES = {}
6
-
7
3
  def self.module_init
8
4
  conf = ::OverSIP.configuration
9
5
 
@@ -6,7 +6,7 @@ module OverSIP
6
6
  MAJOR = 1
7
7
  MINOR = 1
8
8
  TINY = 0
9
- DEVEL = "beta3" # Set to nil for stable releases.
9
+ DEVEL = "beta4" # Set to nil for stable releases.
10
10
  end
11
11
 
12
12
  PROGRAM_NAME = "OverSIP"
@@ -64,10 +64,12 @@ module OverSIP::WebSocket
64
64
  def unbind cause=nil
65
65
  @local_closed = true if cause == ::Errno::ETIMEDOUT
66
66
 
67
- log_msg = "connection from #{remote_desc} "
68
- log_msg << ( @local_closed ? "locally closed" : "remotely closed" )
69
- log_msg << " (cause: #{cause.inspect})" if cause
70
- log_system_debug log_msg if $oversip_debug
67
+ if $oversip_debug
68
+ log_msg = "connection from #{remote_desc} "
69
+ log_msg << ( @local_closed ? "locally closed" : "remotely closed" )
70
+ log_msg << " (cause: #{cause.inspect})" if cause
71
+ log_system_debug log_msg
72
+ end unless $!
71
73
 
72
74
  @ws_framing.tcp_closed if @ws_framing
73
75
 
@@ -78,7 +80,7 @@ module OverSIP::WebSocket
78
80
  log_system_error "error calling OverSIP::WebSocketEvents.on_connection_closed():"
79
81
  log_system_error e
80
82
  end
81
- end
83
+ end unless $!
82
84
  end
83
85
 
84
86
 
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.beta3
4
+ version: 1.1.0.beta4
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-06 00:00:00.000000000 Z
12
+ date: 2012-08-08 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: eventmachine-le
16
- requirement: &18084900 !ruby/object:Gem::Requirement
16
+ requirement: &18475300 !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: *18084900
24
+ version_requirements: *18475300
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: iobuffer
27
- requirement: &18084440 !ruby/object:Gem::Requirement
27
+ requirement: &18474840 !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: *18084440
35
+ version_requirements: *18474840
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: em-posixmq
38
- requirement: &18083980 !ruby/object:Gem::Requirement
38
+ requirement: &18474380 !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: *18083980
46
+ version_requirements: *18474380
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: em-udns
49
- requirement: &18099900 !ruby/object:Gem::Requirement
49
+ requirement: &18473920 !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: *18099900
57
+ version_requirements: *18473920
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: escape_utils
60
- requirement: &18099440 !ruby/object:Gem::Requirement
60
+ requirement: &18473460 !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: *18099440
68
+ version_requirements: *18473460
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: term-ansicolor
71
- requirement: &18099060 !ruby/object:Gem::Requirement
71
+ requirement: &18473080 !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: *18099060
79
+ version_requirements: *18473080
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: posix-spawn
82
- requirement: &18098520 !ruby/object:Gem::Requirement
82
+ requirement: &18472540 !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: *18098520
90
+ version_requirements: *18472540
91
91
  - !ruby/object:Gem::Dependency
92
92
  name: rake
93
- requirement: &18098020 !ruby/object:Gem::Requirement
93
+ requirement: &18472040 !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: *18098020
101
+ version_requirements: *18472040
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