isaac_toolbelt 0.1.5 → 0.1.6

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c67637613745d7fd01f327f5fe5f802e3bc4226c
4
- data.tar.gz: 0c498e908136f756af59d50da74caeefad4c4c09
3
+ metadata.gz: 73bf2d5f4c3c7ab0835722a3cd3af19bc137f7bb
4
+ data.tar.gz: fc0e46c3b3d77fc4c212d813cf5d3e6a56448bb0
5
5
  SHA512:
6
- metadata.gz: 0f962fddab766f16c3313a1a567b402c3b0cefd3d2fc6a0b0d74a71bdb36c471a3052579d4b348c54634e48d831057d96bada1d18adc2c6539cc62ea1c7b1c38
7
- data.tar.gz: 02ce1492a9ade4a54271feae9ca6c5b65c6b9374f4fb3b8dcfa67e0df0089bc93c48f171f14ae94d3d163191223b1e841f557e0600cf1c9c2b57a7040cebb7d6
6
+ metadata.gz: 6692437735bc96db5e7202235bd52e0de65c79733b1c3ec944baadeaa0ba79c5d3d7f8142401735f40c7934e5e5c897da73ab2d1b80913b8502ea47810fe670e
7
+ data.tar.gz: b6086ab841c7bf7965dd53efd4c8bd84a1473d272bd0c792d997298a5c19c9600ff258fe05b640dbefe6fe27c51fdafb14143124218bcbdfb98e079c18b986e5
data/.gitignore CHANGED
@@ -9,3 +9,5 @@
9
9
  /tmp/
10
10
  /vendor/bundle
11
11
  /.bundle
12
+ .*.swp
13
+
data/README.md CHANGED
@@ -11,10 +11,75 @@ It is inspired by [heroku toolbelt](https://toolbelt.heroku.com/).
11
11
  $ gem install specific_install
12
12
  $ gem specific_install git@github.com:xshellinc/isaac_toolbelt.git
13
13
 
14
+ ### Ubuntu
15
+
16
+ If your release doesn't have a ruby2.2-dev package, we recommend using [rbenv](https://github.com/rbenv/rbenv) to set up your Ruby environment.
17
+
18
+ $ sudo apt-get install ruby2.2-dev
19
+
20
+ Install dependencies for the toolbelt.
21
+
22
+ $ sudo apt-get install dfu-util libcurl4-openssl-dev libarchive-dev
23
+
24
+ Install the toolbelt by either ways below.
25
+
26
+ 1. Install from [rubygems.org](https://rubygems.org/gems/isaac_toolbelt)
27
+
28
+ $ sudo gem install isaac_toolbelt
29
+
30
+ 2. Install from [GitHub](https://github.com/xshellinc/isaac_toolbelt)
31
+
32
+ $ git clone https://github.com/xshellinc/isaac_toolbelt.git
33
+ $ cd isaac_toolbelt
34
+ $ bundle install
35
+ $ gem install isaac_toolbelt
14
36
 
15
37
  ## Usage
16
38
 
17
- Connect your SBC with USB cable.
39
+ ### Quickstart Guide
40
+
41
+ 1. Obtain a git repository url and an access key for a device
42
+ from [Isaac dashboard](https://dashboard.isaacapp.io/)
43
+ 1. Create an app
44
+ 2. Create a device for the app
45
+ 2. Setup an app devloping environment
46
+ 1. Create a new app with a template
47
+
48
+ ```sh
49
+ $ isaac app new <app name> --language=python
50
+ ```
51
+
52
+ 2. Setup Git remote server
53
+
54
+ ```sh
55
+ $ cd <app name>
56
+ $ git remote add origin <app git server url>
57
+ ```
58
+
59
+ 3. Add and commit all template files
60
+
61
+ ```sh
62
+ $ git add .
63
+ $ git commit -m "add files from the template"
64
+ ```
65
+
66
+ 4. Push changes to the Git server
67
+
68
+ ```sh
69
+ $ git push --set-upstream origin master
70
+ ```
71
+
72
+ 3. Prepare a device
73
+ 1. Connect your device by a USB cable
74
+ 2. Flash the device
75
+
76
+ ```sh
77
+ $ isaac device init --ssid=<wifi ap name> --wpa=<wifi password> \
78
+ --access_key=<access key>
79
+ ```
80
+
81
+ The device will start blinking because of the template code at this point.
82
+ Your device listens for changes in the git repository from now on.
18
83
 
19
84
  ### Show all commands
20
85
 
data/bin/isaac CHANGED
@@ -2,5 +2,124 @@
2
2
 
3
3
  require "isaac_toolbelt"
4
4
 
5
- IsaacToolbelt::CLI.start
5
+ LOCK_FILE = File.open("/var/tmp/isaac.lock",
6
+ File::CREAT|File::TRUNC|File::WRONLY, 0644)
7
+ LOCK_FILE.write(Process.pid)
6
8
 
9
+ module CLI
10
+ class Local < Thor
11
+ # XXX: Take the run method away from Thor so that we can redefine it.
12
+ # from https://github.com/ddollar/foreman/blob/59d87c91a2004e05f6b12d4b150dcb4c911eb31c/lib/foreman/cli.rb#L28
13
+ class << self
14
+ def is_thor_reserved_word?(word, type)
15
+ return false if word == "run"
16
+ super
17
+ end
18
+ end
19
+
20
+ desc 'start', 'Run the project on the debug mode device that connected via RNDIS'
21
+ def start
22
+ IsaacToolbelt::Local.start
23
+ end
24
+
25
+ desc 'stop', 'Stop the sketch'
26
+ def stop
27
+ IsaacToolbelt::Local.stop
28
+ end
29
+
30
+ desc 'run', 'Run a command with .env on the debug mode device that connected via RNDIS'
31
+ def run(*args)
32
+ IsaacToolbelt::Local.run(args)
33
+ end
34
+
35
+ desc 'debug_node', 'Run node.js app on the device that connected via RNDIS'
36
+ def debug_node
37
+ IsaacToolbelt::Local.debug_node
38
+ end
39
+ end
40
+
41
+ class Device < Thor
42
+ desc 'init', 'Initialize SBC for use with isaac'
43
+ option :ssid, :aliases => '-s', :required => true, :type => :string, :desc => 'Specify WiFi SSID'
44
+ option :wpa, :aliases => '-w', :required => true, :type => :string, :desc => 'Specify WPA Key for the SSID'
45
+ option :access_key, :aliases => '-a', :required => false, :type => :string, :desc => 'Specify ISAAC access key for the device'
46
+ def init
47
+ IsaacToolbelt::Device.init(options[:ssid], options[:wpa], options[:access_key])
48
+ end
49
+
50
+ desc 'info', 'Show device status'
51
+ def info
52
+ IsaacToolbelt::Device.info
53
+ end
54
+
55
+ desc 'config:access_key ACCESS_KEY', 'Set ISAAC Access Token'
56
+ def config_access_key(access_key)
57
+ IsaacToolbelt::Device.config_access_key(access_key)
58
+ end
59
+ map 'config:access_key' => 'config_access_key'
60
+
61
+ desc 'config:wifi', 'Configure WiFi'
62
+ option :ssid, :aliases => '-s', :required => true, :type => :string, :desc => 'Specify WiFi SSID'
63
+ option :wpa, :aliases => '-w', :required => true, :type => :string, :desc => 'Specify WPA Key for the SSID'
64
+ def config_wifi
65
+ IsaacToolbelt::Device.config_wifi(options[:ssid], options[:wpa])
66
+ end
67
+ map 'config:wifi' => 'config_wifi'
68
+
69
+ desc 'console', 'Shell on the debug mode device that connected via RNDIS'
70
+ def console
71
+ IsaacToolbelt::Device.console
72
+ end
73
+
74
+ desc 'logs', 'show logs on the device that connected via RNDIS'
75
+ def logs
76
+ IsaacToolbelt::Device.logs
77
+ end
78
+
79
+ desc 'mode', 'Set modes whether production mode or development mode.'
80
+ def mode(m)
81
+ IsaacToolbelt::Device.mode(m)
82
+ end
83
+
84
+ desc 'reboot', 'Reboot ISAAC OS'
85
+ def _reboot
86
+ IsaacToolbelt::Device._reboot
87
+ end
88
+ map 'reboot' => '_reboot'
89
+ end
90
+
91
+ class App < Thor
92
+ desc 'new <name>', 'Create a new Isaac <name> app'
93
+ option :language, :required => false, :type => :string, :desc => 'app language [python javascript]'
94
+ def new(app_name)
95
+ IsaacToolbelt::App.new(app_name, options[:language])
96
+ end
97
+ end
98
+
99
+ class Main < Thor
100
+ desc "local SUBCOMMAND ...", "Run the app on local SBC"
101
+ subcommand "local", Local
102
+ desc "device SUBCOMMAND ...", "Configure SBC connected via USB"
103
+ subcommand "device", Device
104
+ desc "app SUBCOMMAND ...", "Isaac app"
105
+ subcommand "app", App
106
+
107
+ map %w(-v --version) => :version
108
+ desc "version", "Show Isaac's version information"
109
+ def version
110
+ puts "Isaac toolbelt version #{IsaacToolbelt::VERSION}"
111
+ end
112
+ end
113
+ end
114
+
115
+ # `isaac device mode` without args shows current mode
116
+ if ARGV.length == 2 && ARGV[0] == "device" && ARGV[1] == "mode"
117
+ puts IsaacToolbelt::Device.current_mode
118
+ else
119
+ CLI::Main.start(ARGV)
120
+ end
121
+
122
+
123
+ at_exit do
124
+ LOCK_FILE.close
125
+ end
@@ -0,0 +1,41 @@
1
+ require 'curb'
2
+
3
+ module IsaacToolbelt::App
4
+ def self.new(app_name, language)
5
+ # Create app directory
6
+ if Dir.exist? app_name
7
+ puts "ERROR: #{app_name} directory already exists."
8
+ exit(-1)
9
+ end
10
+ # Select a template source
11
+ url = nil
12
+ extract_dname = nil
13
+ language = language.downcase.to_sym unless language.nil?
14
+ language ||= :python
15
+ case language
16
+ when :python
17
+ url = IsaacToolbelt::ISAAC_EDISON_TEMPLATE_URL
18
+ extract_dname = "isaac_template_python-master"
19
+ when :javascript, :js
20
+ url = "https://codeload.github.com/xshellinc/isaac_template_nodejs/zip/master"
21
+ extract_dname = "isaac_template_nodejs-master"
22
+ else
23
+ puts "ERROR: Unsupported or invalid language was selected"
24
+ puts "Supported languages are python, javascript"
25
+ exit -1
26
+ end
27
+ unless url.nil?
28
+ # Get a template
29
+ template_d = File.join(IsaacToolbelt::ISAAC_DIR, 'templates/edison')
30
+ FileUtils.mkdir_p template_d unless Dir.exist? template_d
31
+ template_fname = url.split(/\?/).first.split(/\//).last
32
+ template_f = File.join(template_d, template_fname)
33
+ Curl::Easy.download(url, template_f)
34
+ # Extract template archive
35
+ extract_d = File.join(template_d, extract_dname)
36
+ Archive.extract(template_f, template_d)
37
+ # Copy to app directory
38
+ FileUtils.cp_r extract_d + "/.", app_name
39
+ end
40
+ end
41
+ end
@@ -1,4 +1,5 @@
1
1
  require "isaac_toolbelt/version"
2
+ require "app"
2
3
 
3
4
  require 'digest/sha1'
4
5
  require 'sshkit'
@@ -84,7 +85,6 @@ module IsaacToolbelt
84
85
  ISAAC_EDISON_IMAGE_URL='https://s3-ap-northeast-1.amazonaws.com/isaac-os-images/edison/toFlash.tar.bz2'
85
86
  ISAAC_EDISON_TEMPLATE_URL='https://codeload.github.com/xshellinc/isaac_template_python/zip/master'
86
87
 
87
-
88
88
  module Helper
89
89
  def check_file(filename)
90
90
  unless File.exist?(File.join(Dir.pwd, filename))
@@ -135,7 +135,7 @@ module IsaacToolbelt
135
135
 
136
136
  # wait until board is booted
137
137
  def waitfor(message=nil)
138
- until system('ping -W 10 -c 1 192.168.2.15 > /dev/null 2>&1') do
138
+ until system("ping -W 10 -c 1 #{DEVICE_IP_ADDRESS} > /dev/null 2>&1") do
139
139
  puts message || 'waiting board...'
140
140
  sleep 1
141
141
  end
@@ -182,62 +182,50 @@ module IsaacToolbelt
182
182
  end
183
183
  end
184
184
 
185
- class Local < Thor
185
+ class Local
186
186
  extend Helper
187
-
188
- # from https://github.com/ddollar/foreman/blob/59d87c91a2004e05f6b12d4b150dcb4c911eb31c/lib/foreman/cli.rb#L28
189
- class << self
190
- # Hackery. Take the run method away from Thor so that we can redefine it.
191
- def is_thor_reserved_word?(word, type)
192
- return false if word == "run"
193
- super
194
- end
195
- end
196
-
197
- desc 'start', 'Run the project on the debug mode device that connected via RNDIS'
198
- def start
199
- temp_path = self.class.temp_path
200
- self.class.transfer_files(temp_path)
201
- SSHKit::Coordinator.new(self.class.host).each do
187
+ def self.start
188
+ unless Device.mode(:development) == :development
189
+ puts "Please switch mode to development to develop locally"
190
+ return
191
+ end
192
+ temp_d = temp_path
193
+ transfer_files(temp_d)
194
+ SSHKit::Coordinator.new(self.host).each do
202
195
  # start isaac-local
203
196
  execute :systemctl, *%w(stop isaac-local)
204
197
  #execute :systemctl, *%w(start isaac-local)
205
- execute :ln, '-nfs', temp_path, '/var/isaac/development'
198
+ execute :ln, '-nfs', temp_d, '/var/isaac/development'
206
199
  end
207
200
  #self.class.ssh_run_command('journalctl -n 5 -f -u isaac-local')
208
201
  #self.class.ssh_run_command('tail -f /var/log/isaac-local.log')
209
- #self.class.ssh_run_command("cd #{temp_path}; " + 'honcho start')
210
- self.class.ssh_run_command("cd /var/isaac/development; " + 'shoreman')
202
+ #self.class.ssh_run_command("cd #{temp_d}; " + 'honcho start')
203
+ ssh_run_command("cd /var/isaac/development; " + 'shoreman')
211
204
  end
212
205
 
213
- desc 'stop', 'Stop the sketch'
214
- def stop
206
+ def self.stop
207
+ hello
215
208
  end
216
209
 
217
- desc 'run', 'Run a command with .env on the debug mode device that connected via RNDIS'
218
- def run(*args)
219
- temp_path = self.class.temp_path
220
- self.class.transfer_files(temp_path)
221
- self.class.ssh_run_command("cd #{temp_path}; " + 'honcho run ' + args.shelljoin)
210
+ def self.run(args)
211
+ temp_d = temp_path
212
+ transfer_files(temp_d)
213
+ ssh_run_command("cd #{temp_d}; " + 'honcho run ' + args.shelljoin)
222
214
  end
223
215
 
224
- desc 'debug_node', 'Run node.js app on the device that connected via RNDIS'
225
- def debug_node
226
- temp_path = self.class.make_temp_dir(TEMP_ROOT)
227
- result = self.class.transfer_files(temp_path)
216
+ def self.debug_node
217
+ temp_d = make_temp_dir(TEMP_ROOT)
218
+ result = transfer_files(temp_d)
228
219
  if result
229
- self.class.ssh_run_command('cd %s; npm install; node app.js' % [temp_path])
220
+ ssh_run_command('cd %s; npm install; node app.js' % [temp_d])
230
221
  else
231
222
  puts 'Transfer failed'
232
223
  end
233
224
  end
234
-
235
- #map 'shell' => 'console'
236
- #map 'shell' => 'shell_'
237
225
  end
238
226
 
239
- class Device < Thor
240
- include IsaacToolbelt::Helper
227
+ class Device
228
+ extend Helper
241
229
 
242
230
  def self.curl(url, save_dir)
243
231
  filename = url.split('/').last
@@ -264,11 +252,11 @@ module IsaacToolbelt
264
252
  return filename
265
253
  end
266
254
 
267
- desc 'init', 'Initialize SBC for use with isaac'
268
- option :ssid, :aliases => '-s', :required => true, :type => :string, :desc => 'Specify WiFi SSID'
269
- option :wpa, :aliases => '-w', :required => true, :type => :string, :desc => 'Specify WPA Key for the SSID'
270
- option :access_key, :aliases => '-a', :required => false, :type => :string, :desc => 'Specify ISAAC access key for the device'
271
- def init
255
+ def self.init(ssid, wpa, access_key)
256
+ unless LOCK_FILE.flock(File::LOCK_EX|File::LOCK_NB)
257
+ puts "Only one 'isaac device init' can run at a time."
258
+ exit
259
+ end
272
260
  unless !!find_executable('dfu-util')
273
261
  STDERR.puts 'dfu-util is not installed!'
274
262
  STDERR.puts 'try: brew install dfu-util'
@@ -285,18 +273,14 @@ module IsaacToolbelt
285
273
  waitfor
286
274
 
287
275
  # configure WiFi
288
- configure_wifi(options[:ssid], options[:wpa])
276
+ configure_wifi(ssid, wpa)
289
277
  waitfor_network
290
278
 
291
- # install pip dependencies for isaacd : hacky
292
- SSHKit::Coordinator.new(host).each do
293
- execute :pip, *%w(install --upgrade pip)
294
- execute :pip, *%w(install --upgrade setuptools)
295
- execute :rm, *%w(-rf /usr/lib/python2.7/site-packages/distribute*)
296
- requirements = StringIO.new(REQUIREMENTS_TXT)
297
- dst = '/tmp/requirements.txt'
298
- upload! requirements, dst
299
- execute :pip, *%w(install -r), dst
279
+ on "#{SSH_USERNAME}@#{DEVICE_IP_ADDRESS}" do
280
+ puts "Updating package database..."
281
+ execute :opkg, %w(update)
282
+ puts "Installing NodeJS..."
283
+ execute :opkg, %w(install nodejs nodejs-npm)
300
284
  end
301
285
 
302
286
  ## install opkg dependencies for isaacd : hacky
@@ -309,11 +293,9 @@ module IsaacToolbelt
309
293
  #end
310
294
 
311
295
  # init isaacd
312
- if options[:access_key]
313
- set_conf({'access_key' => options[:access_key]})
314
- SSHKit::Coordinator.new(host).each do
315
- execute :systemctl, *%w(enable isaacd)
316
- end
296
+ set_conf({'access_key' => access_key})
297
+ on "#{SSH_USERNAME}@#{DEVICE_IP_ADDRESS}" do
298
+ execute :systemctl, *%w(enable isaacd)
317
299
  end
318
300
 
319
301
  # wait until rebooted
@@ -322,8 +304,7 @@ module IsaacToolbelt
322
304
  puts 'Your device is ready to develop!'
323
305
  end
324
306
 
325
- desc 'info', 'Show device status'
326
- def info
307
+ def self.info
327
308
  waitfor('Please connect the board and wait for a while...')
328
309
 
329
310
  uname = get_uname()
@@ -346,58 +327,50 @@ module IsaacToolbelt
346
327
  end
347
328
  puts " HW Addr: #{lines[0].split.last}" if lines[0].include? "HWaddr"
348
329
  end
330
+ ssid = capture(:iwgetid, "-r")
331
+ puts "WiFi SSID: #{ssid}"
349
332
  end
350
333
  end
351
334
 
352
- desc 'config:access_key ACCESS_KEY', 'Set ISAAC Access Token'
353
- def config_access_key(access_key)
335
+ def self.config_access_key(access_key)
354
336
  waitfor
355
337
  configure_access_key(access_key)
356
338
  end
357
- map 'config:access_key' => 'config_access_key'
358
339
 
359
- desc 'config:wifi', 'Configure WiFi'
360
- option :ssid, :aliases => '-s', :required => true, :type => :string, :desc => 'Specify WiFi SSID'
361
- option :wpa, :aliases => '-w', :required => true, :type => :string, :desc => 'Specify WPA Key for the SSID'
362
- def config_wifi
363
- configure_wifi(options[:ssid], options[:wpa])
340
+ def self.config_wifi(ssid, wpa)
341
+ configure_wifi(ssid, wpa)
364
342
  end
365
- map 'config:wifi' => 'config_wifi'
366
343
 
367
- desc 'console', 'Shell on the debug mode device that connected via RNDIS'
368
- def console
344
+ def self.console
369
345
  waitfor('Please connect the board and wait for a while...')
370
346
  ssh_run_command('')
371
347
  end
372
348
 
373
- desc 'logs', 'show logs on the device that connected via RNDIS'
374
- def logs
349
+ def self.logs
375
350
  waitfor('Please connect the board and wait for a while...')
376
351
  ssh_run_command('journalctl -f')
377
352
  end
378
353
 
379
- desc 'mode', 'Set modes whether production mode or development mode.'
380
- def mode(m)
354
+ def self.mode(m)
381
355
  waitfor
382
- if m == "development" || m == "dev" then
383
- change_mode :development
384
- elsif m == "production" then
385
- change_mode :production
386
- else
356
+ m = m.to_sym if m.is_a? String
357
+ if m != :development && m != :dev && m != :production
387
358
  puts DEVICE_MODE
359
+ elsif m != current_mode
360
+ change_mode :development if m == :development || m == :dev
361
+ change_mode :production if m == :production
388
362
  end
389
363
  puts "Current mode is #{current_mode}."
364
+ return current_mode
390
365
  end
391
366
 
392
- desc 'reboot', 'Reboot ISAAC OS'
393
- def _reboot
367
+ def self._reboot
394
368
  waitfor
395
369
  reboot
396
370
  end
397
- map 'reboot' => '_reboot'
398
371
 
399
372
  private
400
- def prepare_os_image
373
+ def self.prepare_os_image
401
374
  easy = Curl::Easy.new
402
375
  easy.follow_location = true
403
376
  easy.url = ISAAC_EDISON_IMAGE_URL
@@ -432,7 +405,7 @@ module IsaacToolbelt
432
405
  return extract_path
433
406
  end
434
407
 
435
- def flash_os_image(extract_path)
408
+ def self.flash_os_image(extract_path)
436
409
  base_dir = extract_path
437
410
  usb_vid = '8087'
438
411
  usb_pid = '0a99'
@@ -471,13 +444,13 @@ module IsaacToolbelt
471
444
  dfu_download(usb_vid, usb_pid, "rootfs", rootfs_file_path, true)
472
445
  end
473
446
 
474
- def dfu_ifwi_download(usb_vid, usb_pid, alt_name, file_path)
447
+ def self.dfu_ifwi_download(usb_vid, usb_pid, alt_name, file_path)
475
448
  if dfu_alt_name_exists?(usb_vid, usb_pid, alt_name)
476
449
  dfu_download(usb_vid, usb_pid, alt_name, file_path)
477
450
  end
478
451
  end
479
452
 
480
- def dfu_download(usb_vid, usb_pid, alt_name, file_path, do_reboot=false)
453
+ def self.dfu_download(usb_vid, usb_pid, alt_name, file_path, do_reboot=false)
481
454
  retry_count = 0
482
455
  loop do
483
456
  params = %W(dfu-util -v -d #{usb_vid}:#{usb_pid} --alt #{alt_name} -D #{file_path})
@@ -500,13 +473,13 @@ module IsaacToolbelt
500
473
  end
501
474
  end
502
475
 
503
- def dfu_alt_name_exists?(usb_vid, usb_pid, alt_name)
476
+ def self.dfu_alt_name_exists?(usb_vid, usb_pid, alt_name)
504
477
  dfu_list(usb_vid, usb_pid).select {|e|
505
478
  e[:name] == alt_name
506
479
  }.count > 0
507
480
  end
508
481
 
509
- def dfu_wait(message=nil)
482
+ def self.dfu_wait(message=nil)
510
483
  usb_vid = '8087'
511
484
  usb_pid = '0a99'
512
485
  until dfu_device_counts(usb_vid, usb_pid) > 0
@@ -515,7 +488,7 @@ module IsaacToolbelt
515
488
  end
516
489
  end
517
490
 
518
- def dfu_device_counts(usb_vid, usb_pid)
491
+ def self.dfu_device_counts(usb_vid, usb_pid)
519
492
  `dfu-util -l -d #{usb_vid}:#{usb_pid}`.split("\n").select{|l0|
520
493
  l0 =~ /Found/
521
494
  }.select{|l1|
@@ -523,7 +496,7 @@ module IsaacToolbelt
523
496
  }.count
524
497
  end
525
498
 
526
- def dfu_list(usb_vid, usb_pid)
499
+ def self.dfu_list(usb_vid, usb_pid)
527
500
  `dfu-util -l -d #{usb_vid}:#{usb_pid}`.split("\n").select{|l0|
528
501
  l0 =~ /Found/
529
502
  }.map {|str|
@@ -546,7 +519,7 @@ module IsaacToolbelt
546
519
  }
547
520
  end
548
521
 
549
- def configure_wifi(ssid, wpa_key)
522
+ def self.configure_wifi(ssid, wpa_key)
550
523
  SSHKit::Coordinator.new(host).each do
551
524
  execute :wpa_passphrase, ssid, wpa_key, '>>', '/etc/wpa_supplicant/wpa_supplicant.conf'
552
525
  execute :systemctl, *%w(restart wpa_supplicant.service)
@@ -554,30 +527,28 @@ module IsaacToolbelt
554
527
  end
555
528
  end
556
529
 
557
- def configure_access_key(access_key)
530
+ def self.configure_access_key(access_key)
558
531
  conf = get_conf
559
532
  conf["access_key"] = access_key
560
533
  set_conf(conf)
561
534
  end
562
535
 
563
- def get_conf
536
+ def self.get_conf
564
537
  conf = nil
565
- SSHKit::Coordinator.new(host).each do
566
- conf = YAML.load(capture(:cat, ISAAC_CONF_PATH))
538
+ on "#{SSH_USERNAME}@#{DEVICE_IP_ADDRESS}" do
539
+ conf = YAML.load(capture(:cat, ISAAC_CONF_PATH)) if test("[ -f #{ISAAC_CONF_PATH} ]")
567
540
  end
568
- return conf
541
+ return {} if conf.nil?
542
+ conf
569
543
  end
570
544
 
571
- def set_conf(conf)
572
- y = YAML.dump(conf)
573
- upload_io = StringIO.new(y)
574
- SSHKit::Coordinator.new(host).each do
575
- upload! upload_io, ISAAC_CONF_PATH
545
+ def self.set_conf(conf)
546
+ on "#{SSH_USERNAME}@#{DEVICE_IP_ADDRESS}" do
547
+ upload! StringIO.new(YAML.dump(conf)), ISAAC_CONF_PATH
576
548
  end
577
- return nil
578
549
  end
579
550
 
580
- def get_uname
551
+ def self.get_uname
581
552
  uname = nil
582
553
  SSHKit::Coordinator.new(host).each do
583
554
  uname = capture(:uname, '-a')
@@ -585,7 +556,7 @@ module IsaacToolbelt
585
556
  return uname
586
557
  end
587
558
 
588
- def change_mode(m)
559
+ def self.change_mode(m)
589
560
  if m == :development
590
561
  if current_mode == :production
591
562
  print "The device is in production mode. Do you wish to change to development mode [yN]: "
@@ -616,42 +587,58 @@ module IsaacToolbelt
616
587
  return current_mode
617
588
  end
618
589
  end
619
-
620
- class App < Thor
621
- desc 'new <name>', 'Create a new Isaac <name> app'
622
- def new(app_name)
623
- # Create app directory
624
- if Dir.exist? app_name
625
- puts "ERROR: #{app_name} directory already exists."
626
- exit(-1)
627
- end
628
- FileUtils.mkdir app_name
629
- # Get a template
630
- url = ISAAC_EDISON_TEMPLATE_URL
631
- template_d = File.join(ISAAC_DIR, 'templates/edison')
632
- FileUtils.mkdir_p template_d unless Dir.exist? template_d
633
- template_fname = url.split(/\?/).first.split(/\//).last
634
- template_f = File.join(template_d, template_fname)
635
- Curl::Easy.download(url, template_f)
636
- # Extract template archive
637
- extract_d = File.join(template_d, "isaac_template_python-master")
638
- Archive.extract(template_f, template_d)
639
- # Copy to app directory
640
- FileUtils.cp_r extract_d + "/.", app_name
641
- end
642
- end
643
-
644
- class CLI < Thor
645
- register Local, 'local', 'local <COMMAND>', 'Run the app on local SBC'
646
- register Device, 'device', 'device <COMMAND>', 'Configure SBC connected via USB'
647
- register App, 'app', 'app <COMMAND>', 'Isaac app'
648
-
649
- map %w(-v --version) => :version
650
- desc "version", "Show Isaac's version information"
651
- def version
652
- puts "Isaac toolbelt version #{VERSION}"
653
- end
654
- end
590
+ #<<<<<<< HEAD
591
+ #
592
+ # class App < Thor
593
+ # desc 'new <name>', 'Create a new Isaac <name> app'
594
+ # option :language, :required => false, :type => :string, :desc => 'app language [python javascript]'
595
+ # def new(app_name)
596
+ # # Create app directory
597
+ # if Dir.exist? app_name
598
+ # puts "ERROR: #{app_name} directory already exists."
599
+ # exit(-1)
600
+ # end
601
+ # FileUtils.mkdir app_name
602
+ # # Select a template source
603
+ # url = nil
604
+ # extract_dname = nil
605
+ # case options[:language].to_sym
606
+ # when :python
607
+ # url = ISAAC_EDISON_TEMPLATE_URL
608
+ # extract_dname = "isaac_template_python-master"
609
+ # when :javascript, :js
610
+ # url = "https://codeload.github.com/xshellinc/isaac_template_nodejs/zip/master"
611
+ # extract_dname = "isaac_template_nodejs-master"
612
+ # end
613
+ # unless url.nil?
614
+ # # Get a template
615
+ # template_d = File.join(ISAAC_DIR, 'templates/edison')
616
+ # FileUtils.mkdir_p template_d unless Dir.exist? template_d
617
+ # template_fname = url.split(/\?/).first.split(/\//).last
618
+ # template_f = File.join(template_d, template_fname)
619
+ # Curl::Easy.download(url, template_f)
620
+ # # Extract template archive
621
+ # extract_d = File.join(template_d, extract_dname)
622
+ # Archive.extract(template_f, template_d)
623
+ # # Copy to app directory
624
+ # FileUtils.cp_r extract_d + "/.", app_name
625
+ # end
626
+ # end
627
+ # end
628
+ #
629
+ # class CLI < Thor
630
+ # register Local, 'local', 'local <COMMAND>', 'Run the app on local SBC'
631
+ # register Device, 'device', 'device <COMMAND>', 'Configure SBC connected via USB'
632
+ # register App, 'app', 'app <COMMAND>', 'Isaac app'
633
+ #
634
+ # map %w(-v --version) => :version
635
+ # desc "version", "Show Isaac's version information"
636
+ # def version
637
+ # puts "Isaac toolbelt version #{VERSION}"
638
+ # end
639
+ # end
640
+ #=======
641
+ #>>>>>>> master
655
642
  end
656
643
 
657
644
  Signal.trap(:INT) {
@@ -1,3 +1,3 @@
1
1
  module IsaacToolbelt
2
- VERSION = "0.1.5"
2
+ VERSION = "0.1.6"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: isaac_toolbelt
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.5
4
+ version: 0.1.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - xshell inc.
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-04-23 00:00:00.000000000 Z
11
+ date: 2016-05-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -153,6 +153,7 @@ files:
153
153
  - bin/isaac
154
154
  - bin/setup
155
155
  - isaac_toolbelt.gemspec
156
+ - lib/app.rb
156
157
  - lib/isaac_toolbelt.rb
157
158
  - lib/isaac_toolbelt/version.rb
158
159
  homepage: https://isaacapp.io/