oversip 1.0.4 → 1.0.5

Sign up to get free protection for your applications and to get access to all the features.
data/etc/custom_lib.rb ADDED
@@ -0,0 +1,15 @@
1
+ #
2
+ # OverSIP - Custom Library.
3
+ #
4
+ #
5
+ # Add your custom code for your application running on top of OverSIP.
6
+ # Here you can load thirdy-party libraries and so on.
7
+
8
+
9
+ module MyOverSIP
10
+
11
+ extend ::OverSIP::Logger
12
+
13
+ # Add here your code.
14
+
15
+ end
data/etc/logic.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
 
3
3
  #
4
- # OverSIP - Simple OverSIP logic example.
4
+ # OverSIP - Logic.
5
5
  #
6
6
  #
7
7
 
data/etc/oversip.conf CHANGED
@@ -1,5 +1,5 @@
1
1
  #
2
- # OverSIP - Configuration file.
2
+ # OverSIP - Main Configuration.
3
3
  #
4
4
  #
5
5
  # IMPORTANT:
@@ -151,6 +151,7 @@ websocket:
151
151
  listen_ipv4: null
152
152
 
153
153
  # Enable or dissable IPv6. By default _yes_.
154
+ #
154
155
  enable_ipv6: yes
155
156
 
156
157
  # IPv6 in which OverSIP listens for SIP messages. Using "::" is not
data/etc/proxies.conf CHANGED
@@ -1,5 +1,5 @@
1
1
  #
2
- # OverSIP - Proxies configuration.
2
+ # OverSIP - Proxies Configuration.
3
3
  #
4
4
  #
5
5
  # IMPORTANT:
@@ -0,0 +1,18 @@
1
+ #
2
+ # OverSIP - System Events.
3
+ #
4
+ #
5
+ # OverSIP system callbacks. Fill them according to your needs.
6
+
7
+
8
+ module OverSIP::SystemEvents
9
+
10
+ extend ::OverSIP::Logger
11
+ @log_id = "SystemEvents"
12
+
13
+ # This method is called once the OverSIP reactor has been started.
14
+ def self.on_started
15
+ # Do something.
16
+ end
17
+
18
+ end
@@ -1,5 +1,5 @@
1
1
  #
2
- # OverSIP - WebSocket Access Policy
2
+ # OverSIP - WebSocket Access Policy.
3
3
  #
4
4
  #
5
5
  # Fill these functions with your own access policy for allowing or
@@ -28,4 +28,3 @@ module OverSIP::WebSocket::Policy
28
28
  end
29
29
 
30
30
  end
31
-
@@ -15,6 +15,8 @@ module OverSIP
15
15
  PROXIES_FILE = "proxies.conf"
16
16
  LOGIC_FILE = "logic.rb"
17
17
  WEBSOCKET_POLICY_FILE = "websocket_policy.rb"
18
+ SYSTEM_EVENTS_FILE = "system_events.rb"
19
+ CUSTOM_LIB_FILE = "custom_lib.rb"
18
20
 
19
21
  def self.log_id
20
22
  @log_id ||= "Config"
@@ -122,30 +124,48 @@ module OverSIP
122
124
  @config_dir = (config_dir || DEFAULT_CONFIG_DIR)
123
125
  @config_file = ::File.join(@config_dir, config_file || DEFAULT_CONFIG_FILE)
124
126
  @proxies_file = ::File.join(@config_dir, PROXIES_FILE)
125
- @logic_file ||= ::File.join(@config_dir, LOGIC_FILE)
126
- @websocket_policy_file ||= ::File.join(@config_dir, WEBSOCKET_POLICY_FILE)
127
+ @logic_file = ::File.join(@config_dir, LOGIC_FILE)
128
+ @websocket_policy_file = ::File.join(@config_dir, WEBSOCKET_POLICY_FILE)
129
+ @system_events_file = ::File.join(@config_dir, SYSTEM_EVENTS_FILE)
130
+ @custom_lib_file = ::File.join(@config_dir, CUSTOM_LIB_FILE)
127
131
 
128
132
  begin
129
133
  conf_yaml = ::YAML.load_file @config_file
130
134
  rescue => e
131
- fatal "error loading configuration file '#{@config_file}': #{e.message} (#{e.class})"
135
+ fatal "error loading Main Configuration file '#{@config_file}': #{e.message} (#{e.class})"
136
+ end
137
+
138
+ begin
139
+ ::Kernel.load @custom_lib_file
140
+ rescue ::LoadError => e
141
+ log_system_warn "cannot load Custom Lib file '#{@custom_lib_file}': #{e.message} (#{e.class})"
142
+ rescue ::Exception => e
143
+ log_system_crit "error loading Custom Lib file '#{@custom_lib_file}':"
144
+ fatal e
145
+ end
146
+
147
+ begin
148
+ ::Kernel.load @system_events_file
149
+ rescue ::Exception => e
150
+ log_system_crit "error loading System Events file '#{@system_events_file}':"
151
+ fatal e
132
152
  end
133
153
 
134
154
  begin
135
155
  proxies_yaml = ::YAML.load_file @proxies_file
136
156
  rescue => e
137
- fatal "error loading proxies configuration file '#{@proxies_file}': #{e.message} (#{e.class})"
157
+ fatal "error loading Proxies Configuration file '#{@proxies_file}': #{e.message} (#{e.class})"
138
158
  end
139
159
 
140
160
  begin
141
- Kernel.load @logic_file
142
- rescue LoadError => e
143
- fatal "error loading logic file '#{@logic_file}': #{e.message} (#{e.class})"
161
+ ::Kernel.load @logic_file
162
+ rescue ::LoadError => e
163
+ fatal "error loading Logic file '#{@logic_file}': #{e.message} (#{e.class})"
144
164
  end
145
165
 
146
166
  begin
147
- Kernel.load @websocket_policy_file
148
- rescue LoadError => e
167
+ ::Kernel.load @websocket_policy_file
168
+ rescue ::LoadError => e
149
169
  log_system_warn "cannot load WebSocket Policy file '#{@websocket_policy_file}': #{e.message} (#{e.class}), using default policy (allow all)"
150
170
  end
151
171
 
@@ -164,7 +184,7 @@ module OverSIP
164
184
  next
165
185
  end
166
186
 
167
- if values.is_a? Array
187
+ if values.is_a? ::Array
168
188
  unless validations.include? :multi_value
169
189
  fatal "#{section}[#{parameter}] does not allow multiple values"
170
190
  end
@@ -174,14 +194,14 @@ module OverSIP
174
194
  end
175
195
  end
176
196
 
177
- values = ( values.is_a?(Array) ? values : [ values ] )
197
+ values = ( values.is_a?(::Array) ? values : [ values ] )
178
198
 
179
199
  values.each do |value|
180
200
  validations.each do |validation|
181
201
 
182
- if validation.is_a? Symbol
202
+ if validation.is_a? ::Symbol
183
203
  args = []
184
- elsif validation.is_a? Array
204
+ elsif validation.is_a? ::Array
185
205
  args = validation[1..-1]
186
206
  validation = validation[0]
187
207
  end
@@ -202,7 +222,7 @@ module OverSIP
202
222
  post_process
203
223
  post_check
204
224
 
205
- rescue OverSIP::ConfigurationError => e
225
+ rescue ::OverSIP::ConfigurationError => e
206
226
  fatal "configuration error: #{e.message}"
207
227
  rescue => e
208
228
  fatal e
@@ -220,15 +240,15 @@ module OverSIP
220
240
  tls_private_cert = conf_yaml["tls"]["private_cert"] rescue nil
221
241
  tls_ca_dir = conf_yaml["tls"]["ca_dir"] rescue nil
222
242
 
223
- if tls_public_cert.is_a?(String) and tls_public_cert[0] != "/"
243
+ if tls_public_cert.is_a?(::String) and tls_public_cert[0] != "/"
224
244
  conf_yaml["tls"]["public_cert"] = ::File.join(@config_dir, DEFAULT_TLS_DIR, tls_public_cert)
225
245
  end
226
246
 
227
- if tls_private_cert.is_a?(String) and tls_private_cert[0] != "/"
247
+ if tls_private_cert.is_a?(::String) and tls_private_cert[0] != "/"
228
248
  conf_yaml["tls"]["private_cert"] = ::File.join(@config_dir, DEFAULT_TLS_DIR, tls_private_cert)
229
249
  end
230
250
 
231
- if tls_ca_dir.is_a?(String) and tls_ca_dir[0] != "/"
251
+ if tls_ca_dir.is_a?(::String) and tls_ca_dir[0] != "/"
232
252
  conf_yaml["tls"]["ca_dir"] = ::File.join(@config_dir, DEFAULT_TLS_DIR, tls_ca_dir)
233
253
  end
234
254
  end
@@ -237,9 +257,9 @@ module OverSIP
237
257
  if @configuration[:tls][:public_cert] and @configuration[:tls][:private_cert]
238
258
  @use_tls = true
239
259
  # Generate a full PEM file containing both the public and private certificate (for Stud).
240
- full_cert = Tempfile.new("oversip_full_cert_")
241
- full_cert.puts File.read(@configuration[:tls][:public_cert])
242
- full_cert.puts File.read(@configuration[:tls][:private_cert])
260
+ full_cert = ::Tempfile.new("oversip_full_cert_")
261
+ full_cert.puts ::File.read(@configuration[:tls][:public_cert])
262
+ full_cert.puts ::File.read(@configuration[:tls][:private_cert])
243
263
  @configuration[:tls][:full_cert] = full_cert.path
244
264
  full_cert.close
245
265
  else
@@ -326,7 +346,7 @@ module OverSIP
326
346
  end
327
347
 
328
348
  if @configuration[:sip][:local_domains]
329
- if @configuration[:sip][:local_domains].is_a? String
349
+ if @configuration[:sip][:local_domains].is_a? ::String
330
350
  @configuration[:sip][:local_domains] = [ @configuration[:sip][:local_domains].downcase ]
331
351
  end
332
352
  @configuration[:sip][:local_domains].each {|local_domain| local_domain.downcase!}
@@ -447,7 +467,7 @@ module OverSIP
447
467
 
448
468
 
449
469
  def self.print colorize=true
450
- color = Term::ANSIColor if colorize
470
+ color = ::Term::ANSIColor if colorize
451
471
 
452
472
  puts
453
473
  @configuration.each_key do |section|
@@ -459,17 +479,17 @@ module OverSIP
459
479
  @configuration[section].each do |parameter, value|
460
480
  humanized_value = humanize_value value
461
481
  color_value = case value
462
- when TrueClass
482
+ when ::TrueClass
463
483
  colorize ? color.bold(color.green(humanized_value)) : humanized_value
464
- when FalseClass
484
+ when ::FalseClass
465
485
  colorize ? color.bold(color.red(humanized_value)) : humanized_value
466
- when NilClass
486
+ when ::NilClass
467
487
  humanized_value
468
- when String, Symbol
488
+ when ::String, ::Symbol
469
489
  colorize ? color.yellow(humanized_value) : humanized_value
470
- when Array
490
+ when ::Array
471
491
  colorize ? color.yellow(humanized_value) : humanized_value
472
- when Fixnum, Float
492
+ when ::Fixnum, ::Float
473
493
  colorize ? color.bold(color.blue(humanized_value)) : humanized_value
474
494
  else
475
495
  humanized_value
@@ -482,14 +502,14 @@ module OverSIP
482
502
 
483
503
  def self.humanize_value value
484
504
  case value
485
- when TrueClass ; "yes"
486
- when FalseClass ; "no"
487
- when NilClass ; "null"
488
- when String ; value
489
- when Symbol ; value.to_s
490
- when Array ; value.join(", ")
491
- when Fixnum, Float ; value.to_s
492
- else ; value.to_s
505
+ when ::TrueClass ; "yes"
506
+ when ::FalseClass ; "no"
507
+ when ::NilClass ; "null"
508
+ when ::String ; value
509
+ when ::Symbol ; value.to_s
510
+ when ::Array ; value.join(", ")
511
+ when ::Fixnum, ::Float ; value.to_s
512
+ else ; value.to_s
493
513
  end
494
514
  end
495
515
 
@@ -498,12 +518,26 @@ module OverSIP
498
518
  if type == :ipv4
499
519
  socket = ::UDPSocket.new ::Socket::AF_INET
500
520
  socket.connect("1.2.3.4", 1)
521
+ ip = socket.local_address.ip_address
522
+ socket.close
523
+ socket = ::UDPSocket.new ::Socket::AF_INET
501
524
  elsif type == :ipv6
502
525
  socket = ::UDPSocket.new ::Socket::AF_INET6
503
526
  socket.connect("2001::1", 1)
527
+ ip = socket.local_address.ip_address
528
+ socket.close
529
+ socket = ::UDPSocket.new ::Socket::AF_INET6
530
+ end
531
+ # Test whether the IP is in fact bindeable (not true for link-scope IPv6 addresses).
532
+ begin
533
+ socket.bind ip, 0
534
+ rescue => e
535
+ log_system_warn "cannot bind in autodiscovered local #{type == :ipv4 ? "IPv4" : "IPv6"} '#{ip}': #{e.message} (#{e.class})"
536
+ return false
537
+ ensure
538
+ socket.close
504
539
  end
505
- ip = socket.local_address.ip_address
506
- socket.close
540
+ # Valid IP, return it.
507
541
  return ip
508
542
  rescue => e
509
543
  log_system_warn "cannot autodiscover local #{type == :ipv4 ? "IPv4" : "IPv6"}: #{e.message} (#{e.class})"
@@ -513,10 +547,10 @@ module OverSIP
513
547
 
514
548
  def self.reload_logic
515
549
  begin
516
- Kernel.load @logic_file
550
+ ::Kernel.load @logic_file
517
551
  log_system_info "logic reloaded"
518
552
  true
519
- rescue Exception => e
553
+ rescue ::Exception => e
520
554
  log_system_crit "error reloading logic"
521
555
  log_system_crit e
522
556
  false
@@ -29,22 +29,22 @@ module OverSIP
29
29
  end
30
30
 
31
31
  def ipv4 value
32
- return false unless value.is_a? String
32
+ return false unless value.is_a? ::String
33
33
  ::OverSIP::Utils.ip_type(value) == :ipv4 and value != "0.0.0.0"
34
34
  end
35
35
 
36
36
  def ipv6 value
37
- return false unless value.is_a? String
37
+ return false unless value.is_a? ::String
38
38
  ::OverSIP::Utils.ip_type(value) == :ipv6 and ::OverSIP::Utils.normalize_ipv6(value) != "::"
39
39
  end
40
40
 
41
41
  def ipv4_any value
42
- return false unless value.is_a? String
42
+ return false unless value.is_a? ::String
43
43
  ::OverSIP::Utils.ip_type(value) == :ipv4
44
44
  end
45
45
 
46
46
  def ipv6_any value
47
- return false unless value.is_a? String
47
+ return false unless value.is_a? ::String
48
48
  ::OverSIP::Utils.ip_type(value) == :ipv6
49
49
  end
50
50
 
@@ -298,6 +298,16 @@ module OverSIP::Launcher
298
298
  create_pid_file(options[:pid_file])
299
299
 
300
300
  log_system_info "reactor running"
301
+
302
+ # Run the user provided on_started callback.
303
+ log_system_info "calling user provided OverSIP::SystemEvents.on_started() callback..."
304
+ begin
305
+ ::OverSIP::SystemEvents.on_started
306
+ rescue ::Exception => e
307
+ log_system_crit "error calling user provided OverSIP::SystemEvents.on_started() callback:"
308
+ fatal e
309
+ end
310
+
301
311
  log_system_info "master process (PID #{$$}) ready"
302
312
  log_system_info "#{::OverSIP::PROGRAM_NAME} #{::OverSIP::VERSION} running in background"
303
313
 
@@ -313,9 +323,10 @@ module OverSIP::Launcher
313
323
  $stdout.reopen("/dev/null")
314
324
  $stderr.reopen("/dev/null")
315
325
  ::OverSIP.daemonized = true
316
-
326
+ # So update the logger to write to syslog.
317
327
  ::OverSIP::Logger.load_methods
318
328
 
329
+ # Set the EventMachine error handler.
319
330
  ::EM.error_handler do |e|
320
331
  log_system_error "error raised during event loop and rescued by EM.error_handler:"
321
332
  log_system_error e
@@ -427,11 +438,12 @@ module OverSIP::Launcher
427
438
 
428
439
  # Signal CHLD is sent by syslogger process if it dies.
429
440
  trap :CHLD do
430
- # TODO: This won't be logged since syslogger process has died!
441
+ # NOTE: This won't be logged if the died proces is oversip_syslogger!
431
442
  log_system_crit "CHLD signal received, syslogger process could be death"
432
443
  end
433
444
  end
434
445
 
446
+
435
447
  def self.terminate error=false
436
448
  unless error
437
449
  log_system_info "exiting, thank you for tasting #{::OverSIP::PROGRAM_NAME}"
@@ -441,7 +453,7 @@ module OverSIP::Launcher
441
453
  kill_stud_processes
442
454
 
443
455
  # Wait a bit so pending log messages in the Posix MQ can be queued.
444
- sleep 0.05
456
+ sleep 0.1
445
457
  delete_pid_file
446
458
  ::OverSIP::Logger.close
447
459
 
@@ -502,7 +514,7 @@ module OverSIP::Launcher
502
514
  stdout_file = "/tmp/stud.#{listen_ip}:#{listen_port}.out"
503
515
 
504
516
  ::Dir.chdir(bin_dir) do
505
- 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"
517
+ 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"
506
518
  Process.waitpid(pid)
507
519
  end
508
520
 
@@ -531,6 +543,7 @@ module OverSIP::Launcher
531
543
 
532
544
  def self.kill_stud_processes
533
545
  return false unless ::OverSIP.master_pid
546
+ return false unless ::OverSIP.stud_pids
534
547
 
535
548
  ::OverSIP.stud_pids.each do |pid|
536
549
  begin
@@ -161,7 +161,7 @@ module OverSIP
161
161
  end
162
162
 
163
163
  # Default logging identifier is the class name. If log_id() method is redefined by the
164
- # class including this module, or it sets @log_id, then such value takes preference.
164
+ # class including this module, or it sets @log_id, then such a value takes preference.
165
165
  def log_id
166
166
  @log_id ||= self.class.name
167
167
  end
@@ -28,17 +28,20 @@ module OverSIP
28
28
  rescue ::Errno::ENOENT
29
29
  rescue ::Errno::EACCES => e
30
30
  fatal "queue already exists and cannot remove it due file permissions"
31
+ # Kernel has no support for posix message queues.
32
+ rescue ::Errno::ENOSYS => e
33
+ fatal "the kernel has no support for posix messages queues, enable it (#{e.class}: #{e.message})"
31
34
  end
32
35
 
33
36
  # Set the UMASK in a way that the group has permission to delete the queue.
34
- orig_umask = File.umask(0007)
37
+ orig_umask = ::File.umask(0007)
35
38
 
36
39
  # Change the effective group for the Posix queue. Keep the original
37
40
  # group.
38
- orig_gid = Process::GID.eid
41
+ orig_gid = ::Process::GID.eid
39
42
  if mq_group
40
- gid = Etc.getgrnam(mq_group).gid
41
- Process::GID.change_privilege(gid)
43
+ gid = ::Etc.getgrnam(mq_group).gid
44
+ ::Process::GID.change_privilege(gid)
42
45
  end
43
46
 
44
47
  # System limits required size (ulimit -q).
@@ -60,7 +63,7 @@ module OverSIP
60
63
  log_system_debug "incrementing rlimits (currently #{current_rlimit} bytes) to #{mq_size} bytes (ulimit -q)" if $oversip_debug
61
64
  begin
62
65
  ::Process.setrlimit(12, mq_size)
63
- rescue Errno::EPERM
66
+ rescue ::Errno::EPERM
64
67
  fatal "current user has no permissions to increase rlimits to #{mq_size} bytes (ulimit -q)"
65
68
  end
66
69
  end
@@ -73,10 +76,10 @@ module OverSIP
73
76
  # - mode: 00660 => User and group can write and read.
74
77
  # - mq_attr => Set maxmsg and msgsize.
75
78
  begin
76
- mq = ::POSIX_MQ.new mq_name, mq_mode | IO::CREAT | IO::EXCL | IO::NONBLOCK, 00660, mq_attr
79
+ mq = ::POSIX_MQ.new mq_name, mq_mode | ::IO::CREAT | ::IO::EXCL | ::IO::NONBLOCK, 00660, mq_attr
77
80
 
78
81
  # Kernel has no support for posix message queues.
79
- rescue Errno::ENOSYS => e
82
+ rescue ::Errno::ENOSYS => e
80
83
  fatal "the kernel has no support for posix messages queues, enable it (#{e.class}: #{e.message})"
81
84
 
82
85
  # http://linux.die.net/man/3/mq_open
@@ -87,25 +90,25 @@ module OverSIP
87
90
  # limit, and attr->mq_msgsize must be less than or equal to the msgsize_max limit. In addition, even
88
91
  # in a privileged process, attr->mq_maxmsg cannot exceed the HARD_MAX limit. (See mq_overview(7) for
89
92
  # details of these limits.)
90
- rescue Errno::EINVAL
93
+ rescue ::Errno::EINVAL
91
94
  log_system_warn "cannot set queue attributes due to user permissions, using system default values"
92
- mq = ::POSIX_MQ.new mq_name, mq_mode | IO::CREAT | IO::NONBLOCK, 00660
93
- rescue Errno::ENOMEM => e
95
+ mq = ::POSIX_MQ.new mq_name, mq_mode | ::IO::CREAT | ::IO::NONBLOCK, 00660
96
+ rescue ::Errno::ENOMEM => e
94
97
  fatal "insufficient memory (#{e.class}: #{e.message})"
95
- rescue Errno::EMFILE => e
98
+ rescue ::Errno::EMFILE => e
96
99
  fatal "the process already has the maximum number of files and message queues open (#{e.class}: #{e.message})"
97
100
  rescue Errno::ENFILE => e
98
101
  fatal "the system limit on the total number of open files and message queues has been reached (#{e.class}: #{e.message})"
99
- rescue Errno::ENOSPC => e
102
+ rescue ::Errno::ENOSPC => e
100
103
  fatal "insufficient space for the creation of a new message queue, probably occurred because the queues_max limit was encountered (#{e.class}: #{e.message})"
101
104
 
102
105
  end
103
106
 
104
107
  # Recover the original Umask settings.
105
- File.umask(orig_umask)
108
+ ::File.umask(orig_umask)
106
109
 
107
110
  # Recover the original effective group.
108
- Process::GID.change_privilege(orig_gid) if mq_group
111
+ ::Process::GID.change_privilege(orig_gid) if mq_group
109
112
 
110
113
  if mq.attr.maxmsg == mq_attr.maxmsg and mq.attr.msgsize == mq_attr.msgsize
111
114
  log_system_debug "maxmsg=#{mq.attr.maxmsg}, msgsize=#{mq.attr.msgsize}" if $oversip_debug
@@ -22,17 +22,17 @@ module OverSIP
22
22
  module SysLoggerProcess
23
23
 
24
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
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
36
  }
37
37
 
38
38
  class SysLoggerWatcher < ::EM::PosixMQ::Watcher
@@ -5,19 +5,17 @@ module OverSIP
5
5
  module Version
6
6
  MAJOR = 1
7
7
  MINOR = 0
8
- TINY = 4
8
+ TINY = 5
9
+ DEVEL = nil # Set to nil for stable releases.
9
10
  end
10
11
 
11
12
  PROGRAM_NAME = "OverSIP"
12
13
  PROGRAM_NAME_LOW = PROGRAM_NAME.downcase
13
14
  PROGRAM_DESC = "OverSIP Server"
14
- VERSION = [Version::MAJOR, Version::MINOR, Version::TINY].join('.')
15
- AUTHOR = "Iñaki Baz Castillo"
15
+ VERSION = [Version::MAJOR, Version::MINOR, Version::TINY].join(".")
16
+ VERSION << ".#{Version::DEVEL}" if Version::DEVEL
17
+ AUTHOR = "Inaki Baz Castillo"
16
18
  AUTHOR_EMAIL = "ibc@aliax.net"
17
19
  DESCRIPTION = "#{PROGRAM_NAME} #{VERSION}\n2012, #{AUTHOR} <#{AUTHOR_EMAIL}>"
18
20
 
19
- module GemVersion
20
- VERSION = ::OverSIP::VERSION
21
- end
22
-
23
21
  end
metadata CHANGED
@@ -1,19 +1,19 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: oversip
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.4
4
+ version: 1.0.5
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
8
- - Iñaki Baz Castillo
8
+ - Inaki Baz Castillo
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-07-26 00:00:00.000000000 Z
12
+ date: 2012-07-30 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: eventmachine-le
16
- requirement: &12671300 !ruby/object:Gem::Requirement
16
+ requirement: &23702300 !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: *12671300
24
+ version_requirements: *23702300
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: iobuffer
27
- requirement: &12670760 !ruby/object:Gem::Requirement
27
+ requirement: &23701840 !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: *12670760
35
+ version_requirements: *23701840
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: em-posixmq
38
- requirement: &12669960 !ruby/object:Gem::Requirement
38
+ requirement: &23701380 !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: *12669960
46
+ version_requirements: *23701380
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: em-udns
49
- requirement: &12669120 !ruby/object:Gem::Requirement
49
+ requirement: &23717300 !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: *12669120
57
+ version_requirements: *23717300
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: escape_utils
60
- requirement: &12667940 !ruby/object:Gem::Requirement
60
+ requirement: &23716840 !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: *12667940
68
+ version_requirements: *23716840
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: term-ansicolor
71
- requirement: &12667360 !ruby/object:Gem::Requirement
71
+ requirement: &23716460 !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: *12667360
79
+ version_requirements: *23716460
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: posix-spawn
82
- requirement: &12666820 !ruby/object:Gem::Requirement
82
+ requirement: &23715920 !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: *12666820
90
+ version_requirements: *23715920
91
91
  - !ruby/object:Gem::Dependency
92
92
  name: rake
93
- requirement: &12665940 !ruby/object:Gem::Requirement
93
+ requirement: &23715420 !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: *12665940
101
+ version_requirements: *23715420
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
@@ -229,6 +229,8 @@ files:
229
229
  - ext/stud/extconf.rb
230
230
  - thirdparty/stud/stud.tar.gz
231
231
  - etc/oversip.conf
232
+ - etc/system_events.rb
233
+ - etc/custom_lib.rb
232
234
  - etc/logic.rb
233
235
  - etc/proxies.conf
234
236
  - etc/websocket_policy.rb
@@ -238,15 +240,6 @@ files:
238
240
  - etc/tls/ca/cacert.pem
239
241
  - etc/tls/utils/get-sip-identities.rb
240
242
  - etc/tls/utils/create-cert.rb
241
- - debian/postrm
242
- - debian/compat
243
- - debian/copyright
244
- - debian/rules
245
- - debian/oversip.init
246
- - debian/oversip.default
247
- - debian/changelog
248
- - debian/control
249
- - debian/preinst
250
243
  - Rakefile
251
244
  - README.md
252
245
  - AUTHORS
data/debian/changelog DELETED
@@ -1,5 +0,0 @@
1
- oversip (1.0.0) stable; urgency=low
2
-
3
- * Initial release.
4
-
5
- -- Iñaki Baz Castillo <ibc@aliax.net> Mon, 09 Jul 2012 21:21:00 +0100
data/debian/compat DELETED
@@ -1 +0,0 @@
1
- 7
data/debian/control DELETED
@@ -1,25 +0,0 @@
1
- Source: oversip
2
- Section: comm
3
- Priority: optional
4
- Maintainer: Iñaki Baz Castillo <ibc@aliax.net>
5
- Homepage: http://www.oversip.net
6
- Build-Depends: debhelper (>= 7)
7
- Standards-Version: 3.9.3
8
-
9
- Package: oversip
10
- Architecture: all
11
- Pre-Depends: ${shlibs:Depends}, ${misc:Depends}, ruby1.9.1, ruby1.9.1-dev, make, g++, libssl-dev, libev-dev
12
- Suggests: unbound
13
- Description: OverSIP (the SIP dreams factory) is an async SIP proxy/server programmable in Ruby language.
14
- Some features of OverSIP are:
15
- - SIP transports: UDP, TCP, TLS and WebSocket.
16
- - Full IPv4 and IPv6 support.
17
- - RFC 3263: SIP DNS mechanism (NAPTR, SRV, A, AAAA) for failover and load
18
- balancing based on DNS.
19
- - RFC 5626: OverSIP is a perfect Outbound EDGE proxy, including an integrated
20
- STUN server.
21
- - Fully programmable in Ruby language (make SIP easy).
22
- - Fast and efficient: OverSIP core is coded in C language.
23
- OverSIP is build on top of EventMachine async library which follows the Reactor
24
- Pattern design, allowing thousands of concurrent connections and requests in a
25
- never-blocking fashion.
data/debian/copyright DELETED
@@ -1,25 +0,0 @@
1
- Name: OverSIP
2
- Maintainer: Iñaki Baz Castillo <ibc@aliax.net>
3
- Copyright (c) 2012 Iñaki Baz Castillo <ibc@aliax.net>
4
-
5
-
6
- License: The MIT LICENSE
7
-
8
- Permission is hereby granted, free of charge, to any person obtaining
9
- a copy of this software and associated documentation files (the
10
- "Software"), to deal in the Software without restriction, including
11
- without limitation the rights to use, copy, modify, merge, publish,
12
- distribute, sublicense, and/or sell copies of the Software, and to
13
- permit persons to whom the Software is furnished to do so, subject to
14
- the following conditions:
15
-
16
- The above copyright notice and this permission notice shall be
17
- included in all copies or substantial portions of the Software.
18
-
19
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
20
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
21
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
22
- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
23
- LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
24
- OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
25
- WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -1,25 +0,0 @@
1
- #
2
- # oversip startup options
3
- #
4
-
5
- # Set to 'yes' when configured.
6
- RUN=no
7
-
8
- # User to run as.
9
- USER=oversip
10
-
11
- # Group to run as.
12
- GROUP=oversip
13
-
14
- # Directory with the configuration files.
15
- # By default '/etc/oversip/'.
16
- #CONFIG_DIR=/etc/oversip/
17
-
18
- # Main configuration file name (within the configuration directory).
19
- # By default 'oversip.conf'.
20
- #CONFIG_FILE=oversip.conf
21
-
22
- # Number of OverSIP instances that will run together in this host.
23
- # This parameter is just for some resources allocation, it does not run N instances!
24
- # By default 1.
25
- #NUM_INSTANCES=1
data/debian/oversip.init DELETED
@@ -1,226 +0,0 @@
1
- #! /bin/bash
2
-
3
- ### BEGIN INIT INFO
4
- # Provides: oversip
5
- # Required-Start: $syslog $network $remote_fs
6
- # Required-Stop: $syslog $network $remote_fs
7
- # Default-Start: 2 3 4 5
8
- # Default-Stop: 0 1 6
9
- # Short-Description: Start/stop OverSIP
10
- # Description: Start/stop OverSIP
11
- ### END INIT INFO
12
-
13
- PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin:/var/lib/gems/1.9.1/bin
14
- DESC=OverSIP
15
- HOMEDIR=/var/run/oversip
16
- RUN=no
17
- RUBY_GEM=oversip
18
- RUBY_EXE=ruby1.9.1
19
-
20
- # Process name, it affects to the process name, Posix Message Queue name and PID file.
21
- # The configuration file under /etc/default/ to read will also be called $NAME.
22
- NAME=oversip
23
-
24
-
25
- . /lib/lsb/init-functions
26
-
27
- # Debian LSB functions don't add \n in function log_begin_msg().
28
- # In Ubuntu such function is overriden in /etc/lsb-base-logging.sh.
29
- UBUNTU_LOGGING=0
30
- [ -r /etc/lsb-base-logging.sh ] && UBUNTU_LOGGING=1
31
-
32
- [ -r /etc/default/$NAME ] && . /etc/default/$NAME
33
-
34
-
35
- # Check for the start/restart/force-reload actions.
36
- if [ "$1" == "start" ] || [ "$1" == "restart" ] || [ "$1" == "force-reload" ] ; then
37
- # Ensure that the admin has set RUN=yes in /etc/default/$NAME file.
38
- if [ "$RUN" != "yes" ] ; then
39
- log_failure_msg "$DESC ($NAME) not yet configured. Set RUN=yes in /etc/default/$NAME."
40
- exit 0
41
- fi
42
- fi
43
-
44
- # Ensure Ruby executable is installed.
45
- which $RUBY_EXE >/dev/null
46
- if [ $? -ne 0 ] ; then
47
- log_failure_msg "ruby1.9.1 is not installed, exiting."
48
- log_end_msg 5
49
- exit 5
50
- fi
51
-
52
- # Check whether OverSIP Ruby Gem is installed and get the executable location.
53
- DAEMON=$(which oversip)
54
- if [ $? -ne 0 ] ; then
55
- log_failure_msg "$DESC ($NAME): Ruby Gem '$RUBY_GEM' is not installed, exiting."
56
-
57
- case "$1" in
58
- status)
59
- # LSB - 4: program or service status is unknown.
60
- log_end_msg 4
61
- exit 4
62
- ;;
63
- *)
64
- # LSB - 5: program is not installed.
65
- log_end_msg 5
66
- exit 5
67
- ;;
68
- esac
69
- fi
70
-
71
-
72
- PIDFILE="${HOMEDIR}/${NAME}.pid"
73
- OPTIONS="-P ${PIDFILE} -p ${NAME}"
74
-
75
- if [ -n "$USER" ] ; then OPTIONS="${OPTIONS} -u ${USER}" ; fi
76
- if [ -n "$GROUP" ] ; then OPTIONS="${OPTIONS} -g ${GROUP}" ; fi
77
- if [ -n "$CONFIG_DIR" ] ; then OPTIONS="${OPTIONS} --config-dir ${CONFIG_DIR}" ; fi
78
- if [ -n "$CONFIG_FILE" ] ; then OPTIONS="${OPTIONS} --config-file ${CONFIG_FILE}" ; fi
79
- if [ -n "$NUM_INSTANCES" ] ; then OPTIONS="${OPTIONS} --num-instances ${NUM_INSTANCES}" ; fi
80
-
81
-
82
- check_homedir()
83
- {
84
- # Create HOMEDIR directory in case it doesn't exist.
85
- # Useful in Ubuntu as /var/run/ content is deleted in shutdown.
86
- if [ ! -d $HOMEDIR ] ; then mkdir $HOMEDIR ; fi
87
-
88
- # Set the appropiate owner and group
89
- if [ -n "$USER" ] ; then chown ${USER} $HOMEDIR ; fi
90
- if [ -n "$GROUP" ] ; then chgrp ${GROUP} $HOMEDIR ; fi
91
- }
92
-
93
-
94
- # Return values:
95
- # - 3: oversip is not running.
96
- # - 0: oversip is running.
97
- # - 1: oversip is not running but PID file exists.
98
- get_status() {
99
- if [ ! -r "$PIDFILE" ]; then
100
- return 3
101
- fi
102
- if read pid < "$PIDFILE" && ps -p "$pid" > /dev/null 2>&1; then
103
- return 0
104
- else
105
- return 1
106
- fi
107
- }
108
-
109
-
110
- start() {
111
- set +e
112
- get_status
113
- case $? in
114
- 0) # Already running, do nothing.
115
- log_warning_msg "already running."
116
- exit 0
117
- ;;
118
- 3) # Not running, start it.
119
- ;;
120
- 1) # Not running but PID file exists, remove it and start.
121
- log_warning_msg "not running but PID file '$PIDFILE' exists, deleting it."
122
- rm "$PIDFILE"
123
- ;;
124
- esac
125
-
126
- start-stop-daemon --start --quiet --pidfile $PIDFILE --quiet \
127
- --exec $DAEMON -- $OPTIONS
128
- res=$?
129
-
130
- if [ $res -eq 0 ] ; then
131
- log_end_msg 0
132
- exit 0
133
- else
134
- if [ ! -r "$PIDFILE" ]; then
135
- log_failure_msg "error, failed to start."
136
- log_end_msg 1
137
- exit 1
138
- else
139
- log_failure_msg "error, failed to start (and PID file '$PIDFILE' exists)."
140
- log_end_msg 1
141
- exit 1
142
- fi
143
- fi
144
- }
145
-
146
-
147
- set -e
148
-
149
- case "$1" in
150
-
151
- start)
152
- check_homedir
153
- log_daemon_msg "Starting $DESC ($NAME)"
154
- echo
155
- set +e
156
-
157
- start
158
- ;;
159
-
160
- stop)
161
- log_daemon_msg "Stopping $DESC ($NAME)"
162
- echo
163
- set +e
164
-
165
- start-stop-daemon --oknodo --stop --pidfile $PIDFILE --quiet
166
- res=$?
167
-
168
- if [ $res -eq 0 ] ; then
169
- log_end_msg 0
170
- # Posix MQueue for syslogging is created with owner root (to ensure
171
- # rlimits and so) so it cannot be deleted by a non root user when
172
- # stopping the server. This command removes the mqueue when performing
173
- # the "stop" action.
174
- $DAEMON --remove-mqueue "/${NAME}_syslogger" 2>/dev/null
175
- exit 0
176
- else
177
- log_failure_msg "error, failed to stop."
178
- log_end_msg 1
179
- exit 1
180
- fi
181
- ;;
182
-
183
- restart|force-reload)
184
- log_daemon_msg "Restarting $DESC ($NAME)"
185
- echo
186
- set +e
187
-
188
- start-stop-daemon --oknodo --stop --pidfile $PIDFILE --retry=5 --quiet
189
-
190
- if [ $? -ne 0 ] ; then
191
- log_failure_msg "error, failed to stop."
192
- log_end_msg 1
193
- exit 1
194
- fi
195
-
196
- check_homedir
197
- start
198
- ;;
199
-
200
- status)
201
- set +e
202
- get_status
203
- case $? in
204
- 3) # Not running.
205
- log_begin_msg "$DESC ($NAME) is not running."
206
- [ $UBUNTU_LOGGING -eq 0 ] && echo
207
- exit 3
208
- ;;
209
- 0) # Running.
210
- log_begin_msg "$DESC ($NAME) is running."
211
- [ $UBUNTU_LOGGING -eq 0 ] && echo
212
- exit 0
213
- ;;
214
- 1) # Not running but PID file exists.
215
- log_warning_msg "$DESC ($NAME) is not running but PID file '$PIDFILE' exists."
216
- exit 1
217
- ;;
218
- esac
219
- ;;
220
-
221
- *)
222
- log_failure_msg "Usage: /etc/init.d/$NAME {start|stop|restart|force-reload|status}."
223
- exit 1
224
- ;;
225
-
226
- esac
data/debian/postrm DELETED
@@ -1,16 +0,0 @@
1
- #!/bin/bash
2
-
3
- #DEBHELPER#
4
-
5
- if [ "$1" = "purge" ] ; then
6
- # Remove the Debian system user/group.
7
- deluser --quiet --remove-home oversip &>/dev/null || true
8
-
9
- # Remove the Ruby gem.
10
- echo "uninstalling 'oversip' Ruby Gem..."
11
- gem1.9.1 uninstall oversip -a -x
12
- fi
13
-
14
- exit 0
15
-
16
- #DEBHELPER#
data/debian/preinst DELETED
@@ -1,34 +0,0 @@
1
- #!/bin/bash
2
-
3
- # preinst script can be called with arguments 'install', 'upgrade' and 'abort-upgrade'.
4
-
5
- set -e
6
-
7
- #DEBHELPER#
8
-
9
- OVERSIP_GEM_VERSION="~>1.0.4"
10
-
11
- case "$1" in
12
-
13
- install)
14
- # Add a Debian system user/group called "oversip".
15
- adduser --quiet --system --group --disabled-password \
16
- --shell /bin/false --gecos "OverSIP" \
17
- --home /var/run/oversip oversip || true
18
-
19
- # Install the Ruby gem.
20
- echo "installing 'oversip' Ruby Gem (version $OVERSIP_GEM_VERSION)..."
21
- gem1.9.1 install oversip --no-rdoc --no-ri -v $OVERSIP_GEM_VERSION
22
- ;;
23
-
24
- upgrade)
25
- # Install the Ruby gem.
26
- echo "installing 'oversip' Ruby Gem (version $OVERSIP_GEM_VERSION)..."
27
- gem1.9.1 install oversip --no-rdoc --no-ri -v $OVERSIP_GEM_VERSION
28
- ;;
29
-
30
- esac
31
-
32
- exit 0
33
-
34
- #DEBHELPER#
data/debian/rules DELETED
@@ -1,66 +0,0 @@
1
- #!/usr/bin/make -f
2
- # -*- makefile -*-
3
-
4
- # Uncomment this to turn on verbose mode.
5
- #export DH_VERBOSE=1
6
-
7
- build: build-stamp
8
-
9
- build-stamp:
10
- dh_testdir
11
- touch $@
12
-
13
- clean:
14
- dh_testdir
15
- dh_testroot
16
- rm -rf build-stamp oversip
17
- dh_clean
18
-
19
- install: build
20
- dh_testdir
21
- dh_testroot
22
- dh_clean -k
23
- dh_installdirs /etc
24
-
25
- mkdir -p $(CURDIR)/debian/oversip/etc/oversip/
26
- mkdir -p $(CURDIR)/debian/oversip/etc/oversip/tls/
27
- mkdir -p $(CURDIR)/debian/oversip/etc/oversip/tls/ca/
28
- mkdir -p $(CURDIR)/debian/oversip/etc/oversip/tls/utils/
29
- mkdir -p $(CURDIR)/debian/oversip/usr/share/oversip/
30
- install -m 644 etc/oversip.conf debian/oversip/etc/oversip/
31
- install -m 644 etc/proxies.conf debian/oversip/etc/oversip/
32
- install -m 644 etc/logic.rb debian/oversip/etc/oversip/
33
- install -m 644 etc/websocket_policy.rb debian/oversip/etc/oversip/
34
- install -m 755 etc/tls/upgrade-cacert.sh debian/oversip/etc/oversip/tls/
35
- install -m 644 etc/tls/demo-tls.oversip.net.crt debian/oversip/etc/oversip/tls/
36
- install -m 600 etc/tls/demo-tls.oversip.net.key debian/oversip/etc/oversip/tls/
37
- install -m 644 etc/tls/ca/* debian/oversip/etc/oversip/tls/ca/
38
- install -m 755 etc/tls/utils/* debian/oversip/etc/oversip/tls/utils/
39
-
40
- # Build architecture-dependent files here.
41
- binary-arch: install
42
- # We have nothing to do by default.
43
-
44
- # Build architecture-independent files here.
45
- binary-indep: install
46
- dh_testdir
47
- dh_testroot
48
- dh_installchangelogs
49
- dh_installdocs
50
- dh_installexamples
51
- dh_installman
52
- dh_installinit --restart-after-upgrade -- defaults 20
53
- dh_link
54
- dh_strip
55
- dh_compress
56
- dh_fixperms
57
- dh_installcron
58
- # dh_makeshlibs
59
- dh_installdeb
60
- dh_shlibdeps
61
- dh_gencontrol
62
- dh_md5sums
63
- dh_builddeb
64
-
65
- binary: binary-indep binary-arch
66
- .PHONY: build clean binary-indep binary-arch binary install