MuranoCLI 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +28 -0
- data/.rspec +2 -0
- data/.travis.yml +21 -0
- data/Gemfile +27 -0
- data/LICENSE.txt +19 -0
- data/MuranoCLI.gemspec +50 -0
- data/MuranoCLI.iss +50 -0
- data/README.markdown +208 -0
- data/Rakefile +188 -0
- data/TODO.taskpaper +122 -0
- data/bin/mr +8 -0
- data/bin/murano +84 -0
- data/docs/demo.md +109 -0
- data/lib/MrMurano/Account.rb +211 -0
- data/lib/MrMurano/Config-Migrate.rb +47 -0
- data/lib/MrMurano/Config.rb +286 -0
- data/lib/MrMurano/Mock.rb +63 -0
- data/lib/MrMurano/Product-1P-Device.rb +145 -0
- data/lib/MrMurano/Product-Resources.rb +195 -0
- data/lib/MrMurano/Product.rb +358 -0
- data/lib/MrMurano/ProjectFile.rb +349 -0
- data/lib/MrMurano/Solution-Cors.rb +46 -0
- data/lib/MrMurano/Solution-Endpoint.rb +177 -0
- data/lib/MrMurano/Solution-File.rb +150 -0
- data/lib/MrMurano/Solution-ServiceConfig.rb +140 -0
- data/lib/MrMurano/Solution-Services.rb +326 -0
- data/lib/MrMurano/Solution-Users.rb +129 -0
- data/lib/MrMurano/Solution.rb +59 -0
- data/lib/MrMurano/SubCmdGroupContext.rb +49 -0
- data/lib/MrMurano/SyncUpDown.rb +565 -0
- data/lib/MrMurano/commands/assign.rb +57 -0
- data/lib/MrMurano/commands/businessList.rb +45 -0
- data/lib/MrMurano/commands/completion.rb +152 -0
- data/lib/MrMurano/commands/config.rb +67 -0
- data/lib/MrMurano/commands/content.rb +130 -0
- data/lib/MrMurano/commands/cors.rb +30 -0
- data/lib/MrMurano/commands/domain.rb +17 -0
- data/lib/MrMurano/commands/gb.rb +33 -0
- data/lib/MrMurano/commands/init.rb +138 -0
- data/lib/MrMurano/commands/keystore.rb +157 -0
- data/lib/MrMurano/commands/logs.rb +78 -0
- data/lib/MrMurano/commands/mock.rb +63 -0
- data/lib/MrMurano/commands/password.rb +88 -0
- data/lib/MrMurano/commands/postgresql.rb +41 -0
- data/lib/MrMurano/commands/product.rb +14 -0
- data/lib/MrMurano/commands/productCreate.rb +39 -0
- data/lib/MrMurano/commands/productDelete.rb +33 -0
- data/lib/MrMurano/commands/productDevice.rb +84 -0
- data/lib/MrMurano/commands/productDeviceIdCmds.rb +86 -0
- data/lib/MrMurano/commands/productList.rb +45 -0
- data/lib/MrMurano/commands/productWrite.rb +27 -0
- data/lib/MrMurano/commands/show.rb +80 -0
- data/lib/MrMurano/commands/solution.rb +14 -0
- data/lib/MrMurano/commands/solutionCreate.rb +39 -0
- data/lib/MrMurano/commands/solutionDelete.rb +34 -0
- data/lib/MrMurano/commands/solutionList.rb +45 -0
- data/lib/MrMurano/commands/status.rb +92 -0
- data/lib/MrMurano/commands/sync.rb +60 -0
- data/lib/MrMurano/commands/timeseries.rb +115 -0
- data/lib/MrMurano/commands/tsdb.rb +271 -0
- data/lib/MrMurano/commands/usage.rb +23 -0
- data/lib/MrMurano/commands/zshcomplete.erb +112 -0
- data/lib/MrMurano/commands.rb +32 -0
- data/lib/MrMurano/hash.rb +20 -0
- data/lib/MrMurano/http.rb +153 -0
- data/lib/MrMurano/makePretty.rb +75 -0
- data/lib/MrMurano/schema/pf-v1.0.0.yaml +114 -0
- data/lib/MrMurano/schema/sf-v0.2.0.yaml +77 -0
- data/lib/MrMurano/schema/sf-v0.3.0.yaml +78 -0
- data/lib/MrMurano/template/mock.erb +9 -0
- data/lib/MrMurano/template/projectFile.murano.erb +81 -0
- data/lib/MrMurano/verbosing.rb +99 -0
- data/lib/MrMurano/version.rb +4 -0
- data/lib/MrMurano.rb +20 -0
- data/spec/Account-Passwords_spec.rb +242 -0
- data/spec/Account_spec.rb +272 -0
- data/spec/ConfigFile_spec.rb +50 -0
- data/spec/ConfigMigrate_spec.rb +89 -0
- data/spec/Config_spec.rb +409 -0
- data/spec/Http_spec.rb +204 -0
- data/spec/MakePretties_spec.rb +118 -0
- data/spec/Mock_spec.rb +53 -0
- data/spec/ProductBase_spec.rb +113 -0
- data/spec/ProductContent_spec.rb +162 -0
- data/spec/ProductResources_spec.rb +329 -0
- data/spec/Product_1P_Device_spec.rb +202 -0
- data/spec/Product_1P_RPC_spec.rb +175 -0
- data/spec/Product_spec.rb +153 -0
- data/spec/ProjectFile_spec.rb +324 -0
- data/spec/Solution-Cors_spec.rb +164 -0
- data/spec/Solution-Endpoint_spec.rb +581 -0
- data/spec/Solution-File_spec.rb +212 -0
- data/spec/Solution-ServiceConfig_spec.rb +202 -0
- data/spec/Solution-ServiceDevice_spec.rb +176 -0
- data/spec/Solution-ServiceEventHandler_spec.rb +385 -0
- data/spec/Solution-ServiceModules_spec.rb +465 -0
- data/spec/Solution-UsersRoles_spec.rb +207 -0
- data/spec/Solution_spec.rb +92 -0
- data/spec/SyncRoot_spec.rb +83 -0
- data/spec/SyncUpDown_spec.rb +495 -0
- data/spec/Verbosing_spec.rb +279 -0
- data/spec/_workspace.rb +27 -0
- data/spec/cmd_assign_spec.rb +51 -0
- data/spec/cmd_business_spec.rb +59 -0
- data/spec/cmd_common.rb +72 -0
- data/spec/cmd_config_spec.rb +68 -0
- data/spec/cmd_content_spec.rb +71 -0
- data/spec/cmd_cors_spec.rb +50 -0
- data/spec/cmd_device_spec.rb +96 -0
- data/spec/cmd_domain_spec.rb +32 -0
- data/spec/cmd_init_spec.rb +30 -0
- data/spec/cmd_keystore_spec.rb +97 -0
- data/spec/cmd_password_spec.rb +62 -0
- data/spec/cmd_status_spec.rb +239 -0
- data/spec/cmd_syncdown_spec.rb +86 -0
- data/spec/cmd_syncup_spec.rb +62 -0
- data/spec/cmd_usage_spec.rb +36 -0
- data/spec/fixtures/.mrmuranorc +9 -0
- data/spec/fixtures/ProjectFiles/invalid.yaml +9 -0
- data/spec/fixtures/ProjectFiles/only_meta.yaml +24 -0
- data/spec/fixtures/ProjectFiles/with_routes.yaml +27 -0
- data/spec/fixtures/SolutionFiles/0.2.0.json +20 -0
- data/spec/fixtures/SolutionFiles/0.2.0_invalid.json +18 -0
- data/spec/fixtures/SolutionFiles/0.2.json +21 -0
- data/spec/fixtures/SolutionFiles/0.3.0.json +20 -0
- data/spec/fixtures/SolutionFiles/0.3.0_invalid.json +19 -0
- data/spec/fixtures/SolutionFiles/0.3.json +20 -0
- data/spec/fixtures/SolutionFiles/basic.json +20 -0
- data/spec/fixtures/SolutionFiles/secret.json +6 -0
- data/spec/fixtures/configfile +9 -0
- data/spec/fixtures/dumped_config +42 -0
- data/spec/fixtures/mrmuranorc_deleted_bob +8 -0
- data/spec/fixtures/mrmuranorc_tool_bob +3 -0
- data/spec/fixtures/product_spec_files/example.exoline.spec.yaml +116 -0
- data/spec/fixtures/product_spec_files/example.murano.spec.yaml +14 -0
- data/spec/fixtures/product_spec_files/gwe.exoline.spec.yaml +21 -0
- data/spec/fixtures/product_spec_files/gwe.murano.spec.yaml +16 -0
- data/spec/fixtures/product_spec_files/lightbulb-no-state.yaml +11 -0
- data/spec/fixtures/product_spec_files/lightbulb.yaml +14 -0
- data/spec/fixtures/roles-three.yaml +11 -0
- data/spec/fixtures/syncable_content/assets/icon.png +0 -0
- data/spec/fixtures/syncable_content/assets/index.html +0 -0
- data/spec/fixtures/syncable_content/assets/js/script.js +0 -0
- data/spec/fixtures/syncable_content/modules/table_util.lua +58 -0
- data/spec/fixtures/syncable_content/routes/manyRoutes.lua +11 -0
- data/spec/fixtures/syncable_content/routes/singleRoute.lua +5 -0
- data/spec/fixtures/syncable_content/services/devdata.lua +18 -0
- data/spec/fixtures/syncable_content/services/timers.lua +4 -0
- data/spec/spec_helper.rb +119 -0
- metadata +498 -0
@@ -0,0 +1,57 @@
|
|
1
|
+
require 'terminal-table'
|
2
|
+
|
3
|
+
command 'assign list' do |c|
|
4
|
+
c.syntax = 'murano assign list [options]'
|
5
|
+
c.description = 'List the products that are assigned'
|
6
|
+
c.option '--idonly', 'Only return the ids'
|
7
|
+
|
8
|
+
c.action do |args, options|
|
9
|
+
sol = MrMurano::SC_Device.new
|
10
|
+
|
11
|
+
trigs = sol.showTriggers()
|
12
|
+
options.idonly = true if $cfg['business.id'].nil?
|
13
|
+
|
14
|
+
if options.idonly then
|
15
|
+
say trigs.join(' ')
|
16
|
+
else
|
17
|
+
acc = MrMurano::Account.new
|
18
|
+
products = acc.products
|
19
|
+
products.select!{|p| trigs.include? p[:modelId] }
|
20
|
+
if products.empty? then
|
21
|
+
say trigs.join(' ')
|
22
|
+
else
|
23
|
+
busy = products.map{|r| [r[:label], r[:modelId]]}
|
24
|
+
table = Terminal::Table.new :rows => busy, :headings => ['Label', 'ModelID']
|
25
|
+
say table
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
alias_command :assign, 'assign list'
|
31
|
+
|
32
|
+
command 'assign set' do |c|
|
33
|
+
c.syntax = 'murano assign set [product]'
|
34
|
+
c.description = 'Assign a product to a eventhandler'
|
35
|
+
|
36
|
+
c.action do |args, options|
|
37
|
+
sol = MrMurano::SC_Device.new
|
38
|
+
|
39
|
+
prname = args.shift
|
40
|
+
if prname.nil? then
|
41
|
+
prid = $cfg['product.id']
|
42
|
+
else
|
43
|
+
acc = MrMurano::Account.new
|
44
|
+
products = acc.products
|
45
|
+
products.select!{|p|
|
46
|
+
p[:label] == prname or p[:modelId] == prname or p[:pid] == prname
|
47
|
+
}
|
48
|
+
prid = products.map{|p| p[:modelId]}
|
49
|
+
end
|
50
|
+
raise "No product ID!" if prid.nil?
|
51
|
+
say "Assigning #{prid} to solution" if $cfg['tool.verbose']
|
52
|
+
sol.assignTriggers(prid) unless $cfg['tool.dry']
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
56
|
+
|
57
|
+
# vim: set ai et sw=2 ts=2 :
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'MrMurano/Account'
|
2
|
+
|
3
|
+
command 'business list' do |c|
|
4
|
+
c.syntax = %{murano business list [options]}
|
5
|
+
c.description = %{List businesses}
|
6
|
+
c.option '--idonly', 'Only return the ids'
|
7
|
+
c.option '--[no-]all', 'Show all fields'
|
8
|
+
c.option '-o', '--output FILE', %{Download to file instead of STDOUT}
|
9
|
+
|
10
|
+
c.action do |args, options|
|
11
|
+
acc = MrMurano::Account.new
|
12
|
+
data = acc.businesses
|
13
|
+
|
14
|
+
io=nil
|
15
|
+
if options.output then
|
16
|
+
io = File.open(options.output, 'w')
|
17
|
+
end
|
18
|
+
|
19
|
+
if options.idonly then
|
20
|
+
headers = [:bizid]
|
21
|
+
data = data.map{|row| [row[:bizid]]}
|
22
|
+
elsif not options.all then
|
23
|
+
headers = [:bizid, :role, :name]
|
24
|
+
data = data.map{|r| [r[:bizid], r[:role], r[:name]]}
|
25
|
+
else
|
26
|
+
headers = data[0].keys
|
27
|
+
data = data.map{|r| headers.map{|h| r[h]}}
|
28
|
+
end
|
29
|
+
|
30
|
+
acc.outf(data, io) do |dd, ios|
|
31
|
+
if options.idonly then
|
32
|
+
ios.puts dd.join(' ')
|
33
|
+
else
|
34
|
+
acc.tabularize({
|
35
|
+
:headers=>headers.map{|h| h.to_s},
|
36
|
+
:rows=>dd
|
37
|
+
}, ios)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
io.close unless io.nil?
|
41
|
+
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
# vim: set ai et sw=2 ts=2 :
|
@@ -0,0 +1,152 @@
|
|
1
|
+
require 'pp'
|
2
|
+
require 'erb'
|
3
|
+
|
4
|
+
class CompletionContext < ::Commander::HelpFormatter::Context
|
5
|
+
end
|
6
|
+
|
7
|
+
class ::Commander::Runner
|
8
|
+
|
9
|
+
# Not so sure this should go in Runner, but where else?
|
10
|
+
|
11
|
+
##
|
12
|
+
# Change the '--[no-]foo' switch into '--no-foo' and '--foo'
|
13
|
+
def flatswitches(option)
|
14
|
+
# if there is a --[no-]foo format, break that into two switches.
|
15
|
+
option[:switches].map{ |switch|
|
16
|
+
switch = switch.sub(/\s.*$/,'') # drop argument spec if exists.
|
17
|
+
if switch =~ /\[no-\]/ then
|
18
|
+
[switch.sub(/\[no-\]/, ''), switch.gsub(/[\[\]]/,'')]
|
19
|
+
else
|
20
|
+
switch
|
21
|
+
end
|
22
|
+
}.flatten
|
23
|
+
end
|
24
|
+
|
25
|
+
##
|
26
|
+
# If the switches take an argument, retun =
|
27
|
+
def takesArg(option, yes='=', no='')
|
28
|
+
if option[:switches].select { |switch| switch =~ /\s\S+$/ }.empty? then
|
29
|
+
no
|
30
|
+
else
|
31
|
+
yes
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
##
|
36
|
+
# truncate the description of an option
|
37
|
+
def optionDesc(option)
|
38
|
+
option[:description].sub(/\n.*$/,'')
|
39
|
+
end
|
40
|
+
|
41
|
+
##
|
42
|
+
# Get a tree of all commands and sub commands
|
43
|
+
def cmdTree
|
44
|
+
tree={}
|
45
|
+
@commands.sort.each do |name,cmd|
|
46
|
+
levels = name.split
|
47
|
+
pos = tree
|
48
|
+
levels.each do |step|
|
49
|
+
pos[step] = {} unless pos.has_key? step
|
50
|
+
pos = pos[step]
|
51
|
+
end
|
52
|
+
pos["\0cmd"] = cmd
|
53
|
+
end
|
54
|
+
tree
|
55
|
+
end
|
56
|
+
|
57
|
+
##
|
58
|
+
# Get maximum depth of sub-commands.
|
59
|
+
def cmdMaxDepth
|
60
|
+
depth=0
|
61
|
+
@commands.sort.each do |name,cmd|
|
62
|
+
levels = name.split
|
63
|
+
depth = levels.count if levels.count > depth
|
64
|
+
end
|
65
|
+
depth
|
66
|
+
end
|
67
|
+
|
68
|
+
##
|
69
|
+
# Alternate tree of sub-commands.
|
70
|
+
def cmdTreeB
|
71
|
+
tree={}
|
72
|
+
@commands.sort.each do |name,cmd|
|
73
|
+
levels = name.split
|
74
|
+
tree[levels.join(' ')] = {:cmd=>cmd}
|
75
|
+
|
76
|
+
# load parent.
|
77
|
+
left = levels[0..-2]
|
78
|
+
right = levels[-1]
|
79
|
+
key = left.join(' ')
|
80
|
+
tree[key] = {} unless tree.has_key? key
|
81
|
+
if tree[key].has_key?(:subs) then
|
82
|
+
tree[key][:subs] << right
|
83
|
+
else
|
84
|
+
tree[key][:subs] = [right]
|
85
|
+
end
|
86
|
+
end
|
87
|
+
tree
|
88
|
+
end
|
89
|
+
|
90
|
+
end
|
91
|
+
|
92
|
+
command :completion do |c|
|
93
|
+
c.syntax = %{murano completion}
|
94
|
+
c.summary = %{Generate a completion file}
|
95
|
+
c.description = %{For starts, this is zsh only. Because that is what I use.
|
96
|
+
|
97
|
+
eval "$(murano completion)"
|
98
|
+
or
|
99
|
+
murano completion > _murano
|
100
|
+
source _murano
|
101
|
+
}
|
102
|
+
c.option '--subs', 'List sub commands'
|
103
|
+
#c.option '--opts CMD', 'List options for subcommand'
|
104
|
+
#c.option '--gopts', 'List global options'
|
105
|
+
|
106
|
+
# Changing direction.
|
107
|
+
# Will poop out the file to be included as the completion script.
|
108
|
+
|
109
|
+
c.action do |args, options|
|
110
|
+
|
111
|
+
runner = ::Commander::Runner.instance
|
112
|
+
|
113
|
+
if options.gopts then
|
114
|
+
opts = runner.instance_variable_get(:@options)
|
115
|
+
pp opts.first
|
116
|
+
pp runner.takesArg(opts.first)
|
117
|
+
# opts.each do |o|
|
118
|
+
# puts runner.optionLine o, 'GlobalOption'
|
119
|
+
# end
|
120
|
+
|
121
|
+
elsif options.subs then
|
122
|
+
runner.instance_variable_get(:@commands).sort.each do |name,cmd|
|
123
|
+
#desc = cmd.instance_variable_get(:@summary) #.lines[0]
|
124
|
+
#say "#{name}:'#{desc}'"
|
125
|
+
say "#{name}"
|
126
|
+
end
|
127
|
+
|
128
|
+
elsif options.opts then
|
129
|
+
cmds = runner.instance_variable_get(:@commands)
|
130
|
+
cmd = cmds[options.opts]
|
131
|
+
pp cmd.syntax
|
132
|
+
# looking at OptionParser to help figure out what kind of params a switch
|
133
|
+
# gets. And hopefully derive a completer for it
|
134
|
+
# !!!!! OptionParser::Completion what is this?
|
135
|
+
opts = OptionParser.new
|
136
|
+
cmds[options.opts].options.each do |o|
|
137
|
+
pp opts.make_switch(o[:args])
|
138
|
+
end
|
139
|
+
|
140
|
+
else
|
141
|
+
|
142
|
+
tmpl=ERB.new(File.read(File.join(File.dirname(__FILE__), "zshcomplete.erb")), nil, '-<>')
|
143
|
+
|
144
|
+
pc = CompletionContext.new(runner)
|
145
|
+
puts tmpl.result(pc.get_binding)
|
146
|
+
end
|
147
|
+
|
148
|
+
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
# vim: set ai et sw=2 ts=2 :
|
@@ -0,0 +1,67 @@
|
|
1
|
+
|
2
|
+
command :config do |c|
|
3
|
+
c.syntax = %{murano config [options] <key> [<new value>]}
|
4
|
+
c.summary = %{Get and set options}
|
5
|
+
c.description = %{
|
6
|
+
You can get, set, or query config options with this command. All config
|
7
|
+
options are in a 'section.key' format. There is also a layer of scopes
|
8
|
+
that the keys can be saved in.
|
9
|
+
|
10
|
+
If section is left out, then key is assumed to be in the 'tool' section.
|
11
|
+
|
12
|
+
}
|
13
|
+
|
14
|
+
c.example %{See what the current combined config is}, 'murano config --dump'
|
15
|
+
c.example %{Query a value}, 'murano config solution.id'
|
16
|
+
c.example %{Set a new value; writing to the project config file}, 'murano config solution.id XXXXXXXX'
|
17
|
+
c.example %{Set a new value; writing to the user config file}, 'murano config --user user.name my@email.address'
|
18
|
+
c.example %{Unset a value in a configfile. (lower scopes will become visible when unset)},
|
19
|
+
'murano config diff.cmd --unset'
|
20
|
+
|
21
|
+
|
22
|
+
c.option '--user', 'Use only the config file in $HOME (.mrmuranorc)'
|
23
|
+
c.option '--project', 'Use only the config file in the project (.mrmuranorc)'
|
24
|
+
c.option '--env', 'Use only the config file from $MR_CONFIGFILE'
|
25
|
+
c.option '--specified', 'Use only the config file from the --config option.'
|
26
|
+
|
27
|
+
c.option '--unset', 'Remove key from config file.'
|
28
|
+
c.option '--dump', 'Dump the current combined view of the config'
|
29
|
+
|
30
|
+
c.action do |args, options|
|
31
|
+
|
32
|
+
if options.dump then
|
33
|
+
puts $cfg.dump()
|
34
|
+
elsif args.count == 0 then
|
35
|
+
say_error "Need a config key"
|
36
|
+
elsif args.count == 1 and not options.unset then
|
37
|
+
options.default :user=>false, :project=>false,
|
38
|
+
:specified=>false, :env=>false
|
39
|
+
|
40
|
+
# For read, if no scopes, than all. Otherwise just those specified
|
41
|
+
scopes = []
|
42
|
+
scopes << :user if options.user
|
43
|
+
scopes << :project if options.project
|
44
|
+
scopes << :env if options.env
|
45
|
+
scopes << :specified if options.specified
|
46
|
+
scopes = MrMurano::Config::CFG_SCOPES if scopes.empty?
|
47
|
+
|
48
|
+
say $cfg.get(args[0], scopes)
|
49
|
+
else
|
50
|
+
|
51
|
+
options.default :user=>false, :project=>false,
|
52
|
+
:specified=>false, :env=>false
|
53
|
+
# For write, if scope is specified, only write to that scope.
|
54
|
+
scope = :project
|
55
|
+
scope = :user if options.user
|
56
|
+
scope = :project if options.project
|
57
|
+
scope = :env if options.env
|
58
|
+
scope = :specified if options.specified
|
59
|
+
|
60
|
+
args[1] = nil if options.unset
|
61
|
+
$cfg.set(args[0], args[1], scope)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
end
|
66
|
+
|
67
|
+
# vim: set ai et sw=2 ts=2 :
|
@@ -0,0 +1,130 @@
|
|
1
|
+
require 'MrMurano/Product'
|
2
|
+
|
3
|
+
command :content do |c|
|
4
|
+
c.syntax = %{murano content}
|
5
|
+
c.summary = %{About Content Area}
|
6
|
+
c.description = %{This set of commands let you interact with the content area for a product.
|
7
|
+
|
8
|
+
This is where OTA data can be stored so that devices can easily download it.
|
9
|
+
}
|
10
|
+
|
11
|
+
c.action do |args, options|
|
12
|
+
::Commander::UI.enable_paging
|
13
|
+
say MrMurano::SubCmdGroupHelp.new(c).get_help
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
command 'content list' do |c|
|
18
|
+
c.syntax = %{murano content list}
|
19
|
+
c.summary = %{List downloadable content for a product}
|
20
|
+
c.description = %{List downloadable content for a product
|
21
|
+
|
22
|
+
Data uploaded to a product's content area can be downloaded by devices using
|
23
|
+
the HTTP Device API.
|
24
|
+
}
|
25
|
+
c.action do |args, options|
|
26
|
+
prd = MrMurano::ProductContent.new
|
27
|
+
prd.outf prd.list
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
command 'content info' do |c|
|
32
|
+
c.syntax = %{murano content info <content id>}
|
33
|
+
c.summary = %{Show more info for a content item}
|
34
|
+
c.description = %{Show more info for a content item
|
35
|
+
|
36
|
+
Data uploaded to a product's content area can be downloaded by devices using
|
37
|
+
the HTTP Device API.
|
38
|
+
}
|
39
|
+
c.action do |args, options|
|
40
|
+
prd = MrMurano::ProductContent.new
|
41
|
+
if args[0].nil? then
|
42
|
+
prd.error "Missing <content id>"
|
43
|
+
else
|
44
|
+
prd.tabularize prd.info(args[0])
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
command 'content delete' do |c|
|
50
|
+
c.syntax = %{murano content delete <content id>}
|
51
|
+
c.summary = %{Delete a content item}
|
52
|
+
c.description = %{Delete a content item
|
53
|
+
|
54
|
+
Data uploaded to a product's content area can be downloaded by devices using
|
55
|
+
the HTTP Device API.
|
56
|
+
}
|
57
|
+
c.action do |args, options|
|
58
|
+
prd = MrMurano::ProductContent.new
|
59
|
+
if args[0].nil? then
|
60
|
+
prd.error "Missing <content id>"
|
61
|
+
else
|
62
|
+
ret = prd.remove(args[0])
|
63
|
+
prd.outf(ret) unless ret.nil? or ret.empty?
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
command 'content upload' do |c|
|
69
|
+
c.syntax = %{murano content upload <content id> <file>}
|
70
|
+
c.summary = %{Upload content}
|
71
|
+
c.description = %{Upload a content item
|
72
|
+
|
73
|
+
Data uploaded to a product's content area can be downloaded by devices using
|
74
|
+
the HTTP Device API.
|
75
|
+
}
|
76
|
+
c.option '--meta STRING', %{Add extra meta info to the content item}
|
77
|
+
|
78
|
+
c.action do |args, options|
|
79
|
+
options.default :meta=>' '
|
80
|
+
prd = MrMurano::ProductContent.new
|
81
|
+
|
82
|
+
if args[0].nil? then
|
83
|
+
prd.error "Missing <content id>"
|
84
|
+
elsif args[1].nil? then
|
85
|
+
prd.error "Missing <file>"
|
86
|
+
else
|
87
|
+
|
88
|
+
ret = prd.info(args[0])
|
89
|
+
if ret.nil? then
|
90
|
+
ret = prd.create(args[0], options.meta)
|
91
|
+
prd.outf(ret) unless ret.nil? or ret.empty?
|
92
|
+
end
|
93
|
+
|
94
|
+
ret = prd.upload(args[0], args[1])
|
95
|
+
prd.outf(ret) unless ret.nil? or ret.empty?
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
command 'content download' do |c|
|
101
|
+
c.syntax = %{murano content download <content id>}
|
102
|
+
c.summary = %{Download a content item}
|
103
|
+
c.description = %{Download a content item
|
104
|
+
|
105
|
+
Data uploaded to a product's content area can be downloaded by devices using
|
106
|
+
the HTTP Device API.
|
107
|
+
}
|
108
|
+
c.option '-o','--output FILE',%{save to this file}
|
109
|
+
c.action do |args, options|
|
110
|
+
prd = MrMurano::ProductContent.new
|
111
|
+
if args[0].nil? then
|
112
|
+
prd.error "Missing <content id>"
|
113
|
+
else
|
114
|
+
|
115
|
+
if options.output.nil? then
|
116
|
+
prd.download(args[0]) # to stdout
|
117
|
+
else
|
118
|
+
outFile = Pathname.new(options.output)
|
119
|
+
outFile.open('w') do |io|
|
120
|
+
prd.download(args[0]) do |chunk|
|
121
|
+
io << chunk
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
|
130
|
+
# vim: set ai et sw=2 ts=2 :
|