cwmp 0.1.3 → 0.1.4
Sign up to get free protection for your applications and to get access to all the features.
- 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
|