cwmp 0.1.3 → 0.1.4
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 +8 -8
- data/README.md +2 -2
- data/bin/acs +0 -2
- data/cwmp.gemspec +2 -2
- data/lib/cwmp/acs.rb +78 -27
- data/lib/cwmp/cpe.rb +6 -4
- data/lib/cwmp/message.rb +13 -0
- data/lib/cwmp/version.rb +1 -1
- metadata +4 -4
checksums.yaml
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
---
|
|
2
2
|
!binary "U0hBMQ==":
|
|
3
3
|
metadata.gz: !binary |-
|
|
4
|
-
|
|
4
|
+
ZjYyNWVmZDgwODQ1OTA1MGUyMjhlZjRkOGJmODdiNjVmZDc0OTZmYQ==
|
|
5
5
|
data.tar.gz: !binary |-
|
|
6
|
-
|
|
6
|
+
YTJhMTlmNjU3M2EzZmVmMmNiY2Q4ZGM4MTEwOTIyZjkzMzRhYWFmOQ==
|
|
7
7
|
SHA512:
|
|
8
8
|
metadata.gz: !binary |-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
9
|
+
NjU0Y2RiY2NmNzhkZTFmYmM2MGYzYThhYzNjYTA5ZDA3MjBkY2QzOTE1MDU5
|
|
10
|
+
ZDQ1MmI1MTFhMTQxMmIyNzNiMjQ3NDYyMWI2ODI0ZmI0NDdjZmIwZGMxNzg0
|
|
11
|
+
OGMxNzdiY2QxMzMwMmY2YWFhY2U4ZjRlYjUzYWQ3NTNkNGMzNDg=
|
|
12
12
|
data.tar.gz: !binary |-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
13
|
+
MzgyZDhiYWM5ZmQ4YmFhZWY4YWEzYWI0NzgyNzIxMmVkODU3NjFjMWIwMmQx
|
|
14
|
+
MmEzZGI0ZjMxZTQ2YzkyYjM3ODM3MTEzZTZiMzRhNmQ0NTBjMjE5ZTFlNDlj
|
|
15
|
+
ZDI5MGY4YjIyNDJmZDBlZGU1NGYyNjhjNzJkY2VkZmUxMWRlNTc=
|
data/README.md
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# Ruby CWMP
|
|
2
2
|
|
|
3
|
-
A ruby library
|
|
3
|
+
A ruby library for parsing and crafting CWMP messages. Includes an ACS server and a CPE simulator.
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## Crafting CWMP messages
|
|
6
6
|
|
|
7
7
|
```ruby
|
|
8
8
|
require 'cwmp'
|
data/bin/acs
CHANGED
data/cwmp.gemspec
CHANGED
|
@@ -3,9 +3,9 @@ require './lib/cwmp/version'
|
|
|
3
3
|
Gem::Specification.new do |spec|
|
|
4
4
|
spec.name = 'cwmp'
|
|
5
5
|
spec.version = Cwmp::VERSION
|
|
6
|
-
spec.date =
|
|
6
|
+
spec.date = Date.today.to_s
|
|
7
7
|
spec.summary = "A CWMP library"
|
|
8
|
-
spec.description = "A ruby library
|
|
8
|
+
spec.description = "A ruby library for parsing and crafting CWMP messages. Includes an ACS server and a CPE simulator."
|
|
9
9
|
spec.authors = ["Luca Cervasio"]
|
|
10
10
|
spec.email = 'luca.cervasio@gmail.com'
|
|
11
11
|
spec.files = `git ls-files`.split($/)
|
data/lib/cwmp/acs.rb
CHANGED
|
@@ -4,11 +4,31 @@ require 'thin'
|
|
|
4
4
|
require 'http_router'
|
|
5
5
|
require 'nokogiri'
|
|
6
6
|
require 'readline'
|
|
7
|
+
require 'digest'
|
|
7
8
|
|
|
9
|
+
Thread::abort_on_exception = true
|
|
8
10
|
|
|
9
11
|
module Cwmp
|
|
10
12
|
|
|
13
|
+
class AcsCpe
|
|
14
|
+
attr_accessor :serial, :conn_req, :queue, :session_cookie
|
|
15
|
+
|
|
16
|
+
def initialize serial
|
|
17
|
+
@serial = serial
|
|
18
|
+
@queue = Queue.new
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def do_connection_request
|
|
22
|
+
c = HTTPClient.new
|
|
23
|
+
c.get @conn_req
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
end
|
|
27
|
+
|
|
11
28
|
class Handler
|
|
29
|
+
def initialize obj
|
|
30
|
+
@acs = obj
|
|
31
|
+
end
|
|
12
32
|
|
|
13
33
|
def call(env)
|
|
14
34
|
req = Rack::Request.new(env)
|
|
@@ -17,8 +37,11 @@ module Cwmp
|
|
|
17
37
|
if len == 0
|
|
18
38
|
message_type = ''
|
|
19
39
|
else
|
|
20
|
-
|
|
21
|
-
|
|
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
|
|
22
45
|
end
|
|
23
46
|
|
|
24
47
|
if message_type == "Inform"
|
|
@@ -27,25 +50,54 @@ module Cwmp
|
|
|
27
50
|
serial_number = doc.css("SerialNumber").text
|
|
28
51
|
event_codes = doc.css("EventCode").map { |n| n.text }
|
|
29
52
|
parameters = {}
|
|
30
|
-
doc.css("ParameterValueStruct").map { |it| parameters[it.
|
|
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}")
|
|
31
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
|
|
32
63
|
puts "got Inform from #{req.ip}:#{req.port} [sn #{serial_number}] with eventcodes #{event_codes.join(", ")}"
|
|
33
64
|
|
|
34
65
|
inform_response = Cwmp::Message::inform_response
|
|
35
66
|
response = Rack::Response.new inform_response, 200, {'Connection' => 'Keep-Alive', 'Server' => 'ruby-cwmp'}
|
|
36
|
-
response.set_cookie("sessiontrack", {:value =>
|
|
67
|
+
response.set_cookie("sessiontrack", {:value => ck, :path => "/", :expires => Time.now+24*60*60})
|
|
37
68
|
response.finish
|
|
38
69
|
elsif message_type == "TransferComplete"
|
|
39
70
|
puts "got TransferComplete"
|
|
40
71
|
else
|
|
41
|
-
if
|
|
42
|
-
puts "got #{message_type}"
|
|
43
|
-
elsif len == 0
|
|
72
|
+
if len == 0
|
|
44
73
|
puts "got Empty Post"
|
|
74
|
+
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
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
cookie = req.cookies['sessiontrack']
|
|
87
|
+
@acs.cpes.each do |k,c|
|
|
88
|
+
cpe = c if c.session_cookie = cookie
|
|
45
89
|
end
|
|
46
90
|
|
|
47
91
|
# Got Empty Post or a Response. Now check for any event to send, otherwise 204
|
|
48
|
-
|
|
92
|
+
if cpe.queue.size > 0
|
|
93
|
+
m = cpe.queue.pop
|
|
94
|
+
response = Rack::Response.new m, 200, {'Connection' => 'Keep-Alive', 'Server' => 'ruby-cwmp'}
|
|
95
|
+
response.finish
|
|
96
|
+
else
|
|
97
|
+
puts "sending 204"
|
|
98
|
+
[204, {"Connection" => "Close", 'Server' => 'ruby-cwmp'}, ""]
|
|
99
|
+
end
|
|
100
|
+
|
|
49
101
|
end
|
|
50
102
|
end
|
|
51
103
|
|
|
@@ -53,16 +105,20 @@ module Cwmp
|
|
|
53
105
|
|
|
54
106
|
|
|
55
107
|
class Acs
|
|
108
|
+
attr_accessor :cpes
|
|
109
|
+
|
|
56
110
|
def initialize (port)
|
|
111
|
+
ac = self
|
|
57
112
|
@port = port
|
|
113
|
+
# @handler = Handler.new
|
|
58
114
|
@app = HttpRouter.new do
|
|
59
115
|
# add('/api').to(SocketApp.new)
|
|
60
|
-
add('/acs').to(Handler.new)
|
|
116
|
+
add('/acs').to(Handler.new(ac))
|
|
61
117
|
end
|
|
118
|
+
@cpes = {}
|
|
62
119
|
end
|
|
63
120
|
|
|
64
121
|
def start_cli
|
|
65
|
-
|
|
66
122
|
list = [
|
|
67
123
|
'GetParameterValues', 'SetParameterValues', 'Reboot', 'FactoryReset', 'Download', 'AddObject', 'DeleteObject',
|
|
68
124
|
'help', 'quit', "waitMessage"
|
|
@@ -81,34 +137,29 @@ module Cwmp
|
|
|
81
137
|
when "help"
|
|
82
138
|
help
|
|
83
139
|
when "list"
|
|
84
|
-
|
|
140
|
+
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
|
|
148
|
+
cpe.do_connection_request
|
|
85
149
|
end
|
|
86
150
|
end
|
|
87
151
|
end
|
|
88
152
|
|
|
89
153
|
def start
|
|
154
|
+
puts "ACS #{Cwmp::VERSION} by Luca Cervasio <luca.cervasio@gmail.com>"
|
|
155
|
+
puts "Daemon running on http://localhost:#{@port}/acs"
|
|
90
156
|
@web = Thread.new do
|
|
91
157
|
Thin::Logging.silent = true
|
|
92
158
|
Rack::Handler::Thin.run @app, :Port => @port
|
|
93
159
|
end
|
|
94
160
|
|
|
95
|
-
Thread.new do
|
|
96
|
-
while true do
|
|
97
|
-
sleep 1
|
|
98
|
-
Readline.clear_rl
|
|
99
|
-
puts "i"
|
|
100
|
-
Readline.restore
|
|
101
|
-
end
|
|
102
|
-
end
|
|
103
161
|
start_cli
|
|
104
162
|
end
|
|
105
163
|
end
|
|
106
164
|
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
end
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
165
|
+
end
|
data/lib/cwmp/cpe.rb
CHANGED
|
@@ -10,8 +10,8 @@ module Cwmp
|
|
|
10
10
|
@acs_url = acs_url
|
|
11
11
|
@serial = h[:serial] || "23434ds"
|
|
12
12
|
@oui = h[:oui] || "006754"
|
|
13
|
-
@software_version = h[:software_version] ||
|
|
14
|
-
@manufacturer = h[:manufacturer] || "
|
|
13
|
+
@software_version = h[:software_version] || Cwmp::VERSION
|
|
14
|
+
@manufacturer = h[:manufacturer] || "ruby-cwmp"
|
|
15
15
|
@state = 'off'
|
|
16
16
|
@periodic = Thread.new { periodic periodic } if periodic > 0
|
|
17
17
|
@conn_req = Thread.new { connection_request }
|
|
@@ -86,12 +86,14 @@ module Cwmp
|
|
|
86
86
|
puts "sending Inform with event #{event}"
|
|
87
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"'}
|
|
88
88
|
doc = Nokogiri::XML(resp.body)
|
|
89
|
-
|
|
89
|
+
resp.body =~ /(\w+):Envelope/
|
|
90
|
+
soap_ns = $1
|
|
91
|
+
message_type = doc.css("#{soap_ns}|Body").children.map(&:name)[1]
|
|
90
92
|
puts "got #{message_type} message"
|
|
91
93
|
resp = c.post @acs_url, "", {'User-Agent' => "ruby-cwmp #{Cwmp::VERSION}", "Content-Type" => 'text/xml; charset="utf-8"'}
|
|
92
94
|
while resp.status != 204
|
|
93
95
|
doc = Nokogiri::XML(resp.body)
|
|
94
|
-
message_type = doc.css("
|
|
96
|
+
message_type = doc.css("#{soap_ns}|Body").children.map(&:name)[1]
|
|
95
97
|
puts "got #{message_type}"
|
|
96
98
|
case message_type
|
|
97
99
|
when "GetParameterValues"
|
data/lib/cwmp/message.rb
CHANGED
|
@@ -76,6 +76,19 @@ module Cwmp
|
|
|
76
76
|
return b.to_xml
|
|
77
77
|
end
|
|
78
78
|
|
|
79
|
+
def self.reboot
|
|
80
|
+
b = Nokogiri::XML::Builder.new
|
|
81
|
+
|
|
82
|
+
b[:soap].Envelope(NAMESPACES) {
|
|
83
|
+
b[:soap].Header {}
|
|
84
|
+
b[:soap].Body {
|
|
85
|
+
b[:cwmp].Reboot() {}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
return b.to_xml
|
|
90
|
+
end
|
|
91
|
+
|
|
79
92
|
def self.get_parameter_values (leaves)
|
|
80
93
|
b = Nokogiri::XML::Builder.new
|
|
81
94
|
|
data/lib/cwmp/version.rb
CHANGED
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
|
+
version: 0.1.4
|
|
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-
|
|
11
|
+
date: 2014-07-15 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: nokogiri
|
|
@@ -110,8 +110,8 @@ dependencies:
|
|
|
110
110
|
- - ! '>='
|
|
111
111
|
- !ruby/object:Gem::Version
|
|
112
112
|
version: 2.4.0
|
|
113
|
-
description: A ruby library
|
|
114
|
-
and a CPE simulator.
|
|
113
|
+
description: A ruby library for parsing and crafting CWMP messages. Includes an ACS
|
|
114
|
+
server and a CPE simulator.
|
|
115
115
|
email: luca.cervasio@gmail.com
|
|
116
116
|
executables:
|
|
117
117
|
- acs
|