cwmp 0.1.4 → 0.2.0

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 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: