opensips-mi 0.0.5 → 0.0.10
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.
- checksums.yaml +6 -14
- data/.gitignore +1 -0
- data/.rspec +1 -0
- data/.travis.yml +1 -1
- data/Gemfile +4 -6
- data/README.md +4 -1
- data/Rakefile +3 -7
- data/lib/opensips/mi/command.rb +4 -9
- data/lib/opensips/mi/response.rb +65 -36
- data/lib/opensips/mi/transport/datagram.rb +14 -2
- data/lib/opensips/mi/transport/fifo.rb +4 -4
- data/lib/opensips/mi/version.rb +1 -1
- data/opensips-mi.gemspec +17 -15
- data/spec/command_spec.rb +4 -0
- data/{test → spec}/fixtures/dlg_list +0 -0
- data/{test → spec}/fixtures/ul_dump +0 -0
- data/spec/response_spec.rb +117 -0
- data/spec/spec_helper.rb +112 -0
- data/spec/transport_spec.rb +119 -0
- metadata +54 -40
- data/test/helper.rb +0 -89
- data/test/test_command.rb +0 -118
- data/test/test_response.rb +0 -124
- data/test/test_transport.rb +0 -209
checksums.yaml
CHANGED
@@ -1,15 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
metadata.gz: !binary |-
|
9
|
-
MDU0ODY2NGUwYTA4Y2RjM2M1NmJlMWRhNjJjZDcyMzgwNWM3OTdmMzZlOTcw
|
10
|
-
ODU3M2JiY2IwYTNkYjk2ODlmNDYwOWVhYWMzYWI3NDdjZTVjNDFjMzM5MTFm
|
11
|
-
YWM1NzMwYjkyZDUzMTY4NWQyYzM3Y2YzN2YzYzYwMGJjYWQzNjM=
|
12
|
-
data.tar.gz: !binary |-
|
13
|
-
Yzc5NWMzYjYwZjQ1NzJiMzA1NDYzMzU4OGU4ODQ5ODUyZGFkNmE0Y2Y0MGQ4
|
14
|
-
Y2Q1MDRlZWMyZmQ4YmFiZTkyM2ZlZTc3NjdmOGU3NjZiOTE3MmMyZTczYTM4
|
15
|
-
NDdhNWFjNmNlNmY4OWI3NmZjNjFjNWZlNTBlZWI3MWFmZWEzYzM=
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 135298241a7da04c8011bdc51fd903c62b04dbfb05de49cce7610544fee9f274
|
4
|
+
data.tar.gz: 25a7bede110b7b35b121baddb04c2da6588d6fb8de3d9914cc84f6fd79041ef2
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 273474a444d49d471180eb7051cd57dc34e1c8c21146429cb649fab1134c5b4c6f604c0762a3a97005c4f340c7c4d379e95a0e89935d7511a1f5c1654c7edbc6
|
7
|
+
data.tar.gz: 7aca0cdf36610f3f4db77864d215ec9b214acaebfcac25345e2f8042997614f62e44f47e8914f06717f0d1cb9186e62df391524a2ae5bcef7246f7c3adb278c4
|
data/.gitignore
CHANGED
data/.rspec
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--require spec_helper
|
data/.travis.yml
CHANGED
data/Gemfile
CHANGED
@@ -1,9 +1,7 @@
|
|
1
|
-
source
|
1
|
+
source "https://rubygems.org"
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
gem 'mocha'
|
7
|
-
end
|
3
|
+
git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
|
4
|
+
|
5
|
+
gem 'simplecov', require: false, group: :test
|
8
6
|
|
9
7
|
gemspec
|
data/README.md
CHANGED
@@ -73,12 +73,14 @@ opensips = Opensips::MI.connect :fifo,
|
|
73
73
|
require 'opensips/mi'
|
74
74
|
opensips = Opensips::MI.connect :datagram,
|
75
75
|
:host => "sipproxy.com",
|
76
|
-
:port => 8809
|
76
|
+
:port => 8809,
|
77
|
+
:timeout => 5
|
77
78
|
```
|
78
79
|
**Parameters hash:**
|
79
80
|
|
80
81
|
* host: Hostname or IP address of OpenSIPs server
|
81
82
|
* port: Datagram port. See mi_datagram module configuration parameter: `modparam("mi_datagram", "socket_name", "udp:192.168.2.133:8080")`
|
83
|
+
* timeout: Timeout in seconds to wait send/recv commands. Optional. Default 3 seconds.
|
82
84
|
|
83
85
|
### XMLRPC
|
84
86
|
```ruby
|
@@ -141,6 +143,7 @@ There are several helper methods which return conveniently formatted data:
|
|
141
143
|
* cache_fetch
|
142
144
|
* ul_show_contact
|
143
145
|
* dlg_list
|
146
|
+
* ps
|
144
147
|
|
145
148
|
See example files for details.
|
146
149
|
|
data/Rakefile
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
require "bundler/gem_tasks"
|
2
2
|
require "rake/clean"
|
3
3
|
require 'opensips/mi/version'
|
4
|
+
require 'rspec/core/rake_task'
|
4
5
|
|
5
6
|
require "rdoc/task"
|
6
7
|
Rake::RDocTask.new do |rd|
|
@@ -10,11 +11,6 @@ Rake::RDocTask.new do |rd|
|
|
10
11
|
rd.title = "OpenSIPs management interface " << Opensips::MI::VERSION
|
11
12
|
end
|
12
13
|
|
13
|
-
|
14
|
-
Rake::TestTask.new(:test) do |test|
|
15
|
-
test.libs << 'lib' << 'test'
|
16
|
-
test.pattern = 'test/**/test_*.rb'
|
17
|
-
#test.verbose = true
|
18
|
-
end
|
14
|
+
RSpec::Core::RakeTask.new(:spec)
|
19
15
|
|
20
|
-
task :default => :
|
16
|
+
task :default => :spec
|
data/lib/opensips/mi/command.rb
CHANGED
@@ -26,9 +26,6 @@ module Opensips
|
|
26
26
|
|
27
27
|
# Interface to mi methods direct call
|
28
28
|
def method_missing(md, *params, &block)
|
29
|
-
response = command 'which'
|
30
|
-
raise NoMethodError,
|
31
|
-
"Method #{md} does not exists" unless response.rawdata.include?(md.to_s)
|
32
29
|
response = command md.to_s, params
|
33
30
|
# return special helper output if exists
|
34
31
|
return response unless response.success
|
@@ -78,15 +75,15 @@ module Opensips
|
|
78
75
|
#
|
79
76
|
def uac_dlg method, ruri, hf, next_hop = ?., socket = ?., body = nil
|
80
77
|
mandatory_hf = Array['To', 'From']
|
81
|
-
mandatory_hf += ['Content-Type'
|
78
|
+
mandatory_hf += ['Content-Type'] unless body.nil?
|
82
79
|
mandatory_hf.map{|h|h.downcase}.each do |n|
|
83
80
|
raise ArgumentError,
|
84
81
|
"Missing mandatory header #{n.capitalize}" unless hf.keys.map{|h| h.downcase}.include?(n)
|
85
82
|
end
|
86
83
|
# compile headers to string
|
87
84
|
headers = hf.map{|name,val| name.eql?("nl") ? "" : "#{name}: #{val}"}.join "\r\n"
|
88
|
-
headers << "\r\n"
|
89
|
-
|
85
|
+
headers << "\r\n\r\n"
|
86
|
+
|
90
87
|
# set_header is a hack for xmlrpc which fails if headers are quoted
|
91
88
|
params = [method, ruri, next_hop, socket, set_header(headers)]
|
92
89
|
params << body unless body.nil?
|
@@ -122,7 +119,7 @@ module Opensips
|
|
122
119
|
hf['To'] = "<#{uri}>" unless hf.keys.map{|k|k.downcase}.include?('to')
|
123
120
|
hf['From'] = "<#{uri}>;tag=#{SecureRandom.hex}" unless hf.keys.map{|k|k.downcase}.include?('from')
|
124
121
|
hf['Event'] = EVENTNOTIFY[event]
|
125
|
-
|
122
|
+
|
126
123
|
uac_dlg "NOTIFY", uri, hf
|
127
124
|
end
|
128
125
|
|
@@ -151,7 +148,6 @@ module Opensips
|
|
151
148
|
'Event' => "message-summary",
|
152
149
|
'Subscription-State'=> "active",
|
153
150
|
'Content-Type' => "application/simple-message-summary",
|
154
|
-
'Content-Length' => mbody.map{|k,v| "#{k}: #{v}"}.join("\r\n").length,
|
155
151
|
'nl' => "",
|
156
152
|
]
|
157
153
|
|
@@ -172,7 +168,6 @@ module Opensips
|
|
172
168
|
"Invalid port #{params[:port]}" unless (1..(2**16-1)).include?(params[:port])
|
173
169
|
true
|
174
170
|
end
|
175
|
-
|
176
171
|
end
|
177
172
|
end
|
178
173
|
end
|
data/lib/opensips/mi/response.rb
CHANGED
@@ -10,7 +10,7 @@ module Opensips
|
|
10
10
|
'Invalid parameter' unless data.is_a? Array
|
11
11
|
raise EmptyResponseData,
|
12
12
|
'Empty parameter array' if data.empty?
|
13
|
-
|
13
|
+
|
14
14
|
if /^(?<code>\d+) (?<message>.+)$/ =~ data.shift.to_s
|
15
15
|
@code = code.to_i
|
16
16
|
@message = message
|
@@ -22,26 +22,34 @@ module Opensips
|
|
22
22
|
@success = (200..299).include?(@code)
|
23
23
|
|
24
24
|
# successfull responses have additional new line
|
25
|
-
data.pop if @success
|
26
25
|
@rawdata = data
|
27
26
|
@result = nil
|
28
27
|
end
|
29
|
-
|
28
|
+
|
30
29
|
# Parse user locations records to Hash
|
31
30
|
def ul_dump
|
32
|
-
|
33
|
-
|
34
|
-
|
31
|
+
res = {}
|
32
|
+
aor = nil
|
33
|
+
contact = nil
|
34
|
+
|
35
35
|
@rawdata.each do |r|
|
36
|
-
if
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
if
|
41
|
-
|
36
|
+
next if r.start_with?("Domain")
|
37
|
+
r = r.strip
|
38
|
+
key, val = r.split(":: ")
|
39
|
+
|
40
|
+
if key == "AOR"
|
41
|
+
aor = val
|
42
|
+
res[aor] = []
|
43
|
+
next
|
44
|
+
elsif key == "Contact"
|
45
|
+
contact = {}
|
46
|
+
res[aor] << contact
|
42
47
|
end
|
48
|
+
|
49
|
+
contact[key.gsub(?-, ?_).downcase.to_sym] = val if key
|
43
50
|
end
|
44
|
-
|
51
|
+
|
52
|
+
@result = res
|
45
53
|
self
|
46
54
|
end
|
47
55
|
|
@@ -73,24 +81,25 @@ module Opensips
|
|
73
81
|
@result = OpenStruct.new res
|
74
82
|
self
|
75
83
|
end
|
76
|
-
|
84
|
+
|
77
85
|
# returns Array of registered contacts
|
78
86
|
def ul_show_contact
|
79
|
-
|
87
|
+
result = []
|
80
88
|
@rawdata.each do |r|
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
+
_, contact = r.strip.split("Contact:: ")
|
90
|
+
next unless contact
|
91
|
+
|
92
|
+
params = contact.split(';')
|
93
|
+
|
94
|
+
res = {contact: params.shift}
|
95
|
+
|
96
|
+
params.each do |p|
|
97
|
+
key, val = p.split('=')
|
98
|
+
res[key.gsub(?-, ?_).downcase.to_sym] = val
|
89
99
|
end
|
90
|
-
|
100
|
+
result << res
|
91
101
|
end
|
92
|
-
@result =
|
93
|
-
self
|
102
|
+
@result = result
|
94
103
|
end
|
95
104
|
|
96
105
|
# returns hash of dialogs
|
@@ -124,19 +133,39 @@ module Opensips
|
|
124
133
|
self
|
125
134
|
end
|
126
135
|
|
136
|
+
# returns array containing list of opensips processes
|
137
|
+
def ps
|
138
|
+
processes = []
|
139
|
+
@rawdata.each do |l|
|
140
|
+
l.slice! "Process:: "
|
141
|
+
h = {}
|
142
|
+
|
143
|
+
l.split(" ", 3).each do |x|
|
144
|
+
key, val = x.split("=", 2)
|
145
|
+
h[key.downcase.to_sym] = val
|
146
|
+
end
|
147
|
+
|
148
|
+
processes << OpenStruct.new(h)
|
149
|
+
end
|
150
|
+
|
151
|
+
@result = processes
|
152
|
+
self
|
153
|
+
end
|
154
|
+
|
127
155
|
private
|
128
156
|
def dr_gws_hash
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
157
|
+
return nil if @rawdata.empty?
|
158
|
+
res = {}
|
159
|
+
@rawdata.map do |gw|
|
160
|
+
if /\AID::\s+(?<id>[^\s]+)\s+IP=(?<ip>[^:\s]+):?(?<port>\d+)?\s+Enabled=(?<status>yes|no)/ =~ gw
|
161
|
+
res[id] = {
|
162
|
+
enabled: status.eql?('yes'),
|
163
|
+
ipaddr: ip,
|
164
|
+
port: port
|
165
|
+
}
|
138
166
|
end
|
139
|
-
|
167
|
+
end
|
168
|
+
res.empty? ? nil : res
|
140
169
|
end
|
141
170
|
|
142
171
|
end # END class
|
@@ -1,8 +1,11 @@
|
|
1
|
+
require 'timeout'
|
2
|
+
|
1
3
|
module Opensips
|
2
4
|
module MI
|
3
5
|
module Transport
|
4
6
|
class Datagram < Opensips::MI::Command
|
5
7
|
RECVMAXLEN = 2**16 - 1
|
8
|
+
TIMEOUT = 3
|
6
9
|
|
7
10
|
class << self
|
8
11
|
def init(params)
|
@@ -14,6 +17,7 @@ module Opensips
|
|
14
17
|
host_valid? params
|
15
18
|
@sock = UDPSocket.new
|
16
19
|
@sock.connect params[:host], params[:port]
|
20
|
+
@timeout = params[:timeout].to_i
|
17
21
|
end
|
18
22
|
|
19
23
|
def command(cmd, params = [])
|
@@ -21,12 +25,20 @@ module Opensips
|
|
21
25
|
params.each do |c|
|
22
26
|
request << "#{c}\n"
|
23
27
|
end
|
24
|
-
|
28
|
+
Timeout::timeout(tout, nil, "Timeout send request to datagram MI") {
|
29
|
+
@sock.send request, 0
|
30
|
+
}
|
25
31
|
# will raise Errno::ECONNREFUSED if failed to connect
|
26
|
-
|
32
|
+
Timeout::timeout(tout,nil,"Timeout receive respond from datagram MI") {
|
33
|
+
response, = @sock.recvfrom RECVMAXLEN
|
34
|
+
}
|
27
35
|
Opensips::MI::Response.new response.split(?\n)
|
28
36
|
end
|
29
37
|
|
38
|
+
def tout
|
39
|
+
@timeout > 0 ? @timeout : TIMEOUT
|
40
|
+
end
|
41
|
+
|
30
42
|
end
|
31
43
|
end
|
32
44
|
end
|
@@ -28,7 +28,7 @@ module Opensips
|
|
28
28
|
params[:reply_dir]
|
29
29
|
end
|
30
30
|
raise ArgumentError,
|
31
|
-
"Fifo reply directory does not exists #{@reply_dir}" unless Dir.
|
31
|
+
"Fifo reply directory does not exists #{@reply_dir}" unless Dir.exist? @reply_dir
|
32
32
|
|
33
33
|
# fifo_name is required parameter
|
34
34
|
raise ArgumentError,
|
@@ -36,10 +36,10 @@ module Opensips
|
|
36
36
|
|
37
37
|
@fifo_name = params[:fifo_name]
|
38
38
|
raise ArgumentError,
|
39
|
-
"OpenSIPs fifo_name file does not exist: #{@fifo_name}" unless File.
|
39
|
+
"OpenSIPs fifo_name file does not exist: #{@fifo_name}" unless File.exist? @fifo_name
|
40
40
|
raise ArgumentError,
|
41
41
|
"File #{@fifo_name} is not pipe" unless File.pipe? @fifo_name
|
42
|
-
|
42
|
+
|
43
43
|
# set finalizing method
|
44
44
|
reply_file = File.expand_path(@reply_fifo, @reply_dir)
|
45
45
|
ObjectSpace.define_finalizer(self, proc{self.class.finalize(reply_file)})
|
@@ -81,7 +81,7 @@ module Opensips
|
|
81
81
|
end
|
82
82
|
|
83
83
|
def self.finalize(reply_file)
|
84
|
-
File.unlink(reply_file) if File.
|
84
|
+
File.unlink(reply_file) if File.exist?(reply_file)
|
85
85
|
end
|
86
86
|
|
87
87
|
end
|
data/lib/opensips/mi/version.rb
CHANGED
data/opensips-mi.gemspec
CHANGED
@@ -3,21 +3,23 @@ lib = File.expand_path('../lib', __FILE__)
|
|
3
3
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
4
|
require 'opensips/mi/version'
|
5
5
|
|
6
|
-
Gem::Specification.new do |
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "opensips-mi"
|
8
|
+
spec.version = Opensips::MI::VERSION
|
9
|
+
spec.licenses = ['MIT']
|
10
|
+
spec.authors = ["Stas Kobzar"]
|
11
|
+
spec.email = ["staskobzar@gmail.com"]
|
12
|
+
spec.description = %q{Ruby module for interacting with OpenSIPs management interface}
|
13
|
+
spec.summary = %q{OpenSIPs management interface}
|
14
|
+
spec.homepage = "http://github.com/staskobzar/opensips-mi"
|
14
15
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
gem.require_paths = ["lib"]
|
16
|
+
spec.files = `git ls-files`.split($/).reject{|f| %r|^examples/.*|.match f}
|
17
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
18
|
+
spec.require_paths = ["lib"]
|
19
19
|
|
20
|
-
|
21
|
-
|
22
|
-
|
20
|
+
spec.add_dependency "xmlrpc", "~> 0.3"
|
21
|
+
|
22
|
+
spec.add_development_dependency "bundler", "~>2.2.5"
|
23
|
+
spec.add_development_dependency "rake", "~>13.0.3"
|
24
|
+
spec.add_development_dependency "rspec", "~>3.10.0"
|
23
25
|
end
|
File without changes
|
File without changes
|
@@ -0,0 +1,117 @@
|
|
1
|
+
include Opensips::MI
|
2
|
+
|
3
|
+
describe Response do
|
4
|
+
it "must raise if parameter is not Array" do
|
5
|
+
expect {Response.new "foo"}.to raise_error InvalidResponseData
|
6
|
+
end
|
7
|
+
|
8
|
+
it "must raise if response data id empty array" do
|
9
|
+
expect {Response.new Array[]}.to raise_error EmptyResponseData
|
10
|
+
end
|
11
|
+
|
12
|
+
it "must raise if invalid response data" do
|
13
|
+
expect {Response.new(["invalid param","343",222])}.
|
14
|
+
to raise_error InvalidResponseData
|
15
|
+
end
|
16
|
+
|
17
|
+
it "must parse successfull response" do
|
18
|
+
resp = Response.new ["200 it is OK", "data", ""]
|
19
|
+
expect(resp.success).to be_truthy
|
20
|
+
expect(resp.code).to be(200)
|
21
|
+
expect(resp.message).to match("it is OK")
|
22
|
+
end
|
23
|
+
|
24
|
+
it "must parse unsuccessfull response" do
|
25
|
+
resp = Response.new ["500 command 'unknown' not available"]
|
26
|
+
expect(resp.success).to be_falsey
|
27
|
+
expect(resp.code).to be(500)
|
28
|
+
expect(resp.message).to match("command 'unknown' not available")
|
29
|
+
end
|
30
|
+
|
31
|
+
it "parse ul dump response" do
|
32
|
+
res = Response.new(fixture('ul_dump'))
|
33
|
+
ul = res.ul_dump
|
34
|
+
expect(ul.result["7962"]).not_to be_nil
|
35
|
+
expect(ul.result["7962"][0][:callid]).to match("5e7a1e47da91c41c")
|
36
|
+
end
|
37
|
+
|
38
|
+
it "process uptime response" do
|
39
|
+
res = Response.new [
|
40
|
+
"200 OK",
|
41
|
+
"Now:: Fri Apr 12 22:04:27 2013",
|
42
|
+
"Up since:: Thu Apr 11 21:43:01 2013",
|
43
|
+
"Up time:: 87686 [sec]",
|
44
|
+
""
|
45
|
+
]
|
46
|
+
resp = res.uptime
|
47
|
+
expect(resp.result.uptime).to be(87686)
|
48
|
+
expect(resp.result.since.thursday?).to be_truthy
|
49
|
+
expect(resp.result.since.hour).to be(21)
|
50
|
+
expect(resp.result.since.mon).to be(4)
|
51
|
+
end
|
52
|
+
|
53
|
+
it "must fetch cache value" do
|
54
|
+
res = Response.new [
|
55
|
+
"200 OK",
|
56
|
+
"userdid = [18005552211]",
|
57
|
+
""
|
58
|
+
]
|
59
|
+
resp= res.cache_fetch
|
60
|
+
expect(resp.result.userdid).to match("18005552211")
|
61
|
+
end
|
62
|
+
|
63
|
+
it "must return userloc contacts" do
|
64
|
+
contacts = ["200 OK",
|
65
|
+
"Contact:: <sip:7747@10.132.113.198>;q=;expires=100;flags=0x0;cflags=0x0;socket=<udp:10.130.8.21:5060>;methods=0x1F7F;user_agent=<PolycomSoundStationIP-SSIP_6000-UA/3.3.5.0247_0004f2f18103>",
|
66
|
+
"Contact:: <sip:7747@10.130.8.100;line=628f4ffdfa7316e>;q=;expires=3593;flags=0x0;cflags=0x0;socket=<udp:10.130.8.21:5060>;methods=0xFFFFFFFF;user_agent=<Linphone/3.5.2 (eXosip2/3.6.0)>",
|
67
|
+
""]
|
68
|
+
response = Response.new contacts
|
69
|
+
res = response.ul_show_contact
|
70
|
+
expect(res.size).to be(2)
|
71
|
+
expect(res.first[:socket]).to match("<udp:10.130.8.21:5060>")
|
72
|
+
expect(res.last[:expires]).to match("3593")
|
73
|
+
end
|
74
|
+
|
75
|
+
it "must process dialogs list" do
|
76
|
+
response = Response.new fixture('dlg_list')
|
77
|
+
res = response.dlg_list.result
|
78
|
+
expect(res.size).to be(1)
|
79
|
+
expect(res["3212:2099935485"][:callid]).to match("1854719653")
|
80
|
+
end
|
81
|
+
|
82
|
+
it "must process dr_gw_status response in hash" do
|
83
|
+
gw_list = [
|
84
|
+
"200 OK",
|
85
|
+
"ID:: gw1 IP=212.182.133.202:5060 Enabled=no ",
|
86
|
+
"ID:: gw2 IP=213.15.222.97:5060 Enabled=yes",
|
87
|
+
"ID:: gw3 IP=200.182.132.201:5060 Enabled=yes",
|
88
|
+
"ID:: gw4 IP=200.182.135.204:5060 Enabled=yes",
|
89
|
+
"ID:: pstn1 IP=199.18.14.101:5060 Enabled=yes",
|
90
|
+
"ID:: pstn2 IP=199.18.14.102:5060 Enabled=no",
|
91
|
+
"ID:: pstn3 IP=199.18.12.103:5060 Enabled=yes",
|
92
|
+
"ID:: pstn4 IP=199.18.12.104:5060 Enabled=yes",
|
93
|
+
""
|
94
|
+
]
|
95
|
+
response = Response.new gw_list
|
96
|
+
drgws = response.dr_gw_status
|
97
|
+
expect(drgws.result.size).to be(8)
|
98
|
+
expect(drgws.result["pstn4"][:ipaddr]).to match("199.18.12.104")
|
99
|
+
expect(drgws.result["pstn3"][:port]).to match("5060")
|
100
|
+
expect(drgws.result["gw1"][:enabled]).to be_falsey
|
101
|
+
expect(drgws.result["gw4"][:enabled]).to be_truthy
|
102
|
+
end
|
103
|
+
|
104
|
+
it "must return raw data if dr_gw_status is run with arguments" do
|
105
|
+
gw = [ "200 OK", "Enabled:: yes", "" ]
|
106
|
+
response = Response.new gw
|
107
|
+
drgws = response.dr_gw_status
|
108
|
+
expect(drgws.enabled).to be_truthy
|
109
|
+
end
|
110
|
+
|
111
|
+
it "result must be empty if command send to dr_gw_status" do
|
112
|
+
response = Response.new [ "200 OK", "" ]
|
113
|
+
drgws = response.dr_gw_status
|
114
|
+
expect(drgws.result).to be_nil
|
115
|
+
expect(drgws.success).to be_truthy
|
116
|
+
end
|
117
|
+
end
|