ngi_api 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,15 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ *.bundle
11
+ *.so
12
+ *.o
13
+ *.a
14
+ mkmf.log
15
+ cacert.pem
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in ngi_api.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 Marco Bulgarini
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,31 @@
1
+ # NgiApi
2
+
3
+ TODO: Write a gem description
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ ```ruby
10
+ gem 'ngi_api'
11
+ ```
12
+
13
+ And then execute:
14
+
15
+ $ bundle
16
+
17
+ Or install it yourself as:
18
+
19
+ $ gem install ngi_api
20
+
21
+ ## Usage
22
+
23
+ TODO: Write usage instructions here
24
+
25
+ ## Contributing
26
+
27
+ 1. Fork it ( https://github.com/[my-github-username]/ngi_api/fork )
28
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
29
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
30
+ 4. Push to the branch (`git push origin my-new-feature`)
31
+ 5. Create a new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,2 @@
1
+ require "bundler/gem_tasks"
2
+ Dir.glob('tasks/**/*.rake').each(&method(:import))
data/lib/README.rdoc ADDED
@@ -0,0 +1,45 @@
1
+ = NgiAPI {<img src="https://travis-ci.org/blacksd/ngi_api.png?rvm=1.9.3" />}[https://travis-ci.org/blacksd/ngi_api]
2
+
3
+ * https://github.com/blacksd/ngi_api
4
+ * https://rubygems.org/gems/ngi_api
5
+
6
+ == Description
7
+
8
+ This library is a convenient, easy way to access NGI's API for resellers - simple
9
+ object methods vs. custom SOAP calls. There are multiple built-in checks for type corrections, and
10
+ the entered values are automatically adjusted. Return values are parsed and presented as a hash.
11
+ This gem currently supports all API operations:
12
+ * list_bts
13
+ * list_comuni
14
+ * info_bts
15
+ * info_radio
16
+ * reboot_radio
17
+ * set_ethernet
18
+
19
+ == Dependencies
20
+
21
+ * rubyntlm version 0.3.2 or newer
22
+ * savon[http://savonrb.com/] version 2
23
+
24
+ == Support:
25
+
26
+ The bug tracker is available here: https://github.com/blacksd/ngi_api/issues
27
+
28
+ == Examples
29
+
30
+ With arguments as a hash, cast a
31
+
32
+ MyNGIAccess = NgiAPI.new(arguments)
33
+
34
+ and use the instance methods.
35
+
36
+ == Authors
37
+
38
+ Copyright (c) 2015 by Marco Bulgarini (marco.bulgarini@com-net.it)
39
+
40
+ This library is the second attempt in using Ruby at something practical. If you
41
+ think I did a good job, let me know!
42
+
43
+ == License
44
+
45
+ This library is distributed under the MIT license.
data/lib/ngi_api.rb ADDED
@@ -0,0 +1,271 @@
1
+ # encoding: utf-8
2
+
3
+ require "digest"
4
+ # gem "rubyntlm", "~> 0.3.2" # no "gems" in here! Dependencies go through gemspec.
5
+ require "rubyntlm"
6
+ require "savon"
7
+ require "net/http"
8
+
9
+ # This is the main class, holding all of the functions
10
+ # and checks. The instance it's built with a hash of arguments.
11
+ class NgiAPI
12
+
13
+ # call-seq:
14
+ # MyNGIAccess = NgiAPI.new(arguments)
15
+ #
16
+ #
17
+ # Initialize the class instance with a hash of arguments. The hash is mandatory and must not be empty.
18
+ # There's a test mode and a production live mode.
19
+ # == Test mode
20
+ # arguments[:test] = true
21
+ # Puts any operation in test mode, with standard login and password and a different wsdl.
22
+ # arguments[:debug] = true
23
+ # The :debug can be set to true for improved stdout logging.
24
+ # == Production mode
25
+ # arguments[:partnerLogin] = "13243546"
26
+ # arguments[:partnerPassword] = "randomsaltprovidedbyNGI"
27
+ #
28
+ def initialize(args)
29
+ raise ArgumentError, "no arguments provided, no idea what to do" if args.empty?
30
+ raise ArgumentError, "\"test\" option provided with login and/or password - can't do that" if args[:test] && (!!args[:partnerLogin] || !!args[:partnerPassword])
31
+ raise ArgumentError, "you must give both a login and a password." if !!args[:partnerLogin] ^ !!args[:partnerPassword]
32
+ @partnerLogin = !!args[:test] ? "12345678" : parameter_to_string(args[:partnerLogin])
33
+ @partnerPassword = !!args[:test] ? "517fc7b578767ebfa6bb5252252653d2" : parameter_to_string(args[:partnerPassword])
34
+ fetch_cacert unless File.exist?('cacert.pem')
35
+ @soapClient = Savon.client do
36
+ wsdl !!args[:test] ? "https://www.eolo.it/ws/wsdl/?test" : "https://www.eolo.it/ws/wsdl"
37
+ ssl_ca_cert_file "cacert.pem"
38
+ if args[:debug]
39
+ log true
40
+ log_level :debug
41
+ pretty_print_xml true
42
+ end
43
+ end
44
+ end
45
+
46
+ # --------------------------------------
47
+ # :section: Available Operations
48
+ # As Public Instance Methods are the operations available through NGI APIs.
49
+ # Make good use of them, and don't abuse.
50
+ # --------------------------------------
51
+
52
+ # call-seq:
53
+ # MyNGIAccess.infoRadio(macAddresses_clientLogins) => {...}
54
+ #
55
+ # Status of a radio, obtained as a string or an array of a client login/mac address.
56
+ def infoRadio(macAddresses_clientLogins)
57
+
58
+ macAddressArray = []
59
+ clientLoginArray = []
60
+
61
+ case macAddresses_clientLogins.class.to_s
62
+ when "Array"
63
+ raise ArgumentError,"array exceeds 20 elements" if macAddresses_clientLogins.size > 20
64
+ macAddresses_clientLogins.each_with_index do |element,index|
65
+ raise ArgumentError, "value #{element} at position #{index} is not a valid mac address or a login" unless is_valid_mac(element) || is_valid_login(element)
66
+ macAddressArray.push(fix_mac_address(element)) if is_valid_mac(element)
67
+ clientLoginArray.push(fix_login(element)) if is_valid_login(element)
68
+ end
69
+ when "String"
70
+ raise ArgumentError,"the single value to check is not a valid mac address or customer login" unless is_valid_mac(macAddresses_clientLogins) || is_valid_login(macAddresses_clientLogins)
71
+ macAddressArray.push(fix_mac_address(macAddresses_clientLogins)) if is_valid_mac(macAddresses_clientLogins)
72
+ clientLoginArray.push(fix_login(macAddresses_clientLogins)) if is_valid_login(macAddresses_clientLogins)
73
+ else
74
+ raise ArgumentError,"unsupported data type: a single mac address or login string or an array of them are the only allowed types."
75
+ end
76
+
77
+ build_and_send_query(:info_radio,
78
+ {
79
+ macAddressList: macAddressArray,
80
+ clientLoginList: clientLoginArray
81
+ }
82
+ )
83
+ end
84
+
85
+ # call-seq:
86
+ # MyNGIAccess.infoBts(btsID) => {...}
87
+ #
88
+ # Obtain the exact informations about a specific BTS. btsID is a non-negative integer.
89
+ def infoBts(btsID)
90
+ raise ArgumentError, "btsID value not allowed" unless btsID.to_i > 0 && btsID.class.to_s == "Fixnum"
91
+ build_and_send_query(:info_bts,
92
+ {
93
+ btsID: parameter_to_string(btsID)
94
+ }
95
+ )
96
+ end
97
+
98
+ # call-seq:
99
+ # MyNGIAccess.infoCoverage(via,civico,istat) => {...}
100
+ #
101
+ # Gets the coverage for the specified address. The address is composed of
102
+ # * +via+ the street location
103
+ # * +civico+ the number
104
+ # * +istat+ the istat code for the town, gathered from listComuni
105
+ def infoCoverage(via,civico,istat)
106
+ build_and_send_query(:info_coverage,
107
+ {
108
+ via: parameter_to_string(via),
109
+ civico: parameter_to_string(civico),
110
+ istat: parameter_to_string(istat)
111
+ }
112
+ )
113
+ end
114
+
115
+ # call-seq:
116
+ # MyNGIAccess.listBts => {}
117
+ #
118
+ # Obtain a hash of active BTSes with their details. No input needed, lots of output to be expected.
119
+ def listBts
120
+ build_and_send_query(:list_bts)
121
+ end
122
+
123
+ # call-seq:
124
+ # MyNGIAccess.listComuni(comune) => {}
125
+ #
126
+ # Obtain the istat code for the town.
127
+ def listComuni(comune)
128
+ raise ArgumentError, "comune is not >=2 and <= 35 in length, or has not allowed characters" unless is_valid_comune(parameter_to_string(comune))
129
+ build_and_send_query(:list_comuni,
130
+ {
131
+ comune: parameter_to_string(comune)
132
+ }
133
+ )
134
+ end
135
+
136
+ # call-seq:
137
+ # MyNGIAccess.setEthernet(macAddress,statoEthernet) => {:stato_ethernet=>true}
138
+ #
139
+ # Set the ethernet adapter of a customer's radio.
140
+ def setEthernet(macAddress,statoEthernet)
141
+ raise ArgumentError, "specified mac address is wrong or in an invalid format" unless is_valid_mac(macAddress)
142
+ raise ArgumentError, "stato ethernet is wrong on in an invalid format" unless ["0","1"].include? parameter_to_string(statoEthernet)
143
+ build_and_send_query(:set_ethernet,
144
+ {
145
+ macAddress: fix_mac_address(parameter_to_string(macAddress)),
146
+ statoEthernet: parameter_to_string(statoEthernet)
147
+ }
148
+ )
149
+ end
150
+
151
+ # call-seq:
152
+ # MyNGIAccess.rebootRadio(macAddress) => {esito: true}
153
+ #
154
+ # Reboot a customer's radio.
155
+ def rebootRadio(macAddress)
156
+ raise ArgumentError, "specified mac address is wrong or in an invalid format" unless is_valid_mac(macAddress)
157
+ build_and_send_query(:reboot_radio,
158
+ {
159
+ macAddress: fix_mac_address(parameter_to_string(macAddress))
160
+ }
161
+ )
162
+ end
163
+
164
+ private
165
+
166
+ # formats the mac address for the request, stripping separators and upcasing it
167
+ def fix_mac_address(mac)
168
+ mac.to_s.gsub(/[\.:-]?/,'').upcase
169
+ end
170
+
171
+ # formats the login for the request, upcasing it
172
+ def fix_login(login)
173
+ login.upcase
174
+ end
175
+
176
+ # Download the 'cacert.pem' file from "curl.haxx.se" if not found in the running directory
177
+ # Courtesy of https://gist.github.com/fnichol/867550
178
+ def fetch_cacert
179
+ Net::HTTP.start("curl.haxx.se") do |http|
180
+ resp = http.get("/ca/cacert.pem")
181
+ if resp.code == "200"
182
+ open("cacert.pem", "wb") do |file|
183
+ file.write(resp.body)
184
+ end
185
+ else
186
+ raise "no \"cacert.pem\" file found, and can't download it from curl website"
187
+ end
188
+ end
189
+ end
190
+
191
+ # Build and submit the SOAP query.
192
+ # Needed the operation (raise an error if it's not an allowed one from the server) and a hash of optional parameters.
193
+ def build_and_send_query(type,params = {})
194
+ type = type.to_sym
195
+ raise ArgumentError, "query type not included in allowed operations: #{@soapClient.operations}" unless @soapClient.operations.include? type
196
+
197
+ message = { wsLogin: @partnerLogin }
198
+ checksum = @partnerLogin
199
+
200
+ case type
201
+ when :info_bts
202
+ checksum += params[:btsID]
203
+ message[:btsID] = params[:btsID]
204
+ when :list_comuni
205
+ checksum += params[:comune]
206
+ message[:comune] = params[:comune]
207
+ when :set_ethernet
208
+ checksum += params[:macAddress]
209
+ checksum += params[:statoEthernet]
210
+ message[:macAddress] = params[:macAddress]
211
+ message[:statoEthernet] = params[:statoEthernet]
212
+ when :reboot_radio
213
+ checksum += params[:macAddress]
214
+ message[:macAddress] = params[:macAddress]
215
+ when :info_radio
216
+ checksum += parameter_to_string(params[:macAddressList])
217
+ checksum += parameter_to_string(params[:clientLoginList])
218
+ message[:macAddressList] = {items: params[:macAddressList]}
219
+ message[:clientLoginList] = {items: params[:clientLoginList]}
220
+ when :list_bts # no input needed
221
+ end
222
+
223
+ message[:controlHash] = Digest::MD5.hexdigest(checksum+@partnerPassword)
224
+ @soapClient.call(type, message: message).to_hash[(type.to_s+"_response").to_sym]
225
+ end
226
+
227
+ # According to {http://unicode-table.com}[http://unicode-table.com]
228
+ # * \u{00E0} à
229
+ # * \u{00E8} è
230
+ # * \u{00E9} é
231
+ # * \u{00EC} ì
232
+ # * \u{00F2} ò
233
+ # * \u{00F9} ù
234
+ def is_valid_comune(comune)
235
+ !!comune.to_s[/^([a-zA-Z\u{00E0}\u{00E8}\u{00E9}\u{00EC}\u{00F2}\u{00F9}]{2}[a-zA-Z\u{0200}\u{0201}\u{0236}\u{0242}\u{0249}]{0,33})$/]
236
+ end
237
+
238
+ # Loose check for if a string is a valid login. Value must be formatted before submit with fix_login.
239
+ # Matches "w or W" + 11 digits
240
+ def is_valid_login(login)
241
+ !!login.to_s[/[wW]\d{11}/]
242
+ end
243
+
244
+ # Loose check for the validity of a MAC address. Value must be formatted with fix_mac_address before submit.
245
+ # Matches any of the following:
246
+ # * 00aabbccddee
247
+ # * 00-aa-bb-cc-dd-ee
248
+ # * 00:aa:bb:cc:dd:ee
249
+ # * 00.aa.bb.cc.dd.ee
250
+ def is_valid_mac(mac)
251
+ !!mac.to_s[/^([0-9a-fA-F]{2}[\.:-]?){5}([0-9a-fA-F]{2})$/]
252
+ end
253
+
254
+ # Formatting types according to NGI API
255
+ def parameter_to_string(parameter)
256
+ case parameter.class.to_s
257
+ when "TrueClass","FalseClass"
258
+ parameter ? "1" : "0"
259
+ when "Integer"
260
+ "%d" % parameter
261
+ when "Float"
262
+ "%.5f" % parameter
263
+ when "Array" # streamline it
264
+ parameter.map{ |element| parameter_to_string(element) }.join
265
+ else # for any other type, convert it to a string
266
+ "%s" % parameter.to_s
267
+ end
268
+ end
269
+
270
+ end
271
+
@@ -0,0 +1,4 @@
1
+ class NgiAPI
2
+ # gem version
3
+ VERSION = "0.0.2"
4
+ end
data/lib/test_cases.rb ADDED
@@ -0,0 +1,85 @@
1
+ # encoding: utf-8
2
+ load ('test_class.rb')
3
+ =begin
4
+
5
+ api_config_fake = {
6
+ partnerLogin: "asdasd12345",
7
+ partnerPassword: "asdasdhbi8asd78972ui"
8
+ }
9
+ myNgiAccess = NgiAPI.new(api_config_fake)
10
+
11
+ api_config_test = { test: true }
12
+ myNgiAccess = NgiAPI.new(api_config_test)
13
+
14
+ puts myNgiAccess.operations
15
+ puts myNgiAccess.listBts
16
+ puts myNgiAccess.infoBts(1)
17
+ puts myNgiAccess.listComuni("Lòp")
18
+ puts myNgiAccess.setEthernet("00-00-00000000",false)
19
+
20
+ # this will rise an exception, as per specs
21
+ begin
22
+ puts myNgiAccess.setEthernet("11-11-11-11-11-11",true)
23
+ rescue Exception => e
24
+ puts "Damn! Got an exception: #{e}"
25
+ end
26
+
27
+ puts myNgiAccess.rebootRadio("aa-bb-cc-dd-ee-11")
28
+
29
+ # this will rise an exception, as per specs
30
+ begin
31
+ puts myNgiAccess.rebootRadio("111111111111")
32
+ rescue Exception => e
33
+ puts "Damn! Got an exception, should be an internal server error: #{e}"
34
+ end
35
+
36
+ # this will trigger an ArgumentError
37
+ begin
38
+ api_config_err = { test: true, partnerLogin: "asdasd12345", partnerPassword: "asdasdhbi8asd78972ui" }
39
+ myNgiAccess_err = NgiAPI.new(api_config_err)
40
+ rescue Exception => e
41
+ puts "Damn! Got an exception, should be an invalid API initialization: #{e}"
42
+ end
43
+
44
+ # this will trigger an ArgumentError
45
+ begin
46
+ api_config_err2 = { partnerLogin: "asdasd12345" }
47
+ myNgiAccess_err2 = NgiAPI.new(api_config_err2)
48
+ rescue Exception => e
49
+ puts "Damn! Got an exception, should be an invalid API initialization: #{e}"
50
+ end
51
+
52
+
53
+ # this will trigger an ArgumentError
54
+ begin
55
+ puts myNgiAccess.infoRadio(["aa.bb.cc.dd.ee.ff","W12345678901"])
56
+ rescue Exception => e
57
+ puts "Damn! Got an exception, should be an invalid mix: #{e}"
58
+ end
59
+
60
+ =end
61
+
62
+ api_config_test = { test:true }
63
+ myNgiAccess = NgiAPI.new(api_config_test)
64
+
65
+ # puts myNgiAccess.operations
66
+ # puts myNgiAccess.infoRadio(["000000000000","aa11bb22cc33"])
67
+ puts myNgiAccess.infoRadio(["W00001200000","00:ee:aa:bb:cc:dd","W12345678901","W09898778766"])
68
+ # {:info=>{:radio_info_list=>[{:client_login=>{:"@xsi:type"=>"xsd:string"}, :mac_address=>"00EEAABBCCDD", :snr_up=>"1", :snr_down=>"2", :distanza=>"13.17", :stato_ethernet=>"1", :bts_id=>"2", :nome_cella=>nil, :tipo_radio=>nil, :"@xsi:type"=>"ns1:radioInfoType"}, {:client_login=>"W00000000001", :mac_address=>"000000000001", :snr_up=>"1", :snr_down=>"2", :distanza=>"13.17", :stato_ethernet=>"1", :bts_id=>"2", :nome_cella=>nil, :tipo_radio=>nil, :"@xsi:type"=>"ns1:radioInfoType"}], :"@xsi:type"=>"ns1:radioInfoListType"}}
69
+
70
+ puts myNgiAccess.listBts
71
+ # {:lista_bts=>{:items=>[{:bts_id=>"1", :nome_bts=>"1 of 18: 12345678-a9f1870699c64a453757842d645e36ea", :lat=>"45.8", :lng=>"8.45", :attiva=>false, :tech_string=>{:"@xsi:type"=>"ns1:nonNullName"}, :"@xsi:type"=>"ns1:BtsInfoType"}, {:bts_id=>"2", :nome_bts=>"2 of 18: 12345678-a9f1870699c64a453757842d645e36ea", :lat=>"45.8", :lng=>"8.45", :attiva=>false, :tech_string=>{:"@xsi:type"=>"ns1:nonNullName"}, :"@xsi:type"=>"ns1:BtsInfoType"}, {:bts_id=>"3", :nome_bts=>"3 of 18: 12345678-a9f1870699c64a453757842d645e36ea", :lat=>"45.8", :lng=>"8.45", :attiva=>false, :tech_string=>{:"@xsi:type"=>"ns1:nonNullName"}, :"@xsi:type"=>"ns1:BtsInfoType"}, {:bts_id=>"4", :nome_bts=>"4 of 18: 12345678-a9f1870699c64a453757842d645e36ea", :lat=>"45.8", :lng=>"8.45", :attiva=>false, :tech_string=>{:"@xsi:type"=>"ns1:nonNullName"}, :"@xsi:type"=>"ns1:BtsInfoType"}, {:bts_id=>"5", :nome_bts=>"5 of 18: 12345678-a9f1870699c64a453757842d645e36ea", :lat=>"45.8", :lng=>"8.45", :attiva=>false, :tech_string=>{:"@xsi:type"=>"ns1:nonNullName"}, :"@xsi:type"=>"ns1:BtsInfoType"}, {:bts_id=>"6", :nome_bts=>"6 of 18: 12345678-a9f1870699c64a453757842d645e36ea", :lat=>"45.8", :lng=>"8.45", :attiva=>false, :tech_string=>{:"@xsi:type"=>"ns1:nonNullName"}, :"@xsi:type"=>"ns1:BtsInfoType"}, {:bts_id=>"7", :nome_bts=>"7 of 18: 12345678-a9f1870699c64a453757842d645e36ea", :lat=>"45.8", :lng=>"8.45", :attiva=>false, :tech_string=>{:"@xsi:type"=>"ns1:nonNullName"}, :"@xsi:type"=>"ns1:BtsInfoType"}, {:bts_id=>"8", :nome_bts=>"8 of 18: 12345678-a9f1870699c64a453757842d645e36ea", :lat=>"45.8", :lng=>"8.45", :attiva=>false, :tech_string=>{:"@xsi:type"=>"ns1:nonNullName"}, :"@xsi:type"=>"ns1:BtsInfoType"}, {:bts_id=>"9", :nome_bts=>"9 of 18: 12345678-a9f1870699c64a453757842d645e36ea", :lat=>"45.8", :lng=>"8.45", :attiva=>false, :tech_string=>{:"@xsi:type"=>"ns1:nonNullName"}, :"@xsi:type"=>"ns1:BtsInfoType"}, {:bts_id=>"10", :nome_bts=>"10 of 18: 12345678-a9f1870699c64a453757842d645e36ea", :lat=>"45.8", :lng=>"8.45", :attiva=>false, :tech_string=>{:"@xsi:type"=>"ns1:nonNullName"}, :"@xsi:type"=>"ns1:BtsInfoType"}, {:bts_id=>"11", :nome_bts=>"11 of 18: 12345678-a9f1870699c64a453757842d645e36ea", :lat=>"45.8", :lng=>"8.45", :attiva=>false, :tech_string=>{:"@xsi:type"=>"ns1:nonNullName"}, :"@xsi:type"=>"ns1:BtsInfoType"}, {:bts_id=>"12", :nome_bts=>"12 of 18: 12345678-a9f1870699c64a453757842d645e36ea", :lat=>"45.8", :lng=>"8.45", :attiva=>false, :tech_string=>{:"@xsi:type"=>"ns1:nonNullName"}, :"@xsi:type"=>"ns1:BtsInfoType"}, {:bts_id=>"13", :nome_bts=>"13 of 18: 12345678-a9f1870699c64a453757842d645e36ea", :lat=>"45.8", :lng=>"8.45", :attiva=>false, :tech_string=>{:"@xsi:type"=>"ns1:nonNullName"}, :"@xsi:type"=>"ns1:BtsInfoType"}, {:bts_id=>"14", :nome_bts=>"14 of 18: 12345678-a9f1870699c64a453757842d645e36ea", :lat=>"45.8", :lng=>"8.45", :attiva=>false, :tech_string=>{:"@xsi:type"=>"ns1:nonNullName"}, :"@xsi:type"=>"ns1:BtsInfoType"}, {:bts_id=>"15", :nome_bts=>"15 of 18: 12345678-a9f1870699c64a453757842d645e36ea", :lat=>"45.8", :lng=>"8.45", :attiva=>false, :tech_string=>{:"@xsi:type"=>"ns1:nonNullName"}, :"@xsi:type"=>"ns1:BtsInfoType"}, {:bts_id=>"16", :nome_bts=>"16 of 18: 12345678-a9f1870699c64a453757842d645e36ea", :lat=>"45.8", :lng=>"8.45", :attiva=>false, :tech_string=>{:"@xsi:type"=>"ns1:nonNullName"}, :"@xsi:type"=>"ns1:BtsInfoType"}, {:bts_id=>"17", :nome_bts=>"17 of 18: 12345678-a9f1870699c64a453757842d645e36ea", :lat=>"45.8", :lng=>"8.45", :attiva=>false, :tech_string=>{:"@xsi:type"=>"ns1:nonNullName"}, :"@xsi:type"=>"ns1:BtsInfoType"}, {:bts_id=>"18", :nome_bts=>"18 of 18: 12345678-a9f1870699c64a453757842d645e36ea", :lat=>"45.8", :lng=>"8.45", :attiva=>false, :tech_string=>{:"@xsi:type"=>"ns1:nonNullName"}, :"@xsi:type"=>"ns1:BtsInfoType"}], :"@xsi:type"=>"ns1:BtsListType"}}
72
+
73
+ puts myNgiAccess.listComuni("Peppinaio")
74
+ # {:lista_comuni=>{:items=>[{:comune=>"Alagna", :istat=>"18001", :provincia=>"PV", :"@xsi:type"=>"ns1:comuneType"}, {:comune=>"Alpignano", :istat=>"1008", :provincia=>"TO", :"@xsi:type"=>"ns1:comuneType"}, {:comune=>"Montorio al Vomano", :istat=>"67028", :provincia=>"TE", :"@xsi:type"=>"ns1:comuneType"}, {:comune=>"Roio del Sangro", :istat=>"69077", :provincia=>"CH", :"@xsi:type"=>"ns1:comuneType"}, {:comune=>"Varano de' Melegari", :istat=>"34045", :provincia=>"PR", :"@xsi:type"=>"ns1:comuneType"}, {:comune=>"Voghera", :istat=>"18182", :provincia=>"PV", :"@xsi:type"=>"ns1:comuneType"}, {:comune=>"Zoppola", :istat=>"93051", :provincia=>"PN", :"@xsi:type"=>"ns1:comuneType"}], :"@xsi:type"=>"ns1:comuneListType"}}
75
+
76
+ puts myNgiAccess.rebootRadio("00eeaabbccdd")
77
+ # {:esito=>true}
78
+
79
+ puts myNgiAccess.infoBts(3)
80
+ # {:info_bts=>{:bts_id=>"3", :nome_bts=>"il nome \u00E8: 12345678, 3, bb5fa1323d296928d1a4c2ae5a908f70", :lat=>"45.9", :lng=>"8.15", :asl=>"99", :attiva=>true, :data_attivazione=>#<Date: 2015-01-08 ((2457031j,0s,0n),+0s,2299161j)>, :file_mappa=>"mappa.file", :inf_sx_lat=>"45.79585", :inf_sx_lng=>"7.873442", :sup_dx_lat=>"46.15581", :sup_dx_lng=>"8.391391", :tech_string=>{:"@xsi:type"=>"ns1:nonNullName"}, :"@xsi:type"=>"ns1:BtsFullInfoType"}}
81
+
82
+ puts myNgiAccess.setEthernet("00aabbccddee",true)
83
+ # {:stato_ethernet=>true}
84
+
85
+
data/ngi_api.gemspec ADDED
@@ -0,0 +1,30 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'ngi_api/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "ngi_api"
8
+ spec.version = NgiAPI::VERSION
9
+ spec.platform = Gem::Platform::RUBY
10
+ spec.authors = ["Marco Bulgarini"]
11
+ spec.email = ["marco.bulgarini@com-net.it"]
12
+ spec.summary = "NGI's API"
13
+ spec.description = "A ruby implementation of NGI's API"
14
+ spec.homepage = "https://rubygems.org/gems/ngi_api"
15
+ spec.license = "MIT"
16
+
17
+ spec.files = `git ls-files -z`.split("\x0")
18
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
19
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
20
+ spec.require_paths = ["lib"]
21
+
22
+ spec.add_development_dependency "bundler", "~> 1.7"
23
+ spec.add_development_dependency "rake", "~> 10.0"
24
+ spec.add_development_dependency "rspec"
25
+
26
+ # spec.add_runtime_dependency "digest" # no need to add stdlib!
27
+ # spec.add_runtime_dependency "net/http" # no need to add stdlib!
28
+ spec.add_runtime_dependency "rubyntlm", "~> 0.3.2"
29
+ spec.add_runtime_dependency "savon"
30
+ end
@@ -0,0 +1,25 @@
1
+ require 'spec_helper'
2
+
3
+ describe NgiApi do
4
+ # subject { NgiApi.new }
5
+
6
+ # describe '#process' do
7
+ # let(:input) { 'My grandmom gave me a sweater for Christmas.' }
8
+ # let(:output) { subject.process(input) }
9
+
10
+ # it 'converts to lowercase' do
11
+ # expect(output.downcase).to eq output
12
+ # end
13
+
14
+ # it 'combines nouns with doge adjectives' do
15
+ # expect(output).to match /so grandmom\./i
16
+ # expect(output).to match /such sweater\./i
17
+ # expect(output).to match /very christmas\./i
18
+ # end
19
+
20
+ # it 'always appends "wow."' do
21
+ # expect(output).to end_with 'wow.'
22
+ # end
23
+ # end
24
+
25
+ end
@@ -0,0 +1 @@
1
+ require 'ngi_api'
data/tasks/rspec.rake ADDED
@@ -0,0 +1,3 @@
1
+ require 'rspec/core/rake_task'
2
+
3
+ RSpec::Core::RakeTask.new(:spec)
metadata ADDED
@@ -0,0 +1,143 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ngi_api
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.2
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Marco Bulgarini
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2015-01-25 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: bundler
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: '1.7'
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: '1.7'
30
+ - !ruby/object:Gem::Dependency
31
+ name: rake
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ~>
36
+ - !ruby/object:Gem::Version
37
+ version: '10.0'
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ version: '10.0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: rspec
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ - !ruby/object:Gem::Dependency
63
+ name: rubyntlm
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ~>
68
+ - !ruby/object:Gem::Version
69
+ version: 0.3.2
70
+ type: :runtime
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ~>
76
+ - !ruby/object:Gem::Version
77
+ version: 0.3.2
78
+ - !ruby/object:Gem::Dependency
79
+ name: savon
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ! '>='
84
+ - !ruby/object:Gem::Version
85
+ version: '0'
86
+ type: :runtime
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ! '>='
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
94
+ description: A ruby implementation of NGI's API
95
+ email:
96
+ - marco.bulgarini@com-net.it
97
+ executables: []
98
+ extensions: []
99
+ extra_rdoc_files: []
100
+ files:
101
+ - .gitignore
102
+ - Gemfile
103
+ - LICENSE.txt
104
+ - README.md
105
+ - Rakefile
106
+ - lib/README.rdoc
107
+ - lib/cacert.pem
108
+ - lib/ngi_api.rb
109
+ - lib/ngi_api/version.rb
110
+ - lib/test_cases.rb
111
+ - ngi_api.gemspec
112
+ - spec/ngi_api_spec.rb
113
+ - spec/spec_helper.rb
114
+ - tasks/rspec.rake
115
+ homepage: https://rubygems.org/gems/ngi_api
116
+ licenses:
117
+ - MIT
118
+ post_install_message:
119
+ rdoc_options: []
120
+ require_paths:
121
+ - lib
122
+ required_ruby_version: !ruby/object:Gem::Requirement
123
+ none: false
124
+ requirements:
125
+ - - ! '>='
126
+ - !ruby/object:Gem::Version
127
+ version: '0'
128
+ required_rubygems_version: !ruby/object:Gem::Requirement
129
+ none: false
130
+ requirements:
131
+ - - ! '>='
132
+ - !ruby/object:Gem::Version
133
+ version: '0'
134
+ requirements: []
135
+ rubyforge_project:
136
+ rubygems_version: 1.8.24
137
+ signing_key:
138
+ specification_version: 3
139
+ summary: NGI's API
140
+ test_files:
141
+ - spec/ngi_api_spec.rb
142
+ - spec/spec_helper.rb
143
+ has_rdoc: