bin/onering in onering-client-0.0.10 vs bin/onering in onering-client-0.0.15

- old
+ new

@@ -24,41 +24,93 @@ elsif data.is_a?(Array) puts data.join("\n") else puts data.to_s end - + else puts YAML.dump(data) end end -subcommander.version = Gem.loaded_specs['onering-client'].version.to_s -subcommander.desc = Gem.loaded_specs['onering-client'].description +subcommander.version = ::Gem.loaded_specs['onering-client'].version.to_s +subcommander.desc = ::Gem.loaded_specs['onering-client'].description #subcommander.opt :server, '-s', '--server', 'Specify the Onering server URL' subcommand :devices, "Operations related to Onering's assets database" do |devices| api = Onering::API::Devices - api.connect + api.connect ENV['ONERING_URL'] -# GET - devices.subcommand :get, "Get a single node by ID" do |sc| - sc.usage = "onering devices get ID" + def _field(action, field, value, opts={}) + rv = [] + ids = [] - sc.exec do - print_format(api.get(sc[:args].first)) + # append IDs from filter + ids += Onering::API::Devices.list('id', { + :filter => opts[:filter] + }) if opts[:filter] + + # add specific ID + ids << opts[:id] if opts[:id] + + ids.each do |id| + case action + when :get + rv << Onering::API::Devices.get_field(id, field) + when :set + rv << Onering::API::Devices.set_field(id, field, value) + end end + + rv end +# SHOW + devices.subcommand :show, "Print out a single node by ID" do |sc| + sc.usage = "onering devices show ID" + + sc.exec do + id = sc[:args].first + print_format(api.get(id)) + end + end + +# GET [FIELD] + devices.subcommand :get, "Get a named field from one or more devices" do |sc| + sc.usage = "onering devices get FIELD" + sc.opt :filter, '-f', '--filter FILTER', "A urlquery filter string" + sc.opt :as_txt, '-t', '--as-text', "Return the results as text" + sc.opt :id, '-i', '--id ID', "A specific node ID" + + + sc.exec do + rv = _field(:get, sc[:args].first, nil, sc) + print_format(rv, (sc[:as_txt] ? :text : nil)) + end + end + +# SET [FIELD] + devices.subcommand :set, "Set a named field for one or more devices" do |sc| + sc.usage = "onering devices set FIELD VALUE" + sc.opt :filter, '-f', '--filter FILTER', "A urlquery filter string" + sc.opt :as_txt, '-t', '--as-text', "Return the results as text" + sc.opt :id, '-i', '--id ID', "A specific node ID" + + sc.exec do + rv = _field(:set, sc[:args].first, sc[:args].last, sc) + print_format(rv, (sc[:as_txt] ? :text : nil)) + end + end + # LIST devices.subcommand :list, "List field values" do |sc| sc.usage = "onering devices list [-f FILTER] FIELD" sc.opt :filter, '-f', '--filter FILTER', "A urlquery filter string" sc.opt :as_txt, '-t', '--as-text', "Return the results as text" - sc.exec do + sc.exec do field = sc[:args].first filter = sc[:filter] print_format(api.list(field, { :filter => filter @@ -69,11 +121,30 @@ # FIND devices.subcommand :find, "Finds all nodes that match a urlquery filter string" do |sc| sc.arity = 1 sc.usage = "onering devices find FILTER" - sc.exec do + sc.exec do print_format(api.find(sc[:args].first)) + end + end + +# SAVE + devices.subcommand :save, "Creates or updates a new device in Onering, reading a JSON document from standard input" do |sc| + sc.usage = "cat device.json | onering devices save [ID]" + + sc.exec do + unless STDIN.tty? + begin + json = ::JSON.load(STDIN.read) + raise "Input document must specify an ID" if sc[:args].empty? and not json['id'] + + print_format(api.save((sc[:args].first || json['id']), json)) + rescue Exception => e + STDERR.puts "#{e.class.name}: #{e.message}" + exit 1 + end + end end end end \ No newline at end of file