modou 0.0.1
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.
- data/.gitignore +17 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +29 -0
- data/Rakefile +1 -0
- data/bin/modou +533 -0
- data/lib/modou/version.rb +3 -0
- data/lib/modou.rb +5 -0
- data/modou.gemspec +23 -0
- metadata +84 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2014 Forrest Ye
|
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,29 @@
|
|
1
|
+
# Modou gem: your modouwifi cli
|
2
|
+
|
3
|
+
Work in process.
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
Add this line to your application's Gemfile:
|
8
|
+
|
9
|
+
gem 'modou'
|
10
|
+
|
11
|
+
And then execute:
|
12
|
+
|
13
|
+
$ bundle
|
14
|
+
|
15
|
+
Or install it yourself as:
|
16
|
+
|
17
|
+
$ gem install modou
|
18
|
+
|
19
|
+
## Usage
|
20
|
+
|
21
|
+
WIP
|
22
|
+
|
23
|
+
## Contributing
|
24
|
+
|
25
|
+
1. Fork it
|
26
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
27
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
28
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
29
|
+
5. Create new Pull Request
|
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
data/bin/modou
ADDED
@@ -0,0 +1,533 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# coding: utf-8
|
3
|
+
|
4
|
+
require 'httparty'
|
5
|
+
require 'pry'
|
6
|
+
require "ruby-progressbar"
|
7
|
+
require "terminal-table"
|
8
|
+
|
9
|
+
$host = '192.168.18.1'
|
10
|
+
|
11
|
+
###############################
|
12
|
+
# network helpers
|
13
|
+
###############################
|
14
|
+
|
15
|
+
def get(path)
|
16
|
+
HTTParty.get("http://#{$host}#{path}", $auth || {})
|
17
|
+
end
|
18
|
+
|
19
|
+
def post(path, args={})
|
20
|
+
HTTParty.post("http://#{$host}#{path}", args.merge($auth || {}))
|
21
|
+
end
|
22
|
+
|
23
|
+
###############################
|
24
|
+
# meta helpers
|
25
|
+
###############################
|
26
|
+
|
27
|
+
def sign_in
|
28
|
+
# result = HTTParty.post("http://#{$host}/api/auth/login", body: %q{{ "password" : "dropbear" }})
|
29
|
+
result = post('/api/auth/login', { body: %q{{ "password" : "dropbear" }} })
|
30
|
+
|
31
|
+
cookie = result.headers['Set-Cookie']
|
32
|
+
|
33
|
+
$auth = { headers: { 'Cookie' => cookie }, timeout: 999 }
|
34
|
+
end
|
35
|
+
|
36
|
+
def signin_required!
|
37
|
+
sign_in unless $auth
|
38
|
+
end
|
39
|
+
|
40
|
+
def table_from_response(response)
|
41
|
+
table = Terminal::Table.new do |table|
|
42
|
+
table.rows = response
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
###############################
|
47
|
+
# commands
|
48
|
+
###############################
|
49
|
+
|
50
|
+
def print_help
|
51
|
+
puts "available commands:"
|
52
|
+
puts
|
53
|
+
puts "modou version"
|
54
|
+
puts "modou update_check"
|
55
|
+
puts "modou download_firmware"
|
56
|
+
puts "modou upgrade"
|
57
|
+
puts "modou reboot"
|
58
|
+
puts "modou safe_reboot"
|
59
|
+
puts "modou client_mac"
|
60
|
+
puts "modou internet_test"
|
61
|
+
puts "modou wired_connections"
|
62
|
+
puts "modou wired_devices_info"
|
63
|
+
puts "modou wifi_devices_info"
|
64
|
+
puts "modou system_time"
|
65
|
+
puts "modou flash_info"
|
66
|
+
|
67
|
+
puts
|
68
|
+
puts "========== firmware =========="
|
69
|
+
puts "modou firmware info"
|
70
|
+
puts "modou firmware check"
|
71
|
+
puts "modou firmware download"
|
72
|
+
puts "modou firmware upgrade"
|
73
|
+
|
74
|
+
puts
|
75
|
+
puts "========== backlight =========="
|
76
|
+
puts "modou backlight lock"
|
77
|
+
puts "modou backlight unlock"
|
78
|
+
puts "modou backlight wakeup"
|
79
|
+
|
80
|
+
puts
|
81
|
+
puts "========== security =========="
|
82
|
+
puts "modou security info"
|
83
|
+
puts "modou security on"
|
84
|
+
puts "modou security off"
|
85
|
+
|
86
|
+
puts
|
87
|
+
puts "========== wan =========="
|
88
|
+
puts "modou wan info"
|
89
|
+
puts "modou wan traffics"
|
90
|
+
|
91
|
+
puts
|
92
|
+
puts '========== wifi =========='
|
93
|
+
puts 'modou wifi info'
|
94
|
+
puts "modou wifi enabled"
|
95
|
+
|
96
|
+
puts
|
97
|
+
puts '========== lan =========='
|
98
|
+
puts 'modou lan info'
|
99
|
+
|
100
|
+
puts
|
101
|
+
puts '========== disk =========='
|
102
|
+
puts 'modou disk info'
|
103
|
+
puts 'modou disk eject'
|
104
|
+
|
105
|
+
puts
|
106
|
+
puts '========== devices =========='
|
107
|
+
puts 'modou devices wired'
|
108
|
+
puts 'modou devices wifi'
|
109
|
+
puts 'modou devices whitelisted'
|
110
|
+
puts 'modou devices blacklisted'
|
111
|
+
puts 'modou devices graylisted'
|
112
|
+
end
|
113
|
+
|
114
|
+
def print_version_info
|
115
|
+
response = get("/api/system/get_version_info")
|
116
|
+
|
117
|
+
puts "Firmware Version: #{response['version1']}"
|
118
|
+
puts "Hardware Version: #{response['version2']}"
|
119
|
+
end
|
120
|
+
|
121
|
+
def reboot
|
122
|
+
signin_required!
|
123
|
+
|
124
|
+
get('/api/system/reboot')
|
125
|
+
puts "now rebooting..."
|
126
|
+
end
|
127
|
+
|
128
|
+
def safe_reboot
|
129
|
+
signin_required!
|
130
|
+
|
131
|
+
get('/api/system/safe_reboot')
|
132
|
+
puts "rebooting into safe mode..."
|
133
|
+
end
|
134
|
+
|
135
|
+
def backlight_control(command)
|
136
|
+
signin_required!
|
137
|
+
|
138
|
+
case command
|
139
|
+
when 'lock'
|
140
|
+
get('/api/system/lock_backlight')
|
141
|
+
when 'unlock'
|
142
|
+
get('/api/system/unlock_backlight')
|
143
|
+
when 'wakeup'
|
144
|
+
get('/api/system/wakeup_backlight')
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
def security_control(command)
|
149
|
+
signin_required!
|
150
|
+
|
151
|
+
case command
|
152
|
+
when 'info'
|
153
|
+
response = get('/api/security/get_config')
|
154
|
+
if response['enabled']
|
155
|
+
puts "wifi security is on"
|
156
|
+
else
|
157
|
+
puts "wifi security is off"
|
158
|
+
end
|
159
|
+
when 'on'
|
160
|
+
when 'off'
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
def internet_test
|
165
|
+
signin_required!
|
166
|
+
|
167
|
+
response = get('/api/wan/is_internet_available')
|
168
|
+
|
169
|
+
case response['code']
|
170
|
+
when 0
|
171
|
+
puts "connected to the Internet"
|
172
|
+
when 1
|
173
|
+
puts "DNS resolution failure"
|
174
|
+
when 2
|
175
|
+
puts "cannot reach the gateway"
|
176
|
+
when -1
|
177
|
+
puts "busy, try again later"
|
178
|
+
end
|
179
|
+
end
|
180
|
+
|
181
|
+
def print_client_mac
|
182
|
+
signin_required!
|
183
|
+
|
184
|
+
response = get('/api/wan/clientmacaddr')
|
185
|
+
|
186
|
+
puts response['macaddr']
|
187
|
+
end
|
188
|
+
|
189
|
+
def wan_control(command)
|
190
|
+
signin_required!
|
191
|
+
|
192
|
+
case command
|
193
|
+
when 'info'
|
194
|
+
response = get('/api/wan/get_info')
|
195
|
+
|
196
|
+
puts table_from_response(response)
|
197
|
+
when 'traffics'
|
198
|
+
response = get('/api/wan/get_traffics')
|
199
|
+
|
200
|
+
puts table_from_response(response)
|
201
|
+
end
|
202
|
+
end
|
203
|
+
|
204
|
+
def wifi_control(command)
|
205
|
+
signin_required!
|
206
|
+
|
207
|
+
case command
|
208
|
+
when 'enabled'
|
209
|
+
response = get('/api/wifi/is_enabled')
|
210
|
+
|
211
|
+
if response['is_enabled']
|
212
|
+
puts "wifi is on"
|
213
|
+
else
|
214
|
+
puts "wifi is off"
|
215
|
+
end
|
216
|
+
when 'info'
|
217
|
+
response = get('/api/wifi/get_config')
|
218
|
+
|
219
|
+
table = table_from_response(response['2g'])
|
220
|
+
table.title = '2.4G'
|
221
|
+
puts table
|
222
|
+
|
223
|
+
table = table_from_response(response['5g'])
|
224
|
+
table.title = '5G'
|
225
|
+
puts table
|
226
|
+
end
|
227
|
+
end
|
228
|
+
|
229
|
+
def lan_control(command)
|
230
|
+
signin_required!
|
231
|
+
|
232
|
+
case command
|
233
|
+
when 'info'
|
234
|
+
response = get('/api/lan/get_lan_config')
|
235
|
+
|
236
|
+
table = table_from_response(response)
|
237
|
+
puts table
|
238
|
+
end
|
239
|
+
end
|
240
|
+
|
241
|
+
def print_wired_connections
|
242
|
+
signin_required!
|
243
|
+
|
244
|
+
response = get('/api/system/get_cable_connection')
|
245
|
+
|
246
|
+
table = table_from_response(response)
|
247
|
+
puts table
|
248
|
+
end
|
249
|
+
|
250
|
+
def print_system_time
|
251
|
+
signin_required!
|
252
|
+
|
253
|
+
response = get('/api/system/get_time')
|
254
|
+
|
255
|
+
table = table_from_response(response)
|
256
|
+
puts table
|
257
|
+
end
|
258
|
+
|
259
|
+
def disk_control(command)
|
260
|
+
signin_required!
|
261
|
+
|
262
|
+
case command
|
263
|
+
when 'info'
|
264
|
+
response = get('/api/devices/disk')
|
265
|
+
|
266
|
+
if response.empty?
|
267
|
+
puts 'no disks attached'
|
268
|
+
else
|
269
|
+
table = table_from_response(response)
|
270
|
+
puts table
|
271
|
+
end
|
272
|
+
when 'eject'
|
273
|
+
response = get('/api/devices/disk_uninstall')
|
274
|
+
|
275
|
+
puts "you are now safe to remove the external drive."
|
276
|
+
end
|
277
|
+
end
|
278
|
+
|
279
|
+
def print_flash_info
|
280
|
+
signin_required!
|
281
|
+
|
282
|
+
response = get('/api/devices/ddr2_flash')
|
283
|
+
|
284
|
+
table = table_from_response(response)
|
285
|
+
puts table
|
286
|
+
end
|
287
|
+
|
288
|
+
def print_wired_devices_info
|
289
|
+
signin_required!
|
290
|
+
|
291
|
+
response = get('/api/devices/cables')
|
292
|
+
|
293
|
+
if response['devices'].empty?
|
294
|
+
puts "no wired devices."
|
295
|
+
else
|
296
|
+
table = table_from_response(response['devices'])
|
297
|
+
puts table
|
298
|
+
end
|
299
|
+
end
|
300
|
+
|
301
|
+
def print_wifi_devices_info
|
302
|
+
signin_required!
|
303
|
+
|
304
|
+
response = get('/api/devices/wifis')
|
305
|
+
|
306
|
+
if response['devices'].empty?
|
307
|
+
puts "no wifi devices."
|
308
|
+
else
|
309
|
+
response['devices'].each do |device|
|
310
|
+
table = table_from_response(device)
|
311
|
+
puts table
|
312
|
+
end
|
313
|
+
end
|
314
|
+
end
|
315
|
+
|
316
|
+
def devices_control(command)
|
317
|
+
signin_required!
|
318
|
+
|
319
|
+
case command
|
320
|
+
when 'wired'
|
321
|
+
print_wired_devices_info
|
322
|
+
when 'wifi'
|
323
|
+
print_wifi_devices_info
|
324
|
+
when /blacklist/
|
325
|
+
response = get('/api/devices/blacklist')
|
326
|
+
|
327
|
+
if response['devices'].empty?
|
328
|
+
puts "no blacklisted devices."
|
329
|
+
else
|
330
|
+
response['devices'].each do |device|
|
331
|
+
table = table_from_response(device)
|
332
|
+
puts table
|
333
|
+
end
|
334
|
+
end
|
335
|
+
when /whitelist/
|
336
|
+
response = get('/api/devices/whitelist')
|
337
|
+
|
338
|
+
if response['devices'].empty?
|
339
|
+
puts "no whitelisted devices."
|
340
|
+
else
|
341
|
+
response['devices'].each do |device|
|
342
|
+
table = table_from_response(device)
|
343
|
+
puts table
|
344
|
+
end
|
345
|
+
end
|
346
|
+
when /graylist/
|
347
|
+
response = get('/api/devices/graylist')
|
348
|
+
|
349
|
+
if response['devices'].empty?
|
350
|
+
puts "no graylisted devices."
|
351
|
+
else
|
352
|
+
response['devices'].each do |device|
|
353
|
+
table = table_from_response(device)
|
354
|
+
puts table
|
355
|
+
end
|
356
|
+
end
|
357
|
+
end
|
358
|
+
end
|
359
|
+
|
360
|
+
###############################
|
361
|
+
# firmware upgrade
|
362
|
+
###############################
|
363
|
+
|
364
|
+
def firmware_control(command)
|
365
|
+
signin_required!
|
366
|
+
|
367
|
+
case command
|
368
|
+
when 'info'
|
369
|
+
print_version_info
|
370
|
+
when 'check'
|
371
|
+
check_for_upgrade
|
372
|
+
when 'download'
|
373
|
+
download_firmware
|
374
|
+
when 'upgrade'
|
375
|
+
upgrade
|
376
|
+
end
|
377
|
+
end
|
378
|
+
|
379
|
+
def check_for_upgrade
|
380
|
+
signin_required!
|
381
|
+
|
382
|
+
response = get("/api/system/check_remote_version_upgrade")
|
383
|
+
|
384
|
+
if response['code'] == 0
|
385
|
+
puts
|
386
|
+
puts "new version found: #{response['version']}"
|
387
|
+
puts
|
388
|
+
$filename = response['filename']
|
389
|
+
$filesize = response['filesize']
|
390
|
+
puts "filename: #{response['filename']}, size: #{response['filesize']}"
|
391
|
+
puts
|
392
|
+
puts "release notes:"
|
393
|
+
puts
|
394
|
+
puts response['releasenote']
|
395
|
+
else
|
396
|
+
puts response['msg']
|
397
|
+
exit
|
398
|
+
end
|
399
|
+
end
|
400
|
+
|
401
|
+
def cancel_download
|
402
|
+
puts
|
403
|
+
get("/api/system/cancel_download")
|
404
|
+
|
405
|
+
$download_canceled = true
|
406
|
+
|
407
|
+
puts
|
408
|
+
sleep 2
|
409
|
+
puts "download canceled."
|
410
|
+
|
411
|
+
exit
|
412
|
+
end
|
413
|
+
|
414
|
+
def download_firmware
|
415
|
+
signin_required!
|
416
|
+
|
417
|
+
check_for_upgrade unless $filename && $filesize
|
418
|
+
|
419
|
+
trap("SIGINT") { cancel_download }
|
420
|
+
|
421
|
+
# should be post?
|
422
|
+
response = post("/api/system/download_version_upgrade")
|
423
|
+
|
424
|
+
puts
|
425
|
+
puts "downloading firmware..."
|
426
|
+
puts
|
427
|
+
|
428
|
+
progressbar = ProgressBar.create(:format => '%a |%b>>%i| %p%% %t')
|
429
|
+
|
430
|
+
begin
|
431
|
+
sleep 1
|
432
|
+
jsondata = JSON({ filename: $filename, filesize: $filesize })
|
433
|
+
|
434
|
+
# response = HTTParty.post("http://#{$host}/api/system/check_download_progress", args)
|
435
|
+
response = post('/api/system/check_download_progress', { body: jsondata })
|
436
|
+
|
437
|
+
case response['code']
|
438
|
+
when '0'
|
439
|
+
# download completed
|
440
|
+
return
|
441
|
+
when '1'
|
442
|
+
# download in progress
|
443
|
+
else
|
444
|
+
puts
|
445
|
+
puts "================= error downloading firmware ================="
|
446
|
+
|
447
|
+
cancel_download
|
448
|
+
end
|
449
|
+
|
450
|
+
progressbar.progress = response['percent']
|
451
|
+
|
452
|
+
end while response['percent'] != 100 || $download_canceled
|
453
|
+
end
|
454
|
+
|
455
|
+
def upgrade
|
456
|
+
signin_required!
|
457
|
+
|
458
|
+
response = get('/api/system/check_local_version_upgrade')
|
459
|
+
|
460
|
+
download_firmware unless response['code'] == 0
|
461
|
+
|
462
|
+
puts
|
463
|
+
puts "upgrading system...."
|
464
|
+
puts
|
465
|
+
|
466
|
+
get('/api/system/upgrade_version')
|
467
|
+
|
468
|
+
begin
|
469
|
+
sleep 1
|
470
|
+
|
471
|
+
response = get('/api/system/check_upgrade_progress')
|
472
|
+
|
473
|
+
p response
|
474
|
+
|
475
|
+
end while response['code'] != '0'
|
476
|
+
end
|
477
|
+
|
478
|
+
###############################
|
479
|
+
# main
|
480
|
+
###############################
|
481
|
+
|
482
|
+
if ARGV.count == 0
|
483
|
+
print_help
|
484
|
+
else
|
485
|
+
case ARGV[0]
|
486
|
+
when 'version'
|
487
|
+
print_version_info
|
488
|
+
when 'update_check'
|
489
|
+
check_for_upgrade
|
490
|
+
when 'download_firmware'
|
491
|
+
download_firmware
|
492
|
+
when 'upgrade'
|
493
|
+
upgrade
|
494
|
+
when 'reboot'
|
495
|
+
reboot
|
496
|
+
when 'safe_reboot'
|
497
|
+
safe_reboot
|
498
|
+
when 'internet_test'
|
499
|
+
internet_test
|
500
|
+
when 'client_mac'
|
501
|
+
print_client_mac
|
502
|
+
when 'wired_connections'
|
503
|
+
print_wired_connections
|
504
|
+
when 'wired_devices_info'
|
505
|
+
print_wired_devices_info
|
506
|
+
when 'wifi_devices_info'
|
507
|
+
print_wifi_devices_info
|
508
|
+
when 'system_time'
|
509
|
+
print_system_time
|
510
|
+
when 'flash_info'
|
511
|
+
print_flash_info
|
512
|
+
when 'wan'
|
513
|
+
wan_control(ARGV[1])
|
514
|
+
when 'wifi'
|
515
|
+
wifi_control(ARGV[1])
|
516
|
+
when 'lan'
|
517
|
+
lan_control(ARGV[1])
|
518
|
+
when 'disk'
|
519
|
+
disk_control(ARGV[1])
|
520
|
+
when 'devices'
|
521
|
+
devices_control(ARGV[1])
|
522
|
+
when 'backlight'
|
523
|
+
backlight_control(ARGV[1])
|
524
|
+
when 'security'
|
525
|
+
security_control(ARGV[1])
|
526
|
+
when 'firmware'
|
527
|
+
firmware_control(ARGV[1])
|
528
|
+
else
|
529
|
+
puts "unrecognized command"
|
530
|
+
puts
|
531
|
+
print_help
|
532
|
+
end
|
533
|
+
end
|
data/lib/modou.rb
ADDED
data/modou.gemspec
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'modou/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "modou"
|
8
|
+
spec.version = Modou::VERSION
|
9
|
+
spec.authors = ["Forrest Ye"]
|
10
|
+
spec.email = ["afu@forresty.com"]
|
11
|
+
spec.description = %q{your modouwifi cli}
|
12
|
+
spec.summary = %q{your modouwifi cli}
|
13
|
+
spec.homepage = ""
|
14
|
+
spec.license = "MIT"
|
15
|
+
|
16
|
+
spec.files = `git ls-files`.split($/)
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
+
spec.require_paths = ["lib"]
|
20
|
+
|
21
|
+
spec.add_development_dependency "bundler", "~> 1.3"
|
22
|
+
spec.add_development_dependency "rake"
|
23
|
+
end
|
metadata
ADDED
@@ -0,0 +1,84 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: modou
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Forrest Ye
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2014-07-07 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: bundler
|
16
|
+
requirement: &70236239854360 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ~>
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '1.3'
|
22
|
+
type: :development
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *70236239854360
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: rake
|
27
|
+
requirement: &70236239872540 !ruby/object:Gem::Requirement
|
28
|
+
none: false
|
29
|
+
requirements:
|
30
|
+
- - ! '>='
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '0'
|
33
|
+
type: :development
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: *70236239872540
|
36
|
+
description: your modouwifi cli
|
37
|
+
email:
|
38
|
+
- afu@forresty.com
|
39
|
+
executables:
|
40
|
+
- modou
|
41
|
+
extensions: []
|
42
|
+
extra_rdoc_files: []
|
43
|
+
files:
|
44
|
+
- .gitignore
|
45
|
+
- Gemfile
|
46
|
+
- LICENSE.txt
|
47
|
+
- README.md
|
48
|
+
- Rakefile
|
49
|
+
- bin/modou
|
50
|
+
- lib/modou.rb
|
51
|
+
- lib/modou/version.rb
|
52
|
+
- modou.gemspec
|
53
|
+
homepage: ''
|
54
|
+
licenses:
|
55
|
+
- MIT
|
56
|
+
post_install_message:
|
57
|
+
rdoc_options: []
|
58
|
+
require_paths:
|
59
|
+
- lib
|
60
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
61
|
+
none: false
|
62
|
+
requirements:
|
63
|
+
- - ! '>='
|
64
|
+
- !ruby/object:Gem::Version
|
65
|
+
version: '0'
|
66
|
+
segments:
|
67
|
+
- 0
|
68
|
+
hash: 742298415361393803
|
69
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
70
|
+
none: false
|
71
|
+
requirements:
|
72
|
+
- - ! '>='
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
version: '0'
|
75
|
+
segments:
|
76
|
+
- 0
|
77
|
+
hash: 742298415361393803
|
78
|
+
requirements: []
|
79
|
+
rubyforge_project:
|
80
|
+
rubygems_version: 1.8.11
|
81
|
+
signing_key:
|
82
|
+
specification_version: 3
|
83
|
+
summary: your modouwifi cli
|
84
|
+
test_files: []
|