isaac_toolbelt 0.1.5 → 0.1.6

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 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/