oversip 1.4.1 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/LICENSE +1 -1
- data/README.md +2 -2
- data/Rakefile +10 -11
- data/bin/oversip +10 -27
- data/etc/tls/ca/cacert.pem +717 -718
- data/ext/sip_parser/common_headers.h +1 -0
- data/ext/sip_parser/sip_message_parser.c +43 -42
- data/ext/sip_parser/sip_parser_ruby.c +10 -0
- data/ext/utils/ip_utils.h +2 -0
- data/ext/utils/utils_ruby.h +2 -1
- data/ext/websocket_framing_utils/ws_framing_utils.h +2 -1
- data/ext/websocket_framing_utils/ws_framing_utils_ruby.c +1 -1
- data/lib/oversip/config.rb +6 -6
- data/lib/oversip/default_server.rb +0 -10
- data/lib/oversip/launcher.rb +29 -67
- data/lib/oversip/logger.rb +29 -108
- data/lib/oversip/sip/launcher.rb +7 -7
- data/lib/oversip/syslog.rb +22 -12
- data/lib/oversip/version.rb +5 -5
- data/lib/oversip/websocket/launcher.rb +7 -7
- data/lib/oversip.rb +61 -15
- data/test/oversip_test_helper.rb +0 -1
- metadata +154 -215
- data/lib/oversip/master_process.rb +0 -67
- data/lib/oversip/posix_mq.rb +0 -126
- data/lib/oversip/ruby_ext/process.rb +0 -9
- data/lib/oversip/syslogger_process.rb +0 -80
@@ -1,67 +0,0 @@
|
|
1
|
-
# Ruby built-in libraries.
|
2
|
-
|
3
|
-
require "base64"
|
4
|
-
require "digest/md5"
|
5
|
-
require "digest/sha1"
|
6
|
-
require "securerandom"
|
7
|
-
require "fiber"
|
8
|
-
require "openssl"
|
9
|
-
|
10
|
-
|
11
|
-
# Ruby external gems.
|
12
|
-
|
13
|
-
gem "iobuffer", ">= 1.1.2"
|
14
|
-
require "iobuffer"
|
15
|
-
gem "em-udns", ">= 0.3.6"
|
16
|
-
require "em-udns"
|
17
|
-
gem "escape_utils", ">= 0.2.4"
|
18
|
-
require "escape_utils"
|
19
|
-
gem "posix-spawn", ">= 0.3.6"
|
20
|
-
require "posix-spawn"
|
21
|
-
gem "em-synchrony", ">=1.0.2"
|
22
|
-
require "em-synchrony"
|
23
|
-
|
24
|
-
|
25
|
-
# OverSIP files.
|
26
|
-
|
27
|
-
require "oversip/sip/sip.rb"
|
28
|
-
require "oversip/sip/sip_parser.so"
|
29
|
-
require "oversip/sip/constants.rb"
|
30
|
-
require "oversip/sip/core.rb"
|
31
|
-
require "oversip/sip/message.rb"
|
32
|
-
require "oversip/sip/request.rb"
|
33
|
-
require "oversip/sip/response.rb"
|
34
|
-
require "oversip/sip/uri.rb"
|
35
|
-
require "oversip/sip/name_addr.rb"
|
36
|
-
require "oversip/sip/message_processor.rb"
|
37
|
-
require "oversip/sip/listeners.rb"
|
38
|
-
require "oversip/sip/launcher.rb"
|
39
|
-
require "oversip/sip/server_transaction.rb"
|
40
|
-
require "oversip/sip/client_transaction.rb"
|
41
|
-
require "oversip/sip/transport_manager.rb"
|
42
|
-
require "oversip/sip/timers.rb"
|
43
|
-
require "oversip/sip/tags.rb"
|
44
|
-
require "oversip/sip/rfc3263.rb"
|
45
|
-
require "oversip/sip/client.rb"
|
46
|
-
require "oversip/sip/proxy.rb"
|
47
|
-
require "oversip/sip/uac.rb"
|
48
|
-
require "oversip/sip/uac_request.rb"
|
49
|
-
|
50
|
-
require "oversip/websocket/websocket.rb"
|
51
|
-
require "oversip/websocket/ws_http_parser.so"
|
52
|
-
require "oversip/websocket/constants.rb"
|
53
|
-
require "oversip/websocket/http_request.rb"
|
54
|
-
require "oversip/websocket/listeners.rb"
|
55
|
-
require "oversip/websocket/launcher.rb"
|
56
|
-
require "oversip/websocket/ws_framing_utils.so"
|
57
|
-
require "oversip/websocket/ws_framing.rb"
|
58
|
-
require "oversip/websocket/ws_sip_app.rb"
|
59
|
-
|
60
|
-
require "oversip/fiber_pool.rb"
|
61
|
-
require "oversip/tls.rb"
|
62
|
-
require "oversip/stun.so"
|
63
|
-
|
64
|
-
require "oversip/modules/user_assertion.rb"
|
65
|
-
require "oversip/modules/outbound_mangling.rb"
|
66
|
-
|
67
|
-
require "oversip/ruby_ext/eventmachine.rb"
|
data/lib/oversip/posix_mq.rb
DELETED
@@ -1,126 +0,0 @@
|
|
1
|
-
module OverSIP
|
2
|
-
|
3
|
-
class PosixMQ
|
4
|
-
|
5
|
-
extend ::OverSIP::Logger
|
6
|
-
|
7
|
-
def self.create_queue options={}
|
8
|
-
@log_id = "PosixMQ #{options[:name]}"
|
9
|
-
|
10
|
-
# Queue attributes.
|
11
|
-
mq_name = options[:name]
|
12
|
-
mq_mode = case options[:mode]
|
13
|
-
when :read then ::IO::RDONLY
|
14
|
-
when :write then ::IO::WRONLY
|
15
|
-
when :read_write then ::IO::RDWR
|
16
|
-
end
|
17
|
-
mq_group = options[:group]
|
18
|
-
mq_attr = ::POSIX_MQ::Attr.new
|
19
|
-
# NOTE: maximun value for maxmsg is 65536.
|
20
|
-
mq_attr.maxmsg = options[:maxmsg]
|
21
|
-
mq_attr.msgsize = options[:msgsize]
|
22
|
-
mq_attr.flags = 0
|
23
|
-
mq_attr.curmsgs = 0
|
24
|
-
|
25
|
-
# Delete the queue if it exists.
|
26
|
-
begin
|
27
|
-
::POSIX_MQ.unlink mq_name
|
28
|
-
rescue ::Errno::ENOENT
|
29
|
-
rescue ::Errno::EACCES => e
|
30
|
-
::OverSIP::Launcher.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
|
-
::OverSIP::Launcher.fatal "the kernel has no support for posix messages queues, enable it (#{e.class}: #{e.message})"
|
34
|
-
end
|
35
|
-
|
36
|
-
# Set the UMASK in a way that the group has permission to delete the queue.
|
37
|
-
orig_umask = ::File.umask(0007)
|
38
|
-
|
39
|
-
# Change the effective group for the Posix queue. Keep the original
|
40
|
-
# group.
|
41
|
-
orig_gid = ::Process::GID.eid
|
42
|
-
if mq_group
|
43
|
-
gid = ::Etc.getgrnam(mq_group).gid
|
44
|
-
::Process::GID.change_privilege(gid)
|
45
|
-
end
|
46
|
-
|
47
|
-
# System limits required size (ulimit -q).
|
48
|
-
mq_size = case 1.size
|
49
|
-
# 32 bits OS.
|
50
|
-
when 4 then mq_attr.maxmsg * 4 + mq_attr.maxmsg * mq_attr.msgsize
|
51
|
-
# 64 bits OS.
|
52
|
-
when 8 then mq_attr.maxmsg * 8 + mq_attr.maxmsg * mq_attr.msgsize
|
53
|
-
end
|
54
|
-
|
55
|
-
log_system_info "queue requires #{mq_size} bytes"
|
56
|
-
|
57
|
-
# Set RLIMIT_MSGQUEUE (ulimit) in order to create the queue with required
|
58
|
-
# ammount of memory.
|
59
|
-
if ( current_rlimit = ::Process.getrlimit(::Process::RLIMIT_MSGQUEUE)[1] ) < mq_size
|
60
|
-
log_system_info "incrementing rlimits for 'msgqueue' Posix Message Queues (currently #{current_rlimit} bytes) to #{mq_size} bytes (ulimit -q)"
|
61
|
-
begin
|
62
|
-
::Process.setrlimit(::Process::RLIMIT_MSGQUEUE, mq_size, mq_size)
|
63
|
-
rescue ::Errno::EPERM
|
64
|
-
::OverSIP::Launcher.fatal "current user has no permissions to increase 'msgqueue' rlimits to #{mq_size} bytes"
|
65
|
-
rescue => e
|
66
|
-
::OverSIP::Launcher.fatal e
|
67
|
-
end
|
68
|
-
else
|
69
|
-
log_system_info "rlimits for 'msgqueue' is #{current_rlimit} bytes (>= #{mq_size}), no need to increase it"
|
70
|
-
end
|
71
|
-
|
72
|
-
# Create the Posix message queue to write into it.
|
73
|
-
# - IO::WRONLY => Just write.
|
74
|
-
# - IO::CREAT => Create if it doesn't exist.
|
75
|
-
# - IO::EXCL => Raise if the queue already exists.
|
76
|
-
# - IO::NONBLOCK => Don't block when sending (instead raise Errno::EAGAIN).
|
77
|
-
# - mode: 00660 => User and group can write and read.
|
78
|
-
# - mq_attr => Set maxmsg and msgsize.
|
79
|
-
begin
|
80
|
-
mq = ::POSIX_MQ.new mq_name, mq_mode | ::IO::CREAT | ::IO::EXCL | ::IO::NONBLOCK, 00660, mq_attr
|
81
|
-
|
82
|
-
# Kernel has no support for posix message queues.
|
83
|
-
rescue ::Errno::ENOSYS => e
|
84
|
-
::OverSIP::Launcher.fatal "the kernel has no support for Posix Messages Queues, enable it (#{e.class}: #{e.message})"
|
85
|
-
|
86
|
-
# http://linux.die.net/man/3/mq_open
|
87
|
-
#
|
88
|
-
# IO_CREAT was specified in oflag, and attr was not NULL, but attr->mq_maxmsg or attr->mq_msqsize was
|
89
|
-
# invalid. Both of these fields must be greater than zero. In a process that is unprivileged (does not
|
90
|
-
# have the CAP_SYS_RESOURCE capability), attr->mq_maxmsg must be less than or equal to the msg_max
|
91
|
-
# limit, and attr->mq_msgsize must be less than or equal to the msgsize_max limit. In addition, even
|
92
|
-
# in a privileged process, attr->mq_maxmsg cannot exceed the HARD_MAX limit. (See mq_overview(7) for
|
93
|
-
# details of these limits.)
|
94
|
-
rescue ::Errno::EINVAL
|
95
|
-
log_system_warn "cannot set queue attributes due to user permissions, using system default values"
|
96
|
-
mq = ::POSIX_MQ.new mq_name, mq_mode | ::IO::CREAT | ::IO::NONBLOCK, 00660
|
97
|
-
rescue ::Errno::ENOMEM => e
|
98
|
-
::OverSIP::Launcher.fatal "insufficient memory (#{e.class}: #{e.message})"
|
99
|
-
rescue ::Errno::EMFILE => e
|
100
|
-
::OverSIP::Launcher.fatal "the process already has the maximum number of files and message queues open (#{e.class}: #{e.message})"
|
101
|
-
rescue Errno::ENFILE => e
|
102
|
-
::OverSIP::Launcher.fatal "the system limit on the total number of open files and message queues has been reached (#{e.class}: #{e.message})"
|
103
|
-
rescue ::Errno::ENOSPC => e
|
104
|
-
::OverSIP::Launcher.fatal "insufficient space for the creation of a new message queue, probably occurred because the 'queues_max' limit was encountered (#{e.class}: #{e.message})"
|
105
|
-
|
106
|
-
end
|
107
|
-
|
108
|
-
# Recover the original Umask settings.
|
109
|
-
::File.umask(orig_umask)
|
110
|
-
|
111
|
-
# Recover the original effective group.
|
112
|
-
::Process::GID.change_privilege(orig_gid) if mq_group
|
113
|
-
|
114
|
-
if mq.attr.maxmsg == mq_attr.maxmsg and mq.attr.msgsize == mq_attr.msgsize
|
115
|
-
log_system_info "maxmsg=#{mq.attr.maxmsg}, msgsize=#{mq.attr.msgsize}"
|
116
|
-
else
|
117
|
-
log_system_warn "maxmsg=#{mq.attr.maxmsg}, msgsize=#{mq.attr.msgsize}, " \
|
118
|
-
"but recommended values are maxmsg=#{mq_attr.maxmsg}, msgsize=#{mq_attr.msgsize}"
|
119
|
-
end
|
120
|
-
|
121
|
-
mq
|
122
|
-
end # self.create_queue
|
123
|
-
|
124
|
-
end # class PosixMQ
|
125
|
-
|
126
|
-
end
|
@@ -1,80 +0,0 @@
|
|
1
|
-
# Ruby external gems.
|
2
|
-
|
3
|
-
gem "em-posixmq", ">= 0.2.3"
|
4
|
-
require "em-posixmq"
|
5
|
-
|
6
|
-
|
7
|
-
# OverSIP libraries.
|
8
|
-
# (not required to be loaded as needed ones have been already
|
9
|
-
# loaded before forking).
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
module OverSIP
|
14
|
-
|
15
|
-
module SysLoggerProcess
|
16
|
-
|
17
|
-
class SysLoggerWatcher < ::EM::PosixMQ::Watcher
|
18
|
-
|
19
|
-
def receive_message string, priority
|
20
|
-
::OverSIP::Syslog.log string
|
21
|
-
end
|
22
|
-
|
23
|
-
end # class SysLoggerWatcher
|
24
|
-
|
25
|
-
def self.run options={}
|
26
|
-
$0 = ::OverSIP.master_name + "_syslogger"
|
27
|
-
|
28
|
-
# Close Ruby Syslog open in the main process before forking.
|
29
|
-
::Syslog.close
|
30
|
-
|
31
|
-
# Run a new Ruby Syslog.
|
32
|
-
syslog_options = ::Syslog::LOG_PID | ::Syslog::LOG_NDELAY
|
33
|
-
syslog_facility = ::OverSIP::Syslog::SYSLOG_FACILITY_MAPPING[::OverSIP.configuration[:core][:syslog_facility]]
|
34
|
-
::Syslog.open(::OverSIP.master_name, syslog_options, syslog_facility)
|
35
|
-
|
36
|
-
ppid = ::Process.ppid
|
37
|
-
|
38
|
-
at_exit do
|
39
|
-
::Syslog.notice sprintf("%7s %s", "INFO:", "<syslogger> syslogger process terminated")
|
40
|
-
exit!
|
41
|
-
end
|
42
|
-
|
43
|
-
EM.run do
|
44
|
-
begin
|
45
|
-
syslogger_mq = ::POSIX_MQ.new ::OverSIP.syslogger_mq_name, ::IO::RDONLY | ::IO::NONBLOCK
|
46
|
-
::EM::PosixMQ.run syslogger_mq, SysLoggerWatcher
|
47
|
-
|
48
|
-
# Change process permissions if requested.
|
49
|
-
::OverSIP::Launcher.set_user_group(options[:user], options[:group])
|
50
|
-
|
51
|
-
rescue ::Exception => e
|
52
|
-
::Syslog.crit sprintf("%7s %s", "CRIT:", "<syslogger> #{e.class}: #{e}")
|
53
|
-
::Syslog.crit sprintf("%7s %s", "CRIT:", "<syslogger> syslogger process terminated")
|
54
|
-
exit! 1
|
55
|
-
end
|
56
|
-
|
57
|
-
# Periodically check that master process remains alive and
|
58
|
-
# die otherwise.
|
59
|
-
::EM.add_periodic_timer(1) do
|
60
|
-
if ::Process.ppid != ppid
|
61
|
-
# Wait 0.5 seconds. Maybe the master process has been killed properly and just now
|
62
|
-
# it's sending us the QUIT signal.
|
63
|
-
::EM.add_timer(0.5) do
|
64
|
-
::Syslog.crit sprintf("%7s %s", "CRIT:", "<syslogger> master process died, syslogger process terminated")
|
65
|
-
exit! 1
|
66
|
-
end
|
67
|
-
end
|
68
|
-
end
|
69
|
-
|
70
|
-
::EM.error_handler do |e|
|
71
|
-
::Syslog.crit sprintf("%7s %s", "CRIT:", "<syslogger> error raised during event loop and rescued by EM.error_handler: #{e.message} (#{e.class})\n#{(e.backtrace || [])[0..3].join("\n")}")
|
72
|
-
end
|
73
|
-
|
74
|
-
::Syslog.info sprintf("%7s %s", "INFO:", "<syslogger> syslogger process (PID #{$$}) ready")
|
75
|
-
end
|
76
|
-
end
|
77
|
-
|
78
|
-
end # module SysLoggerProcess
|
79
|
-
|
80
|
-
end
|