cwmp 0.1.4 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- ZjYyNWVmZDgwODQ1OTA1MGUyMjhlZjRkOGJmODdiNjVmZDc0OTZmYQ==
4
+ N2ExN2IwZDNhYzA4ZGQ3YWNlNzU2NzY4YTAxZWU1OTVkYzY3Y2IxYQ==
5
5
  data.tar.gz: !binary |-
6
- YTJhMTlmNjU3M2EzZmVmMmNiY2Q4ZGM4MTEwOTIyZjkzMzRhYWFmOQ==
6
+ YmFlYzhkN2E5MjY4ZmQ0OWQ5N2I0YjMzMTIxYWRjZWZlZjQyYzkwYQ==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- NjU0Y2RiY2NmNzhkZTFmYmM2MGYzYThhYzNjYTA5ZDA3MjBkY2QzOTE1MDU5
10
- ZDQ1MmI1MTFhMTQxMmIyNzNiMjQ3NDYyMWI2ODI0ZmI0NDdjZmIwZGMxNzg0
11
- OGMxNzdiY2QxMzMwMmY2YWFhY2U4ZjRlYjUzYWQ3NTNkNGMzNDg=
9
+ NDA5ZjJmZDkyNDQ2OTMwYWIwODA4M2JmMjljN2MwMzMyZjY0YzVkYTI5NjEx
10
+ NDM5MmRkMzQ3NTdjNjQwNTU5NWNiM2VlYWUzNDA4ZjMzMzZmMzA3YTAwNjZh
11
+ OWNjMmEzNGM5M2FlMWQ4YWI4N2JhNDIyNGNmYmQ2ZGNjNjAxMmU=
12
12
  data.tar.gz: !binary |-
13
- MzgyZDhiYWM5ZmQ4YmFhZWY4YWEzYWI0NzgyNzIxMmVkODU3NjFjMWIwMmQx
14
- MmEzZGI0ZjMxZTQ2YzkyYjM3ODM3MTEzZTZiMzRhNmQ0NTBjMjE5ZTFlNDlj
15
- ZDI5MGY4YjIyNDJmZDBlZGU1NGYyNjhjNzJkY2VkZmUxMWRlNTc=
13
+ MmU2ZDVhZTI2ZDA4MWFiNTNiNDIwNmU3ZmZlODI4ZmViZjNhYzFjMGNlMWIz
14
+ NzVlZGFiNjU3YTY3ZDI0M2Q3ZjQxNWRjYmRkYjdmYWI2YTIwNmQzMDMzNTY0
15
+ N2UwNzA4MmIyNzUzNzhjZGEwN2IwYzk3M2E0YmZlMzNkMGU3ZDE=
data/.travis.yml ADDED
@@ -0,0 +1,3 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.9.3
data/README.md CHANGED
@@ -7,6 +7,7 @@ A ruby library for parsing and crafting CWMP messages. Includes an ACS server an
7
7
  ```ruby
8
8
  require 'cwmp'
9
9
 
10
+ puts Cwmp::Message::inform "Moonar", "130978", "00001", "1 BOOT", "0.0.1"
10
11
  puts Cwmp::Message::inform_response
11
12
  puts Cwmp::Message::get_parameter_values ["Device.ManagementServer.", "Device.Time."]
12
13
  puts Cwmp::Message::set_parameter_values [["InternetGatewayDevice.Services.VoiceService.1.VoiceProfile.1.Enable", "Enabled"], ["InternetGatewayDevice.LANDevice.1.LANHostConfigManagement.DHCPStaticAddress.1.Enable", "true"]]
data/Rakefile ADDED
@@ -0,0 +1,9 @@
1
+ require 'rake/testtask'
2
+
3
+ task :default => [:test]
4
+
5
+ Rake::TestTask.new do |t|
6
+ t.libs << "test"
7
+ t.test_files = FileList['test/test*.rb']
8
+ t.verbose = true
9
+ end
data/bin/acs CHANGED
@@ -11,5 +11,5 @@ o.on('-v', '--version', 'Version') { puts "acs v#{Cwmp::VERSION}"; exit }
11
11
  o.parse!
12
12
 
13
13
  port = options['port'] || 9321
14
- Cwmp::Acs.new(port).start
14
+ Cwmp::Acs.instance.start(port)
15
15
 
data/bin/cpe CHANGED
@@ -11,7 +11,7 @@ o.on('-h', '--help', 'Server port') { puts o; exit }
11
11
  o.on('-v', '--version', 'Version') { puts "cpe v#{Cwmp::VERSION}"; exit }
12
12
  o.parse!
13
13
 
14
- url = options['url'] || 'http://localhost:9292/acs'
14
+ url = options['url'] || 'http://localhost:9321/acs'
15
15
  periodic_interval = options['periodic'] || 0
16
16
 
17
17
  cpe = Cwmp::Cpe.new url, periodic_interval, {:serial => "A54FD"}
data/cwmp.gemspec CHANGED
@@ -18,4 +18,5 @@ Gem::Specification.new do |spec|
18
18
  spec.add_dependency('thin', '~> 1.6', '>= 1.6.2')
19
19
  spec.add_dependency('http_router', '~> 0.11', '>= 0.11.1')
20
20
  spec.add_dependency('httpclient', '~> 2.4', '>= 2.4.0')
21
- end
21
+ spec.add_dependency('rake', '~> 0.9', '>= 0.9.2')
22
+ end
@@ -0,0 +1,9 @@
1
+
2
+
3
+ acs = Cwmp::Acs.instance
4
+ puts acs.cpes
5
+ acs.GetParameterValues "A54FD", "ciao."
6
+
7
+ acs.start_session "A54FD" do |cpe|
8
+
9
+ end
data/lib/cwmp/acs.rb CHANGED
@@ -5,17 +5,34 @@ require 'http_router'
5
5
  require 'nokogiri'
6
6
  require 'readline'
7
7
  require 'digest'
8
+ require 'singleton'
8
9
 
9
10
  Thread::abort_on_exception = true
10
11
 
11
12
  module Cwmp
12
13
 
14
+ class CpeSession
15
+ def initialize
16
+
17
+ end
18
+ end
19
+
20
+ class Request
21
+ attr_accessor :message, :cb
22
+ def initialize message, &block
23
+ @message = message
24
+ @cb = block
25
+ end
26
+ end
27
+
13
28
  class AcsCpe
14
- attr_accessor :serial, :conn_req, :queue, :session_cookie
29
+ attr_accessor :serial, :conn_req, :queue, :session_cookie, :req_currently_in_service, :session
15
30
 
16
31
  def initialize serial
17
32
  @serial = serial
18
33
  @queue = Queue.new
34
+ @req_currently_in_service = nil
35
+ @session = nil
19
36
  end
20
37
 
21
38
  def do_connection_request
@@ -34,70 +51,81 @@ module Cwmp
34
51
  req = Rack::Request.new(env)
35
52
  len = req.content_length.to_i
36
53
 
37
- if len == 0
38
- message_type = ''
39
- else
40
- body = req.body.read
41
- doc = Nokogiri::XML(body)
42
- body =~ /(\w+):Envelope/
43
- soap_ns = $1
44
- message_type = doc.css("#{soap_ns}|Body")[0].element_children[0].name
45
- end
46
-
47
- if message_type == "Inform"
48
- manufacturer = doc.css("Manufacturer").text
49
- oui = doc.css("OUI").text
50
- serial_number = doc.css("SerialNumber").text
51
- event_codes = doc.css("EventCode").map { |n| n.text }
52
- parameters = {}
53
- doc.css("ParameterValueStruct").map { |it| parameters[it.element_children[0].text] = it.element_children[1].text }
54
-
55
- ck = Digest::MD5.hexdigest("#{serial_number}#{Time.new.to_i}")
56
-
57
- if !@acs.cpes.has_key? serial_number
58
- cpe = AcsCpe.new serial_number
59
- cpe.conn_req = parameters['InternetGatewayDevice.ManagementServer.ConnectionRequestURL']
60
- cpe.session_cookie = ck
61
- @acs.cpes[serial_number] = cpe
62
- end
63
- puts "got Inform from #{req.ip}:#{req.port} [sn #{serial_number}] with eventcodes #{event_codes.join(", ")}"
64
-
65
- inform_response = Cwmp::Message::inform_response
66
- response = Rack::Response.new inform_response, 200, {'Connection' => 'Keep-Alive', 'Server' => 'ruby-cwmp'}
67
- response.set_cookie("sessiontrack", {:value => ck, :path => "/", :expires => Time.now+24*60*60})
68
- response.finish
69
- elsif message_type == "TransferComplete"
70
- puts "got TransferComplete"
71
- else
54
+ begin
72
55
  if len == 0
73
- puts "got Empty Post"
56
+ message_type = ''
74
57
  else
75
- puts "got #{message_type}"
76
- case message_type
77
- when "GetParameterValuesResponse"
78
- doc.css("ParameterValueStruct").each do |node|
79
- puts "#{node.element_children[0].text}: #{node.element_children[1].text}"
80
- end
81
- when "Fault"
82
- puts "#{doc.css("faultstring").text}: #{doc.css("FaultString").text}"
83
- end
58
+ body = req.body.read
59
+ mess = Cwmp::Message::parse_from_text body
60
+ message_type = mess.message_type
84
61
  end
85
62
 
86
- cookie = req.cookies['sessiontrack']
87
- @acs.cpes.each do |k,c|
88
- cpe = c if c.session_cookie = cookie
89
- end
63
+ if message_type == "Inform"
64
+ doc = mess.parsed_xml_doc
65
+ manufacturer = doc.css("Manufacturer").text
66
+ oui = doc.css("OUI").text
67
+ serial_number = doc.css("SerialNumber").text
68
+ event_codes = doc.css("EventCode").map { |n| n.text }
69
+ parameters = {}
70
+ doc.css("ParameterValueStruct").map { |it| parameters[it.element_children[0].text] = it.element_children[1].text }
71
+
72
+ ck = Digest::MD5.hexdigest("#{serial_number}#{Time.new.to_i}")
73
+
74
+ if !@acs.cpes.has_key? serial_number
75
+ cpe = AcsCpe.new serial_number
76
+ cpe.conn_req = parameters['InternetGatewayDevice.ManagementServer.ConnectionRequestURL']
77
+ cpe.session_cookie = ck
78
+ @acs.cpes[serial_number] = cpe
79
+ end
80
+ puts "got Inform from #{req.ip}:#{req.port} [sn #{serial_number}] with eventcodes #{event_codes.join(", ")}"
90
81
 
91
- # Got Empty Post or a Response. Now check for any event to send, otherwise 204
92
- if cpe.queue.size > 0
93
- m = cpe.queue.pop
94
- response = Rack::Response.new m, 200, {'Connection' => 'Keep-Alive', 'Server' => 'ruby-cwmp'}
82
+ inform_response = Cwmp::Message::inform_response
83
+ response = Rack::Response.new inform_response.xml, 200, {'Connection' => 'Keep-Alive', 'Server' => 'ruby-cwmp'}
84
+ response.set_cookie("sessiontrack", {:value => ck, :path => "/", :expires => Time.now+24*60*60})
95
85
  response.finish
86
+ elsif message_type == "TransferComplete"
87
+ puts "got TransferComplete"
96
88
  else
97
- puts "sending 204"
98
- [204, {"Connection" => "Close", 'Server' => 'ruby-cwmp'}, ""]
99
- end
89
+ cookie = req.cookies['sessiontrack']
90
+ @acs.cpes.each do |k,c|
91
+ cpe = c if c.session_cookie = cookie
92
+ end
100
93
 
94
+ if len == 0
95
+ puts "got Empty Post"
96
+ else
97
+ puts "got #{message_type}"
98
+ doc = mess.parsed_xml_doc
99
+ case message_type
100
+ when "GetParameterValuesResponse"
101
+ doc.css("ParameterValueStruct").each do |node|
102
+ puts "#{node.element_children[0].text}: #{node.element_children[1].text}"
103
+ end
104
+ when "Fault"
105
+ puts "#{doc.css("faultstring").text}: #{doc.css("FaultString").text}"
106
+ end
107
+
108
+ if cpe.req_currently_in_service != nil
109
+ cpe.req_currently_in_service.cb.call(mess)
110
+ end
111
+ end
112
+
113
+
114
+ # Got Empty Post or a Response. Now check for any event to send, otherwise 204
115
+ if cpe.queue.size > 0
116
+ m = cpe.queue.pop
117
+ cpe.req_currently_in_service = m
118
+ response = Rack::Response.new m.message, 200, {'Connection' => 'Keep-Alive', 'Server' => 'ruby-cwmp'}
119
+ response.finish
120
+ else
121
+ puts "sending 204"
122
+ [204, {"Connection" => "Close", 'Server' => 'ruby-cwmp'}, ""]
123
+ end
124
+ end
125
+ rescue Exception => e
126
+ puts e
127
+ puts e.backtrace
128
+ raise e
101
129
  end
102
130
  end
103
131
 
@@ -105,11 +133,13 @@ module Cwmp
105
133
 
106
134
 
107
135
  class Acs
136
+ include Singleton
137
+
108
138
  attr_accessor :cpes
109
139
 
110
- def initialize (port)
140
+ def initialize
111
141
  ac = self
112
- @port = port
142
+
113
143
  # @handler = Handler.new
114
144
  @app = HttpRouter.new do
115
145
  # add('/api').to(SocketApp.new)
@@ -121,7 +151,7 @@ module Cwmp
121
151
  def start_cli
122
152
  list = [
123
153
  'GetParameterValues', 'SetParameterValues', 'Reboot', 'FactoryReset', 'Download', 'AddObject', 'DeleteObject',
124
- 'help', 'quit', "waitMessage"
154
+ 'help', 'list', 'quit', "waitMessage"
125
155
  ].sort
126
156
 
127
157
  comp = proc { |s| list.grep(/^#{Regexp.escape(s)}/) }
@@ -131,35 +161,74 @@ module Cwmp
131
161
 
132
162
  while line = ::Readline.readline('> ', true)
133
163
  case line
134
- when "quit"
164
+ when "quit", "exit"
135
165
  puts "Bye"
136
166
  exit(0)
137
167
  when "help"
138
- help
168
+ puts "help not available"
169
+ when "list games"
170
+ puts ["FALKEN'S MAZE", "BLACK JACK", "GIN RUMMY", "HEARTS", "BRIDGE", "CHECKERS", "CHESS", "POKER", "FIGHTER COMBAT", "GUERRILLA ENGAGEMENT", "DESERT WARFARE" "AIR-TO-GROUND ACTIONS", "THEATERWIDE TACTICAL WARFARE", "THEATERWIDE BIOTOXIC AND CHEMICAL WARFARE", "GLOBAL THERMONUCLEAR WAR"].join "\n"
171
+ when "help games"
172
+ puts "Games refers to models, simulations and games which have strategic applications"
139
173
  when "list"
140
174
  p @cpes
141
- when /^get (\w+) (.+)/
142
- cpe = @cpes[$1]
143
- cpe.queue << Cwmp::Message::get_parameter_values($2)
144
- cpe.do_connection_request
145
- when /reboot (\w+)/
146
- cpe = @cpes[$1]
147
- cpe.queue << Cwmp::Message::reboot
175
+ when /send (\w+) (\w+) (.+)/
176
+ message_type = $1
177
+ serial = $2
178
+ args = $3.split(" ")
179
+
180
+ # allowed_messages = ["GetParameterValues", "GetParameterNames", "SetParameterValues", "AddObject", "DeleteObject", "Reboot", "FactoryReset"]
181
+ # if !allowed_messages.include? message_type
182
+ # puts "cmd #{message_type} unknown"
183
+ # next
184
+ # end
185
+
186
+ cpe = @cpes[serial]
187
+ if !cpe
188
+ puts "cpe #{serial} unknown"
189
+ next
190
+ end
191
+
192
+ mess = Object.const_get("Cwmp").const_get("Message").send(message_type, args)
193
+ cpe.queue << Cwmp::Request.new(mess) do |resp|
194
+ puts "arrived #{resp}"
195
+ end
148
196
  cpe.do_connection_request
197
+ when "run"
198
+ begin
199
+ require './examples/api_usage'
200
+ rescue LoadError
201
+ puts "file not found"
202
+ rescue SyntaxError => e
203
+ puts "file contains syntax errors: #{e.message}"
204
+ rescue Exception => e
205
+ puts "runtime error: #{e.message}"
206
+ end
207
+ else
208
+ puts "unknown command <#{line}>" if line != ""
149
209
  end
150
210
  end
151
211
  end
152
212
 
153
- def start
213
+ def start port
214
+ trap("SIGINT") { puts "Bye"; exit! }
215
+ @port = port
154
216
  puts "ACS #{Cwmp::VERSION} by Luca Cervasio <luca.cervasio@gmail.com>"
155
217
  puts "Daemon running on http://localhost:#{@port}/acs"
156
- @web = Thread.new do
157
- Thin::Logging.silent = true
158
- Rack::Handler::Thin.run @app, :Port => @port
218
+
219
+ Thread.new do
220
+ start_cli
159
221
  end
160
222
 
161
- start_cli
223
+ Thin::Logging.silent = true
224
+ Rack::Handler::Thin.run @app, :Port => @port
225
+
162
226
  end
227
+
228
+ def start_session(serial, &block)
229
+
230
+ end
231
+
163
232
  end
164
233
 
165
234
  end
data/lib/cwmp/cpe.rb CHANGED
@@ -84,7 +84,7 @@ module Cwmp
84
84
  c = HTTPClient.new
85
85
 
86
86
  puts "sending Inform with event #{event}"
87
- resp = c.post @acs_url, Cwmp::Message::inform(@manufacturer, @oui, @serial, event, @software_version), {'User-Agent' => "ruby-cwmp #{Cwmp::VERSION}", "Content-Type" => 'text/xml; charset="utf-8"'}
87
+ resp = c.post @acs_url, Cwmp::Message::inform(@manufacturer, @oui, @serial, event, @software_version).xml, {'User-Agent' => "ruby-cwmp #{Cwmp::VERSION}", "Content-Type" => 'text/xml; charset="utf-8"'}
88
88
  doc = Nokogiri::XML(resp.body)
89
89
  resp.body =~ /(\w+):Envelope/
90
90
  soap_ns = $1
@@ -97,11 +97,11 @@ module Cwmp
97
97
  puts "got #{message_type}"
98
98
  case message_type
99
99
  when "GetParameterValues"
100
- resp = c.post @acs_url, Cwmp::Message::get_parameter_values_response, {'User-Agent' => "ruby-cwmp #{Cwmp::VERSION}", "Content-Type" => 'text/xml; charset="utf-8"'}
100
+ resp = c.post @acs_url, (Cwmp::Message::get_parameter_values_response).xml, {'User-Agent' => "ruby-cwmp #{Cwmp::VERSION}", "Content-Type" => 'text/xml; charset="utf-8"'}
101
101
  when "GetParameterNames"
102
- resp = c.post @acs_url, Cwmp::Message::get_parameter_names_response, {'User-Agent' => "ruby-cwmp #{Cwmp::VERSION}", "Content-Type" => 'text/xml; charset="utf-8"'}
102
+ resp = c.post @acs_url, (Cwmp::Message::get_parameter_names_response).xml, {'User-Agent' => "ruby-cwmp #{Cwmp::VERSION}", "Content-Type" => 'text/xml; charset="utf-8"'}
103
103
  when "SetParameterValues"
104
- resp = c.post @acs_url, Cwmp::Message::set_parameter_values_response, {'User-Agent' => "ruby-cwmp #{Cwmp::VERSION}", "Content-Type" => 'text/xml; charset="utf-8"'}
104
+ resp = c.post @acs_url, (Cwmp::Message::set_parameter_values_response).xml, {'User-Agent' => "ruby-cwmp #{Cwmp::VERSION}", "Content-Type" => 'text/xml; charset="utf-8"'}
105
105
  end
106
106
  end
107
107
  puts "got #{resp.status}, closing"
data/lib/cwmp/message.rb CHANGED
@@ -2,10 +2,77 @@ require 'nokogiri'
2
2
 
3
3
  module Cwmp
4
4
  class Message
5
+
5
6
  NAMESPACES = {"xmlns:soap" => "http://schemas.xmlsoap.org/soap/envelope/", "xmlns:soap-enc" => "http://schemas.xmlsoap.org/soap/encoding/", "xmlns:cwmp" => "urn:dslforum-org:cwmp-1-0", "xmlns:xsi" => "http://www.w3.org/2001/XMLSchema-instance", "xml:xsd" => "http://www.w3.org/2001/XMLSchema", "xmlns" => "urn:dslforum-org:cwmp-1-0"}
7
+ attr_accessor :message_type, :raw_xml_message, :parsed_xml_doc
8
+
9
+ def self.parse_from_text txtmsg
10
+ doc = Nokogiri::XML(txtmsg)
11
+ txtmsg =~ /(\w+):Envelope/
12
+ soap_ns = $1
13
+ message_type = doc.css("#{soap_ns}|Body")[0].element_children[0].name
14
+
15
+ m = Cwmp::Message.new
16
+ m.message_type = message_type
17
+ m.parsed_xml_doc = doc
18
+ m.raw_xml_message = txtmsg
19
+ return m
20
+ end
21
+
22
+
23
+ def to_s
24
+ return "CWMP Mess #{@message_type}"
25
+ end
26
+
27
+ def xml
28
+ return @raw_xml_message
29
+ end
30
+
31
+ def supported_model
32
+ if @raw_xml_message =~ /InternetGatewayDevice/
33
+ return 'TR-098'
34
+ else
35
+ return 'TR-181'
36
+ end
37
+ end
38
+
39
+ def self.reboot
40
+ m = Cwmp::Message.new
41
+ m.message_type = "Reboot"
42
+ b = Nokogiri::XML::Builder.new
43
+
44
+ b[:soap].Envelope(NAMESPACES) {
45
+ b[:soap].Header {}
46
+ b[:soap].Body {
47
+ b[:cwmp].Reboot() {}
48
+ }
49
+ }
50
+
51
+ m.raw_xml_message = b.to_xml
52
+ return m
53
+ end
54
+
55
+ def self.reboot_response
56
+ m = Cwmp::Message.new
57
+ m.message_type = "RebootResponse"
58
+ b = Nokogiri::XML::Builder.new
59
+
60
+ b[:soap].Envelope(NAMESPACES) {
61
+ b[:soap].Header {}
62
+ b[:soap].Body {
63
+ b[:cwmp].RebootResponse() {}
64
+ }
65
+ }
66
+
67
+ m.raw_xml_message = b.to_xml
68
+ return m
69
+ end
6
70
 
7
71
  def self.inform(manufacturer, oui, serial, eventcodes, software_version)
8
- return '<?xml version="1.0" encoding="UTF-8"?>
72
+ m = Cwmp::Message.new
73
+
74
+ m.message_type = "Inform"
75
+ m.raw_xml_message = '<?xml version="1.0" encoding="UTF-8"?>
9
76
  <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
10
77
  xmlns:soap-enc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:cwmp="urn:dslforum-org:cwmp-1-0"
11
78
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
@@ -61,50 +128,52 @@ module Cwmp
61
128
  </cwmp:Inform>
62
129
  </soap:Body>
63
130
  </soap:Envelope>'
131
+
132
+ return m
64
133
  end
65
134
 
66
135
  def self.inform_response
67
- b = Nokogiri::XML::Builder.new
68
-
69
- b[:soap].Envelope(NAMESPACES) {
70
- b[:soap].Header {}
71
- b[:soap].Body {
72
- b[:cwmp].InformResponse() {}
73
- }
74
- }
136
+ m = Cwmp::Message.new
75
137
 
76
- return b.to_xml
77
- end
138
+ m.message_type = "InformResponse"
78
139
 
79
- def self.reboot
80
140
  b = Nokogiri::XML::Builder.new
81
141
 
82
142
  b[:soap].Envelope(NAMESPACES) {
83
143
  b[:soap].Header {}
84
144
  b[:soap].Body {
85
- b[:cwmp].Reboot() {}
145
+ b[:cwmp].InformResponse() {}
86
146
  }
87
147
  }
88
148
 
89
- return b.to_xml
149
+ m.raw_xml_message = b.to_xml
150
+
151
+ return m
90
152
  end
91
153
 
92
- def self.get_parameter_values (leaves)
154
+ def self.set_parameter_values(leaves)
93
155
  b = Nokogiri::XML::Builder.new
94
156
 
95
157
  b[:soap].Envelope(NAMESPACES) {
96
158
  b[:soap].Header {}
97
159
  b[:soap].Body {
98
160
 
99
- b[:cwmp].GetParameterValues() {
100
- b.ParameterNames({"soap-enc:arrayType" => "cwmp:string[#{leaves.kind_of?(Array) ? leaves.size : '1'}]"}) {
101
- if leaves.kind_of?(Array)
161
+ b[:cwmp].SetParameterValues() {
162
+ b.ParameterList({"soap-enc:arrayType" => "cwmp:ParameterValueStruct[#{leaves[0].kind_of?(Array) ? leaves.size : '1'}]"}) {
163
+ if leaves[0].kind_of?(Array)
102
164
  leaves.each do |leaf|
103
- b.string leaf
165
+ b.ParameterValueStruct {
166
+ b.Name leaf[0]
167
+ b.Value leaf[1]
168
+ }
104
169
  end
105
170
  else
106
- b.string leaves
171
+ b.ParameterValueStruct {
172
+ b.Name leaves[0]
173
+ b.Value leaves[1]
174
+ }
107
175
  end
176
+ b.ParameterKey "asdads"
108
177
  }
109
178
  }
110
179
  }
@@ -113,68 +182,22 @@ module Cwmp
113
182
  return b.to_xml
114
183
  end
115
184
 
116
- def self.get_parameter_values_response
117
- return '<soap:Envelope
118
- xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
119
- xmlns:soap-enc="http://schemas.xmlsoap.org/soap/encoding/"
120
- xmlns:cwmp="urn:dslforum-org:cwmp-1-0"
121
- xmlns:xsd="http://www.w3.org/2001/XMLSchema"
122
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
123
- <soap:Header>
124
- <cwmp:ID soap:mustUnderstand="1"></cwmp:ID>
125
- </soap:Header>
126
- <soap:Body>
127
- <cwmp:GetParameterValuesResponse>
128
- <ParameterList soap-enc:arrayType="cwmp:ParameterValueStruct[5]">
129
- <ParameterValueStruct>
130
- <Name>InternetGatewayDevice.Time.NTPServer1</Name>
131
- <Value xsi:type="xsd:string">pool.ntp.org</Value>
132
- </ParameterValueStruct>
133
- <ParameterValueStruct>
134
- <Name>InternetGatewayDevice.Time.CurrentLocalTime</Name>
135
- <Value xsi:type="xsd:dateTime">2014-07-11T09:08:25</Value>
136
- </ParameterValueStruct>
137
- <ParameterValueStruct>
138
- <Name>InternetGatewayDevice.Time.LocalTimeZone</Name>
139
- <Value xsi:type="xsd:string">+00:00</Value>
140
- </ParameterValueStruct>
141
- <ParameterValueStruct>
142
- <Name>InternetGatewayDevice.Time.LocalTimeZoneName</Name>
143
- <Value xsi:type="xsd:string">Greenwich Mean Time : Dublin</Value>
144
- </ParameterValueStruct>
145
- <ParameterValueStruct>
146
- <Name>InternetGatewayDevice.Time.DaylightSavingsUsed</Name>
147
- <Value xsi:type="xsd:boolean">0</Value>
148
- </ParameterValueStruct>
149
- </ParameterList>
150
- </cwmp:GetParameterValuesResponse>
151
- </soap:Body>
152
- </soap:Envelope>'
153
- end
154
-
155
- def self.set_parameter_values (leaves)
185
+ def self.get_parameter_values(leaves)
156
186
  b = Nokogiri::XML::Builder.new
157
187
 
158
188
  b[:soap].Envelope(NAMESPACES) {
159
189
  b[:soap].Header {}
160
190
  b[:soap].Body {
161
191
 
162
- b[:cwmp].SetParameterValues() {
163
- b.ParameterList({"soap-enc:arrayType" => "cwmp:ParameterValueStruct[#{leaves[0].kind_of?(Array) ? leaves.size : '1'}]"}) {
164
- if leaves[0].kind_of?(Array)
192
+ b[:cwmp].GetParameterValues() {
193
+ b.ParameterNames({"soap-enc:arrayType" => "cwmp:string[#{leaves.kind_of?(Array) ? leaves.size : '1'}]"}) {
194
+ if leaves.kind_of?(Array)
165
195
  leaves.each do |leaf|
166
- b.ParameterValueStruct {
167
- b.Name leaf[0]
168
- b.Value leaf[1]
169
- }
196
+ b.string leaf
170
197
  end
171
198
  else
172
- b.ParameterValueStruct {
173
- b.Name leaves[0]
174
- b.Value leaves[1]
175
- }
199
+ b.string leaves
176
200
  end
177
- b.ParameterKey "asdads"
178
201
  }
179
202
  }
180
203
  }
@@ -183,13 +206,11 @@ module Cwmp
183
206
  return b.to_xml
184
207
  end
185
208
 
186
-
187
- def self.set_parameter_values_response
188
- return ''
189
- end
190
-
191
209
  def self.get_parameter_names_response
192
- return '<soap:Envelope
210
+ m = Cwmp::Message.new
211
+
212
+ m.message_type = "Inform"
213
+ m.raw_xml_message = '<soap:Envelope
193
214
  xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
194
215
  xmlns:soap-enc="http://schemas.xmlsoap.org/soap/encoding/"
195
216
  xmlns:cwmp="urn:dslforum-org:cwmp-1-0"
@@ -273,6 +294,53 @@ module Cwmp
273
294
  </cwmp:GetParameterNamesResponse>
274
295
  </soap:Body>
275
296
  </soap:Envelope>'
297
+
298
+ return m
299
+ end
300
+
301
+ def self.get_parameter_values_response
302
+ m = Cwmp::Message.new
303
+
304
+ m.message_type = "Inform"
305
+ m.raw_xml_message = '<soap:Envelope
306
+ xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
307
+ xmlns:soap-enc="http://schemas.xmlsoap.org/soap/encoding/"
308
+ xmlns:cwmp="urn:dslforum-org:cwmp-1-0"
309
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
310
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
311
+ <soap:Header>
312
+ <cwmp:ID soap:mustUnderstand="1"></cwmp:ID>
313
+ </soap:Header>
314
+ <soap:Body>
315
+ <cwmp:GetParameterValuesResponse>
316
+ <ParameterList soap-enc:arrayType="cwmp:ParameterValueStruct[5]">
317
+ <ParameterValueStruct>
318
+ <Name>InternetGatewayDevice.Time.NTPServer1</Name>
319
+ <Value xsi:type="xsd:string">pool.ntp.org</Value>
320
+ </ParameterValueStruct>
321
+ <ParameterValueStruct>
322
+ <Name>InternetGatewayDevice.Time.CurrentLocalTime</Name>
323
+ <Value xsi:type="xsd:dateTime">2014-07-11T09:08:25</Value>
324
+ </ParameterValueStruct>
325
+ <ParameterValueStruct>
326
+ <Name>InternetGatewayDevice.Time.LocalTimeZone</Name>
327
+ <Value xsi:type="xsd:string">+00:00</Value>
328
+ </ParameterValueStruct>
329
+ <ParameterValueStruct>
330
+ <Name>InternetGatewayDevice.Time.LocalTimeZoneName</Name>
331
+ <Value xsi:type="xsd:string">Greenwich Mean Time : Dublin</Value>
332
+ </ParameterValueStruct>
333
+ <ParameterValueStruct>
334
+ <Name>InternetGatewayDevice.Time.DaylightSavingsUsed</Name>
335
+ <Value xsi:type="xsd:boolean">0</Value>
336
+ </ParameterValueStruct>
337
+ </ParameterList>
338
+ </cwmp:GetParameterValuesResponse>
339
+ </soap:Body>
340
+ </soap:Envelope>'
341
+
342
+ return m
276
343
  end
344
+
277
345
  end
278
346
  end
data/lib/cwmp/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Cwmp
2
- VERSION = "0.1.4"
2
+ VERSION = "0.2.0"
3
3
  end
@@ -0,0 +1,19 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require_relative '../lib/cwmp/message.rb'
4
+ require "test/unit"
5
+
6
+ class TestMessage < Test::Unit::TestCase
7
+
8
+ def test_inform
9
+ inform = Cwmp::Message::inform "Moonar", "130978", "00001", "1 BOOT", "0.0.1"
10
+ assert_equal(inform.class.to_s, "Cwmp::Message")
11
+ end
12
+
13
+ def test_inform_response
14
+ inform_response = Cwmp::Message::inform_response
15
+ assert(inform_response.to_s =~ /InformResponse/)
16
+ end
17
+
18
+ end
19
+
@@ -0,0 +1,115 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "test/unit"
4
+
5
+ class TestParser < Test::Unit::TestCase
6
+
7
+ def test_parsing_get_parameter_values_response
8
+ txtmsg = '<soap:Envelope
9
+ xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
10
+ xmlns:soap-enc="http://schemas.xmlsoap.org/soap/encoding/"
11
+ xmlns:cwmp="urn:dslforum-org:cwmp-1-0"
12
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
13
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
14
+ <soap:Header>
15
+ <cwmp:ID soap:mustUnderstand="1"></cwmp:ID>
16
+ </soap:Header>
17
+ <soap:Body>
18
+ <cwmp:GetParameterValuesResponse>
19
+ <ParameterList soap-enc:arrayType="cwmp:ParameterValueStruct[5]">
20
+ <ParameterValueStruct>
21
+ <Name>InternetGatewayDevice.Time.NTPServer1</Name>
22
+ <Value xsi:type="xsd:string">pool.ntp.org</Value>
23
+ </ParameterValueStruct>
24
+ <ParameterValueStruct>
25
+ <Name>InternetGatewayDevice.Time.CurrentLocalTime</Name>
26
+ <Value xsi:type="xsd:dateTime">2014-07-11T09:08:25</Value>
27
+ </ParameterValueStruct>
28
+ <ParameterValueStruct>
29
+ <Name>InternetGatewayDevice.Time.LocalTimeZone</Name>
30
+ <Value xsi:type="xsd:string">+00:00</Value>
31
+ </ParameterValueStruct>
32
+ <ParameterValueStruct>
33
+ <Name>InternetGatewayDevice.Time.LocalTimeZoneName</Name>
34
+ <Value xsi:type="xsd:string">Greenwich Mean Time : Dublin</Value>
35
+ </ParameterValueStruct>
36
+ <ParameterValueStruct>
37
+ <Name>InternetGatewayDevice.Time.DaylightSavingsUsed</Name>
38
+ <Value xsi:type="xsd:boolean">0</Value>
39
+ </ParameterValueStruct>
40
+ </ParameterList>
41
+ </cwmp:GetParameterValuesResponse>
42
+ </soap:Body>
43
+ </soap:Envelope>'
44
+
45
+ msg = Cwmp::Message::parse_from_text(txtmsg)
46
+ assert_equal(msg.class.to_s, "Cwmp::Message")
47
+ assert_equal(msg.message_type, "GetParameterValuesResponse")
48
+ end
49
+
50
+ def test_parsing_inform
51
+ txtmsg = '<?xml version="1.0" encoding="UTF-8"?>
52
+ <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
53
+ xmlns:soap-enc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:cwmp="urn:dslforum-org:cwmp-1-0"
54
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
55
+ <soap:Header/>
56
+ <soap:Body soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
57
+ <cwmp:Inform>
58
+ <DeviceId>
59
+ <Manufacturer>Moonar</Manufacturer>
60
+ <OUI>130978</OUI>
61
+ <ProductClass>Router</ProductClass>
62
+ <SerialNumber>00001</SerialNumber>
63
+ </DeviceId>
64
+ <Event>
65
+ <EventStruct>
66
+ <EventCode>1 BOOT</EventCode>
67
+ <CommandKey/>
68
+ </EventStruct>
69
+ </Event>
70
+ <MaxEnvelopes>1</MaxEnvelopes>
71
+ <CurrentTime>2003-01-01T05:36:55Z</CurrentTime>
72
+ <RetryCount>0</RetryCount>
73
+ <ParameterList soap-enc:arrayType="cwmp:ParameterValueStruct[7]">
74
+ <ParameterValueStruct xsi:type="cwmp:ParameterValueStruct">
75
+ <Name>InternetGatewayDevice.DeviceInfo.HardwareVersion</Name>
76
+ <Value xsi:type="xsd:string">MNR001</Value>
77
+ </ParameterValueStruct>
78
+ <ParameterValueStruct xsi:type="cwmp:ParameterValueStruct">
79
+ <Name>InternetGatewayDevice.DeviceInfo.ProvisioningCode</Name>
80
+ <Value xsi:type="xsd:string">ABCD</Value>
81
+ </ParameterValueStruct>
82
+ <ParameterValueStruct xsi:type="cwmp:ParameterValueStruct">
83
+ <Name>InternetGatewayDevice.DeviceInfo.SoftwareVersion</Name>
84
+ <Value xsi:type="xsd:string">0.0.1</Value>
85
+ </ParameterValueStruct>
86
+ <ParameterValueStruct xsi:type="cwmp:ParameterValueStruct">
87
+ <Name>InternetGatewayDevice.DeviceInfo.SpecVersion</Name>
88
+ <Value xsi:type="xsd:string">1.0</Value>
89
+ </ParameterValueStruct>
90
+ <ParameterValueStruct xsi:type="cwmp:ParameterValueStruct">
91
+ <Name>InternetGatewayDevice.ManagementServer.ConnectionRequestURL</Name>
92
+ <Value xsi:type="xsd:string">http://127.0.0.1:9600/00001</Value>
93
+ </ParameterValueStruct>
94
+ <ParameterValueStruct xsi:type="cwmp:ParameterValueStruct">
95
+ <Name>InternetGatewayDevice.ManagementServer.ParameterKey</Name>
96
+ <Value xsi:type="xsd:string"/>
97
+ </ParameterValueStruct>
98
+ <ParameterValueStruct xsi:type="cwmp:ParameterValueStruct">
99
+ <Name>InternetGatewayDevice.WANDevice.1.WANConnectionDevice.1.WANIPConnection.1.ExternalIPAddress
100
+ </Name>
101
+ <Value xsi:type="xsd:string">10.19.0.00001</Value>
102
+ </ParameterValueStruct>
103
+ </ParameterList>
104
+ </cwmp:Inform>
105
+ </soap:Body>
106
+ </soap:Envelope>'
107
+
108
+ msg = Cwmp::Message::parse_from_text(txtmsg)
109
+ assert_equal(msg.class.to_s, "Cwmp::Message")
110
+ assert_equal(msg.message_type, "Inform")
111
+ assert_equal(msg.supported_model, "TR-098")
112
+ end
113
+
114
+ end
115
+
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cwmp
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Luca Cervasio
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-07-15 00:00:00.000000000 Z
11
+ date: 2015-08-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: nokogiri
@@ -110,6 +110,26 @@ dependencies:
110
110
  - - ! '>='
111
111
  - !ruby/object:Gem::Version
112
112
  version: 2.4.0
113
+ - !ruby/object:Gem::Dependency
114
+ name: rake
115
+ requirement: !ruby/object:Gem::Requirement
116
+ requirements:
117
+ - - ~>
118
+ - !ruby/object:Gem::Version
119
+ version: '0.9'
120
+ - - ! '>='
121
+ - !ruby/object:Gem::Version
122
+ version: 0.9.2
123
+ type: :runtime
124
+ prerelease: false
125
+ version_requirements: !ruby/object:Gem::Requirement
126
+ requirements:
127
+ - - ~>
128
+ - !ruby/object:Gem::Version
129
+ version: '0.9'
130
+ - - ! '>='
131
+ - !ruby/object:Gem::Version
132
+ version: 0.9.2
113
133
  description: A ruby library for parsing and crafting CWMP messages. Includes an ACS
114
134
  server and a CPE simulator.
115
135
  email: luca.cervasio@gmail.com
@@ -120,17 +140,22 @@ extensions: []
120
140
  extra_rdoc_files: []
121
141
  files:
122
142
  - .gitignore
143
+ - .travis.yml
123
144
  - Gemfile
124
145
  - LICENSE
125
146
  - README.md
147
+ - Rakefile
126
148
  - bin/acs
127
149
  - bin/cpe
128
150
  - cwmp.gemspec
151
+ - examples/api_usage.rb
129
152
  - lib/cwmp.rb
130
153
  - lib/cwmp/acs.rb
131
154
  - lib/cwmp/cpe.rb
132
155
  - lib/cwmp/message.rb
133
156
  - lib/cwmp/version.rb
157
+ - test/test_message.rb
158
+ - test/test_parser.rb
134
159
  homepage: https://github.com/lucacervasio/ruby-cwmp
135
160
  licenses:
136
161
  - MIT
@@ -151,9 +176,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
151
176
  version: '0'
152
177
  requirements: []
153
178
  rubyforge_project:
154
- rubygems_version: 2.2.2
179
+ rubygems_version: 2.4.6
155
180
  signing_key:
156
181
  specification_version: 4
157
182
  summary: A CWMP library
158
183
  test_files: []
159
- has_rdoc: